summaryrefslogtreecommitdiff
path: root/indra
diff options
context:
space:
mode:
Diffstat (limited to 'indra')
-rw-r--r--indra/cmake/00-Common.cmake5
-rw-r--r--[-rwxr-xr-x]indra/cmake/FMOD.cmake0
-rw-r--r--indra/cmake/Variables.cmake2
-rw-r--r--[-rwxr-xr-x]indra/cmake/run_build_test.py2
-rw-r--r--indra/integration_tests/llui_libtest/llwidgetreg.cpp2
-rw-r--r--indra/linux_crash_logger/linux_crash_logger.cpp14
-rw-r--r--indra/linux_crash_logger/llcrashloggerlinux.cpp2
-rw-r--r--indra/llcharacter/llcharacter.cpp25
-rw-r--r--indra/llcharacter/llcharacter.h1
-rw-r--r--indra/llcharacter/llkeyframemotion.cpp73
-rw-r--r--indra/llcharacter/llkeyframemotion.h2
-rw-r--r--indra/llcommon/CMakeLists.txt1
-rw-r--r--indra/llcommon/indra_constants.h2
-rw-r--r--indra/llcommon/llaccountingquota.h80
-rw-r--r--indra/llcommon/llchat.h3
-rw-r--r--indra/llcommon/llfoldertype.cpp2
-rw-r--r--indra/llcommon/llfoldertype.h5
-rw-r--r--indra/llcommon/llsdserialize.cpp4
-rw-r--r--indra/llcommon/llstat.cpp2
-rw-r--r--indra/llcommon/llsys.cpp735
-rw-r--r--indra/llcommon/llsys.h22
-rw-r--r--indra/llcommon/llversionviewer.h4
-rw-r--r--indra/llcrashlogger/llcrashlogger.cpp95
-rw-r--r--indra/llcrashlogger/llcrashlogger.h11
-rw-r--r--indra/llinventory/llparcel.cpp36
-rw-r--r--indra/llinventory/llparcel.h34
-rw-r--r--indra/llinventory/llparcelflags.h2
-rw-r--r--indra/llkdu/llimagej2ckdu.cpp2
-rw-r--r--indra/llmath/CMakeLists.txt4
-rw-r--r--indra/llmath/llcalc.cpp145
-rw-r--r--indra/llmath/llcalc.h83
-rw-r--r--indra/llmath/llcalcparser.cpp46
-rw-r--r--indra/llmath/llcalcparser.h174
-rw-r--r--indra/llmath/lloctree.h11
-rw-r--r--indra/llmath/llvolume.cpp527
-rw-r--r--indra/llmath/llvolume.h8
-rw-r--r--indra/llmessage/llcurl.cpp14
-rw-r--r--indra/llmessage/llcurl.h4
-rw-r--r--indra/llmessage/lldatapacker.h5
-rw-r--r--indra/llmessage/lliosocket.cpp26
-rw-r--r--indra/llmessage/lliosocket.h11
-rw-r--r--indra/llmessage/message_prehash.cpp4
-rw-r--r--indra/llmessage/message_prehash.h4
-rw-r--r--indra/llmessage/tests/commtest.h64
-rw-r--r--indra/llmessage/tests/test_llsdmessage_peer.py41
-rw-r--r--indra/llmessage/tests/testrunner.py201
-rw-r--r--indra/llplugin/llpluginclassmedia.cpp2759
-rw-r--r--indra/llplugin/llpluginclassmedia.h841
-rw-r--r--indra/llprimitive/llmodel.cpp674
-rw-r--r--indra/llprimitive/llmodel.h12
-rw-r--r--indra/llprimitive/llprimitive.h2
-rw-r--r--indra/llrender/llfontgl.cpp2
-rw-r--r--indra/llrender/llgl.cpp180
-rw-r--r--indra/llrender/llgl.h11
-rw-r--r--indra/llrender/llglheaders.h66
-rw-r--r--indra/llrender/llglslshader.cpp55
-rw-r--r--indra/llrender/llglslshader.h4
-rw-r--r--indra/llrender/llimagegl.cpp15
-rw-r--r--indra/llrender/llimagegl.h2
-rw-r--r--indra/llrender/llrender.cpp41
-rw-r--r--indra/llrender/llrender.h1
-rw-r--r--indra/llrender/llrendertarget.cpp424
-rw-r--r--indra/llrender/llrendertarget.h26
-rw-r--r--indra/llrender/llshadermgr.cpp258
-rw-r--r--indra/llrender/llshadermgr.h5
-rw-r--r--indra/llrender/llvertexbuffer.cpp419
-rw-r--r--indra/llrender/llvertexbuffer.h58
-rw-r--r--indra/llui/CMakeLists.txt22
-rw-r--r--indra/llui/llaccordionctrltab.cpp2
-rw-r--r--indra/llui/llbadge.cpp274
-rw-r--r--indra/llui/llbadge.h159
-rw-r--r--indra/llui/llbadgeowner.cpp126
-rw-r--r--indra/llui/llbadgeowner.h (renamed from indra/newview/lldrawpoolclouds.h)57
-rw-r--r--indra/llui/llbutton.cpp71
-rw-r--r--indra/llui/llbutton.h16
-rw-r--r--indra/llui/llconsole.cpp13
-rw-r--r--indra/llui/lllayoutstack.cpp138
-rw-r--r--indra/llui/lllayoutstack.h36
-rw-r--r--indra/llui/lllineeditor.cpp156
-rw-r--r--indra/llui/lllineeditor.h13
-rw-r--r--indra/llui/llloadingindicator.h2
-rw-r--r--indra/llui/llmultislider.cpp2
-rw-r--r--indra/llui/llnotifications.cpp2
-rw-r--r--indra/llui/llpanel.cpp8
-rw-r--r--indra/llui/llpanel.h5
-rw-r--r--indra/llui/llresmgr.cpp2
-rw-r--r--indra/llui/llspinctrl.cpp25
-rw-r--r--indra/llui/llspinctrl.h1
-rw-r--r--indra/llui/lltextbase.cpp119
-rw-r--r--indra/llui/lltextvalidate.cpp33
-rw-r--r--indra/llui/lltextvalidate.h1
-rw-r--r--indra/llui/lltimectrl.cpp432
-rw-r--r--indra/llui/lltimectrl.h131
-rw-r--r--indra/llui/lluictrl.cpp36
-rw-r--r--indra/llui/lluictrl.h8
-rw-r--r--indra/llui/llview.cpp15
-rw-r--r--indra/llui/tests/llurlmatch_test.cpp2
-rw-r--r--indra/llvfs/CMakeLists.txt34
-rw-r--r--indra/llvfs/lldir_mac.cpp32
-rw-r--r--indra/llvfs/lldir_mac.h1
-rw-r--r--indra/llvfs/lldiriterator.cpp25
-rw-r--r--indra/llvfs/tests/lldiriterator_test.cpp65
-rw-r--r--indra/llwindow/llkeyboardheadless.cpp25
-rw-r--r--indra/llxuixml/llinitparam.cpp2
-rw-r--r--indra/llxuixml/llinitparam.h7
-rw-r--r--indra/llxuixml/lltrans.cpp50
-rw-r--r--indra/llxuixml/lltrans.h4
-rw-r--r--indra/lscript/lscript_compile/indra.l2
-rw-r--r--indra/lscript/lscript_library/lscript_library.cpp3
-rw-r--r--indra/mac_crash_logger/CrashReporter.nib/objects.xib2
-rw-r--r--indra/mac_crash_logger/llcrashloggermac.cpp5
-rw-r--r--indra/mac_crash_logger/mac_crash_logger.cpp15
-rw-r--r--indra/media_plugins/webkit/media_plugin_webkit.cpp67
-rw-r--r--indra/newview/CMakeLists.txt153
-rw-r--r--indra/newview/app_settings/cmd_line.xml13
-rw-r--r--indra/newview/app_settings/keys.xml2
-rw-r--r--indra/newview/app_settings/keywords.ini1
-rw-r--r--indra/newview/app_settings/logcontrol.xml2
-rw-r--r--indra/newview/app_settings/settings.xml484
-rw-r--r--indra/newview/app_settings/settings_files.xml5
-rw-r--r--indra/newview/app_settings/settings_minimal.xml13
-rw-r--r--indra/newview/app_settings/shaders/class1/avatar/avatarF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/avatar/avatarSkinV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/avatar/avatarV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/avatar/eyeballF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/avatar/eyeballV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/avatar/pickAvatarF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/avatar/pickAvatarV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl7
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/alphaNonIndexedF.glsl67
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/alphaSkinnedV.glsl27
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl36
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/attachmentShadowF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/attachmentShadowV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/avatarAlphaV.glsl27
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/avatarEyesV.glsl21
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/avatarF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/avatarShadowF.glsl5
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/avatarShadowV.glsl9
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/avatarV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/blurLightF.glsl6
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/blurLightMSF.glsl113
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/blurLightV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/bumpF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/bumpSkinnedV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/bumpV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/cloudsF.glsl79
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/cloudsV.glsl165
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/diffuseF.glsl3
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/diffuseIndexedF.glsl19
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/diffuseSkinnedV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/diffuseV.glsl6
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl40
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/fullbrightV.glsl23
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/giF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/giV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/impostorF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/impostorV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/luminanceF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/luminanceV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl65
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/multiPointLightMSF.glsl137
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/multiPointLightV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/multiSpotLightMSF.glsl232
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl4
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/pointLightMSF.glsl108
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/pointLightV.glsl9
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl4
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/postDeferredMSF.glsl133
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/postDeferredNoDoFF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/postDeferredNoDoFMSF.glsl37
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/postDeferredV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/postgiF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/postgiV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/shadowF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/shadowV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/skyF.glsl44
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/skyV.glsl140
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl4
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/softenLightMSF.glsl318
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/softenLightV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/spotLightMSF.glsl234
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/starsF.glsl19
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/starsV.glsl17
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/sunLightF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/sunLightMSF.glsl17
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOF.glsl4
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOMSF.glsl123
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/sunLightV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/terrainF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/terrainV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/treeF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/treeV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/waterF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/waterV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/effects/glowExtractF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/effects/glowExtractMSF.glsl38
-rw-r--r--indra/newview/app_settings/shaders/class1/effects/glowExtractV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/effects/glowF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/effects/glowV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/environment/terrainF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/environment/terrainV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/environment/terrainWaterF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/environment/underWaterF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/environment/waterF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/environment/waterFogF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/environment/waterV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/interface/highlightF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/interface/highlightV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightFullbrightF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyWaterF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightFullbrightWaterF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightFuncSpecularV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightFuncV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightShinyF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightShinyWaterF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightSpecularV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightWaterF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/sumLightsSpecularV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/sumLightsV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/fullbrightF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/fullbrightShinyF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/fullbrightShinySkinnedV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/fullbrightShinyV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/fullbrightShinyWaterF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/fullbrightSkinnedV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/fullbrightV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/fullbrightWaterF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/shinyF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/shinySimpleSkinnedV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/shinyV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/shinyWaterF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/simpleF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/simpleSkinnedV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/simpleV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/simpleWaterF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/windlight/atmosphericsF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/windlight/atmosphericsHelpersV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/windlight/atmosphericsV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/windlight/gammaF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/windlight/transportF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class2/avatar/eyeballV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl5
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/alphaNonIndexedF.glsl125
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/alphaSkinnedV.glsl27
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl36
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/avatarAlphaV.glsl27
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/edgeF.glsl4
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/edgeMSF.glsl74
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/edgeV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl4
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/multiSpotLightMSF.glsl244
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl54
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/softenLightMSF.glsl307
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/softenLightV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/spotLightMSF.glsl245
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl4
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/sunLightMSF.glsl202
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl6
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOMSF.glsl241
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/sunLightV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class2/effects/blurF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class2/effects/blurV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class2/effects/colorFilterF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class2/effects/drawQuadV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class2/effects/extractF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class2/effects/nightVisionF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class2/effects/simpleF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class2/environment/terrainF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class2/environment/terrainV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class2/environment/terrainWaterF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class2/environment/underWaterF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class2/environment/waterF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class2/environment/waterFogF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/lightF.glsl4
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/lightFullbrightF.glsl4
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/lightFullbrightNonIndexedF.glsl25
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyF.glsl5
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyNonIndexedF.glsl32
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyWaterF.glsl6
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyWaterNonIndexedF.glsl32
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/lightFullbrightWaterF.glsl6
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/lightFullbrightWaterNonIndexedF.glsl23
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/lightNonIndexedF.glsl25
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/lightShinyF.glsl6
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/lightShinyNonIndexedF.glsl32
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/lightShinyWaterF.glsl5
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/lightShinyWaterNonIndexedF.glsl29
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/lightSpecularV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/lightV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/lightWaterF.glsl4
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/lightWaterNonIndexedF.glsl23
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/sumLightsSpecularV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/sumLightsV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class2/objects/fullbrightShinyV.glsl35
-rw-r--r--indra/newview/app_settings/shaders/class2/objects/fullbrightV.glsl29
-rw-r--r--indra/newview/app_settings/shaders/class2/objects/shinyV.glsl10
-rw-r--r--indra/newview/app_settings/shaders/class2/objects/simpleV.glsl33
-rw-r--r--indra/newview/app_settings/shaders/class2/windlight/atmosphericsF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class2/windlight/atmosphericsHelpersV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class2/windlight/atmosphericsV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class2/windlight/atmosphericsVarsF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class2/windlight/atmosphericsVarsV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class2/windlight/cloudsF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class2/windlight/cloudsV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class2/windlight/gammaF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class2/windlight/skyF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class2/windlight/skyV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class2/windlight/transportF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class3/avatar/avatarV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class3/deferred/giDownsampleF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class3/deferred/giDownsampleV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class3/deferred/giF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class3/deferred/giFinalF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class3/deferred/giFinalV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class3/deferred/giV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class3/deferred/luminanceF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class3/deferred/luminanceV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class3/deferred/postDeferredF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class3/deferred/postDeferredV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class3/deferred/postgiF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class3/deferred/postgiV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class3/deferred/softenLightV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class3/deferred/treeF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class3/lighting/sumLightsSpecularV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class3/lighting/sumLightsV.glsl2
-rw-r--r--indra/newview/app_settings/windlight/days/Colder%20Tones.xml28
-rw-r--r--indra/newview/app_settings/windlight/days/Dynamic%20Richness.xml32
-rw-r--r--indra/newview/app_settings/windlight/days/Pirate%27s%20Dream.xml44
-rw-r--r--indra/newview/app_settings/windlight/days/Psycho%20Strobe%21.xml72
-rw-r--r--indra/newview/app_settings/windlight/days/Tropicalia.xml32
-rw-r--r--indra/newview/app_settings/windlight/days/Weird-O.xml56
-rw-r--r--indra/newview/app_settings/windlight/postprocesseffects.xml1
-rw-r--r--indra/newview/app_settings/windlight/skies/Midday.xml141
-rw-r--r--indra/newview/app_settings/windlight/skies/Midnight.xml141
-rw-r--r--indra/newview/app_settings/windlight/skies/Sunrise.xml141
-rw-r--r--indra/newview/app_settings/windlight/skies/Sunset.xml142
-rw-r--r--indra/newview/featuretable.txt19
-rw-r--r--indra/newview/featuretable_linux.txt17
-rw-r--r--indra/newview/featuretable_mac.txt45
-rw-r--r--indra/newview/featuretable_xp.txt19
-rw-r--r--indra/newview/gpu_table.txt837
-rw-r--r--indra/newview/groupchatlistener.cpp76
-rw-r--r--indra/newview/groupchatlistener.h40
-rw-r--r--indra/newview/llaccountingquotamanager.cpp278
-rw-r--r--indra/newview/llaccountingquotamanager.h55
-rwxr-xr-x[-rw-r--r--]indra/newview/llagent.cpp110
-rw-r--r--indra/newview/llagent.h16
-rw-r--r--indra/newview/llagentcamera.cpp4
-rw-r--r--indra/newview/llagentlistener.cpp453
-rw-r--r--indra/newview/llagentlistener.h28
-rw-r--r--indra/newview/llagentwearables.cpp2
-rw-r--r--indra/newview/llappviewer.cpp205
-rw-r--r--indra/newview/llappviewerlinux.cpp63
-rw-r--r--indra/newview/llappviewerwin32.cpp45
-rw-r--r--indra/newview/llassetuploadresponders.cpp25
-rw-r--r--indra/newview/llassetuploadresponders.h1
-rwxr-xr-x[-rw-r--r--]indra/newview/llavataractions.cpp73
-rw-r--r--indra/newview/llavataractions.h3
-rw-r--r--indra/newview/llbottomtray.cpp6
-rw-r--r--indra/newview/llbottomtray.h4
-rw-r--r--indra/newview/llchatbar.cpp6
-rw-r--r--indra/newview/llcloud.cpp538
-rw-r--r--indra/newview/llcloud.h199
-rw-r--r--indra/newview/llcofwearables.cpp5
-rwxr-xr-x[-rw-r--r--]indra/newview/llcommandhandler.cpp0
-rw-r--r--indra/newview/lldaycyclemanager.cpp230
-rw-r--r--indra/newview/lldaycyclemanager.h84
-rw-r--r--indra/newview/lldebugview.cpp3
-rw-r--r--indra/newview/lldrawable.cpp17
-rw-r--r--indra/newview/lldrawable.h1
-rw-r--r--indra/newview/lldrawpool.cpp54
-rw-r--r--indra/newview/lldrawpool.h4
-rw-r--r--indra/newview/lldrawpoolalpha.cpp173
-rw-r--r--indra/newview/lldrawpoolavatar.cpp38
-rw-r--r--indra/newview/lldrawpoolbump.cpp116
-rw-r--r--indra/newview/lldrawpoolbump.h2
-rw-r--r--indra/newview/lldrawpoolclouds.cpp97
-rw-r--r--indra/newview/lldrawpoolsimple.cpp114
-rw-r--r--indra/newview/lldrawpoolsimple.h14
-rw-r--r--indra/newview/lldrawpoolterrain.cpp6
-rw-r--r--indra/newview/lldrawpooltree.cpp4
-rw-r--r--indra/newview/lldrawpoolwater.cpp4
-rw-r--r--indra/newview/lldrawpoolwlsky.cpp99
-rw-r--r--indra/newview/lldrawpoolwlsky.h8
-rw-r--r--indra/newview/llenvmanager.cpp684
-rw-r--r--indra/newview/llenvmanager.h283
-rw-r--r--indra/newview/llestateinfomodel.cpp230
-rw-r--r--indra/newview/llestateinfomodel.h103
-rw-r--r--indra/newview/llface.cpp185
-rw-r--r--indra/newview/llface.h3
-rw-r--r--indra/newview/llfeaturemanager.cpp32
-rw-r--r--indra/newview/llfilteredwearablelist.cpp1
-rw-r--r--indra/newview/llfirstuse.cpp2
-rw-r--r--indra/newview/llflexibleobject.cpp8
-rw-r--r--indra/newview/llfloaterauction.cpp18
-rw-r--r--indra/newview/llfloaterbuildoptions.cpp68
-rw-r--r--indra/newview/llfloaterbuildoptions.h23
-rw-r--r--indra/newview/llfloaterbuyland.cpp18
-rw-r--r--indra/newview/llfloaterdaycycle.cpp531
-rw-r--r--indra/newview/llfloaterdaycycle.h120
-rw-r--r--indra/newview/llfloaterdeleteenvpreset.cpp285
-rw-r--r--indra/newview/llfloaterdeleteenvpreset.h62
-rw-r--r--indra/newview/llfloatereditdaycycle.cpp825
-rw-r--r--indra/newview/llfloatereditdaycycle.h137
-rw-r--r--indra/newview/llfloatereditsky.cpp923
-rw-r--r--indra/newview/llfloatereditsky.h113
-rw-r--r--indra/newview/llfloatereditwater.cpp772
-rw-r--r--indra/newview/llfloatereditwater.h (renamed from indra/newview/llfloaterwater.h)112
-rw-r--r--indra/newview/llfloaterenvironmentsettings.cpp282
-rw-r--r--indra/newview/llfloaterenvironmentsettings.h71
-rw-r--r--indra/newview/llfloaterenvsettings.cpp268
-rw-r--r--indra/newview/llfloaterenvsettings.h83
-rw-r--r--indra/newview/llfloaterhelpbrowser.cpp9
-rw-r--r--indra/newview/llfloaterhelpbrowser.h1
-rw-r--r--indra/newview/llfloaterland.cpp17
-rw-r--r--indra/newview/llfloaterland.h1
-rw-r--r--indra/newview/llfloatermodelpreview.cpp1252
-rw-r--r--indra/newview/llfloatermodelpreview.h71
-rw-r--r--indra/newview/llfloatermodeluploadbase.cpp58
-rw-r--r--indra/newview/llfloatermodeluploadbase.h61
-rw-r--r--indra/newview/llfloatermodelwizard.cpp340
-rw-r--r--indra/newview/llfloatermodelwizard.h37
-rwxr-xr-x[-rw-r--r--]indra/newview/llfloaterpreference.cpp46
-rw-r--r--indra/newview/llfloaterpreference.h6
-rw-r--r--indra/newview/llfloaterregioninfo.cpp1353
-rw-r--r--indra/newview/llfloaterregioninfo.h133
-rw-r--r--indra/newview/llfloatersearch.cpp11
-rw-r--r--indra/newview/llfloatersellland.cpp3
-rw-r--r--indra/newview/llfloatersounddevices.cpp3
-rw-r--r--indra/newview/llfloatertools.cpp158
-rw-r--r--indra/newview/llfloatertools.h4
-rw-r--r--indra/newview/llfloaterwater.cpp625
-rw-r--r--indra/newview/llfloaterwebcontent.cpp18
-rw-r--r--indra/newview/llfloaterwebcontent.h2
-rw-r--r--indra/newview/llfloaterwindlight.cpp875
-rw-r--r--indra/newview/llfloaterwindlight.h112
-rwxr-xr-x[-rw-r--r--]indra/newview/llfloaterworldmap.cpp21
-rw-r--r--indra/newview/llfolderview.cpp96
-rw-r--r--indra/newview/llfolderview.h26
-rw-r--r--indra/newview/llfolderviewitem.cpp202
-rw-r--r--indra/newview/llfolderviewitem.h36
-rw-r--r--indra/newview/llgesturelistener.cpp159
-rw-r--r--indra/newview/llgesturelistener.h52
-rw-r--r--indra/newview/llgesturemgr.cpp2
-rw-r--r--indra/newview/llgesturemgr.h10
-rw-r--r--indra/newview/llgiveinventory.cpp3
-rw-r--r--indra/newview/llgroupactions.cpp9
-rw-r--r--indra/newview/llgroupactions.h2
-rw-r--r--indra/newview/llimview.cpp73
-rw-r--r--indra/newview/llimview.h19
-rw-r--r--indra/newview/llinventorybridge.cpp48
-rw-r--r--indra/newview/llinventorybridge.h4
-rw-r--r--indra/newview/llinventoryfilter.cpp123
-rw-r--r--indra/newview/llinventoryfilter.h6
-rw-r--r--indra/newview/llinventoryfunctions.h24
-rw-r--r--indra/newview/llinventorymodel.cpp4
-rw-r--r--indra/newview/llinventorymodelbackgroundfetch.cpp2
-rw-r--r--indra/newview/llinventoryobserver.cpp28
-rw-r--r--indra/newview/llinventoryobserver.h22
-rw-r--r--indra/newview/llinventorypanel.cpp477
-rw-r--r--indra/newview/llinventorypanel.h50
-rw-r--r--indra/newview/lllocationinputctrl.cpp13
-rw-r--r--indra/newview/lllocationinputctrl.h16
-rw-r--r--indra/newview/lllogchat.cpp2
-rw-r--r--indra/newview/lllogininstance.cpp1
-rw-r--r--indra/newview/llmanipscale.cpp5
-rw-r--r--indra/newview/llmediactrl.cpp18
-rw-r--r--indra/newview/llmeshrepository.cpp1800
-rw-r--r--indra/newview/llmeshrepository.h90
-rw-r--r--indra/newview/llnearbychatbar.cpp8
-rw-r--r--indra/newview/llnearbychatbarlistener.cpp100
-rw-r--r--indra/newview/llnearbychatbarlistener.h50
-rw-r--r--indra/newview/llnearbychathandler.cpp86
-rw-r--r--indra/newview/llnearbychathandler.h4
-rw-r--r--indra/newview/llnotificationhandlerutil.cpp18
-rw-r--r--indra/newview/llnotificationmanager.h2
-rw-r--r--indra/newview/lloutfitslist.cpp2
-rw-r--r--indra/newview/llpanelappearancetab.cpp1
-rw-r--r--indra/newview/llpanelface.cpp21
-rw-r--r--indra/newview/llpanelimcontrolpanel.cpp95
-rw-r--r--indra/newview/llpanelimcontrolpanel.h8
-rw-r--r--indra/newview/llpanellandaudio.cpp22
-rw-r--r--indra/newview/llpanellandaudio.h2
-rw-r--r--indra/newview/llpanellandmarks.cpp9
-rw-r--r--indra/newview/llpanellogin.cpp13
-rw-r--r--indra/newview/llpanelmaininventory.cpp32
-rw-r--r--indra/newview/llpanelmaininventory.h4
-rw-r--r--indra/newview/llpanelmarketplaceinbox.cpp248
-rw-r--r--indra/newview/llpanelmarketplaceinbox.h78
-rw-r--r--indra/newview/llpanelmarketplaceinboxinventory.cpp167
-rw-r--r--indra/newview/llpanelmarketplaceinboxinventory.h77
-rw-r--r--indra/newview/llpanelmarketplaceoutbox.cpp209
-rw-r--r--indra/newview/llpanelmarketplaceoutbox.h82
-rw-r--r--indra/newview/llpanelobject.cpp161
-rw-r--r--indra/newview/llpanelobject.h5
-rw-r--r--indra/newview/llpanelobjectinventory.cpp62
-rw-r--r--indra/newview/llpaneloutfitedit.cpp2
-rwxr-xr-x[-rw-r--r--]indra/newview/llpanelpicks.cpp0
-rwxr-xr-x[-rw-r--r--]indra/newview/llpanelpicks.h0
-rw-r--r--indra/newview/llpanelplaceprofile.cpp19
-rw-r--r--indra/newview/llpanelplaceprofile.h2
-rw-r--r--indra/newview/llpanelplaces.cpp7
-rwxr-xr-x[-rw-r--r--]indra/newview/llpanelprofile.cpp0
-rwxr-xr-x[-rw-r--r--]indra/newview/llpanelprofile.h0
-rw-r--r--indra/newview/llpaneltopinfobar.cpp8
-rw-r--r--indra/newview/llpaneltopinfobar.h13
-rw-r--r--indra/newview/llpanelvoicedevicesettings.cpp17
-rw-r--r--indra/newview/llpanelvolume.cpp110
-rw-r--r--indra/newview/llpanelvolume.h6
-rw-r--r--indra/newview/llpanelwearing.cpp26
-rw-r--r--indra/newview/llpanelwearing.h2
-rw-r--r--indra/newview/llplacesinventorypanel.cpp85
-rw-r--r--indra/newview/llplacesinventorypanel.h2
-rw-r--r--indra/newview/llpreviewgesture.cpp1
-rw-r--r--indra/newview/llpreviewnotecard.cpp25
-rw-r--r--indra/newview/llprogressview.cpp88
-rw-r--r--indra/newview/llprogressview.h20
-rw-r--r--indra/newview/llregioninfomodel.cpp217
-rw-r--r--indra/newview/llregioninfomodel.h99
-rw-r--r--indra/newview/llsceneview.cpp15
-rw-r--r--indra/newview/llselectmgr.cpp10
-rw-r--r--indra/newview/llsidepanelappearance.cpp1
-rw-r--r--indra/newview/llsidepanelinventory.cpp454
-rw-r--r--indra/newview/llsidepanelinventory.h31
-rw-r--r--indra/newview/llsidepanelinventorysubpanel.cpp4
-rw-r--r--indra/newview/llsidepanelinventorysubpanel.h2
-rw-r--r--indra/newview/llsidepaneliteminfo.cpp7
-rw-r--r--indra/newview/llsidepaneliteminfo.h2
-rw-r--r--indra/newview/llsidetray.cpp177
-rw-r--r--indra/newview/llsidetray.h13
-rw-r--r--indra/newview/llspatialpartition.cpp146
-rw-r--r--indra/newview/llspatialpartition.h15
-rw-r--r--indra/newview/llstartup.cpp80
-rw-r--r--indra/newview/llsurface.cpp11
-rw-r--r--indra/newview/llsurface.h3
-rw-r--r--indra/newview/lltexlayer.cpp87
-rw-r--r--indra/newview/lltexlayer.h6
-rw-r--r--indra/newview/lltexturecache.cpp8
-rw-r--r--indra/newview/lltexturectrl.cpp5
-rw-r--r--indra/newview/lltoolgrab.cpp99
-rw-r--r--indra/newview/lltoolgrab.h7
-rw-r--r--indra/newview/lltoolpie.cpp1
-rw-r--r--indra/newview/lltranslate.cpp6
-rw-r--r--indra/newview/lluploadfloaterobservers.cpp56
-rw-r--r--indra/newview/lluploadfloaterobservers.h97
-rw-r--r--indra/newview/llviewerchat.cpp8
-rw-r--r--indra/newview/llviewercontrol.cpp40
-rw-r--r--indra/newview/llviewerdisplay.cpp11
-rw-r--r--indra/newview/llviewerfloaterreg.cpp22
-rw-r--r--indra/newview/llviewerfoldertype.cpp4
-rw-r--r--indra/newview/llviewerhelp.cpp16
-rw-r--r--indra/newview/llviewerinventory.cpp2
-rw-r--r--indra/newview/llviewermedia.cpp111
-rw-r--r--indra/newview/llviewermedia.h5
-rw-r--r--indra/newview/llviewermenu.cpp169
-rw-r--r--indra/newview/llviewermenufile.cpp76
-rw-r--r--indra/newview/llviewermenufile.h17
-rw-r--r--indra/newview/llviewermessage.cpp183
-rw-r--r--indra/newview/llviewermessage.h2
-rw-r--r--indra/newview/llviewernetwork.cpp2
-rw-r--r--indra/newview/llviewerobject.cpp158
-rw-r--r--indra/newview/llviewerobject.h24
-rw-r--r--indra/newview/llviewerobjectlist.cpp50
-rw-r--r--indra/newview/llviewerobjectlist.h4
-rw-r--r--indra/newview/llviewerparcelmgr.cpp6
-rw-r--r--indra/newview/llviewerparceloverlay.cpp27
-rw-r--r--indra/newview/llviewerparceloverlay.h1
-rw-r--r--indra/newview/llviewerprecompiledheaders.h2
-rw-r--r--indra/newview/llviewerregion.cpp296
-rw-r--r--indra/newview/llviewerregion.h25
-rw-r--r--indra/newview/llviewershadermgr.cpp498
-rw-r--r--indra/newview/llviewershadermgr.h31
-rw-r--r--indra/newview/llviewertexture.cpp19
-rw-r--r--indra/newview/llviewertexture.h3
-rw-r--r--indra/newview/llviewertexturelist.cpp46
-rw-r--r--indra/newview/llviewertexturelist.h7
-rw-r--r--indra/newview/llviewerwindow.cpp75
-rw-r--r--indra/newview/llviewerwindow.h1
-rw-r--r--indra/newview/llvlmanager.cpp2
-rw-r--r--indra/newview/llvoavatar.cpp124
-rw-r--r--indra/newview/llvoavatar.h8
-rw-r--r--indra/newview/llvocache.cpp14
-rw-r--r--indra/newview/llvoclouds.cpp293
-rw-r--r--indra/newview/llvoclouds.h79
-rw-r--r--indra/newview/llvoicevivox.cpp303
-rw-r--r--indra/newview/llvoicevivox.h15
-rw-r--r--indra/newview/llvopartgroup.cpp13
-rw-r--r--indra/newview/llvosky.cpp44
-rw-r--r--indra/newview/llvosurfacepatch.cpp2
-rw-r--r--indra/newview/llvotree.cpp5
-rw-r--r--indra/newview/llvovolume.cpp319
-rw-r--r--indra/newview/llvowlsky.cpp4
-rw-r--r--indra/newview/llwaterparammanager.cpp332
-rw-r--r--indra/newview/llwaterparammanager.h76
-rw-r--r--indra/newview/llwaterparamset.cpp44
-rw-r--r--indra/newview/llwaterparamset.h1
-rw-r--r--indra/newview/llwlanimator.cpp202
-rw-r--r--indra/newview/llwlanimator.h86
-rw-r--r--indra/newview/llwldaycycle.cpp240
-rw-r--r--indra/newview/llwldaycycle.h54
-rw-r--r--indra/newview/llwlhandlers.cpp203
-rw-r--r--indra/newview/llwlhandlers.h106
-rw-r--r--indra/newview/llwlparammanager.cpp574
-rw-r--r--indra/newview/llwlparammanager.h210
-rw-r--r--indra/newview/llwlparamset.cpp60
-rw-r--r--indra/newview/llwlparamset.h3
-rw-r--r--indra/newview/llworld.cpp94
-rw-r--r--indra/newview/llxmlrpclistener.cpp7
-rw-r--r--indra/newview/pipeline.cpp359
-rw-r--r--indra/newview/pipeline.h24
-rw-r--r--indra/newview/res/resource.h1
-rw-r--r--indra/newview/res/viewerRes.rc10
-rw-r--r--indra/newview/skins/default/colors.xml24
-rw-r--r--indra/newview/skins/default/textures/icons/Edit_Wrench.pngbin3713 -> 3000 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Inv_Gift.pngbin0 -> 1335 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/OutboxPush_Disabled.pngbin0 -> 1848 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/OutboxPush_Off.pngbin0 -> 1835 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/OutboxPush_On.pngbin0 -> 1851 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/OutboxPush_On_Over.pngbin0 -> 1863 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/OutboxPush_On_Selected.pngbin0 -> 1912 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/OutboxPush_Over.pngbin0 -> 1826 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/OutboxPush_Press.pngbin0 -> 1891 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/OutboxPush_Progress_1.pngbin0 -> 1848 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/OutboxPush_Progress_2.pngbin0 -> 1807 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/OutboxPush_Progress_3.pngbin0 -> 1819 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/OutboxPush_Progress_4.pngbin0 -> 1894 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/OutboxPush_Progress_5.pngbin0 -> 1921 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/OutboxPush_Progress_6.pngbin0 -> 1853 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/OutboxPush_Selected.pngbin0 -> 1894 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/OutboxPush_Selected_Disabled.pngbin0 -> 1840 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/OutboxPush_Selected_Over.pngbin0 -> 1870 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/OutboxPush_Selected_Press.pngbin0 -> 1912 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Parcel_SeeAVsOff_Dark.pngbin0 -> 3194 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Parcel_SeeAVsOff_Light.pngbin0 -> 3189 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Parcel_SeeAVsOn_Dark.pngbin0 -> 3011 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Parcel_SeeAVsOn_Light.pngbin0 -> 3011 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Sync_Disabled.pngbin0 -> 1187 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Sync_Enabled.pngbin0 -> 1168 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Sync_Progress_1.pngbin0 -> 1149 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Sync_Progress_2.pngbin0 -> 1147 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Sync_Progress_3.pngbin0 -> 1211 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Sync_Progress_4.pngbin0 -> 1205 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Sync_Progress_5.pngbin0 -> 1137 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Sync_Progress_6.pngbin0 -> 1164 bytes
-rw-r--r--indra/newview/skins/default/textures/textures.xml41
-rw-r--r--indra/newview/skins/default/textures/widgets/Badge_Background.pngbin0 -> 1352 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/Badge_Border.pngbin0 -> 1565 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/MarketplaceBtn_Off.pngbin0 -> 1067 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/MarketplaceBtn_Selected.pngbin0 -> 1086 bytes
-rw-r--r--indra/newview/skins/default/xui/da/floater_about.xml40
-rw-r--r--indra/newview/skins/default/xui/da/floater_about_land.xml10
-rw-r--r--indra/newview/skins/default/xui/da/floater_beacons.xml1
-rw-r--r--indra/newview/skins/default/xui/da/floater_buy_contents.xml2
-rw-r--r--indra/newview/skins/default/xui/da/floater_buy_currency.xml3
-rw-r--r--indra/newview/skins/default/xui/da/floater_day_cycle_options.xml96
-rw-r--r--indra/newview/skins/default/xui/da/floater_env_settings.xml28
-rw-r--r--indra/newview/skins/default/xui/da/floater_import_collada.xml23
-rw-r--r--indra/newview/skins/default/xui/da/floater_inventory_view_finder.xml39
-rw-r--r--indra/newview/skins/default/xui/da/floater_map.xml3
-rw-r--r--indra/newview/skins/default/xui/da/floater_model_preview.xml231
-rw-r--r--indra/newview/skins/default/xui/da/floater_model_wizard.xml241
-rw-r--r--indra/newview/skins/default/xui/da/floater_price_for_listing.xml18
-rw-r--r--indra/newview/skins/default/xui/da/floater_settings_debug.xml4
-rw-r--r--indra/newview/skins/default/xui/da/floater_sound_devices.xml7
-rw-r--r--indra/newview/skins/default/xui/da/floater_tools.xml50
-rw-r--r--indra/newview/skins/default/xui/da/floater_water.xml103
-rw-r--r--indra/newview/skins/default/xui/da/floater_windlight_options.xml228
-rw-r--r--indra/newview/skins/default/xui/da/language_settings.xml1
-rw-r--r--indra/newview/skins/default/xui/da/menu_attachment_self.xml2
-rw-r--r--indra/newview/skins/default/xui/da/menu_avatar_self.xml3
-rw-r--r--indra/newview/skins/default/xui/da/menu_bottomtray.xml2
-rw-r--r--indra/newview/skins/default/xui/da/menu_inspect_avatar_gear.xml6
-rw-r--r--indra/newview/skins/default/xui/da/menu_inspect_self_gear.xml39
-rw-r--r--indra/newview/skins/default/xui/da/menu_inventory.xml1
-rw-r--r--indra/newview/skins/default/xui/da/menu_inventory_add.xml3
-rw-r--r--indra/newview/skins/default/xui/da/menu_inventory_gear_default.xml1
-rw-r--r--indra/newview/skins/default/xui/da/menu_media_ctrl.xml6
-rw-r--r--indra/newview/skins/default/xui/da/menu_model_import_gear_default.xml8
-rw-r--r--indra/newview/skins/default/xui/da/menu_object.xml4
-rw-r--r--indra/newview/skins/default/xui/da/menu_outfit_gear.xml5
-rw-r--r--indra/newview/skins/default/xui/da/menu_places_gear_folder.xml5
-rw-r--r--indra/newview/skins/default/xui/da/menu_places_gear_landmark.xml5
-rw-r--r--indra/newview/skins/default/xui/da/menu_viewer.xml25
-rw-r--r--indra/newview/skins/default/xui/da/notifications.xml109
-rw-r--r--indra/newview/skins/default/xui/da/panel_edit_physics.xml14
-rw-r--r--indra/newview/skins/default/xui/da/panel_edit_pick.xml2
-rw-r--r--indra/newview/skins/default/xui/da/panel_edit_wearable.xml6
-rw-r--r--indra/newview/skins/default/xui/da/panel_login.xml7
-rw-r--r--indra/newview/skins/default/xui/da/panel_media_settings_security.xml3
-rw-r--r--indra/newview/skins/default/xui/da/panel_nearby_media.xml2
-rw-r--r--indra/newview/skins/default/xui/da/panel_people.xml10
-rw-r--r--indra/newview/skins/default/xui/da/panel_preferences_chat.xml4
-rw-r--r--indra/newview/skins/default/xui/da/panel_preferences_colors.xml17
-rw-r--r--indra/newview/skins/default/xui/da/panel_preferences_graphics1.xml18
-rw-r--r--indra/newview/skins/default/xui/da/panel_preferences_sound.xml4
-rw-r--r--indra/newview/skins/default/xui/da/panel_profile.xml8
-rw-r--r--indra/newview/skins/default/xui/da/panel_region_general.xml1
-rw-r--r--indra/newview/skins/default/xui/da/panel_script_ed.xml3
-rw-r--r--indra/newview/skins/default/xui/da/panel_scrolling_param_base.xml4
-rw-r--r--indra/newview/skins/default/xui/da/panel_sound_devices.xml19
-rw-r--r--indra/newview/skins/default/xui/da/strings.xml632
-rw-r--r--indra/newview/skins/default/xui/de/floater_about.xml26
-rw-r--r--indra/newview/skins/default/xui/de/floater_about_land.xml34
-rw-r--r--indra/newview/skins/default/xui/de/floater_buy_contents.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_buy_land.xml29
-rw-r--r--indra/newview/skins/default/xui/de/floater_customize.xml529
-rw-r--r--indra/newview/skins/default/xui/de/floater_day_cycle_options.xml94
-rw-r--r--indra/newview/skins/default/xui/de/floater_env_settings.xml26
-rw-r--r--indra/newview/skins/default/xui/de/floater_import_collada.xml23
-rw-r--r--indra/newview/skins/default/xui/de/floater_inventory_view_finder.xml1
-rw-r--r--indra/newview/skins/default/xui/de/floater_model_preview.xml231
-rw-r--r--indra/newview/skins/default/xui/de/floater_model_wizard.xml241
-rw-r--r--indra/newview/skins/default/xui/de/floater_perm_prefs.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_postcard.xml16
-rw-r--r--indra/newview/skins/default/xui/de/floater_preview_gesture.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_price_for_listing.xml18
-rw-r--r--indra/newview/skins/default/xui/de/floater_sell_land.xml18
-rw-r--r--indra/newview/skins/default/xui/de/floater_snapshot.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_sound_devices.xml7
-rw-r--r--indra/newview/skins/default/xui/de/floater_tools.xml54
-rw-r--r--indra/newview/skins/default/xui/de/floater_top_objects.xml23
-rw-r--r--indra/newview/skins/default/xui/de/floater_water.xml71
-rw-r--r--indra/newview/skins/default/xui/de/floater_wearable_save_as.xml11
-rw-r--r--indra/newview/skins/default/xui/de/floater_windlight_options.xml189
-rw-r--r--indra/newview/skins/default/xui/de/language_settings.xml1
-rw-r--r--indra/newview/skins/default/xui/de/menu_inventory_add.xml2
-rw-r--r--indra/newview/skins/default/xui/de/menu_model_import_gear_default.xml8
-rw-r--r--indra/newview/skins/default/xui/de/menu_viewer.xml13
-rw-r--r--indra/newview/skins/default/xui/de/notifications.xml45
-rw-r--r--indra/newview/skins/default/xui/de/panel_edit_pick.xml2
-rw-r--r--indra/newview/skins/default/xui/de/panel_friends.xml31
-rw-r--r--indra/newview/skins/default/xui/de/panel_group_notices.xml2
-rw-r--r--indra/newview/skins/default/xui/de/panel_people.xml8
-rw-r--r--indra/newview/skins/default/xui/de/panel_preferences_colors.xml3
-rw-r--r--indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml14
-rw-r--r--indra/newview/skins/default/xui/de/panel_preferences_privacy.xml2
-rw-r--r--indra/newview/skins/default/xui/de/panel_region_general.xml1
-rw-r--r--indra/newview/skins/default/xui/de/panel_scrolling_param_base.xml2
-rw-r--r--indra/newview/skins/default/xui/de/panel_sound_devices.xml19
-rw-r--r--indra/newview/skins/default/xui/de/strings.xml149
-rw-r--r--indra/newview/skins/default/xui/en/floater_about_land.xml96
-rw-r--r--indra/newview/skins/default/xui/en/floater_build_options.xml73
-rw-r--r--indra/newview/skins/default/xui/en/floater_buy_currency.xml6
-rw-r--r--indra/newview/skins/default/xui/en/floater_buy_land.xml12
-rw-r--r--indra/newview/skins/default/xui/en/floater_day_cycle_options.xml558
-rw-r--r--indra/newview/skins/default/xui/en/floater_delete_env_preset.xml59
-rw-r--r--indra/newview/skins/default/xui/en/floater_edit_day_cycle.xml485
-rw-r--r--indra/newview/skins/default/xui/en/floater_edit_sky_preset.xml953
-rw-r--r--indra/newview/skins/default/xui/en/floater_edit_water_preset.xml448
-rw-r--r--indra/newview/skins/default/xui/en/floater_env_settings.xml164
-rw-r--r--indra/newview/skins/default/xui/en/floater_environment_settings.xml162
-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.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_media_browser.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_model_preview.xml138
-rw-r--r--indra/newview/skins/default/xui/en/floater_model_wizard.xml778
-rw-r--r--indra/newview/skins/default/xui/en/floater_preview_gesture.xml12
-rw-r--r--indra/newview/skins/default/xui/en/floater_region_info.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_sell_land.xml33
-rw-r--r--indra/newview/skins/default/xui/en/floater_snapshot.xml8
-rw-r--r--indra/newview/skins/default/xui/en/floater_tools.xml308
-rw-r--r--indra/newview/skins/default/xui/en/floater_top_objects.xml12
-rw-r--r--indra/newview/skins/default/xui/en/floater_water.xml503
-rw-r--r--indra/newview/skins/default/xui/en/floater_web_content.xml11
-rw-r--r--indra/newview/skins/default/xui/en/floater_windlight_options.xml1288
-rw-r--r--indra/newview/skins/default/xui/en/language_settings.xml1
-rw-r--r--indra/newview/skins/default/xui/en/main_view.xml15
-rw-r--r--indra/newview/skins/default/xui/en/menu_inventory_add.xml4
-rw-r--r--indra/newview/skins/default/xui/en/menu_login.xml6
-rw-r--r--indra/newview/skins/default/xui/en/menu_people_nearby_view_sort.xml8
-rw-r--r--indra/newview/skins/default/xui/en/menu_viewer.xml162
-rw-r--r--indra/newview/skins/default/xui/en/menu_wearing_gear.xml7
-rw-r--r--indra/newview/skins/default/xui/en/notifications.xml164
-rw-r--r--indra/newview/skins/default/xui/en/panel_cof_wearables.xml5
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_pick.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_notices.xml10
-rw-r--r--indra/newview/skins/default/xui/en/panel_inbox_inventory.xml17
-rw-r--r--indra/newview/skins/default/xui/en/panel_media_settings_general.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_nearby_media.xml4
-rw-r--r--indra/newview/skins/default/xui/en/panel_outbox_inventory.xml17
-rw-r--r--indra/newview/skins/default/xui/en/panel_outfits_list.xml11
-rw-r--r--indra/newview/skins/default/xui/en/panel_people.xml79
-rw-r--r--indra/newview/skins/default/xui/en/panel_place_profile.xml35
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_advanced.xml106
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_chat.xml8
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_colors.xml37
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml7
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_move.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_setup.xml94
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_sound.xml31
-rw-r--r--indra/newview/skins/default/xui/en/panel_progress.xml8
-rw-r--r--indra/newview/skins/default/xui/en/panel_region_environment.xml149
-rw-r--r--indra/newview/skins/default/xui/en/panel_region_estate.xml324
-rw-r--r--indra/newview/skins/default/xui/en/panel_region_general.xml1
-rw-r--r--indra/newview/skins/default/xui/en/panel_region_terrain.xml371
-rw-r--r--indra/newview/skins/default/xui/en/panel_region_texture.xml327
-rw-r--r--indra/newview/skins/default/xui/en/panel_side_tray.xml1
-rw-r--r--indra/newview/skins/default/xui/en/panel_sound_devices.xml170
-rw-r--r--indra/newview/skins/default/xui/en/panel_topinfo_bar.xml10
-rw-r--r--indra/newview/skins/default/xui/en/sidepanel_inventory.xml230
-rw-r--r--indra/newview/skins/default/xui/en/strings.xml114
-rw-r--r--indra/newview/skins/default/xui/en/widgets/badge.xml17
-rw-r--r--indra/newview/skins/default/xui/en/widgets/button.xml1
-rw-r--r--indra/newview/skins/default/xui/en/widgets/inbox_folder_view_folder.xml10
-rw-r--r--indra/newview/skins/default/xui/en/widgets/inbox_inventory_panel.xml2
-rw-r--r--indra/newview/skins/default/xui/en/widgets/inventory_panel.xml10
-rw-r--r--indra/newview/skins/default/xui/en/widgets/location_input.xml8
-rw-r--r--indra/newview/skins/default/xui/en/widgets/panel.xml3
-rw-r--r--indra/newview/skins/default/xui/en/widgets/time.xml16
-rw-r--r--indra/newview/skins/default/xui/es/floater_about.xml44
-rw-r--r--indra/newview/skins/default/xui/es/floater_about_land.xml26
-rw-r--r--indra/newview/skins/default/xui/es/floater_buy_contents.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_buy_currency.xml7
-rw-r--r--indra/newview/skins/default/xui/es/floater_buy_land.xml10
-rw-r--r--indra/newview/skins/default/xui/es/floater_camera.xml6
-rw-r--r--indra/newview/skins/default/xui/es/floater_customize.xml530
-rw-r--r--indra/newview/skins/default/xui/es/floater_day_cycle_options.xml94
-rw-r--r--indra/newview/skins/default/xui/es/floater_env_settings.xml28
-rw-r--r--indra/newview/skins/default/xui/es/floater_help_browser.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_import_collada.xml23
-rw-r--r--indra/newview/skins/default/xui/es/floater_inventory_view_finder.xml5
-rw-r--r--indra/newview/skins/default/xui/es/floater_model_preview.xml231
-rw-r--r--indra/newview/skins/default/xui/es/floater_model_wizard.xml241
-rw-r--r--indra/newview/skins/default/xui/es/floater_postcard.xml20
-rw-r--r--indra/newview/skins/default/xui/es/floater_preview_animation.xml4
-rw-r--r--indra/newview/skins/default/xui/es/floater_preview_classified.xml6
-rw-r--r--indra/newview/skins/default/xui/es/floater_preview_event.xml6
-rw-r--r--indra/newview/skins/default/xui/es/floater_price_for_listing.xml18
-rw-r--r--indra/newview/skins/default/xui/es/floater_report_abuse.xml4
-rw-r--r--indra/newview/skins/default/xui/es/floater_sell_land.xml4
-rw-r--r--indra/newview/skins/default/xui/es/floater_settings_debug.xml4
-rw-r--r--indra/newview/skins/default/xui/es/floater_sound_devices.xml7
-rw-r--r--indra/newview/skins/default/xui/es/floater_tools.xml54
-rw-r--r--indra/newview/skins/default/xui/es/floater_top_objects.xml13
-rw-r--r--indra/newview/skins/default/xui/es/floater_water.xml88
-rw-r--r--indra/newview/skins/default/xui/es/floater_windlight_options.xml190
-rw-r--r--indra/newview/skins/default/xui/es/language_settings.xml1
-rw-r--r--indra/newview/skins/default/xui/es/menu_inventory_add.xml2
-rw-r--r--indra/newview/skins/default/xui/es/menu_model_import_gear_default.xml8
-rw-r--r--indra/newview/skins/default/xui/es/menu_viewer.xml14
-rw-r--r--indra/newview/skins/default/xui/es/notifications.xml54
-rw-r--r--indra/newview/skins/default/xui/es/panel_edit_pick.xml2
-rw-r--r--indra/newview/skins/default/xui/es/panel_friends.xml20
-rw-r--r--indra/newview/skins/default/xui/es/panel_group_general.xml6
-rw-r--r--indra/newview/skins/default/xui/es/panel_im_control_panel.xml2
-rw-r--r--indra/newview/skins/default/xui/es/panel_login.xml1
-rw-r--r--indra/newview/skins/default/xui/es/panel_media_settings_general.xml3
-rw-r--r--indra/newview/skins/default/xui/es/panel_media_settings_security.xml3
-rw-r--r--indra/newview/skins/default/xui/es/panel_navigation_bar.xml2
-rw-r--r--indra/newview/skins/default/xui/es/panel_people.xml8
-rw-r--r--indra/newview/skins/default/xui/es/panel_preferences_advanced.xml2
-rw-r--r--indra/newview/skins/default/xui/es/panel_preferences_chat.xml2
-rw-r--r--indra/newview/skins/default/xui/es/panel_preferences_colors.xml9
-rw-r--r--indra/newview/skins/default/xui/es/panel_preferences_general.xml6
-rw-r--r--indra/newview/skins/default/xui/es/panel_preferences_graphics1.xml16
-rw-r--r--indra/newview/skins/default/xui/es/panel_preferences_privacy.xml2
-rw-r--r--indra/newview/skins/default/xui/es/panel_preferences_sound.xml4
-rw-r--r--indra/newview/skins/default/xui/es/panel_region_covenant.xml2
-rw-r--r--indra/newview/skins/default/xui/es/panel_region_general.xml1
-rw-r--r--indra/newview/skins/default/xui/es/panel_sound_devices.xml19
-rw-r--r--indra/newview/skins/default/xui/es/strings.xml164
-rw-r--r--indra/newview/skins/default/xui/fr/floater_about.xml45
-rw-r--r--indra/newview/skins/default/xui/fr/floater_about_land.xml6
-rw-r--r--indra/newview/skins/default/xui/fr/floater_buy_contents.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_customize.xml530
-rw-r--r--indra/newview/skins/default/xui/fr/floater_day_cycle_options.xml94
-rw-r--r--indra/newview/skins/default/xui/fr/floater_env_settings.xml29
-rw-r--r--indra/newview/skins/default/xui/fr/floater_import_collada.xml23
-rw-r--r--indra/newview/skins/default/xui/fr/floater_inventory_view_finder.xml1
-rw-r--r--indra/newview/skins/default/xui/fr/floater_model_preview.xml231
-rw-r--r--indra/newview/skins/default/xui/fr/floater_model_wizard.xml241
-rw-r--r--indra/newview/skins/default/xui/fr/floater_postcard.xml9
-rw-r--r--indra/newview/skins/default/xui/fr/floater_preview_animation.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/floater_price_for_listing.xml18
-rw-r--r--indra/newview/skins/default/xui/fr/floater_sell_land.xml18
-rw-r--r--indra/newview/skins/default/xui/fr/floater_sound_devices.xml7
-rw-r--r--indra/newview/skins/default/xui/fr/floater_tools.xml48
-rw-r--r--indra/newview/skins/default/xui/fr/floater_water.xml70
-rw-r--r--indra/newview/skins/default/xui/fr/floater_wearable_save_as.xml11
-rw-r--r--indra/newview/skins/default/xui/fr/floater_windlight_options.xml189
-rw-r--r--indra/newview/skins/default/xui/fr/language_settings.xml1
-rw-r--r--indra/newview/skins/default/xui/fr/menu_inventory_add.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/menu_model_import_gear_default.xml8
-rw-r--r--indra/newview/skins/default/xui/fr/menu_viewer.xml12
-rw-r--r--indra/newview/skins/default/xui/fr/notifications.xml45
-rw-r--r--indra/newview/skins/default/xui/fr/panel_edit_pick.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/panel_people.xml8
-rw-r--r--indra/newview/skins/default/xui/fr/panel_preferences_colors.xml3
-rw-r--r--indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml12
-rw-r--r--indra/newview/skins/default/xui/fr/panel_region_general.xml1
-rw-r--r--indra/newview/skins/default/xui/fr/panel_sound_devices.xml19
-rw-r--r--indra/newview/skins/default/xui/fr/strings.xml151
-rw-r--r--indra/newview/skins/default/xui/it/floater_about.xml44
-rw-r--r--indra/newview/skins/default/xui/it/floater_about_land.xml36
-rw-r--r--indra/newview/skins/default/xui/it/floater_animation_preview.xml16
-rw-r--r--indra/newview/skins/default/xui/it/floater_avatar_picker.xml9
-rw-r--r--indra/newview/skins/default/xui/it/floater_beacons.xml1
-rw-r--r--indra/newview/skins/default/xui/it/floater_bumps.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_buy_contents.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_buy_currency.xml3
-rw-r--r--indra/newview/skins/default/xui/it/floater_buy_land.xml4
-rw-r--r--indra/newview/skins/default/xui/it/floater_buy_object.xml37
-rw-r--r--indra/newview/skins/default/xui/it/floater_day_cycle_options.xml94
-rw-r--r--indra/newview/skins/default/xui/it/floater_display_name.xml18
-rw-r--r--indra/newview/skins/default/xui/it/floater_env_settings.xml29
-rw-r--r--indra/newview/skins/default/xui/it/floater_event.xml45
-rw-r--r--indra/newview/skins/default/xui/it/floater_hardware_settings.xml3
-rw-r--r--indra/newview/skins/default/xui/it/floater_import_collada.xml23
-rw-r--r--indra/newview/skins/default/xui/it/floater_incoming_call.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_inventory_view_finder.xml1
-rw-r--r--indra/newview/skins/default/xui/it/floater_map.xml3
-rw-r--r--indra/newview/skins/default/xui/it/floater_model_preview.xml231
-rw-r--r--indra/newview/skins/default/xui/it/floater_model_wizard.xml241
-rw-r--r--indra/newview/skins/default/xui/it/floater_pay.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_preferences.xml4
-rw-r--r--indra/newview/skins/default/xui/it/floater_price_for_listing.xml18
-rw-r--r--indra/newview/skins/default/xui/it/floater_region_debug_console.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_sell_land.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_settings_debug.xml4
-rw-r--r--indra/newview/skins/default/xui/it/floater_sound_devices.xml7
-rw-r--r--indra/newview/skins/default/xui/it/floater_tools.xml58
-rw-r--r--indra/newview/skins/default/xui/it/floater_top_objects.xml8
-rw-r--r--indra/newview/skins/default/xui/it/floater_voice_controls.xml6
-rw-r--r--indra/newview/skins/default/xui/it/floater_water.xml95
-rw-r--r--indra/newview/skins/default/xui/it/floater_web_content.xml14
-rw-r--r--indra/newview/skins/default/xui/it/floater_windlight_options.xml189
-rw-r--r--indra/newview/skins/default/xui/it/inspect_avatar.xml5
-rw-r--r--indra/newview/skins/default/xui/it/language_settings.xml1
-rw-r--r--indra/newview/skins/default/xui/it/menu_attachment_self.xml2
-rw-r--r--indra/newview/skins/default/xui/it/menu_avatar_self.xml3
-rw-r--r--indra/newview/skins/default/xui/it/menu_bottomtray.xml2
-rw-r--r--indra/newview/skins/default/xui/it/menu_inspect_avatar_gear.xml6
-rw-r--r--indra/newview/skins/default/xui/it/menu_inspect_self_gear.xml39
-rw-r--r--indra/newview/skins/default/xui/it/menu_inventory.xml1
-rw-r--r--indra/newview/skins/default/xui/it/menu_inventory_add.xml3
-rw-r--r--indra/newview/skins/default/xui/it/menu_inventory_gear_default.xml10
-rw-r--r--indra/newview/skins/default/xui/it/menu_login.xml3
-rw-r--r--indra/newview/skins/default/xui/it/menu_media_ctrl.xml6
-rw-r--r--indra/newview/skins/default/xui/it/menu_mini_map.xml1
-rw-r--r--indra/newview/skins/default/xui/it/menu_model_import_gear_default.xml8
-rw-r--r--indra/newview/skins/default/xui/it/menu_object.xml4
-rw-r--r--indra/newview/skins/default/xui/it/menu_outfit_gear.xml5
-rw-r--r--indra/newview/skins/default/xui/it/menu_places_gear_folder.xml5
-rw-r--r--indra/newview/skins/default/xui/it/menu_places_gear_landmark.xml5
-rw-r--r--indra/newview/skins/default/xui/it/menu_viewer.xml53
-rw-r--r--indra/newview/skins/default/xui/it/notifications.xml324
-rw-r--r--indra/newview/skins/default/xui/it/panel_avatar_list_item.xml2
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_alpha.xml16
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_gloves.xml2
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_jacket.xml4
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_pants.xml2
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_physics.xml14
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_pick.xml2
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_profile.xml10
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_shirt.xml2
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_shoes.xml2
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_skirt.xml2
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_socks.xml2
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_underpants.xml2
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_undershirt.xml2
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_wearable.xml6
-rw-r--r--indra/newview/skins/default/xui/it/panel_group_land_money.xml1
-rw-r--r--indra/newview/skins/default/xui/it/panel_group_notices.xml9
-rw-r--r--indra/newview/skins/default/xui/it/panel_login.xml11
-rw-r--r--indra/newview/skins/default/xui/it/panel_media_settings_general.xml2
-rw-r--r--indra/newview/skins/default/xui/it/panel_my_profile.xml29
-rw-r--r--indra/newview/skins/default/xui/it/panel_nearby_media.xml2
-rw-r--r--indra/newview/skins/default/xui/it/panel_notify_textbox.xml11
-rw-r--r--indra/newview/skins/default/xui/it/panel_people.xml20
-rw-r--r--indra/newview/skins/default/xui/it/panel_place_profile.xml3
-rw-r--r--indra/newview/skins/default/xui/it/panel_preferences_advanced.xml29
-rw-r--r--indra/newview/skins/default/xui/it/panel_preferences_chat.xml49
-rw-r--r--indra/newview/skins/default/xui/it/panel_preferences_colors.xml44
-rw-r--r--indra/newview/skins/default/xui/it/panel_preferences_general.xml18
-rw-r--r--indra/newview/skins/default/xui/it/panel_preferences_graphics1.xml19
-rw-r--r--indra/newview/skins/default/xui/it/panel_preferences_move.xml24
-rw-r--r--indra/newview/skins/default/xui/it/panel_preferences_privacy.xml14
-rw-r--r--indra/newview/skins/default/xui/it/panel_preferences_setup.xml24
-rw-r--r--indra/newview/skins/default/xui/it/panel_preferences_sound.xml12
-rw-r--r--indra/newview/skins/default/xui/it/panel_profile.xml8
-rw-r--r--indra/newview/skins/default/xui/it/panel_profile_view.xml7
-rw-r--r--indra/newview/skins/default/xui/it/panel_region_general.xml1
-rw-r--r--indra/newview/skins/default/xui/it/panel_script_ed.xml14
-rw-r--r--indra/newview/skins/default/xui/it/panel_scrolling_param_base.xml4
-rw-r--r--indra/newview/skins/default/xui/it/panel_sound_devices.xml19
-rw-r--r--indra/newview/skins/default/xui/it/panel_status_bar.xml2
-rw-r--r--indra/newview/skins/default/xui/it/role_actions.xml87
-rw-r--r--indra/newview/skins/default/xui/it/strings.xml660
-rw-r--r--indra/newview/skins/default/xui/ja/floater_about.xml44
-rw-r--r--indra/newview/skins/default/xui/ja/floater_about_land.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/floater_avatar_picker.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/floater_beacons.xml1
-rw-r--r--indra/newview/skins/default/xui/ja/floater_bumps.xml10
-rw-r--r--indra/newview/skins/default/xui/ja/floater_buy_contents.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_buy_object.xml37
-rw-r--r--indra/newview/skins/default/xui/ja/floater_customize.xml529
-rw-r--r--indra/newview/skins/default/xui/ja/floater_day_cycle_options.xml94
-rw-r--r--indra/newview/skins/default/xui/ja/floater_display_name.xml18
-rw-r--r--indra/newview/skins/default/xui/ja/floater_env_settings.xml25
-rw-r--r--indra/newview/skins/default/xui/ja/floater_event.xml45
-rw-r--r--indra/newview/skins/default/xui/ja/floater_hardware_settings.xml3
-rw-r--r--indra/newview/skins/default/xui/ja/floater_import_collada.xml23
-rw-r--r--indra/newview/skins/default/xui/ja/floater_incoming_call.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_inventory_view_finder.xml1
-rw-r--r--indra/newview/skins/default/xui/ja/floater_map.xml27
-rw-r--r--indra/newview/skins/default/xui/ja/floater_model_preview.xml231
-rw-r--r--indra/newview/skins/default/xui/ja/floater_model_wizard.xml241
-rw-r--r--indra/newview/skins/default/xui/ja/floater_pay.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_preferences.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/floater_price_for_listing.xml18
-rw-r--r--indra/newview/skins/default/xui/ja/floater_region_debug_console.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_sell_land.xml16
-rw-r--r--indra/newview/skins/default/xui/ja/floater_sound_devices.xml7
-rw-r--r--indra/newview/skins/default/xui/ja/floater_tools.xml96
-rw-r--r--indra/newview/skins/default/xui/ja/floater_voice_controls.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_water.xml70
-rw-r--r--indra/newview/skins/default/xui/ja/floater_wearable_save_as.xml11
-rw-r--r--indra/newview/skins/default/xui/ja/floater_web_content.xml14
-rw-r--r--indra/newview/skins/default/xui/ja/floater_windlight_options.xml189
-rw-r--r--indra/newview/skins/default/xui/ja/inspect_avatar.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/language_settings.xml1
-rw-r--r--indra/newview/skins/default/xui/ja/menu_attachment_self.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/menu_avatar_self.xml3
-rw-r--r--indra/newview/skins/default/xui/ja/menu_bottomtray.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/menu_inspect_avatar_gear.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/menu_inspect_self_gear.xml39
-rw-r--r--indra/newview/skins/default/xui/ja/menu_inventory.xml1
-rw-r--r--indra/newview/skins/default/xui/ja/menu_inventory_add.xml3
-rw-r--r--indra/newview/skins/default/xui/ja/menu_inventory_gear_default.xml10
-rw-r--r--indra/newview/skins/default/xui/ja/menu_login.xml3
-rw-r--r--indra/newview/skins/default/xui/ja/menu_media_ctrl.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/menu_mini_map.xml1
-rw-r--r--indra/newview/skins/default/xui/ja/menu_model_import_gear_default.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/menu_object.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/menu_outfit_gear.xml5
-rw-r--r--indra/newview/skins/default/xui/ja/menu_places_gear_folder.xml5
-rw-r--r--indra/newview/skins/default/xui/ja/menu_places_gear_landmark.xml5
-rw-r--r--indra/newview/skins/default/xui/ja/menu_viewer.xml48
-rw-r--r--indra/newview/skins/default/xui/ja/notifications.xml330
-rw-r--r--indra/newview/skins/default/xui/ja/panel_avatar_list_item.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_alpha.xml16
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_gloves.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_jacket.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_pants.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_physics.xml14
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_pick.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_profile.xml10
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_shirt.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_shoes.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_skirt.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_socks.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_underpants.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_undershirt.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_wearable.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/panel_group_land_money.xml1
-rw-r--r--indra/newview/skins/default/xui/ja/panel_login.xml11
-rw-r--r--indra/newview/skins/default/xui/ja/panel_my_profile.xml33
-rw-r--r--indra/newview/skins/default/xui/ja/panel_nearby_media.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_notify_textbox.xml11
-rw-r--r--indra/newview/skins/default/xui/ja/panel_people.xml20
-rw-r--r--indra/newview/skins/default/xui/ja/panel_place_profile.xml3
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_advanced.xml29
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_chat.xml49
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_colors.xml44
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_general.xml18
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_graphics1.xml19
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_move.xml24
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_privacy.xml11
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_setup.xml16
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_sound.xml14
-rw-r--r--indra/newview/skins/default/xui/ja/panel_profile.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/panel_profile_view.xml7
-rw-r--r--indra/newview/skins/default/xui/ja/panel_region_general.xml1
-rw-r--r--indra/newview/skins/default/xui/ja/panel_script_ed.xml14
-rw-r--r--indra/newview/skins/default/xui/ja/panel_scrolling_param_base.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/panel_sound_devices.xml19
-rw-r--r--indra/newview/skins/default/xui/ja/panel_status_bar.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/role_actions.xml15
-rw-r--r--indra/newview/skins/default/xui/ja/strings.xml658
-rw-r--r--indra/newview/skins/default/xui/nl/floater_about.xml2
-rw-r--r--indra/newview/skins/default/xui/nl/floater_about_land.xml2
-rw-r--r--indra/newview/skins/default/xui/nl/floater_day_cycle_options.xml94
-rw-r--r--indra/newview/skins/default/xui/nl/floater_env_settings.xml24
-rw-r--r--indra/newview/skins/default/xui/nl/floater_preview_gesture.xml2
-rw-r--r--indra/newview/skins/default/xui/nl/floater_water.xml89
-rw-r--r--indra/newview/skins/default/xui/nl/floater_windlight_options.xml192
-rw-r--r--indra/newview/skins/default/xui/nl/language_settings.xml1
-rw-r--r--indra/newview/skins/default/xui/nl/panel_group_notices.xml9
-rw-r--r--indra/newview/skins/default/xui/nl/strings.xml11
-rw-r--r--indra/newview/skins/default/xui/pl/floater_day_cycle_options.xml96
-rw-r--r--indra/newview/skins/default/xui/pl/floater_env_settings.xml28
-rw-r--r--indra/newview/skins/default/xui/pl/floater_preview_animation.xml4
-rw-r--r--indra/newview/skins/default/xui/pl/floater_sell_land.xml2
-rw-r--r--indra/newview/skins/default/xui/pl/floater_settings_debug.xml4
-rw-r--r--indra/newview/skins/default/xui/pl/floater_water.xml103
-rw-r--r--indra/newview/skins/default/xui/pl/floater_windlight_options.xml228
-rw-r--r--indra/newview/skins/default/xui/pl/language_settings.xml1
-rw-r--r--indra/newview/skins/default/xui/pl/panel_edit_pick.xml2
-rw-r--r--indra/newview/skins/default/xui/pl/panel_group_notices.xml2
-rw-r--r--indra/newview/skins/default/xui/pl/panel_media_settings_security.xml3
-rw-r--r--indra/newview/skins/default/xui/pl/panel_people.xml8
-rw-r--r--indra/newview/skins/default/xui/pl/panel_preferences_privacy.xml2
-rw-r--r--indra/newview/skins/default/xui/pl/sidepanel_item_info.xml4
-rw-r--r--indra/newview/skins/default/xui/pl/strings.xml9
-rw-r--r--indra/newview/skins/default/xui/pt/floater_about.xml28
-rw-r--r--indra/newview/skins/default/xui/pt/floater_about_land.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_build_options.xml6
-rw-r--r--indra/newview/skins/default/xui/pt/floater_buy_contents.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_buy_land.xml14
-rw-r--r--indra/newview/skins/default/xui/pt/floater_customize.xml530
-rw-r--r--indra/newview/skins/default/xui/pt/floater_day_cycle_options.xml67
-rw-r--r--indra/newview/skins/default/xui/pt/floater_device_settings.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_env_settings.xml27
-rw-r--r--indra/newview/skins/default/xui/pt/floater_image_preview.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_import_collada.xml23
-rw-r--r--indra/newview/skins/default/xui/pt/floater_inventory_view_finder.xml1
-rw-r--r--indra/newview/skins/default/xui/pt/floater_model_preview.xml231
-rw-r--r--indra/newview/skins/default/xui/pt/floater_model_wizard.xml241
-rw-r--r--indra/newview/skins/default/xui/pt/floater_preview_animation.xml4
-rw-r--r--indra/newview/skins/default/xui/pt/floater_preview_classified.xml6
-rw-r--r--indra/newview/skins/default/xui/pt/floater_preview_event.xml6
-rw-r--r--indra/newview/skins/default/xui/pt/floater_preview_gesture.xml23
-rw-r--r--indra/newview/skins/default/xui/pt/floater_price_for_listing.xml18
-rw-r--r--indra/newview/skins/default/xui/pt/floater_sell_land.xml5
-rw-r--r--indra/newview/skins/default/xui/pt/floater_settings_debug.xml4
-rw-r--r--indra/newview/skins/default/xui/pt/floater_sound_devices.xml7
-rw-r--r--indra/newview/skins/default/xui/pt/floater_tools.xml48
-rw-r--r--indra/newview/skins/default/xui/pt/floater_top_objects.xml6
-rw-r--r--indra/newview/skins/default/xui/pt/floater_water.xml86
-rw-r--r--indra/newview/skins/default/xui/pt/floater_windlight_options.xml187
-rw-r--r--indra/newview/skins/default/xui/pt/language_settings.xml1
-rw-r--r--indra/newview/skins/default/xui/pt/menu_inventory_add.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/menu_model_import_gear_default.xml8
-rw-r--r--indra/newview/skins/default/xui/pt/menu_viewer.xml12
-rw-r--r--indra/newview/skins/default/xui/pt/notifications.xml45
-rw-r--r--indra/newview/skins/default/xui/pt/panel_edit_pick.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/panel_friends.xml20
-rw-r--r--indra/newview/skins/default/xui/pt/panel_group_notices.xml9
-rw-r--r--indra/newview/skins/default/xui/pt/panel_media_settings_security.xml3
-rw-r--r--indra/newview/skins/default/xui/pt/panel_people.xml8
-rw-r--r--indra/newview/skins/default/xui/pt/panel_preferences_colors.xml3
-rw-r--r--indra/newview/skins/default/xui/pt/panel_preferences_graphics1.xml12
-rw-r--r--indra/newview/skins/default/xui/pt/panel_region_general.xml1
-rw-r--r--indra/newview/skins/default/xui/pt/panel_sound_devices.xml19
-rw-r--r--indra/newview/skins/default/xui/pt/strings.xml114
-rw-r--r--indra/newview/skins/default/xui/zh/floater_aaa.xml9
-rw-r--r--indra/newview/skins/default/xui/zh/floater_about.xml84
-rw-r--r--indra/newview/skins/default/xui/zh/floater_about_land.xml478
-rw-r--r--indra/newview/skins/default/xui/zh/floater_activeim.xml (renamed from indra/newview/skins/default/xui/pt/floater_statistics.xml)2
-rw-r--r--indra/newview/skins/default/xui/zh/floater_animation_preview.xml186
-rw-r--r--indra/newview/skins/default/xui/zh/floater_auction.xml11
-rw-r--r--indra/newview/skins/default/xui/zh/floater_avatar_picker.xml53
-rw-r--r--indra/newview/skins/default/xui/zh/floater_avatar_textures.xml50
-rw-r--r--indra/newview/skins/default/xui/zh/floater_beacons.xml22
-rw-r--r--indra/newview/skins/default/xui/zh/floater_build_options.xml10
-rw-r--r--indra/newview/skins/default/xui/zh/floater_bulk_perms.xml45
-rw-r--r--indra/newview/skins/default/xui/zh/floater_bumps.xml24
-rw-r--r--indra/newview/skins/default/xui/zh/floater_buy_contents.xml21
-rw-r--r--indra/newview/skins/default/xui/zh/floater_buy_currency.xml66
-rw-r--r--indra/newview/skins/default/xui/zh/floater_buy_currency_html.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/floater_buy_land.xml233
-rw-r--r--indra/newview/skins/default/xui/zh/floater_buy_object.xml29
-rw-r--r--indra/newview/skins/default/xui/zh/floater_camera.xml65
-rw-r--r--indra/newview/skins/default/xui/zh/floater_choose_group.xml8
-rw-r--r--indra/newview/skins/default/xui/zh/floater_color_picker.xml30
-rw-r--r--indra/newview/skins/default/xui/zh/floater_critical.xml10
-rw-r--r--indra/newview/skins/default/xui/zh/floater_display_name.xml18
-rw-r--r--indra/newview/skins/default/xui/zh/floater_event.xml9
-rw-r--r--indra/newview/skins/default/xui/zh/floater_font_test.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/floater_gesture.xml26
-rw-r--r--indra/newview/skins/default/xui/zh/floater_god_tools.xml96
-rw-r--r--indra/newview/skins/default/xui/zh/floater_hardware_settings.xml31
-rw-r--r--indra/newview/skins/default/xui/zh/floater_help_browser.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/floater_hud.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/floater_im_container.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/floater_im_session.xml8
-rw-r--r--indra/newview/skins/default/xui/zh/floater_image_preview.xml32
-rw-r--r--indra/newview/skins/default/xui/zh/floater_incoming_call.xml33
-rw-r--r--indra/newview/skins/default/xui/zh/floater_inspect.xml14
-rw-r--r--indra/newview/skins/default/xui/zh/floater_inventory.xml4
-rw-r--r--indra/newview/skins/default/xui/zh/floater_inventory_item_properties.xml67
-rw-r--r--indra/newview/skins/default/xui/zh/floater_inventory_view_finder.xml24
-rw-r--r--indra/newview/skins/default/xui/zh/floater_joystick.xml79
-rw-r--r--indra/newview/skins/default/xui/zh/floater_lagmeter.xml151
-rw-r--r--indra/newview/skins/default/xui/zh/floater_land_holdings.xml39
-rw-r--r--indra/newview/skins/default/xui/zh/floater_live_lsleditor.xml15
-rw-r--r--indra/newview/skins/default/xui/zh/floater_lsl_guide.xml7
-rw-r--r--indra/newview/skins/default/xui/zh/floater_map.xml36
-rw-r--r--indra/newview/skins/default/xui/zh/floater_media_browser.xml30
-rw-r--r--indra/newview/skins/default/xui/zh/floater_media_settings.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/floater_mem_leaking.xml18
-rw-r--r--indra/newview/skins/default/xui/zh/floater_moveview.xml75
-rw-r--r--indra/newview/skins/default/xui/zh/floater_mute_object.xml14
-rw-r--r--indra/newview/skins/default/xui/zh/floater_nearby_chat.xml4
-rw-r--r--indra/newview/skins/default/xui/zh/floater_notification.xml7
-rw-r--r--indra/newview/skins/default/xui/zh/floater_notifications_console.xml5
-rw-r--r--indra/newview/skins/default/xui/zh/floater_openobject.xml8
-rw-r--r--indra/newview/skins/default/xui/zh/floater_outfit_save_as.xml11
-rw-r--r--indra/newview/skins/default/xui/zh/floater_outgoing_call.xml40
-rw-r--r--indra/newview/skins/default/xui/zh/floater_pay.xml21
-rw-r--r--indra/newview/skins/default/xui/zh/floater_pay_object.xml28
-rw-r--r--indra/newview/skins/default/xui/zh/floater_perm_prefs.xml15
-rw-r--r--indra/newview/skins/default/xui/zh/floater_post_process.xml53
-rw-r--r--indra/newview/skins/default/xui/zh/floater_postcard.xml33
-rw-r--r--indra/newview/skins/default/xui/zh/floater_preferences.xml17
-rw-r--r--indra/newview/skins/default/xui/zh/floater_preview_animation.xml11
-rw-r--r--indra/newview/skins/default/xui/zh/floater_preview_gesture.xml73
-rw-r--r--indra/newview/skins/default/xui/zh/floater_preview_notecard.xml20
-rw-r--r--indra/newview/skins/default/xui/zh/floater_preview_sound.xml11
-rw-r--r--indra/newview/skins/default/xui/zh/floater_preview_texture.xml47
-rw-r--r--indra/newview/skins/default/xui/zh/floater_publish_classified.xml11
-rw-r--r--indra/newview/skins/default/xui/zh/floater_region_debug_console.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/floater_region_info.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/floater_report_abuse.xml94
-rw-r--r--indra/newview/skins/default/xui/zh/floater_script_debug.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/floater_script_debug_panel.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/floater_script_limits.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/floater_script_preview.xml9
-rw-r--r--indra/newview/skins/default/xui/zh/floater_script_queue.xml19
-rw-r--r--indra/newview/skins/default/xui/zh/floater_script_search.xml13
-rw-r--r--indra/newview/skins/default/xui/zh/floater_search.xml16
-rw-r--r--indra/newview/skins/default/xui/zh/floater_select_key.xml7
-rw-r--r--indra/newview/skins/default/xui/zh/floater_sell_land.xml65
-rw-r--r--indra/newview/skins/default/xui/zh/floater_settings_debug.xml13
-rw-r--r--indra/newview/skins/default/xui/zh/floater_snapshot.xml74
-rw-r--r--indra/newview/skins/default/xui/zh/floater_sound_preview.xml11
-rw-r--r--indra/newview/skins/default/xui/zh/floater_stats.xml71
-rw-r--r--indra/newview/skins/default/xui/zh/floater_sys_well.xml9
-rw-r--r--indra/newview/skins/default/xui/zh/floater_telehub.xml29
-rw-r--r--indra/newview/skins/default/xui/zh/floater_texture_ctrl.xml23
-rw-r--r--indra/newview/skins/default/xui/zh/floater_tools.xml499
-rw-r--r--indra/newview/skins/default/xui/zh/floater_top_objects.xml55
-rw-r--r--indra/newview/skins/default/xui/zh/floater_tos.xml15
-rw-r--r--indra/newview/skins/default/xui/zh/floater_url_entry.xml12
-rw-r--r--indra/newview/skins/default/xui/zh/floater_voice_controls.xml30
-rw-r--r--indra/newview/skins/default/xui/zh/floater_voice_effect.xml30
-rw-r--r--indra/newview/skins/default/xui/zh/floater_web_content.xml14
-rw-r--r--indra/newview/skins/default/xui/zh/floater_whitelist_entry.xml9
-rw-r--r--indra/newview/skins/default/xui/zh/floater_window_size.xml17
-rw-r--r--indra/newview/skins/default/xui/zh/floater_world_map.xml73
-rw-r--r--indra/newview/skins/default/xui/zh/inspect_avatar.xml25
-rw-r--r--indra/newview/skins/default/xui/zh/inspect_group.xml32
-rw-r--r--indra/newview/skins/default/xui/zh/inspect_object.xml44
-rw-r--r--indra/newview/skins/default/xui/zh/inspect_remote_object.xml22
-rw-r--r--indra/newview/skins/default/xui/zh/menu_add_wearable_gear.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/menu_attachment_other.xml17
-rw-r--r--indra/newview/skins/default/xui/zh/menu_attachment_self.xml16
-rw-r--r--indra/newview/skins/default/xui/zh/menu_avatar_icon.xml7
-rw-r--r--indra/newview/skins/default/xui/zh/menu_avatar_other.xml16
-rw-r--r--indra/newview/skins/default/xui/zh/menu_avatar_self.xml32
-rw-r--r--indra/newview/skins/default/xui/zh/menu_bottomtray.xml17
-rw-r--r--indra/newview/skins/default/xui/zh/menu_cof_attachment.xml4
-rw-r--r--indra/newview/skins/default/xui/zh/menu_cof_body_part.xml5
-rw-r--r--indra/newview/skins/default/xui/zh/menu_cof_clothing.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/menu_cof_gear.xml5
-rw-r--r--indra/newview/skins/default/xui/zh/menu_edit.xml12
-rw-r--r--indra/newview/skins/default/xui/zh/menu_favorites.xml10
-rw-r--r--indra/newview/skins/default/xui/zh/menu_gesture_gear.xml9
-rw-r--r--indra/newview/skins/default/xui/zh/menu_group_plus.xml5
-rw-r--r--indra/newview/skins/default/xui/zh/menu_hide_navbar.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/menu_im_well_button.xml4
-rw-r--r--indra/newview/skins/default/xui/zh/menu_imchiclet_adhoc.xml4
-rw-r--r--indra/newview/skins/default/xui/zh/menu_imchiclet_group.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/menu_imchiclet_p2p.xml7
-rw-r--r--indra/newview/skins/default/xui/zh/menu_inspect_avatar_gear.xml21
-rw-r--r--indra/newview/skins/default/xui/zh/menu_inspect_object_gear.xml18
-rw-r--r--indra/newview/skins/default/xui/zh/menu_inspect_self_gear.xml31
-rw-r--r--indra/newview/skins/default/xui/zh/menu_inv_offer_chiclet.xml4
-rw-r--r--indra/newview/skins/default/xui/zh/menu_inventory.xml87
-rw-r--r--indra/newview/skins/default/xui/zh/menu_inventory_add.xml34
-rw-r--r--indra/newview/skins/default/xui/zh/menu_inventory_gear_default.xml17
-rw-r--r--indra/newview/skins/default/xui/zh/menu_land.xml9
-rw-r--r--indra/newview/skins/default/xui/zh/menu_landmark.xml7
-rw-r--r--indra/newview/skins/default/xui/zh/menu_login.xml25
-rw-r--r--indra/newview/skins/default/xui/zh/menu_media_ctrl.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/menu_mini_map.xml11
-rw-r--r--indra/newview/skins/default/xui/zh/menu_navbar.xml11
-rw-r--r--indra/newview/skins/default/xui/zh/menu_nearby_chat.xml9
-rw-r--r--indra/newview/skins/default/xui/zh/menu_notification_well_button.xml4
-rw-r--r--indra/newview/skins/default/xui/zh/menu_object.xml27
-rw-r--r--indra/newview/skins/default/xui/zh/menu_object_icon.xml5
-rw-r--r--indra/newview/skins/default/xui/zh/menu_outfit_gear.xml28
-rw-r--r--indra/newview/skins/default/xui/zh/menu_outfit_tab.xml9
-rw-r--r--indra/newview/skins/default/xui/zh/menu_participant_list.xml21
-rw-r--r--indra/newview/skins/default/xui/zh/menu_people_friends_view_sort.xml8
-rw-r--r--indra/newview/skins/default/xui/zh/menu_people_groups.xml8
-rw-r--r--indra/newview/skins/default/xui/zh/menu_people_groups_view_sort.xml5
-rw-r--r--indra/newview/skins/default/xui/zh/menu_people_nearby.xml13
-rw-r--r--indra/newview/skins/default/xui/zh/menu_people_nearby_multiselect.xml10
-rw-r--r--indra/newview/skins/default/xui/zh/menu_people_nearby_view_sort.xml8
-rw-r--r--indra/newview/skins/default/xui/zh/menu_people_recent_view_sort.xml7
-rw-r--r--indra/newview/skins/default/xui/zh/menu_picks.xml8
-rw-r--r--indra/newview/skins/default/xui/zh/menu_picks_plus.xml5
-rw-r--r--indra/newview/skins/default/xui/zh/menu_place.xml5
-rw-r--r--indra/newview/skins/default/xui/zh/menu_place_add_button.xml5
-rw-r--r--indra/newview/skins/default/xui/zh/menu_places_gear_folder.xml16
-rw-r--r--indra/newview/skins/default/xui/zh/menu_places_gear_landmark.xml19
-rw-r--r--indra/newview/skins/default/xui/zh/menu_profile_overflow.xml12
-rw-r--r--indra/newview/skins/default/xui/zh/menu_save_outfit.xml5
-rw-r--r--indra/newview/skins/default/xui/zh/menu_script_chiclet.xml4
-rw-r--r--indra/newview/skins/default/xui/zh/menu_slurl.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/menu_teleport_history_gear.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/menu_teleport_history_item.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/menu_teleport_history_tab.xml5
-rw-r--r--indra/newview/skins/default/xui/zh/menu_text_editor.xml8
-rw-r--r--indra/newview/skins/default/xui/zh/menu_topinfobar.xml7
-rw-r--r--indra/newview/skins/default/xui/zh/menu_url_agent.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/menu_url_group.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/menu_url_http.xml7
-rw-r--r--indra/newview/skins/default/xui/zh/menu_url_inventory.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/menu_url_map.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/menu_url_objectim.xml8
-rw-r--r--indra/newview/skins/default/xui/zh/menu_url_parcel.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/menu_url_slapp.xml5
-rw-r--r--indra/newview/skins/default/xui/zh/menu_url_slurl.xml7
-rw-r--r--indra/newview/skins/default/xui/zh/menu_url_teleport.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/menu_viewer.xml430
-rw-r--r--indra/newview/skins/default/xui/zh/menu_wearable_list_item.xml14
-rw-r--r--indra/newview/skins/default/xui/zh/menu_wearing_gear.xml5
-rw-r--r--indra/newview/skins/default/xui/zh/menu_wearing_tab.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/mime_types.xml217
-rw-r--r--indra/newview/skins/default/xui/zh/mime_types_linux.xml217
-rw-r--r--indra/newview/skins/default/xui/zh/mime_types_mac.xml217
-rw-r--r--indra/newview/skins/default/xui/zh/notifications.xml2952
-rw-r--r--indra/newview/skins/default/xui/zh/panel_active_object_row.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/panel_adhoc_control_panel.xml14
-rw-r--r--indra/newview/skins/default/xui/zh/panel_avatar_list_item.xml31
-rw-r--r--indra/newview/skins/default/xui/zh/panel_avatar_tag.xml12
-rw-r--r--indra/newview/skins/default/xui/zh/panel_block_list_sidetray.xml10
-rw-r--r--indra/newview/skins/default/xui/zh/panel_body_parts_list_item.xml8
-rw-r--r--indra/newview/skins/default/xui/zh/panel_bodyparts_list_button_bar.xml4
-rw-r--r--indra/newview/skins/default/xui/zh/panel_bottomtray.xml47
-rw-r--r--indra/newview/skins/default/xui/zh/panel_bottomtray_lite.xml8
-rw-r--r--indra/newview/skins/default/xui/zh/panel_chat_header.xml4
-rw-r--r--indra/newview/skins/default/xui/zh/panel_classified_info.xml67
-rw-r--r--indra/newview/skins/default/xui/zh/panel_clothing_list_button_bar.xml4
-rw-r--r--indra/newview/skins/default/xui/zh/panel_clothing_list_item.xml9
-rw-r--r--indra/newview/skins/default/xui/zh/panel_cof_wearables.xml8
-rw-r--r--indra/newview/skins/default/xui/zh/panel_deletable_wearable_list_item.xml5
-rw-r--r--indra/newview/skins/default/xui/zh/panel_dummy_clothing_list_item.xml7
-rw-r--r--indra/newview/skins/default/xui/zh/panel_edit_alpha.xml12
-rw-r--r--indra/newview/skins/default/xui/zh/panel_edit_classified.xml54
-rw-r--r--indra/newview/skins/default/xui/zh/panel_edit_eyes.xml11
-rw-r--r--indra/newview/skins/default/xui/zh/panel_edit_gloves.xml12
-rw-r--r--indra/newview/skins/default/xui/zh/panel_edit_hair.xml14
-rw-r--r--indra/newview/skins/default/xui/zh/panel_edit_jacket.xml13
-rw-r--r--indra/newview/skins/default/xui/zh/panel_edit_pants.xml12
-rw-r--r--indra/newview/skins/default/xui/zh/panel_edit_physics.xml14
-rw-r--r--indra/newview/skins/default/xui/zh/panel_edit_pick.xml37
-rw-r--r--indra/newview/skins/default/xui/zh/panel_edit_profile.xml68
-rw-r--r--indra/newview/skins/default/xui/zh/panel_edit_shape.xml25
-rw-r--r--indra/newview/skins/default/xui/zh/panel_edit_shirt.xml12
-rw-r--r--indra/newview/skins/default/xui/zh/panel_edit_shoes.xml12
-rw-r--r--indra/newview/skins/default/xui/zh/panel_edit_skin.xml16
-rw-r--r--indra/newview/skins/default/xui/zh/panel_edit_skirt.xml12
-rw-r--r--indra/newview/skins/default/xui/zh/panel_edit_socks.xml12
-rw-r--r--indra/newview/skins/default/xui/zh/panel_edit_tattoo.xml9
-rw-r--r--indra/newview/skins/default/xui/zh/panel_edit_underpants.xml12
-rw-r--r--indra/newview/skins/default/xui/zh/panel_edit_undershirt.xml12
-rw-r--r--indra/newview/skins/default/xui/zh/panel_edit_wearable.xml120
-rw-r--r--indra/newview/skins/default/xui/zh/panel_group_control_panel.xml17
-rw-r--r--indra/newview/skins/default/xui/zh/panel_group_general.xml57
-rw-r--r--indra/newview/skins/default/xui/zh/panel_group_info_sidetray.xml41
-rw-r--r--indra/newview/skins/default/xui/zh/panel_group_invite.xml27
-rw-r--r--indra/newview/skins/default/xui/zh/panel_group_land_money.xml85
-rw-r--r--indra/newview/skins/default/xui/zh/panel_group_list_item.xml5
-rw-r--r--indra/newview/skins/default/xui/zh/panel_group_notices.xml61
-rw-r--r--indra/newview/skins/default/xui/zh/panel_group_notify.xml12
-rw-r--r--indra/newview/skins/default/xui/zh/panel_group_roles.xml95
-rw-r--r--indra/newview/skins/default/xui/zh/panel_im_control_panel.xml29
-rw-r--r--indra/newview/skins/default/xui/zh/panel_instant_message.xml9
-rw-r--r--indra/newview/skins/default/xui/zh/panel_inventory_item.xml4
-rw-r--r--indra/newview/skins/default/xui/zh/panel_landmark_info.xml41
-rw-r--r--indra/newview/skins/default/xui/zh/panel_landmarks.xml22
-rw-r--r--indra/newview/skins/default/xui/zh/panel_login.xml25
-rw-r--r--indra/newview/skins/default/xui/zh/panel_main_inventory.xml28
-rw-r--r--indra/newview/skins/default/xui/zh/panel_me.xml7
-rw-r--r--indra/newview/skins/default/xui/zh/panel_media_settings_general.xml32
-rw-r--r--indra/newview/skins/default/xui/zh/panel_media_settings_permissions.xml29
-rw-r--r--indra/newview/skins/default/xui/zh/panel_media_settings_security.xml12
-rw-r--r--indra/newview/skins/default/xui/zh/panel_my_profile.xml42
-rw-r--r--indra/newview/skins/default/xui/zh/panel_navigation_bar.xml18
-rw-r--r--indra/newview/skins/default/xui/zh/panel_nearby_chat_bar.xml5
-rw-r--r--indra/newview/skins/default/xui/zh/panel_nearby_media.xml70
-rw-r--r--indra/newview/skins/default/xui/zh/panel_notes.xml35
-rw-r--r--indra/newview/skins/default/xui/zh/panel_notify_textbox.xml11
-rw-r--r--indra/newview/skins/default/xui/zh/panel_online_status_toast.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/panel_outfit_edit.xml57
-rw-r--r--indra/newview/skins/default/xui/zh/panel_outfits_inventory.xml23
-rw-r--r--indra/newview/skins/default/xui/zh/panel_outfits_inventory_gear_default.xml8
-rw-r--r--indra/newview/skins/default/xui/zh/panel_outfits_list.xml7
-rw-r--r--indra/newview/skins/default/xui/zh/panel_outfits_wearing.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/panel_people.xml94
-rw-r--r--indra/newview/skins/default/xui/zh/panel_pick_info.xml24
-rw-r--r--indra/newview/skins/default/xui/zh/panel_picks.xml29
-rw-r--r--indra/newview/skins/default/xui/zh/panel_place_profile.xml116
-rw-r--r--indra/newview/skins/default/xui/zh/panel_places.xml48
-rw-r--r--indra/newview/skins/default/xui/zh/panel_preferences_advanced.xml18
-rw-r--r--indra/newview/skins/default/xui/zh/panel_preferences_alerts.xml14
-rw-r--r--indra/newview/skins/default/xui/zh/panel_preferences_chat.xml57
-rw-r--r--indra/newview/skins/default/xui/zh/panel_preferences_colors.xml41
-rw-r--r--indra/newview/skins/default/xui/zh/panel_preferences_general.xml74
-rw-r--r--indra/newview/skins/default/xui/zh/panel_preferences_graphics1.xml102
-rw-r--r--indra/newview/skins/default/xui/zh/panel_preferences_move.xml24
-rw-r--r--indra/newview/skins/default/xui/zh/panel_preferences_privacy.xml30
-rw-r--r--indra/newview/skins/default/xui/zh/panel_preferences_setup.xml49
-rw-r--r--indra/newview/skins/default/xui/zh/panel_preferences_sound.xml62
-rw-r--r--indra/newview/skins/default/xui/zh/panel_prim_media_controls.xml91
-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_covenant.xml79
-rw-r--r--indra/newview/skins/default/xui/zh/panel_region_debug.xml34
-rw-r--r--indra/newview/skins/default/xui/zh/panel_region_estate.xml52
-rw-r--r--indra/newview/skins/default/xui/zh/panel_region_general.xml43
-rw-r--r--indra/newview/skins/default/xui/zh/panel_region_terrain.xml19
-rw-r--r--indra/newview/skins/default/xui/zh/panel_region_texture.xml54
-rw-r--r--indra/newview/skins/default/xui/zh/panel_script_ed.xml47
-rw-r--r--indra/newview/skins/default/xui/zh/panel_script_limits_my_avatar.xml16
-rw-r--r--indra/newview/skins/default/xui/zh/panel_script_limits_region_memory.xml20
-rw-r--r--indra/newview/skins/default/xui/zh/panel_scrolling_param.xml10
-rw-r--r--indra/newview/skins/default/xui/zh/panel_scrolling_param_base.xml4
-rw-r--r--indra/newview/skins/default/xui/zh/panel_side_tray.xml29
-rw-r--r--indra/newview/skins/default/xui/zh/panel_side_tray_tab_caption.xml7
-rw-r--r--indra/newview/skins/default/xui/zh/panel_stand_stop_flying.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/panel_status_bar.xml27
-rw-r--r--indra/newview/skins/default/xui/zh/panel_teleport_history.xml19
-rw-r--r--indra/newview/skins/default/xui/zh/panel_teleport_history_item.xml5
-rw-r--r--indra/newview/skins/default/xui/zh/panel_voice_effect.xml15
-rw-r--r--indra/newview/skins/default/xui/zh/panel_world_map.xml63
-rw-r--r--indra/newview/skins/default/xui/zh/role_actions.xml73
-rw-r--r--indra/newview/skins/default/xui/zh/sidepanel_appearance.xml19
-rw-r--r--indra/newview/skins/default/xui/zh/sidepanel_inventory.xml21
-rw-r--r--indra/newview/skins/default/xui/zh/sidepanel_item_info.xml76
-rw-r--r--indra/newview/skins/default/xui/zh/sidepanel_task_info.xml123
-rw-r--r--indra/newview/skins/default/xui/zh/strings.xml4451
-rw-r--r--indra/newview/skins/default/xui/zh/teleport_strings.xml80
-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/menu_inspect_avatar_gear.xml1
-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.xml24
-rw-r--r--indra/newview/skins/minimal/xui/de/panel_im_control_panel.xml2
-rw-r--r--indra/newview/skins/minimal/xui/de/panel_people.xml3
-rw-r--r--indra/newview/skins/minimal/xui/en/floater_help_browser.xml11
-rw-r--r--indra/newview/skins/minimal/xui/en/floater_web_content.xml11
-rw-r--r--indra/newview/skins/minimal/xui/en/panel_im_control_panel.xml242
-rw-r--r--indra/newview/skins/minimal/xui/en/widgets/location_input.xml8
-rw-r--r--indra/newview/skins/minimal/xui/es/floater_camera.xml4
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_attachment_other.xml2
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_avatar_other.xml2
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_inspect_avatar_gear.xml1
-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.xml24
-rw-r--r--indra/newview/skins/minimal/xui/es/panel_im_control_panel.xml2
-rw-r--r--indra/newview/skins/minimal/xui/es/panel_people.xml3
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_inspect_avatar_gear.xml1
-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.xml24
-rw-r--r--indra/newview/skins/minimal/xui/fr/panel_im_control_panel.xml2
-rw-r--r--indra/newview/skins/minimal/xui/fr/panel_people.xml3
-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.xml33
-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.xml30
-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.xml33
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_inspect_avatar_gear.xml1
-rw-r--r--indra/newview/skins/minimal/xui/pt/panel_bottomtray.xml24
-rw-r--r--indra/newview/skins/minimal/xui/pt/panel_im_control_panel.xml2
-rw-r--r--indra/newview/skins/minimal/xui/pt/panel_people.xml3
-rw-r--r--indra/newview/tests/gpus_results.txt1595
-rw-r--r--indra/newview/tests/gpus_seen.txt1593
-rw-r--r--indra/newview/tests/lldir_stub.cpp45
-rw-r--r--indra/newview/tests/llglslshader_stub.cpp22
-rw-r--r--indra/newview/tests/llpipeline_stub.cpp15
-rw-r--r--indra/newview/tests/llsky_stub.cpp20
-rw-r--r--indra/newview/tests/llviewernetwork_test.cpp12
-rw-r--r--indra/newview/tests/llviewershadermgr_stub.cpp33
-rw-r--r--indra/newview/tests/llwlanimator_stub.cpp12
-rw-r--r--indra/newview/tests/llwldaycycle_stub.cpp35
-rw-r--r--indra/newview/tests/llwlparammanager_test.cpp254
-rw-r--r--indra/newview/tests/llwlparamset_stub.cpp24
-rw-r--r--indra/viewer_components/login/lllogin.cpp2
-rw-r--r--indra/win_crash_logger/llcrashloggerwindows.cpp7
-rw-r--r--indra/win_crash_logger/llcrashloggerwindows.h1
-rw-r--r--indra/win_crash_logger/win_crash_logger.cpp35
1765 files changed, 78048 insertions, 25962 deletions
diff --git a/indra/cmake/00-Common.cmake b/indra/cmake/00-Common.cmake
index 2c974fb4ff..0266239454 100644
--- a/indra/cmake/00-Common.cmake
+++ b/indra/cmake/00-Common.cmake
@@ -171,7 +171,10 @@ if (LINUX)
add_definitions(-fvisibility=hidden)
# don't catch SIGCHLD in our base application class for the viewer - some of our 3rd party libs may need their *own* SIGCHLD handler to work. Sigh! The viewer doesn't need to catch SIGCHLD anyway.
add_definitions(-DLL_IGNORE_SIGCHLD)
- add_definitions(-march=pentium4 -mfpmath=sse)
+ if (WORD_SIZE EQUAL 32)
+ add_definitions(-march=pentium4)
+ endif (WORD_SIZE EQUAL 32)
+ add_definitions(-mfpmath=sse)
#add_definitions(-ftree-vectorize) # THIS CRASHES GCC 3.1-3.2
if (NOT STANDALONE)
# this stops us requiring a really recent glibc at runtime
diff --git a/indra/cmake/FMOD.cmake b/indra/cmake/FMOD.cmake
index cb5124812d..cb5124812d 100755..100644
--- a/indra/cmake/FMOD.cmake
+++ b/indra/cmake/FMOD.cmake
diff --git a/indra/cmake/Variables.cmake b/indra/cmake/Variables.cmake
index cfccd29def..4cbf7aa043 100644
--- a/indra/cmake/Variables.cmake
+++ b/indra/cmake/Variables.cmake
@@ -102,7 +102,7 @@ if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
# To support a different SDK update these Xcode settings:
set(CMAKE_OSX_DEPLOYMENT_TARGET 10.5)
set(CMAKE_OSX_SYSROOT /Developer/SDKs/MacOSX10.5.sdk)
- set(CMAKE_XCODE_ATTRIBUTE_GCC_VERSION "4.2")
+ set(CMAKE_XCODE_ATTRIBUTE_GCC_VERSION "4.0")
set(CMAKE_XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT dwarf-with-dsym)
# NOTE: To attempt an i386/PPC Universal build, add this on the configure line:
diff --git a/indra/cmake/run_build_test.py b/indra/cmake/run_build_test.py
index 320a9be8ab..ce2d1e0386 100755..100644
--- a/indra/cmake/run_build_test.py
+++ b/indra/cmake/run_build_test.py
@@ -109,6 +109,8 @@ def main(command, libpath=[], vars={}):
os.environ.update(dict([(str(key), str(value)) for key, value in vars.iteritems()]))
# Run the child process.
print "Running: %s" % " ".join(command)
+ # Make sure we see all relevant output *before* child-process output.
+ sys.stdout.flush()
return subprocess.call(command)
if __name__ == "__main__":
diff --git a/indra/integration_tests/llui_libtest/llwidgetreg.cpp b/indra/integration_tests/llui_libtest/llwidgetreg.cpp
index 0d0d9fbff6..cbf6021119 100644
--- a/indra/integration_tests/llui_libtest/llwidgetreg.cpp
+++ b/indra/integration_tests/llui_libtest/llwidgetreg.cpp
@@ -49,6 +49,7 @@
#include "lltabcontainer.h"
#include "lltextbox.h"
#include "lltexteditor.h"
+#include "lltimectrl.h"
#include "llflyoutbutton.h"
#include "llfiltereditor.h"
#include "lllayoutstack.h"
@@ -92,6 +93,7 @@ void LLWidgetReg::initClass(bool register_widgets)
//LLDefaultChildRegistry::Register<LLPlaceHolderPanel> placeholder("placeholder");
LLDefaultChildRegistry::Register<LLTabContainer> tab_container("tab_container");
LLDefaultChildRegistry::Register<LLTextBox> text("text");
+ LLDefaultChildRegistry::Register<LLTimeCtrl> time("time");
LLDefaultChildRegistry::Register<LLTextEditor> simple_text_editor("simple_text_editor");
LLDefaultChildRegistry::Register<LLUICtrl> ui_ctrl("ui_ctrl");
LLDefaultChildRegistry::Register<LLStatView> stat_view("stat_view");
diff --git a/indra/linux_crash_logger/linux_crash_logger.cpp b/indra/linux_crash_logger/linux_crash_logger.cpp
index 8beae555fb..99d0ad7e14 100644
--- a/indra/linux_crash_logger/linux_crash_logger.cpp
+++ b/indra/linux_crash_logger/linux_crash_logger.cpp
@@ -24,16 +24,24 @@
* $/LicenseInfo$
*/
+#include "linden_common.h"
#include "llcrashloggerlinux.h"
int main(int argc, char **argv)
{
+ llinfos << "Starting crash reporter." << llendl;
+
LLCrashLoggerLinux app;
app.parseCommandOptions(argc, argv);
- app.init();
+
+ if (! app.init())
+ {
+ llwarns << "Unable to initialize application." << llendl;
+ return 1;
+ }
+
app.mainLoop();
app.cleanup();
+ llinfos << "Crash reporter finished normally." << llendl;
return 0;
}
-
-
diff --git a/indra/linux_crash_logger/llcrashloggerlinux.cpp b/indra/linux_crash_logger/llcrashloggerlinux.cpp
index 7449c6426f..7316717193 100644
--- a/indra/linux_crash_logger/llcrashloggerlinux.cpp
+++ b/indra/linux_crash_logger/llcrashloggerlinux.cpp
@@ -30,8 +30,6 @@
#include "linden_common.h"
-#include "boost/tokenizer.hpp"
-
#include "indra_constants.h" // CRASH_BEHAVIOR_ASK, CRASH_SETTING_NAME
#include "llerror.h"
#include "llfile.h"
diff --git a/indra/llcharacter/llcharacter.cpp b/indra/llcharacter/llcharacter.cpp
index 5f84be2c5d..c9fb8534f1 100644
--- a/indra/llcharacter/llcharacter.cpp
+++ b/indra/llcharacter/llcharacter.cpp
@@ -38,7 +38,7 @@
LLStringTable LLCharacter::sVisualParamNames(1024);
std::vector< LLCharacter* > LLCharacter::sInstances;
-
+BOOL LLCharacter::sAllowInstancesChange = TRUE ;
//-----------------------------------------------------------------------------
// LLCharacter()
@@ -51,8 +51,10 @@ LLCharacter::LLCharacter()
mAppearanceSerialNum( 0 ),
mSkeletonSerialNum( 0 )
{
- mMotionController.setCharacter( this );
+ llassert_always(sAllowInstancesChange) ;
sInstances.push_back(this);
+
+ mMotionController.setCharacter( this );
mPauseRequest = new LLPauseRequestHandle();
}
@@ -62,18 +64,29 @@ LLCharacter::LLCharacter()
// Class Destructor
//-----------------------------------------------------------------------------
LLCharacter::~LLCharacter()
-{
+{
for (LLVisualParam *param = getFirstVisualParam();
param;
param = getNextVisualParam())
{
delete param;
}
- std::vector<LLCharacter*>::iterator iter = std::find(sInstances.begin(), sInstances.end(), this);
- if (iter != sInstances.end())
+
+ U32 i ;
+ U32 size = sInstances.size() ;
+ for(i = 0 ; i < size ; i++)
{
- sInstances.erase(iter);
+ if(sInstances[i] == this)
+ {
+ break ;
+ }
}
+
+ llassert_always(i < size) ;
+
+ llassert_always(sAllowInstancesChange) ;
+ sInstances[i] = sInstances[size - 1] ;
+ sInstances.pop_back() ;
}
diff --git a/indra/llcharacter/llcharacter.h b/indra/llcharacter/llcharacter.h
index a6347fcc3c..e81a27c2bc 100644
--- a/indra/llcharacter/llcharacter.h
+++ b/indra/llcharacter/llcharacter.h
@@ -266,6 +266,7 @@ public:
void setSkeletonSerialNum( U32 num ) { mSkeletonSerialNum = num; }
static std::vector< LLCharacter* > sInstances;
+ static BOOL sAllowInstancesChange ; //debug use
protected:
LLMotionController mMotionController;
diff --git a/indra/llcharacter/llkeyframemotion.cpp b/indra/llcharacter/llkeyframemotion.cpp
index 9df033a4ca..c6f45bffa2 100644
--- a/indra/llcharacter/llkeyframemotion.cpp
+++ b/indra/llcharacter/llkeyframemotion.cpp
@@ -467,13 +467,15 @@ LLPointer<LLJointState>& LLKeyframeMotion::getJointState(U32 index)
}
//-----------------------------------------------------------------------------
-// getJoin()
+// getJoint()
//-----------------------------------------------------------------------------
LLJoint* LLKeyframeMotion::getJoint(U32 index)
{
llassert_always (index < mJointStates.size());
LLJoint* joint = mJointStates[index]->getJoint();
- llassert_always (joint);
+
+ //Commented out 06-28-11 by Aura.
+ //llassert_always (joint);
return joint;
}
@@ -821,7 +823,11 @@ void LLKeyframeMotion::initializeConstraint(JointConstraint* constraint)
S32 joint_num;
LLVector3 source_pos = mCharacter->getVolumePos(shared_data->mSourceConstraintVolume, shared_data->mSourceConstraintOffset);
LLJoint* cur_joint = getJoint(shared_data->mJointStateIndices[0]);
-
+ if ( !cur_joint )
+ {
+ return;
+ }
+
F32 source_pos_offset = dist_vec(source_pos, cur_joint->getWorldPosition());
constraint->mTotalLength = constraint->mJointLengths[0] = dist_vec(cur_joint->getParent()->getWorldPosition(), source_pos);
@@ -872,6 +878,10 @@ void LLKeyframeMotion::activateConstraint(JointConstraint* constraint)
for (joint_num = 1; joint_num < shared_data->mChainLength; joint_num++)
{
LLJoint* cur_joint = getJoint(shared_data->mJointStateIndices[joint_num]);
+ if ( !cur_joint )
+ {
+ return;
+ }
constraint->mPositions[joint_num] = (cur_joint->getWorldPosition() - mPelvisp->getWorldPosition()) * ~mPelvisp->getWorldRotation();
}
@@ -932,6 +942,11 @@ void LLKeyframeMotion::applyConstraint(JointConstraint* constraint, F32 time, U8
}
LLJoint* root_joint = getJoint(shared_data->mJointStateIndices[shared_data->mChainLength]);
+ if (! root_joint)
+ {
+ return;
+ }
+
LLVector3 root_pos = root_joint->getWorldPosition();
// LLQuaternion root_rot =
root_joint->getParent()->getWorldRotation();
@@ -943,6 +958,11 @@ void LLKeyframeMotion::applyConstraint(JointConstraint* constraint, F32 time, U8
for (joint_num = 0; joint_num <= shared_data->mChainLength; joint_num++)
{
LLJoint* cur_joint = getJoint(shared_data->mJointStateIndices[joint_num]);
+ if (!cur_joint)
+ {
+ return;
+ }
+
if (joint_mask[cur_joint->getJointNum()] >= (0xff >> (7 - getPriority())))
{
// skip constraint
@@ -1033,7 +1053,14 @@ void LLKeyframeMotion::applyConstraint(JointConstraint* constraint, F32 time, U8
if (shared_data->mChainLength)
{
- LLQuaternion end_rot = getJoint(shared_data->mJointStateIndices[0])->getWorldRotation();
+ LLJoint* end_joint = getJoint(shared_data->mJointStateIndices[0]);
+
+ if (!end_joint)
+ {
+ return;
+ }
+
+ LLQuaternion end_rot = end_joint->getWorldRotation();
// slam start and end of chain to the proper positions (rest of chain stays put)
positions[0] = lerp(keyframe_source_pos, target_pos, weight);
@@ -1042,7 +1069,14 @@ void LLKeyframeMotion::applyConstraint(JointConstraint* constraint, F32 time, U8
// grab keyframe-specified positions of joints
for (joint_num = 1; joint_num < shared_data->mChainLength; joint_num++)
{
- LLVector3 kinematic_position = getJoint(shared_data->mJointStateIndices[joint_num])->getWorldPosition() +
+ LLJoint* cur_joint = getJoint(shared_data->mJointStateIndices[joint_num]);
+
+ if (!cur_joint)
+ {
+ return;
+ }
+
+ LLVector3 kinematic_position = cur_joint->getWorldPosition() +
(source_to_target * constraint->mJointLengthFractions[joint_num]);
// convert intermediate joint positions to world coordinates
@@ -1088,7 +1122,17 @@ void LLKeyframeMotion::applyConstraint(JointConstraint* constraint, F32 time, U8
for (joint_num = shared_data->mChainLength; joint_num > 0; joint_num--)
{
LLJoint* cur_joint = getJoint(shared_data->mJointStateIndices[joint_num]);
+
+ if (!cur_joint)
+ {
+ return;
+ }
LLJoint* child_joint = getJoint(shared_data->mJointStateIndices[joint_num - 1]);
+ if (!child_joint)
+ {
+ return;
+ }
+
LLQuaternion parent_rot = cur_joint->getParent()->getWorldRotation();
LLQuaternion cur_rot = cur_joint->getWorldRotation();
@@ -1122,7 +1166,6 @@ void LLKeyframeMotion::applyConstraint(JointConstraint* constraint, F32 time, U8
cur_joint->setRotation(target_rot);
}
- LLJoint* end_joint = getJoint(shared_data->mJointStateIndices[0]);
LLQuaternion end_local_rot = end_rot * ~end_joint->getParent()->getWorldRotation();
if (weight == 1.f)
@@ -1150,7 +1193,13 @@ void LLKeyframeMotion::applyConstraint(JointConstraint* constraint, F32 time, U8
//reset old joint rots
for (joint_num = 0; joint_num <= shared_data->mChainLength; joint_num++)
{
- getJoint(shared_data->mJointStateIndices[joint_num])->setRotation(old_rots[joint_num]);
+ LLJoint* cur_joint = getJoint(shared_data->mJointStateIndices[joint_num]);
+ if (!cur_joint)
+ {
+ return;
+ }
+
+ cur_joint->setRotation(old_rots[joint_num]);
}
}
// simple positional constraint (pelvis only)
@@ -1775,7 +1824,15 @@ BOOL LLKeyframeMotion::deserialize(LLDataPacker& dp)
constraintp->mJointStateIndices[i] = -1;
for (U32 j = 0; j < mJointMotionList->getNumJointMotions(); j++)
{
- if(getJoint(j) == joint)
+ LLJoint* constraint_joint = getJoint(j);
+
+ if ( !constraint_joint )
+ {
+ llwarns << "Invalid joint " << j << llendl;
+ return FALSE;
+ }
+
+ if(constraint_joint == joint)
{
constraintp->mJointStateIndices[i] = (S32)j;
break;
diff --git a/indra/llcharacter/llkeyframemotion.h b/indra/llcharacter/llkeyframemotion.h
index 1fe9af40b3..b1422b2b90 100644
--- a/indra/llcharacter/llkeyframemotion.h
+++ b/indra/llcharacter/llkeyframemotion.h
@@ -70,7 +70,7 @@ public:
private:
// private helper functions to wrap some asserts
LLPointer<LLJointState>& getJointState(U32 index);
- LLJoint* getJoint(U32 index);
+ LLJoint* getJoint(U32 index );
public:
//-------------------------------------------------------------------------
diff --git a/indra/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt
index 80df91a5c1..9910281b64 100644
--- a/indra/llcommon/CMakeLists.txt
+++ b/indra/llcommon/CMakeLists.txt
@@ -115,6 +115,7 @@ set(llcommon_HEADER_FILES
indra_constants.h
linden_common.h
linked_lists.h
+ llaccountingquota.h
llallocator.h
llallocator_heap_profile.h
llagentconstants.h
diff --git a/indra/llcommon/indra_constants.h b/indra/llcommon/indra_constants.h
index d0f287657e..0745696ef3 100644
--- a/indra/llcommon/indra_constants.h
+++ b/indra/llcommon/indra_constants.h
@@ -387,8 +387,6 @@ const S32 MAP_SIM_RETURN_NULL_SIMS = 0x00010000;
const S32 MAP_SIM_PRELUDE = 0x00020000;
// Crash reporter behavior
-const char* const CRASH_SETTINGS_FILE = "settings_crash_behavior.xml";
-const char* const CRASH_BEHAVIOR_SETTING = "CrashSubmitBehavior";
const S32 CRASH_BEHAVIOR_ASK = 0;
const S32 CRASH_BEHAVIOR_ALWAYS_SEND = 1;
const S32 CRASH_BEHAVIOR_NEVER_SEND = 2;
diff --git a/indra/llcommon/llaccountingquota.h b/indra/llcommon/llaccountingquota.h
new file mode 100644
index 0000000000..140333de07
--- /dev/null
+++ b/indra/llcommon/llaccountingquota.h
@@ -0,0 +1,80 @@
+/**
+ * @file llaccountingquota.h
+ * @
+ *
+ * $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_ACCOUNTINGQUOTA_H
+#define LL_ACCOUNTINGQUOTA_H
+
+struct ParcelQuota
+{
+ ParcelQuota( F32 ownerRenderCost, F32 ownerPhysicsCost, F32 ownerNetworkCost, F32 ownerSimulationCost,
+ F32 groupRenderCost, F32 groupPhysicsCost, F32 groupNetworkCost, F32 groupSimulationCost,
+ F32 otherRenderCost, F32 otherPhysicsCost, F32 otherNetworkCost, F32 otherSimulationCost,
+ F32 tempRenderCost, F32 tempPhysicsCost, F32 tempNetworkCost, F32 tempSimulationCost,
+ F32 selectedRenderCost, F32 selectedPhysicsCost, F32 selectedNetworkCost, F32 selectedSimulationCost,
+ F32 parcelCapacity )
+ : mOwnerRenderCost( ownerRenderCost ), mOwnerPhysicsCost( ownerPhysicsCost )
+ , mOwnerNetworkCost( ownerNetworkCost ), mOwnerSimulationCost( ownerSimulationCost )
+ , mGroupRenderCost( groupRenderCost ), mGroupPhysicsCost( groupPhysicsCost )
+ , mGroupNetworkCost( groupNetworkCost ), mGroupSimulationCost( groupSimulationCost )
+ , mOtherRenderCost( otherRenderCost ), mOtherPhysicsCost( otherPhysicsCost )
+ , mOtherNetworkCost( otherNetworkCost ), mOtherSimulationCost( otherSimulationCost )
+ , mTempRenderCost( tempRenderCost ), mTempPhysicsCost( tempPhysicsCost )
+ , mTempNetworkCost( tempNetworkCost ), mTempSimulationCost( tempSimulationCost )
+ , mSelectedRenderCost( tempRenderCost ), mSelectedPhysicsCost( tempPhysicsCost )
+ , mSelectedNetworkCost( tempNetworkCost ), mSelectedSimulationCost( selectedSimulationCost )
+ , mParcelCapacity( parcelCapacity )
+ {
+ }
+
+ ParcelQuota(){}
+ F32 mOwnerRenderCost, mOwnerPhysicsCost, mOwnerNetworkCost, mOwnerSimulationCost;
+ F32 mGroupRenderCost, mGroupPhysicsCost, mGroupNetworkCost, mGroupSimulationCost;
+ F32 mOtherRenderCost, mOtherPhysicsCost, mOtherNetworkCost, mOtherSimulationCost;
+ F32 mTempRenderCost, mTempPhysicsCost, mTempNetworkCost, mTempSimulationCost;
+ F32 mSelectedRenderCost, mSelectedPhysicsCost, mSelectedNetworkCost, mSelectedSimulationCost;
+ F32 mParcelCapacity;
+};
+
+struct SelectionQuota
+{
+ SelectionQuota( LLUUID localId, F32 renderCost, F32 physicsCost, F32 networkCost, F32 simulationCost )
+ : mLocalId( localId)
+ , mRenderCost( renderCost )
+ , mPhysicsCost( physicsCost )
+ , mNetworkCost( networkCost )
+ , mSimulationCost( simulationCost )
+ {
+ }
+ SelectionQuota() {}
+
+ F32 mRenderCost, mPhysicsCost, mNetworkCost, mSimulationCost;
+ LLUUID mLocalId;
+};
+
+#endif
+
+
+
diff --git a/indra/llcommon/llchat.h b/indra/llcommon/llchat.h
index 87c2d6775b..f5b242fdfc 100644
--- a/indra/llcommon/llchat.h
+++ b/indra/llcommon/llchat.h
@@ -49,7 +49,8 @@ typedef enum e_chat_type
CHAT_TYPE_STOP = 5,
CHAT_TYPE_DEBUG_MSG = 6,
CHAT_TYPE_REGION = 7,
- CHAT_TYPE_OWNER = 8
+ CHAT_TYPE_OWNER = 8,
+ CHAT_TYPE_DIRECT = 9 // From llRegionSayTo()
} EChatType;
typedef enum e_chat_audible_level
diff --git a/indra/llcommon/llfoldertype.cpp b/indra/llcommon/llfoldertype.cpp
index c2cfb7286e..f6d0f5bce8 100644
--- a/indra/llcommon/llfoldertype.cpp
+++ b/indra/llcommon/llfoldertype.cpp
@@ -93,6 +93,8 @@ LLFolderDictionary::LLFolderDictionary()
addEntry(LLFolderType::FT_MESH, new FolderEntry("mesh", TRUE));
addEntry(LLFolderType::FT_INBOX, new FolderEntry("inbox", TRUE));
+ addEntry(LLFolderType::FT_OUTBOX, new FolderEntry("outbox", TRUE));
+ addEntry(LLFolderType::FT_BASIC_ROOT, new FolderEntry("basic_rt", TRUE));
addEntry(LLFolderType::FT_NONE, new FolderEntry("-1", FALSE));
};
diff --git a/indra/llcommon/llfoldertype.h b/indra/llcommon/llfoldertype.h
index cb32cb075b..a0c847914f 100644
--- a/indra/llcommon/llfoldertype.h
+++ b/indra/llcommon/llfoldertype.h
@@ -83,8 +83,11 @@ public:
FT_MESH = 49,
FT_INBOX = 50,
+ FT_OUTBOX = 51,
- FT_COUNT = 51,
+ FT_BASIC_ROOT = 52,
+
+ FT_COUNT,
FT_NONE = -1
};
diff --git a/indra/llcommon/llsdserialize.cpp b/indra/llcommon/llsdserialize.cpp
index 5be5ecc492..bf62600514 100644
--- a/indra/llcommon/llsdserialize.cpp
+++ b/indra/llcommon/llsdserialize.cpp
@@ -2036,7 +2036,9 @@ std::string zip_llsd(LLSD& data)
{ //copy result into output
if (strm.avail_out >= CHUNK)
{
- llerrs << "WTF?" << llendl;
+ free(output);
+ llwarns << "Failed to compress LLSD block." << llendl;
+ return std::string();
}
have = CHUNK-strm.avail_out;
diff --git a/indra/llcommon/llstat.cpp b/indra/llcommon/llstat.cpp
index 8ba97d7730..b2c495d093 100644
--- a/indra/llcommon/llstat.cpp
+++ b/indra/llcommon/llstat.cpp
@@ -737,7 +737,7 @@ void LLPerfBlock::addStatsToLLSDandReset( LLSD & stats,
}
}
else
- { // WTF? Shouldn't have a NULL pointer in the map.
+ { // Shouldn't have a NULL pointer in the map.
llwarns << "Unexpected NULL dynamic stat at '" << stats_full_path << "'" << llendl;
}
}
diff --git a/indra/llcommon/llsys.cpp b/indra/llcommon/llsys.cpp
index ca2d3f9181..99e61433c6 100644
--- a/indra/llcommon/llsys.cpp
+++ b/indra/llcommon/llsys.cpp
@@ -1,6 +1,6 @@
/**
* @file llsys.cpp
- * @brief Impelementation of the basic system query functions.
+ * @brief Implementation of the basic system query functions.
*
* $LicenseInfo:firstyear=2002&license=viewerlgpl$
* Second Life Viewer Source Code
@@ -24,6 +24,10 @@
* $/LicenseInfo$
*/
+#if LL_WINDOWS
+#pragma warning (disable : 4355) // 'this' used in initializer list: yes, intentionally
+#endif
+
#include "linden_common.h"
#include "llsys.h"
@@ -36,22 +40,43 @@
#endif
#include "llprocessor.h"
+#include "llerrorcontrol.h"
+#include "llevents.h"
+#include "lltimer.h"
+#include "llsdserialize.h"
+#include "llsdutil.h"
+#include <boost/bind.hpp>
+#include <boost/circular_buffer.hpp>
+#include <boost/regex.hpp>
+#include <boost/foreach.hpp>
+#include <boost/lexical_cast.hpp>
+#include <boost/range.hpp>
+#include <boost/utility/enable_if.hpp>
+#include <boost/type_traits/is_integral.hpp>
+#include <boost/type_traits/is_float.hpp>
+
+using namespace llsd;
#if LL_WINDOWS
# define WIN32_LEAN_AND_MEAN
# include <winsock2.h>
# include <windows.h>
+# include <psapi.h> // GetPerformanceInfo() et al.
#elif LL_DARWIN
# include <errno.h>
# include <sys/sysctl.h>
# include <sys/utsname.h>
# include <stdint.h>
# include <Carbon/Carbon.h>
+# include <sys/wait.h>
+# include <string.h>
+# include <stdexcept>
#elif LL_LINUX
# include <errno.h>
# include <sys/utsname.h>
# include <unistd.h>
# include <sys/sysinfo.h>
+# include <stdexcept>
const char MEMINFO_FILE[] = "/proc/meminfo";
#elif LL_SOLARIS
# include <stdio.h>
@@ -70,6 +95,15 @@ extern int errno;
static const S32 CPUINFO_BUFFER_SIZE = 16383;
LLCPUInfo gSysCPU;
+// Don't log memory info any more often than this. It also serves as our
+// framerate sample size.
+static const F32 MEM_INFO_THROTTLE = 20;
+// Sliding window of samples. We intentionally limit the length of time we
+// remember "the slowest" framerate because framerate is very slow at login.
+// If we only triggered FrameWatcher logging when the session framerate
+// dropped below the login framerate, we'd have very little additional data.
+static const F32 MEM_INFO_WINDOW = 10*60;
+
#if LL_WINDOWS
#ifndef DLLVERSIONINFO
typedef struct _DllVersionInfo
@@ -188,22 +222,30 @@ LLOSInfo::LLOSInfo() :
if(osvi.wProductType == VER_NT_WORKSTATION)
mOSStringSimple = "Microsoft Windows XP x64 Edition ";
else
- mOSStringSimple = "Microsoft Windows Server 2003 ";
+ mOSStringSimple = "Microsoft Windows Server 2003 ";
}
- else if(osvi.dwMajorVersion == 6 && osvi.dwMinorVersion <= 1)
+ else if(osvi.dwMajorVersion == 6 && osvi.dwMinorVersion <= 2)
{
if(osvi.dwMinorVersion == 0)
{
- mOSStringSimple = "Microsoft Windows Vista ";
+ if(osvi.wProductType == VER_NT_WORKSTATION)
+ mOSStringSimple = "Microsoft Windows Vista ";
+ else
+ mOSStringSimple = "Windows Server 2008 ";
}
else if(osvi.dwMinorVersion == 1)
{
- mOSStringSimple = "Microsoft Windows 7 ";
+ if(osvi.wProductType == VER_NT_WORKSTATION)
+ mOSStringSimple = "Microsoft Windows 7 ";
+ else
+ mOSStringSimple = "Windows Server 2008 R2 ";
}
-
- if(osvi.wProductType != VER_NT_WORKSTATION)
+ else if(osvi.dwMinorVersion == 2)
{
- mOSStringSimple += "Server ";
+ if(osvi.wProductType == VER_NT_WORKSTATION)
+ mOSStringSimple = "Microsoft Windows 8 ";
+ else
+ mOSStringSimple = "Windows Server 2012 ";
}
///get native system info if available..
@@ -308,8 +350,7 @@ LLOSInfo::LLOSInfo() :
std::string compatibility_mode;
if(got_shell32_version)
{
- if(osvi.dwMajorVersion != shell32_major
- || osvi.dwMinorVersion != shell32_minor)
+ if(osvi.dwMajorVersion != shell32_major || osvi.dwMinorVersion != shell32_minor)
{
compatibility_mode = llformat(" compatibility mode. real ver: %d.%d (Build %d)",
shell32_major,
@@ -606,8 +647,78 @@ void LLCPUInfo::stream(std::ostream& s) const
s << "->mCPUString: " << mCPUString << std::endl;
}
+// Helper class for LLMemoryInfo: accumulate stats in the form we store for
+// LLMemoryInfo::getStatsMap().
+class Stats
+{
+public:
+ Stats():
+ mStats(LLSD::emptyMap())
+ {}
+
+ // Store every integer type as LLSD::Integer.
+ template <class T>
+ void add(const LLSD::String& name, const T& value,
+ typename boost::enable_if<boost::is_integral<T> >::type* = 0)
+ {
+ mStats[name] = LLSD::Integer(value);
+ }
+
+ // Store every floating-point type as LLSD::Real.
+ template <class T>
+ void add(const LLSD::String& name, const T& value,
+ typename boost::enable_if<boost::is_float<T> >::type* = 0)
+ {
+ mStats[name] = LLSD::Real(value);
+ }
+
+ // Hope that LLSD::Date values are sufficiently unambiguous.
+ void add(const LLSD::String& name, const LLSD::Date& value)
+ {
+ mStats[name] = value;
+ }
+
+ LLSD get() const { return mStats; }
+
+private:
+ LLSD mStats;
+};
+
+// Wrap boost::regex_match() with a function that doesn't throw.
+template <typename S, typename M, typename R>
+static bool regex_match_no_exc(const S& string, M& match, const R& regex)
+{
+ try
+ {
+ return boost::regex_match(string, match, regex);
+ }
+ catch (const std::runtime_error& e)
+ {
+ LL_WARNS("LLMemoryInfo") << "error matching with '" << regex.str() << "': "
+ << e.what() << ":\n'" << string << "'" << LL_ENDL;
+ return false;
+ }
+}
+
+// Wrap boost::regex_search() with a function that doesn't throw.
+template <typename S, typename M, typename R>
+static bool regex_search_no_exc(const S& string, M& match, const R& regex)
+{
+ try
+ {
+ return boost::regex_search(string, match, regex);
+ }
+ catch (const std::runtime_error& e)
+ {
+ LL_WARNS("LLMemoryInfo") << "error searching with '" << regex.str() << "': "
+ << e.what() << ":\n'" << string << "'" << LL_ENDL;
+ return false;
+ }
+}
+
LLMemoryInfo::LLMemoryInfo()
{
+ refresh();
}
#if LL_WINDOWS
@@ -631,11 +742,7 @@ static U32 LLMemoryAdjustKBResult(U32 inKB)
U32 LLMemoryInfo::getPhysicalMemoryKB() const
{
#if LL_WINDOWS
- MEMORYSTATUSEX state;
- state.dwLength = sizeof(state);
- GlobalMemoryStatusEx(&state);
-
- return LLMemoryAdjustKBResult((U32)(state.ullTotalPhys >> 10));
+ return LLMemoryAdjustKBResult(mStatsMap["Total Physical KB"].asInteger());
#elif LL_DARWIN
// This might work on Linux as well. Someone check...
@@ -683,12 +790,82 @@ U32 LLMemoryInfo::getPhysicalMemoryClamped() const
void LLMemoryInfo::getAvailableMemoryKB(U32& avail_physical_mem_kb, U32& avail_virtual_mem_kb)
{
#if LL_WINDOWS
- MEMORYSTATUSEX state;
- state.dwLength = sizeof(state);
- GlobalMemoryStatusEx(&state);
+ // Sigh, this shouldn't be a static method, then we wouldn't have to
+ // reload this data separately from refresh()
+ LLSD statsMap(loadStatsMap());
- avail_physical_mem_kb = (U32)(state.ullAvailPhys/1024) ;
- avail_virtual_mem_kb = (U32)(state.ullAvailVirtual/1024) ;
+ avail_physical_mem_kb = statsMap["Avail Physical KB"].asInteger();
+ avail_virtual_mem_kb = statsMap["Avail Virtual KB"].asInteger();
+
+#elif LL_DARWIN
+ // mStatsMap is derived from vm_stat, look for (e.g.) "kb free":
+ // $ vm_stat
+ // Mach Virtual Memory Statistics: (page size of 4096 bytes)
+ // Pages free: 462078.
+ // Pages active: 142010.
+ // Pages inactive: 220007.
+ // Pages wired down: 159552.
+ // "Translation faults": 220825184.
+ // Pages copy-on-write: 2104153.
+ // Pages zero filled: 167034876.
+ // Pages reactivated: 65153.
+ // Pageins: 2097212.
+ // Pageouts: 41759.
+ // Object cache: 841598 hits of 7629869 lookups (11% hit rate)
+ avail_physical_mem_kb = -1 ;
+ avail_virtual_mem_kb = -1 ;
+
+#elif LL_LINUX
+ // mStatsMap is derived from MEMINFO_FILE:
+ // $ cat /proc/meminfo
+ // MemTotal: 4108424 kB
+ // MemFree: 1244064 kB
+ // Buffers: 85164 kB
+ // Cached: 1990264 kB
+ // SwapCached: 0 kB
+ // Active: 1176648 kB
+ // Inactive: 1427532 kB
+ // Active(anon): 529152 kB
+ // Inactive(anon): 15924 kB
+ // Active(file): 647496 kB
+ // Inactive(file): 1411608 kB
+ // Unevictable: 16 kB
+ // Mlocked: 16 kB
+ // HighTotal: 3266316 kB
+ // HighFree: 721308 kB
+ // LowTotal: 842108 kB
+ // LowFree: 522756 kB
+ // SwapTotal: 6384632 kB
+ // SwapFree: 6384632 kB
+ // Dirty: 28 kB
+ // Writeback: 0 kB
+ // AnonPages: 528820 kB
+ // Mapped: 89472 kB
+ // Shmem: 16324 kB
+ // Slab: 159624 kB
+ // SReclaimable: 145168 kB
+ // SUnreclaim: 14456 kB
+ // KernelStack: 2560 kB
+ // PageTables: 5560 kB
+ // NFS_Unstable: 0 kB
+ // Bounce: 0 kB
+ // WritebackTmp: 0 kB
+ // CommitLimit: 8438844 kB
+ // Committed_AS: 1271596 kB
+ // VmallocTotal: 122880 kB
+ // VmallocUsed: 65252 kB
+ // VmallocChunk: 52356 kB
+ // HardwareCorrupted: 0 kB
+ // HugePages_Total: 0
+ // HugePages_Free: 0
+ // HugePages_Rsvd: 0
+ // HugePages_Surp: 0
+ // Hugepagesize: 2048 kB
+ // DirectMap4k: 434168 kB
+ // DirectMap2M: 477184 kB
+ // (could also run 'free', but easier to read a file than run a program)
+ avail_physical_mem_kb = -1 ;
+ avail_virtual_mem_kb = -1 ;
#else
//do not know how to collect available memory info for other systems.
@@ -701,56 +878,389 @@ void LLMemoryInfo::getAvailableMemoryKB(U32& avail_physical_mem_kb, U32& avail_v
void LLMemoryInfo::stream(std::ostream& s) const
{
+ // We want these memory stats to be easy to grep from the log, along with
+ // the timestamp. So preface each line with the timestamp and a
+ // distinctive marker. Without that, we'd have to search the log for the
+ // introducer line, then read subsequent lines, etc...
+ std::string pfx(LLError::utcTime() + " <mem> ");
+
+ // Max key length
+ size_t key_width(0);
+ BOOST_FOREACH(const MapEntry& pair, inMap(mStatsMap))
+ {
+ size_t len(pair.first.length());
+ if (len > key_width)
+ {
+ key_width = len;
+ }
+ }
+
+ // Now stream stats
+ BOOST_FOREACH(const MapEntry& pair, inMap(mStatsMap))
+ {
+ s << pfx << std::setw(key_width+1) << (pair.first + ':') << ' ';
+ LLSD value(pair.second);
+ if (value.isInteger())
+ s << std::setw(12) << value.asInteger();
+ else if (value.isReal())
+ s << std::fixed << std::setprecision(1) << value.asReal();
+ else if (value.isDate())
+ value.asDate().toStream(s);
+ else
+ s << value; // just use default LLSD formatting
+ s << std::endl;
+ }
+}
+
+LLSD LLMemoryInfo::getStatsMap() const
+{
+ return mStatsMap;
+}
+
+LLMemoryInfo& LLMemoryInfo::refresh()
+{
+ mStatsMap = loadStatsMap();
+
+ LL_DEBUGS("LLMemoryInfo") << "Populated mStatsMap:\n";
+ LLSDSerialize::toPrettyXML(mStatsMap, LL_CONT);
+ LL_ENDL;
+
+ return *this;
+}
+
+LLSD LLMemoryInfo::loadStatsMap()
+{
+ // This implementation is derived from stream() code (as of 2011-06-29).
+ Stats stats;
+
+ // associate timestamp for analysis over time
+ stats.add("timestamp", LLDate::now());
+
#if LL_WINDOWS
MEMORYSTATUSEX state;
state.dwLength = sizeof(state);
GlobalMemoryStatusEx(&state);
- s << "Percent Memory use: " << (U32)state.dwMemoryLoad << '%' << std::endl;
- s << "Total Physical KB: " << (U32)(state.ullTotalPhys/1024) << std::endl;
- s << "Avail Physical KB: " << (U32)(state.ullAvailPhys/1024) << std::endl;
- s << "Total page KB: " << (U32)(state.ullTotalPageFile/1024) << std::endl;
- s << "Avail page KB: " << (U32)(state.ullAvailPageFile/1024) << std::endl;
- s << "Total Virtual KB: " << (U32)(state.ullTotalVirtual/1024) << std::endl;
- s << "Avail Virtual KB: " << (U32)(state.ullAvailVirtual/1024) << std::endl;
+ stats.add("Percent Memory use", state.dwMemoryLoad);
+ stats.add("Total Physical KB", state.ullTotalPhys/1024);
+ stats.add("Avail Physical KB", state.ullAvailPhys/1024);
+ stats.add("Total page KB", state.ullTotalPageFile/1024);
+ stats.add("Avail page KB", state.ullAvailPageFile/1024);
+ stats.add("Total Virtual KB", state.ullTotalVirtual/1024);
+ stats.add("Avail Virtual KB", state.ullAvailVirtual/1024);
+
+ PERFORMANCE_INFORMATION perf;
+ perf.cb = sizeof(perf);
+ GetPerformanceInfo(&perf, sizeof(perf));
+
+ SIZE_T pagekb(perf.PageSize/1024);
+ stats.add("CommitTotal KB", perf.CommitTotal * pagekb);
+ stats.add("CommitLimit KB", perf.CommitLimit * pagekb);
+ stats.add("CommitPeak KB", perf.CommitPeak * pagekb);
+ stats.add("PhysicalTotal KB", perf.PhysicalTotal * pagekb);
+ stats.add("PhysicalAvail KB", perf.PhysicalAvailable * pagekb);
+ stats.add("SystemCache KB", perf.SystemCache * pagekb);
+ stats.add("KernelTotal KB", perf.KernelTotal * pagekb);
+ stats.add("KernelPaged KB", perf.KernelPaged * pagekb);
+ stats.add("KernelNonpaged KB", perf.KernelNonpaged * pagekb);
+ stats.add("PageSize KB", pagekb);
+ stats.add("HandleCount", perf.HandleCount);
+ stats.add("ProcessCount", perf.ProcessCount);
+ stats.add("ThreadCount", perf.ThreadCount);
+
+ PROCESS_MEMORY_COUNTERS_EX pmem;
+ pmem.cb = sizeof(pmem);
+ // GetProcessMemoryInfo() is documented to accept either
+ // PROCESS_MEMORY_COUNTERS* or PROCESS_MEMORY_COUNTERS_EX*, presumably
+ // using the redundant size info to distinguish. But its prototype
+ // specifically accepts PROCESS_MEMORY_COUNTERS*, and since this is a
+ // classic-C API, PROCESS_MEMORY_COUNTERS_EX isn't a subclass. Cast the
+ // pointer.
+ GetProcessMemoryInfo(GetCurrentProcess(), PPROCESS_MEMORY_COUNTERS(&pmem), sizeof(pmem));
+
+ stats.add("Page Fault Count", pmem.PageFaultCount);
+ stats.add("PeakWorkingSetSize KB", pmem.PeakWorkingSetSize/1024);
+ stats.add("WorkingSetSize KB", pmem.WorkingSetSize/1024);
+ stats.add("QutaPeakPagedPoolUsage KB", pmem.QuotaPeakPagedPoolUsage/1024);
+ stats.add("QuotaPagedPoolUsage KB", pmem.QuotaPagedPoolUsage/1024);
+ stats.add("QuotaPeakNonPagedPoolUsage KB", pmem.QuotaPeakNonPagedPoolUsage/1024);
+ stats.add("QuotaNonPagedPoolUsage KB", pmem.QuotaNonPagedPoolUsage/1024);
+ stats.add("PagefileUsage KB", pmem.PagefileUsage/1024);
+ stats.add("PeakPagefileUsage KB", pmem.PeakPagefileUsage/1024);
+ stats.add("PrivateUsage KB", pmem.PrivateUsage/1024);
+
#elif LL_DARWIN
uint64_t phys = 0;
size_t len = sizeof(phys);
- if(sysctlbyname("hw.memsize", &phys, &len, NULL, 0) == 0)
+ if (sysctlbyname("hw.memsize", &phys, &len, NULL, 0) == 0)
{
- s << "Total Physical KB: " << phys/1024 << std::endl;
+ stats.add("Total Physical KB", phys/1024);
}
else
{
- s << "Unable to collect memory information";
+ LL_WARNS("LLMemoryInfo") << "Unable to collect hw.memsize memory information" << LL_ENDL;
+ }
+
+ FILE* pout = popen("vm_stat 2>&1", "r");
+ if (! pout) // popen() couldn't run vm_stat
+ {
+ // Save errno right away.
+ int popen_errno(errno);
+ LL_WARNS("LLMemoryInfo") << "Unable to collect vm_stat memory information: ";
+ char buffer[256];
+ if (0 == strerror_r(popen_errno, buffer, sizeof(buffer)))
+ {
+ LL_CONT << buffer;
+ }
+ else
+ {
+ LL_CONT << "errno " << popen_errno;
+ }
+ LL_CONT << LL_ENDL;
+ }
+ else // popen() launched vm_stat
+ {
+ // Mach Virtual Memory Statistics: (page size of 4096 bytes)
+ // Pages free: 462078.
+ // Pages active: 142010.
+ // Pages inactive: 220007.
+ // Pages wired down: 159552.
+ // "Translation faults": 220825184.
+ // Pages copy-on-write: 2104153.
+ // Pages zero filled: 167034876.
+ // Pages reactivated: 65153.
+ // Pageins: 2097212.
+ // Pageouts: 41759.
+ // Object cache: 841598 hits of 7629869 lookups (11% hit rate)
+
+ // Intentionally don't pass the boost::no_except flag. These
+ // boost::regex objects are constructed with string literals, so they
+ // should be valid every time. If they become invalid, we WANT an
+ // exception, hopefully even before the dev checks in.
+ boost::regex pagesize_rx("\\(page size of ([0-9]+) bytes\\)");
+ boost::regex stat_rx("(.+): +([0-9]+)\\.");
+ boost::regex cache_rx("Object cache: ([0-9]+) hits of ([0-9]+) lookups "
+ "\\(([0-9]+)% hit rate\\)");
+ boost::cmatch matched;
+ LLSD::Integer pagesizekb(4096/1024);
+
+ // Here 'pout' is vm_stat's stdout. Search it for relevant data.
+ char line[100];
+ line[sizeof(line)-1] = '\0';
+ while (fgets(line, sizeof(line)-1, pout))
+ {
+ size_t linelen(strlen(line));
+ // Truncate any trailing newline
+ if (line[linelen - 1] == '\n')
+ {
+ line[--linelen] = '\0';
+ }
+ LL_DEBUGS("LLMemoryInfo") << line << LL_ENDL;
+ if (regex_search_no_exc(line, matched, pagesize_rx))
+ {
+ // "Mach Virtual Memory Statistics: (page size of 4096 bytes)"
+ std::string pagesize_str(matched[1].first, matched[1].second);
+ try
+ {
+ // Reasonable to assume that pagesize will always be a
+ // multiple of 1Kb?
+ pagesizekb = boost::lexical_cast<LLSD::Integer>(pagesize_str)/1024;
+ }
+ catch (const boost::bad_lexical_cast&)
+ {
+ LL_WARNS("LLMemoryInfo") << "couldn't parse '" << pagesize_str
+ << "' in vm_stat line: " << line << LL_ENDL;
+ continue;
+ }
+ stats.add("page size", pagesizekb);
+ }
+ else if (regex_match_no_exc(line, matched, stat_rx))
+ {
+ // e.g. "Pages free: 462078."
+ // Strip double-quotes off certain statistic names
+ const char *key_begin(matched[1].first), *key_end(matched[1].second);
+ if (key_begin[0] == '"' && key_end[-1] == '"')
+ {
+ ++key_begin;
+ --key_end;
+ }
+ LLSD::String key(key_begin, key_end);
+ LLSD::String value_str(matched[2].first, matched[2].second);
+ LLSD::Integer value(0);
+ try
+ {
+ value = boost::lexical_cast<LLSD::Integer>(value_str);
+ }
+ catch (const boost::bad_lexical_cast&)
+ {
+ LL_WARNS("LLMemoryInfo") << "couldn't parse '" << value_str
+ << "' in vm_stat line: " << line << LL_ENDL;
+ continue;
+ }
+ // Store this statistic.
+ stats.add(key, value);
+ // Is this in units of pages? If so, convert to Kb.
+ static const LLSD::String pages("Pages ");
+ if (key.substr(0, pages.length()) == pages)
+ {
+ // Synthesize a new key with kb in place of Pages
+ LLSD::String kbkey("kb ");
+ kbkey.append(key.substr(pages.length()));
+ stats.add(kbkey, value * pagesizekb);
+ }
+ }
+ else if (regex_match_no_exc(line, matched, cache_rx))
+ {
+ // e.g. "Object cache: 841598 hits of 7629869 lookups (11% hit rate)"
+ static const char* cache_keys[] = { "cache hits", "cache lookups", "cache hit%" };
+ std::vector<LLSD::Integer> cache_values;
+ for (size_t i = 0; i < (sizeof(cache_keys)/sizeof(cache_keys[0])); ++i)
+ {
+ LLSD::String value_str(matched[i+1].first, matched[i+1].second);
+ LLSD::Integer value(0);
+ try
+ {
+ value = boost::lexical_cast<LLSD::Integer>(value_str);
+ }
+ catch (boost::bad_lexical_cast&)
+ {
+ LL_WARNS("LLMemoryInfo") << "couldn't parse '" << value_str
+ << "' in vm_stat line: " << line << LL_ENDL;
+ continue;
+ }
+ stats.add(cache_keys[i], value);
+ }
+ }
+ else
+ {
+ LL_WARNS("LLMemoryInfo") << "unrecognized vm_stat line: " << line << LL_ENDL;
+ }
+ }
+ int status(pclose(pout));
+ if (status == -1) // pclose() couldn't retrieve rc
+ {
+ // Save errno right away.
+ int pclose_errno(errno);
+ // The ECHILD error happens so frequently that unless filtered,
+ // the warning below spams the log file. This is too bad, because
+ // sometimes the logic above fails to produce any output derived
+ // from vm_stat, but we've been unable to observe any specific
+ // error indicating the problem.
+ if (pclose_errno != ECHILD)
+ {
+ LL_WARNS("LLMemoryInfo") << "Unable to obtain vm_stat termination code: ";
+ char buffer[256];
+ if (0 == strerror_r(pclose_errno, buffer, sizeof(buffer)))
+ {
+ LL_CONT << buffer;
+ }
+ else
+ {
+ LL_CONT << "errno " << pclose_errno;
+ }
+ LL_CONT << LL_ENDL;
+ }
+ }
+ else // pclose() retrieved rc; analyze
+ {
+ if (WIFEXITED(status))
+ {
+ int rc(WEXITSTATUS(status));
+ if (rc != 0)
+ {
+ LL_WARNS("LLMemoryInfo") << "vm_stat terminated with rc " << rc << LL_ENDL;
+ }
+ }
+ else if (WIFSIGNALED(status))
+ {
+ LL_WARNS("LLMemoryInfo") << "vm_stat terminated by signal " << WTERMSIG(status)
+ << LL_ENDL;
+ }
+ }
}
+
#elif LL_SOLARIS
- U64 phys = 0;
+ U64 phys = 0;
- phys = (U64)(sysconf(_SC_PHYS_PAGES)) * (U64)(sysconf(_SC_PAGESIZE)/1024);
+ phys = (U64)(sysconf(_SC_PHYS_PAGES)) * (U64)(sysconf(_SC_PAGESIZE)/1024);
- s << "Total Physical KB: " << phys << std::endl;
-#else
- // *NOTE: This works on linux. What will it do on other systems?
- LLFILE* meminfo = LLFile::fopen(MEMINFO_FILE,"rb");
- if(meminfo)
+ stats.add("Total Physical KB", phys);
+
+#elif LL_LINUX
+ std::ifstream meminfo(MEMINFO_FILE);
+ if (meminfo.is_open())
{
- char line[MAX_STRING]; /* Flawfinder: ignore */
- memset(line, 0, MAX_STRING);
- while(fgets(line, MAX_STRING, meminfo))
+ // MemTotal: 4108424 kB
+ // MemFree: 1244064 kB
+ // Buffers: 85164 kB
+ // Cached: 1990264 kB
+ // SwapCached: 0 kB
+ // Active: 1176648 kB
+ // Inactive: 1427532 kB
+ // ...
+ // VmallocTotal: 122880 kB
+ // VmallocUsed: 65252 kB
+ // VmallocChunk: 52356 kB
+ // HardwareCorrupted: 0 kB
+ // HugePages_Total: 0
+ // HugePages_Free: 0
+ // HugePages_Rsvd: 0
+ // HugePages_Surp: 0
+ // Hugepagesize: 2048 kB
+ // DirectMap4k: 434168 kB
+ // DirectMap2M: 477184 kB
+
+ // Intentionally don't pass the boost::no_except flag. This
+ // boost::regex object is constructed with a string literal, so it
+ // should be valid every time. If it becomes invalid, we WANT an
+ // exception, hopefully even before the dev checks in.
+ boost::regex stat_rx("(.+): +([0-9]+)( kB)?");
+ boost::smatch matched;
+
+ std::string line;
+ while (std::getline(meminfo, line))
{
- line[strlen(line)-1] = ' '; /*Flawfinder: ignore*/
- s << line;
+ LL_DEBUGS("LLMemoryInfo") << line << LL_ENDL;
+ if (regex_match_no_exc(line, matched, stat_rx))
+ {
+ // e.g. "MemTotal: 4108424 kB"
+ LLSD::String key(matched[1].first, matched[1].second);
+ LLSD::String value_str(matched[2].first, matched[2].second);
+ LLSD::Integer value(0);
+ try
+ {
+ value = boost::lexical_cast<LLSD::Integer>(value_str);
+ }
+ catch (const boost::bad_lexical_cast&)
+ {
+ LL_WARNS("LLMemoryInfo") << "couldn't parse '" << value_str
+ << "' in " << MEMINFO_FILE << " line: "
+ << line << LL_ENDL;
+ continue;
+ }
+ // Store this statistic.
+ stats.add(key, value);
+ }
+ else
+ {
+ LL_WARNS("LLMemoryInfo") << "unrecognized " << MEMINFO_FILE << " line: "
+ << line << LL_ENDL;
+ }
}
- fclose(meminfo);
}
else
{
- s << "Unable to collect memory information";
+ LL_WARNS("LLMemoryInfo") << "Unable to collect memory information" << LL_ENDL;
}
+
+#else
+ LL_WARNS("LLMemoryInfo") << "Unknown system; unable to collect memory information" << LL_ENDL;
+
#endif
+
+ return stats.get();
}
std::ostream& operator<<(std::ostream& s, const LLOSInfo& info)
@@ -771,6 +1281,143 @@ std::ostream& operator<<(std::ostream& s, const LLMemoryInfo& info)
return s;
}
+class FrameWatcher
+{
+public:
+ FrameWatcher():
+ // Hooking onto the "mainloop" event pump gets us one call per frame.
+ mConnection(LLEventPumps::instance()
+ .obtain("mainloop")
+ .listen("FrameWatcher", boost::bind(&FrameWatcher::tick, this, _1))),
+ // Initializing mSampleStart to an invalid timestamp alerts us to skip
+ // trying to compute framerate on the first call.
+ mSampleStart(-1),
+ // Initializing mSampleEnd to 0 ensures that we treat the first call
+ // as the completion of a sample window.
+ mSampleEnd(0),
+ mFrames(0),
+ // Both MEM_INFO_WINDOW and MEM_INFO_THROTTLE are in seconds. We need
+ // the number of integer MEM_INFO_THROTTLE sample slots that will fit
+ // in MEM_INFO_WINDOW. Round up.
+ mSamples(int((MEM_INFO_WINDOW / MEM_INFO_THROTTLE) + 0.7)),
+ // Initializing to F32_MAX means that the first real frame will become
+ // the slowest ever, which sounds like a good idea.
+ mSlowest(F32_MAX)
+ {}
+
+ bool tick(const LLSD&)
+ {
+ F32 timestamp(mTimer.getElapsedTimeF32());
+
+ // Count this frame in the interval just completed.
+ ++mFrames;
+
+ // Have we finished a sample window yet?
+ if (timestamp < mSampleEnd)
+ {
+ // no, just keep waiting
+ return false;
+ }
+
+ // Set up for next sample window. Capture values for previous frame in
+ // local variables and reset data members.
+ U32 frames(mFrames);
+ F32 sampleStart(mSampleStart);
+ // No frames yet in next window
+ mFrames = 0;
+ // which starts right now
+ mSampleStart = timestamp;
+ // and ends MEM_INFO_THROTTLE seconds in the future
+ mSampleEnd = mSampleStart + MEM_INFO_THROTTLE;
+
+ // On the very first call, that's all we can do, no framerate
+ // computation is possible.
+ if (sampleStart < 0)
+ {
+ return false;
+ }
+
+ // How long did this actually take? As framerate slows, the duration
+ // of the frame we just finished could push us WELL beyond our desired
+ // sample window size.
+ F32 elapsed(timestamp - sampleStart);
+ F32 framerate(frames/elapsed);
+
+ // Remember previous slowest framerate because we're just about to
+ // update it.
+ F32 slowest(mSlowest);
+ // Remember previous number of samples.
+ boost::circular_buffer<F32>::size_type prevSize(mSamples.size());
+
+ // Capture new framerate in our samples buffer. Once the buffer is
+ // full (after MEM_INFO_WINDOW seconds), this will displace the oldest
+ // sample. ("So they all rolled over, and one fell out...")
+ mSamples.push_back(framerate);
+
+ // Calculate the new minimum framerate. I know of no way to update a
+ // rolling minimum without ever rescanning the buffer. But since there
+ // are only a few tens of items in this buffer, rescanning it is
+ // probably cheaper (and certainly easier to reason about) than
+ // attempting to optimize away some of the scans.
+ mSlowest = framerate; // pick an arbitrary entry to start
+ for (boost::circular_buffer<F32>::const_iterator si(mSamples.begin()), send(mSamples.end());
+ si != send; ++si)
+ {
+ if (*si < mSlowest)
+ {
+ mSlowest = *si;
+ }
+ }
+
+ // We're especially interested in memory as framerate drops. Only log
+ // when framerate drops below the slowest framerate we remember.
+ // (Should always be true for the end of the very first sample
+ // window.)
+ if (framerate >= slowest)
+ {
+ return false;
+ }
+ // Congratulations, we've hit a new low. :-P
+
+ LL_INFOS("FrameWatcher") << ' ';
+ if (! prevSize)
+ {
+ LL_CONT << "initial framerate ";
+ }
+ else
+ {
+ LL_CONT << "slowest framerate for last " << int(prevSize * MEM_INFO_THROTTLE)
+ << " seconds ";
+ }
+ LL_CONT << std::fixed << std::setprecision(1) << framerate << '\n'
+ << LLMemoryInfo() << LL_ENDL;
+
+ return false;
+ }
+
+private:
+ // Storing the connection in an LLTempBoundListener ensures it will be
+ // disconnected when we're destroyed.
+ LLTempBoundListener mConnection;
+ // Track elapsed time
+ LLTimer mTimer;
+ // Some of what you see here is in fact redundant with functionality you
+ // can get from LLTimer. Unfortunately the LLTimer API is missing the
+ // feature we need: has at least the stated interval elapsed, and if so,
+ // exactly how long has passed? So we have to do it by hand, sigh.
+ // Time at start, end of sample window
+ F32 mSampleStart, mSampleEnd;
+ // Frames this sample window
+ U32 mFrames;
+ // Sliding window of framerate samples
+ boost::circular_buffer<F32> mSamples;
+ // Slowest framerate in mSamples
+ F32 mSlowest;
+};
+
+// Need an instance of FrameWatcher before it does any good
+static FrameWatcher sFrameWatcher;
+
BOOL gunzip_file(const std::string& srcfile, const std::string& dstfile)
{
std::string tmpfile;
diff --git a/indra/llcommon/llsys.h b/indra/llcommon/llsys.h
index 41a4f25000..739e795d3a 100644
--- a/indra/llcommon/llsys.h
+++ b/indra/llcommon/llsys.h
@@ -36,6 +36,7 @@
// llinfos << info << llendl;
//
+#include "llsd.h"
#include <iosfwd>
#include <string>
@@ -117,6 +118,27 @@ public:
//get the available memory infomation in KiloBytes.
static void getAvailableMemoryKB(U32& avail_physical_mem_kb, U32& avail_virtual_mem_kb);
+
+ // Retrieve a map of memory statistics. The keys of the map are platform-
+ // dependent. The values are in kilobytes to try to avoid integer overflow.
+ LLSD getStatsMap() const;
+
+ // Re-fetch memory data (as reported by stream() and getStatsMap()) from the
+ // system. Normally this is fetched at construction time. Return (*this)
+ // to permit usage of the form:
+ // @code
+ // LLMemoryInfo info;
+ // ...
+ // info.refresh().getStatsMap();
+ // @endcode
+ LLMemoryInfo& refresh();
+
+private:
+ // set mStatsMap
+ static LLSD loadStatsMap();
+
+ // Memory stats for getStatsMap().
+ LLSD mStatsMap;
};
diff --git a/indra/llcommon/llversionviewer.h b/indra/llcommon/llversionviewer.h
index 79124a5a37..6c1d233425 100644
--- a/indra/llcommon/llversionviewer.h
+++ b/indra/llcommon/llversionviewer.h
@@ -28,8 +28,8 @@
#define LL_LLVERSIONVIEWER_H
const S32 LL_VERSION_MAJOR = 2;
-const S32 LL_VERSION_MINOR = 6;
-const S32 LL_VERSION_PATCH = 9;
+const S32 LL_VERSION_MINOR = 8;
+const S32 LL_VERSION_PATCH = 2;
const S32 LL_VERSION_BUILD = 0;
const char * const LL_CHANNEL = "Second Life Developer";
diff --git a/indra/llcrashlogger/llcrashlogger.cpp b/indra/llcrashlogger/llcrashlogger.cpp
index 68e45f36e4..93f3c910bd 100644
--- a/indra/llcrashlogger/llcrashlogger.cpp
+++ b/indra/llcrashlogger/llcrashlogger.cpp
@@ -31,10 +31,12 @@
#include "llcrashlogger.h"
#include "linden_common.h"
#include "llstring.h"
-#include "indra_constants.h" // CRASH_BEHAVIOR_ASK, CRASH_SETTING_NAME
+#include "indra_constants.h" // CRASH_BEHAVIOR_...
#include "llerror.h"
+#include "llerrorcontrol.h"
#include "lltimer.h"
#include "lldir.h"
+#include "llfile.h"
#include "llsdserialize.h"
#include "lliopipe.h"
#include "llpumpio.h"
@@ -54,7 +56,7 @@ public:
virtual void error(U32 status, const std::string& reason)
{
- gBreak = true;
+ gBreak = true;
}
virtual void result(const LLSD& content)
@@ -64,21 +66,8 @@ public:
}
};
-bool LLCrashLoggerText::mainLoop()
-{
- std::cout << "Entering main loop" << std::endl;
- sendCrashLogs();
- return true;
-}
-
-void LLCrashLoggerText::updateApplication(const std::string& message)
-{
- LLCrashLogger::updateApplication(message);
- std::cout << message << std::endl;
-}
-
LLCrashLogger::LLCrashLogger() :
- mCrashBehavior(CRASH_BEHAVIOR_ASK),
+ mCrashBehavior(CRASH_BEHAVIOR_ALWAYS_SEND),
mCrashInPreviousExec(false),
mCrashSettings("CrashSettings"),
mSentCrashLogs(false),
@@ -281,26 +270,48 @@ LLSD LLCrashLogger::constructPostData()
return mCrashInfo;
}
+const char* const CRASH_SETTINGS_FILE = "settings_crash_behavior.xml";
+
S32 LLCrashLogger::loadCrashBehaviorSetting()
{
+ // First check user_settings (in the user's home dir)
std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, CRASH_SETTINGS_FILE);
+ if (! mCrashSettings.loadFromFile(filename))
+ {
+ // Next check app_settings (in the SL program dir)
+ std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, CRASH_SETTINGS_FILE);
+ mCrashSettings.loadFromFile(filename);
+ }
- mCrashSettings.loadFromFile(filename);
-
- S32 value = mCrashSettings.getS32(CRASH_BEHAVIOR_SETTING);
-
- if (value < CRASH_BEHAVIOR_ASK || CRASH_BEHAVIOR_NEVER_SEND < value) return CRASH_BEHAVIOR_ASK;
+ // If we didn't load any files above, this will return the default
+ S32 value = mCrashSettings.getS32("CrashSubmitBehavior");
- return value;
+ // Whatever value we got, make sure it's valid
+ switch (value)
+ {
+ case CRASH_BEHAVIOR_NEVER_SEND:
+ return CRASH_BEHAVIOR_NEVER_SEND;
+ case CRASH_BEHAVIOR_ALWAYS_SEND:
+ return CRASH_BEHAVIOR_ALWAYS_SEND;
+ }
+
+ return CRASH_BEHAVIOR_ASK;
}
bool LLCrashLogger::saveCrashBehaviorSetting(S32 crash_behavior)
{
- if (crash_behavior != CRASH_BEHAVIOR_ASK && crash_behavior != CRASH_BEHAVIOR_ALWAYS_SEND) return false;
+ switch (crash_behavior)
+ {
+ case CRASH_BEHAVIOR_ASK:
+ case CRASH_BEHAVIOR_NEVER_SEND:
+ case CRASH_BEHAVIOR_ALWAYS_SEND:
+ break;
+ default:
+ return false;
+ }
- mCrashSettings.setS32(CRASH_BEHAVIOR_SETTING, crash_behavior);
+ mCrashSettings.setS32("CrashSubmitBehavior", crash_behavior);
std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, CRASH_SETTINGS_FILE);
-
mCrashSettings.saveToFile(filename, FALSE);
return true;
@@ -309,14 +320,13 @@ bool LLCrashLogger::saveCrashBehaviorSetting(S32 crash_behavior)
bool LLCrashLogger::runCrashLogPost(std::string host, LLSD data, std::string msg, int retries, int timeout)
{
gBreak = false;
- std::string status_message;
for(int i = 0; i < retries; ++i)
{
- status_message = llformat("%s, try %d...", msg.c_str(), i+1);
+ updateApplication(llformat("%s, try %d...", msg.c_str(), i+1));
LLHTTPClient::post(host, data, new LLCrashLoggerResponder(), timeout);
while(!gBreak)
{
- updateApplication(status_message);
+ updateApplication(); // No new message, just pump the IO
}
if(gSent)
{
@@ -336,7 +346,7 @@ bool LLCrashLogger::sendCrashLogs()
updateApplication("Sending reports...");
std::string dump_path = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,
- "SecondLifeCrashReport");
+ "SecondLifeCrashReport");
std::string report_file = dump_path + ".log";
std::ofstream out_file(report_file.c_str());
@@ -365,6 +375,7 @@ void LLCrashLogger::updateApplication(const std::string& message)
{
gServicePump->pump();
gServicePump->callback();
+ if (!message.empty()) llinfos << message << llendl;
}
bool LLCrashLogger::init()
@@ -374,14 +385,27 @@ bool LLCrashLogger::init()
// We assume that all the logs we're looking for reside on the current drive
gDirUtilp->initAppDirs("SecondLife");
+ LLError::initForApplication(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, ""));
+
// Default to the product name "Second Life" (this is overridden by the -name argument)
mProductName = "Second Life";
+
+ // Rename current log file to ".old"
+ std::string old_log_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "crashreport.log.old");
+ std::string log_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "crashreport.log");
+ LLFile::rename(log_file.c_str(), old_log_file.c_str());
+
+ // Set the log file to crashreport.log
+ LLError::logToFile(log_file);
- mCrashSettings.declareS32(CRASH_BEHAVIOR_SETTING, CRASH_BEHAVIOR_ASK, "Controls behavior when viewer crashes "
- "(0 = ask before sending crash report, 1 = always send crash report, 2 = never send crash report)");
+ mCrashSettings.declareS32("CrashSubmitBehavior", CRASH_BEHAVIOR_ALWAYS_SEND,
+ "Controls behavior when viewer crashes "
+ "(0 = ask before sending crash report, "
+ "1 = always send crash report, "
+ "2 = never send crash report)");
- llinfos << "Loading crash behavior setting" << llendl;
- mCrashBehavior = loadCrashBehaviorSetting();
+ // llinfos << "Loading crash behavior setting" << llendl;
+ // mCrashBehavior = loadCrashBehaviorSetting();
// If user doesn't want to send, bail out
if (mCrashBehavior == CRASH_BEHAVIOR_NEVER_SEND)
@@ -394,10 +418,11 @@ bool LLCrashLogger::init()
gServicePump->prime(gAPRPoolp);
LLHTTPClient::setPump(*gServicePump);
- //If we've opened the crash logger, assume we can delete the marker file if it exists
+ //If we've opened the crash logger, assume we can delete the marker file if it exists
if( gDirUtilp )
{
- std::string marker_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"SecondLife.exec_marker");
+ std::string marker_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,
+ "SecondLife.exec_marker");
LLAPRFile::remove( marker_file );
}
diff --git a/indra/llcrashlogger/llcrashlogger.h b/indra/llcrashlogger/llcrashlogger.h
index a5daa74247..5d0cb5931c 100644
--- a/indra/llcrashlogger/llcrashlogger.h
+++ b/indra/llcrashlogger/llcrashlogger.h
@@ -66,15 +66,4 @@ protected:
bool mSentCrashLogs;
};
-class LLCrashLoggerText : public LLCrashLogger
-{
-public:
- LLCrashLoggerText(void) {}
- ~LLCrashLoggerText(void) {}
-
- virtual bool mainLoop();
- virtual void updateApplication(const std::string& message = LLStringUtil::null);
-};
-
-
#endif //LLCRASHLOGGER_H
diff --git a/indra/llinventory/llparcel.cpp b/indra/llinventory/llparcel.cpp
index 0a4cd51ea0..c95f922301 100644
--- a/indra/llinventory/llparcel.cpp
+++ b/indra/llinventory/llparcel.cpp
@@ -226,6 +226,11 @@ void LLParcel::init(const LLUUID &owner_id,
setPreviousOwnerID(LLUUID::null);
setPreviouslyGroupOwned(FALSE);
+
+ setSeeAVs(TRUE);
+ setAllowGroupAVSounds(TRUE);
+ setAllowAnyAVSounds(TRUE);
+ setHaveNewParcelLimitData(FALSE);
}
void LLParcel::overrideOwner(const LLUUID& owner_id, BOOL is_group_owned)
@@ -702,7 +707,9 @@ void LLParcel::packMessage(LLSD& msg)
msg["user_location"] = ll_sd_from_vector3(mUserLocation);
msg["user_look_at"] = ll_sd_from_vector3(mUserLookAt);
msg["landing_type"] = (U8)mLandingType;
-
+ msg["see_avs"] = (LLSD::Boolean) getSeeAVs();
+ msg["group_av_sounds"] = (LLSD::Boolean) getAllowGroupAVSounds();
+ msg["any_av_sounds"] = (LLSD::Boolean) getAllowAnyAVSounds();
}
@@ -721,6 +728,24 @@ void LLParcel::unpackMessage(LLMessageSystem* msg)
msg->getStringFast( _PREHASH_ParcelData,_PREHASH_MediaURL, buffer );
setMediaURL(buffer);
+ BOOL see_avs = TRUE; // All default to true for legacy server behavior
+ BOOL any_av_sounds = TRUE;
+ BOOL group_av_sounds = TRUE;
+ bool have_new_parcel_limit_data = (msg->getSizeFast(_PREHASH_ParcelData, _PREHASH_SeeAVs) > 0); // New version of server should send all 3 of these values
+ have_new_parcel_limit_data &= (msg->getSizeFast(_PREHASH_ParcelData, _PREHASH_AnyAVSounds) > 0);
+ have_new_parcel_limit_data &= (msg->getSizeFast(_PREHASH_ParcelData, _PREHASH_GroupAVSounds) > 0);
+ if (have_new_parcel_limit_data)
+ {
+ msg->getBOOLFast(_PREHASH_ParcelData, _PREHASH_SeeAVs, see_avs);
+ msg->getBOOLFast(_PREHASH_ParcelData, _PREHASH_AnyAVSounds, any_av_sounds);
+ msg->getBOOLFast(_PREHASH_ParcelData, _PREHASH_GroupAVSounds, group_av_sounds);
+ }
+ setSeeAVs((bool) see_avs);
+ setAllowAnyAVSounds((bool) any_av_sounds);
+ setAllowGroupAVSounds((bool) group_av_sounds);
+
+ setHaveNewParcelLimitData(have_new_parcel_limit_data);
+
// non-optimized version
msg->getU8 ( "ParcelData", "MediaAutoScale", mMediaAutoScale );
@@ -1348,3 +1373,12 @@ LLParcel::ECategory category_ui_string_to_category(const std::string& s)
// is a distinct option from "None" and "Other"
return LLParcel::C_ANY;
}
+
+void LLParcel::updateQuota( const LLUUID& objectId, const ParcelQuota& quota )
+{
+ if ( mID == objectId )
+ {
+ mQuota = quota;
+ }
+}
+
diff --git a/indra/llinventory/llparcel.h b/indra/llinventory/llparcel.h
index 71b65d99ce..ff35caab4c 100644
--- a/indra/llinventory/llparcel.h
+++ b/indra/llinventory/llparcel.h
@@ -34,7 +34,7 @@
#include "llpermissions.h"
#include "lltimer.h"
#include "v3math.h"
-
+#include "llaccountingquota.h"
// Grid out of which parcels taken is stepped every 4 meters.
const F32 PARCEL_GRID_STEP_METERS = 4.f;
@@ -75,7 +75,7 @@ const U8 PARCEL_AUCTION = 0x05;
// unused 0x06
// unused 0x07
// flag, unused 0x08
-// flag, unused 0x10
+const U8 PARCEL_HIDDENAVS = 0x10; // avatars not visible outside of parcel. Used for 'see avs' feature, but must be off for compatibility
const U8 PARCEL_SOUND_LOCAL = 0x20;
const U8 PARCEL_WEST_LINE = 0x40; // flag, property line on west edge
const U8 PARCEL_SOUTH_LINE = 0x80; // flag, property line on south edge
@@ -130,6 +130,12 @@ class LLSD;
class LLAccessEntry
{
public:
+ LLAccessEntry()
+ : mID(),
+ mTime(0),
+ mFlags(0)
+ {}
+
LLUUID mID; // Agent ID
S32 mTime; // Time (unix seconds) when entry expires
U32 mFlags; // Not used - currently should always be zero
@@ -265,6 +271,8 @@ public:
void setUserLocation(const LLVector3& pos) { mUserLocation = pos; }
void setUserLookAt(const LLVector3& rot) { mUserLookAt = rot; }
void setLandingType(const ELandingType type) { mLandingType = type; }
+ void setSeeAVs(BOOL see_avs) { mSeeAVs = see_avs; }
+ void setHaveNewParcelLimitData(bool have_new_parcel_data) { mHaveNewParcelLimitData = have_new_parcel_data; } // Remove this once hidden AV feature is fully available grid-wide
void setAuctionID(U32 auction_id) { mAuctionID = auction_id;}
@@ -291,6 +299,8 @@ public:
void setDenyAnonymous(BOOL b) { setParcelFlag(PF_DENY_ANONYMOUS, b); }
void setDenyAgeUnverified(BOOL b) { setParcelFlag(PF_DENY_AGEUNVERIFIED, b); }
void setRestrictPushObject(BOOL b) { setParcelFlag(PF_RESTRICT_PUSHOBJECT, b); }
+ void setAllowGroupAVSounds(BOOL b) { mAllowGroupAVSounds = b; }
+ void setAllowAnyAVSounds(BOOL b) { mAllowAnyAVSounds = b; }
void setDrawDistance(F32 dist) { mDrawDistance = dist; }
void setSalePrice(S32 price) { mSalePrice = price; }
@@ -367,6 +377,8 @@ public:
const LLVector3& getUserLocation() const { return mUserLocation; }
const LLVector3& getUserLookAt() const { return mUserLookAt; }
ELandingType getLandingType() const { return mLandingType; }
+ BOOL getSeeAVs() const { return mSeeAVs; }
+ BOOL getHaveNewParcelLimitData() const { return mHaveNewParcelLimitData; }
// User-specified snapshot
const LLUUID& getSnapshotID() const { return mSnapshotID; }
@@ -496,6 +508,9 @@ public:
BOOL getRegionDenyAgeUnverifiedOverride() const
{ return mRegionDenyAgeUnverifiedOverride; }
+ BOOL getAllowGroupAVSounds() const { return mAllowGroupAVSounds; }
+ BOOL getAllowAnyAVSounds() const { return mAllowAnyAVSounds; }
+
F32 getDrawDistance() const { return mDrawDistance; }
S32 getSalePrice() const { return mSalePrice; }
time_t getClaimDate() const { return mClaimDate; }
@@ -586,7 +601,11 @@ public:
LLUUID getPreviousOwnerID() const { return mPreviousOwnerID; }
BOOL getPreviouslyGroupOwned() const { return mPreviouslyGroupOwned; }
BOOL getSellWithObjects() const { return (mParcelFlags & PF_SELL_PARCEL_OBJECTS) ? TRUE : FALSE; }
-
+
+
+ void updateQuota( const LLUUID& objectId, const ParcelQuota& quota );
+ const ParcelQuota& getQuota( void ) { return mQuota; }
+
protected:
LLUUID mID;
LLUUID mOwnerID;
@@ -602,6 +621,8 @@ protected:
LLVector3 mUserLocation;
LLVector3 mUserLookAt;
ELandingType mLandingType;
+ BOOL mSeeAVs; // Avatars on this parcel are visible from outside it
+ BOOL mHaveNewParcelLimitData; // Remove once hidden AV feature is grid-wide
LLTimer mSaleTimerExpires;
LLTimer mMediaResetTimer;
@@ -657,8 +678,11 @@ protected:
BOOL mRegionPushOverride;
BOOL mRegionDenyAnonymousOverride;
BOOL mRegionDenyAgeUnverifiedOverride;
-
-
+ BOOL mAllowGroupAVSounds;
+ BOOL mAllowAnyAVSounds;
+
+ ParcelQuota mQuota;
+
public:
// HACK, make private
S32 mLocalID;
diff --git a/indra/llinventory/llparcelflags.h b/indra/llinventory/llparcelflags.h
index a61130132a..b1a917df73 100644
--- a/indra/llinventory/llparcelflags.h
+++ b/indra/llinventory/llparcelflags.h
@@ -126,5 +126,7 @@ const S32 PARCEL_DETAILS_DESC = 1;
const S32 PARCEL_DETAILS_OWNER = 2;
const S32 PARCEL_DETAILS_GROUP = 3;
const S32 PARCEL_DETAILS_AREA = 4;
+const S32 PARCEL_DETAILS_ID = 5;
+const S32 PARCEL_DETAILS_SEE_AVATARS = 6;
#endif
diff --git a/indra/llkdu/llimagej2ckdu.cpp b/indra/llkdu/llimagej2ckdu.cpp
index 39ae09650e..c156ed0cef 100644
--- a/indra/llkdu/llimagej2ckdu.cpp
+++ b/indra/llkdu/llimagej2ckdu.cpp
@@ -73,7 +73,7 @@ void set_default_colour_weights(kdu_params *siz);
const char* engineInfoLLImageJ2CKDU()
{
- std::string version = llformat("KDU %s", KDU_CORE_VERSION);
+ static std::string version = llformat("KDU %s", KDU_CORE_VERSION);
return version.c_str();
}
diff --git a/indra/llmath/CMakeLists.txt b/indra/llmath/CMakeLists.txt
index 9dadad7dd3..cd100cdf9f 100644
--- a/indra/llmath/CMakeLists.txt
+++ b/indra/llmath/CMakeLists.txt
@@ -12,6 +12,8 @@ include_directories(
set(llmath_SOURCE_FILES
llbbox.cpp
llbboxlocal.cpp
+ llcalc.cpp
+ llcalcparser.cpp
llcamera.cpp
llcoordframe.cpp
llline.cpp
@@ -46,6 +48,8 @@ set(llmath_HEADER_FILES
coordframe.h
llbbox.h
llbboxlocal.h
+ llcalc.h
+ llcalcparser.h
llcamera.h
llcoord.h
llcoordframe.h
diff --git a/indra/llmath/llcalc.cpp b/indra/llmath/llcalc.cpp
new file mode 100644
index 0000000000..597d0815fb
--- /dev/null
+++ b/indra/llmath/llcalc.cpp
@@ -0,0 +1,145 @@
+/*
+ * LLCalc.cpp
+ * SecondLife
+ *
+ * Created by Aimee Walton on 28/09/2008.
+ * Copyright 2008 Aimee Walton.
+ *
+ */
+
+#include "linden_common.h"
+
+#include "llcalc.h"
+
+#include "llcalcparser.h"
+#include "llmath.h"
+
+
+// Variable names for use in the build floater
+const char* LLCalc::X_POS = "PX";
+const char* LLCalc::Y_POS = "PY";
+const char* LLCalc::Z_POS = "PZ";
+const char* LLCalc::X_SCALE = "SX";
+const char* LLCalc::Y_SCALE = "SY";
+const char* LLCalc::Z_SCALE = "SZ";
+const char* LLCalc::X_ROT = "RX";
+const char* LLCalc::Y_ROT = "RY";
+const char* LLCalc::Z_ROT = "RZ";
+const char* LLCalc::HOLLOW = "HLW";
+const char* LLCalc::CUT_BEGIN = "CB";
+const char* LLCalc::CUT_END = "CE";
+const char* LLCalc::PATH_BEGIN = "PB";
+const char* LLCalc::PATH_END = "PE";
+const char* LLCalc::TWIST_BEGIN = "TB";
+const char* LLCalc::TWIST_END = "TE";
+const char* LLCalc::X_SHEAR = "SHX";
+const char* LLCalc::Y_SHEAR = "SHY";
+const char* LLCalc::X_TAPER = "TPX";
+const char* LLCalc::Y_TAPER = "TPY";
+const char* LLCalc::RADIUS_OFFSET = "ROF";
+const char* LLCalc::REVOLUTIONS = "REV";
+const char* LLCalc::SKEW = "SKW";
+const char* LLCalc::X_HOLE = "HLX";
+const char* LLCalc::Y_HOLE = "HLY";
+const char* LLCalc::TEX_U_SCALE = "TSU";
+const char* LLCalc::TEX_V_SCALE = "TSV";
+const char* LLCalc::TEX_U_OFFSET = "TOU";
+const char* LLCalc::TEX_V_OFFSET = "TOV";
+const char* LLCalc::TEX_ROTATION = "TROT";
+const char* LLCalc::TEX_TRANSPARENCY = "TRNS";
+const char* LLCalc::TEX_GLOW = "GLOW";
+
+
+LLCalc* LLCalc::sInstance = NULL;
+
+LLCalc::LLCalc() : mLastErrorPos(0)
+{
+ // Init table of constants
+ mConstants["PI"] = F_PI;
+ mConstants["TWO_PI"] = F_TWO_PI;
+ mConstants["PI_BY_TWO"] = F_PI_BY_TWO;
+ mConstants["SQRT_TWO_PI"] = F_SQRT_TWO_PI;
+ mConstants["SQRT2"] = F_SQRT2;
+ mConstants["SQRT3"] = F_SQRT3;
+ mConstants["DEG_TO_RAD"] = DEG_TO_RAD;
+ mConstants["RAD_TO_DEG"] = RAD_TO_DEG;
+ mConstants["GRAVITY"] = GRAVITY;
+}
+
+LLCalc::~LLCalc()
+{
+}
+
+//static
+void LLCalc::cleanUp()
+{
+ delete sInstance;
+ sInstance = NULL;
+}
+
+//static
+LLCalc* LLCalc::getInstance()
+{
+ if (!sInstance) sInstance = new LLCalc();
+ return sInstance;
+}
+
+void LLCalc::setVar(const std::string& name, const F32& value)
+{
+ mVariables[name] = value;
+}
+
+void LLCalc::clearVar(const std::string& name)
+{
+ mVariables.erase(name);
+}
+
+void LLCalc::clearAllVariables()
+{
+ mVariables.clear();
+}
+
+/*
+void LLCalc::updateVariables(LLSD& vars)
+{
+ LLSD::map_iterator cIt = vars.beginMap();
+ for(; cIt != vars.endMap(); cIt++)
+ {
+ setVar(cIt->first, (F32)(LLSD::Real)cIt->second);
+ }
+}
+*/
+
+bool LLCalc::evalString(const std::string& expression, F32& result)
+{
+ std::string expr_upper = expression;
+ LLStringUtil::toUpper(expr_upper);
+
+ LLCalcParser calc(result, &mConstants, &mVariables);
+
+ mLastErrorPos = 0;
+ std::string::iterator start = expr_upper.begin();
+ parse_info<std::string::iterator> info;
+
+ try
+ {
+ info = parse(start, expr_upper.end(), calc, space_p);
+ lldebugs << "Math expression: " << expression << " = " << result << llendl;
+ }
+ catch(parser_error<std::string, std::string::iterator> &e)
+ {
+ mLastErrorPos = e.where - expr_upper.begin();
+
+ llinfos << "Calc parser exception: " << e.descriptor << " at " << mLastErrorPos << " in expression: " << expression << llendl;
+ return false;
+ }
+
+ if (!info.full)
+ {
+ mLastErrorPos = info.stop - expr_upper.begin();
+ llinfos << "Unhandled syntax error at " << mLastErrorPos << " in expression: " << expression << llendl;
+ return false;
+ }
+
+ return true;
+}
diff --git a/indra/llmath/llcalc.h b/indra/llmath/llcalc.h
new file mode 100644
index 0000000000..cc31950cb6
--- /dev/null
+++ b/indra/llmath/llcalc.h
@@ -0,0 +1,83 @@
+/*
+ * LLCalc.h
+ * SecondLife
+ *
+ * Created by Aimee Walton on 28/09/2008.
+ * Copyright 2008 Aimee Walton.
+ *
+ */
+
+#ifndef LL_CALC_H
+#define LL_CALC_H
+
+#include <map>
+#include <string>
+
+class LLCalc
+{
+public:
+ LLCalc();
+ ~LLCalc();
+
+ // Variable name constants
+ static const char* X_POS;
+ static const char* Y_POS;
+ static const char* Z_POS;
+ static const char* X_SCALE;
+ static const char* Y_SCALE;
+ static const char* Z_SCALE;
+ static const char* X_ROT;
+ static const char* Y_ROT;
+ static const char* Z_ROT;
+ static const char* HOLLOW;
+ static const char* CUT_BEGIN;
+ static const char* CUT_END;
+ static const char* PATH_BEGIN;
+ static const char* PATH_END;
+ static const char* TWIST_BEGIN;
+ static const char* TWIST_END;
+ static const char* X_SHEAR;
+ static const char* Y_SHEAR;
+ static const char* X_TAPER;
+ static const char* Y_TAPER;
+ static const char* RADIUS_OFFSET;
+ static const char* REVOLUTIONS;
+ static const char* SKEW;
+ static const char* X_HOLE;
+ static const char* Y_HOLE;
+ static const char* TEX_U_SCALE;
+ static const char* TEX_V_SCALE;
+ static const char* TEX_U_OFFSET;
+ static const char* TEX_V_OFFSET;
+ static const char* TEX_ROTATION;
+ static const char* TEX_TRANSPARENCY;
+ static const char* TEX_GLOW;
+
+ void setVar(const std::string& name, const F32& value);
+ void clearVar(const std::string& name);
+ void clearAllVariables();
+// void updateVariables(LLSD& vars);
+
+ bool evalString(const std::string& expression, F32& result);
+ std::string::size_type getLastErrorPos() { return mLastErrorPos; }
+
+ static LLCalc* getInstance();
+ static void cleanUp();
+
+ typedef std::map<std::string, F32> calc_map_t;
+
+private:
+ std::string::size_type mLastErrorPos;
+
+ calc_map_t mConstants;
+ calc_map_t mVariables;
+
+ // *TODO: Add support for storing user defined variables, and stored functions.
+ // Will need UI work, and a means to save them between sessions.
+// calc_map_t mUserVariables;
+
+ // "There shall be only one"
+ static LLCalc* sInstance;
+};
+
+#endif // LL_CALC_H
diff --git a/indra/llmath/llcalcparser.cpp b/indra/llmath/llcalcparser.cpp
new file mode 100644
index 0000000000..fd55376fa9
--- /dev/null
+++ b/indra/llmath/llcalcparser.cpp
@@ -0,0 +1,46 @@
+/*
+ * LLCalcParser.cpp
+ * SecondLife
+ *
+ * Created by Aimee Walton on 28/09/2008.
+ * Copyright 2008 Aimee Walton.
+ *
+ */
+
+#include "linden_common.h"
+
+#include "llcalcparser.h"
+using namespace boost::spirit::classic;
+
+F32 LLCalcParser::lookup(const std::string::iterator& start, const std::string::iterator& end) const
+{
+ LLCalc::calc_map_t::iterator iter;
+
+ std::string name(start, end);
+
+ if (mConstants)
+ {
+ iter = mConstants->find(name);
+ if (iter != mConstants->end())
+ {
+ return (*iter).second;
+ }
+ }
+ else
+ {
+ // This should never happen!
+ throw_(end, std::string("Missing constants table"));
+ }
+
+ if (mVariables)
+ {
+ iter = mVariables->find(name);
+ if (iter != mVariables->end())
+ {
+ return (*iter).second;
+ }
+ }
+
+ throw_(end, std::string("Unknown symbol " + name));
+ return 0.f;
+}
diff --git a/indra/llmath/llcalcparser.h b/indra/llmath/llcalcparser.h
new file mode 100644
index 0000000000..600e173661
--- /dev/null
+++ b/indra/llmath/llcalcparser.h
@@ -0,0 +1,174 @@
+/*
+ * LLCalcParser.h
+ * SecondLife
+ *
+ * Created by Aimee Walton on 28/09/2008.
+ * Copyright 2008 Aimee Walton.
+ *
+ */
+
+#ifndef LL_CALCPARSER_H
+#define LL_CALCPARSER_H
+
+#include <boost/spirit/include/classic_attribute.hpp>
+#include <boost/spirit/include/classic_core.hpp>
+#include <boost/spirit/include/classic_error_handling.hpp>
+#include <boost/spirit/include/classic_position_iterator.hpp>
+#include <boost/spirit/include/phoenix1_binders.hpp>
+#include <boost/spirit/include/classic_symbols.hpp>
+using namespace boost::spirit::classic;
+
+#include "llcalc.h"
+#include "llmath.h"
+
+struct LLCalcParser : grammar<LLCalcParser>
+{
+ LLCalcParser(F32& result, LLCalc::calc_map_t* constants, LLCalc::calc_map_t* vars) :
+ mResult(result), mConstants(constants), mVariables(vars) {};
+
+ struct value_closure : closure<value_closure, F32>
+ {
+ member1 value;
+ };
+
+ template <typename ScannerT>
+ struct definition
+ {
+ // Rule declarations
+ rule<ScannerT> statement, identifier;
+ rule<ScannerT, value_closure::context_t> expression, term,
+ power,
+ unary_expr,
+ factor,
+ unary_func,
+ binary_func,
+ group;
+
+ // start() should return the starting symbol
+ rule<ScannerT> const& start() const { return statement; }
+
+ definition(LLCalcParser const& self)
+ {
+ using namespace phoenix;
+
+ assertion<std::string> assert_domain("Domain error");
+// assertion<std::string> assert_symbol("Unknown symbol");
+ assertion<std::string> assert_syntax("Syntax error");
+
+ identifier =
+ lexeme_d[(alpha_p | '_') >> *(alnum_p | '_')]
+ ;
+
+ group =
+ '(' >> expression[group.value = arg1] >> assert_syntax(ch_p(')'))
+ ;
+
+ unary_func =
+ ((str_p("SIN") >> '(' >> expression[unary_func.value = bind(&LLCalcParser::_sin)(self,arg1)]) |
+ (str_p("COS") >> '(' >> expression[unary_func.value = bind(&LLCalcParser::_cos)(self,arg1)]) |
+ (str_p("TAN") >> '(' >> expression[unary_func.value = bind(&LLCalcParser::_tan)(self,arg1)]) |
+ (str_p("ASIN") >> '(' >> expression[unary_func.value = bind(&LLCalcParser::_asin)(self,arg1)]) |
+ (str_p("ACOS") >> '(' >> expression[unary_func.value = bind(&LLCalcParser::_acos)(self,arg1)]) |
+ (str_p("ATAN") >> '(' >> expression[unary_func.value = bind(&LLCalcParser::_atan)(self,arg1)]) |
+ (str_p("SQRT") >> '(' >> expression[unary_func.value = bind(&LLCalcParser::_sqrt)(self,arg1)]) |
+ (str_p("LOG") >> '(' >> expression[unary_func.value = bind(&LLCalcParser::_log)(self,arg1)]) |
+ (str_p("EXP") >> '(' >> expression[unary_func.value = bind(&LLCalcParser::_exp)(self,arg1)]) |
+ (str_p("ABS") >> '(' >> expression[unary_func.value = bind(&LLCalcParser::_fabs)(self,arg1)]) |
+ (str_p("FLR") >> '(' >> expression[unary_func.value = bind(&LLCalcParser::_floor)(self,arg1)]) |
+ (str_p("CEIL") >> '(' >> expression[unary_func.value = bind(&LLCalcParser::_ceil)(self,arg1)])
+ ) >> assert_syntax(ch_p(')'))
+ ;
+
+ binary_func =
+ ((str_p("ATAN2") >> '(' >> expression[binary_func.value = arg1] >> ',' >>
+ expression[binary_func.value = bind(&LLCalcParser::_atan2)(self, binary_func.value, arg1)]) |
+ (str_p("MIN") >> '(' >> expression[binary_func.value = arg1] >> ',' >>
+ expression[binary_func.value = bind(&LLCalcParser::_min)(self, binary_func.value, arg1)]) |
+ (str_p("MAX") >> '(' >> expression[binary_func.value = arg1] >> ',' >>
+ expression[binary_func.value = bind(&LLCalcParser::_max)(self, binary_func.value, arg1)])
+ ) >> assert_syntax(ch_p(')'))
+ ;
+
+ // *TODO: Localisation of the decimal point?
+ // Problem, LLLineEditor::postvalidateFloat accepts a comma when appropriate
+ // for the current locale. However to do that here could clash with using
+ // the comma as a separator when passing arguments to functions.
+ factor =
+ (ureal_p[factor.value = arg1] |
+ group[factor.value = arg1] |
+ unary_func[factor.value = arg1] |
+ binary_func[factor.value = arg1] |
+ // Lookup throws an Unknown Symbol error if it is unknown, while this works fine,
+ // would be "neater" to handle symbol lookup from here with an assertive parser.
+// constants_p[factor.value = arg1]|
+ identifier[factor.value = bind(&LLCalcParser::lookup)(self, arg1, arg2)]
+ ) >>
+ // Detect and throw math errors.
+ assert_domain(eps_p(bind(&LLCalcParser::checkNaN)(self, factor.value)))
+ ;
+
+ unary_expr =
+ !ch_p('+') >> factor[unary_expr.value = arg1] |
+ '-' >> factor[unary_expr.value = -arg1]
+ ;
+
+ power =
+ unary_expr[power.value = arg1] >>
+ *('^' >> assert_syntax(unary_expr[power.value = bind(&powf)(power.value, arg1)]))
+ ;
+
+ term =
+ power[term.value = arg1] >>
+ *(('*' >> assert_syntax(power[term.value *= arg1])) |
+ ('/' >> assert_syntax(power[term.value /= arg1])) |
+ ('%' >> assert_syntax(power[term.value = bind(&fmodf)(term.value, arg1)]))
+ )
+ ;
+
+ expression =
+ assert_syntax(term[expression.value = arg1]) >>
+ *(('+' >> assert_syntax(term[expression.value += arg1])) |
+ ('-' >> assert_syntax(term[expression.value -= arg1]))
+ )
+ ;
+
+ statement =
+ !ch_p('=') >> ( expression )[var(self.mResult) = arg1] >> (end_p)
+ ;
+ }
+ };
+
+private:
+ // Member functions for semantic actions
+ F32 lookup(const std::string::iterator&, const std::string::iterator&) const;
+ F32 _min(const F32& a, const F32& b) const { return llmin(a, b); }
+ F32 _max(const F32& a, const F32& b) const { return llmax(a, b); }
+
+ bool checkNaN(const F32& a) const { return !llisnan(a); }
+
+ //FIX* non ambigious function fix making SIN() work for calc -Cryogenic Blitz
+ F32 _sin(const F32& a) const { return sin(DEG_TO_RAD * a); }
+ F32 _cos(const F32& a) const { return cos(DEG_TO_RAD * a); }
+ F32 _tan(const F32& a) const { return tan(DEG_TO_RAD * a); }
+ F32 _asin(const F32& a) const { return asin(a * RAD_TO_DEG); }
+ F32 _acos(const F32& a) const { return acos(a * RAD_TO_DEG); }
+ F32 _atan(const F32& a) const { return atan(a * RAD_TO_DEG); }
+ F32 _sqrt(const F32& a) const { return sqrt(a); }
+ F32 _log(const F32& a) const { return log(a); }
+ F32 _exp(const F32& a) const { return exp(a); }
+ F32 _fabs(const F32& a) const { return fabs(a); }
+ F32 _floor(const F32& a) const { return llfloor(a); }
+ F32 _ceil(const F32& a) const { return llceil(a); }
+
+ F32 _atan2(const F32& a,const F32& b) const { return atan2(a,b); }
+
+
+
+ LLCalc::calc_map_t* mConstants;
+ LLCalc::calc_map_t* mVariables;
+// LLCalc::calc_map_t* mUserVariables;
+
+ F32& mResult;
+};
+
+#endif // LL_CALCPARSER_H
diff --git a/indra/llmath/lloctree.h b/indra/llmath/lloctree.h
index 179ad7ecfd..e5ca47da69 100644
--- a/indra/llmath/lloctree.h
+++ b/indra/llmath/lloctree.h
@@ -35,12 +35,14 @@
#define OCT_ERRS LL_WARNS("OctreeErrors")
-#define LL_OCTREE_PARANOIA_CHECK 0
+
+extern U32 gOctreeMaxCapacity;
+/*#define LL_OCTREE_PARANOIA_CHECK 0
#if LL_DARWIN
#define LL_OCTREE_MAX_CAPACITY 32
#else
#define LL_OCTREE_MAX_CAPACITY 128
-#endif
+#endif*/
template <class T> class LLOctreeNode;
@@ -74,6 +76,7 @@ template <class T>
class LLOctreeNode : public LLTreeNode<T>
{
public:
+
typedef LLOctreeTraveler<T> oct_traveler;
typedef LLTreeTraveler<T> tree_traveler;
typedef typename std::set<LLPointer<T> > element_list;
@@ -294,8 +297,8 @@ public:
//is it here?
if (isInside(data->getPositionGroup()))
{
- if (((getElementCount() < LL_OCTREE_MAX_CAPACITY && contains(data->getBinRadius())) ||
- (data->getBinRadius() > getSize()[0] && parent && parent->getElementCount() >= LL_OCTREE_MAX_CAPACITY)))
+ 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)
diff --git a/indra/llmath/llvolume.cpp b/indra/llmath/llvolume.cpp
index c504215ee5..2893e746e9 100644
--- a/indra/llmath/llvolume.cpp
+++ b/indra/llmath/llvolume.cpp
@@ -32,6 +32,7 @@
#if !LL_WINDOWS
#include <stdint.h>
#endif
+#include <cmath>
#include "llerror.h"
#include "llmemtype.h"
@@ -100,7 +101,7 @@ void assert_aligned(void* ptr, uintptr_t alignment)
uintptr_t t = (uintptr_t) ptr;
if (t%alignment != 0)
{
- llerrs << "WTF?" << llendl;
+ llerrs << "Alignment check failed." << llendl;
}
#endif
}
@@ -361,7 +362,7 @@ public:
}
else
{
- llerrs << "WTF? Empty leaf" << llendl;
+ llerrs << "Empty leaf" << llendl;
}
for (S32 i = 0; i < branch->getChildCount(); ++i)
@@ -416,6 +417,70 @@ LLProfile::Face* LLProfile::addFace(S32 i, S32 count, F32 scaleU, S16 faceID, BO
return face;
}
+//static
+S32 LLProfile::getNumNGonPoints(const LLProfileParams& params, S32 sides, F32 offset, F32 bevel, F32 ang_scale, S32 split)
+{ // this is basically LLProfile::genNGon stripped down to only the operations that influence the number of points
+ LLMemType m1(LLMemType::MTYPE_VOLUME);
+ S32 np = 0;
+
+ // Generate an n-sided "circular" path.
+ // 0 is (1,0), and we go counter-clockwise along a circular path from there.
+ F32 t, t_step, t_first, t_fraction;
+
+ F32 begin = params.getBegin();
+ F32 end = params.getEnd();
+
+ t_step = 1.0f / sides;
+
+ t_first = floor(begin * sides) / (F32)sides;
+
+ // pt1 is the first point on the fractional face.
+ // Starting t and ang values for the first face
+ t = t_first;
+
+ // Increment to the next point.
+ // pt2 is the end point on the fractional face
+ t += t_step;
+
+ t_fraction = (begin - t_first)*sides;
+
+ // Only use if it's not almost exactly on an edge.
+ if (t_fraction < 0.9999f)
+ {
+ np++;
+ }
+
+ // There's lots of potential here for floating point error to generate unneeded extra points - DJS 04/05/02
+ while (t < end)
+ {
+ // Iterate through all the integer steps of t.
+ np++;
+
+ t += t_step;
+ }
+
+ t_fraction = (end - (t - t_step))*sides;
+
+ // Find the fraction that we need to add to the end point.
+ t_fraction = (end - (t - t_step))*sides;
+ if (t_fraction > 0.0001f)
+ {
+ np++;
+ }
+
+ // If we're sliced, the profile is open.
+ if ((end - begin)*ang_scale < 0.99f)
+ {
+ if (params.getHollow() <= 0)
+ {
+ // put center point if not hollow.
+ np++;
+ }
+ }
+
+ return np;
+}
+
// What is the bevel parameter used for? - DJS 04/05/02
// Bevel parameter is currently unused but presumedly would support
// filleted and chamfered corners
@@ -672,6 +737,117 @@ LLProfile::Face* LLProfile::addHole(const LLProfileParams& params, BOOL flat, F3
return face;
}
+//static
+S32 LLProfile::getNumPoints(const LLProfileParams& params, BOOL path_open,F32 detail, S32 split,
+ BOOL is_sculpted, S32 sculpt_size)
+{ // this is basically LLProfile::generate stripped down to only operations that influence the number of points
+ LLMemType m1(LLMemType::MTYPE_VOLUME);
+
+ if (detail < MIN_LOD)
+ {
+ detail = MIN_LOD;
+ }
+
+ // Generate the face data
+ F32 hollow = params.getHollow();
+
+ S32 np = 0;
+
+ switch (params.getCurveType() & LL_PCODE_PROFILE_MASK)
+ {
+ case LL_PCODE_PROFILE_SQUARE:
+ {
+ np = getNumNGonPoints(params, 4,-0.375, 0, 1, split);
+
+ if (hollow)
+ {
+ np *= 2;
+ }
+ }
+ break;
+ case LL_PCODE_PROFILE_ISOTRI:
+ case LL_PCODE_PROFILE_RIGHTTRI:
+ case LL_PCODE_PROFILE_EQUALTRI:
+ {
+ np = getNumNGonPoints(params, 3,0, 0, 1, split);
+
+ if (hollow)
+ {
+ np *= 2;
+ }
+ }
+ break;
+ case LL_PCODE_PROFILE_CIRCLE:
+ {
+ // If this has a square hollow, we should adjust the
+ // number of faces a bit so that the geometry lines up.
+ U8 hole_type=0;
+ F32 circle_detail = MIN_DETAIL_FACES * detail;
+ if (hollow)
+ {
+ hole_type = params.getCurveType() & LL_PCODE_HOLE_MASK;
+ if (hole_type == LL_PCODE_HOLE_SQUARE)
+ {
+ // Snap to the next multiple of four sides,
+ // so that corners line up.
+ circle_detail = llceil(circle_detail / 4.0f) * 4.0f;
+ }
+ }
+
+ S32 sides = (S32)circle_detail;
+
+ if (is_sculpted)
+ sides = sculpt_size;
+
+ np = getNumNGonPoints(params, sides);
+
+ if (hollow)
+ {
+ np *= 2;
+ }
+ }
+ break;
+ case LL_PCODE_PROFILE_CIRCLE_HALF:
+ {
+ // If this has a square hollow, we should adjust the
+ // number of faces a bit so that the geometry lines up.
+ U8 hole_type=0;
+ // Number of faces is cut in half because it's only a half-circle.
+ F32 circle_detail = MIN_DETAIL_FACES * detail * 0.5f;
+ if (hollow)
+ {
+ hole_type = params.getCurveType() & LL_PCODE_HOLE_MASK;
+ if (hole_type == LL_PCODE_HOLE_SQUARE)
+ {
+ // Snap to the next multiple of four sides (div 2),
+ // so that corners line up.
+ circle_detail = llceil(circle_detail / 2.0f) * 2.0f;
+ }
+ }
+ np = getNumNGonPoints(params, llfloor(circle_detail), 0.5f, 0.f, 0.5f);
+
+ if (hollow)
+ {
+ np *= 2;
+ }
+
+ // Special case for openness of sphere
+ if ((params.getEnd() - params.getBegin()) < 1.f)
+ {
+ }
+ else if (!hollow)
+ {
+ np++;
+ }
+ }
+ break;
+ default:
+ break;
+ };
+
+
+ return np;
+}
BOOL LLProfile::generate(const LLProfileParams& params, BOOL path_open,F32 detail, S32 split,
@@ -1133,6 +1309,32 @@ LLPath::~LLPath()
{
}
+S32 LLPath::getNumNGonPoints(const LLPathParams& params, S32 sides, F32 startOff, F32 end_scale, F32 twist_scale)
+{ //this is basically LLPath::genNGon stripped down to only operations that influence the number of points added
+ S32 ret = 0;
+
+ F32 step= 1.0f / sides;
+ F32 t = params.getBegin();
+ ret = 1;
+
+ t+=step;
+
+ // Snap to a quantized parameter, so that cut does not
+ // affect most sample points.
+ t = ((S32)(t * sides)) / (F32)sides;
+
+ // Run through the non-cut dependent points.
+ while (t < params.getEnd())
+ {
+ ret++;
+ t+=step;
+ }
+
+ ret++;
+
+ return ret;
+}
+
void LLPath::genNGon(const LLPathParams& params, S32 sides, F32 startOff, F32 end_scale, F32 twist_scale)
{
// Generates a circular path, starting at (1, 0, 0), counterclockwise along the xz plane.
@@ -1310,6 +1512,56 @@ const LLVector2 LLPathParams::getEndScale() const
return end_scale;
}
+S32 LLPath::getNumPoints(const LLPathParams& params, F32 detail)
+{ // this is basically LLPath::generate stripped down to only the operations that influence the number of points
+ LLMemType m1(LLMemType::MTYPE_VOLUME);
+
+ if (detail < MIN_LOD)
+ {
+ detail = MIN_LOD;
+ }
+
+ S32 np = 2; // hardcode for line
+
+ // Is this 0xf0 mask really necessary? DK 03/02/05
+
+ switch (params.getCurveType() & 0xf0)
+ {
+ default:
+ case LL_PCODE_PATH_LINE:
+ {
+ // Take the begin/end twist into account for detail.
+ np = llfloor(fabs(params.getTwistBegin() - params.getTwist()) * 3.5f * (detail-0.5f)) + 2;
+ }
+ break;
+
+ case LL_PCODE_PATH_CIRCLE:
+ {
+ // Increase the detail as the revolutions and twist increase.
+ F32 twist_mag = fabs(params.getTwistBegin() - params.getTwist());
+
+ S32 sides = (S32)llfloor(llfloor((MIN_DETAIL_FACES * detail + twist_mag * 3.5f * (detail-0.5f))) * params.getRevolutions());
+
+ np = sides;
+ }
+ break;
+
+ case LL_PCODE_PATH_CIRCLE2:
+ {
+ //genNGon(params, llfloor(MIN_DETAIL_FACES * detail), 4.f, 0.f);
+ np = getNumNGonPoints(params, llfloor(MIN_DETAIL_FACES * detail));
+ }
+ break;
+
+ case LL_PCODE_PATH_TEST:
+
+ np = 5;
+ break;
+ };
+
+ return np;
+}
+
BOOL LLPath::generate(const LLPathParams& params, F32 detail, S32 split,
BOOL is_sculpted, S32 sculpt_size)
{
@@ -2128,11 +2380,16 @@ bool LLVolumeFace::VertexData::operator==(const LLVolumeFace::VertexData& rhs)co
bool LLVolumeFace::VertexData::compareNormal(const LLVolumeFace::VertexData& rhs, F32 angle_cutoff) const
{
bool retval = false;
- if (rhs.mData[POSITION].equals3(mData[POSITION]) && rhs.mTexCoord == mTexCoord)
+
+ const F32 epsilon = 0.00001f;
+
+ if (rhs.mData[POSITION].equals3(mData[POSITION], epsilon) &&
+ fabs(rhs.mTexCoord[0]-mTexCoord[0]) < epsilon &&
+ fabs(rhs.mTexCoord[1]-mTexCoord[1]) < epsilon)
{
if (angle_cutoff > 1.f)
{
- retval = (mData[NORMAL].equals3(rhs.mData[NORMAL]));
+ retval = (mData[NORMAL].equals3(rhs.mData[NORMAL], epsilon));
}
else
{
@@ -2159,27 +2416,41 @@ bool LLVolume::unpackVolumeFaces(std::istream& is, S32 size)
U32 face_count = mdl.size();
if (face_count == 0)
- {
- llerrs << "WTF?" << llendl;
+ { //no faces unpacked, treat as failed decode
+ llwarns << "found no faces!" << llendl;
+ return false;
}
mVolumeFaces.resize(face_count);
for (U32 i = 0; i < face_count; ++i)
{
+ LLVolumeFace& face = mVolumeFaces[i];
+
+ if (mdl[i].has("NoGeometry"))
+ { //face has no geometry, continue
+ face.resizeIndices(3);
+ face.resizeVertices(1);
+ memset(face.mPositions, 0, sizeof(LLVector4a));
+ memset(face.mNormals, 0, sizeof(LLVector4a));
+ memset(face.mTexCoords, 0, sizeof(LLVector2));
+ memset(face.mIndices, 0, sizeof(U16)*3);
+ continue;
+ }
+
LLSD::Binary pos = mdl[i]["Position"];
LLSD::Binary norm = mdl[i]["Normal"];
LLSD::Binary tc = mdl[i]["TexCoord0"];
LLSD::Binary idx = mdl[i]["TriangleList"];
- LLVolumeFace& face = mVolumeFaces[i];
+
//copy out indices
face.resizeIndices(idx.size()/2);
if (idx.empty() || face.mNumIndices < 3)
{ //why is there an empty index list?
- llerrs <<"WTF?" << llendl;
+ llwarns <<"Empty face present!" << llendl;
continue;
}
@@ -2234,38 +2505,52 @@ bool LLVolume::unpackVolumeFaces(std::istream& is, S32 size)
}
{
- U16* n = (U16*) &(norm[0]);
- for (U32 j = 0; j < num_verts; ++j)
+ if (!norm.empty())
{
- norm_out->set((F32) n[0], (F32) n[1], (F32) n[2]);
- norm_out->div(65535.f);
- norm_out->mul(2.f);
- norm_out->sub(1.f);
- norm_out++;
- n += 3;
+ U16* n = (U16*) &(norm[0]);
+ for (U32 j = 0; j < num_verts; ++j)
+ {
+ norm_out->set((F32) n[0], (F32) n[1], (F32) n[2]);
+ norm_out->div(65535.f);
+ norm_out->mul(2.f);
+ norm_out->sub(1.f);
+ norm_out++;
+ n += 3;
+ }
+ }
+ else
+ {
+ memset(norm_out, 0, sizeof(LLVector4a)*num_verts);
}
}
{
- U16* t = (U16*) &(tc[0]);
- for (U32 j = 0; j < num_verts; j+=2)
+ if (!tc.empty())
{
- if (j < num_verts-1)
- {
- tc_out->set((F32) t[0], (F32) t[1], (F32) t[2], (F32) t[3]);
- }
- else
+ U16* t = (U16*) &(tc[0]);
+ for (U32 j = 0; j < num_verts; j+=2)
{
- tc_out->set((F32) t[0], (F32) t[1], 0.f, 0.f);
- }
+ if (j < num_verts-1)
+ {
+ tc_out->set((F32) t[0], (F32) t[1], (F32) t[2], (F32) t[3]);
+ }
+ else
+ {
+ tc_out->set((F32) t[0], (F32) t[1], 0.f, 0.f);
+ }
- t += 4;
+ t += 4;
- tc_out->div(65535.f);
- tc_out->mul(tc_range);
- tc_out->add(min_tc4);
+ tc_out->div(65535.f);
+ tc_out->mul(tc_range);
+ tc_out->add(min_tc4);
- tc_out++;
+ tc_out++;
+ }
+ }
+ else
+ {
+ memset(tc_out, 0, sizeof(LLVector2)*num_verts);
}
}
@@ -2377,14 +2662,39 @@ bool LLVolume::unpackVolumeFaces(std::istream& is, S32 size)
LLVector4a& min = face.mExtents[0];
LLVector4a& max = face.mExtents[1];
- min.clear();
- max.clear();
- min = max = face.mPositions[0];
-
- for (S32 i = 1; i < face.mNumVertices; ++i)
+ if (face.mNumVertices < 3)
+ { //empty face, use a dummy 1cm (at 1m scale) bounding box
+ min.splat(-0.005f);
+ max.splat(0.005f);
+ }
+ else
{
- min.setMin(min, face.mPositions[i]);
- max.setMax(max, face.mPositions[i]);
+ min = max = face.mPositions[0];
+
+ for (S32 i = 1; i < face.mNumVertices; ++i)
+ {
+ min.setMin(min, face.mPositions[i]);
+ max.setMax(max, face.mPositions[i]);
+ }
+
+ if (face.mTexCoords)
+ {
+ LLVector2& min_tc = face.mTexCoordExtents[0];
+ LLVector2& max_tc = face.mTexCoordExtents[1];
+
+ min_tc = face.mTexCoords[0];
+ max_tc = face.mTexCoords[0];
+
+ for (U32 j = 1; j < face.mNumVertices; ++j)
+ {
+ update_min_max(min_tc, max_tc, face.mTexCoords[j]);
+ }
+ }
+ else
+ {
+ face.mTexCoordExtents[0].set(0,0);
+ face.mTexCoordExtents[1].set(1,1);
+ }
}
}
}
@@ -2464,11 +2774,13 @@ void LLVolume::makeTetrahedron()
n[2] = cv[2].getNormal();
n += 3;
- tc[0] = cv[0].mTexCoord;
- tc[1] = cv[1].mTexCoord;
- tc[2] = cv[2].mTexCoord;
- tc += 3;
-
+ if(tc)
+ {
+ tc[0] = cv[0].mTexCoord;
+ tc[1] = cv[1].mTexCoord;
+ tc[2] = cv[2].mTexCoord;
+ tc += 3;
+ }
//side 2
cv[0].setPosition(p[3]);
@@ -2487,11 +2799,14 @@ void LLVolume::makeTetrahedron()
n[2] = cv[2].getNormal();
n += 3;
- tc[0] = cv[0].mTexCoord;
- tc[1] = cv[1].mTexCoord;
- tc[2] = cv[2].mTexCoord;
- tc += 3;
-
+ if(tc)
+ {
+ tc[0] = cv[0].mTexCoord;
+ tc[1] = cv[1].mTexCoord;
+ tc[2] = cv[2].mTexCoord;
+ tc += 3;
+ }
+
//side 3
cv[0].setPosition(p[3]);
cv[1].setPosition(p[1]);
@@ -2509,10 +2824,13 @@ void LLVolume::makeTetrahedron()
n[2] = cv[2].getNormal();
n += 3;
- tc[0] = cv[0].mTexCoord;
- tc[1] = cv[1].mTexCoord;
- tc[2] = cv[2].mTexCoord;
- tc += 3;
+ if(tc)
+ {
+ tc[0] = cv[0].mTexCoord;
+ tc[1] = cv[1].mTexCoord;
+ tc[2] = cv[2].mTexCoord;
+ tc += 3;
+ }
//side 4
cv[0].setPosition(p[2]);
@@ -2531,10 +2849,13 @@ void LLVolume::makeTetrahedron()
n[2] = cv[2].getNormal();
n += 3;
- tc[0] = cv[0].mTexCoord;
- tc[1] = cv[1].mTexCoord;
- tc[2] = cv[2].mTexCoord;
- tc += 3;
+ if(tc)
+ {
+ tc[0] = cv[0].mTexCoord;
+ tc[1] = cv[1].mTexCoord;
+ tc[2] = cv[2].mTexCoord;
+ tc += 3;
+ }
//set index buffer
for (U16 i = 0; i < 12; i++)
@@ -2980,7 +3301,11 @@ void LLVolume::sculpt(U16 sculpt_width, U16 sculpt_height, S8 sculpt_components,
// don't test lowest LOD to support legacy content DEV-33670
if (mDetail > SCULPT_MIN_AREA_DETAIL)
{
- if (sculptGetSurfaceArea() < SCULPT_MIN_AREA)
+ F32 area = sculptGetSurfaceArea();
+
+ const F32 SCULPT_MAX_AREA = 384.f;
+
+ if (area < SCULPT_MIN_AREA || area > SCULPT_MAX_AREA)
{
data_is_empty = TRUE;
}
@@ -4064,6 +4389,23 @@ S32 *LLVolume::getTriangleIndices(U32 &num_indices) const
return index;
}
+void LLVolume::getLoDTriangleCounts(const LLVolumeParams& params, S32* counts)
+{ //attempt to approximate the number of triangles that will result from generating a volume LoD set for the
+ //supplied LLVolumeParams -- inaccurate, but a close enough approximation for determining streaming cost
+ F32 detail[] = {1.f, 1.5f, 2.5f, 4.f};
+ for (S32 i = 0; i < 4; i++)
+ {
+ S32 count = 0;
+ S32 path_points = LLPath::getNumPoints(params.getPathParams(), detail[i]);
+ S32 profile_points = LLProfile::getNumPoints(params.getProfileParams(), false, detail[i]);
+
+ count = (profile_points-1)*2*(path_points-1);
+ count += profile_points*2;
+
+ counts[i] = count;
+ }
+}
+
S32 LLVolume::getNumTriangleIndices() const
{
BOOL profile_open = getProfile().isOpen();
@@ -5220,6 +5562,8 @@ LLVolumeFace::LLVolumeFace() :
mOctree(NULL)
{
mExtents = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*3);
+ mExtents[0].splat(-0.5f);
+ mExtents[1].splat(0.5f);
mCenter = mExtents+2;
}
@@ -5280,7 +5624,16 @@ LLVolumeFace& LLVolumeFace::operator=(const LLVolumeFace& src)
LLVector4a::memcpyNonAliased16((F32*) mPositions, (F32*) src.mPositions, vert_size);
LLVector4a::memcpyNonAliased16((F32*) mNormals, (F32*) src.mNormals, vert_size);
- LLVector4a::memcpyNonAliased16((F32*) mTexCoords, (F32*) src.mTexCoords, tc_size);
+
+ if(src.mTexCoords)
+ {
+ LLVector4a::memcpyNonAliased16((F32*) mTexCoords, (F32*) src.mTexCoords, tc_size);
+ }
+ else
+ {
+ ll_aligned_free_16(mTexCoords) ;
+ mTexCoords = NULL ;
+ }
if (src.mBinormals)
@@ -5402,8 +5755,23 @@ BOOL LLVolumeFace::create(LLVolume* volume, BOOL partial_build)
void LLVolumeFace::getVertexData(U16 index, LLVolumeFace::VertexData& cv)
{
cv.setPosition(mPositions[index]);
- cv.setNormal(mNormals[index]);
- cv.mTexCoord = mTexCoords[index];
+ if (mNormals)
+ {
+ cv.setNormal(mNormals[index]);
+ }
+ else
+ {
+ cv.getNormal().clear();
+ }
+
+ if (mTexCoords)
+ {
+ cv.mTexCoord = mTexCoords[index];
+ }
+ else
+ {
+ cv.mTexCoord.clear();
+ }
}
bool LLVolumeFace::VertexMapData::operator==(const LLVolumeFace::VertexData& rhs) const
@@ -5433,7 +5801,10 @@ void LLVolumeFace::optimize(F32 angle_cutoff)
LLVolumeFace new_face;
//map of points to vector of vertices at that point
- VertexMapData::PointMap point_map;
+ std::map<U64, std::vector<VertexMapData> > point_map;
+
+ LLVector4a range;
+ range.setSub(mExtents[1],mExtents[0]);
//remove redundant vertices
for (U32 i = 0; i < mNumIndices; ++i)
@@ -5444,7 +5815,19 @@ void LLVolumeFace::optimize(F32 angle_cutoff)
getVertexData(index, cv);
BOOL found = FALSE;
- VertexMapData::PointMap::iterator point_iter = point_map.find(LLVector3(cv.getPosition().getF32ptr()));
+
+ LLVector4a pos;
+ pos.setSub(mPositions[index], mExtents[0]);
+ pos.div(range);
+
+ U64 pos64 = 0;
+
+ pos64 = (U16) (pos[0]*65535);
+ pos64 = pos64 | (((U64) (pos[1]*65535)) << 16);
+ pos64 = pos64 | (((U64) (pos[2]*65535)) << 32);
+
+ std::map<U64, std::vector<VertexMapData> >::iterator point_iter = point_map.find(pos64);
+
if (point_iter != point_map.end())
{ //duplicate point might exist
for (U32 j = 0; j < point_iter->second.size(); ++j)
@@ -5476,11 +5859,26 @@ void LLVolumeFace::optimize(F32 angle_cutoff)
}
else
{
- point_map[LLVector3(d.getPosition().getF32ptr())].push_back(d);
+ point_map[pos64].push_back(d);
}
}
}
+ llassert(new_face.mNumIndices == mNumIndices);
+ llassert(new_face.mNumVertices <= mNumVertices);
+
+ if (angle_cutoff > 1.f && !mNormals)
+ {
+ ll_aligned_free_16(new_face.mNormals);
+ new_face.mNormals = NULL;
+ }
+
+ if (!mTexCoords)
+ {
+ ll_aligned_free_16(new_face.mTexCoords);
+ new_face.mTexCoords = NULL;
+ }
+
swapData(new_face);
}
@@ -5741,6 +6139,11 @@ void LLVolumeFace::cacheOptimize()
LLVCacheLRU cache;
+ if (mNumVertices < 3)
+ { //nothing to do
+ return;
+ }
+
//mapping of vertices to triangles and indices
std::vector<LLVCacheVertexData> vertex_data;
diff --git a/indra/llmath/llvolume.h b/indra/llmath/llvolume.h
index 01bfbd858b..f67f8f644d 100644
--- a/indra/llmath/llvolume.h
+++ b/indra/llmath/llvolume.h
@@ -690,6 +690,9 @@ public:
BOOL isFlat(S32 face) const { return (mFaces[face].mCount == 2); }
BOOL isOpen() const { return mOpen; }
void setDirty() { mDirty = TRUE; }
+
+ static S32 getNumPoints(const LLProfileParams& params, BOOL path_open, F32 detail = 1.0f, S32 split = 0,
+ BOOL is_sculpted = FALSE, S32 sculpt_size = 0);
BOOL generate(const LLProfileParams& params, BOOL path_open, F32 detail = 1.0f, S32 split = 0,
BOOL is_sculpted = FALSE, S32 sculpt_size = 0);
BOOL isConcave() const { return mConcave; }
@@ -714,6 +717,7 @@ public:
protected:
void genNormals(const LLProfileParams& params);
+ static S32 getNumNGonPoints(const LLProfileParams& params, S32 sides, F32 offset=0.0f, F32 bevel = 0.0f, F32 ang_scale = 1.f, S32 split = 0);
void genNGon(const LLProfileParams& params, S32 sides, F32 offset=0.0f, F32 bevel = 0.0f, F32 ang_scale = 1.f, S32 split = 0);
Face* addHole(const LLProfileParams& params, BOOL flat, F32 sides, F32 offset, F32 box_hollow, F32 ang_scale, S32 split = 0);
@@ -756,6 +760,9 @@ public:
virtual ~LLPath();
+ static S32 getNumPoints(const LLPathParams& params, F32 detail);
+ static S32 getNumNGonPoints(const LLPathParams& params, S32 sides, F32 offset=0.0f, F32 end_scale = 1.f, F32 twist_scale = 1.f);
+
void genNGon(const LLPathParams& params, S32 sides, F32 offset=0.0f, F32 end_scale = 1.f, F32 twist_scale = 1.f);
virtual BOOL generate(const LLPathParams& params, F32 detail=1.0f, S32 split = 0,
BOOL is_sculpted = FALSE, S32 sculpt_size = 0);
@@ -981,6 +988,7 @@ public:
// returns number of triangle indeces required for path/profile mesh
S32 getNumTriangleIndices() const;
+ static void getLoDTriangleCounts(const LLVolumeParams& params, S32* counts);
S32 getNumTriangles() const;
diff --git a/indra/llmessage/llcurl.cpp b/indra/llmessage/llcurl.cpp
index 7c8b7e3584..44330cf8ff 100644
--- a/indra/llmessage/llcurl.cpp
+++ b/indra/llmessage/llcurl.cpp
@@ -244,7 +244,7 @@ public:
U32 report(CURLcode);
void getTransferInfo(LLCurl::TransferInfo* info);
- void prepRequest(const std::string& url, const std::vector<std::string>& headers, ResponderPtr, bool post = false);
+ void prepRequest(const std::string& url, const std::vector<std::string>& headers, ResponderPtr, S32 time_out = 0, bool post = false);
const char* getErrorBuffer();
@@ -525,7 +525,7 @@ size_t curlHeaderCallback(void* data, size_t size, size_t nmemb, void* user_data
void LLCurl::Easy::prepRequest(const std::string& url,
const std::vector<std::string>& headers,
- ResponderPtr responder, bool post)
+ ResponderPtr responder, S32 time_out, bool post)
{
resetState();
@@ -558,7 +558,7 @@ void LLCurl::Easy::prepRequest(const std::string& url,
//don't verify host name so urls with scrubbed host names will work (improves DNS performance)
setopt(CURLOPT_SSL_VERIFYHOST, 0);
- setopt(CURLOPT_TIMEOUT, CURL_REQUEST_TIMEOUT);
+ setopt(CURLOPT_TIMEOUT, llmax(time_out, CURL_REQUEST_TIMEOUT));
setoptString(CURLOPT_URL, url);
@@ -855,14 +855,14 @@ bool LLCurlRequest::getByteRange(const std::string& url,
bool LLCurlRequest::post(const std::string& url,
const headers_t& headers,
const LLSD& data,
- LLCurl::ResponderPtr responder)
+ LLCurl::ResponderPtr responder, S32 time_out)
{
LLCurl::Easy* easy = allocEasy();
if (!easy)
{
return false;
}
- easy->prepRequest(url, headers, responder);
+ easy->prepRequest(url, headers, responder, time_out);
LLSDSerialize::toXML(data, easy->getInput());
S32 bytes = easy->getInput().str().length();
@@ -882,14 +882,14 @@ bool LLCurlRequest::post(const std::string& url,
bool LLCurlRequest::post(const std::string& url,
const headers_t& headers,
const std::string& data,
- LLCurl::ResponderPtr responder)
+ LLCurl::ResponderPtr responder, S32 time_out)
{
LLCurl::Easy* easy = allocEasy();
if (!easy)
{
return false;
}
- easy->prepRequest(url, headers, responder);
+ easy->prepRequest(url, headers, responder, time_out);
easy->getInput().write(data.data(), data.size());
S32 bytes = easy->getInput().str().length();
diff --git a/indra/llmessage/llcurl.h b/indra/llmessage/llcurl.h
index 4ce3fa1078..5833a27b84 100644
--- a/indra/llmessage/llcurl.h
+++ b/indra/llmessage/llcurl.h
@@ -201,8 +201,8 @@ public:
void get(const std::string& url, LLCurl::ResponderPtr responder);
bool getByteRange(const std::string& url, const headers_t& headers, S32 offset, S32 length, LLCurl::ResponderPtr responder);
- bool post(const std::string& url, const headers_t& headers, const LLSD& data, LLCurl::ResponderPtr responder);
- bool post(const std::string& url, const headers_t& headers, const std::string& data, LLCurl::ResponderPtr responder);
+ bool post(const std::string& url, const headers_t& headers, const LLSD& data, LLCurl::ResponderPtr responder, S32 time_out = 0);
+ bool post(const std::string& url, const headers_t& headers, const std::string& data, LLCurl::ResponderPtr responder, S32 time_out = 0);
S32 process();
S32 getQueued();
diff --git a/indra/llmessage/lldatapacker.h b/indra/llmessage/lldatapacker.h
index dd9c4eaa38..b0a638c16e 100644
--- a/indra/llmessage/lldatapacker.h
+++ b/indra/llmessage/lldatapacker.h
@@ -168,10 +168,15 @@ public:
S32 getCurrentSize() const { return (S32)(mCurBufferp - mBufferp); }
S32 getBufferSize() const { return mBufferSize; }
+ const U8* getBuffer() const { return mBufferp; }
void reset() { mCurBufferp = mBufferp; mWriteEnabled = (mCurBufferp != NULL); }
void freeBuffer() { delete [] mBufferp; mBufferp = mCurBufferp = NULL; mBufferSize = 0; mWriteEnabled = FALSE; }
void assignBuffer(U8 *bufferp, S32 size)
{
+ if(mBufferp && mBufferp != bufferp)
+ {
+ freeBuffer() ;
+ }
mBufferp = bufferp;
mCurBufferp = bufferp;
mBufferSize = size;
diff --git a/indra/llmessage/lliosocket.cpp b/indra/llmessage/lliosocket.cpp
index ca84fa8bb8..8c752fbe30 100644
--- a/indra/llmessage/lliosocket.cpp
+++ b/indra/llmessage/lliosocket.cpp
@@ -191,7 +191,7 @@ LLSocket::ptr_t LLSocket::create(apr_pool_t* pool, EType type, U16 port)
port = PORT_EPHEMERAL;
}
rv->mPort = port;
- rv->setOptions();
+ rv->setNonBlocking();
return rv;
}
@@ -206,7 +206,7 @@ LLSocket::ptr_t LLSocket::create(apr_socket_t* socket, apr_pool_t* pool)
}
rv = ptr_t(new LLSocket(socket, pool));
rv->mPort = PORT_EPHEMERAL;
- rv->setOptions();
+ rv->setNonBlocking();
return rv;
}
@@ -227,10 +227,10 @@ bool LLSocket::blockingConnect(const LLHost& host)
{
return false;
}
- apr_socket_timeout_set(mSocket, 1000);
+ setBlocking(1000);
ll_debug_socket("Blocking connect", mSocket);
if(ll_apr_warn_status(apr_socket_connect(mSocket, sa))) return false;
- setOptions();
+ setNonBlocking();
return true;
}
@@ -258,11 +258,27 @@ LLSocket::~LLSocket()
}
}
-void LLSocket::setOptions()
+// See http://dev.ariel-networks.com/apr/apr-tutorial/html/apr-tutorial-13.html#ss13.4
+// for an explanation of how to get non-blocking sockets and timeouts with
+// consistent behavior across platforms.
+
+void LLSocket::setBlocking(S32 timeout)
+{
+ LLMemType m1(LLMemType::MTYPE_IO_TCP);
+ // set up the socket options
+ ll_apr_warn_status(apr_socket_timeout_set(mSocket, timeout));
+ ll_apr_warn_status(apr_socket_opt_set(mSocket, APR_SO_NONBLOCK, 0));
+ ll_apr_warn_status(apr_socket_opt_set(mSocket, APR_SO_SNDBUF, LL_SEND_BUFFER_SIZE));
+ ll_apr_warn_status(apr_socket_opt_set(mSocket, APR_SO_RCVBUF, LL_RECV_BUFFER_SIZE));
+
+}
+
+void LLSocket::setNonBlocking()
{
LLMemType m1(LLMemType::MTYPE_IO_TCP);
// set up the socket options
ll_apr_warn_status(apr_socket_timeout_set(mSocket, 0));
+ ll_apr_warn_status(apr_socket_opt_set(mSocket, APR_SO_NONBLOCK, 1));
ll_apr_warn_status(apr_socket_opt_set(mSocket, APR_SO_SNDBUF, LL_SEND_BUFFER_SIZE));
ll_apr_warn_status(apr_socket_opt_set(mSocket, APR_SO_RCVBUF, LL_RECV_BUFFER_SIZE));
diff --git a/indra/llmessage/lliosocket.h b/indra/llmessage/lliosocket.h
index 6806e5084a..e0f6c1e34d 100644
--- a/indra/llmessage/lliosocket.h
+++ b/indra/llmessage/lliosocket.h
@@ -153,9 +153,16 @@ protected:
LLSocket(apr_socket_t* socket, apr_pool_t* pool);
/**
- * @brief Set default socket options.
+ * @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.
*/
- void setOptions();
+ void setBlocking(S32 timeout);
+
+ /**
+ * @brief Set default socket options, with SO_NONBLOCK = 1 and timeout = 0.
+ */
+ void setNonBlocking();
public:
/**
diff --git a/indra/llmessage/message_prehash.cpp b/indra/llmessage/message_prehash.cpp
index 5d03615e53..e71fb96540 100644
--- a/indra/llmessage/message_prehash.cpp
+++ b/indra/llmessage/message_prehash.cpp
@@ -742,6 +742,7 @@ char const* const _PREHASH_MoneyData = LLMessageStringTable::getInstance()->getS
char const* const _PREHASH_ObjectDeselect = LLMessageStringTable::getInstance()->getString("ObjectDeselect");
char const* const _PREHASH_NewAssetID = LLMessageStringTable::getInstance()->getString("NewAssetID");
char const* const _PREHASH_ObjectAdd = LLMessageStringTable::getInstance()->getString("ObjectAdd");
+char const* const _PREHASH_SimulatorFeatures = LLMessageStringTable::getInstance()->getString("SimulatorFeatures");
char const* const _PREHASH_RayEndIsIntersection = LLMessageStringTable::getInstance()->getString("RayEndIsIntersection");
char const* const _PREHASH_CompleteAuction = LLMessageStringTable::getInstance()->getString("CompleteAuction");
char const* const _PREHASH_CircuitCode = LLMessageStringTable::getInstance()->getString("CircuitCode");
@@ -1375,3 +1376,6 @@ char const* const _PREHASH_VCoord = LLMessageStringTable::getInstance()->getStri
char const* const _PREHASH_FaceIndex = LLMessageStringTable::getInstance()->getString("FaceIndex");
char const* const _PREHASH_StatusData = LLMessageStringTable::getInstance()->getString("StatusData");
char const* const _PREHASH_ProductSKU = LLMessageStringTable::getInstance()->getString("ProductSKU");
+char const* const _PREHASH_SeeAVs = LLMessageStringTable::getInstance()->getString("SeeAVs");
+char const* const _PREHASH_AnyAVSounds = LLMessageStringTable::getInstance()->getString("AnyAVSounds");
+char const* const _PREHASH_GroupAVSounds = LLMessageStringTable::getInstance()->getString("GroupAVSounds");
diff --git a/indra/llmessage/message_prehash.h b/indra/llmessage/message_prehash.h
index 8dc86601e6..dd2c2dbd64 100644
--- a/indra/llmessage/message_prehash.h
+++ b/indra/llmessage/message_prehash.h
@@ -742,6 +742,7 @@ extern char const* const _PREHASH_MoneyData;
extern char const* const _PREHASH_ObjectDeselect;
extern char const* const _PREHASH_NewAssetID;
extern char const* const _PREHASH_ObjectAdd;
+extern char const* const _PREHASH_SimulatorFeatures;
extern char const* const _PREHASH_RayEndIsIntersection;
extern char const* const _PREHASH_CompleteAuction;
extern char const* const _PREHASH_CircuitCode;
@@ -1375,4 +1376,7 @@ extern char const* const _PREHASH_VCoord;
extern char const* const _PREHASH_FaceIndex;
extern char const* const _PREHASH_StatusData;
extern char const* const _PREHASH_ProductSKU;
+extern char const* const _PREHASH_SeeAVs;
+extern char const* const _PREHASH_AnyAVSounds;
+extern char const* const _PREHASH_GroupAVSounds;
#endif
diff --git a/indra/llmessage/tests/commtest.h b/indra/llmessage/tests/commtest.h
index 0fef596df2..0d149b5258 100644
--- a/indra/llmessage/tests/commtest.h
+++ b/indra/llmessage/tests/commtest.h
@@ -34,6 +34,7 @@
#include "llsd.h"
#include "llhost.h"
#include "stringize.h"
+#include <map>
#include <string>
#include <stdexcept>
#include <boost/lexical_cast.hpp>
@@ -43,6 +44,58 @@ struct CommtestError: public std::runtime_error
CommtestError(const std::string& what): std::runtime_error(what) {}
};
+static bool query_verbose()
+{
+ const char* cbose = getenv("INTEGRATION_TEST_VERBOSE");
+ if (! cbose)
+ {
+ cbose = "1";
+ }
+ std::string strbose(cbose);
+ return (! (strbose == "0" || strbose == "off" ||
+ strbose == "false" || strbose == "quiet"));
+}
+
+bool verbose()
+{
+ // This should only be initialized once.
+ static bool vflag = query_verbose();
+ return vflag;
+}
+
+static int query_port(const std::string& var)
+{
+ const char* cport = getenv(var.c_str());
+ if (! cport)
+ {
+ throw CommtestError(STRINGIZE("missing environment variable" << var));
+ }
+ // This will throw, too, if the value of PORT isn't numeric.
+ int port(boost::lexical_cast<int>(cport));
+ if (verbose())
+ {
+ std::cout << "getport('" << var << "') = " << port << std::endl;
+ }
+ return port;
+}
+
+static int getport(const std::string& var)
+{
+ typedef std::map<std::string, int> portsmap;
+ static portsmap ports;
+ // We can do this with a single map lookup with map::insert(). Either it
+ // returns an existing entry and 'false' (not newly inserted), or it
+ // inserts the specified value and 'true'.
+ std::pair<portsmap::iterator, bool> inserted(ports.insert(portsmap::value_type(var, 0)));
+ if (inserted.second)
+ {
+ // We haven't yet seen this var. Remember its value.
+ inserted.first->second = query_port(var);
+ }
+ // Return the (existing or new) iterator's value.
+ return inserted.first->second;
+}
+
/**
* This struct is shared by a couple of standalone comm tests (ADD_COMM_BUILD_TEST).
*/
@@ -71,13 +124,10 @@ struct commtest_data
static int getport(const std::string& var)
{
- const char* port = getenv(var.c_str());
- if (! port)
- {
- throw CommtestError("missing $PORT environment variable");
- }
- // This will throw, too, if the value of PORT isn't numeric.
- return boost::lexical_cast<int>(port);
+ // We have a couple consumers of commtest_data::getport(). But we've
+ // since moved it out to the global namespace. So this is just a
+ // facade.
+ return ::getport(var);
}
bool outcome(const LLSD& _result, bool _success)
diff --git a/indra/llmessage/tests/test_llsdmessage_peer.py b/indra/llmessage/tests/test_llsdmessage_peer.py
index cea5032111..22edd9dad8 100644
--- a/indra/llmessage/tests/test_llsdmessage_peer.py
+++ b/indra/llmessage/tests/test_llsdmessage_peer.py
@@ -38,7 +38,7 @@ mydir = os.path.dirname(__file__) # expected to be .../indra/llmessage/tes
sys.path.insert(0, os.path.join(mydir, os.pardir, os.pardir, "lib", "python"))
from indra.util.fastest_elementtree import parse as xml_parse
from indra.base import llsd
-from testrunner import freeport, run, debug
+from testrunner import freeport, run, debug, VERBOSE
class TestHTTPRequestHandler(BaseHTTPRequestHandler):
"""This subclass of BaseHTTPRequestHandler is to receive and echo
@@ -72,10 +72,10 @@ class TestHTTPRequestHandler(BaseHTTPRequestHandler):
## # assuming that the underlying XML parser reads its input file
## # incrementally. Unfortunately I haven't been able to make it work.
## tree = xml_parse(self.rfile)
-## debug("Finished raw parse\n")
-## debug("parsed XML tree %s\n" % tree)
-## debug("parsed root node %s\n" % tree.getroot())
-## debug("root node tag %s\n" % tree.getroot().tag)
+## debug("Finished raw parse")
+## debug("parsed XML tree %s", tree)
+## debug("parsed root node %s", tree.getroot())
+## debug("root node tag %s", tree.getroot().tag)
## return llsd.to_python(tree.getroot())
def do_GET(self):
@@ -88,8 +88,10 @@ class TestHTTPRequestHandler(BaseHTTPRequestHandler):
self.answer(self.read_xml())
def answer(self, data):
+ debug("%s.answer(%s): self.path = %r", self.__class__.__name__, data, self.path)
if "fail" not in self.path:
response = llsd.format_xml(data.get("reply", llsd.LLSD("success")))
+ debug("success: %s", response)
self.send_response(200)
self.send_header("Content-type", "application/llsd+xml")
self.send_header("Content-Length", str(len(response)))
@@ -106,28 +108,39 @@ class TestHTTPRequestHandler(BaseHTTPRequestHandler):
("fail requested",
"Your request specified failure status %s "
"without providing a reason" % status))[1])
+ debug("fail requested: %s: %r", status, reason)
self.send_error(status, reason)
- def log_request(self, code, size=None):
- # For present purposes, we don't want the request splattered onto
- # stderr, as it would upset devs watching the test run
- pass
+ if not VERBOSE:
+ # When VERBOSE is set, skip both these overrides because they exist to
+ # suppress output.
- def log_error(self, format, *args):
- # Suppress error output as well
- pass
+ def log_request(self, code, size=None):
+ # For present purposes, we don't want the request splattered onto
+ # stderr, as it would upset devs watching the test run
+ pass
+
+ def log_error(self, format, *args):
+ # Suppress error output as well
+ pass
+
+class Server(HTTPServer):
+ # This pernicious flag is on by default in HTTPServer. But proper
+ # operation of freeport() absolutely depends on it being off.
+ allow_reuse_address = False
if __name__ == "__main__":
- # Instantiate an HTTPServer(TestHTTPRequestHandler) on the first free port
+ # Instantiate a Server(TestHTTPRequestHandler) on the first free port
# in the specified port range. Doing this inline is better than in a
# daemon thread: if it blows up here, we'll get a traceback. If it blew up
# in some other thread, the traceback would get eaten and we'd run the
# subject test program anyway.
httpd, port = freeport(xrange(8000, 8020),
- lambda port: HTTPServer(('127.0.0.1', port), TestHTTPRequestHandler))
+ lambda port: Server(('127.0.0.1', port), TestHTTPRequestHandler))
# Pass the selected port number to the subject test program via the
# environment. We don't want to impose requirements on the test program's
# command-line parsing -- and anyway, for C++ integration tests, that's
# performed in TUT code rather than our own.
os.environ["PORT"] = str(port)
+ debug("$PORT = %s", port)
sys.exit(run(server=Thread(name="httpd", target=httpd.serve_forever), *sys.argv[1:]))
diff --git a/indra/llmessage/tests/testrunner.py b/indra/llmessage/tests/testrunner.py
index 8ff13e0426..f2c841532a 100644
--- a/indra/llmessage/tests/testrunner.py
+++ b/indra/llmessage/tests/testrunner.py
@@ -27,16 +27,25 @@ Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
$/LicenseInfo$
"""
+from __future__ import with_statement
+
import os
import sys
+import re
import errno
import socket
-def debug(*args):
- sys.stdout.writelines(args)
- sys.stdout.flush()
-# comment out the line below to enable debug output
-debug = lambda *args: None
+VERBOSE = os.environ.get("INTEGRATION_TEST_VERBOSE", "1") # default to verbose
+# Support usage such as INTEGRATION_TEST_VERBOSE=off -- distressing to user if
+# that construct actually turns on verbosity...
+VERBOSE = not re.match(r"(0|off|false|quiet)$", VERBOSE, re.IGNORECASE)
+
+if VERBOSE:
+ def debug(fmt, *args):
+ print fmt % args
+ sys.stdout.flush()
+else:
+ debug = lambda *args: None
def freeport(portlist, expr):
"""
@@ -72,50 +81,64 @@ def freeport(portlist, expr):
Example:
+ class Server(HTTPServer):
+ # If you use BaseHTTPServer.HTTPServer, turning off this flag is
+ # essential for proper operation of freeport()!
+ allow_reuse_address = False
+ # ...
server, port = freeport(xrange(8000, 8010),
- lambda port: HTTPServer(("localhost", port),
- MyRequestHandler))
+ lambda port: Server(("localhost", port),
+ MyRequestHandler))
# pass 'port' to client code
# call server.serve_forever()
"""
- # If portlist is completely empty, let StopIteration propagate: that's an
- # error because we can't return meaningful values. We have no 'port',
- # therefore no 'expr(port)'.
- portiter = iter(portlist)
- port = portiter.next()
+ try:
+ # If portlist is completely empty, let StopIteration propagate: that's an
+ # error because we can't return meaningful values. We have no 'port',
+ # therefore no 'expr(port)'.
+ portiter = iter(portlist)
+ port = portiter.next()
- while True:
- try:
- # If this value of port works, return as promised.
- return expr(port), port
-
- except socket.error, err:
- # Anything other than 'Address already in use', propagate
- if err.args[0] != errno.EADDRINUSE:
- raise
-
- # Here we want the next port from portiter. But on StopIteration,
- # we want to raise the original exception rather than
- # StopIteration. So save the original exc_info().
- type, value, tb = sys.exc_info()
+ while True:
try:
+ # If this value of port works, return as promised.
+ value = expr(port)
+
+ except socket.error, err:
+ # Anything other than 'Address already in use', propagate
+ if err.args[0] != errno.EADDRINUSE:
+ raise
+
+ # Here we want the next port from portiter. But on StopIteration,
+ # we want to raise the original exception rather than
+ # StopIteration. So save the original exc_info().
+ type, value, tb = sys.exc_info()
try:
- port = portiter.next()
- except StopIteration:
- raise type, value, tb
- finally:
- # Clean up local traceback, see docs for sys.exc_info()
- del tb
-
- # Recap of the control flow above:
- # If expr(port) doesn't raise, return as promised.
- # If expr(port) raises anything but EADDRINUSE, propagate that
- # exception.
- # If portiter.next() raises StopIteration -- that is, if the port
- # value we just passed to expr(port) was the last available -- reraise
- # the EADDRINUSE exception.
- # If we've actually arrived at this point, portiter.next() delivered a
- # new port value. Loop back to pass that to expr(port).
+ try:
+ port = portiter.next()
+ except StopIteration:
+ raise type, value, tb
+ finally:
+ # Clean up local traceback, see docs for sys.exc_info()
+ del tb
+
+ else:
+ debug("freeport() returning %s on port %s", value, port)
+ return value, port
+
+ # Recap of the control flow above:
+ # If expr(port) doesn't raise, return as promised.
+ # If expr(port) raises anything but EADDRINUSE, propagate that
+ # exception.
+ # If portiter.next() raises StopIteration -- that is, if the port
+ # value we just passed to expr(port) was the last available -- reraise
+ # the EADDRINUSE exception.
+ # If we've actually arrived at this point, portiter.next() delivered a
+ # new port value. Loop back to pass that to expr(port).
+
+ except Exception, err:
+ debug("*** freeport() raising %s: %s", err.__class__.__name__, err)
+ raise
def run(*args, **kwds):
"""All positional arguments collectively form a command line, executed as
@@ -144,8 +167,96 @@ def run(*args, **kwds):
# - [no p] don't use the PATH because we specifically want to invoke the
# executable passed as our first arg,
# - [no e] child should inherit this process's environment.
- debug("Running %s...\n" % (" ".join(args)))
- sys.stdout.flush()
+ debug("Running %s...", " ".join(args))
rc = os.spawnv(os.P_WAIT, args[0], args)
- debug("%s returned %s\n" % (args[0], rc))
+ debug("%s returned %s", args[0], rc)
return rc
+
+# ****************************************************************************
+# test code -- manual at this point, see SWAT-564
+# ****************************************************************************
+def test_freeport():
+ # ------------------------------- Helpers --------------------------------
+ from contextlib import contextmanager
+ # helper Context Manager for expecting an exception
+ # with exc(SomeError):
+ # raise SomeError()
+ # raises AssertionError otherwise.
+ @contextmanager
+ def exc(exception_class, *args):
+ try:
+ yield
+ except exception_class, err:
+ for i, expected_arg in enumerate(args):
+ assert expected_arg == err.args[i], \
+ "Raised %s, but args[%s] is %r instead of %r" % \
+ (err.__class__.__name__, i, err.args[i], expected_arg)
+ print "Caught expected exception %s(%s)" % \
+ (err.__class__.__name__, ', '.join(repr(arg) for arg in err.args))
+ else:
+ assert False, "Failed to raise " + exception_class.__class__.__name__
+
+ # helper to raise specified exception
+ def raiser(exception):
+ raise exception
+
+ # the usual
+ def assert_equals(a, b):
+ assert a == b, "%r != %r" % (a, b)
+
+ # ------------------------ Sanity check the above ------------------------
+ class SomeError(Exception): pass
+ # Without extra args, accept any err.args value
+ with exc(SomeError):
+ raiser(SomeError("abc"))
+ # With extra args, accept only the specified value
+ with exc(SomeError, "abc"):
+ raiser(SomeError("abc"))
+ with exc(AssertionError):
+ with exc(SomeError, "abc"):
+ raiser(SomeError("def"))
+ with exc(AssertionError):
+ with exc(socket.error, errno.EADDRINUSE):
+ raiser(socket.error(errno.ECONNREFUSED, 'Connection refused'))
+
+ # ----------- freeport() without engaging socket functionality -----------
+ # If portlist is empty, freeport() raises StopIteration.
+ with exc(StopIteration):
+ freeport([], None)
+
+ assert_equals(freeport([17], str), ("17", 17))
+
+ # This is the magic exception that should prompt us to retry
+ inuse = socket.error(errno.EADDRINUSE, 'Address already in use')
+ # Get the iterator to our ports list so we can check later if we've used all
+ ports = iter(xrange(5))
+ with exc(socket.error, errno.EADDRINUSE):
+ freeport(ports, lambda port: raiser(inuse))
+ # did we entirely exhaust 'ports'?
+ with exc(StopIteration):
+ ports.next()
+
+ ports = iter(xrange(2))
+ # Any exception but EADDRINUSE should quit immediately
+ with exc(SomeError):
+ freeport(ports, lambda port: raiser(SomeError()))
+ assert_equals(ports.next(), 1)
+
+ # ----------- freeport() with platform-dependent socket stuff ------------
+ # This is what we should've had unit tests to begin with (see CHOP-661).
+ def newbind(port):
+ sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+ sock.bind(('127.0.0.1', port))
+ return sock
+
+ bound0, port0 = freeport(xrange(7777, 7780), newbind)
+ assert_equals(port0, 7777)
+ bound1, port1 = freeport(xrange(7777, 7780), newbind)
+ assert_equals(port1, 7778)
+ bound2, port2 = freeport(xrange(7777, 7780), newbind)
+ assert_equals(port2, 7779)
+ with exc(socket.error, errno.EADDRINUSE):
+ bound3, port3 = freeport(xrange(7777, 7780), newbind)
+
+if __name__ == "__main__":
+ test_freeport()
diff --git a/indra/llplugin/llpluginclassmedia.cpp b/indra/llplugin/llpluginclassmedia.cpp
index 2103216536..d3d0403bbb 100644
--- a/indra/llplugin/llpluginclassmedia.cpp
+++ b/indra/llplugin/llpluginclassmedia.cpp
@@ -1,1335 +1,1424 @@
-/**
- * @file llpluginclassmedia.cpp
- * @brief LLPluginClassMedia handles a plugin which knows about the "media" message class.
- *
- * @cond
- * $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$
- * @endcond
- */
-
-#include "linden_common.h"
-#include "indra_constants.h"
-
-#include "llpluginclassmedia.h"
-#include "llpluginmessageclasses.h"
-
-#include "llqtwebkit.h"
-
-static int LOW_PRIORITY_TEXTURE_SIZE_DEFAULT = 256;
-
-static int nextPowerOf2( int value )
-{
- int next_power_of_2 = 1;
- while ( next_power_of_2 < value )
- {
- next_power_of_2 <<= 1;
- }
-
- return next_power_of_2;
-}
-
-LLPluginClassMedia::LLPluginClassMedia(LLPluginClassMediaOwner *owner)
-{
- mOwner = owner;
- mPlugin = NULL;
- reset();
-
- //debug use
- mDeleteOK = true ;
-}
-
-
-LLPluginClassMedia::~LLPluginClassMedia()
-{
- llassert_always(mDeleteOK) ;
- reset();
-}
-
-bool LLPluginClassMedia::init(const std::string &launcher_filename, const std::string &plugin_dir, const std::string &plugin_filename, bool debug)
-{
- LL_DEBUGS("Plugin") << "launcher: " << launcher_filename << LL_ENDL;
- LL_DEBUGS("Plugin") << "dir: " << plugin_dir << LL_ENDL;
- LL_DEBUGS("Plugin") << "plugin: " << plugin_filename << LL_ENDL;
-
- mPlugin = new LLPluginProcessParent(this);
- mPlugin->setSleepTime(mSleepTime);
-
- // Queue up the media init message -- it will be sent after all the currently queued messages.
- LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "init");
- message.setValue("target", mTarget);
- sendMessage(message);
-
- mPlugin->init(launcher_filename, plugin_dir, plugin_filename, debug);
-
- return true;
-}
-
-
-void LLPluginClassMedia::reset()
-{
- if(mPlugin != NULL)
- {
- delete mPlugin;
- mPlugin = NULL;
- }
-
- mTextureParamsReceived = false;
- mRequestedTextureDepth = 0;
- mRequestedTextureInternalFormat = 0;
- mRequestedTextureFormat = 0;
- mRequestedTextureType = 0;
- mRequestedTextureSwapBytes = false;
- mRequestedTextureCoordsOpenGL = false;
- mTextureSharedMemorySize = 0;
- mTextureSharedMemoryName.clear();
- mDefaultMediaWidth = 0;
- mDefaultMediaHeight = 0;
- mNaturalMediaWidth = 0;
- mNaturalMediaHeight = 0;
- mSetMediaWidth = -1;
- mSetMediaHeight = -1;
- mRequestedMediaWidth = 0;
- mRequestedMediaHeight = 0;
- mRequestedTextureWidth = 0;
- mRequestedTextureHeight = 0;
- mFullMediaWidth = 0;
- mFullMediaHeight = 0;
- mTextureWidth = 0;
- mTextureHeight = 0;
- mMediaWidth = 0;
- mMediaHeight = 0;
- mDirtyRect = LLRect::null;
- mAutoScaleMedia = false;
- mRequestedVolume = 1.0f;
- mPriority = PRIORITY_NORMAL;
- mLowPrioritySizeLimit = LOW_PRIORITY_TEXTURE_SIZE_DEFAULT;
- mAllowDownsample = false;
- mPadding = 0;
- mLastMouseX = 0;
- mLastMouseY = 0;
- mStatus = LLPluginClassMediaOwner::MEDIA_NONE;
- mSleepTime = 1.0f / 100.0f;
- mCanCut = false;
- mCanCopy = false;
- mCanPaste = false;
- mMediaName.clear();
- mMediaDescription.clear();
- mBackgroundColor = LLColor4(1.0f, 1.0f, 1.0f, 1.0f);
-
- // media_browser class
- mNavigateURI.clear();
- mNavigateResultCode = -1;
- mNavigateResultString.clear();
- mHistoryBackAvailable = false;
- mHistoryForwardAvailable = false;
- mStatusText.clear();
- mProgressPercent = 0;
- mClickURL.clear();
- mClickNavType.clear();
- mClickTarget.clear();
- mClickUUID.clear();
- mStatusCode = 0;
-
- // media_time class
- mCurrentTime = 0.0f;
- mDuration = 0.0f;
- mCurrentRate = 0.0f;
- mLoadedDuration = 0.0f;
-}
-
-void LLPluginClassMedia::idle(void)
-{
- if(mPlugin)
- {
- mPlugin->idle();
- }
-
- if((mMediaWidth == -1) || (!mTextureParamsReceived) || (mPlugin == NULL) || (mPlugin->isBlocked()) || (mOwner == NULL))
- {
- // Can't process a size change at this time
- }
- else if((mRequestedMediaWidth != mMediaWidth) || (mRequestedMediaHeight != mMediaHeight))
- {
- // Calculate the correct size for the media texture
- mRequestedTextureHeight = mRequestedMediaHeight;
- if(mPadding < 0)
- {
- // negative values indicate the plugin wants a power of 2
- mRequestedTextureWidth = nextPowerOf2(mRequestedMediaWidth);
- }
- else
- {
- mRequestedTextureWidth = mRequestedMediaWidth;
-
- if(mPadding > 1)
- {
- // Pad up to a multiple of the specified number of bytes per row
- int rowbytes = mRequestedTextureWidth * mRequestedTextureDepth;
- int pad = rowbytes % mPadding;
- if(pad != 0)
- {
- rowbytes += mPadding - pad;
- }
-
- if(rowbytes % mRequestedTextureDepth == 0)
- {
- mRequestedTextureWidth = rowbytes / mRequestedTextureDepth;
- }
- else
- {
- LL_WARNS("Plugin") << "Unable to pad texture width, padding size " << mPadding << "is not a multiple of pixel size " << mRequestedTextureDepth << LL_ENDL;
- }
- }
- }
-
-
- // Size change has been requested but not initiated yet.
- size_t newsize = mRequestedTextureWidth * mRequestedTextureHeight * mRequestedTextureDepth;
-
- // Add an extra line for padding, just in case.
- newsize += mRequestedTextureWidth * mRequestedTextureDepth;
-
- if(newsize != mTextureSharedMemorySize)
- {
- if(!mTextureSharedMemoryName.empty())
- {
- // Tell the plugin to remove the old memory segment
- mPlugin->removeSharedMemory(mTextureSharedMemoryName);
- mTextureSharedMemoryName.clear();
- }
-
- mTextureSharedMemorySize = newsize;
- mTextureSharedMemoryName = mPlugin->addSharedMemory(mTextureSharedMemorySize);
- if(!mTextureSharedMemoryName.empty())
- {
- void *addr = mPlugin->getSharedMemoryAddress(mTextureSharedMemoryName);
-
- // clear texture memory to avoid random screen visual fuzz from uninitialized texture data
- memset( addr, 0x00, newsize );
-
- // We could do this to force an update, but textureValid() will still be returning false until the first roundtrip to the plugin,
- // so it may not be worthwhile.
- // mDirtyRect.setOriginAndSize(0, 0, mRequestedMediaWidth, mRequestedMediaHeight);
- }
- }
-
- // This is our local indicator that a change is in progress.
- mTextureWidth = -1;
- mTextureHeight = -1;
- mMediaWidth = -1;
- mMediaHeight = -1;
-
- // This invalidates any existing dirty rect.
- resetDirty();
-
- // Send a size change message to the plugin
- {
- LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "size_change");
- message.setValue("name", mTextureSharedMemoryName);
- message.setValueS32("width", mRequestedMediaWidth);
- message.setValueS32("height", mRequestedMediaHeight);
- message.setValueS32("texture_width", mRequestedTextureWidth);
- message.setValueS32("texture_height", mRequestedTextureHeight);
- message.setValueReal("background_r", mBackgroundColor.mV[VX]);
- message.setValueReal("background_g", mBackgroundColor.mV[VY]);
- message.setValueReal("background_b", mBackgroundColor.mV[VZ]);
- message.setValueReal("background_a", mBackgroundColor.mV[VW]);
- mPlugin->sendMessage(message); // DO NOT just use sendMessage() here -- we want this to jump ahead of the queue.
-
- LL_DEBUGS("Plugin") << "Sending size_change" << LL_ENDL;
- }
- }
-
- if(mPlugin && mPlugin->isRunning())
- {
- // Send queued messages
- while(!mSendQueue.empty())
- {
- LLPluginMessage message = mSendQueue.front();
- mSendQueue.pop();
- mPlugin->sendMessage(message);
- }
- }
-}
-
-int LLPluginClassMedia::getTextureWidth() const
-{
- return nextPowerOf2(mTextureWidth);
-}
-
-int LLPluginClassMedia::getTextureHeight() const
-{
- return nextPowerOf2(mTextureHeight);
-}
-
-unsigned char* LLPluginClassMedia::getBitsData()
-{
- unsigned char *result = NULL;
- if((mPlugin != NULL) && !mTextureSharedMemoryName.empty())
- {
- result = (unsigned char*)mPlugin->getSharedMemoryAddress(mTextureSharedMemoryName);
- }
- return result;
-}
-
-void LLPluginClassMedia::setSize(int width, int height)
-{
- if((width > 0) && (height > 0))
- {
- mSetMediaWidth = width;
- mSetMediaHeight = height;
- }
- else
- {
- mSetMediaWidth = -1;
- mSetMediaHeight = -1;
- }
-
- setSizeInternal();
-}
-
-void LLPluginClassMedia::setSizeInternal(void)
-{
- if((mSetMediaWidth > 0) && (mSetMediaHeight > 0))
- {
- mRequestedMediaWidth = mSetMediaWidth;
- mRequestedMediaHeight = mSetMediaHeight;
- }
- else if((mNaturalMediaWidth > 0) && (mNaturalMediaHeight > 0))
- {
- mRequestedMediaWidth = mNaturalMediaWidth;
- mRequestedMediaHeight = mNaturalMediaHeight;
- }
- else
- {
- mRequestedMediaWidth = mDefaultMediaWidth;
- mRequestedMediaHeight = mDefaultMediaHeight;
- }
-
- // Save these for size/interest calculations
- mFullMediaWidth = mRequestedMediaWidth;
- mFullMediaHeight = mRequestedMediaHeight;
-
- if(mAllowDownsample)
- {
- switch(mPriority)
- {
- case PRIORITY_SLIDESHOW:
- case PRIORITY_LOW:
- // Reduce maximum texture dimension to (or below) mLowPrioritySizeLimit
- while((mRequestedMediaWidth > mLowPrioritySizeLimit) || (mRequestedMediaHeight > mLowPrioritySizeLimit))
- {
- mRequestedMediaWidth /= 2;
- mRequestedMediaHeight /= 2;
- }
- break;
-
- default:
- // Don't adjust texture size
- break;
- }
- }
-
- if(mAutoScaleMedia)
- {
- mRequestedMediaWidth = nextPowerOf2(mRequestedMediaWidth);
- mRequestedMediaHeight = nextPowerOf2(mRequestedMediaHeight);
- }
-
- if(mRequestedMediaWidth > 2048)
- mRequestedMediaWidth = 2048;
-
- if(mRequestedMediaHeight > 2048)
- mRequestedMediaHeight = 2048;
-}
-
-void LLPluginClassMedia::setAutoScale(bool auto_scale)
-{
- if(auto_scale != mAutoScaleMedia)
- {
- mAutoScaleMedia = auto_scale;
- setSizeInternal();
- }
-}
-
-bool LLPluginClassMedia::textureValid(void)
-{
- if(
- !mTextureParamsReceived ||
- mTextureWidth <= 0 ||
- mTextureHeight <= 0 ||
- mMediaWidth <= 0 ||
- mMediaHeight <= 0 ||
- mRequestedMediaWidth != mMediaWidth ||
- mRequestedMediaHeight != mMediaHeight ||
- getBitsData() == NULL
- )
- return false;
-
- return true;
-}
-
-bool LLPluginClassMedia::getDirty(LLRect *dirty_rect)
-{
- bool result = !mDirtyRect.isEmpty();
-
- if(dirty_rect != NULL)
- {
- *dirty_rect = mDirtyRect;
- }
-
- return result;
-}
-
-void LLPluginClassMedia::resetDirty(void)
-{
- mDirtyRect = LLRect::null;
-}
-
-std::string LLPluginClassMedia::translateModifiers(MASK modifiers)
-{
- std::string result;
-
-
- if(modifiers & MASK_CONTROL)
- {
- result += "control|";
- }
-
- if(modifiers & MASK_ALT)
- {
- result += "alt|";
- }
-
- if(modifiers & MASK_SHIFT)
- {
- result += "shift|";
- }
-
- // TODO: should I deal with platform differences here or in callers?
- // TODO: how do we deal with the Mac "command" key?
-/*
- if(modifiers & MASK_SOMETHING)
- {
- result += "meta|";
- }
-*/
- return result;
-}
-
-void LLPluginClassMedia::mouseEvent(EMouseEventType type, int button, int x, int y, MASK modifiers)
-{
- if(type == MOUSE_EVENT_MOVE)
- {
- if(!mPlugin || !mPlugin->isRunning() || mPlugin->isBlocked())
- {
- // Don't queue up mouse move events that can't be delivered.
- return;
- }
-
- if((x == mLastMouseX) && (y == mLastMouseY))
- {
- // Don't spam unnecessary mouse move events.
- return;
- }
-
- mLastMouseX = x;
- mLastMouseY = y;
- }
-
- LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "mouse_event");
- std::string temp;
- switch(type)
- {
- case MOUSE_EVENT_DOWN: temp = "down"; break;
- case MOUSE_EVENT_UP: temp = "up"; break;
- case MOUSE_EVENT_MOVE: temp = "move"; break;
- case MOUSE_EVENT_DOUBLE_CLICK: temp = "double_click"; break;
- }
- message.setValue("event", temp);
-
- message.setValueS32("button", button);
-
- message.setValueS32("x", x);
-
- // Incoming coordinates are OpenGL-style ((0,0) = lower left), so flip them here if the plugin has requested it.
- if(!mRequestedTextureCoordsOpenGL)
- {
- // TODO: Should I use mMediaHeight or mRequestedMediaHeight here?
- y = mMediaHeight - y;
- }
- message.setValueS32("y", y);
-
- message.setValue("modifiers", translateModifiers(modifiers));
-
- sendMessage(message);
-}
-
-bool LLPluginClassMedia::keyEvent(EKeyEventType type, int key_code, MASK modifiers, LLSD native_key_data)
-{
- bool result = true;
-
- // FIXME:
- // HACK: we don't have an easy way to tell if the plugin is going to handle a particular keycode.
- // For now, return false for the ones the webkit plugin won't handle properly.
-
- switch(key_code)
- {
- case KEY_BACKSPACE:
- case KEY_TAB:
- case KEY_RETURN:
- case KEY_PAD_RETURN:
- case KEY_SHIFT:
- case KEY_CONTROL:
- case KEY_ALT:
- case KEY_CAPSLOCK:
- case KEY_ESCAPE:
- case KEY_PAGE_UP:
- case KEY_PAGE_DOWN:
- case KEY_END:
- case KEY_HOME:
- case KEY_LEFT:
- case KEY_UP:
- case KEY_RIGHT:
- case KEY_DOWN:
- case KEY_INSERT:
- case KEY_DELETE:
- // These will be handled
- break;
-
- default:
- // regular ASCII characters will also be handled
- if(key_code >= KEY_SPECIAL)
- {
- // Other "special" codes will not work properly.
- result = false;
- }
- break;
- }
-
-#if LL_DARWIN
- if(modifiers & MASK_ALT)
- {
- // Option-key modified characters should be handled by the unicode input path instead of this one.
- result = false;
- }
-#endif
-
- if(result)
- {
- LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "key_event");
- std::string temp;
- switch(type)
- {
- case KEY_EVENT_DOWN: temp = "down"; break;
- case KEY_EVENT_UP: temp = "up"; break;
- case KEY_EVENT_REPEAT: temp = "repeat"; break;
- }
- message.setValue("event", temp);
-
- message.setValueS32("key", key_code);
-
- message.setValue("modifiers", translateModifiers(modifiers));
- message.setValueLLSD("native_key_data", native_key_data);
-
- sendMessage(message);
- }
-
- return result;
-}
-
-void LLPluginClassMedia::scrollEvent(int x, int y, MASK modifiers)
-{
- LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "scroll_event");
-
- message.setValueS32("x", x);
- message.setValueS32("y", y);
- message.setValue("modifiers", translateModifiers(modifiers));
-
- sendMessage(message);
-}
-
-bool LLPluginClassMedia::textInput(const std::string &text, MASK modifiers, LLSD native_key_data)
-{
- LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "text_event");
-
- message.setValue("text", text);
- message.setValue("modifiers", translateModifiers(modifiers));
- message.setValueLLSD("native_key_data", native_key_data);
-
- sendMessage(message);
-
- return true;
-}
-
-void LLPluginClassMedia::loadURI(const std::string &uri)
-{
- LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "load_uri");
-
- message.setValue("uri", uri);
-
- sendMessage(message);
-}
-
-const char* LLPluginClassMedia::priorityToString(EPriority priority)
-{
- const char* result = "UNKNOWN";
- switch(priority)
- {
- case PRIORITY_UNLOADED: result = "unloaded"; break;
- case PRIORITY_STOPPED: result = "stopped"; break;
- case PRIORITY_HIDDEN: result = "hidden"; break;
- case PRIORITY_SLIDESHOW: result = "slideshow"; break;
- case PRIORITY_LOW: result = "low"; break;
- case PRIORITY_NORMAL: result = "normal"; break;
- case PRIORITY_HIGH: result = "high"; break;
- }
-
- return result;
-}
-
-void LLPluginClassMedia::setPriority(EPriority priority)
-{
- if(mPriority != priority)
- {
- mPriority = priority;
-
- LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "set_priority");
-
- std::string priority_string = priorityToString(priority);
- switch(priority)
- {
- case PRIORITY_UNLOADED:
- mSleepTime = 1.0f;
- break;
- case PRIORITY_STOPPED:
- mSleepTime = 1.0f;
- break;
- case PRIORITY_HIDDEN:
- mSleepTime = 1.0f;
- break;
- case PRIORITY_SLIDESHOW:
- mSleepTime = 1.0f;
- break;
- case PRIORITY_LOW:
- mSleepTime = 1.0f / 25.0f;
- break;
- case PRIORITY_NORMAL:
- mSleepTime = 1.0f / 50.0f;
- break;
- case PRIORITY_HIGH:
- mSleepTime = 1.0f / 100.0f;
- break;
- }
-
- message.setValue("priority", priority_string);
-
- sendMessage(message);
-
- if(mPlugin)
- {
- mPlugin->setSleepTime(mSleepTime);
- }
-
- LL_DEBUGS("PluginPriority") << this << ": setting priority to " << priority_string << LL_ENDL;
-
- // This may affect the calculated size, so recalculate it here.
- setSizeInternal();
- }
-}
-
-void LLPluginClassMedia::setLowPrioritySizeLimit(int size)
-{
- int power = nextPowerOf2(size);
- if(mLowPrioritySizeLimit != power)
- {
- mLowPrioritySizeLimit = power;
-
- // This may affect the calculated size, so recalculate it here.
- setSizeInternal();
- }
-}
-
-F64 LLPluginClassMedia::getCPUUsage()
-{
- F64 result = 0.0f;
-
- if(mPlugin)
- {
- result = mPlugin->getCPUUsage();
- }
-
- return result;
-}
-
-void LLPluginClassMedia::sendPickFileResponse(const std::string &file)
-{
- LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "pick_file_response");
- message.setValue("file", file);
- if(mPlugin && mPlugin->isBlocked())
- {
- // If the plugin sent a blocking pick-file request, the response should unblock it.
- message.setValueBoolean("blocking_response", true);
- }
- sendMessage(message);
-}
-
-void LLPluginClassMedia::sendAuthResponse(bool ok, const std::string &username, const std::string &password)
-{
- LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "auth_response");
- message.setValueBoolean("ok", ok);
- message.setValue("username", username);
- message.setValue("password", password);
- if(mPlugin && mPlugin->isBlocked())
- {
- // If the plugin sent a blocking pick-file request, the response should unblock it.
- message.setValueBoolean("blocking_response", true);
- }
- sendMessage(message);
-}
-
-void LLPluginClassMedia::cut()
-{
- LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "edit_cut");
- sendMessage(message);
-}
-
-void LLPluginClassMedia::copy()
-{
- LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "edit_copy");
- sendMessage(message);
-}
-
-void LLPluginClassMedia::paste()
-{
- LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "edit_paste");
- sendMessage(message);
-}
-
-void LLPluginClassMedia::setUserDataPath(const std::string &user_data_path)
-{
- LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "set_user_data_path");
- message.setValue("path", user_data_path);
- sendMessage(message);
-}
-
-void LLPluginClassMedia::setLanguageCode(const std::string &language_code)
-{
- LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "set_language_code");
- message.setValue("language", language_code);
- sendMessage(message);
-}
-
-void LLPluginClassMedia::setPluginsEnabled(const bool enabled)
-{
- LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "plugins_enabled");
- message.setValueBoolean("enable", enabled);
- sendMessage(message);
-}
-
-void LLPluginClassMedia::setJavascriptEnabled(const bool enabled)
-{
- LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "javascript_enabled");
- message.setValueBoolean("enable", enabled);
- sendMessage(message);
-}
-
-void LLPluginClassMedia::setTarget(const std::string &target)
-{
- mTarget = target;
-}
-
-/* virtual */
-void LLPluginClassMedia::receivePluginMessage(const LLPluginMessage &message)
-{
- std::string message_class = message.getClass();
-
- if(message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA)
- {
- std::string message_name = message.getName();
- if(message_name == "texture_params")
- {
- mRequestedTextureDepth = message.getValueS32("depth");
- mRequestedTextureInternalFormat = message.getValueU32("internalformat");
- mRequestedTextureFormat = message.getValueU32("format");
- mRequestedTextureType = message.getValueU32("type");
- mRequestedTextureSwapBytes = message.getValueBoolean("swap_bytes");
- mRequestedTextureCoordsOpenGL = message.getValueBoolean("coords_opengl");
-
- // These two are optional, and will default to 0 if they're not specified.
- mDefaultMediaWidth = message.getValueS32("default_width");
- mDefaultMediaHeight = message.getValueS32("default_height");
-
- mAllowDownsample = message.getValueBoolean("allow_downsample");
- mPadding = message.getValueS32("padding");
-
- setSizeInternal();
-
- mTextureParamsReceived = true;
- }
- else if(message_name == "updated")
- {
- if(message.hasValue("left"))
- {
- LLRect newDirtyRect;
- newDirtyRect.mLeft = message.getValueS32("left");
- newDirtyRect.mTop = message.getValueS32("top");
- newDirtyRect.mRight = message.getValueS32("right");
- newDirtyRect.mBottom = message.getValueS32("bottom");
-
- // The plugin is likely to have top and bottom switched, due to vertical flip and OpenGL coordinate confusion.
- // If they're backwards, swap them.
- if(newDirtyRect.mTop < newDirtyRect.mBottom)
- {
- S32 temp = newDirtyRect.mTop;
- newDirtyRect.mTop = newDirtyRect.mBottom;
- newDirtyRect.mBottom = temp;
- }
-
- if(mDirtyRect.isEmpty())
- {
- mDirtyRect = newDirtyRect;
- }
- else
- {
- mDirtyRect.unionWith(newDirtyRect);
- }
-
- LL_DEBUGS("Plugin") << "adjusted incoming rect is: ("
- << newDirtyRect.mLeft << ", "
- << newDirtyRect.mTop << ", "
- << newDirtyRect.mRight << ", "
- << newDirtyRect.mBottom << "), new dirty rect is: ("
- << mDirtyRect.mLeft << ", "
- << mDirtyRect.mTop << ", "
- << mDirtyRect.mRight << ", "
- << mDirtyRect.mBottom << ")"
- << LL_ENDL;
-
- mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_CONTENT_UPDATED);
- }
-
-
- bool time_duration_updated = false;
- int previous_percent = mProgressPercent;
-
- if(message.hasValue("current_time"))
- {
- mCurrentTime = message.getValueReal("current_time");
- time_duration_updated = true;
- }
- if(message.hasValue("duration"))
- {
- mDuration = message.getValueReal("duration");
- time_duration_updated = true;
- }
-
- if(message.hasValue("current_rate"))
- {
- mCurrentRate = message.getValueReal("current_rate");
- }
-
- if(message.hasValue("loaded_duration"))
- {
- mLoadedDuration = message.getValueReal("loaded_duration");
- time_duration_updated = true;
- }
- else
- {
- // If the message doesn't contain a loaded_duration param, assume it's equal to duration
- mLoadedDuration = mDuration;
- }
-
- // Calculate a percentage based on the loaded duration and total duration.
- if(mDuration != 0.0f) // Don't divide by zero.
- {
- mProgressPercent = (int)((mLoadedDuration * 100.0f)/mDuration);
- }
-
- if(time_duration_updated)
- {
- mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_TIME_DURATION_UPDATED);
- }
-
- if(previous_percent != mProgressPercent)
- {
- mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_PROGRESS_UPDATED);
- }
- }
- else if(message_name == "media_status")
- {
- std::string status = message.getValue("status");
-
- LL_DEBUGS("Plugin") << "Status changed to: " << status << LL_ENDL;
-
- if(status == "loading")
- {
- mStatus = LLPluginClassMediaOwner::MEDIA_LOADING;
- }
- else if(status == "loaded")
- {
- mStatus = LLPluginClassMediaOwner::MEDIA_LOADED;
- }
- else if(status == "error")
- {
- mStatus = LLPluginClassMediaOwner::MEDIA_ERROR;
- }
- else if(status == "playing")
- {
- mStatus = LLPluginClassMediaOwner::MEDIA_PLAYING;
- }
- else if(status == "paused")
- {
- mStatus = LLPluginClassMediaOwner::MEDIA_PAUSED;
- }
- else if(status == "done")
- {
- mStatus = LLPluginClassMediaOwner::MEDIA_DONE;
- }
- else
- {
- // empty string or any unknown string
- mStatus = LLPluginClassMediaOwner::MEDIA_NONE;
- }
- }
- else if(message_name == "size_change_request")
- {
- S32 width = message.getValueS32("width");
- S32 height = message.getValueS32("height");
- std::string name = message.getValue("name");
-
- // TODO: check that name matches?
- mNaturalMediaWidth = width;
- mNaturalMediaHeight = height;
-
- setSizeInternal();
- }
- else if(message_name == "size_change_response")
- {
- std::string name = message.getValue("name");
-
- // TODO: check that name matches?
-
- mTextureWidth = message.getValueS32("texture_width");
- mTextureHeight = message.getValueS32("texture_height");
- mMediaWidth = message.getValueS32("width");
- mMediaHeight = message.getValueS32("height");
-
- // This invalidates any existing dirty rect.
- resetDirty();
-
- // TODO: should we verify that the plugin sent back the right values?
- // Two size changes in a row may cause them to not match, due to queueing, etc.
-
- mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_SIZE_CHANGED);
- }
- else if(message_name == "cursor_changed")
- {
- mCursorName = message.getValue("name");
-
- mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_CURSOR_CHANGED);
- }
- else if(message_name == "edit_state")
- {
- if(message.hasValue("cut"))
- {
- mCanCut = message.getValueBoolean("cut");
- }
- if(message.hasValue("copy"))
- {
- mCanCopy = message.getValueBoolean("copy");
- }
- if(message.hasValue("paste"))
- {
- mCanPaste = message.getValueBoolean("paste");
- }
- }
- else if(message_name == "name_text")
- {
- mMediaName = message.getValue("name");
- mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_NAME_CHANGED);
- }
- else if(message_name == "pick_file")
- {
- mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_PICK_FILE_REQUEST);
- }
- else if(message_name == "auth_request")
- {
- mAuthURL = message.getValue("url");
- mAuthRealm = message.getValue("realm");
- mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_AUTH_REQUEST);
- }
- else
- {
- LL_WARNS("Plugin") << "Unknown " << message_name << " class message: " << message_name << LL_ENDL;
- }
- }
- else if(message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER)
- {
- std::string message_name = message.getName();
- if(message_name == "navigate_begin")
- {
- mNavigateURI = message.getValue("uri");
- mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_NAVIGATE_BEGIN);
- }
- else if(message_name == "navigate_complete")
- {
- mNavigateURI = message.getValue("uri");
- mNavigateResultCode = message.getValueS32("result_code");
- mNavigateResultString = message.getValue("result_string");
- mHistoryBackAvailable = message.getValueBoolean("history_back_available");
- mHistoryForwardAvailable = message.getValueBoolean("history_forward_available");
-
- mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_NAVIGATE_COMPLETE);
- }
- else if(message_name == "progress")
- {
- mProgressPercent = message.getValueS32("percent");
- mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_PROGRESS_UPDATED);
- }
- else if(message_name == "status_text")
- {
- mStatusText = message.getValue("status");
- mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_STATUS_TEXT_CHANGED);
- }
- else if(message_name == "location_changed")
- {
- mLocation = message.getValue("uri");
- mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_LOCATION_CHANGED);
- }
- else if(message_name == "click_href")
- {
- mClickURL = message.getValue("uri");
- mClickTarget = message.getValue("target");
- mClickUUID = message.getValue("uuid");
- mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_CLICK_LINK_HREF);
- }
- else if(message_name == "click_nofollow")
- {
- mClickURL = message.getValue("uri");
- mClickNavType = message.getValue("nav_type");
- mClickTarget.clear();
- mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_CLICK_LINK_NOFOLLOW);
- }
- else if(message_name == "navigate_error_page")
- {
- mStatusCode = message.getValueS32("status_code");
- mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_NAVIGATE_ERROR_PAGE);
- }
- else if(message_name == "cookie_set")
- {
- if(mOwner)
- {
- mOwner->handleCookieSet(this, message.getValue("cookie"));
- }
- }
- else if(message_name == "close_request")
- {
- mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_CLOSE_REQUEST);
- }
- else if(message_name == "geometry_change")
- {
- mClickUUID = message.getValue("uuid");
- mGeometryX = message.getValueS32("x");
- mGeometryY = message.getValueS32("y");
- mGeometryWidth = message.getValueS32("width");
- mGeometryHeight = message.getValueS32("height");
-
- mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_GEOMETRY_CHANGE);
- }
- else if(message_name == "link_hovered")
- {
- // text is not currently used -- the tooltip hover text is taken from the "title".
- mHoverLink = message.getValue("link");
- mHoverText = message.getValue("title");
- // message.getValue("text");
-
- mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_LINK_HOVERED);
- }
- else
- {
- LL_WARNS("Plugin") << "Unknown " << message_name << " class message: " << message_name << LL_ENDL;
- }
- }
- else if(message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA_TIME)
- {
- std::string message_name = message.getName();
-
- // This class hasn't defined any incoming messages yet.
-// if(message_name == "message_name")
-// {
-// }
-// else
- {
- LL_WARNS("Plugin") << "Unknown " << message_name << " class message: " << message_name << LL_ENDL;
- }
- }
-
-}
-
-/* virtual */
-void LLPluginClassMedia::pluginLaunchFailed()
-{
- mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_PLUGIN_FAILED_LAUNCH);
-}
-
-/* virtual */
-void LLPluginClassMedia::pluginDied()
-{
- mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_PLUGIN_FAILED);
-}
-
-void LLPluginClassMedia::mediaEvent(LLPluginClassMediaOwner::EMediaEvent event)
-{
- if(mOwner)
- {
- mOwner->handleMediaEvent(this, event);
- }
-}
-
-void LLPluginClassMedia::sendMessage(const LLPluginMessage &message)
-{
- if(mPlugin && mPlugin->isRunning())
- {
- mPlugin->sendMessage(message);
- }
- else
- {
- // The plugin isn't set up yet -- queue this message to be sent after initialization.
- mSendQueue.push(message);
- }
-}
-
-////////////////////////////////////////////////////////////
-// MARK: media_browser class functions
-bool LLPluginClassMedia::pluginSupportsMediaBrowser(void)
-{
- std::string version = mPlugin->getMessageClassVersion(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER);
- return !version.empty();
-}
-
-void LLPluginClassMedia::focus(bool focused)
-{
- LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "focus");
-
- message.setValueBoolean("focused", focused);
-
- sendMessage(message);
-}
-
-void LLPluginClassMedia::clear_cache()
-{
- LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "clear_cache");
- sendMessage(message);
-}
-
-void LLPluginClassMedia::clear_cookies()
-{
- LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "clear_cookies");
- sendMessage(message);
-}
-
-void LLPluginClassMedia::set_cookies(const std::string &cookies)
-{
- LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "set_cookies");
- message.setValue("cookies", cookies);
- sendMessage(message);
-}
-
-void LLPluginClassMedia::enable_cookies(bool enable)
-{
- LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "enable_cookies");
- message.setValueBoolean("enable", enable);
- sendMessage(message);
-}
-
-void LLPluginClassMedia::proxy_setup(bool enable, const std::string &host, int port)
-{
- LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "proxy_setup");
-
- message.setValueBoolean("enable", enable);
- message.setValue("host", host);
- message.setValueS32("port", port);
-
- sendMessage(message);
-}
-
-void LLPluginClassMedia::browse_stop()
-{
- LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "browse_stop");
- sendMessage(message);
-}
-
-void LLPluginClassMedia::browse_reload(bool ignore_cache)
-{
- LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "browse_reload");
-
- message.setValueBoolean("ignore_cache", ignore_cache);
-
- sendMessage(message);
-}
-
-void LLPluginClassMedia::browse_forward()
-{
- LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "browse_forward");
- sendMessage(message);
-}
-
-void LLPluginClassMedia::browse_back()
-{
- LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "browse_back");
- sendMessage(message);
-}
-
-void LLPluginClassMedia::setBrowserUserAgent(const std::string& user_agent)
-{
- LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "set_user_agent");
-
- message.setValue("user_agent", user_agent);
-
- sendMessage(message);
-}
-
-void LLPluginClassMedia::proxyWindowOpened(const std::string &target, const std::string &uuid)
-{
- LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "proxy_window_opened");
-
- message.setValue("target", target);
- message.setValue("uuid", uuid);
-
- sendMessage(message);
-}
-
-void LLPluginClassMedia::proxyWindowClosed(const std::string &uuid)
-{
- LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "proxy_window_closed");
-
- message.setValue("uuid", uuid);
-
- sendMessage(message);
-}
-
-void LLPluginClassMedia::ignore_ssl_cert_errors(bool ignore)
-{
- LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "ignore_ssl_cert_errors");
- message.setValueBoolean("ignore", ignore);
- sendMessage(message);
-}
-
-void LLPluginClassMedia::addCertificateFilePath(const std::string& path)
-{
- LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "add_certificate_file_path");
- message.setValue("path", path);
- sendMessage(message);
-}
-
-void LLPluginClassMedia::crashPlugin()
-{
- LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_INTERNAL, "crash");
-
- sendMessage(message);
-}
-
-void LLPluginClassMedia::hangPlugin()
-{
- LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_INTERNAL, "hang");
-
- sendMessage(message);
-}
-
-
-////////////////////////////////////////////////////////////
-// MARK: media_time class functions
-bool LLPluginClassMedia::pluginSupportsMediaTime(void)
-{
- std::string version = mPlugin->getMessageClassVersion(LLPLUGIN_MESSAGE_CLASS_MEDIA_TIME);
- return !version.empty();
-}
-
-void LLPluginClassMedia::stop()
-{
- LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_TIME, "stop");
- sendMessage(message);
-}
-
-void LLPluginClassMedia::start(float rate)
-{
- LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_TIME, "start");
-
- message.setValueReal("rate", rate);
-
- sendMessage(message);
-}
-
-void LLPluginClassMedia::pause()
-{
- LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_TIME, "pause");
- sendMessage(message);
-}
-
-void LLPluginClassMedia::seek(float time)
-{
- LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_TIME, "seek");
-
- message.setValueReal("time", time);
-
- sendMessage(message);
-}
-
-void LLPluginClassMedia::setLoop(bool loop)
-{
- LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_TIME, "set_loop");
-
- message.setValueBoolean("loop", loop);
-
- sendMessage(message);
-}
-
-void LLPluginClassMedia::setVolume(float volume)
-{
- if(volume != mRequestedVolume)
- {
- mRequestedVolume = volume;
-
- LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_TIME, "set_volume");
-
- message.setValueReal("volume", volume);
-
- sendMessage(message);
- }
-}
-
-float LLPluginClassMedia::getVolume()
-{
- return mRequestedVolume;
-}
-
-void LLPluginClassMedia::initializeUrlHistory(const LLSD& url_history)
-{
- // Send URL history to plugin
- LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "init_history");
- message.setValueLLSD("history", url_history);
- sendMessage(message);
-
- LL_DEBUGS("Plugin") << "Sending history" << LL_ENDL;
-}
-
+/**
+ * @file llpluginclassmedia.cpp
+ * @brief LLPluginClassMedia handles a plugin which knows about the "media" message class.
+ *
+ * @cond
+ * $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$
+ * @endcond
+ */
+
+#include "linden_common.h"
+#include "indra_constants.h"
+
+#include "llpluginclassmedia.h"
+#include "llpluginmessageclasses.h"
+
+#include "llqtwebkit.h"
+
+static int LOW_PRIORITY_TEXTURE_SIZE_DEFAULT = 256;
+
+static int nextPowerOf2( int value )
+{
+ int next_power_of_2 = 1;
+ while ( next_power_of_2 < value )
+ {
+ next_power_of_2 <<= 1;
+ }
+
+ return next_power_of_2;
+}
+
+LLPluginClassMedia::LLPluginClassMedia(LLPluginClassMediaOwner *owner)
+{
+ mOwner = owner;
+ mPlugin = NULL;
+ reset();
+
+ //debug use
+ mDeleteOK = true ;
+}
+
+
+LLPluginClassMedia::~LLPluginClassMedia()
+{
+ llassert_always(mDeleteOK) ;
+ reset();
+}
+
+bool LLPluginClassMedia::init(const std::string &launcher_filename, const std::string &plugin_dir, const std::string &plugin_filename, bool debug)
+{
+ LL_DEBUGS("Plugin") << "launcher: " << launcher_filename << LL_ENDL;
+ LL_DEBUGS("Plugin") << "dir: " << plugin_dir << LL_ENDL;
+ LL_DEBUGS("Plugin") << "plugin: " << plugin_filename << LL_ENDL;
+
+ mPlugin = new LLPluginProcessParent(this);
+ mPlugin->setSleepTime(mSleepTime);
+
+ // Queue up the media init message -- it will be sent after all the currently queued messages.
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "init");
+ message.setValue("target", mTarget);
+ sendMessage(message);
+
+ mPlugin->init(launcher_filename, plugin_dir, plugin_filename, debug);
+
+ return true;
+}
+
+
+void LLPluginClassMedia::reset()
+{
+ if(mPlugin != NULL)
+ {
+ delete mPlugin;
+ mPlugin = NULL;
+ }
+
+ mTextureParamsReceived = false;
+ mRequestedTextureDepth = 0;
+ mRequestedTextureInternalFormat = 0;
+ mRequestedTextureFormat = 0;
+ mRequestedTextureType = 0;
+ mRequestedTextureSwapBytes = false;
+ mRequestedTextureCoordsOpenGL = false;
+ mTextureSharedMemorySize = 0;
+ mTextureSharedMemoryName.clear();
+ mDefaultMediaWidth = 0;
+ mDefaultMediaHeight = 0;
+ mNaturalMediaWidth = 0;
+ mNaturalMediaHeight = 0;
+ mSetMediaWidth = -1;
+ mSetMediaHeight = -1;
+ mRequestedMediaWidth = 0;
+ mRequestedMediaHeight = 0;
+ mRequestedTextureWidth = 0;
+ mRequestedTextureHeight = 0;
+ mFullMediaWidth = 0;
+ mFullMediaHeight = 0;
+ mTextureWidth = 0;
+ mTextureHeight = 0;
+ mMediaWidth = 0;
+ mMediaHeight = 0;
+ mDirtyRect = LLRect::null;
+ mAutoScaleMedia = false;
+ mRequestedVolume = 1.0f;
+ mPriority = PRIORITY_NORMAL;
+ mLowPrioritySizeLimit = LOW_PRIORITY_TEXTURE_SIZE_DEFAULT;
+ mAllowDownsample = false;
+ mPadding = 0;
+ mLastMouseX = 0;
+ mLastMouseY = 0;
+ mStatus = LLPluginClassMediaOwner::MEDIA_NONE;
+ mSleepTime = 1.0f / 100.0f;
+ mCanCut = false;
+ mCanCopy = false;
+ mCanPaste = false;
+ mMediaName.clear();
+ mMediaDescription.clear();
+ mBackgroundColor = LLColor4(1.0f, 1.0f, 1.0f, 1.0f);
+
+ // media_browser class
+ mNavigateURI.clear();
+ mNavigateResultCode = -1;
+ mNavigateResultString.clear();
+ mHistoryBackAvailable = false;
+ mHistoryForwardAvailable = false;
+ mStatusText.clear();
+ mProgressPercent = 0;
+ mClickURL.clear();
+ mClickNavType.clear();
+ mClickTarget.clear();
+ mClickUUID.clear();
+ mStatusCode = 0;
+
+ // media_time class
+ mCurrentTime = 0.0f;
+ mDuration = 0.0f;
+ mCurrentRate = 0.0f;
+ mLoadedDuration = 0.0f;
+}
+
+void LLPluginClassMedia::idle(void)
+{
+ if(mPlugin)
+ {
+ mPlugin->idle();
+ }
+
+ if((mMediaWidth == -1) || (!mTextureParamsReceived) || (mPlugin == NULL) || (mPlugin->isBlocked()) || (mOwner == NULL))
+ {
+ // Can't process a size change at this time
+ }
+ else if((mRequestedMediaWidth != mMediaWidth) || (mRequestedMediaHeight != mMediaHeight))
+ {
+ // Calculate the correct size for the media texture
+ mRequestedTextureHeight = mRequestedMediaHeight;
+ if(mPadding < 0)
+ {
+ // negative values indicate the plugin wants a power of 2
+ mRequestedTextureWidth = nextPowerOf2(mRequestedMediaWidth);
+ }
+ else
+ {
+ mRequestedTextureWidth = mRequestedMediaWidth;
+
+ if(mPadding > 1)
+ {
+ // Pad up to a multiple of the specified number of bytes per row
+ int rowbytes = mRequestedTextureWidth * mRequestedTextureDepth;
+ int pad = rowbytes % mPadding;
+ if(pad != 0)
+ {
+ rowbytes += mPadding - pad;
+ }
+
+ if(rowbytes % mRequestedTextureDepth == 0)
+ {
+ mRequestedTextureWidth = rowbytes / mRequestedTextureDepth;
+ }
+ else
+ {
+ LL_WARNS("Plugin") << "Unable to pad texture width, padding size " << mPadding << "is not a multiple of pixel size " << mRequestedTextureDepth << LL_ENDL;
+ }
+ }
+ }
+
+
+ // Size change has been requested but not initiated yet.
+ size_t newsize = mRequestedTextureWidth * mRequestedTextureHeight * mRequestedTextureDepth;
+
+ // Add an extra line for padding, just in case.
+ newsize += mRequestedTextureWidth * mRequestedTextureDepth;
+
+ if(newsize != mTextureSharedMemorySize)
+ {
+ if(!mTextureSharedMemoryName.empty())
+ {
+ // Tell the plugin to remove the old memory segment
+ mPlugin->removeSharedMemory(mTextureSharedMemoryName);
+ mTextureSharedMemoryName.clear();
+ }
+
+ mTextureSharedMemorySize = newsize;
+ mTextureSharedMemoryName = mPlugin->addSharedMemory(mTextureSharedMemorySize);
+ if(!mTextureSharedMemoryName.empty())
+ {
+ void *addr = mPlugin->getSharedMemoryAddress(mTextureSharedMemoryName);
+
+ // clear texture memory to avoid random screen visual fuzz from uninitialized texture data
+ memset( addr, 0x00, newsize );
+
+ // We could do this to force an update, but textureValid() will still be returning false until the first roundtrip to the plugin,
+ // so it may not be worthwhile.
+ // mDirtyRect.setOriginAndSize(0, 0, mRequestedMediaWidth, mRequestedMediaHeight);
+ }
+ }
+
+ // This is our local indicator that a change is in progress.
+ mTextureWidth = -1;
+ mTextureHeight = -1;
+ mMediaWidth = -1;
+ mMediaHeight = -1;
+
+ // This invalidates any existing dirty rect.
+ resetDirty();
+
+ // Send a size change message to the plugin
+ {
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "size_change");
+ message.setValue("name", mTextureSharedMemoryName);
+ message.setValueS32("width", mRequestedMediaWidth);
+ message.setValueS32("height", mRequestedMediaHeight);
+ message.setValueS32("texture_width", mRequestedTextureWidth);
+ message.setValueS32("texture_height", mRequestedTextureHeight);
+ message.setValueReal("background_r", mBackgroundColor.mV[VX]);
+ message.setValueReal("background_g", mBackgroundColor.mV[VY]);
+ message.setValueReal("background_b", mBackgroundColor.mV[VZ]);
+ message.setValueReal("background_a", mBackgroundColor.mV[VW]);
+ mPlugin->sendMessage(message); // DO NOT just use sendMessage() here -- we want this to jump ahead of the queue.
+
+ LL_DEBUGS("Plugin") << "Sending size_change" << LL_ENDL;
+ }
+ }
+
+ if(mPlugin && mPlugin->isRunning())
+ {
+ // Send queued messages
+ while(!mSendQueue.empty())
+ {
+ LLPluginMessage message = mSendQueue.front();
+ mSendQueue.pop();
+ mPlugin->sendMessage(message);
+ }
+ }
+}
+
+int LLPluginClassMedia::getTextureWidth() const
+{
+ return nextPowerOf2(mTextureWidth);
+}
+
+int LLPluginClassMedia::getTextureHeight() const
+{
+ return nextPowerOf2(mTextureHeight);
+}
+
+unsigned char* LLPluginClassMedia::getBitsData()
+{
+ unsigned char *result = NULL;
+ if((mPlugin != NULL) && !mTextureSharedMemoryName.empty())
+ {
+ result = (unsigned char*)mPlugin->getSharedMemoryAddress(mTextureSharedMemoryName);
+ }
+ return result;
+}
+
+void LLPluginClassMedia::setSize(int width, int height)
+{
+ if((width > 0) && (height > 0))
+ {
+ mSetMediaWidth = width;
+ mSetMediaHeight = height;
+ }
+ else
+ {
+ mSetMediaWidth = -1;
+ mSetMediaHeight = -1;
+ }
+
+ setSizeInternal();
+}
+
+void LLPluginClassMedia::setSizeInternal(void)
+{
+ if((mSetMediaWidth > 0) && (mSetMediaHeight > 0))
+ {
+ mRequestedMediaWidth = mSetMediaWidth;
+ mRequestedMediaHeight = mSetMediaHeight;
+ }
+ else if((mNaturalMediaWidth > 0) && (mNaturalMediaHeight > 0))
+ {
+ mRequestedMediaWidth = mNaturalMediaWidth;
+ mRequestedMediaHeight = mNaturalMediaHeight;
+ }
+ else
+ {
+ mRequestedMediaWidth = mDefaultMediaWidth;
+ mRequestedMediaHeight = mDefaultMediaHeight;
+ }
+
+ // Save these for size/interest calculations
+ mFullMediaWidth = mRequestedMediaWidth;
+ mFullMediaHeight = mRequestedMediaHeight;
+
+ if(mAllowDownsample)
+ {
+ switch(mPriority)
+ {
+ case PRIORITY_SLIDESHOW:
+ case PRIORITY_LOW:
+ // Reduce maximum texture dimension to (or below) mLowPrioritySizeLimit
+ while((mRequestedMediaWidth > mLowPrioritySizeLimit) || (mRequestedMediaHeight > mLowPrioritySizeLimit))
+ {
+ mRequestedMediaWidth /= 2;
+ mRequestedMediaHeight /= 2;
+ }
+ break;
+
+ default:
+ // Don't adjust texture size
+ break;
+ }
+ }
+
+ if(mAutoScaleMedia)
+ {
+ mRequestedMediaWidth = nextPowerOf2(mRequestedMediaWidth);
+ mRequestedMediaHeight = nextPowerOf2(mRequestedMediaHeight);
+ }
+
+ if(mRequestedMediaWidth > 2048)
+ mRequestedMediaWidth = 2048;
+
+ if(mRequestedMediaHeight > 2048)
+ mRequestedMediaHeight = 2048;
+}
+
+void LLPluginClassMedia::setAutoScale(bool auto_scale)
+{
+ if(auto_scale != mAutoScaleMedia)
+ {
+ mAutoScaleMedia = auto_scale;
+ setSizeInternal();
+ }
+}
+
+bool LLPluginClassMedia::textureValid(void)
+{
+ if(
+ !mTextureParamsReceived ||
+ mTextureWidth <= 0 ||
+ mTextureHeight <= 0 ||
+ mMediaWidth <= 0 ||
+ mMediaHeight <= 0 ||
+ mRequestedMediaWidth != mMediaWidth ||
+ mRequestedMediaHeight != mMediaHeight ||
+ getBitsData() == NULL
+ )
+ return false;
+
+ return true;
+}
+
+bool LLPluginClassMedia::getDirty(LLRect *dirty_rect)
+{
+ bool result = !mDirtyRect.isEmpty();
+
+ if(dirty_rect != NULL)
+ {
+ *dirty_rect = mDirtyRect;
+ }
+
+ return result;
+}
+
+void LLPluginClassMedia::resetDirty(void)
+{
+ mDirtyRect = LLRect::null;
+}
+
+std::string LLPluginClassMedia::translateModifiers(MASK modifiers)
+{
+ std::string result;
+
+
+ if(modifiers & MASK_CONTROL)
+ {
+ result += "control|";
+ }
+
+ if(modifiers & MASK_ALT)
+ {
+ result += "alt|";
+ }
+
+ if(modifiers & MASK_SHIFT)
+ {
+ result += "shift|";
+ }
+
+ // TODO: should I deal with platform differences here or in callers?
+ // TODO: how do we deal with the Mac "command" key?
+/*
+ if(modifiers & MASK_SOMETHING)
+ {
+ result += "meta|";
+ }
+*/
+ return result;
+}
+
+void LLPluginClassMedia::jsEnableObject( bool enable )
+{
+ if( ! mPlugin || !mPlugin->isRunning() || mPlugin->isBlocked() )
+ {
+ return;
+ }
+
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "js_enable_object");
+ message.setValueBoolean( "enable", enable );
+ sendMessage( message );
+}
+
+void LLPluginClassMedia::jsAgentLocationEvent( double x, double y, double z )
+{
+ if( ! mPlugin || !mPlugin->isRunning() || mPlugin->isBlocked() )
+ {
+ return;
+ }
+
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "js_agent_location");
+ message.setValueReal( "x", x );
+ message.setValueReal( "y", y );
+ message.setValueReal( "z", z );
+ sendMessage( message );
+}
+
+void LLPluginClassMedia::jsAgentGlobalLocationEvent( double x, double y, double z )
+{
+ if( ! mPlugin || !mPlugin->isRunning() || mPlugin->isBlocked() )
+ {
+ return;
+ }
+
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "js_agent_global_location");
+ message.setValueReal( "x", x );
+ message.setValueReal( "y", y );
+ message.setValueReal( "z", z );
+ sendMessage( message );
+}
+
+void LLPluginClassMedia::jsAgentOrientationEvent( double angle )
+{
+ if( ! mPlugin || !mPlugin->isRunning() || mPlugin->isBlocked() )
+ {
+ return;
+ }
+
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "js_agent_orientation");
+ message.setValueReal( "angle", angle );
+
+ sendMessage( message );
+}
+
+void LLPluginClassMedia::jsAgentLanguageEvent( const std::string& language )
+{
+ if( ! mPlugin || !mPlugin->isRunning() || mPlugin->isBlocked() )
+ {
+ return;
+ }
+
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "js_agent_language");
+ message.setValue( "language", language );
+ sendMessage( message );
+}
+
+void LLPluginClassMedia::jsAgentRegionEvent( const std::string& region )
+{
+ if( ! mPlugin || !mPlugin->isRunning() || mPlugin->isBlocked() )
+ {
+ return;
+ }
+
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "js_agent_region");
+ message.setValue( "region", region );
+ sendMessage( message );
+}
+
+void LLPluginClassMedia::jsAgentMaturityEvent( const std::string& maturity )
+{
+ if( ! mPlugin || !mPlugin->isRunning() || mPlugin->isBlocked() )
+ {
+ return;
+ }
+
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "js_agent_maturity");
+ message.setValue( "maturity", maturity );
+ sendMessage( message );
+}
+
+void LLPluginClassMedia::mouseEvent(EMouseEventType type, int button, int x, int y, MASK modifiers)
+{
+ if(type == MOUSE_EVENT_MOVE)
+ {
+ if(!mPlugin || !mPlugin->isRunning() || mPlugin->isBlocked())
+ {
+ // Don't queue up mouse move events that can't be delivered.
+ return;
+ }
+
+ if((x == mLastMouseX) && (y == mLastMouseY))
+ {
+ // Don't spam unnecessary mouse move events.
+ return;
+ }
+
+ mLastMouseX = x;
+ mLastMouseY = y;
+ }
+
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "mouse_event");
+ std::string temp;
+ switch(type)
+ {
+ case MOUSE_EVENT_DOWN: temp = "down"; break;
+ case MOUSE_EVENT_UP: temp = "up"; break;
+ case MOUSE_EVENT_MOVE: temp = "move"; break;
+ case MOUSE_EVENT_DOUBLE_CLICK: temp = "double_click"; break;
+ }
+ message.setValue("event", temp);
+
+ message.setValueS32("button", button);
+
+ message.setValueS32("x", x);
+
+ // Incoming coordinates are OpenGL-style ((0,0) = lower left), so flip them here if the plugin has requested it.
+ if(!mRequestedTextureCoordsOpenGL)
+ {
+ // TODO: Should I use mMediaHeight or mRequestedMediaHeight here?
+ y = mMediaHeight - y;
+ }
+ message.setValueS32("y", y);
+
+ message.setValue("modifiers", translateModifiers(modifiers));
+
+ sendMessage(message);
+}
+
+bool LLPluginClassMedia::keyEvent(EKeyEventType type, int key_code, MASK modifiers, LLSD native_key_data)
+{
+ bool result = true;
+
+ // FIXME:
+ // HACK: we don't have an easy way to tell if the plugin is going to handle a particular keycode.
+ // For now, return false for the ones the webkit plugin won't handle properly.
+
+ switch(key_code)
+ {
+ case KEY_BACKSPACE:
+ case KEY_TAB:
+ case KEY_RETURN:
+ case KEY_PAD_RETURN:
+ case KEY_SHIFT:
+ case KEY_CONTROL:
+ case KEY_ALT:
+ case KEY_CAPSLOCK:
+ case KEY_ESCAPE:
+ case KEY_PAGE_UP:
+ case KEY_PAGE_DOWN:
+ case KEY_END:
+ case KEY_HOME:
+ case KEY_LEFT:
+ case KEY_UP:
+ case KEY_RIGHT:
+ case KEY_DOWN:
+ case KEY_INSERT:
+ case KEY_DELETE:
+ // These will be handled
+ break;
+
+ default:
+ // regular ASCII characters will also be handled
+ if(key_code >= KEY_SPECIAL)
+ {
+ // Other "special" codes will not work properly.
+ result = false;
+ }
+ break;
+ }
+
+#if LL_DARWIN
+ if(modifiers & MASK_ALT)
+ {
+ // Option-key modified characters should be handled by the unicode input path instead of this one.
+ result = false;
+ }
+#endif
+
+ if(result)
+ {
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "key_event");
+ std::string temp;
+ switch(type)
+ {
+ case KEY_EVENT_DOWN: temp = "down"; break;
+ case KEY_EVENT_UP: temp = "up"; break;
+ case KEY_EVENT_REPEAT: temp = "repeat"; break;
+ }
+ message.setValue("event", temp);
+
+ message.setValueS32("key", key_code);
+
+ message.setValue("modifiers", translateModifiers(modifiers));
+ message.setValueLLSD("native_key_data", native_key_data);
+
+ sendMessage(message);
+ }
+
+ return result;
+}
+
+void LLPluginClassMedia::scrollEvent(int x, int y, MASK modifiers)
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "scroll_event");
+
+ message.setValueS32("x", x);
+ message.setValueS32("y", y);
+ message.setValue("modifiers", translateModifiers(modifiers));
+
+ sendMessage(message);
+}
+
+bool LLPluginClassMedia::textInput(const std::string &text, MASK modifiers, LLSD native_key_data)
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "text_event");
+
+ message.setValue("text", text);
+ message.setValue("modifiers", translateModifiers(modifiers));
+ message.setValueLLSD("native_key_data", native_key_data);
+
+ sendMessage(message);
+
+ return true;
+}
+
+void LLPluginClassMedia::loadURI(const std::string &uri)
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "load_uri");
+
+ message.setValue("uri", uri);
+
+ sendMessage(message);
+}
+
+const char* LLPluginClassMedia::priorityToString(EPriority priority)
+{
+ const char* result = "UNKNOWN";
+ switch(priority)
+ {
+ case PRIORITY_UNLOADED: result = "unloaded"; break;
+ case PRIORITY_STOPPED: result = "stopped"; break;
+ case PRIORITY_HIDDEN: result = "hidden"; break;
+ case PRIORITY_SLIDESHOW: result = "slideshow"; break;
+ case PRIORITY_LOW: result = "low"; break;
+ case PRIORITY_NORMAL: result = "normal"; break;
+ case PRIORITY_HIGH: result = "high"; break;
+ }
+
+ return result;
+}
+
+void LLPluginClassMedia::setPriority(EPriority priority)
+{
+ if(mPriority != priority)
+ {
+ mPriority = priority;
+
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "set_priority");
+
+ std::string priority_string = priorityToString(priority);
+ switch(priority)
+ {
+ case PRIORITY_UNLOADED:
+ mSleepTime = 1.0f;
+ break;
+ case PRIORITY_STOPPED:
+ mSleepTime = 1.0f;
+ break;
+ case PRIORITY_HIDDEN:
+ mSleepTime = 1.0f;
+ break;
+ case PRIORITY_SLIDESHOW:
+ mSleepTime = 1.0f;
+ break;
+ case PRIORITY_LOW:
+ mSleepTime = 1.0f / 25.0f;
+ break;
+ case PRIORITY_NORMAL:
+ mSleepTime = 1.0f / 50.0f;
+ break;
+ case PRIORITY_HIGH:
+ mSleepTime = 1.0f / 100.0f;
+ break;
+ }
+
+ message.setValue("priority", priority_string);
+
+ sendMessage(message);
+
+ if(mPlugin)
+ {
+ mPlugin->setSleepTime(mSleepTime);
+ }
+
+ LL_DEBUGS("PluginPriority") << this << ": setting priority to " << priority_string << LL_ENDL;
+
+ // This may affect the calculated size, so recalculate it here.
+ setSizeInternal();
+ }
+}
+
+void LLPluginClassMedia::setLowPrioritySizeLimit(int size)
+{
+ int power = nextPowerOf2(size);
+ if(mLowPrioritySizeLimit != power)
+ {
+ mLowPrioritySizeLimit = power;
+
+ // This may affect the calculated size, so recalculate it here.
+ setSizeInternal();
+ }
+}
+
+F64 LLPluginClassMedia::getCPUUsage()
+{
+ F64 result = 0.0f;
+
+ if(mPlugin)
+ {
+ result = mPlugin->getCPUUsage();
+ }
+
+ return result;
+}
+
+void LLPluginClassMedia::sendPickFileResponse(const std::string &file)
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "pick_file_response");
+ message.setValue("file", file);
+ if(mPlugin && mPlugin->isBlocked())
+ {
+ // If the plugin sent a blocking pick-file request, the response should unblock it.
+ message.setValueBoolean("blocking_response", true);
+ }
+ sendMessage(message);
+}
+
+void LLPluginClassMedia::sendAuthResponse(bool ok, const std::string &username, const std::string &password)
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "auth_response");
+ message.setValueBoolean("ok", ok);
+ message.setValue("username", username);
+ message.setValue("password", password);
+ if(mPlugin && mPlugin->isBlocked())
+ {
+ // If the plugin sent a blocking pick-file request, the response should unblock it.
+ message.setValueBoolean("blocking_response", true);
+ }
+ sendMessage(message);
+}
+
+void LLPluginClassMedia::cut()
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "edit_cut");
+ sendMessage(message);
+}
+
+void LLPluginClassMedia::copy()
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "edit_copy");
+ sendMessage(message);
+}
+
+void LLPluginClassMedia::paste()
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "edit_paste");
+ sendMessage(message);
+}
+
+void LLPluginClassMedia::setUserDataPath(const std::string &user_data_path)
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "set_user_data_path");
+ message.setValue("path", user_data_path);
+ sendMessage(message);
+}
+
+void LLPluginClassMedia::setLanguageCode(const std::string &language_code)
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "set_language_code");
+ message.setValue("language", language_code);
+ sendMessage(message);
+}
+
+void LLPluginClassMedia::setPluginsEnabled(const bool enabled)
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "plugins_enabled");
+ message.setValueBoolean("enable", enabled);
+ sendMessage(message);
+}
+
+void LLPluginClassMedia::setJavascriptEnabled(const bool enabled)
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "javascript_enabled");
+ message.setValueBoolean("enable", enabled);
+ sendMessage(message);
+}
+
+void LLPluginClassMedia::setTarget(const std::string &target)
+{
+ mTarget = target;
+}
+
+/* virtual */
+void LLPluginClassMedia::receivePluginMessage(const LLPluginMessage &message)
+{
+ std::string message_class = message.getClass();
+
+ if(message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA)
+ {
+ std::string message_name = message.getName();
+ if(message_name == "texture_params")
+ {
+ mRequestedTextureDepth = message.getValueS32("depth");
+ mRequestedTextureInternalFormat = message.getValueU32("internalformat");
+ mRequestedTextureFormat = message.getValueU32("format");
+ mRequestedTextureType = message.getValueU32("type");
+ mRequestedTextureSwapBytes = message.getValueBoolean("swap_bytes");
+ mRequestedTextureCoordsOpenGL = message.getValueBoolean("coords_opengl");
+
+ // These two are optional, and will default to 0 if they're not specified.
+ mDefaultMediaWidth = message.getValueS32("default_width");
+ mDefaultMediaHeight = message.getValueS32("default_height");
+
+ mAllowDownsample = message.getValueBoolean("allow_downsample");
+ mPadding = message.getValueS32("padding");
+
+ setSizeInternal();
+
+ mTextureParamsReceived = true;
+ }
+ else if(message_name == "updated")
+ {
+ if(message.hasValue("left"))
+ {
+ LLRect newDirtyRect;
+ newDirtyRect.mLeft = message.getValueS32("left");
+ newDirtyRect.mTop = message.getValueS32("top");
+ newDirtyRect.mRight = message.getValueS32("right");
+ newDirtyRect.mBottom = message.getValueS32("bottom");
+
+ // The plugin is likely to have top and bottom switched, due to vertical flip and OpenGL coordinate confusion.
+ // If they're backwards, swap them.
+ if(newDirtyRect.mTop < newDirtyRect.mBottom)
+ {
+ S32 temp = newDirtyRect.mTop;
+ newDirtyRect.mTop = newDirtyRect.mBottom;
+ newDirtyRect.mBottom = temp;
+ }
+
+ if(mDirtyRect.isEmpty())
+ {
+ mDirtyRect = newDirtyRect;
+ }
+ else
+ {
+ mDirtyRect.unionWith(newDirtyRect);
+ }
+
+ LL_DEBUGS("Plugin") << "adjusted incoming rect is: ("
+ << newDirtyRect.mLeft << ", "
+ << newDirtyRect.mTop << ", "
+ << newDirtyRect.mRight << ", "
+ << newDirtyRect.mBottom << "), new dirty rect is: ("
+ << mDirtyRect.mLeft << ", "
+ << mDirtyRect.mTop << ", "
+ << mDirtyRect.mRight << ", "
+ << mDirtyRect.mBottom << ")"
+ << LL_ENDL;
+
+ mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_CONTENT_UPDATED);
+ }
+
+
+ bool time_duration_updated = false;
+ int previous_percent = mProgressPercent;
+
+ if(message.hasValue("current_time"))
+ {
+ mCurrentTime = message.getValueReal("current_time");
+ time_duration_updated = true;
+ }
+ if(message.hasValue("duration"))
+ {
+ mDuration = message.getValueReal("duration");
+ time_duration_updated = true;
+ }
+
+ if(message.hasValue("current_rate"))
+ {
+ mCurrentRate = message.getValueReal("current_rate");
+ }
+
+ if(message.hasValue("loaded_duration"))
+ {
+ mLoadedDuration = message.getValueReal("loaded_duration");
+ time_duration_updated = true;
+ }
+ else
+ {
+ // If the message doesn't contain a loaded_duration param, assume it's equal to duration
+ mLoadedDuration = mDuration;
+ }
+
+ // Calculate a percentage based on the loaded duration and total duration.
+ if(mDuration != 0.0f) // Don't divide by zero.
+ {
+ mProgressPercent = (int)((mLoadedDuration * 100.0f)/mDuration);
+ }
+
+ if(time_duration_updated)
+ {
+ mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_TIME_DURATION_UPDATED);
+ }
+
+ if(previous_percent != mProgressPercent)
+ {
+ mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_PROGRESS_UPDATED);
+ }
+ }
+ else if(message_name == "media_status")
+ {
+ std::string status = message.getValue("status");
+
+ LL_DEBUGS("Plugin") << "Status changed to: " << status << LL_ENDL;
+
+ if(status == "loading")
+ {
+ mStatus = LLPluginClassMediaOwner::MEDIA_LOADING;
+ }
+ else if(status == "loaded")
+ {
+ mStatus = LLPluginClassMediaOwner::MEDIA_LOADED;
+ }
+ else if(status == "error")
+ {
+ mStatus = LLPluginClassMediaOwner::MEDIA_ERROR;
+ }
+ else if(status == "playing")
+ {
+ mStatus = LLPluginClassMediaOwner::MEDIA_PLAYING;
+ }
+ else if(status == "paused")
+ {
+ mStatus = LLPluginClassMediaOwner::MEDIA_PAUSED;
+ }
+ else if(status == "done")
+ {
+ mStatus = LLPluginClassMediaOwner::MEDIA_DONE;
+ }
+ else
+ {
+ // empty string or any unknown string
+ mStatus = LLPluginClassMediaOwner::MEDIA_NONE;
+ }
+ }
+ else if(message_name == "size_change_request")
+ {
+ S32 width = message.getValueS32("width");
+ S32 height = message.getValueS32("height");
+ std::string name = message.getValue("name");
+
+ // TODO: check that name matches?
+ mNaturalMediaWidth = width;
+ mNaturalMediaHeight = height;
+
+ setSizeInternal();
+ }
+ else if(message_name == "size_change_response")
+ {
+ std::string name = message.getValue("name");
+
+ // TODO: check that name matches?
+
+ mTextureWidth = message.getValueS32("texture_width");
+ mTextureHeight = message.getValueS32("texture_height");
+ mMediaWidth = message.getValueS32("width");
+ mMediaHeight = message.getValueS32("height");
+
+ // This invalidates any existing dirty rect.
+ resetDirty();
+
+ // TODO: should we verify that the plugin sent back the right values?
+ // Two size changes in a row may cause them to not match, due to queueing, etc.
+
+ mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_SIZE_CHANGED);
+ }
+ else if(message_name == "cursor_changed")
+ {
+ mCursorName = message.getValue("name");
+
+ mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_CURSOR_CHANGED);
+ }
+ else if(message_name == "edit_state")
+ {
+ if(message.hasValue("cut"))
+ {
+ mCanCut = message.getValueBoolean("cut");
+ }
+ if(message.hasValue("copy"))
+ {
+ mCanCopy = message.getValueBoolean("copy");
+ }
+ if(message.hasValue("paste"))
+ {
+ mCanPaste = message.getValueBoolean("paste");
+ }
+ }
+ else if(message_name == "name_text")
+ {
+ mMediaName = message.getValue("name");
+ mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_NAME_CHANGED);
+ }
+ else if(message_name == "pick_file")
+ {
+ mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_PICK_FILE_REQUEST);
+ }
+ else if(message_name == "auth_request")
+ {
+ mAuthURL = message.getValue("url");
+ mAuthRealm = message.getValue("realm");
+ mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_AUTH_REQUEST);
+ }
+ else
+ {
+ LL_WARNS("Plugin") << "Unknown " << message_name << " class message: " << message_name << LL_ENDL;
+ }
+ }
+ else if(message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER)
+ {
+ std::string message_name = message.getName();
+ if(message_name == "navigate_begin")
+ {
+ mNavigateURI = message.getValue("uri");
+ mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_NAVIGATE_BEGIN);
+ }
+ else if(message_name == "navigate_complete")
+ {
+ mNavigateURI = message.getValue("uri");
+ mNavigateResultCode = message.getValueS32("result_code");
+ mNavigateResultString = message.getValue("result_string");
+ mHistoryBackAvailable = message.getValueBoolean("history_back_available");
+ mHistoryForwardAvailable = message.getValueBoolean("history_forward_available");
+
+ mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_NAVIGATE_COMPLETE);
+ }
+ else if(message_name == "progress")
+ {
+ mProgressPercent = message.getValueS32("percent");
+ mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_PROGRESS_UPDATED);
+ }
+ else if(message_name == "status_text")
+ {
+ mStatusText = message.getValue("status");
+ mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_STATUS_TEXT_CHANGED);
+ }
+ else if(message_name == "location_changed")
+ {
+ mLocation = message.getValue("uri");
+ mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_LOCATION_CHANGED);
+ }
+ else if(message_name == "click_href")
+ {
+ mClickURL = message.getValue("uri");
+ mClickTarget = message.getValue("target");
+ mClickUUID = message.getValue("uuid");
+ mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_CLICK_LINK_HREF);
+ }
+ else if(message_name == "click_nofollow")
+ {
+ mClickURL = message.getValue("uri");
+ mClickNavType = message.getValue("nav_type");
+ mClickTarget.clear();
+ mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_CLICK_LINK_NOFOLLOW);
+ }
+ else if(message_name == "navigate_error_page")
+ {
+ mStatusCode = message.getValueS32("status_code");
+ mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_NAVIGATE_ERROR_PAGE);
+ }
+ else if(message_name == "cookie_set")
+ {
+ if(mOwner)
+ {
+ mOwner->handleCookieSet(this, message.getValue("cookie"));
+ }
+ }
+ else if(message_name == "close_request")
+ {
+ mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_CLOSE_REQUEST);
+ }
+ else if(message_name == "geometry_change")
+ {
+ mClickUUID = message.getValue("uuid");
+ mGeometryX = message.getValueS32("x");
+ mGeometryY = message.getValueS32("y");
+ mGeometryWidth = message.getValueS32("width");
+ mGeometryHeight = message.getValueS32("height");
+
+ mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_GEOMETRY_CHANGE);
+ }
+ else if(message_name == "link_hovered")
+ {
+ // text is not currently used -- the tooltip hover text is taken from the "title".
+ mHoverLink = message.getValue("link");
+ mHoverText = message.getValue("title");
+ // message.getValue("text");
+
+ mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_LINK_HOVERED);
+ }
+ else
+ {
+ LL_WARNS("Plugin") << "Unknown " << message_name << " class message: " << message_name << LL_ENDL;
+ }
+ }
+ else if(message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA_TIME)
+ {
+ std::string message_name = message.getName();
+
+ // This class hasn't defined any incoming messages yet.
+// if(message_name == "message_name")
+// {
+// }
+// else
+ {
+ LL_WARNS("Plugin") << "Unknown " << message_name << " class message: " << message_name << LL_ENDL;
+ }
+ }
+
+}
+
+/* virtual */
+void LLPluginClassMedia::pluginLaunchFailed()
+{
+ mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_PLUGIN_FAILED_LAUNCH);
+}
+
+/* virtual */
+void LLPluginClassMedia::pluginDied()
+{
+ mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_PLUGIN_FAILED);
+}
+
+void LLPluginClassMedia::mediaEvent(LLPluginClassMediaOwner::EMediaEvent event)
+{
+ if(mOwner)
+ {
+ mOwner->handleMediaEvent(this, event);
+ }
+}
+
+void LLPluginClassMedia::sendMessage(const LLPluginMessage &message)
+{
+ if(mPlugin && mPlugin->isRunning())
+ {
+ mPlugin->sendMessage(message);
+ }
+ else
+ {
+ // The plugin isn't set up yet -- queue this message to be sent after initialization.
+ mSendQueue.push(message);
+ }
+}
+
+////////////////////////////////////////////////////////////
+// MARK: media_browser class functions
+bool LLPluginClassMedia::pluginSupportsMediaBrowser(void)
+{
+ std::string version = mPlugin->getMessageClassVersion(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER);
+ return !version.empty();
+}
+
+void LLPluginClassMedia::focus(bool focused)
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "focus");
+
+ message.setValueBoolean("focused", focused);
+
+ sendMessage(message);
+}
+
+void LLPluginClassMedia::clear_cache()
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "clear_cache");
+ sendMessage(message);
+}
+
+void LLPluginClassMedia::clear_cookies()
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "clear_cookies");
+ sendMessage(message);
+}
+
+void LLPluginClassMedia::set_cookies(const std::string &cookies)
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "set_cookies");
+ message.setValue("cookies", cookies);
+ sendMessage(message);
+}
+
+void LLPluginClassMedia::enable_cookies(bool enable)
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "enable_cookies");
+ message.setValueBoolean("enable", enable);
+ sendMessage(message);
+}
+
+void LLPluginClassMedia::proxy_setup(bool enable, const std::string &host, int port)
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "proxy_setup");
+
+ message.setValueBoolean("enable", enable);
+ message.setValue("host", host);
+ message.setValueS32("port", port);
+
+ sendMessage(message);
+}
+
+void LLPluginClassMedia::browse_stop()
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "browse_stop");
+ sendMessage(message);
+}
+
+void LLPluginClassMedia::browse_reload(bool ignore_cache)
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "browse_reload");
+
+ message.setValueBoolean("ignore_cache", ignore_cache);
+
+ sendMessage(message);
+}
+
+void LLPluginClassMedia::browse_forward()
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "browse_forward");
+ sendMessage(message);
+}
+
+void LLPluginClassMedia::browse_back()
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "browse_back");
+ sendMessage(message);
+}
+
+void LLPluginClassMedia::setBrowserUserAgent(const std::string& user_agent)
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "set_user_agent");
+
+ message.setValue("user_agent", user_agent);
+
+ sendMessage(message);
+}
+
+void LLPluginClassMedia::proxyWindowOpened(const std::string &target, const std::string &uuid)
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "proxy_window_opened");
+
+ message.setValue("target", target);
+ message.setValue("uuid", uuid);
+
+ sendMessage(message);
+}
+
+void LLPluginClassMedia::proxyWindowClosed(const std::string &uuid)
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "proxy_window_closed");
+
+ message.setValue("uuid", uuid);
+
+ sendMessage(message);
+}
+
+void LLPluginClassMedia::ignore_ssl_cert_errors(bool ignore)
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "ignore_ssl_cert_errors");
+ message.setValueBoolean("ignore", ignore);
+ sendMessage(message);
+}
+
+void LLPluginClassMedia::addCertificateFilePath(const std::string& path)
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "add_certificate_file_path");
+ message.setValue("path", path);
+ sendMessage(message);
+}
+
+void LLPluginClassMedia::crashPlugin()
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_INTERNAL, "crash");
+
+ sendMessage(message);
+}
+
+void LLPluginClassMedia::hangPlugin()
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_INTERNAL, "hang");
+
+ sendMessage(message);
+}
+
+
+////////////////////////////////////////////////////////////
+// MARK: media_time class functions
+bool LLPluginClassMedia::pluginSupportsMediaTime(void)
+{
+ std::string version = mPlugin->getMessageClassVersion(LLPLUGIN_MESSAGE_CLASS_MEDIA_TIME);
+ return !version.empty();
+}
+
+void LLPluginClassMedia::stop()
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_TIME, "stop");
+ sendMessage(message);
+}
+
+void LLPluginClassMedia::start(float rate)
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_TIME, "start");
+
+ message.setValueReal("rate", rate);
+
+ sendMessage(message);
+}
+
+void LLPluginClassMedia::pause()
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_TIME, "pause");
+ sendMessage(message);
+}
+
+void LLPluginClassMedia::seek(float time)
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_TIME, "seek");
+
+ message.setValueReal("time", time);
+
+ sendMessage(message);
+}
+
+void LLPluginClassMedia::setLoop(bool loop)
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_TIME, "set_loop");
+
+ message.setValueBoolean("loop", loop);
+
+ sendMessage(message);
+}
+
+void LLPluginClassMedia::setVolume(float volume)
+{
+ if(volume != mRequestedVolume)
+ {
+ mRequestedVolume = volume;
+
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_TIME, "set_volume");
+
+ message.setValueReal("volume", volume);
+
+ sendMessage(message);
+ }
+}
+
+float LLPluginClassMedia::getVolume()
+{
+ return mRequestedVolume;
+}
+
+void LLPluginClassMedia::initializeUrlHistory(const LLSD& url_history)
+{
+ // Send URL history to plugin
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "init_history");
+ message.setValueLLSD("history", url_history);
+ sendMessage(message);
+
+ LL_DEBUGS("Plugin") << "Sending history" << LL_ENDL;
+}
+
diff --git a/indra/llplugin/llpluginclassmedia.h b/indra/llplugin/llpluginclassmedia.h
index cf8d8b26b9..f8ed89f644 100644
--- a/indra/llplugin/llpluginclassmedia.h
+++ b/indra/llplugin/llpluginclassmedia.h
@@ -1,416 +1,425 @@
-/**
- * @file llpluginclassmedia.h
- * @brief LLPluginClassMedia handles interaction with a plugin which knows about the "media" message class.
- *
- * @cond
- * $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$
- * @endcond
- */
-
-#ifndef LL_LLPLUGINCLASSMEDIA_H
-#define LL_LLPLUGINCLASSMEDIA_H
-
-#include "llgltypes.h"
-#include "llpluginprocessparent.h"
-#include "llrect.h"
-#include "llpluginclassmediaowner.h"
-#include <queue>
-#include "v4color.h"
-
-class LLPluginClassMedia : public LLPluginProcessParentOwner
-{
- LOG_CLASS(LLPluginClassMedia);
-public:
- LLPluginClassMedia(LLPluginClassMediaOwner *owner);
- virtual ~LLPluginClassMedia();
-
- // local initialization, called by the media manager when creating a source
- virtual bool init(const std::string &launcher_filename,
- const std::string &plugin_dir,
- const std::string &plugin_filename,
- bool debug);
-
- // undoes everything init() didm called by the media manager when destroying a source
- virtual void reset();
-
- void idle(void);
-
- // All of these may return 0 or an actual valid value.
- // Callers need to check the return for 0, and not use the values in that case.
- int getWidth() const { return (mMediaWidth > 0) ? mMediaWidth : 0; };
- int getHeight() const { return (mMediaHeight > 0) ? mMediaHeight : 0; };
- int getNaturalWidth() const { return mNaturalMediaWidth; };
- int getNaturalHeight() const { return mNaturalMediaHeight; };
- int getSetWidth() const { return mSetMediaWidth; };
- int getSetHeight() const { return mSetMediaHeight; };
- int getBitsWidth() const { return (mTextureWidth > 0) ? mTextureWidth : 0; };
- int getBitsHeight() const { return (mTextureHeight > 0) ? mTextureHeight : 0; };
- int getTextureWidth() const;
- int getTextureHeight() const;
- int getFullWidth() const { return mFullMediaWidth; };
- int getFullHeight() const { return mFullMediaHeight; };
-
- // This may return NULL. Callers need to check for and handle this case.
- unsigned char* getBitsData();
-
- // gets the format details of the texture data
- // These may return 0 if they haven't been set up yet. The caller needs to detect this case.
- int getTextureDepth() const { return mRequestedTextureDepth; };
- int getTextureFormatInternal() const { return mRequestedTextureInternalFormat; };
- int getTextureFormatPrimary() const { return mRequestedTextureFormat; };
- int getTextureFormatType() const { return mRequestedTextureType; };
- bool getTextureFormatSwapBytes() const { return mRequestedTextureSwapBytes; };
- bool getTextureCoordsOpenGL() const { return mRequestedTextureCoordsOpenGL; };
-
- void setSize(int width, int height);
- void setAutoScale(bool auto_scale);
-
- void setBackgroundColor(LLColor4 color) { mBackgroundColor = color; };
-
- void setOwner(LLPluginClassMediaOwner *owner) { mOwner = owner; };
-
- // Returns true if all of the texture parameters (depth, format, size, and texture size) are set up and consistent.
- // This will initially be false, and will also be false for some time after setSize while the resize is processed.
- // Note that if this returns true, it is safe to use all the get() functions above without checking for invalid return values
- // until you call idle() again.
- bool textureValid(void);
-
- bool getDirty(LLRect *dirty_rect = NULL);
- void resetDirty(void);
-
- typedef enum
- {
- MOUSE_EVENT_DOWN,
- MOUSE_EVENT_UP,
- MOUSE_EVENT_MOVE,
- MOUSE_EVENT_DOUBLE_CLICK
- }EMouseEventType;
-
- void mouseEvent(EMouseEventType type, int button, int x, int y, MASK modifiers);
-
- typedef enum
- {
- KEY_EVENT_DOWN,
- KEY_EVENT_UP,
- KEY_EVENT_REPEAT
- }EKeyEventType;
-
- bool keyEvent(EKeyEventType type, int key_code, MASK modifiers, LLSD native_key_data);
-
- void scrollEvent(int x, int y, MASK modifiers);
-
- // Text may be unicode (utf8 encoded)
- bool textInput(const std::string &text, MASK modifiers, LLSD native_key_data);
-
- void loadURI(const std::string &uri);
-
- // "Loading" means uninitialized or any state prior to fully running (processing commands)
- bool isPluginLoading(void) { return mPlugin?mPlugin->isLoading():false; };
-
- // "Running" means the steady state -- i.e. processing messages
- bool isPluginRunning(void) { return mPlugin?mPlugin->isRunning():false; };
-
- // "Exited" means any regular or error state after "Running" (plugin may have crashed or exited normally)
- bool isPluginExited(void) { return mPlugin?mPlugin->isDone():false; };
-
- std::string getPluginVersion() { return mPlugin?mPlugin->getPluginVersion():std::string(""); };
-
- bool getDisableTimeout() { return mPlugin?mPlugin->getDisableTimeout():false; };
- void setDisableTimeout(bool disable) { if(mPlugin) mPlugin->setDisableTimeout(disable); };
-
- // Inherited from LLPluginProcessParentOwner
- /* virtual */ void receivePluginMessage(const LLPluginMessage &message);
- /* virtual */ void pluginLaunchFailed();
- /* virtual */ void pluginDied();
-
-
- typedef enum
- {
- PRIORITY_UNLOADED, // media plugin isn't even loaded.
- PRIORITY_STOPPED, // media is not playing, shouldn't need to update at all.
- PRIORITY_HIDDEN, // media is not being displayed or is out of view, don't need to do graphic updates, but may still update audio, playhead, etc.
- PRIORITY_SLIDESHOW, // media is in the far distance, updates very infrequently
- PRIORITY_LOW, // media is in the distance, may be rendered at reduced size
- PRIORITY_NORMAL, // normal (default) priority
- PRIORITY_HIGH // media has user focus and/or is taking up most of the screen
- }EPriority;
-
- static const char* priorityToString(EPriority priority);
- void setPriority(EPriority priority);
- void setLowPrioritySizeLimit(int size);
-
- F64 getCPUUsage();
-
- void sendPickFileResponse(const std::string &file);
-
- void sendAuthResponse(bool ok, const std::string &username, const std::string &password);
-
- // Valid after a MEDIA_EVENT_CURSOR_CHANGED event
- std::string getCursorName() const { return mCursorName; };
-
- LLPluginClassMediaOwner::EMediaStatus getStatus() const { return mStatus; }
-
- void cut();
- bool canCut() const { return mCanCut; };
-
- void copy();
- bool canCopy() const { return mCanCopy; };
-
- void paste();
- bool canPaste() const { return mCanPaste; };
-
- // These can be called before init(), and they will be queued and sent before the media init message.
- void setUserDataPath(const std::string &user_data_path);
- void setLanguageCode(const std::string &language_code);
- void setPluginsEnabled(const bool enabled);
- void setJavascriptEnabled(const bool enabled);
- void setTarget(const std::string &target);
-
- ///////////////////////////////////
- // media browser class functions
- bool pluginSupportsMediaBrowser(void);
-
- void focus(bool focused);
- void clear_cache();
- void clear_cookies();
- void set_cookies(const std::string &cookies);
- void enable_cookies(bool enable);
- void proxy_setup(bool enable, const std::string &host = LLStringUtil::null, int port = 0);
- void browse_stop();
- void browse_reload(bool ignore_cache = false);
- void browse_forward();
- void browse_back();
- void setBrowserUserAgent(const std::string& user_agent);
- void proxyWindowOpened(const std::string &target, const std::string &uuid);
- void proxyWindowClosed(const std::string &uuid);
- void ignore_ssl_cert_errors(bool ignore);
- void addCertificateFilePath(const std::string& path);
-
- // This is valid after MEDIA_EVENT_NAVIGATE_BEGIN or MEDIA_EVENT_NAVIGATE_COMPLETE
- std::string getNavigateURI() const { return mNavigateURI; };
-
- // These are valid after MEDIA_EVENT_NAVIGATE_COMPLETE
- S32 getNavigateResultCode() const { return mNavigateResultCode; };
- std::string getNavigateResultString() const { return mNavigateResultString; };
- bool getHistoryBackAvailable() const { return mHistoryBackAvailable; };
- bool getHistoryForwardAvailable() const { return mHistoryForwardAvailable; };
-
- // This is valid after MEDIA_EVENT_PROGRESS_UPDATED
- int getProgressPercent() const { return mProgressPercent; };
-
- // This is valid after MEDIA_EVENT_STATUS_TEXT_CHANGED
- std::string getStatusText() const { return mStatusText; };
-
- // This is valid after MEDIA_EVENT_LOCATION_CHANGED
- std::string getLocation() const { return mLocation; };
-
- // This is valid after MEDIA_EVENT_CLICK_LINK_HREF or MEDIA_EVENT_CLICK_LINK_NOFOLLOW
- std::string getClickURL() const { return mClickURL; };
-
- // This is valid after MEDIA_EVENT_CLICK_LINK_NOFOLLOW
- std::string getClickNavType() const { return mClickNavType; };
-
- // This is valid after MEDIA_EVENT_CLICK_LINK_HREF
- std::string getClickTarget() const { return mClickTarget; };
-
- // This is valid during MEDIA_EVENT_CLICK_LINK_HREF and MEDIA_EVENT_GEOMETRY_CHANGE
- std::string getClickUUID() const { return mClickUUID; };
-
- // This is valid after MEDIA_EVENT_NAVIGATE_ERROR_PAGE
- S32 getStatusCode() const { return mStatusCode; };
-
- // These are valid during MEDIA_EVENT_GEOMETRY_CHANGE
- S32 getGeometryX() const { return mGeometryX; };
- S32 getGeometryY() const { return mGeometryY; };
- S32 getGeometryWidth() const { return mGeometryWidth; };
- S32 getGeometryHeight() const { return mGeometryHeight; };
-
- // These are valid during MEDIA_EVENT_AUTH_REQUEST
- std::string getAuthURL() const { return mAuthURL; };
- std::string getAuthRealm() const { return mAuthRealm; };
-
- // These are valid during MEDIA_EVENT_LINK_HOVERED
- std::string getHoverText() const { return mHoverText; };
- std::string getHoverLink() const { return mHoverLink; };
-
- 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.
- void crashPlugin();
-
- // Hang the plugin. If you use this outside of a testbed, you will be punished.
- void hangPlugin();
-
- ///////////////////////////////////
- // media time class functions
- bool pluginSupportsMediaTime(void);
- void stop();
- void start(float rate = 0.0f);
- void pause();
- void seek(float time);
- void setLoop(bool loop);
- void setVolume(float volume);
- float getVolume();
-
- F64 getCurrentTime(void) const { return mCurrentTime; };
- F64 getDuration(void) const { return mDuration; };
- F64 getCurrentPlayRate(void) { return mCurrentRate; };
- F64 getLoadedDuration(void) const { return mLoadedDuration; };
-
- // Initialize the URL history of the plugin by sending
- // "init_history" message
- void initializeUrlHistory(const LLSD& url_history);
-
-protected:
-
- LLPluginClassMediaOwner *mOwner;
-
- // Notify this object's owner that an event has occurred.
- void mediaEvent(LLPluginClassMediaOwner::EMediaEvent event);
-
- void sendMessage(const LLPluginMessage &message); // Send message internally, either queueing or sending directly.
- std::queue<LLPluginMessage> mSendQueue; // Used to queue messages while the plugin initializes.
-
- void setSizeInternal(void);
-
- bool mTextureParamsReceived; // the mRequestedTexture* fields are only valid when this is true
- S32 mRequestedTextureDepth;
- LLGLenum mRequestedTextureInternalFormat;
- LLGLenum mRequestedTextureFormat;
- LLGLenum mRequestedTextureType;
- bool mRequestedTextureSwapBytes;
- bool mRequestedTextureCoordsOpenGL;
-
- std::string mTextureSharedMemoryName;
- size_t mTextureSharedMemorySize;
-
- // True to scale requested media up to the full size of the texture (i.e. next power of two)
- bool mAutoScaleMedia;
-
- // default media size for the plugin, from the texture_params message.
- int mDefaultMediaWidth;
- int mDefaultMediaHeight;
-
- // Size that has been requested by the plugin itself
- int mNaturalMediaWidth;
- int mNaturalMediaHeight;
-
- // Size that has been requested with setSize()
- int mSetMediaWidth;
- int mSetMediaHeight;
-
- // Full calculated media size (before auto-scale and downsample calculations)
- int mFullMediaWidth;
- int mFullMediaHeight;
-
- // Actual media size being set (after auto-scale)
- int mRequestedMediaWidth;
- int mRequestedMediaHeight;
-
- // Texture size calculated from actual media size
- int mRequestedTextureWidth;
- int mRequestedTextureHeight;
-
- // Size that the plugin has acknowledged
- int mTextureWidth;
- int mTextureHeight;
- int mMediaWidth;
- int mMediaHeight;
-
- float mRequestedVolume;
-
- // Priority of this media stream
- EPriority mPriority;
- int mLowPrioritySizeLimit;
-
- bool mAllowDownsample;
- int mPadding;
-
-
- LLPluginProcessParent *mPlugin;
-
- LLRect mDirtyRect;
-
- std::string translateModifiers(MASK modifiers);
-
- std::string mCursorName;
- int mLastMouseX;
- int mLastMouseY;
-
- LLPluginClassMediaOwner::EMediaStatus mStatus;
-
- F64 mSleepTime;
-
- bool mCanCut;
- bool mCanCopy;
- bool mCanPaste;
-
- std::string mMediaName;
- std::string mMediaDescription;
-
- LLColor4 mBackgroundColor;
-
- std::string mTarget;
-
- /////////////////////////////////////////
- // media_browser class
- std::string mNavigateURI;
- S32 mNavigateResultCode;
- std::string mNavigateResultString;
- bool mHistoryBackAvailable;
- bool mHistoryForwardAvailable;
- std::string mStatusText;
- int mProgressPercent;
- std::string mLocation;
- std::string mClickURL;
- std::string mClickNavType;
- std::string mClickTarget;
- std::string mClickUUID;
- S32 mGeometryX;
- S32 mGeometryY;
- S32 mGeometryWidth;
- S32 mGeometryHeight;
- S32 mStatusCode;
- std::string mAuthURL;
- std::string mAuthRealm;
- std::string mHoverText;
- std::string mHoverLink;
-
- /////////////////////////////////////////
- // media_time class
- F64 mCurrentTime;
- F64 mDuration;
- F64 mCurrentRate;
- F64 mLoadedDuration;
-
-//--------------------------------------
- //debug use only
- //
-private:
- bool mDeleteOK ;
-public:
- void setDeleteOK(bool flag) { mDeleteOK = flag ;}
-//--------------------------------------
-};
-
-#endif // LL_LLPLUGINCLASSMEDIA_H
+/**
+ * @file llpluginclassmedia.h
+ * @brief LLPluginClassMedia handles interaction with a plugin which knows about the "media" message class.
+ *
+ * @cond
+ * $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$
+ * @endcond
+ */
+
+#ifndef LL_LLPLUGINCLASSMEDIA_H
+#define LL_LLPLUGINCLASSMEDIA_H
+
+#include "llgltypes.h"
+#include "llpluginprocessparent.h"
+#include "llrect.h"
+#include "llpluginclassmediaowner.h"
+#include <queue>
+#include "v4color.h"
+
+class LLPluginClassMedia : public LLPluginProcessParentOwner
+{
+ LOG_CLASS(LLPluginClassMedia);
+public:
+ LLPluginClassMedia(LLPluginClassMediaOwner *owner);
+ virtual ~LLPluginClassMedia();
+
+ // local initialization, called by the media manager when creating a source
+ virtual bool init(const std::string &launcher_filename,
+ const std::string &plugin_dir,
+ const std::string &plugin_filename,
+ bool debug);
+
+ // undoes everything init() didm called by the media manager when destroying a source
+ virtual void reset();
+
+ void idle(void);
+
+ // All of these may return 0 or an actual valid value.
+ // Callers need to check the return for 0, and not use the values in that case.
+ int getWidth() const { return (mMediaWidth > 0) ? mMediaWidth : 0; };
+ int getHeight() const { return (mMediaHeight > 0) ? mMediaHeight : 0; };
+ int getNaturalWidth() const { return mNaturalMediaWidth; };
+ int getNaturalHeight() const { return mNaturalMediaHeight; };
+ int getSetWidth() const { return mSetMediaWidth; };
+ int getSetHeight() const { return mSetMediaHeight; };
+ int getBitsWidth() const { return (mTextureWidth > 0) ? mTextureWidth : 0; };
+ int getBitsHeight() const { return (mTextureHeight > 0) ? mTextureHeight : 0; };
+ int getTextureWidth() const;
+ int getTextureHeight() const;
+ int getFullWidth() const { return mFullMediaWidth; };
+ int getFullHeight() const { return mFullMediaHeight; };
+
+ // This may return NULL. Callers need to check for and handle this case.
+ unsigned char* getBitsData();
+
+ // gets the format details of the texture data
+ // These may return 0 if they haven't been set up yet. The caller needs to detect this case.
+ int getTextureDepth() const { return mRequestedTextureDepth; };
+ int getTextureFormatInternal() const { return mRequestedTextureInternalFormat; };
+ int getTextureFormatPrimary() const { return mRequestedTextureFormat; };
+ int getTextureFormatType() const { return mRequestedTextureType; };
+ bool getTextureFormatSwapBytes() const { return mRequestedTextureSwapBytes; };
+ bool getTextureCoordsOpenGL() const { return mRequestedTextureCoordsOpenGL; };
+
+ void setSize(int width, int height);
+ void setAutoScale(bool auto_scale);
+
+ void setBackgroundColor(LLColor4 color) { mBackgroundColor = color; };
+
+ void setOwner(LLPluginClassMediaOwner *owner) { mOwner = owner; };
+
+ // Returns true if all of the texture parameters (depth, format, size, and texture size) are set up and consistent.
+ // This will initially be false, and will also be false for some time after setSize while the resize is processed.
+ // Note that if this returns true, it is safe to use all the get() functions above without checking for invalid return values
+ // until you call idle() again.
+ bool textureValid(void);
+
+ bool getDirty(LLRect *dirty_rect = NULL);
+ void resetDirty(void);
+
+ typedef enum
+ {
+ MOUSE_EVENT_DOWN,
+ MOUSE_EVENT_UP,
+ MOUSE_EVENT_MOVE,
+ MOUSE_EVENT_DOUBLE_CLICK
+ }EMouseEventType;
+
+ void mouseEvent(EMouseEventType type, int button, int x, int y, MASK modifiers);
+
+ typedef enum
+ {
+ KEY_EVENT_DOWN,
+ KEY_EVENT_UP,
+ KEY_EVENT_REPEAT
+ }EKeyEventType;
+
+ bool keyEvent(EKeyEventType type, int key_code, MASK modifiers, LLSD native_key_data);
+
+ void scrollEvent(int x, int y, MASK modifiers);
+
+ // Javascript <-> viewer events
+ void jsEnableObject( bool enable );
+ void jsAgentLocationEvent( double x, double y, double z );
+ void jsAgentGlobalLocationEvent( double x, double y, double z );
+ void jsAgentOrientationEvent( double angle );
+ void jsAgentLanguageEvent( const std::string& language );
+ void jsAgentRegionEvent( const std::string& region_name );
+ void jsAgentMaturityEvent( const std::string& maturity );
+
+ // Text may be unicode (utf8 encoded)
+ bool textInput(const std::string &text, MASK modifiers, LLSD native_key_data);
+
+ void loadURI(const std::string &uri);
+
+ // "Loading" means uninitialized or any state prior to fully running (processing commands)
+ bool isPluginLoading(void) { return mPlugin?mPlugin->isLoading():false; };
+
+ // "Running" means the steady state -- i.e. processing messages
+ bool isPluginRunning(void) { return mPlugin?mPlugin->isRunning():false; };
+
+ // "Exited" means any regular or error state after "Running" (plugin may have crashed or exited normally)
+ bool isPluginExited(void) { return mPlugin?mPlugin->isDone():false; };
+
+ std::string getPluginVersion() { return mPlugin?mPlugin->getPluginVersion():std::string(""); };
+
+ bool getDisableTimeout() { return mPlugin?mPlugin->getDisableTimeout():false; };
+ void setDisableTimeout(bool disable) { if(mPlugin) mPlugin->setDisableTimeout(disable); };
+
+ // Inherited from LLPluginProcessParentOwner
+ /* virtual */ void receivePluginMessage(const LLPluginMessage &message);
+ /* virtual */ void pluginLaunchFailed();
+ /* virtual */ void pluginDied();
+
+
+ typedef enum
+ {
+ PRIORITY_UNLOADED, // media plugin isn't even loaded.
+ PRIORITY_STOPPED, // media is not playing, shouldn't need to update at all.
+ PRIORITY_HIDDEN, // media is not being displayed or is out of view, don't need to do graphic updates, but may still update audio, playhead, etc.
+ PRIORITY_SLIDESHOW, // media is in the far distance, updates very infrequently
+ PRIORITY_LOW, // media is in the distance, may be rendered at reduced size
+ PRIORITY_NORMAL, // normal (default) priority
+ PRIORITY_HIGH // media has user focus and/or is taking up most of the screen
+ }EPriority;
+
+ static const char* priorityToString(EPriority priority);
+ void setPriority(EPriority priority);
+ void setLowPrioritySizeLimit(int size);
+
+ F64 getCPUUsage();
+
+ void sendPickFileResponse(const std::string &file);
+
+ void sendAuthResponse(bool ok, const std::string &username, const std::string &password);
+
+ // Valid after a MEDIA_EVENT_CURSOR_CHANGED event
+ std::string getCursorName() const { return mCursorName; };
+
+ LLPluginClassMediaOwner::EMediaStatus getStatus() const { return mStatus; }
+
+ void cut();
+ bool canCut() const { return mCanCut; };
+
+ void copy();
+ bool canCopy() const { return mCanCopy; };
+
+ void paste();
+ bool canPaste() const { return mCanPaste; };
+
+ // These can be called before init(), and they will be queued and sent before the media init message.
+ void setUserDataPath(const std::string &user_data_path);
+ void setLanguageCode(const std::string &language_code);
+ void setPluginsEnabled(const bool enabled);
+ void setJavascriptEnabled(const bool enabled);
+ void setTarget(const std::string &target);
+
+ ///////////////////////////////////
+ // media browser class functions
+ bool pluginSupportsMediaBrowser(void);
+
+ void focus(bool focused);
+ void clear_cache();
+ void clear_cookies();
+ void set_cookies(const std::string &cookies);
+ void enable_cookies(bool enable);
+ void proxy_setup(bool enable, const std::string &host = LLStringUtil::null, int port = 0);
+ void browse_stop();
+ void browse_reload(bool ignore_cache = false);
+ void browse_forward();
+ void browse_back();
+ void setBrowserUserAgent(const std::string& user_agent);
+ void proxyWindowOpened(const std::string &target, const std::string &uuid);
+ void proxyWindowClosed(const std::string &uuid);
+ void ignore_ssl_cert_errors(bool ignore);
+ void addCertificateFilePath(const std::string& path);
+
+ // This is valid after MEDIA_EVENT_NAVIGATE_BEGIN or MEDIA_EVENT_NAVIGATE_COMPLETE
+ std::string getNavigateURI() const { return mNavigateURI; };
+
+ // These are valid after MEDIA_EVENT_NAVIGATE_COMPLETE
+ S32 getNavigateResultCode() const { return mNavigateResultCode; };
+ std::string getNavigateResultString() const { return mNavigateResultString; };
+ bool getHistoryBackAvailable() const { return mHistoryBackAvailable; };
+ bool getHistoryForwardAvailable() const { return mHistoryForwardAvailable; };
+
+ // This is valid after MEDIA_EVENT_PROGRESS_UPDATED
+ int getProgressPercent() const { return mProgressPercent; };
+
+ // This is valid after MEDIA_EVENT_STATUS_TEXT_CHANGED
+ std::string getStatusText() const { return mStatusText; };
+
+ // This is valid after MEDIA_EVENT_LOCATION_CHANGED
+ std::string getLocation() const { return mLocation; };
+
+ // This is valid after MEDIA_EVENT_CLICK_LINK_HREF or MEDIA_EVENT_CLICK_LINK_NOFOLLOW
+ std::string getClickURL() const { return mClickURL; };
+
+ // This is valid after MEDIA_EVENT_CLICK_LINK_NOFOLLOW
+ std::string getClickNavType() const { return mClickNavType; };
+
+ // This is valid after MEDIA_EVENT_CLICK_LINK_HREF
+ std::string getClickTarget() const { return mClickTarget; };
+
+ // This is valid during MEDIA_EVENT_CLICK_LINK_HREF and MEDIA_EVENT_GEOMETRY_CHANGE
+ std::string getClickUUID() const { return mClickUUID; };
+
+ // This is valid after MEDIA_EVENT_NAVIGATE_ERROR_PAGE
+ S32 getStatusCode() const { return mStatusCode; };
+
+ // These are valid during MEDIA_EVENT_GEOMETRY_CHANGE
+ S32 getGeometryX() const { return mGeometryX; };
+ S32 getGeometryY() const { return mGeometryY; };
+ S32 getGeometryWidth() const { return mGeometryWidth; };
+ S32 getGeometryHeight() const { return mGeometryHeight; };
+
+ // These are valid during MEDIA_EVENT_AUTH_REQUEST
+ std::string getAuthURL() const { return mAuthURL; };
+ std::string getAuthRealm() const { return mAuthRealm; };
+
+ // These are valid during MEDIA_EVENT_LINK_HOVERED
+ std::string getHoverText() const { return mHoverText; };
+ std::string getHoverLink() const { return mHoverLink; };
+
+ 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.
+ void crashPlugin();
+
+ // Hang the plugin. If you use this outside of a testbed, you will be punished.
+ void hangPlugin();
+
+ ///////////////////////////////////
+ // media time class functions
+ bool pluginSupportsMediaTime(void);
+ void stop();
+ void start(float rate = 0.0f);
+ void pause();
+ void seek(float time);
+ void setLoop(bool loop);
+ void setVolume(float volume);
+ float getVolume();
+
+ F64 getCurrentTime(void) const { return mCurrentTime; };
+ F64 getDuration(void) const { return mDuration; };
+ F64 getCurrentPlayRate(void) { return mCurrentRate; };
+ F64 getLoadedDuration(void) const { return mLoadedDuration; };
+
+ // Initialize the URL history of the plugin by sending
+ // "init_history" message
+ void initializeUrlHistory(const LLSD& url_history);
+
+protected:
+
+ LLPluginClassMediaOwner *mOwner;
+
+ // Notify this object's owner that an event has occurred.
+ void mediaEvent(LLPluginClassMediaOwner::EMediaEvent event);
+
+ void sendMessage(const LLPluginMessage &message); // Send message internally, either queueing or sending directly.
+ std::queue<LLPluginMessage> mSendQueue; // Used to queue messages while the plugin initializes.
+
+ void setSizeInternal(void);
+
+ bool mTextureParamsReceived; // the mRequestedTexture* fields are only valid when this is true
+ S32 mRequestedTextureDepth;
+ LLGLenum mRequestedTextureInternalFormat;
+ LLGLenum mRequestedTextureFormat;
+ LLGLenum mRequestedTextureType;
+ bool mRequestedTextureSwapBytes;
+ bool mRequestedTextureCoordsOpenGL;
+
+ std::string mTextureSharedMemoryName;
+ size_t mTextureSharedMemorySize;
+
+ // True to scale requested media up to the full size of the texture (i.e. next power of two)
+ bool mAutoScaleMedia;
+
+ // default media size for the plugin, from the texture_params message.
+ int mDefaultMediaWidth;
+ int mDefaultMediaHeight;
+
+ // Size that has been requested by the plugin itself
+ int mNaturalMediaWidth;
+ int mNaturalMediaHeight;
+
+ // Size that has been requested with setSize()
+ int mSetMediaWidth;
+ int mSetMediaHeight;
+
+ // Full calculated media size (before auto-scale and downsample calculations)
+ int mFullMediaWidth;
+ int mFullMediaHeight;
+
+ // Actual media size being set (after auto-scale)
+ int mRequestedMediaWidth;
+ int mRequestedMediaHeight;
+
+ // Texture size calculated from actual media size
+ int mRequestedTextureWidth;
+ int mRequestedTextureHeight;
+
+ // Size that the plugin has acknowledged
+ int mTextureWidth;
+ int mTextureHeight;
+ int mMediaWidth;
+ int mMediaHeight;
+
+ float mRequestedVolume;
+
+ // Priority of this media stream
+ EPriority mPriority;
+ int mLowPrioritySizeLimit;
+
+ bool mAllowDownsample;
+ int mPadding;
+
+
+ LLPluginProcessParent *mPlugin;
+
+ LLRect mDirtyRect;
+
+ std::string translateModifiers(MASK modifiers);
+
+ std::string mCursorName;
+ int mLastMouseX;
+ int mLastMouseY;
+
+ LLPluginClassMediaOwner::EMediaStatus mStatus;
+
+ F64 mSleepTime;
+
+ bool mCanCut;
+ bool mCanCopy;
+ bool mCanPaste;
+
+ std::string mMediaName;
+ std::string mMediaDescription;
+
+ LLColor4 mBackgroundColor;
+
+ std::string mTarget;
+
+ /////////////////////////////////////////
+ // media_browser class
+ std::string mNavigateURI;
+ S32 mNavigateResultCode;
+ std::string mNavigateResultString;
+ bool mHistoryBackAvailable;
+ bool mHistoryForwardAvailable;
+ std::string mStatusText;
+ int mProgressPercent;
+ std::string mLocation;
+ std::string mClickURL;
+ std::string mClickNavType;
+ std::string mClickTarget;
+ std::string mClickUUID;
+ S32 mGeometryX;
+ S32 mGeometryY;
+ S32 mGeometryWidth;
+ S32 mGeometryHeight;
+ S32 mStatusCode;
+ std::string mAuthURL;
+ std::string mAuthRealm;
+ std::string mHoverText;
+ std::string mHoverLink;
+
+ /////////////////////////////////////////
+ // media_time class
+ F64 mCurrentTime;
+ F64 mDuration;
+ F64 mCurrentRate;
+ F64 mLoadedDuration;
+
+//--------------------------------------
+ //debug use only
+ //
+private:
+ bool mDeleteOK ;
+public:
+ void setDeleteOK(bool flag) { mDeleteOK = flag ;}
+//--------------------------------------
+};
+
+#endif // LL_LLPLUGINCLASSMEDIA_H
diff --git a/indra/llprimitive/llmodel.cpp b/indra/llprimitive/llmodel.cpp
index 794cdb83d5..ea0ea931af 100644
--- a/indra/llprimitive/llmodel.cpp
+++ b/indra/llprimitive/llmodel.cpp
@@ -27,6 +27,7 @@
#include "linden_common.h"
#include "llmodel.h"
+#include "llmemory.h"
#include "llconvexdecomposition.h"
#include "llsdserialize.h"
#include "llvector4a.h"
@@ -50,7 +51,7 @@ std::string model_names[] =
"low_lod",
"medium_lod",
"high_lod",
- "physics_shape"
+ "physics_mesh"
};
const int MODEL_NAMES_LENGTH = sizeof(model_names) / sizeof(std::string);
@@ -71,85 +72,8 @@ LLModel::~LLModel()
}
}
-void load_face_from_dom_inputs(LLVolumeFace& face, const domInputLocalOffset_Array& inputs, U32 min_idx, U32 max_idx)
-{
- for (U32 j = 0; j < inputs.getCount(); ++j)
- {
- if (strcmp(COMMON_PROFILE_INPUT_VERTEX, inputs[j]->getSemantic()) == 0)
- { //found vertex array
- const domURIFragmentType& uri = inputs[j]->getSource();
- daeElementRef elem = uri.getElement();
- domVertices* vertices = (domVertices*) elem.cast();
-
- domInputLocal_Array& v_inp = vertices->getInput_array();
- if (inputs[j]->getOffset() != 0)
- {
- llerrs << "WTF?" << llendl;
- }
-
- for (U32 k = 0; k < v_inp.getCount(); ++k)
- {
- if (strcmp(COMMON_PROFILE_INPUT_POSITION, v_inp[k]->getSemantic()) == 0)
- {
- const domURIFragmentType& uri = v_inp[k]->getSource();
-
- daeElementRef elem = uri.getElement();
- domSource* src = (domSource*) elem.cast();
-
- if (src->getTechnique_common()->getAccessor()->getStride() != 3)
- {
- llerrs << "WTF?" << llendl;
- }
-
- domListOfFloats& v = src->getFloat_array()->getValue();
-
- LLVector4a min;
- min.set(v[min_idx], v[min_idx+1], v[min_idx+2]);
- LLVector4a max = min;
-
- for (U32 j = min_idx; j <= max_idx; ++j)
- { //copy vertex array
- face.mPositions[j-min_idx].set(v[j*3+0], v[j*3+1], v[j*3+2]);
- update_min_max(min, max, face.mPositions[j-min_idx]);
- }
-
- face.mExtents[0] = min;
- face.mExtents[1] = max;
- }
- }
- }
-
- if (strcmp(COMMON_PROFILE_INPUT_NORMAL, inputs[j]->getSemantic()) == 0)
- {
- //found normal array for this triangle list
- const domURIFragmentType& uri = inputs[j]->getSource();
- daeElementRef elem = uri.getElement();
- domSource* src = (domSource*) elem.cast();
- domListOfFloats& n = src->getFloat_array()->getValue();
-
- for (U32 j = min_idx; j <= max_idx; ++j)
- {
- LLVector4a* norm = (LLVector4a*) face.mNormals + (j-min_idx);
- norm->set(n[j*3+0], n[j*3+1], n[j*3+2]);
- norm->normalize3();
- }
- }
- else if (strcmp(COMMON_PROFILE_INPUT_TEXCOORD, inputs[j]->getSemantic()) == 0)
- { //found texCoords
- const domURIFragmentType& uri = inputs[j]->getSource();
- daeElementRef elem = uri.getElement();
- domSource* src = (domSource*) elem.cast();
- domListOfFloats& u = src->getFloat_array()->getValue();
-
- for (U32 j = min_idx; j <= max_idx; ++j)
- {
- face.mTexCoords[j-min_idx].setVec(u[j*2+0], u[j*2+1]);
- }
- }
- }
-}
-void get_dom_sources(const domInputLocalOffset_Array& inputs, S32& pos_offset, S32& tc_offset, S32& norm_offset, S32 &idx_stride,
+bool get_dom_sources(const domInputLocalOffset_Array& inputs, S32& pos_offset, S32& tc_offset, S32& norm_offset, S32 &idx_stride,
domSource* &pos_source, domSource* &tc_source, domSource* &norm_source)
{
idx_stride = 0;
@@ -163,7 +87,11 @@ void get_dom_sources(const domInputLocalOffset_Array& inputs, S32& pos_offset, S
const domURIFragmentType& uri = inputs[j]->getSource();
daeElementRef elem = uri.getElement();
domVertices* vertices = (domVertices*) elem.cast();
-
+ if ( !vertices )
+ {
+ return false;
+ }
+
domInputLocal_Array& v_inp = vertices->getInput_array();
@@ -207,6 +135,8 @@ void get_dom_sources(const domInputLocalOffset_Array& inputs, S32& pos_offset, S
}
idx_stride += 1;
+
+ return true;
}
LLModel::EModelStatus load_face_from_dom_triangles(std::vector<LLVolumeFace>& face_list, std::vector<std::string>& materials, domTrianglesRef& tri)
@@ -227,8 +157,12 @@ LLModel::EModelStatus load_face_from_dom_triangles(std::vector<LLVolumeFace>& fa
S32 idx_stride = 0;
- get_dom_sources(inputs, pos_offset, tc_offset, norm_offset, idx_stride, pos_source, tc_source, norm_source);
+ if ( !get_dom_sources(inputs, pos_offset, tc_offset, norm_offset, idx_stride, pos_source, tc_source, norm_source) || !pos_source )
+ {
+ return LLModel::BAD_ELEMENT;
+ }
+
domPRef p = tri->getP();
domListOfUInts& idx = p->getValue();
@@ -260,14 +194,13 @@ LLModel::EModelStatus load_face_from_dom_triangles(std::vector<LLVolumeFace>& fa
cv.mTexCoord.setVec(tc[idx[i+tc_offset]*2+0],
tc[idx[i+tc_offset]*2+1]);
}
-
+
if (norm_source)
{
cv.setNormal(LLVector4a(n[idx[i+norm_offset]*3+0],
n[idx[i+norm_offset]*3+1],
n[idx[i+norm_offset]*3+2]));
}
-
BOOL found = FALSE;
@@ -318,10 +251,22 @@ LLModel::EModelStatus load_face_from_dom_triangles(std::vector<LLVolumeFace>& fa
{
face_list.push_back(face);
face_list.rbegin()->fillFromLegacyData(verts, indices);
+ LLVolumeFace& new_face = *face_list.rbegin();
+ if (!norm_source)
+ {
+ ll_aligned_free_16(new_face.mNormals);
+ new_face.mNormals = NULL;
+ }
+
+ if (!tc_source)
+ {
+ ll_aligned_free_16(new_face.mTexCoords);
+ new_face.mTexCoords = NULL;
+ }
+
face = LLVolumeFace();
point_map.clear();
}
-
}
if (!verts.empty())
@@ -337,6 +282,18 @@ LLModel::EModelStatus load_face_from_dom_triangles(std::vector<LLVolumeFace>& fa
face_list.push_back(face);
face_list.rbegin()->fillFromLegacyData(verts, indices);
+ LLVolumeFace& new_face = *face_list.rbegin();
+ if (!norm_source)
+ {
+ ll_aligned_free_16(new_face.mNormals);
+ new_face.mNormals = NULL;
+ }
+
+ if (!tc_source)
+ {
+ ll_aligned_free_16(new_face.mTexCoords);
+ new_face.mTexCoords = NULL;
+ }
}
return LLModel::NO_ERRORS ;
@@ -367,7 +324,10 @@ LLModel::EModelStatus load_face_from_dom_polylist(std::vector<LLVolumeFace>& fac
S32 idx_stride = 0;
- get_dom_sources(inputs, pos_offset, tc_offset, norm_offset, idx_stride, pos_source, tc_source, norm_source);
+ if (!get_dom_sources(inputs, pos_offset, tc_offset, norm_offset, idx_stride, pos_source, tc_source, norm_source))
+ {
+ return LLModel::BAD_ELEMENT;
+ }
LLVolumeFace face;
@@ -419,14 +379,14 @@ LLModel::EModelStatus load_face_from_dom_polylist(std::vector<LLVolumeFace>& fac
cv.mTexCoord.setVec(tc[idx[cur_idx+tc_offset]*2+0],
tc[idx[cur_idx+tc_offset]*2+1]);
}
-
+
if (norm_source)
{
cv.getNormal().set(n[idx[cur_idx+norm_offset]*3+0],
n[idx[cur_idx+norm_offset]*3+1],
n[idx[cur_idx+norm_offset]*3+2]);
}
-
+
cur_idx += idx_stride;
BOOL found = FALSE;
@@ -510,6 +470,19 @@ LLModel::EModelStatus load_face_from_dom_polylist(std::vector<LLVolumeFace>& fac
{
face_list.push_back(face);
face_list.rbegin()->fillFromLegacyData(verts, indices);
+ LLVolumeFace& new_face = *face_list.rbegin();
+ if (!norm_source)
+ {
+ ll_aligned_free_16(new_face.mNormals);
+ new_face.mNormals = NULL;
+ }
+
+ if (!tc_source)
+ {
+ ll_aligned_free_16(new_face.mTexCoords);
+ new_face.mTexCoords = NULL;
+ }
+
face = LLVolumeFace();
verts.clear();
indices.clear();
@@ -526,10 +499,23 @@ LLModel::EModelStatus load_face_from_dom_polylist(std::vector<LLVolumeFace>& fac
{
material = std::string(poly->getMaterial());
}
-
+
materials.push_back(material);
face_list.push_back(face);
face_list.rbegin()->fillFromLegacyData(verts, indices);
+
+ LLVolumeFace& new_face = *face_list.rbegin();
+ if (!norm_source)
+ {
+ ll_aligned_free_16(new_face.mNormals);
+ new_face.mNormals = NULL;
+ }
+
+ if (!tc_source)
+ {
+ ll_aligned_free_16(new_face.mTexCoords);
+ new_face.mTexCoords = NULL;
+ }
}
return LLModel::NO_ERRORS ;
@@ -543,7 +529,6 @@ LLModel::EModelStatus load_face_from_dom_polygons(std::vector<LLVolumeFace>& fac
const domInputLocalOffset_Array& inputs = poly->getInput_array();
-
S32 v_offset = -1;
S32 n_offset = -1;
S32 t_offset = -1;
@@ -564,7 +549,10 @@ LLModel::EModelStatus load_face_from_dom_polygons(std::vector<LLVolumeFace>& fac
const domURIFragmentType& uri = inputs[i]->getSource();
daeElementRef elem = uri.getElement();
domVertices* vertices = (domVertices*) elem.cast();
-
+ if (!vertices)
+ {
+ return LLModel::BAD_ELEMENT;
+ }
domInputLocal_Array& v_inp = vertices->getInput_array();
for (U32 k = 0; k < v_inp.getCount(); ++k)
@@ -574,6 +562,10 @@ LLModel::EModelStatus load_face_from_dom_polygons(std::vector<LLVolumeFace>& fac
const domURIFragmentType& uri = v_inp[k]->getSource();
daeElementRef elem = uri.getElement();
domSource* src = (domSource*) elem.cast();
+ if (!src)
+ {
+ return LLModel::BAD_ELEMENT;
+ }
v = &(src->getFloat_array()->getValue());
}
}
@@ -585,6 +577,10 @@ LLModel::EModelStatus load_face_from_dom_polygons(std::vector<LLVolumeFace>& fac
const domURIFragmentType& uri = inputs[i]->getSource();
daeElementRef elem = uri.getElement();
domSource* src = (domSource*) elem.cast();
+ if (!src)
+ {
+ return LLModel::BAD_ELEMENT;
+ }
n = &(src->getFloat_array()->getValue());
}
else if (strcmp(COMMON_PROFILE_INPUT_TEXCOORD, inputs[i]->getSemantic()) == 0 && inputs[i]->getSet() == 0)
@@ -593,6 +589,10 @@ LLModel::EModelStatus load_face_from_dom_polygons(std::vector<LLVolumeFace>& fac
const domURIFragmentType& uri = inputs[i]->getSource();
daeElementRef elem = uri.getElement();
domSource* src = (domSource*) elem.cast();
+ if (!src)
+ {
+ return LLModel::BAD_ELEMENT;
+ }
t = &(src->getFloat_array()->getValue());
}
}
@@ -633,15 +633,14 @@ LLModel::EModelStatus load_face_from_dom_polygons(std::vector<LLVolumeFace>& fac
n->get(n_idx+1),
n->get(n_idx+2));
}
-
+
if (t)
{
U32 t_idx = idx[j*stride+t_offset]*2;
vert.mTexCoord.setVec(t->get(t_idx),
t->get(t_idx+1));
}
-
-
+
verts.push_back(vert);
}
}
@@ -667,11 +666,6 @@ LLModel::EModelStatus load_face_from_dom_polygons(std::vector<LLVolumeFace>& fac
}
}
- if (cur_idx != vert_idx.size())
- {
- llerrs << "WTF?" << llendl;
- }
-
//build vertex array from map
std::vector<LLVolumeFace::VertexData> new_verts;
new_verts.resize(vert_idx.size());
@@ -709,6 +703,19 @@ LLModel::EModelStatus load_face_from_dom_polygons(std::vector<LLVolumeFace>& fac
materials.push_back(material);
face_list.push_back(face);
face_list.rbegin()->fillFromLegacyData(new_verts, indices);
+
+ LLVolumeFace& new_face = *face_list.rbegin();
+ if (!n)
+ {
+ ll_aligned_free_16(new_face.mNormals);
+ new_face.mNormals = NULL;
+ }
+
+ if (!t)
+ {
+ ll_aligned_free_16(new_face.mTexCoords);
+ new_face.mTexCoords = NULL;
+ }
}
return LLModel::NO_ERRORS ;
@@ -717,7 +724,7 @@ LLModel::EModelStatus load_face_from_dom_polygons(std::vector<LLVolumeFace>& fac
//static
std::string LLModel::getStatusString(U32 status)
{
- const static std::string status_strings[(S32)INVALID_STATUS] = {"status_no_error", "status_vertex_number_overflow"};
+ const static std::string status_strings[(S32)INVALID_STATUS] = {"status_no_error", "status_vertex_number_overflow","bad_element"};
if(status < INVALID_STATUS)
{
@@ -755,7 +762,6 @@ void LLModel::addVolumeFacesFromDomMesh(domMesh* mesh)
for (U32 i = 0; i < polys.getCount(); ++i)
{
domPolylistRef& poly = polys.get(i);
-
mStatus = load_face_from_dom_polylist(mVolumeFaces, mMaterialList, poly);
if(mStatus != NO_ERRORS)
@@ -765,12 +771,12 @@ void LLModel::addVolumeFacesFromDomMesh(domMesh* mesh)
return ; //abort
}
}
-
+
domPolygons_Array& polygons = mesh->getPolygons_array();
+
for (U32 i = 0; i < polygons.getCount(); ++i)
{
domPolygonsRef& poly = polygons.get(i);
-
mStatus = load_face_from_dom_polygons(mVolumeFaces, mMaterialList, poly);
if(mStatus != NO_ERRORS)
@@ -780,7 +786,7 @@ void LLModel::addVolumeFacesFromDomMesh(domMesh* mesh)
return ; //abort
}
}
-
+
}
BOOL LLModel::createVolumeFacesFromDomMesh(domMesh* mesh)
@@ -794,9 +800,9 @@ BOOL LLModel::createVolumeFacesFromDomMesh(domMesh* mesh)
if (getNumVolumeFaces() > 0)
{
- optimizeVolumeFaces();
normalizeVolumeFaces();
-
+ optimizeVolumeFaces();
+
if (getNumVolumeFaces() > 0)
{
return TRUE;
@@ -830,81 +836,10 @@ void LLModel::offsetMesh( const LLVector3& pivotPoint )
void LLModel::optimizeVolumeFaces()
{
-#if 0 //VECTORIZE ?
- for (std::vector<LLVolumeFace>::iterator iter = mVolumeFaces.begin(); iter != mVolumeFaces.end(); )
- {
- std::vector<LLVolumeFace>::iterator cur_iter = iter++;
- LLVolumeFace& face = *cur_iter;
-
- for (S32 i = 0; i < (S32) face.mNumIndices; i += 3)
- { //remove zero area triangles
- U16 i0 = face.mIndices[i+0];
- U16 i1 = face.mIndices[i+1];
- U16 i2 = face.mIndices[i+2];
-
- if (i0 == i1 ||
- i1 == i2 ||
- i0 == i2)
- { //duplicate index in triangle, remove triangle
- face.mIndices.erase(face.mIndices.begin()+i, face.mIndices.begin()+i+3);
- i -= 3;
- }
- else
- {
- LLVolumeFace::VertexData& v0 = face.mVertices[i0];
- LLVolumeFace::VertexData& v1 = face.mVertices[i1];
- LLVolumeFace::VertexData& v2 = face.mVertices[i2];
-
- if (v0.mPosition == v1.mPosition ||
- v1.mPosition == v2.mPosition ||
- v2.mPosition == v0.mPosition)
- { //zero area triangle, delete
- face.mIndices.erase(face.mIndices.begin()+i, face.mIndices.begin()+i+3);
- i-=3;
- }
- }
- }
-
- //remove unreference vertices
- std::vector<bool> ref;
- ref.resize(face.mNumVertices);
-
- for (U32 i = 0; i < ref.size(); ++i)
- {
- ref[i] = false;
- }
-
- for (U32 i = 0; i < face.mNumIndices; ++i)
- {
- ref[face.mIndices[i]] = true;
- }
-
- U32 unref_count = 0;
- for (U32 i = 0; i < ref.size(); ++i)
- {
- if (!ref[i])
- {
- //vertex is unreferenced
- face.mVertices.erase(face.mVertices.begin()+(i-unref_count));
- U16 idx = (U16) (i-unref_count);
-
- for (U32 j = 0; j < face.mNumIndices; ++j)
- { //decrement every index array value greater than idx
- if (face.mIndices[j] > idx)
- {
- --face.mIndices[j];
- }
- }
- ++unref_count;
- }
- }
-
- if (face.mVertices.empty() || face.mIndices.empty())
- { //face is empty, remove it
- iter = mVolumeFaces.erase(cur_iter);
- }
+ for (U32 i = 0; i < getNumVolumeFaces(); ++i)
+ {
+ mVolumeFaces[i].optimize();
}
-#endif
}
// Shrink the model to fit
@@ -926,11 +861,6 @@ void LLModel::normalizeVolumeFaces()
{
LLVector4a min, max;
- if (mVolumeFaces[0].mNumVertices <= 0)
- {
- llerrs << "WTF?" << llendl;
- }
-
// For all of the volume faces
// in the model, loop over
// them and see what the extents
@@ -942,13 +872,27 @@ void LLModel::normalizeVolumeFaces()
{
LLVolumeFace& face = mVolumeFaces[i];
- if (face.mNumVertices <= 0)
- {
- llerrs << "WTF?" << llendl;
- }
-
update_min_max(min, max, face.mExtents[0]);
update_min_max(min, max, face.mExtents[1]);
+
+ if (face.mTexCoords)
+ {
+ LLVector2& min_tc = face.mTexCoordExtents[0];
+ LLVector2& max_tc = face.mTexCoordExtents[1];
+
+ min_tc = face.mTexCoords[0];
+ max_tc = face.mTexCoords[0];
+
+ for (U32 j = 1; j < face.mNumVertices; ++j)
+ {
+ update_min_max(min_tc, max_tc, face.mTexCoords[j]);
+ }
+ }
+ else
+ {
+ face.mTexCoordExtents[0].set(0,0);
+ face.mTexCoordExtents[1].set(1,1);
+ }
}
// Now that we have the extents of the model
@@ -991,6 +935,9 @@ void LLModel::normalizeVolumeFaces()
scale.splat(1.f);
scale.div(size);
+ LLVector4a inv_scale(1.f);
+ inv_scale.div(scale);
+
for (U32 i = 0; i < mVolumeFaces.size(); ++i)
{
LLVolumeFace& face = mVolumeFaces[i];
@@ -1007,10 +954,17 @@ void LLModel::normalizeVolumeFaces()
// For all the positions, we scale
// the positions to fit within the unit cube.
LLVector4a* pos = (LLVector4a*) face.mPositions;
+ LLVector4a* norm = (LLVector4a*) face.mNormals;
+
for (U32 j = 0; j < face.mNumVertices; ++j)
{
pos[j].add(trans);
pos[j].mul(scale);
+ if (norm && !norm[j].equals3(LLVector4a::getZero()))
+ {
+ norm[j].mul(inv_scale);
+ norm[j].normalize3();
+ }
}
}
@@ -1053,8 +1007,26 @@ void LLModel::setVolumeFaceData(
face.resizeIndices(num_indices);
LLVector4a::memcpyNonAliased16((F32*) face.mPositions, (F32*) pos.get(), num_verts*4*sizeof(F32));
- LLVector4a::memcpyNonAliased16((F32*) face.mNormals, (F32*) norm.get(), num_verts*4*sizeof(F32));
- LLVector4a::memcpyNonAliased16((F32*) face.mTexCoords, (F32*) tc.get(), num_verts*2*sizeof(F32));
+ if (norm.get())
+ {
+ LLVector4a::memcpyNonAliased16((F32*) face.mNormals, (F32*) norm.get(), num_verts*4*sizeof(F32));
+ }
+ else
+ {
+ ll_aligned_free_16(face.mNormals);
+ face.mNormals = NULL;
+ }
+
+ if (tc.get())
+ {
+ LLVector4a::memcpyNonAliased16((F32*) face.mTexCoords, (F32*) tc.get(), num_verts*2*sizeof(F32));
+ }
+ else
+ {
+ ll_aligned_free_16(face.mTexCoords);
+ face.mTexCoords = NULL;
+ }
+
U32 size = (num_indices*2+0xF)&~0xF;
LLVector4a::memcpyNonAliased16((F32*) face.mIndices, (F32*) ind.get(), size);
}
@@ -1237,10 +1209,23 @@ void LLModel::generateNormals(F32 angle_cutoff)
LLVolumeFace::VertexData v;
new_face.mPositions[i] = vol_face.mPositions[idx];
new_face.mNormals[i].clear();
- new_face.mTexCoords[i] = vol_face.mTexCoords[idx];
new_face.mIndices[i] = i;
}
+ if (vol_face.mTexCoords)
+ {
+ for (U32 i = 0; i < vol_face.mNumIndices; i++)
+ {
+ U32 idx = vol_face.mIndices[i];
+ new_face.mTexCoords[i] = vol_face.mTexCoords[idx];
+ }
+ }
+ else
+ {
+ ll_aligned_free_16(new_face.mTexCoords);
+ new_face.mTexCoords = NULL;
+ }
+
//generate normals for new face
for (U32 i = 0; i < new_face.mNumIndices; i += 3)
{ //for each triangle
@@ -1282,11 +1267,6 @@ void LLModel::generateNormals(F32 angle_cutoff)
{
LLVector4a& n = iter->second[k].getNormal();
- if (!iter->second[k].getPosition().equals3(new_face.mPositions[i]))
- {
- llerrs << "WTF?" << llendl;
- }
-
F32 cur = n.dot3(ref_norm).getF32();
if (cur > best)
@@ -1380,7 +1360,8 @@ LLSD LLModel::writeModel(
const LLModel::Decomposition& decomp,
BOOL upload_skin,
BOOL upload_joints,
- BOOL nowrite)
+ BOOL nowrite,
+ BOOL as_slm)
{
LLSD mdl;
@@ -1403,7 +1384,19 @@ LLSD LLModel::writeModel(
if (!decomp.mBaseHull.empty() ||
!decomp.mHull.empty())
{
- mdl["decomposition"] = decomp.asLLSD();
+ mdl["physics_convex"] = decomp.asLLSD();
+ if (!decomp.mHull.empty() && !as_slm)
+ { //convex decomposition exists, physics mesh will not be used (unless this is an slm file)
+ model[LLModel::LOD_PHYSICS] = NULL;
+ }
+ }
+
+ if (as_slm)
+ { //save material list names
+ for (U32 i = 0; i < high->mMaterialList.size(); ++i)
+ {
+ mdl["material_list"][i] = high->mMaterialList[i];
+ }
}
for (U32 idx = 0; idx < MODEL_NAMES_LENGTH; ++idx)
@@ -1428,8 +1421,9 @@ LLSD LLModel::writeModel(
for (S32 i = 0; i < model[idx]->getNumVolumeFaces(); ++i)
{ //for each face
const LLVolumeFace& face = model[idx]->getVolumeFace(i);
- if (!face.mNumVertices)
+ if (face.mNumVertices < 3)
{ //don't export an empty face
+ mdl[model_names[idx]][i]["NoGeometry"] = true;
continue;
}
LLSD::Binary verts(face.mNumVertices*3*2);
@@ -1442,13 +1436,19 @@ LLSD LLModel::writeModel(
U32 tc_idx = 0;
LLVector2* ftc = (LLVector2*) face.mTexCoords;
- LLVector2 min_tc = ftc[0];
- LLVector2 max_tc = min_tc;
-
- //get texture coordinate domain
- for (U32 j = 0; j < face.mNumVertices; ++j)
+ LLVector2 min_tc;
+ LLVector2 max_tc;
+
+ if (ftc)
{
- update_min_max(min_tc, max_tc, ftc[j]);
+ min_tc = ftc[0];
+ max_tc = min_tc;
+
+ //get texture coordinate domain
+ for (U32 j = 0; j < face.mNumVertices; ++j)
+ {
+ update_min_max(min_tc, max_tc, ftc[j]);
+ }
}
LLVector2 tc_range = max_tc - min_tc;
@@ -1457,12 +1457,10 @@ LLSD LLModel::writeModel(
{ //for each vert
F32* pos = face.mPositions[j].getF32ptr();
- F32* norm = face.mNormals[j].getF32ptr();
-
- //position + normal
+
+ //position
for (U32 k = 0; k < 3; ++k)
{ //for each component
-
//convert to 16-bit normalized across domain
U16 val = (U16) (((pos[k]-min_pos.mV[k])/pos_range.mV[k])*65535);
@@ -1470,29 +1468,40 @@ LLSD LLModel::writeModel(
//write to binary buffer
verts[vert_idx++] = buff[0];
verts[vert_idx++] = buff[1];
-
- //convert to 16-bit normalized
- val = (U16) ((norm[k]+1.f)*0.5f*65535);
-
- //write to binary buffer
- normals[norm_idx++] = buff[0];
- normals[norm_idx++] = buff[1];
}
- F32* src_tc = (F32*) face.mTexCoords[j].mV;
+ if (face.mNormals)
+ { //normals
+ F32* norm = face.mNormals[j].getF32ptr();
- //texcoord
- for (U32 k = 0; k < 2; ++k)
- { //for each component
- //convert to 16-bit normalized
- U16 val = (U16) ((src_tc[k]-min_tc.mV[k])/tc_range.mV[k]*65535);
+ for (U32 k = 0; k < 3; ++k)
+ { //for each component
+ //convert to 16-bit normalized
+ U16 val = (U16) ((norm[k]+1.f)*0.5f*65535);
+ U8* buff = (U8*) &val;
- U8* buff = (U8*) &val;
- //write to binary buffer
- tc[tc_idx++] = buff[0];
- tc[tc_idx++] = buff[1];
+ //write to binary buffer
+ normals[norm_idx++] = buff[0];
+ normals[norm_idx++] = buff[1];
+ }
}
+ F32* src_tc = (F32*) face.mTexCoords[j].mV;
+
+ //texcoord
+ if (face.mTexCoords)
+ {
+ for (U32 k = 0; k < 2; ++k)
+ { //for each component
+ //convert to 16-bit normalized
+ U16 val = (U16) ((src_tc[k]-min_tc.mV[k])/tc_range.mV[k]*65535);
+
+ U8* buff = (U8*) &val;
+ //write to binary buffer
+ tc[tc_idx++] = buff[0];
+ tc[tc_idx++] = buff[1];
+ }
+ }
}
U32 idx_idx = 0;
@@ -1506,13 +1515,20 @@ LLSD LLModel::writeModel(
//write out face data
mdl[model_names[idx]][i]["PositionDomain"]["Min"] = min_pos.getValue();
mdl[model_names[idx]][i]["PositionDomain"]["Max"] = max_pos.getValue();
+ mdl[model_names[idx]][i]["Position"] = verts;
+
+ if (face.mNormals)
+ {
+ mdl[model_names[idx]][i]["Normal"] = normals;
+ }
- mdl[model_names[idx]][i]["TexCoord0Domain"]["Min"] = min_tc.getValue();
- mdl[model_names[idx]][i]["TexCoord0Domain"]["Max"] = max_tc.getValue();
+ if (face.mTexCoords)
+ {
+ mdl[model_names[idx]][i]["TexCoord0Domain"]["Min"] = min_tc.getValue();
+ mdl[model_names[idx]][i]["TexCoord0Domain"]["Max"] = max_tc.getValue();
+ mdl[model_names[idx]][i]["TexCoord0"] = tc;
+ }
- mdl[model_names[idx]][i]["Position"] = verts;
- mdl[model_names[idx]][i]["Normal"] = normals;
- mdl[model_names[idx]][i]["TexCoord0"] = tc;
mdl[model_names[idx]][i]["TriangleList"] = indices;
if (skinning)
@@ -1532,11 +1548,6 @@ LLSD LLModel::writeModel(
weight_list& weights = high->getJointInfluences(pos);
- if (weights.size() > 4)
- {
- llerrs << "WTF?" << llendl;
- }
-
S32 count = 0;
for (weight_list::iterator iter = weights.begin(); iter != weights.end(); ++iter)
{
@@ -1575,10 +1586,10 @@ LLSD LLModel::writeModel(
}
}
- return writeModelToStream(ostr, mdl, nowrite);
+ return writeModelToStream(ostr, mdl, nowrite, as_slm);
}
-LLSD LLModel::writeModelToStream(std::ostream& ostr, LLSD& mdl, BOOL nowrite)
+LLSD LLModel::writeModelToStream(std::ostream& ostr, LLSD& mdl, BOOL nowrite, BOOL as_slm)
{
U32 bytes = 0;
@@ -1586,6 +1597,11 @@ LLSD LLModel::writeModelToStream(std::ostream& ostr, LLSD& mdl, BOOL nowrite)
LLSD header;
+ if (as_slm && mdl.has("material_list"))
+ { //save material binding names to header
+ header["material_list"] = mdl["material_list"];
+ }
+
std::string skin;
if (mdl.has("skin"))
@@ -1600,23 +1616,19 @@ LLSD LLModel::writeModelToStream(std::ostream& ostr, LLSD& mdl, BOOL nowrite)
cur_offset += size;
bytes += size;
}
- else
- {
- llerrs << "WTF?" << llendl;
- }
}
std::string decomposition;
- if (mdl.has("decomposition"))
+ if (mdl.has("physics_convex"))
{ //write out convex decomposition
- decomposition = zip_llsd(mdl["decomposition"]);
+ decomposition = zip_llsd(mdl["physics_convex"]);
U32 size = decomposition.size();
if (size > 0)
{
- header["decomposition"]["offset"] = (LLSD::Integer) cur_offset;
- header["decomposition"]["size"] = (LLSD::Integer) size;
+ header["physics_convex"]["offset"] = (LLSD::Integer) cur_offset;
+ header["physics_convex"]["size"] = (LLSD::Integer) size;
cur_offset += size;
bytes += size;
}
@@ -1637,11 +1649,6 @@ LLSD LLModel::writeModelToStream(std::ostream& ostr, LLSD& mdl, BOOL nowrite)
cur_offset += size;
bytes += size;
}
- else
- {
- header[model_names[i]]["offset"] = -1;
- header[model_names[i]]["size"] = 0;
- }
}
if (!nowrite)
@@ -1655,7 +1662,7 @@ LLSD LLModel::writeModelToStream(std::ostream& ostr, LLSD& mdl, BOOL nowrite)
if (!decomposition.empty())
{ //write decomposition block
- ostr.write((const char*) decomposition.data(), header["decomposition"]["size"].asInteger());
+ ostr.write((const char*) decomposition.data(), header["physics_convex"]["size"].asInteger());
}
for (S32 i = 0; i < MODEL_NAMES_LENGTH; i++)
@@ -1678,7 +1685,7 @@ LLModel::weight_list& LLModel::getJointInfluences(const LLVector3& pos)
{
if ((iter->first - pos).magVec() > 0.1f)
{
- llerrs << "WTF?" << llendl;
+ llerrs << "Couldn't find weight list." << llendl;
}
return iter->second;
@@ -1771,7 +1778,7 @@ void LLModel::updateHullCenters()
if (mHullPoints > 0)
{
mCenterOfHullCenters *= 1.f / mHullPoints;
- llassert(mPhysics.asLLSD().has("HullList"));
+ llassert(mPhysics.hasHullList());
}
}
@@ -1788,13 +1795,22 @@ bool LLModel::loadModel(std::istream& is)
}
}
+ if (header.has("material_list"))
+ { //load material list names
+ mMaterialList.clear();
+ for (U32 i = 0; i < header["material_list"].size(); ++i)
+ {
+ mMaterialList.push_back(header["material_list"][i].asString());
+ }
+ }
+
std::string nm[] =
{
"lowest_lod",
"low_lod",
"medium_lod",
"high_lod",
- "physics_shape",
+ "physics_mesh",
};
const S32 MODEL_LODS = 5;
@@ -1804,6 +1820,7 @@ bool LLModel::loadModel(std::istream& is)
if (header[nm[lod]]["offset"].asInteger() == -1 ||
header[nm[lod]]["size"].asInteger() == 0 )
{ //cannot load requested LOD
+ llwarns << "LoD data is invalid!" << llendl;
return false;
}
@@ -1817,7 +1834,7 @@ bool LLModel::loadModel(std::istream& is)
is.seekg(cur_pos);
}
- if (lod == LLModel::LOD_PHYSICS)
+ if (lod == LLModel::LOD_HIGH || lod == LLModel::LOD_PHYSICS)
{
std::ios::pos_type cur_pos = is.tellg();
loadDecomposition(header, is);
@@ -1864,11 +1881,66 @@ bool LLModel::loadModel(std::istream& is)
}
return true;
}
+ else
+ {
+ llwarns << "unpackVolumeFaces failed!" << llendl;
+ }
return false;
}
+void LLModel::matchMaterialOrder(LLModel* ref)
+{
+ llassert(ref->mMaterialList.size() == mMaterialList.size());
+
+ std::map<std::string, U32> index_map;
+
+ //build a map of material slot names to face indexes
+ bool reorder = false;
+ std::set<std::string> base_mat;
+ std::set<std::string> cur_mat;
+
+ for (U32 i = 0; i < mMaterialList.size(); i++)
+ {
+ index_map[ref->mMaterialList[i]] = i;
+ if (!reorder)
+ { //if any material name does not match reference, we need to reorder
+ reorder = ref->mMaterialList[i] != mMaterialList[i];
+ }
+ base_mat.insert(ref->mMaterialList[i]);
+ cur_mat.insert(mMaterialList[i]);
+ }
+
+
+ if (reorder &&
+ base_mat == cur_mat) //don't reorder if material name sets don't match
+ {
+ std::vector<LLVolumeFace> new_face_list;
+ new_face_list.resize(mVolumeFaces.size());
+
+ std::vector<std::string> new_material_list;
+ new_material_list.resize(mVolumeFaces.size());
+
+ //rebuild face list so materials have the same order
+ //as the reference model
+ for (U32 i = 0; i < mMaterialList.size(); ++i)
+ {
+ U32 ref_idx = index_map[mMaterialList[i]];
+ new_face_list[ref_idx] = mVolumeFaces[i];
+
+ new_material_list[ref_idx] = mMaterialList[i];
+ }
+
+ llassert(new_material_list == ref->mMaterialList);
+
+ mVolumeFaces = new_face_list;
+ }
+
+ //override material list with reference model ordering
+ mMaterialList = ref->mMaterialList;
+}
+
bool LLModel::loadSkinInfo(LLSD& header, std::istream &is)
{
@@ -1893,8 +1965,8 @@ bool LLModel::loadSkinInfo(LLSD& header, std::istream &is)
bool LLModel::loadDecomposition(LLSD& header, std::istream& is)
{
- S32 offset = header["decomposition"]["offset"].asInteger();
- S32 size = header["decomposition"]["size"].asInteger();
+ S32 offset = header["physics_convex"]["offset"].asInteger();
+ S32 size = header["physics_convex"]["size"].asInteger();
if (offset >= 0 && size > 0)
{
@@ -2030,11 +2102,11 @@ LLModel::Decomposition::Decomposition(LLSD& data)
void LLModel::Decomposition::fromLLSD(LLSD& decomp)
{
- if (decomp.has("HullList"))
+ if (decomp.has("HullList") && decomp.has("Positions"))
{
// updated for const-correctness. gcc is picky about this type of thing - Nyx
const LLSD::Binary& hulls = decomp["HullList"].asBinary();
- const LLSD::Binary& position = decomp["Position"].asBinary();
+ const LLSD::Binary& position = decomp["Positions"].asBinary();
U16* p = (U16*) &position[0];
@@ -2044,11 +2116,19 @@ void LLModel::Decomposition::fromLLSD(LLSD& decomp)
LLVector3 max;
LLVector3 range;
- min.setValue(decomp["Min"]);
- max.setValue(decomp["Max"]);
+ if (decomp.has("Min"))
+ {
+ min.setValue(decomp["Min"]);
+ max.setValue(decomp["Max"]);
+ }
+ else
+ {
+ min.set(-0.5f, -0.5f, -0.5f);
+ max.set(0.5f, 0.5f, 0.5f);
+ }
+
range = max-min;
-
for (U32 i = 0; i < hulls.size(); ++i)
{
U16 count = (hulls[i] == 0) ? 256 : hulls[i];
@@ -2064,6 +2144,7 @@ void LLModel::Decomposition::fromLLSD(LLSD& decomp)
//point must be unique
//llassert(valid.find(test) == valid.end());
valid.insert(test);
+
mHull[i].push_back(LLVector3(
(F32) p[0]/65535.f*range.mV[0]+min.mV[0],
(F32) p[1]/65535.f*range.mV[1]+min.mV[1],
@@ -2078,9 +2159,9 @@ void LLModel::Decomposition::fromLLSD(LLSD& decomp)
}
}
- if (decomp.has("Hull"))
+ if (decomp.has("BoundingVerts"))
{
- const LLSD::Binary& position = decomp["Hull"].asBinary();
+ const LLSD::Binary& position = decomp["BoundingVerts"].asBinary();
U16* p = (U16*) &position[0];
@@ -2116,10 +2197,15 @@ void LLModel::Decomposition::fromLLSD(LLSD& decomp)
{
//empty base hull mesh to indicate decomposition has been loaded
//but contains no base hull
- mBaseHullMesh.clear();;
+ mBaseHullMesh.clear();
}
}
+bool LLModel::Decomposition::hasHullList() const
+{
+ return !mHull.empty() ;
+}
+
LLSD LLModel::Decomposition::asLLSD() const
{
LLSD ret;
@@ -2130,11 +2216,9 @@ LLSD LLModel::Decomposition::asLLSD() const
}
//write decomposition block
- // ["decomposition"]["HullList"] -- list of 8 bit integers, each entry represents a hull with specified number of points
- // ["decomposition"]["PositionDomain"]["Min"/"Max"]
- // ["decomposition"]["Position"] -- list of 16-bit integers to be decoded to given domain, encoded 3D points
- // ["decomposition"]["Hull"] -- list of 16-bit integers to be decoded to given domain, encoded 3D points representing a single hull approximation of given shape
-
+ // ["physics_convex"]["HullList"] -- list of 8 bit integers, each entry represents a hull with specified number of points
+ // ["physics_convex"]["Position"] -- list of 16-bit integers to be decoded to given domain, encoded 3D points
+ // ["physics_convex"]["BoundingVerts"] -- list of 16-bit integers to be decoded to given domain, encoded 3D points representing a single hull approximation of given shape
//get minimum and maximum
LLVector3 min;
@@ -2174,6 +2258,8 @@ LLSD LLModel::Decomposition::asLLSD() const
ret["Min"] = min.getValue();
ret["Max"] = max.getValue();
+ LLVector3 range = max-min;
+
if (!hulls.empty())
{
ret["HullList"] = hulls;
@@ -2183,8 +2269,6 @@ LLSD LLModel::Decomposition::asLLSD() const
{
LLSD::Binary p(total*3*2);
- LLVector3 range = max-min;
-
U32 vert_idx = 0;
for (U32 i = 0; i < mHull.size(); ++i)
@@ -2196,19 +2280,24 @@ LLSD LLModel::Decomposition::asLLSD() const
for (U32 j = 0; j < mHull[i].size(); ++j)
{
U64 test = 0;
+ const F32* src = mHull[i][j].mV;
+
for (U32 k = 0; k < 3; k++)
{
//convert to 16-bit normalized across domain
- U16 val = (U16) (((mHull[i][j].mV[k]-min.mV[k])/range.mV[k])*65535);
+ U16 val = (U16) (((src[k]-min.mV[k])/range.mV[k])*65535);
- switch (k)
+ if(valid.size() < 3)
{
- case 0: test = test | (U64) val; break;
- case 1: test = test | ((U64) val << 16); break;
- case 2: test = test | ((U64) val << 32); break;
- };
+ switch (k)
+ {
+ case 0: test = test | (U64) val; break;
+ case 1: test = test | ((U64) val << 16); break;
+ case 2: test = test | ((U64) val << 32); break;
+ };
- valid.insert(test);
+ valid.insert(test);
+ }
U8* buff = (U8*) &val;
//write to binary buffer
@@ -2220,26 +2309,28 @@ LLSD LLModel::Decomposition::asLLSD() const
}
}
- //must have at least 4 unique points
- llassert(valid.size() > 3);
+ //must have at least 3 unique points
+ llassert(valid.size() > 2);
}
- ret["Position"] = p;
+ ret["Positions"] = p;
}
+ //llassert(!mBaseHull.empty());
+
if (!mBaseHull.empty())
{
LLSD::Binary p(mBaseHull.size()*3*2);
- LLVector3 range = max-min;
-
U32 vert_idx = 0;
for (U32 j = 0; j < mBaseHull.size(); ++j)
{
+ const F32* v = mBaseHull[j].mV;
+
for (U32 k = 0; k < 3; k++)
{
//convert to 16-bit normalized across domain
- U16 val = (U16) (((mBaseHull[j].mV[k]-min.mV[k])/range.mV[k])*65535);
+ U16 val = (U16) (((v[k]-min.mV[k])/range.mV[k])*65535);
U8* buff = (U8*) &val;
//write to binary buffer
@@ -2248,12 +2339,12 @@ LLSD LLModel::Decomposition::asLLSD() const
if (vert_idx > p.size())
{
- llerrs << "WTF?" << llendl;
+ llerrs << "Index out of bounds" << llendl;
}
}
}
- ret["Hull"] = p;
+ ret["BoundingVerts"] = p;
}
return ret;
@@ -2283,10 +2374,5 @@ void LLModel::Decomposition::merge(const LLModel::Decomposition* rhs)
{ //take physics shape mesh from rhs
mPhysicsShapeMesh = rhs->mPhysicsShapeMesh;
}
-
- if (!mHull.empty())
- { //verify
- llassert(asLLSD().has("HullList"));
- }
}
diff --git a/indra/llprimitive/llmodel.h b/indra/llprimitive/llmodel.h
index 23f4b5cb42..3f58eba07d 100644
--- a/indra/llprimitive/llmodel.h
+++ b/indra/llprimitive/llmodel.h
@@ -73,6 +73,7 @@ public:
{
NO_ERRORS = 0,
VERTEX_NUMBER_OVERFLOW, //vertex number is >= 65535.
+ BAD_ELEMENT,
INVALID_STATUS
} ;
@@ -106,6 +107,7 @@ public:
Decomposition(LLSD& data);
void fromLLSD(LLSD& data);
LLSD asLLSD() const;
+ bool hasHullList() const;
void merge(const Decomposition* rhs);
@@ -135,12 +137,13 @@ public:
const LLModel::Decomposition& decomp,
BOOL upload_skin,
BOOL upload_joints,
- BOOL nowrite = FALSE);
+ BOOL nowrite = FALSE,
+ BOOL as_slm = FALSE);
static LLSD writeModelToStream(
std::ostream& ostr,
LLSD& mdl,
- BOOL nowrite = FALSE);
+ BOOL nowrite = FALSE, BOOL as_slm = FALSE);
static LLModel* loadModelFromDomMesh(domMesh* mesh);
static std::string getElementLabel(daeElement* element);
@@ -169,6 +172,11 @@ public:
void optimizeVolumeFaces();
void offsetMesh( const LLVector3& pivotPoint );
void getNormalizedScaleTranslation(LLVector3& scale_out, LLVector3& translation_out);
+
+ //reorder face list based on mMaterialList in this and reference so
+ //order matches that of reference (material ordering touchup)
+ void matchMaterialOrder(LLModel* reference);
+
std::vector<std::string> mMaterialList;
//data used for skin weights
diff --git a/indra/llprimitive/llprimitive.h b/indra/llprimitive/llprimitive.h
index 76faa1b8c5..998016f8f6 100644
--- a/indra/llprimitive/llprimitive.h
+++ b/indra/llprimitive/llprimitive.h
@@ -103,6 +103,8 @@ public:
PARAMS_LIGHT = 0x20,
PARAMS_SCULPT = 0x30,
PARAMS_LIGHT_IMAGE = 0x40,
+ PARAMS_RESERVED = 0x50, // Used on server-side
+ PARAMS_MESH = 0x60,
};
public:
diff --git a/indra/llrender/llfontgl.cpp b/indra/llrender/llfontgl.cpp
index d6a31dc862..180ae4dfa6 100644
--- a/indra/llrender/llfontgl.cpp
+++ b/indra/llrender/llfontgl.cpp
@@ -554,7 +554,7 @@ S32 LLFontGL::maxDrawableChars(const llwchar* wchars, F32 max_pixels, S32 max_ch
BOOL in_word = FALSE;
// avoid S32 overflow when max_pixels == S32_MAX by staying in floating point
- F32 scaled_max_pixels = ceil(max_pixels * sScaleX);
+ F32 scaled_max_pixels = max_pixels * sScaleX;
F32 width_padding = 0.f;
LLFontGlyphInfo* next_glyph = NULL;
diff --git a/indra/llrender/llgl.cpp b/indra/llrender/llgl.cpp
index f29ee0e57e..c224ab0e9b 100644
--- a/indra/llrender/llgl.cpp
+++ b/indra/llrender/llgl.cpp
@@ -127,6 +127,11 @@ PFNGLUNMAPBUFFERARBPROC glUnmapBufferARB = NULL;
PFNGLGETBUFFERPARAMETERIVARBPROC glGetBufferParameterivARB = NULL;
PFNGLGETBUFFERPOINTERVARBPROC glGetBufferPointervARB = NULL;
+// GL_ARB_map_buffer_range
+PFNGLMAPBUFFERRANGEPROC glMapBufferRange;
+PFNGLFLUSHMAPPEDBUFFERRANGEPROC glFlushMappedBufferRange;
+
+
// vertex object prototypes
PFNGLNEWOBJECTBUFFERATIPROC glNewObjectBufferATI = NULL;
PFNGLISOBJECTBUFFERATIPROC glIsObjectBufferATI = NULL;
@@ -178,6 +183,12 @@ PFNGLBLITFRAMEBUFFERPROC glBlitFramebuffer = NULL;
PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC glRenderbufferStorageMultisample = NULL;
PFNGLFRAMEBUFFERTEXTURELAYERPROC glFramebufferTextureLayer = NULL;
+//GL_ARB_texture_multisample
+PFNGLTEXIMAGE2DMULTISAMPLEPROC glTexImage2DMultisample;
+PFNGLTEXIMAGE3DMULTISAMPLEPROC glTexImage3DMultisample;
+PFNGLGETMULTISAMPLEFVPROC glGetMultisamplefv;
+PFNGLSAMPLEMASKIPROC glSampleMaski;
+
// GL_EXT_blend_func_separate
PFNGLBLENDFUNCSEPARATEEXTPROC glBlendFuncSeparateEXT = NULL;
@@ -321,18 +332,26 @@ LLGLManager::LLGLManager() :
mHasMipMapGeneration(FALSE),
mHasCompressedTextures(FALSE),
mHasFramebufferObject(FALSE),
+ mMaxSamples(0),
mHasBlendFuncSeparate(FALSE),
mHasVertexBufferObject(FALSE),
+ mHasMapBufferRange(FALSE),
mHasPBuffer(FALSE),
mHasShaderObjects(FALSE),
mHasVertexShader(FALSE),
mHasFragmentShader(FALSE),
+ mNumTextureImageUnits(0),
mHasOcclusionQuery(FALSE),
mHasOcclusionQuery2(FALSE),
mHasPointParameters(FALSE),
mHasDrawBuffers(FALSE),
mHasTextureRectangle(FALSE),
+ mHasTextureMultisample(FALSE),
+ mMaxSampleMaskWords(0),
+ mMaxColorTextureSamples(0),
+ mMaxDepthTextureSamples(0),
+ mMaxIntegerSamples(0),
mHasAnisotropic(FALSE),
mHasARBEnvCombine(FALSE),
@@ -534,6 +553,33 @@ 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);
+ }
+
+ if (mHasTextureMultisample)
+ {
+ glGetIntegerv(GL_MAX_COLOR_TEXTURE_SAMPLES, &mMaxColorTextureSamples);
+ glGetIntegerv(GL_MAX_DEPTH_TEXTURE_SAMPLES, &mMaxDepthTextureSamples);
+ glGetIntegerv(GL_MAX_INTEGER_SAMPLES, &mMaxIntegerSamples);
+ glGetIntegerv(GL_MAX_SAMPLE_MASK_WORDS, &mMaxSampleMaskWords);
+ }
+
+#if LL_WINDOWS
+ if (mIsATI)
+ { //using multisample textures on ATI results in black screen for some reason
+ mHasTextureMultisample = FALSE;
+ }
+#endif
+
+ if (mHasFramebufferObject)
+ {
+ glGetIntegerv(GL_MAX_SAMPLES, &mMaxSamples);
+ }
+
setToDebugGPU();
initGLStates();
@@ -640,6 +686,14 @@ 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)
@@ -720,6 +774,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);
+ mHasMapBufferRange = ExtensionExists("GL_ARB_map_buffer_range", gGLHExts.mSysExts);
mHasDepthClamp = ExtensionExists("GL_ARB_depth_clamp", gGLHExts.mSysExts) || ExtensionExists("GL_NV_depth_clamp", gGLHExts.mSysExts);
// mask out FBO support when packed_depth_stencil isn't there 'cause we need it for LLRenderTarget -Brad
#ifdef GL_ARB_framebuffer_object
@@ -734,6 +789,7 @@ void LLGLManager::initExtensions()
mHasDrawBuffers = ExtensionExists("GL_ARB_draw_buffers", gGLHExts.mSysExts);
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);
#if !LL_DARWIN
mHasPointParameters = !mIsATI && ExtensionExists("GL_ARB_point_parameters", gGLHExts.mSysExts);
#endif
@@ -878,11 +934,13 @@ void LLGLManager::initExtensions()
LL_INFOS("RenderInit") << "Disabling mip-map generation for Intel GPUs" << LL_ENDL;
mHasMipMapGeneration = FALSE;
}
+#if !LL_DARWIN
if (mIsATI && mHasMipMapGeneration)
{
LL_INFOS("RenderInit") << "Disabling mip-map generation for ATI GPUs (performance opt)" << LL_ENDL;
mHasMipMapGeneration = FALSE;
}
+#endif
// Misc
glGetIntegerv(GL_MAX_ELEMENTS_VERTICES, (GLint*) &mGLMaxVertexRange);
@@ -911,6 +969,11 @@ void LLGLManager::initExtensions()
mHasVertexBufferObject = FALSE;
}
}
+ if (mHasMapBufferRange)
+ {
+ glMapBufferRange = (PFNGLMAPBUFFERRANGEPROC) GLH_EXT_GET_PROC_ADDRESS("glMapBufferRange");
+ glFlushMappedBufferRange = (PFNGLFLUSHMAPPEDBUFFERRANGEPROC) GLH_EXT_GET_PROC_ADDRESS("glFlushMappedBufferRange");
+ }
if (mHasFramebufferObject)
{
llinfos << "initExtensions() FramebufferObject-related procs..." << llendl;
@@ -943,6 +1006,13 @@ void LLGLManager::initExtensions()
{
glBlendFuncSeparateEXT = (PFNGLBLENDFUNCSEPARATEEXTPROC) GLH_EXT_GET_PROC_ADDRESS("glBlendFuncSeparateEXT");
}
+ if (mHasTextureMultisample)
+ {
+ glTexImage2DMultisample = (PFNGLTEXIMAGE2DMULTISAMPLEPROC) GLH_EXT_GET_PROC_ADDRESS("glTexImage2DMultisample");
+ glTexImage3DMultisample = (PFNGLTEXIMAGE3DMULTISAMPLEPROC) GLH_EXT_GET_PROC_ADDRESS("glTexImage3DMultisample");
+ glGetMultisamplefv = (PFNGLGETMULTISAMPLEFVPROC) GLH_EXT_GET_PROC_ADDRESS("glGetMultisamplefv");
+ glSampleMaski = (PFNGLSAMPLEMASKIPROC) GLH_EXT_GET_PROC_ADDRESS("glSampleMaski");
+ }
#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");
@@ -1360,10 +1430,6 @@ void LLGLState::checkTextureChannels(const std::string& msg)
}
}
- GLint maxTextureUnits = 0;
- glGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB, &maxTextureUnits);
- stop_glerror();
-
static const char* label[] =
{
"GL_TEXTURE_2D",
@@ -1374,7 +1440,8 @@ void LLGLState::checkTextureChannels(const std::string& msg)
"GL_TEXTURE_GEN_T",
"GL_TEXTURE_GEN_Q",
"GL_TEXTURE_GEN_R",
- "GL_TEXTURE_RECTANGLE_ARB"
+ "GL_TEXTURE_RECTANGLE_ARB",
+ "GL_TEXTURE_2D_MULTISAMPLE"
};
static GLint value[] =
@@ -1387,7 +1454,8 @@ void LLGLState::checkTextureChannels(const std::string& msg)
GL_TEXTURE_GEN_T,
GL_TEXTURE_GEN_Q,
GL_TEXTURE_GEN_R,
- GL_TEXTURE_RECTANGLE_ARB
+ GL_TEXTURE_RECTANGLE_ARB,
+ GL_TEXTURE_2D_MULTISAMPLE
};
GLint stackDepth = 0;
@@ -1396,68 +1464,96 @@ void LLGLState::checkTextureChannels(const std::string& msg)
glh::matrix4f identity;
identity.identity();
- for (GLint i = 1; i < maxTextureUnits; i++)
+ for (GLint i = 1; i < gGLManager.mNumTextureUnits; i++)
{
gGL.getTexUnit(i)->activate();
- glClientActiveTextureARB(GL_TEXTURE0_ARB+i);
- stop_glerror();
- glGetIntegerv(GL_TEXTURE_STACK_DEPTH, &stackDepth);
- stop_glerror();
- if (stackDepth != 1)
+ if (i < gGLManager.mNumTextureUnits)
{
- error = TRUE;
- LL_WARNS("RenderState") << "Texture matrix stack corrupted." << LL_ENDL;
+ glClientActiveTextureARB(GL_TEXTURE0_ARB+i);
+ stop_glerror();
+ glGetIntegerv(GL_TEXTURE_STACK_DEPTH, &stackDepth);
+ stop_glerror();
- if (gDebugSession)
+ if (stackDepth != 1)
{
- gFailLog << "Texture matrix stack corrupted." << std::endl;
+ error = TRUE;
+ LL_WARNS("RenderState") << "Texture matrix stack corrupted." << LL_ENDL;
+
+ if (gDebugSession)
+ {
+ gFailLog << "Texture matrix stack corrupted." << std::endl;
+ }
}
- }
- glGetFloatv(GL_TEXTURE_MATRIX, (GLfloat*) mat.m);
- stop_glerror();
+ glGetFloatv(GL_TEXTURE_MATRIX, (GLfloat*) mat.m);
+ stop_glerror();
- if (mat != identity)
- {
- error = TRUE;
- LL_WARNS("RenderState") << "Texture matrix in channel " << i << " corrupt." << LL_ENDL;
- if (gDebugSession)
+ if (mat != identity)
{
- gFailLog << "Texture matrix in channel " << i << " corrupt." << std::endl;
+ error = TRUE;
+ LL_WARNS("RenderState") << "Texture matrix in channel " << i << " corrupt." << LL_ENDL;
+ if (gDebugSession)
+ {
+ gFailLog << "Texture matrix in channel " << i << " corrupt." << std::endl;
+ }
+ }
+
+ for (S32 j = (i == 0 ? 1 : 0);
+ j < 9; j++)
+ {
+ if (j == 8 && !gGLManager.mHasTextureRectangle ||
+ j == 9 && !gGLManager.mHasTextureMultisample)
+ {
+ continue;
+ }
+
+ if (glIsEnabled(value[j]))
+ {
+ error = TRUE;
+ LL_WARNS("RenderState") << "Texture channel " << i << " still has " << label[j] << " enabled." << LL_ENDL;
+ if (gDebugSession)
+ {
+ gFailLog << "Texture channel " << i << " still has " << label[j] << " enabled." << std::endl;
+ }
+ }
+ stop_glerror();
}
- }
-
- for (S32 j = (i == 0 ? 1 : 0);
- j < (gGLManager.mHasTextureRectangle ? 9 : 8); j++)
- {
- if (glIsEnabled(value[j]))
+ glGetFloatv(GL_TEXTURE_MATRIX, mat.m);
+ stop_glerror();
+
+ if (mat != identity)
{
error = TRUE;
- LL_WARNS("RenderState") << "Texture channel " << i << " still has " << label[j] << " enabled." << LL_ENDL;
+ LL_WARNS("RenderState") << "Texture matrix " << i << " is not identity." << LL_ENDL;
if (gDebugSession)
{
- gFailLog << "Texture channel " << i << " still has " << label[j] << " enabled." << std::endl;
+ gFailLog << "Texture matrix " << i << " is not identity." << std::endl;
}
}
- stop_glerror();
}
- glGetFloatv(GL_TEXTURE_MATRIX, mat.m);
- stop_glerror();
-
- if (mat != identity)
{
- error = TRUE;
- LL_WARNS("RenderState") << "Texture matrix " << i << " is not identity." << LL_ENDL;
- if (gDebugSession)
+ GLint tex = 0;
+ stop_glerror();
+ glGetIntegerv(GL_TEXTURE_BINDING_2D, &tex);
+ stop_glerror();
+
+ if (tex != 0)
{
- gFailLog << "Texture matrix " << i << " is not identity." << std::endl;
+ error = TRUE;
+ LL_WARNS("RenderState") << "Texture channel " << i << " still has texture " << tex << " bound." << llendl;
+
+ if (gDebugSession)
+ {
+ gFailLog << "Texture channel " << i << " still has texture " << tex << " bound." << std::endl;
+ }
}
}
}
+ stop_glerror();
gGL.getTexUnit(0)->activate();
glClientActiveTextureARB(GL_TEXTURE0_ARB);
stop_glerror();
diff --git a/indra/llrender/llgl.h b/indra/llrender/llgl.h
index 3d002fd8c4..d1bee00161 100644
--- a/indra/llrender/llgl.h
+++ b/indra/llrender/llgl.h
@@ -83,20 +83,28 @@ public:
BOOL mHasMipMapGeneration;
BOOL mHasCompressedTextures;
BOOL mHasFramebufferObject;
+ S32 mMaxSamples;
BOOL mHasBlendFuncSeparate;
-
+
// ARB Extensions
BOOL mHasVertexBufferObject;
+ BOOL mHasMapBufferRange;
BOOL mHasPBuffer;
BOOL mHasShaderObjects;
BOOL mHasVertexShader;
BOOL mHasFragmentShader;
+ S32 mNumTextureImageUnits;
BOOL mHasOcclusionQuery;
BOOL mHasOcclusionQuery2;
BOOL mHasPointParameters;
BOOL mHasDrawBuffers;
BOOL mHasDepthClamp;
BOOL mHasTextureRectangle;
+ BOOL mHasTextureMultisample;
+ S32 mMaxSampleMaskWords;
+ S32 mMaxColorTextureSamples;
+ S32 mMaxDepthTextureSamples;
+ S32 mMaxIntegerSamples;
// Other extensions.
BOOL mHasAnisotropic;
@@ -138,6 +146,7 @@ public:
void printGLInfoString();
void getGLInfo(LLSD& info);
+ U32 getNumFBOFSAASamples(U32 desired_samples = 32);
// In ALL CAPS
std::string mGLVendor;
std::string mGLVendorShort;
diff --git a/indra/llrender/llglheaders.h b/indra/llrender/llglheaders.h
index d8140a124d..f35f329f00 100644
--- a/indra/llrender/llglheaders.h
+++ b/indra/llrender/llglheaders.h
@@ -68,6 +68,10 @@ extern PFNGLUNMAPBUFFERARBPROC glUnmapBufferARB;
extern PFNGLGETBUFFERPARAMETERIVARBPROC glGetBufferParameterivARB;
extern PFNGLGETBUFFERPOINTERVARBPROC glGetBufferPointervARB;
+// GL_ARB_map_buffer_range
+extern PFNGLMAPBUFFERRANGEPROC glMapBufferRange;
+extern PFNGLFLUSHMAPPEDBUFFERRANGEPROC glFlushMappedBufferRange;
+
// GL_ATI_vertex_array_object
extern PFNGLNEWOBJECTBUFFERATIPROC glNewObjectBufferATI;
extern PFNGLISOBJECTBUFFERATIPROC glIsObjectBufferATI;
@@ -306,6 +310,10 @@ extern PFNGLUNMAPBUFFERARBPROC glUnmapBufferARB;
extern PFNGLGETBUFFERPARAMETERIVARBPROC glGetBufferParameterivARB;
extern PFNGLGETBUFFERPOINTERVARBPROC glGetBufferPointervARB;
+// GL_ARB_map_buffer_range
+extern PFNGLMAPBUFFERRANGEPROC glMapBufferRange;
+extern PFNGLFLUSHMAPPEDBUFFERRANGEPROC glFlushMappedBufferRange;
+
// GL_ATI_vertex_array_object
extern PFNGLNEWOBJECTBUFFERATIPROC glNewObjectBufferATI;
extern PFNGLISOBJECTBUFFERATIPROC glIsObjectBufferATI;
@@ -474,6 +482,11 @@ extern PFNGLFRAMEBUFFERTEXTURELAYERPROC glFramebufferTextureLayer;
//GL_ARB_draw_buffers
extern PFNGLDRAWBUFFERSARBPROC glDrawBuffersARB;
+//GL_ARB_texture_multisample
+extern PFNGLTEXIMAGE2DMULTISAMPLEPROC glTexImage2DMultisample;
+extern PFNGLTEXIMAGE3DMULTISAMPLEPROC glTexImage3DMultisample;
+extern PFNGLGETMULTISAMPLEFVPROC glGetMultisamplefv;
+extern PFNGLSAMPLEMASKIPROC glSampleMaski;
#elif LL_WINDOWS
//----------------------------------------------------------------------------
@@ -506,6 +519,10 @@ extern PFNGLUNMAPBUFFERARBPROC glUnmapBufferARB;
extern PFNGLGETBUFFERPARAMETERIVARBPROC glGetBufferParameterivARB;
extern PFNGLGETBUFFERPOINTERVARBPROC glGetBufferPointervARB;
+// GL_ARB_map_buffer_range
+extern PFNGLMAPBUFFERRANGEPROC glMapBufferRange;
+extern PFNGLFLUSHMAPPEDBUFFERRANGEPROC glFlushMappedBufferRange;
+
// GL_ATI_vertex_array_object
extern PFNGLNEWOBJECTBUFFERATIPROC glNewObjectBufferATI;
extern PFNGLISOBJECTBUFFERATIPROC glIsObjectBufferATI;
@@ -673,6 +690,11 @@ extern PFNGLFRAMEBUFFERTEXTURELAYERPROC glFramebufferTextureLayer;
//GL_ARB_draw_buffers
extern PFNGLDRAWBUFFERSARBPROC glDrawBuffersARB;
+//GL_ARB_texture_multisample
+extern PFNGLTEXIMAGE2DMULTISAMPLEPROC glTexImage2DMultisample;
+extern PFNGLTEXIMAGE3DMULTISAMPLEPROC glTexImage3DMultisample;
+extern PFNGLGETMULTISAMPLEFVPROC glGetMultisamplefv;
+extern PFNGLSAMPLEMASKIPROC glSampleMaski;
#elif LL_DARWIN
//----------------------------------------------------------------------------
@@ -714,13 +736,55 @@ extern void glGenerateMipmapEXT(GLenum target) AVAILABLE_MAC_OS_X_VERSION_10_4_A
#ifndef GL_ARB_framebuffer_object
#define glGenerateMipmap glGenerateMipmapEXT
+#define GL_MAX_SAMPLES 0x8D57
#endif
+
// GL_ARB_draw_buffers
extern void glDrawBuffersARB(GLsizei n, const GLenum* bufs) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER;
#ifdef __cplusplus
extern "C" {
#endif
+
+//
+// Define map buffer range headers on Mac
+//
+#ifndef GL_ARB_map_buffer_range
+#define GL_MAP_READ_BIT 0x0001
+#define GL_MAP_WRITE_BIT 0x0002
+#define GL_MAP_INVALIDATE_RANGE_BIT 0x0004
+#define GL_MAP_INVALIDATE_BUFFER_BIT 0x0008
+#define GL_MAP_FLUSH_EXPLICIT_BIT 0x0010
+#define GL_MAP_UNSYNCHRONIZED_BIT 0x0020
+#endif
+
+//
+// Define multisample headers on Mac
+//
+#ifndef GL_ARB_texture_multisample
+#define GL_SAMPLE_POSITION 0x8E50
+#define GL_SAMPLE_MASK 0x8E51
+#define GL_SAMPLE_MASK_VALUE 0x8E52
+#define GL_MAX_SAMPLE_MASK_WORDS 0x8E59
+#define GL_TEXTURE_2D_MULTISAMPLE 0x9100
+#define GL_PROXY_TEXTURE_2D_MULTISAMPLE 0x9101
+#define GL_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9102
+#define GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9103
+#define GL_TEXTURE_BINDING_2D_MULTISAMPLE 0x9104
+#define GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY 0x9105
+#define GL_TEXTURE_SAMPLES 0x9106
+#define GL_TEXTURE_FIXED_SAMPLE_LOCATIONS 0x9107
+#define GL_SAMPLER_2D_MULTISAMPLE 0x9108
+#define GL_INT_SAMPLER_2D_MULTISAMPLE 0x9109
+#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE 0x910A
+#define GL_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910B
+#define GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910C
+#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910D
+#define GL_MAX_COLOR_TEXTURE_SAMPLES 0x910E
+#define GL_MAX_DEPTH_TEXTURE_SAMPLES 0x910F
+#define GL_MAX_INTEGER_SAMPLES 0x9110
+#endif
+
//
// Define vertex buffer object headers on Mac
//
@@ -757,7 +821,7 @@ extern "C" {
#define GL_DYNAMIC_READ_ARB 0x88E9
#define GL_DYNAMIC_COPY_ARB 0x88EA
#endif
-
+
#ifndef GL_ARB_vertex_buffer_object
diff --git a/indra/llrender/llglslshader.cpp b/indra/llrender/llglslshader.cpp
index 257bcd9380..ad2c662dfc 100644
--- a/indra/llrender/llglslshader.cpp
+++ b/indra/llrender/llglslshader.cpp
@@ -48,6 +48,8 @@ using std::pair;
using std::make_pair;
using std::string;
+GLhandleARB LLGLSLShader::sCurBoundShader = 0;
+
BOOL shouldChange(const LLVector4& v1, const LLVector4& v2)
{
return v1 != v2;
@@ -56,7 +58,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)
+hasGamma(false), hasLighting(false), calculatesAtmospherics(false), mIndexedTextureChannels(0), disableTextureIndex(false)
{
}
@@ -107,16 +109,16 @@ BOOL LLGLSLShader::createShader(vector<string> * attributes,
// Create program
mProgramObject = glCreateProgramObjectARB();
- // Attach existing objects
- if (!LLShaderMgr::instance()->attachShaderFeatures(this))
- {
- return FALSE;
+ 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++ )
{
- GLhandleARB shaderhandle = LLShaderMgr::instance()->loadShaderFile((*fileIter).first, mShaderLevel, (*fileIter).second);
+ GLhandleARB shaderhandle = LLShaderMgr::instance()->loadShaderFile((*fileIter).first, mShaderLevel, (*fileIter).second, mFeatures.mIndexedTextureChannels);
LL_DEBUGS("ShaderLoading") << "SHADER FILE: " << (*fileIter).first << " mShaderLevel=" << mShaderLevel << LL_ENDL;
if (shaderhandle > 0)
{
@@ -128,6 +130,17 @@ BOOL LLGLSLShader::createShader(vector<string> * attributes,
}
}
+ // Attach existing objects
+ if (!LLShaderMgr::instance()->attachShaderFeatures(this))
+ {
+ return FALSE;
+ }
+
+ if (gGLManager.mGLVersion < 3.1f)
+ { //attachShaderFeatures may have set the number of indexed texture channels, so set to 1 again
+ mFeatures.mIndexedTextureChannels = llmin(mFeatures.mIndexedTextureChannels, 1);
+ }
+
// Map attributes and uniforms
if (success)
{
@@ -149,6 +162,29 @@ BOOL LLGLSLShader::createShader(vector<string> * attributes,
return createShader(attributes,uniforms);
}
}
+ else if (mFeatures.mIndexedTextureChannels > 0)
+ { //override texture channels for indexed texture rendering
+ bind();
+ S32 channel_count = mFeatures.mIndexedTextureChannels;
+
+ for (S32 i = 0; i < channel_count; i++)
+ {
+ uniform1i(llformat("tex%d", i), i);
+ }
+
+ S32 cur_tex = channel_count; //adjust any texture channels that might have been overwritten
+ for (U32 i = 0; i < mTexture.size(); i++)
+ {
+ if (mTexture[i] > -1 && mTexture[i] < channel_count)
+ {
+ llassert(cur_tex < gGLManager.mNumTextureImageUnits);
+ uniform1i(i, cur_tex);
+ mTexture[i] = cur_tex++;
+ }
+ }
+ unbind();
+ }
+
return success;
}
@@ -293,7 +329,8 @@ void LLGLSLShader::mapUniform(GLint index, const vector<string> * uniforms)
GLint LLGLSLShader::mapUniformTextureChannel(GLint location, GLenum type)
{
- if (type >= GL_SAMPLER_1D_ARB && type <= GL_SAMPLER_2D_RECT_SHADOW_ARB)
+ if (type >= GL_SAMPLER_1D_ARB && type <= GL_SAMPLER_2D_RECT_SHADOW_ARB ||
+ type == GL_SAMPLER_2D_MULTISAMPLE)
{ //this here is a texture
glUniform1iARB(location, mActiveTextureChannels);
LL_DEBUGS("ShaderLoading") << "Assigned to texture channel " << mActiveTextureChannels << LL_ENDL;
@@ -342,7 +379,7 @@ void LLGLSLShader::bind()
if (gGLManager.mHasShaderObjects)
{
glUseProgramObjectARB(mProgramObject);
-
+ sCurBoundShader = mProgramObject;
if (mUniformsDirty)
{
LLShaderMgr::instance()->updateShaderUniforms(this);
@@ -365,6 +402,7 @@ void LLGLSLShader::unbind()
}
}
glUseProgramObjectARB(0);
+ sCurBoundShader = 0;
stop_glerror();
}
}
@@ -372,6 +410,7 @@ void LLGLSLShader::unbind()
void LLGLSLShader::bindNoShader(void)
{
glUseProgramObjectARB(0);
+ sCurBoundShader = 0;
}
S32 LLGLSLShader::enableTexture(S32 uniform, LLTexUnit::eTextureType mode)
diff --git a/indra/llrender/llglslshader.h b/indra/llrender/llglslshader.h
index d46ddbbe18..4922eb6d67 100644
--- a/indra/llrender/llglslshader.h
+++ b/indra/llrender/llglslshader.h
@@ -45,6 +45,8 @@ public:
bool hasObjectSkinning;
bool hasAtmospherics;
bool hasGamma;
+ S32 mIndexedTextureChannels;
+ bool disableTextureIndex;
// char numLights;
@@ -64,6 +66,8 @@ public:
LLGLSLShader();
+ static GLhandleARB sCurBoundShader;
+
void unload();
BOOL createShader(std::vector<std::string> * attributes,
std::vector<std::string> * uniforms);
diff --git a/indra/llrender/llimagegl.cpp b/indra/llrender/llimagegl.cpp
index d408077c68..60a5962234 100644
--- a/indra/llrender/llimagegl.cpp
+++ b/indra/llrender/llimagegl.cpp
@@ -1083,12 +1083,17 @@ void LLImageGL::generateTextures(S32 numTextures, U32 *textures)
}
// static
-void LLImageGL::deleteTextures(S32 numTextures, U32 *textures)
+void LLImageGL::deleteTextures(S32 numTextures, U32 *textures, bool immediate)
{
for (S32 i = 0; i < numTextures; i++)
{
sDeadTextureList.push_back(textures[i]);
}
+
+ if (immediate)
+ {
+ LLImageGL::deleteDeadTextures();
+ }
}
// static
@@ -1413,11 +1418,13 @@ void LLImageGL::deleteDeadTextures()
{
GLuint tex = sDeadTextureList.front();
sDeadTextureList.pop_front();
- for (int i = 0; i < gGLManager.mNumTextureUnits; i++)
+ for (int i = 0; i < gGLManager.mNumTextureImageUnits; i++)
{
- if (sCurrentBoundTextures[i] == tex)
+ LLTexUnit* tex_unit = gGL.getTexUnit(i);
+
+ if (tex_unit->getCurrTexture() == tex)
{
- gGL.getTexUnit(i)->unbind(LLTexUnit::TT_TEXTURE);
+ tex_unit->unbind(tex_unit->getCurrType());
stop_glerror();
}
}
diff --git a/indra/llrender/llimagegl.h b/indra/llrender/llimagegl.h
index 6c980984c0..2cfb15b0d9 100644
--- a/indra/llrender/llimagegl.h
+++ b/indra/llrender/llimagegl.h
@@ -98,7 +98,7 @@ public:
// These 3 functions currently wrap glGenTextures(), glDeleteTextures(), and glTexImage2D()
// for tracking purposes and will be deprecated in the future
static void generateTextures(S32 numTextures, U32 *textures);
- static void deleteTextures(S32 numTextures, U32 *textures);
+ static void deleteTextures(S32 numTextures, U32 *textures, bool immediate = false);
static void setManualImage(U32 target, S32 miplevel, S32 intformat, S32 width, S32 height, U32 pixformat, U32 pixtype, const void *pixels);
BOOL createGLTexture() ;
diff --git a/indra/llrender/llrender.cpp b/indra/llrender/llrender.cpp
index 49e10c4790..1d82dda30f 100644
--- a/indra/llrender/llrender.cpp
+++ b/indra/llrender/llrender.cpp
@@ -30,6 +30,7 @@
#include "llvertexbuffer.h"
#include "llcubemap.h"
+#include "llglslshader.h"
#include "llimagegl.h"
#include "llrendertarget.h"
#include "lltexture.h"
@@ -46,14 +47,15 @@ S32 gGLViewport[4];
U32 LLRender::sUICalls = 0;
U32 LLRender::sUIVerts = 0;
-static const U32 LL_NUM_TEXTURE_LAYERS = 16;
+static const U32 LL_NUM_TEXTURE_LAYERS = 32;
static const U32 LL_NUM_LIGHT_UNITS = 8;
static GLenum sGLTextureType[] =
{
GL_TEXTURE_2D,
GL_TEXTURE_RECTANGLE_ARB,
- GL_TEXTURE_CUBE_MAP_ARB
+ GL_TEXTURE_CUBE_MAP_ARB,
+ GL_TEXTURE_2D_MULTISAMPLE
};
static GLint sGLAddressMode[] =
@@ -119,14 +121,29 @@ void LLTexUnit::refreshState(void)
gGL.flush();
glActiveTextureARB(GL_TEXTURE0_ARB + mIndex);
+
+ //
+ // Per apple spec, don't call glEnable/glDisable when index exceeds max texture units
+ // http://www.mailinglistarchive.com/html/mac-opengl@lists.apple.com/2008-07/msg00653.html
+ //
+ bool enableDisable = (mIndex < gGLManager.mNumTextureUnits) && mCurrTexType != LLTexUnit::TT_MULTISAMPLE_TEXTURE;
+
if (mCurrTexType != TT_NONE)
{
- glEnable(sGLTextureType[mCurrTexType]);
+ if (enableDisable)
+ {
+ glEnable(sGLTextureType[mCurrTexType]);
+ }
+
glBindTexture(sGLTextureType[mCurrTexType], mCurrTexture);
}
else
{
- glDisable(GL_TEXTURE_2D);
+ if (enableDisable)
+ {
+ glDisable(GL_TEXTURE_2D);
+ }
+
glBindTexture(GL_TEXTURE_2D, 0);
}
@@ -167,7 +184,11 @@ void LLTexUnit::enable(eTextureType type)
mCurrTexType = type;
gGL.flush();
- glEnable(sGLTextureType[type]);
+ if (type != LLTexUnit::TT_MULTISAMPLE_TEXTURE &&
+ mIndex < gGLManager.mNumTextureUnits)
+ {
+ glEnable(sGLTextureType[type]);
+ }
}
}
@@ -180,7 +201,12 @@ void LLTexUnit::disable(void)
activate();
unbind(mCurrTexType);
gGL.flush();
- glDisable(sGLTextureType[mCurrTexType]);
+ if (mCurrTexType != LLTexUnit::TT_MULTISAMPLE_TEXTURE &&
+ mIndex < gGLManager.mNumTextureUnits)
+ {
+ glDisable(sGLTextureType[mCurrTexType]);
+ }
+
mCurrTexType = TT_NONE;
}
}
@@ -378,6 +404,7 @@ void LLTexUnit::unbind(eTextureType type)
activate();
mCurrTexture = 0;
glBindTexture(sGLTextureType[type], 0);
+ stop_glerror();
}
}
@@ -399,7 +426,7 @@ void LLTexUnit::setTextureAddressMode(eTextureAddressMode mode)
void LLTexUnit::setTextureFilteringOption(LLTexUnit::eTextureFilterOptions option)
{
- if (mIndex < 0 || mCurrTexture == 0) return;
+ if (mIndex < 0 || mCurrTexture == 0 || mCurrTexType == LLTexUnit::TT_MULTISAMPLE_TEXTURE) return;
gGL.flush();
diff --git a/indra/llrender/llrender.h b/indra/llrender/llrender.h
index 7ba14f7b40..41e7b35341 100644
--- a/indra/llrender/llrender.h
+++ b/indra/llrender/llrender.h
@@ -57,6 +57,7 @@ public:
TT_TEXTURE = 0, // Standard 2D Texture
TT_RECT_TEXTURE, // Non power of 2 texture
TT_CUBE_MAP, // 6-sided cube map texture
+ TT_MULTISAMPLE_TEXTURE, // see GL_ARB_texture_multisample
TT_NONE // No texture type is currently enabled
} eTextureType;
diff --git a/indra/llrender/llrendertarget.cpp b/indra/llrender/llrendertarget.cpp
index cd2556d435..b6463309e1 100644
--- a/indra/llrender/llrendertarget.cpp
+++ b/indra/llrender/llrendertarget.cpp
@@ -44,6 +44,7 @@ void check_framebuffer_status()
case GL_FRAMEBUFFER_COMPLETE:
break;
default:
+ llwarns << "check_framebuffer_status failed -- " << std::hex << status << llendl;
ll_fail("check_framebuffer_status failed");
break;
}
@@ -62,8 +63,7 @@ LLRenderTarget::LLRenderTarget() :
mUseDepth(false),
mRenderDepth(false),
mUsage(LLTexUnit::TT_TEXTURE),
- mSamples(0),
- mSampleBuffer(NULL)
+ mSamples(0)
{
}
@@ -72,23 +72,32 @@ LLRenderTarget::~LLRenderTarget()
release();
}
-
-void LLRenderTarget::setSampleBuffer(LLMultisampleBuffer* buffer)
-{
- mSampleBuffer = buffer;
-}
-
-void LLRenderTarget::allocate(U32 resx, U32 resy, U32 color_fmt, bool depth, bool stencil, LLTexUnit::eTextureType usage, bool use_fbo)
+void LLRenderTarget::allocate(U32 resx, U32 resy, U32 color_fmt, bool depth, bool stencil, LLTexUnit::eTextureType usage, bool use_fbo, S32 samples)
{
stop_glerror();
+
+ release();
+
mResX = resx;
mResY = resy;
mStencil = stencil;
mUsage = usage;
mUseDepth = depth;
+ mSamples = samples;
- release();
+ 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)
{
@@ -145,29 +154,51 @@ void LLRenderTarget::addColorAttachment(U32 color_fmt)
stop_glerror();
- LLImageGL::setManualImage(LLTexUnit::getInternalType(mUsage), 0, color_fmt, mResX, mResY, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
-
- stop_glerror();
- if (offset == 0)
+#ifdef GL_ARB_texture_multisample
+ if (mSamples > 1)
{
- gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_BILINEAR);
+ glTexImage2DMultisample(LLTexUnit::getInternalType(mUsage), mSamples, color_fmt, mResX, mResY, GL_TRUE);
}
else
- { //don't filter data attachments
- gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_POINT);
- }
- if (mUsage != LLTexUnit::TT_RECT_TEXTURE)
+#else
+ llassert_always(mSamples <= 1);
+#endif
{
- gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_MIRROR);
+ LLImageGL::setManualImage(LLTexUnit::getInternalType(mUsage), 0, color_fmt, mResX, mResY, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
}
- else
- {
- // ATI doesn't support mirrored repeat for rectangular textures.
- gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_CLAMP);
+
+ 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 (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)
{
+ stop_glerror();
glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0+offset,
LLTexUnit::getInternalType(mUsage), tex, 0);
@@ -180,6 +211,12 @@ void LLRenderTarget::addColorAttachment(U32 color_fmt)
mTex.push_back(tex);
+ if (gDebugGL)
+ { //bind and unbind to validate target
+ bindTarget();
+ flush();
+ }
+
}
void LLRenderTarget::allocateDepth()
@@ -196,9 +233,20 @@ void LLRenderTarget::allocateDepth()
{
LLImageGL::generateTextures(1, &mDepth);
gGL.getTexUnit(0)->bindManual(mUsage, mDepth);
- U32 internal_type = LLTexUnit::getInternalType(mUsage);
- gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_POINT);
- LLImageGL::setManualImage(internal_type, 0, GL_DEPTH_COMPONENT32, mResX, mResY, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, NULL);
+ if (mSamples == 0)
+ {
+ U32 internal_type = LLTexUnit::getInternalType(mUsage);
+ gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_POINT);
+ LLImageGL::setManualImage(internal_type, 0, GL_DEPTH_COMPONENT32, mResX, mResY, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, NULL);
+ }
+#ifdef GL_ARB_texture_multisample
+ else
+ {
+ glTexImage2DMultisample(LLTexUnit::getInternalType(mUsage), mSamples, GL_DEPTH_COMPONENT32, mResX, mResY, GL_TRUE);
+ }
+#else
+ llassert_always(mSamples <= 1);
+#endif
}
}
@@ -238,6 +286,9 @@ void LLRenderTarget::shareDepthBuffer(LLRenderTarget& target)
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, LLTexUnit::getInternalType(mUsage), mDepth, 0);
stop_glerror();
}
+
+ check_framebuffer_status();
+
glBindFramebuffer(GL_FRAMEBUFFER, 0);
target.mUseDepth = true;
@@ -255,7 +306,7 @@ void LLRenderTarget::release()
}
else
{
- LLImageGL::deleteTextures(1, &mDepth);
+ LLImageGL::deleteTextures(1, &mDepth, true);
stop_glerror();
}
mDepth = 0;
@@ -284,11 +335,12 @@ void LLRenderTarget::release()
if (mTex.size() > 0)
{
- LLImageGL::deleteTextures(mTex.size(), &mTex[0]);
+ LLImageGL::deleteTextures(mTex.size(), &mTex[0], true);
mTex.clear();
}
+
+ mResX = mResY = 0;
- mSampleBuffer = NULL;
sBoundTarget = NULL;
}
@@ -297,34 +349,27 @@ void LLRenderTarget::bindTarget()
if (mFBO)
{
stop_glerror();
- if (mSampleBuffer)
- {
- mSampleBuffer->bindTarget(this);
- stop_glerror();
+
+ glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
+ stop_glerror();
+ if (gGLManager.mHasDrawBuffers)
+ { //setup multiple render targets
+ GLenum drawbuffers[] = {GL_COLOR_ATTACHMENT0,
+ GL_COLOR_ATTACHMENT1,
+ GL_COLOR_ATTACHMENT2,
+ GL_COLOR_ATTACHMENT3};
+ glDrawBuffersARB(mTex.size(), drawbuffers);
}
- else
- {
- glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
- stop_glerror();
- if (gGLManager.mHasDrawBuffers)
- { //setup multiple render targets
- GLenum drawbuffers[] = {GL_COLOR_ATTACHMENT0,
- GL_COLOR_ATTACHMENT1,
- GL_COLOR_ATTACHMENT2,
- GL_COLOR_ATTACHMENT3};
- glDrawBuffersARB(mTex.size(), drawbuffers);
- }
- if (mTex.empty())
- { //no color buffer to draw to
- glDrawBuffer(GL_NONE);
- glReadBuffer(GL_NONE);
- }
+ if (mTex.empty())
+ { //no color buffer to draw to
+ glDrawBuffer(GL_NONE);
+ glReadBuffer(GL_NONE);
+ }
- check_framebuffer_status();
+ check_framebuffer_status();
- stop_glerror();
- }
+ stop_glerror();
}
glViewport(0, 0, mResX, mResY);
@@ -406,50 +451,8 @@ void LLRenderTarget::flush(bool fetch_depth)
else
{
stop_glerror();
-
glBindFramebuffer(GL_FRAMEBUFFER, 0);
-
stop_glerror();
-
- if (mSampleBuffer)
- {
- LLGLEnable multisample(GL_MULTISAMPLE);
- stop_glerror();
- glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
- stop_glerror();
- check_framebuffer_status();
- glBindFramebuffer(GL_READ_FRAMEBUFFER, mSampleBuffer->mFBO);
- check_framebuffer_status();
-
- stop_glerror();
- glBlitFramebuffer(0, 0, mResX, mResY, 0, 0, mResX, mResY, GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, GL_NEAREST);
- stop_glerror();
-
- if (mTex.size() > 1)
- {
- for (U32 i = 1; i < mTex.size(); ++i)
- {
- glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
- LLTexUnit::getInternalType(mUsage), mTex[i], 0);
- stop_glerror();
- glFramebufferRenderbuffer(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, mSampleBuffer->mTex[i]);
- stop_glerror();
- glBlitFramebuffer(0, 0, mResX, mResY, 0, 0, mResX, mResY, GL_COLOR_BUFFER_BIT, GL_NEAREST);
- stop_glerror();
- }
-
- for (U32 i = 0; i < mTex.size(); ++i)
- {
- glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0+i,
- LLTexUnit::getInternalType(mUsage), mTex[i], 0);
- stop_glerror();
- glFramebufferRenderbuffer(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0+i, GL_RENDERBUFFER, mSampleBuffer->mTex[i]);
- stop_glerror();
- }
- }
- }
-
- glBindFramebuffer(GL_FRAMEBUFFER, 0);
}
}
@@ -466,37 +469,36 @@ void LLRenderTarget::copyContents(LLRenderTarget& source, S32 srcX0, S32 srcY0,
llerrs << "Cannot copy framebuffer contents for non FBO render targets." << llendl;
}
- if (mSampleBuffer)
+
+ if (mask == GL_DEPTH_BUFFER_BIT && source.mStencil != mStencil)
{
- mSampleBuffer->copyContents(source, srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
+ stop_glerror();
+
+ glBindFramebuffer(GL_FRAMEBUFFER, source.mFBO);
+ check_framebuffer_status();
+ gGL.getTexUnit(0)->bind(this, true);
+ stop_glerror();
+ glCopyTexSubImage2D(LLTexUnit::getInternalType(mUsage), 0, srcX0, srcY0, dstX0, dstY0, dstX1, dstY1);
+ stop_glerror();
+ glBindFramebuffer(GL_FRAMEBUFFER, 0);
+ stop_glerror();
}
else
{
- if (mask == GL_DEPTH_BUFFER_BIT && source.mStencil != mStencil)
- {
- stop_glerror();
-
- glBindFramebuffer(GL_FRAMEBUFFER, source.mFBO);
- gGL.getTexUnit(0)->bind(this, true);
- stop_glerror();
- glCopyTexSubImage2D(LLTexUnit::getInternalType(mUsage), 0, srcX0, srcY0, dstX0, dstY0, dstX1, dstY1);
- stop_glerror();
- glBindFramebuffer(GL_FRAMEBUFFER, 0);
- stop_glerror();
- }
- else
- {
- glBindFramebuffer(GL_READ_FRAMEBUFFER, source.mFBO);
- stop_glerror();
- glBindFramebuffer(GL_DRAW_FRAMEBUFFER, mFBO);
- stop_glerror();
- check_framebuffer_status();
- stop_glerror();
- glBlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
- stop_glerror();
- glBindFramebuffer(GL_FRAMEBUFFER, 0);
- stop_glerror();
- }
+ glBindFramebuffer(GL_READ_FRAMEBUFFER, source.mFBO);
+ stop_glerror();
+ glBindFramebuffer(GL_DRAW_FRAMEBUFFER, mFBO);
+ stop_glerror();
+ check_framebuffer_status();
+ stop_glerror();
+ glBlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
+ stop_glerror();
+ glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);
+ stop_glerror();
+ glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
+ stop_glerror();
+ glBindFramebuffer(GL_FRAMEBUFFER, 0);
+ stop_glerror();
}
}
@@ -539,179 +541,3 @@ void LLRenderTarget::getViewport(S32* viewport)
viewport[3] = mResY;
}
-//==================================================
-// LLMultisampleBuffer implementation
-//==================================================
-LLMultisampleBuffer::LLMultisampleBuffer()
-{
-
-}
-
-LLMultisampleBuffer::~LLMultisampleBuffer()
-{
- release();
-}
-
-void LLMultisampleBuffer::release()
-{
- if (mFBO)
- {
- glDeleteFramebuffers(1, (GLuint *) &mFBO);
- mFBO = 0;
- }
-
- if (mTex.size() > 0)
- {
- glDeleteRenderbuffers(mTex.size(), (GLuint *) &mTex[0]);
- mTex.clear();
- }
-
- if (mDepth)
- {
- glDeleteRenderbuffers(1, (GLuint *) &mDepth);
- mDepth = 0;
- }
-}
-
-void LLMultisampleBuffer::bindTarget()
-{
- bindTarget(this);
-}
-
-void LLMultisampleBuffer::bindTarget(LLRenderTarget* ref)
-{
- if (!ref)
- {
- ref = this;
- }
-
- glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
- if (gGLManager.mHasDrawBuffers)
- { //setup multiple render targets
- GLenum drawbuffers[] = {GL_COLOR_ATTACHMENT0,
- GL_COLOR_ATTACHMENT1,
- GL_COLOR_ATTACHMENT2,
- GL_COLOR_ATTACHMENT3};
- glDrawBuffersARB(ref->mTex.size(), drawbuffers);
- }
-
- check_framebuffer_status();
-
- glViewport(0, 0, mResX, mResY);
-
- sBoundTarget = this;
-}
-
-void LLMultisampleBuffer::allocate(U32 resx, U32 resy, U32 color_fmt, bool depth, bool stencil, LLTexUnit::eTextureType usage, bool use_fbo )
-{
- allocate(resx,resy,color_fmt,depth,stencil,usage,use_fbo,2);
-}
-
-void LLMultisampleBuffer::allocate(U32 resx, U32 resy, U32 color_fmt, bool depth, bool stencil, LLTexUnit::eTextureType usage, bool use_fbo, U32 samples )
-{
- stop_glerror();
- mResX = resx;
- mResY = resy;
-
- mUsage = usage;
- mUseDepth = depth;
- mStencil = stencil;
-
- release();
-
- mSamples = samples;
-
- if (mSamples <= 1)
- {
- llerrs << "Cannot create a multisample buffer with less than 2 samples." << llendl;
- }
-
- stop_glerror();
-
- if ((sUseFBO || use_fbo) && gGLManager.mHasFramebufferObject)
- {
-
- if (depth)
- {
- stop_glerror();
- allocateDepth();
- stop_glerror();
- }
-
- glGenFramebuffers(1, (GLuint *) &mFBO);
-
- glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
-
- if (mDepth)
- {
- glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, mDepth);
- if (mStencil)
- {
- glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, mDepth);
- }
- }
-
- stop_glerror();
- glBindFramebuffer(GL_FRAMEBUFFER, 0);
- stop_glerror();
- }
-
- addColorAttachment(color_fmt);
-}
-
-void LLMultisampleBuffer::addColorAttachment(U32 color_fmt)
-{
- if (color_fmt == 0)
- {
- return;
- }
-
- U32 offset = mTex.size();
- if (offset >= 4 ||
- (offset > 0 && (mFBO == 0 || !gGLManager.mHasDrawBuffers)))
- {
- llerrs << "Too many color attachments!" << llendl;
- }
-
- U32 tex;
- glGenRenderbuffers(1, &tex);
-
- glBindRenderbuffer(GL_RENDERBUFFER, tex);
- glRenderbufferStorageMultisample(GL_RENDERBUFFER, mSamples, color_fmt, mResX, mResY);
- stop_glerror();
-
- if (mFBO)
- {
- glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
- glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0+offset, GL_RENDERBUFFER, tex);
- stop_glerror();
- GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
- switch (status)
- {
- case GL_FRAMEBUFFER_COMPLETE:
- break;
- default:
- llerrs << "WTF? " << std::hex << status << llendl;
- break;
- }
-
- glBindFramebuffer(GL_FRAMEBUFFER, 0);
- }
-
- mTex.push_back(tex);
-}
-
-void LLMultisampleBuffer::allocateDepth()
-{
- glGenRenderbuffers(1, (GLuint* ) &mDepth);
- glBindRenderbuffer(GL_RENDERBUFFER, mDepth);
- if (mStencil)
- {
- glRenderbufferStorageMultisample(GL_RENDERBUFFER, mSamples, GL_DEPTH24_STENCIL8, mResX, mResY);
- }
- else
- {
- glRenderbufferStorageMultisample(GL_RENDERBUFFER, mSamples, GL_DEPTH_COMPONENT16, mResX, mResY);
- }
-}
-
diff --git a/indra/llrender/llrendertarget.h b/indra/llrender/llrendertarget.h
index 12dd1c8b90..094b58b562 100644
--- a/indra/llrender/llrendertarget.h
+++ b/indra/llrender/llrendertarget.h
@@ -71,10 +71,7 @@ public:
//allocate resources for rendering
//must be called before use
//multiple calls will release previously allocated resources
- void allocate(U32 resx, U32 resy, U32 color_fmt, bool depth, bool stencil, LLTexUnit::eTextureType usage = LLTexUnit::TT_TEXTURE, bool use_fbo = FALSE);
-
- //provide this render target with a multisample resource.
- void setSampleBuffer(LLMultisampleBuffer* buffer);
+ void allocate(U32 resx, U32 resy, U32 color_fmt, bool depth, bool stencil, LLTexUnit::eTextureType usage = LLTexUnit::TT_TEXTURE, bool use_fbo = false, S32 samples = 0);
//add color buffer attachment
//limit of 4 color attachments per render target
@@ -141,7 +138,6 @@ public:
static LLRenderTarget* getCurrentBoundTarget() { return sBoundTarget; }
protected:
- friend class LLMultisampleBuffer;
U32 mResX;
U32 mResY;
std::vector<U32> mTex;
@@ -152,26 +148,8 @@ protected:
bool mRenderDepth;
LLTexUnit::eTextureType mUsage;
U32 mSamples;
- LLMultisampleBuffer* mSampleBuffer;
-
- static LLRenderTarget* sBoundTarget;
-};
-
-class LLMultisampleBuffer : public LLRenderTarget
-{
-public:
- LLMultisampleBuffer();
- virtual ~LLMultisampleBuffer();
-
- virtual void release();
-
- virtual void bindTarget();
- void bindTarget(LLRenderTarget* ref);
- virtual void allocate(U32 resx, U32 resy, U32 color_fmt, bool depth, bool stencil, LLTexUnit::eTextureType usage, bool use_fbo);
- void allocate(U32 resx, U32 resy, U32 color_fmt, bool depth, bool stencil, LLTexUnit::eTextureType usage, bool use_fbo, U32 samples);
- virtual void addColorAttachment(U32 color_fmt);
- virtual void allocateDepth();
+ static LLRenderTarget* sBoundTarget;
};
#endif //!LL_MESA_HEADLESS
diff --git a/indra/llrender/llshadermgr.cpp b/indra/llrender/llshadermgr.cpp
index 98a0a93084..751b250d96 100644
--- a/indra/llrender/llshadermgr.cpp
+++ b/indra/llrender/llshadermgr.cpp
@@ -209,17 +209,39 @@ BOOL LLShaderMgr::attachShaderFeatures(LLGLSLShader * shader)
if (features->hasWaterFog)
{
- if (!shader->attachObject("lighting/lightWaterF.glsl"))
+ if (features->disableTextureIndex)
{
- return FALSE;
+ if (!shader->attachObject("lighting/lightWaterNonIndexedF.glsl"))
+ {
+ return FALSE;
+ }
+ }
+ else
+ {
+ if (!shader->attachObject("lighting/lightWaterF.glsl"))
+ {
+ return FALSE;
+ }
+ shader->mFeatures.mIndexedTextureChannels = gGLManager.mNumTextureImageUnits-1;
}
}
else
{
- if (!shader->attachObject("lighting/lightF.glsl"))
+ if (features->disableTextureIndex)
{
- return FALSE;
+ if (!shader->attachObject("lighting/lightNonIndexedF.glsl"))
+ {
+ return FALSE;
+ }
+ }
+ else
+ {
+ if (!shader->attachObject("lighting/lightF.glsl"))
+ {
+ return FALSE;
+ }
+ shader->mFeatures.mIndexedTextureChannels = gGLManager.mNumTextureImageUnits-1;
}
}
}
@@ -230,32 +252,76 @@ BOOL LLShaderMgr::attachShaderFeatures(LLGLSLShader * shader)
if (features->isShiny && features->hasWaterFog)
{
- if (!shader->attachObject("lighting/lightFullbrightShinyWaterF.glsl"))
+ if (features->disableTextureIndex)
{
- return FALSE;
+ if (!shader->attachObject("lighting/lightFullbrightShinyWaterNonIndexedF.glsl"))
+ {
+ return FALSE;
+ }
+ }
+ else
+ {
+ if (!shader->attachObject("lighting/lightFullbrightShinyWaterF.glsl"))
+ {
+ return FALSE;
+ }
+ shader->mFeatures.mIndexedTextureChannels = gGLManager.mNumTextureImageUnits-1;
}
}
else if (features->hasWaterFog)
{
- if (!shader->attachObject("lighting/lightFullbrightWaterF.glsl"))
+ if (features->disableTextureIndex)
{
- return FALSE;
+ if (!shader->attachObject("lighting/lightFullbrightWaterNonIndexedF.glsl"))
+ {
+ return FALSE;
+ }
+ }
+ else
+ {
+ if (!shader->attachObject("lighting/lightFullbrightWaterF.glsl"))
+ {
+ return FALSE;
+ }
+ shader->mFeatures.mIndexedTextureChannels = gGLManager.mNumTextureImageUnits-1;
}
}
else if (features->isShiny)
{
- if (!shader->attachObject("lighting/lightFullbrightShinyF.glsl"))
+ if (features->disableTextureIndex)
{
- return FALSE;
+ if (!shader->attachObject("lighting/lightFullbrightShinyNonIndexedF.glsl"))
+ {
+ return FALSE;
+ }
+ }
+ else
+ {
+ if (!shader->attachObject("lighting/lightFullbrightShinyF.glsl"))
+ {
+ return FALSE;
+ }
+ shader->mFeatures.mIndexedTextureChannels = gGLManager.mNumTextureImageUnits-1;
}
}
else
{
- if (!shader->attachObject("lighting/lightFullbrightF.glsl"))
+ if (features->disableTextureIndex)
{
- return FALSE;
+ if (!shader->attachObject("lighting/lightFullbrightNonIndexedF.glsl"))
+ {
+ return FALSE;
+ }
+ }
+ else
+ {
+ if (!shader->attachObject("lighting/lightFullbrightF.glsl"))
+ {
+ return FALSE;
+ }
+ shader->mFeatures.mIndexedTextureChannels = gGLManager.mNumTextureImageUnits-1;
}
}
}
@@ -266,17 +332,39 @@ BOOL LLShaderMgr::attachShaderFeatures(LLGLSLShader * shader)
if (features->hasWaterFog)
{
- if (!shader->attachObject("lighting/lightShinyWaterF.glsl"))
+ if (features->disableTextureIndex)
{
- return FALSE;
+ if (!shader->attachObject("lighting/lightShinyWaterNonIndexedF.glsl"))
+ {
+ return FALSE;
+ }
+ }
+ else
+ {
+ if (!shader->attachObject("lighting/lightShinyWaterF.glsl"))
+ {
+ return FALSE;
+ }
+ shader->mFeatures.mIndexedTextureChannels = gGLManager.mNumTextureImageUnits-1;
}
}
else
{
- if (!shader->attachObject("lighting/lightShinyF.glsl"))
+ if (features->disableTextureIndex)
{
- return FALSE;
+ if (!shader->attachObject("lighting/lightShinyNonIndexedF.glsl"))
+ {
+ return FALSE;
+ }
+ }
+ else
+ {
+ if (!shader->attachObject("lighting/lightShinyF.glsl"))
+ {
+ return FALSE;
+ }
+ shader->mFeatures.mIndexedTextureChannels = gGLManager.mNumTextureImageUnits-1;
}
}
}
@@ -315,12 +403,12 @@ void LLShaderMgr::dumpObjectLog(GLhandleARB ret, BOOL warns)
}
else
{
- LL_INFOS("ShaderLoading") << log << LL_ENDL;
+ LL_DEBUGS("ShaderLoading") << log << LL_ENDL;
}
}
}
-GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shader_level, GLenum type)
+GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shader_level, GLenum type, S32 texture_index_channels)
{
GLenum error = GL_NO_ERROR;
if (gDebugGL)
@@ -374,6 +462,117 @@ GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shade
GLcharARB* text[1024];
GLuint count = 0;
+ if (gGLManager.mGLVersion < 2.1f)
+ {
+ text[count++] = strdup("#version 110\n");
+ }
+ else if (gGLManager.mGLVersion < 3.f)
+ {
+ //set version to 1.20
+ text[count++] = strdup("#version 120\n");
+ }
+ else
+ { //set version to 1.30
+ text[count++] = strdup("#version 130\n");
+ }
+
+ //copy preprocessor definitions into buffer
+ for (std::map<std::string,std::string>::iterator iter = mDefinitions.begin(); iter != mDefinitions.end(); ++iter)
+ {
+ std::string define = "#define " + iter->first + " " + iter->second + "\n";
+ text[count++] = (GLcharARB *) strdup(define.c_str());
+ }
+
+ if (texture_index_channels > 0 && type == GL_FRAGMENT_SHADER_ARB)
+ {
+ //use specified number of texture channels for indexed texture rendering
+
+ /* prepend shader code that looks like this:
+
+ uniform sampler2D tex0;
+ uniform sampler2D tex1;
+ uniform sampler2D tex2;
+ .
+ .
+ .
+ uniform sampler2D texN;
+
+ varying float vary_texture_index;
+
+ vec4 diffuseLookup(vec2 texcoord)
+ {
+ switch (int(vary_texture_index+0.25))
+ {
+ case 0: return texture2D(tex0, texcoord);
+ case 1: return texture2D(tex1, texcoord);
+ case 2: return texture2D(tex2, texcoord);
+ .
+ .
+ .
+ case N: return texture2D(texN, texcoord);
+ }
+
+ return vec4(0,0,0,0);
+ }
+ */
+
+ //uniform declartion
+ for (S32 i = 0; i < texture_index_channels; ++i)
+ {
+ std::string decl = llformat("uniform sampler2D tex%d;\n", i);
+ text[count++] = strdup(decl.c_str());
+ }
+
+ text[count++] = strdup("varying float vary_texture_index;\n");
+ text[count++] = strdup("vec4 diffuseLookup(vec2 texcoord)\n");
+ text[count++] = strdup("{\n");
+
+
+ if (texture_index_channels == 1)
+ { //don't use flow control, that's silly
+ text[count++] = strdup("return texture2D(tex0, texcoord);\n");
+ text[count++] = strdup("}\n");
+ }
+ else if (gGLManager.mGLVersion >= 3.f)
+ {
+ text[count++] = strdup("\tswitch (int(vary_texture_index+0.25))\n");
+ text[count++] = strdup("\t{\n");
+
+ //switch body
+ for (S32 i = 0; i < texture_index_channels; ++i)
+ {
+ std::string case_str = llformat("\t\tcase %d: return texture2D(tex%d, texcoord);\n", i, i);
+ text[count++] = strdup(case_str.c_str());
+ }
+
+ text[count++] = strdup("\t}\n");
+ text[count++] = strdup("\treturn vec4(0,0,0,0);\n");
+ text[count++] = strdup("}\n");
+ }
+ else
+ {
+ //switches aren't supported, make block that looks like:
+ /*
+ int ti = int(vary_texture_index+0.25);
+ if (ti == 0) return texture2D(tex0, texcoord);
+ if (ti == 1) return texture2D(tex1, texcoord);
+ .
+ .
+ .
+ if (ti == N) return texture2D(texN, texcoord);
+ */
+
+ text[count++] = strdup("int ti = int(vary_texture_index+0.25);\n");
+ for (S32 i = 0; i < texture_index_channels; ++i)
+ {
+ std::string if_str = llformat("if (ti == %d) return texture2D(tex%d, texcoord);\n", i, i);
+ text[count++] = strdup(if_str.c_str());
+ }
+
+ text[count++] = strdup("\treturn vec4(0,0,0,0);\n");
+ text[count++] = strdup("}\n");
+ }
+ }
//copy file into memory
while( fgets((char *)buff, 1024, file) != NULL && count < LL_ARRAY_SIZE(buff) )
@@ -417,11 +616,6 @@ GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shade
}
}
- //free memory
- for (GLuint i = 0; i < count; i++)
- {
- free(text[i]);
- }
if (error == GL_NO_ERROR)
{
//check for errors
@@ -435,6 +629,16 @@ GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shade
//an error occured, print log
LL_WARNS("ShaderLoading") << "GLSL Compilation Error: (" << error << ") in " << filename << LL_ENDL;
dumpObjectLog(ret);
+
+ std::stringstream ostr;
+ //dump shader source for debugging
+ for (GLuint i = 0; i < count; i++)
+ {
+ ostr << i << ": " << text[i];
+ }
+
+ LL_WARNS("ShaderLoading") << "\n" << ostr.str() << llendl;
+
ret = 0;
}
}
@@ -445,6 +649,12 @@ GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shade
}
stop_glerror();
+ //free memory
+ for (GLuint i = 0; i < count; i++)
+ {
+ free(text[i]);
+ }
+
//successfully loaded, save results
if (ret)
{
@@ -457,7 +667,7 @@ GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shade
if (shader_level > 1)
{
shader_level--;
- return loadShaderFile(filename,shader_level,type);
+ return loadShaderFile(filename,shader_level,type,texture_index_channels);
}
LL_WARNS("ShaderLoading") << "Failed to load " << filename << LL_ENDL;
}
diff --git a/indra/llrender/llshadermgr.h b/indra/llrender/llshadermgr.h
index c54c4608d7..2f30103811 100644
--- a/indra/llrender/llshadermgr.h
+++ b/indra/llrender/llshadermgr.h
@@ -43,7 +43,7 @@ public:
void dumpObjectLog(GLhandleARB ret, BOOL warns = TRUE);
BOOL linkProgramObject(GLhandleARB obj, BOOL suppress_errors = FALSE);
BOOL validateProgramObject(GLhandleARB obj);
- GLhandleARB loadShaderFile(const std::string& filename, S32 & shader_level, GLenum type);
+ GLhandleARB loadShaderFile(const std::string& filename, S32 & shader_level, GLenum type, S32 texture_index_channels = -1);
// Implemented in the application to actually point to the shader directory.
virtual std::string getShaderDirPrefix(void) = 0; // Pure Virtual
@@ -60,6 +60,9 @@ public:
std::vector<std::string> mReservedUniforms;
+ //preprocessor definitions (name/value)
+ std::map<std::string, std::string> mDefinitions;
+
protected:
// our parameter manager singleton instance
diff --git a/indra/llrender/llvertexbuffer.cpp b/indra/llrender/llvertexbuffer.cpp
index 8c9171ccf4..d5a7159ee3 100644
--- a/indra/llrender/llvertexbuffer.cpp
+++ b/indra/llrender/llvertexbuffer.cpp
@@ -240,7 +240,8 @@ void LLVertexBuffer::setupClientArrays(U32 data_mask)
void LLVertexBuffer::drawArrays(U32 mode, const std::vector<LLVector3>& pos, const std::vector<LLVector3>& norm)
{
U32 count = pos.size();
- llassert(norm.size() >= pos.size());
+ llassert_always(norm.size() >= pos.size());
+ llassert_always(count > 0) ;
unbind();
@@ -934,8 +935,26 @@ void LLVertexBuffer::allocateClientIndexBuffer()
}
}
+bool expand_region(LLVertexBuffer::MappedRegion& region, S32 index, S32 count)
+{
+ S32 end = index+count;
+ S32 region_end = region.mIndex+region.mCount;
+
+ if (end < region.mIndex ||
+ index > region_end)
+ { //gap exists, do not merge
+ return false;
+ }
+
+ S32 new_end = llmax(end, region_end);
+ S32 new_index = llmin(index, region.mIndex);
+ region.mIndex = new_index;
+ region.mCount = new_end-new_index;
+ return true;
+}
+
// Map for data access
-U8* LLVertexBuffer::mapVertexBuffer(S32 type, S32 access)
+U8* LLVertexBuffer::mapVertexBuffer(S32 type, S32 index, S32 count, bool map_range)
{
LLMemType mt2(LLMemType::MTYPE_VERTEX_MAP_BUFFER);
if (mFinal)
@@ -947,8 +966,45 @@ U8* LLVertexBuffer::mapVertexBuffer(S32 type, S32 access)
llerrs << "LLVertexBuffer::mapVertexBuffer() called on unallocated buffer." << llendl;
}
- if (!mVertexLocked && useVBOs())
+ if (useVBOs())
{
+
+ if (sDisableVBOMapping || gGLManager.mHasMapBufferRange)
+ {
+ if (count == -1)
+ {
+ count = mNumVerts-index;
+ }
+
+ bool mapped = false;
+ //see if range is already mapped
+ for (U32 i = 0; i < mMappedVertexRegions.size(); ++i)
+ {
+ MappedRegion& region = mMappedVertexRegions[i];
+ if (region.mType == type)
+ {
+ if (expand_region(region, index, count))
+ {
+ mapped = true;
+ break;
+ }
+ }
+ }
+
+ if (!mapped)
+ {
+ //not already mapped, map new region
+ MappedRegion region(type, !sDisableVBOMapping && map_range ? -1 : index, count);
+ mMappedVertexRegions.push_back(region);
+ }
+ }
+
+ if (mVertexLocked && map_range)
+ {
+ llerrs << "Attempted to map a specific range of a buffer that was already mapped." << llendl;
+ }
+
+ if (!mVertexLocked)
{
LLMemType mt_v(LLMemType::MTYPE_VERTEX_MAP_BUFFER_VERTICES);
setBuffer(0, type);
@@ -957,61 +1013,95 @@ U8* LLVertexBuffer::mapVertexBuffer(S32 type, S32 access)
if(sDisableVBOMapping)
{
+ map_range = false;
allocateClientVertexBuffer() ;
}
else
{
- U8* src = (U8*) glMapBufferARB(GL_ARRAY_BUFFER_ARB, GL_WRITE_ONLY_ARB);
+ U8* src = NULL;
+#ifdef GL_ARB_map_buffer_range
+ if (gGLManager.mHasMapBufferRange)
+ {
+ if (map_range)
+ {
+ S32 offset = mOffsets[type] + sTypeSize[type]*index;
+ S32 length = (sTypeSize[type]*count+0xF) & ~0xF;
+ src = (U8*) glMapBufferRange(GL_ARRAY_BUFFER_ARB, offset, length, GL_MAP_WRITE_BIT | GL_MAP_FLUSH_EXPLICIT_BIT | GL_MAP_INVALIDATE_RANGE_BIT);
+ }
+ else
+ {
+ src = (U8*) glMapBufferRange(GL_ARRAY_BUFFER_ARB, 0, mSize, GL_MAP_WRITE_BIT | GL_MAP_FLUSH_EXPLICIT_BIT);
+ }
+ }
+ else
+#else
+ llassert_always(!gGLManager.mHasMapBufferRange);
+#endif
+ {
+ map_range = false;
+ src = (U8*) glMapBufferARB(GL_ARRAY_BUFFER_ARB, GL_WRITE_ONLY_ARB);
+ }
+
mMappedData = LL_NEXT_ALIGNED_ADDRESS<U8>(src);
mAlignedOffset = mMappedData - src;
stop_glerror();
}
- }
-
-
- if (!mMappedData)
- {
- log_glerror();
-
- //check the availability of memory
- U32 avail_phy_mem, avail_vir_mem;
- LLMemoryInfo::getAvailableMemoryKB(avail_phy_mem, avail_vir_mem) ;
- llinfos << "Available physical mwmory(KB): " << avail_phy_mem << llendl ;
- llinfos << "Available virtual memory(KB): " << avail_vir_mem << llendl;
-
- if(!sDisableVBOMapping)
- {
- //--------------------
- //print out more debug info before crash
- llinfos << "vertex buffer size: (num verts : num indices) = " << getNumVerts() << " : " << getNumIndices() << llendl ;
- GLint size ;
- glGetBufferParameterivARB(GL_ARRAY_BUFFER_ARB, GL_BUFFER_SIZE_ARB, &size) ;
- llinfos << "GL_ARRAY_BUFFER_ARB size is " << size << llendl ;
- //--------------------
+
+ if (!mMappedData)
+ {
+ log_glerror();
+
+ //check the availability of memory
+ U32 avail_phy_mem, avail_vir_mem;
+ LLMemoryInfo::getAvailableMemoryKB(avail_phy_mem, avail_vir_mem) ;
+ llinfos << "Available physical mwmory(KB): " << avail_phy_mem << llendl ;
+ llinfos << "Available virtual memory(KB): " << avail_vir_mem << llendl;
+
+ if(!sDisableVBOMapping)
+ {
+ //--------------------
+ //print out more debug info before crash
+ llinfos << "vertex buffer size: (num verts : num indices) = " << getNumVerts() << " : " << getNumIndices() << llendl ;
+ GLint size ;
+ glGetBufferParameterivARB(GL_ARRAY_BUFFER_ARB, GL_BUFFER_SIZE_ARB, &size) ;
+ llinfos << "GL_ARRAY_BUFFER_ARB size is " << size << llendl ;
+ //--------------------
+
+ GLint buff;
+ glGetIntegerv(GL_ARRAY_BUFFER_BINDING_ARB, &buff);
+ if ((GLuint)buff != mGLBuffer)
+ {
+ llerrs << "Invalid GL vertex buffer bound: " << buff << llendl;
+ }
- GLint buff;
- glGetIntegerv(GL_ARRAY_BUFFER_BINDING_ARB, &buff);
- if ((GLuint)buff != mGLBuffer)
+
+ llerrs << "glMapBuffer returned NULL (no vertex data)" << llendl;
+ }
+ else
{
- llerrs << "Invalid GL vertex buffer bound: " << buff << llendl;
+ llerrs << "memory allocation for vertex data failed." << llendl ;
}
-
-
- llerrs << "glMapBuffer returned NULL (no vertex data)" << llendl;
- }
- else
- {
- llerrs << "memory allocation for vertex data failed." << llendl ;
}
+ sMappedCount++;
}
- sMappedCount++;
+ }
+ else
+ {
+ map_range = false;
}
- return mMappedData;
+ if (map_range && !sDisableVBOMapping)
+ {
+ return mMappedData;
+ }
+ else
+ {
+ return mMappedData+mOffsets[type]+sTypeSize[type]*index;
+ }
}
-U8* LLVertexBuffer::mapIndexBuffer(S32 access)
+U8* LLVertexBuffer::mapIndexBuffer(S32 index, S32 count, bool map_range)
{
LLMemType mt2(LLMemType::MTYPE_VERTEX_MAP_BUFFER);
if (mFinal)
@@ -1023,8 +1113,41 @@ U8* LLVertexBuffer::mapIndexBuffer(S32 access)
llerrs << "LLVertexBuffer::mapIndexBuffer() called on unallocated buffer." << llendl;
}
- if (!mIndexLocked && useVBOs())
+ if (useVBOs())
{
+ if (sDisableVBOMapping || gGLManager.mHasMapBufferRange)
+ {
+ if (count == -1)
+ {
+ count = mNumIndices-index;
+ }
+
+ bool mapped = false;
+ //see if range is already mapped
+ for (U32 i = 0; i < mMappedIndexRegions.size(); ++i)
+ {
+ MappedRegion& region = mMappedIndexRegions[i];
+ if (expand_region(region, index, count))
+ {
+ mapped = true;
+ break;
+ }
+ }
+
+ if (!mapped)
+ {
+ //not already mapped, map new region
+ MappedRegion region(TYPE_INDEX, !sDisableVBOMapping && map_range ? -1 : index, count);
+ mMappedIndexRegions.push_back(region);
+ }
+ }
+
+ if (mIndexLocked && map_range)
+ {
+ llerrs << "Attempted to map a specific range of a buffer that was already mapped." << llendl;
+ }
+
+ if (!mIndexLocked)
{
LLMemType mt_v(LLMemType::MTYPE_VERTEX_MAP_BUFFER_INDICES);
@@ -1034,12 +1157,36 @@ U8* LLVertexBuffer::mapIndexBuffer(S32 access)
if(sDisableVBOMapping)
{
+ map_range = false;
allocateClientIndexBuffer() ;
}
else
{
- U8* src = (U8*) glMapBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, GL_WRITE_ONLY_ARB);
- mMappedIndexData = LL_NEXT_ALIGNED_ADDRESS<U8>(src);
+ U8* src = NULL;
+#ifdef GL_ARB_map_buffer_range
+ if (gGLManager.mHasMapBufferRange)
+ {
+ if (map_range)
+ {
+ S32 offset = sizeof(U16)*index;
+ S32 length = sizeof(U16)*count;
+ src = (U8*) glMapBufferRange(GL_ELEMENT_ARRAY_BUFFER_ARB, offset, length, GL_MAP_WRITE_BIT | GL_MAP_FLUSH_EXPLICIT_BIT | GL_MAP_INVALIDATE_RANGE_BIT);
+ }
+ else
+ {
+ src = (U8*) glMapBufferRange(GL_ELEMENT_ARRAY_BUFFER_ARB, 0, sizeof(U16)*mNumIndices, GL_MAP_WRITE_BIT | GL_MAP_FLUSH_EXPLICIT_BIT);
+ }
+ }
+ else
+#else
+ llassert_always(!gGLManager.mHasMapBufferRange);
+#endif
+ {
+ map_range = false;
+ src = (U8*) glMapBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, GL_WRITE_ONLY_ARB);
+ }
+
+ mMappedIndexData = src; //LL_NEXT_ALIGNED_ADDRESS<U8>(src);
mAlignedIndexOffset = mMappedIndexData - src;
stop_glerror();
}
@@ -1068,31 +1215,81 @@ U8* LLVertexBuffer::mapIndexBuffer(S32 access)
sMappedCount++;
}
+ else
+ {
+ map_range = false;
+ }
- return mMappedIndexData ;
+ if (map_range && !sDisableVBOMapping)
+ {
+ return mMappedIndexData;
+ }
+ else
+ {
+ return mMappedIndexData + sizeof(U16)*index;
+ }
}
void LLVertexBuffer::unmapBuffer(S32 type)
{
LLMemType mt2(LLMemType::MTYPE_VERTEX_UNMAP_BUFFER);
- if (!useVBOs())
+ if (!useVBOs() || type == -2)
{
return ; //nothing to unmap
}
bool updated_all = false ;
+
if (mMappedData && mVertexLocked && type != TYPE_INDEX)
{
updated_all = (mIndexLocked && type < 0) ; //both vertex and index buffers done updating
if(sDisableVBOMapping)
{
- stop_glerror();
- glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, 0, getSize(), mMappedData);
- stop_glerror();
+ if (!mMappedVertexRegions.empty())
+ {
+ stop_glerror();
+ for (U32 i = 0; i < mMappedVertexRegions.size(); ++i)
+ {
+ 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);
+ stop_glerror();
+ }
+
+ mMappedVertexRegions.clear();
+ }
+ else
+ {
+ stop_glerror();
+ glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, 0, getSize(), mMappedData);
+ stop_glerror();
+ }
}
else
{
+#ifdef GL_ARB_map_buffer_range
+ if (gGLManager.mHasMapBufferRange)
+ {
+ if (!mMappedVertexRegions.empty())
+ {
+ stop_glerror();
+ for (U32 i = 0; i < mMappedVertexRegions.size(); ++i)
+ {
+ const MappedRegion& region = mMappedVertexRegions[i];
+ S32 offset = region.mIndex >= 0 ? mOffsets[region.mType]+sTypeSize[region.mType]*region.mIndex : 0;
+ S32 length = sTypeSize[region.mType]*region.mCount;
+ glFlushMappedBufferRange(GL_ARRAY_BUFFER_ARB, offset, length);
+ stop_glerror();
+ }
+
+ mMappedVertexRegions.clear();
+ }
+ }
+#else
+ llassert_always(!gGLManager.mHasMapBufferRange);
+#endif
stop_glerror();
glUnmapBufferARB(GL_ARRAY_BUFFER_ARB);
stop_glerror();
@@ -1103,17 +1300,53 @@ void LLVertexBuffer::unmapBuffer(S32 type)
mVertexLocked = FALSE ;
sMappedCount--;
}
-
- if(mMappedIndexData && mIndexLocked && (type < 0 || type == TYPE_INDEX))
+
+ if (mMappedIndexData && mIndexLocked && (type < 0 || type == TYPE_INDEX))
{
if(sDisableVBOMapping)
{
- stop_glerror();
- glBufferSubDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0, getIndicesSize(), mMappedIndexData);
- stop_glerror();
+ if (!mMappedIndexRegions.empty())
+ {
+ for (U32 i = 0; i < mMappedIndexRegions.size(); ++i)
+ {
+ 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);
+ stop_glerror();
+ }
+
+ mMappedIndexRegions.clear();
+ }
+ else
+ {
+ stop_glerror();
+ glBufferSubDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0, getIndicesSize(), mMappedIndexData);
+ stop_glerror();
+ }
}
else
{
+#ifdef GL_ARB_map_buffer_range
+ if (gGLManager.mHasMapBufferRange)
+ {
+ if (!mMappedIndexRegions.empty())
+ {
+ for (U32 i = 0; i < mMappedIndexRegions.size(); ++i)
+ {
+ const MappedRegion& region = mMappedIndexRegions[i];
+ S32 offset = region.mIndex >= 0 ? sizeof(U16)*region.mIndex : 0;
+ S32 length = sizeof(U16)*region.mCount;
+ glFlushMappedBufferRange(GL_ELEMENT_ARRAY_BUFFER_ARB, offset, length);
+ stop_glerror();
+ }
+
+ mMappedIndexRegions.clear();
+ }
+ }
+#else
+ llassert_always(!gGLManager.mHasMapBufferRange);
+#endif
stop_glerror();
glUnmapBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB);
stop_glerror();
@@ -1152,19 +1385,19 @@ template <class T,S32 type> struct VertexBufferStrider
typedef LLStrider<T> strider_t;
static bool get(LLVertexBuffer& vbo,
strider_t& strider,
- S32 index)
+ S32 index, S32 count, bool map_range)
{
if (type == LLVertexBuffer::TYPE_INDEX)
{
- S32 stride = sizeof(T);
+ U8* ptr = vbo.mapIndexBuffer(index, count, map_range);
- if (vbo.mapIndexBuffer() == NULL)
+ if (ptr == NULL)
{
llwarns << "mapIndexBuffer failed!" << llendl;
return FALSE;
}
- strider = (T*)(vbo.getMappedIndices() + index*stride);
+ strider = (T*)ptr;
strider.setStride(0);
return TRUE;
}
@@ -1172,13 +1405,15 @@ template <class T,S32 type> struct VertexBufferStrider
{
S32 stride = LLVertexBuffer::sTypeSize[type];
- if (vbo.mapVertexBuffer(type) == NULL)
+ U8* ptr = vbo.mapVertexBuffer(type, index, count, map_range);
+
+ if (ptr == NULL)
{
llwarns << "mapVertexBuffer failed!" << llendl;
return FALSE;
}
- strider = (T*)(vbo.getMappedData() + vbo.getOffset(type)+index*stride);
+ strider = (T*)ptr;
strider.setStride(stride);
return TRUE;
}
@@ -1190,55 +1425,48 @@ template <class T,S32 type> struct VertexBufferStrider
}
};
-bool LLVertexBuffer::getVertexStrider(LLStrider<LLVector3>& strider, S32 index)
-{
- return VertexBufferStrider<LLVector3,TYPE_VERTEX>::get(*this, strider, index);
-}
-bool LLVertexBuffer::getIndexStrider(LLStrider<U16>& strider, S32 index)
+bool LLVertexBuffer::getVertexStrider(LLStrider<LLVector3>& strider, S32 index, S32 count, bool map_range)
{
- return VertexBufferStrider<U16,TYPE_INDEX>::get(*this, strider, index);
+ return VertexBufferStrider<LLVector3,TYPE_VERTEX>::get(*this, strider, index, count, map_range);
}
-bool LLVertexBuffer::getTexCoord0Strider(LLStrider<LLVector2>& strider, S32 index)
+bool LLVertexBuffer::getIndexStrider(LLStrider<U16>& strider, S32 index, S32 count, bool map_range)
{
- return VertexBufferStrider<LLVector2,TYPE_TEXCOORD0>::get(*this, strider, index);
+ return VertexBufferStrider<U16,TYPE_INDEX>::get(*this, strider, index, count, map_range);
}
-bool LLVertexBuffer::getTexCoord1Strider(LLStrider<LLVector2>& strider, S32 index)
+bool LLVertexBuffer::getTexCoord0Strider(LLStrider<LLVector2>& strider, S32 index, S32 count, bool map_range)
{
- return VertexBufferStrider<LLVector2,TYPE_TEXCOORD1>::get(*this, strider, index);
+ return VertexBufferStrider<LLVector2,TYPE_TEXCOORD0>::get(*this, strider, index, count, map_range);
}
-/*bool LLVertexBuffer::getTexCoord2Strider(LLStrider<LLVector2>& strider, S32 index)
+bool LLVertexBuffer::getTexCoord1Strider(LLStrider<LLVector2>& strider, S32 index, S32 count, bool map_range)
{
- return VertexBufferStrider<LLVector2,TYPE_TEXCOORD2>::get(*this, strider, index);
+ return VertexBufferStrider<LLVector2,TYPE_TEXCOORD1>::get(*this, strider, index, count, map_range);
}
-bool LLVertexBuffer::getTexCoord3Strider(LLStrider<LLVector2>& strider, S32 index)
-{
- return VertexBufferStrider<LLVector2,TYPE_TEXCOORD3>::get(*this, strider, index);
-}*/
-bool LLVertexBuffer::getNormalStrider(LLStrider<LLVector3>& strider, S32 index)
+
+bool LLVertexBuffer::getNormalStrider(LLStrider<LLVector3>& strider, S32 index, S32 count, bool map_range)
{
- return VertexBufferStrider<LLVector3,TYPE_NORMAL>::get(*this, strider, index);
+ return VertexBufferStrider<LLVector3,TYPE_NORMAL>::get(*this, strider, index, count, map_range);
}
-bool LLVertexBuffer::getBinormalStrider(LLStrider<LLVector3>& strider, S32 index)
+bool LLVertexBuffer::getBinormalStrider(LLStrider<LLVector3>& strider, S32 index, S32 count, bool map_range)
{
- return VertexBufferStrider<LLVector3,TYPE_BINORMAL>::get(*this, strider, index);
+ return VertexBufferStrider<LLVector3,TYPE_BINORMAL>::get(*this, strider, index, count, map_range);
}
-bool LLVertexBuffer::getColorStrider(LLStrider<LLColor4U>& strider, S32 index)
+bool LLVertexBuffer::getColorStrider(LLStrider<LLColor4U>& strider, S32 index, S32 count, bool map_range)
{
- return VertexBufferStrider<LLColor4U,TYPE_COLOR>::get(*this, strider, index);
+ return VertexBufferStrider<LLColor4U,TYPE_COLOR>::get(*this, strider, index, count, map_range);
}
-bool LLVertexBuffer::getWeightStrider(LLStrider<F32>& strider, S32 index)
+bool LLVertexBuffer::getWeightStrider(LLStrider<F32>& strider, S32 index, S32 count, bool map_range)
{
- return VertexBufferStrider<F32,TYPE_WEIGHT>::get(*this, strider, index);
+ return VertexBufferStrider<F32,TYPE_WEIGHT>::get(*this, strider, index, count, map_range);
}
-bool LLVertexBuffer::getWeight4Strider(LLStrider<LLVector4>& strider, S32 index)
+bool LLVertexBuffer::getWeight4Strider(LLStrider<LLVector4>& strider, S32 index, S32 count, bool map_range)
{
- return VertexBufferStrider<LLVector4,TYPE_WEIGHT4>::get(*this, strider, index);
+ return VertexBufferStrider<LLVector4,TYPE_WEIGHT4>::get(*this, strider, index, count, map_range);
}
-bool LLVertexBuffer::getClothWeightStrider(LLStrider<LLVector4>& strider, S32 index)
+bool LLVertexBuffer::getClothWeightStrider(LLStrider<LLVector4>& strider, S32 index, S32 count, bool map_range)
{
- return VertexBufferStrider<LLVector4,TYPE_CLOTHWEIGHT>::get(*this, strider, index);
+ return VertexBufferStrider<LLVector4,TYPE_CLOTHWEIGHT>::get(*this, strider, index, count, map_range);
}
//----------------------------------------------------------------------------
@@ -1497,17 +1725,16 @@ void LLVertexBuffer::setupVertexBuffer(U32 data_mask) const
}
if (data_mask & MAP_VERTEX)
{
- glVertexPointer(3,GL_FLOAT, LLVertexBuffer::sTypeSize[TYPE_VERTEX], (void*)(base + 0));
+ if (data_mask & MAP_TEXTURE_INDEX)
+ {
+ glVertexPointer(4,GL_FLOAT, LLVertexBuffer::sTypeSize[TYPE_VERTEX], (void*)(base + 0));
+ }
+ else
+ {
+ glVertexPointer(3,GL_FLOAT, LLVertexBuffer::sTypeSize[TYPE_VERTEX], (void*)(base + 0));
+ }
}
llglassertok();
}
-void LLVertexBuffer::markDirty(U32 vert_index, U32 vert_count, U32 indices_index, U32 indices_count)
-{
- // TODO: use GL_APPLE_flush_buffer_range here
- /*if (useVBOs() && !mFilthy)
- {
-
- }*/
-}
diff --git a/indra/llrender/llvertexbuffer.h b/indra/llrender/llvertexbuffer.h
index a9f22193f8..aa5df305a6 100644
--- a/indra/llrender/llvertexbuffer.h
+++ b/indra/llrender/llvertexbuffer.h
@@ -77,6 +77,18 @@ protected:
class LLVertexBuffer : public LLRefCount
{
public:
+ class MappedRegion
+ {
+ public:
+ S32 mType;
+ S32 mIndex;
+ S32 mCount;
+
+ MappedRegion(S32 type, S32 index, S32 count)
+ : mType(type), mIndex(index), mCount(count)
+ { }
+ };
+
LLVertexBuffer(const LLVertexBuffer& rhs)
{
*this = rhs;
@@ -130,6 +142,9 @@ public:
TYPE_CLOTHWEIGHT,
TYPE_MAX,
TYPE_INDEX,
+
+ //no actual additional data, but indicates position.w is texture index
+ TYPE_TEXTURE_INDEX,
};
enum {
MAP_VERTEX = (1<<TYPE_VERTEX),
@@ -144,6 +159,7 @@ public:
MAP_WEIGHT = (1<<TYPE_WEIGHT),
MAP_WEIGHT4 = (1<<TYPE_WEIGHT4),
MAP_CLOTHWEIGHT = (1<<TYPE_CLOTHWEIGHT),
+ MAP_TEXTURE_INDEX = (1<<TYPE_TEXTURE_INDEX),
};
protected:
@@ -173,8 +189,8 @@ public:
LLVertexBuffer(U32 typemask, S32 usage);
// map for data access
- U8* mapVertexBuffer(S32 type = -1, S32 access = -1);
- U8* mapIndexBuffer(S32 access = -1);
+ U8* mapVertexBuffer(S32 type, S32 index, S32 count, bool map_range);
+ 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
@@ -189,16 +205,16 @@ public:
// vb->getNormalStrider(norms);
// setVertsNorms(verts, norms);
// vb->unmapBuffer();
- bool getVertexStrider(LLStrider<LLVector3>& strider, S32 index=0);
- bool getIndexStrider(LLStrider<U16>& strider, S32 index=0);
- bool getTexCoord0Strider(LLStrider<LLVector2>& strider, S32 index=0);
- bool getTexCoord1Strider(LLStrider<LLVector2>& strider, S32 index=0);
- bool getNormalStrider(LLStrider<LLVector3>& strider, S32 index=0);
- bool getBinormalStrider(LLStrider<LLVector3>& strider, S32 index=0);
- bool getColorStrider(LLStrider<LLColor4U>& strider, S32 index=0);
- bool getWeightStrider(LLStrider<F32>& strider, S32 index=0);
- bool getWeight4Strider(LLStrider<LLVector4>& strider, S32 index=0);
- bool getClothWeightStrider(LLStrider<LLVector4>& strider, S32 index=0);
+ bool getVertexStrider(LLStrider<LLVector3>& 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 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; }
@@ -218,8 +234,6 @@ public:
S32 getOffset(S32 type) const { return mOffsets[type]; }
S32 getUsage() const { return mUsage; }
- void markDirty(U32 vert_index, U32 vert_count, U32 indices_index, U32 indices_count);
-
void draw(U32 mode, U32 count, U32 indices_offset) const;
void drawArrays(U32 mode, U32 offset, U32 count) const;
void drawRange(U32 mode, U32 start, U32 end, U32 count, U32 indices_offset) const;
@@ -253,20 +267,8 @@ protected:
BOOL mDynamicSize; // if TRUE, buffer has been resized at least once (and should be padded)
S32 mOffsets[TYPE_MAX];
- class DirtyRegion
- {
- public:
- U32 mIndex;
- U32 mCount;
- U32 mIndicesIndex;
- U32 mIndicesCount;
-
- DirtyRegion(U32 vi, U32 vc, U32 ii, U32 ic)
- : mIndex(vi), mCount(vc), mIndicesIndex(ii), mIndicesCount(ic)
- { }
- };
-
- std::vector<DirtyRegion> mDirtyRegions; //vector of dirty regions to rebuild
+ std::vector<MappedRegion> mMappedVertexRegions;
+ std::vector<MappedRegion> mMappedIndexRegions;
public:
static S32 sCount;
diff --git a/indra/llui/CMakeLists.txt b/indra/llui/CMakeLists.txt
index 684e393cba..0bbdcfd6ff 100644
--- a/indra/llui/CMakeLists.txt
+++ b/indra/llui/CMakeLists.txt
@@ -28,6 +28,8 @@ include_directories(
set(llui_SOURCE_FILES
llaccordionctrl.cpp
llaccordionctrltab.cpp
+ llbadge.cpp
+ llbadgeowner.cpp
llbutton.cpp
llcheckboxctrl.cpp
llclipboard.cpp
@@ -93,6 +95,7 @@ set(llui_SOURCE_FILES
lltextparser.cpp
lltextutil.cpp
lltextvalidate.cpp
+ lltimectrl.cpp
lltransutil.cpp
lltoggleablemenu.cpp
lltooltip.cpp
@@ -119,6 +122,8 @@ set(llui_HEADER_FILES
llaccordionctrl.h
llaccordionctrltab.h
+ llbadge.h
+ llbadgeowner.h
llbutton.h
llcallbackmap.h
llcheckboxctrl.h
@@ -191,6 +196,7 @@ set(llui_HEADER_FILES
lltextparser.h
lltextutil.h
lltextvalidate.h
+ lltimectrl.h
lltoggleablemenu.h
lltooltip.h
lltransutil.h
@@ -245,11 +251,11 @@ target_link_libraries(llui
)
# Add tests
-if (LL_TESTS)
- include(LLAddBuildTest)
- SET(llui_TEST_SOURCE_FILES
- llurlmatch.cpp
- llurlentry.cpp
- )
- LL_ADD_PROJECT_UNIT_TESTS(llui "${llui_TEST_SOURCE_FILES}")
-endif (LL_TESTS) \ No newline at end of file
+if(LL_TESTS)
+ include(LLAddBuildTest)
+ SET(llui_TEST_SOURCE_FILES
+ llurlmatch.cpp
+ llurlentry.cpp
+ )
+ LL_ADD_PROJECT_UNIT_TESTS(llui "${llui_TEST_SOURCE_FILES}")
+endif(LL_TESTS)
diff --git a/indra/llui/llaccordionctrltab.cpp b/indra/llui/llaccordionctrltab.cpp
index 9e4849c58b..6afe276379 100644
--- a/indra/llui/llaccordionctrltab.cpp
+++ b/indra/llui/llaccordionctrltab.cpp
@@ -1022,7 +1022,7 @@ void LLAccordionCtrlTab::updateLayout ( const LLRect& child_rect )
S32 panel_width = child_rect.getWidth();
static LLUICachedControl<S32> scrollbar_size ("UIScrollbarSize", 0);
- if(mScrollbar->getVisible() != false)
+ if(mScrollbar && mScrollbar->getVisible() != false)
{
panel_top+=mScrollbar->getDocPos();
panel_width-=scrollbar_size;
diff --git a/indra/llui/llbadge.cpp b/indra/llui/llbadge.cpp
new file mode 100644
index 0000000000..c28a947a7f
--- /dev/null
+++ b/indra/llui/llbadge.cpp
@@ -0,0 +1,274 @@
+/**
+ * @file llbadge.cpp
+ * @brief Implementation for badges
+ *
+ * $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$
+ */
+
+#define LLBADGE_CPP
+#include "llbadge.h"
+
+#include "lluictrlfactory.h"
+
+
+static LLDefaultChildRegistry::Register<LLBadge> r("badge");
+
+// Compiler optimization, generate extern template
+template class LLBadge* LLView::getChild<class LLBadge>(const std::string& name, BOOL recurse) const;
+
+
+LLBadge::Params::Params()
+ : image("image")
+ , border_image("border_image")
+ , border_color("border_color")
+ , image_color("image_color")
+ , label("label")
+ , label_color("label_color")
+ , location("location", LLRelPos::TOP_LEFT)
+ , location_percent_hcenter("location_percent_hcenter")
+ , location_percent_vcenter("location_percent_vcenter")
+ , padding_horiz("padding_horiz")
+ , padding_vert("padding_vert")
+{
+ // We set a name here so the name isn't necessary in any xml files that use badges
+ name = "badge";
+}
+
+bool LLBadge::Params::equals(const Params& a) const
+{
+ bool comp = true;
+
+ // skip owner in comparison on purpose
+
+ comp &= (border_image() == a.border_image());
+ comp &= (border_color() == a.border_color());
+ comp &= (image() == a.image());
+ comp &= (image_color() == a.image_color());
+ comp &= (label() == a.label());
+ comp &= (label_color() == a.label_color());
+ comp &= (location() == a.location());
+ comp &= (location_percent_hcenter() == a.location_percent_hcenter());
+ comp &= (location_percent_vcenter() == a.location_percent_vcenter());
+ comp &= (padding_horiz() == a.padding_horiz());
+ comp &= (padding_vert() == a.padding_vert());
+
+ return comp;
+}
+
+LLBadge::LLBadge(const LLBadge::Params& p)
+ : LLUICtrl(p)
+ , mOwner(p.owner)
+ , mBorderImage(p.border_image)
+ , mBorderColor(p.border_color)
+ , mGLFont(p.font)
+ , mImage(p.image)
+ , mImageColor(p.image_color)
+ , mLabel(p.label)
+ , mLabelColor(p.label_color)
+ , mLocation(p.location)
+ , mLocationPercentHCenter(0.5f)
+ , mLocationPercentVCenter(0.5f)
+ , mPaddingHoriz(p.padding_horiz)
+ , mPaddingVert(p.padding_vert)
+{
+ if (mImage.isNull())
+ {
+ llwarns << "Badge: " << getName() << " with no image!" << llendl;
+ }
+
+ //
+ // The following logic is to set the mLocationPercentHCenter and mLocationPercentVCenter
+ // based on the Location enum and our horizontal and vertical location percentages. The
+ // draw code then uses this on the owner rectangle to compute the screen location for
+ // the badge.
+ //
+
+ if (!LLRelPos::IsCenter(mLocation))
+ {
+ F32 h_center = p.location_percent_hcenter * 0.01f;
+ F32 v_center = p.location_percent_vcenter * 0.01f;
+
+ if (LLRelPos::IsRight(mLocation))
+ {
+ mLocationPercentHCenter = 0.5f * (1.0f + h_center);
+ }
+ else if (LLRelPos::IsLeft(mLocation))
+ {
+ mLocationPercentHCenter = 0.5f * (1.0f - h_center);
+ }
+
+ if (LLRelPos::IsTop(mLocation))
+ {
+ mLocationPercentVCenter = 0.5f * (1.0f + v_center);
+ }
+ else if (LLRelPos::IsBottom(mLocation))
+ {
+ mLocationPercentVCenter = 0.5f * (1.0f - v_center);
+ }
+ }
+}
+
+LLBadge::~LLBadge()
+{
+}
+
+void LLBadge::setLabel(const LLStringExplicit& label)
+{
+ mLabel = label;
+}
+
+//
+// This is a fallback function to render a rectangle for badges without a valid image
+//
+void renderBadgeBackground(F32 centerX, F32 centerY, F32 width, F32 height, const LLColor4U &color)
+{
+ gGL.pushUIMatrix();
+ gGL.loadUIIdentity();
+ gGL.setSceneBlendType(LLRender::BT_REPLACE);
+ gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+
+ gGL.color4ubv(color.mV);
+ gGL.texCoord2i(0, 0);
+
+ F32 x = LLFontGL::sCurOrigin.mX + centerX - width * 0.5f;
+ F32 y = LLFontGL::sCurOrigin.mY + centerY - height * 0.5f;
+
+ LLRectf screen_rect(llround(x),
+ llround(y),
+ llround(x) + width,
+ llround(y) + height);
+
+ LLVector3 vertices[4];
+ vertices[0] = LLVector3(screen_rect.mRight, screen_rect.mTop, 1.0f);
+ vertices[1] = LLVector3(screen_rect.mLeft, screen_rect.mTop, 1.0f);
+ vertices[2] = LLVector3(screen_rect.mLeft, screen_rect.mBottom, 1.0f);
+ vertices[3] = LLVector3(screen_rect.mRight, screen_rect.mBottom, 1.0f);
+
+ gGL.begin(LLRender::QUADS);
+ {
+ gGL.vertexBatchPreTransformed(vertices, 4);
+ }
+ gGL.end();
+
+ gGL.popUIMatrix();
+}
+
+
+// virtual
+void LLBadge::draw()
+{
+ if (!mLabel.empty())
+ {
+ LLView* owner_view = mOwner.get();
+
+ if (owner_view)
+ {
+ //
+ // Calculate badge position based on owner
+ //
+
+ LLRect owner_rect;
+ owner_view->localRectToOtherView(owner_view->getLocalRect(), & owner_rect, this);
+
+ F32 badge_center_x = owner_rect.mLeft + owner_rect.getWidth() * mLocationPercentHCenter;
+ F32 badge_center_y = owner_rect.mBottom + owner_rect.getHeight() * mLocationPercentVCenter;
+
+ //
+ // Calculate badge size based on label text
+ //
+
+ LLWString badge_label_wstring = mLabel;
+
+ S32 badge_label_begin_offset = 0;
+ S32 badge_char_length = S32_MAX;
+ S32 badge_pixel_length = S32_MAX;
+ F32 *right_position_out = NULL;
+ BOOL do_not_use_ellipses = false;
+
+ F32 badge_width = (2.0f * mPaddingHoriz) +
+ mGLFont->getWidthF32(badge_label_wstring.c_str(), badge_label_begin_offset, badge_char_length);
+
+ F32 badge_height = (2.0f * mPaddingVert) + mGLFont->getLineHeight();
+
+ //
+ // Draw button image, if available.
+ // Otherwise draw basic rectangular button.
+ //
+
+ F32 alpha = getDrawContext().mAlpha;
+
+ if (!mImage.isNull())
+ {
+ F32 badge_x = badge_center_x - badge_width * 0.5f;
+ F32 badge_y = badge_center_y - badge_height * 0.5f;
+
+ mImage->drawSolid((S32) badge_x, (S32) badge_y, (S32) badge_width, (S32) badge_height, mImageColor % alpha);
+
+ if (!mBorderImage.isNull())
+ {
+ mBorderImage->drawSolid((S32) badge_x, (S32) badge_y, (S32) badge_width, (S32) badge_height, mBorderColor % alpha);
+ }
+ }
+ else
+ {
+ lldebugs << "No image for badge " << getName() << " on owner " << owner_view->getName() << llendl;
+
+ renderBadgeBackground(badge_center_x, badge_center_y,
+ badge_width, badge_height,
+ mImageColor % alpha);
+ }
+
+ //
+ // Draw the label
+ //
+
+ mGLFont->render(badge_label_wstring, badge_label_begin_offset,
+ badge_center_x, badge_center_y,
+ mLabelColor % alpha,
+ LLFontGL::HCENTER, LLFontGL::VCENTER, // centered around the position
+ LLFontGL::NORMAL, // normal text (not bold, italics, etc.)
+ LLFontGL::DROP_SHADOW_SOFT,
+ badge_char_length, badge_pixel_length,
+ right_position_out, do_not_use_ellipses);
+ }
+ }
+}
+
+
+namespace LLInitParam
+{
+ void TypeValues<LLRelPos::Location>::declareValues()
+ {
+ declare("bottom", LLRelPos::BOTTOM);
+ declare("bottom_left", LLRelPos::BOTTOM_LEFT);
+ declare("bottom_right", LLRelPos::BOTTOM_RIGHT);
+ declare("center", LLRelPos::CENTER);
+ declare("left", LLRelPos::LEFT);
+ declare("right", LLRelPos::RIGHT);
+ declare("top", LLRelPos::TOP);
+ declare("top_left", LLRelPos::TOP_LEFT);
+ declare("top_right", LLRelPos::TOP_RIGHT);
+ }
+}
+
+
+// eof
diff --git a/indra/llui/llbadge.h b/indra/llui/llbadge.h
new file mode 100644
index 0000000000..0f923ef01b
--- /dev/null
+++ b/indra/llui/llbadge.h
@@ -0,0 +1,159 @@
+/**
+ * @file llbadge.h
+ * @brief Header for badges
+ *
+ * $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_LLBADGE_H
+#define LL_LLBADGE_H
+
+#include <string>
+
+#include "lluicolor.h"
+#include "lluictrl.h"
+#include "llstring.h"
+#include "lluiimage.h"
+#include "llview.h"
+
+//
+// Declarations
+//
+
+class LLUICtrlFactory;
+class LLFontGL;
+
+//
+// Relative Position Alignment
+//
+
+namespace LLRelPos
+{
+ enum Location
+ {
+ CENTER = 0,
+
+ LEFT = (1 << 0),
+ RIGHT = (1 << 1),
+
+ TOP = (1 << 2),
+ BOTTOM = (1 << 3),
+
+ BOTTOM_LEFT = (BOTTOM | LEFT),
+ BOTTOM_RIGHT = (BOTTOM | RIGHT),
+
+ TOP_LEFT = (TOP | LEFT),
+ TOP_RIGHT = (TOP | RIGHT),
+ };
+
+ inline bool IsBottom(Location relPos) { return (relPos & BOTTOM) == BOTTOM; }
+ inline bool IsCenter(Location relPos) { return (relPos == CENTER); }
+ inline bool IsLeft(Location relPos) { return (relPos & LEFT) == LEFT; }
+ inline bool IsRight(Location relPos) { return (relPos & RIGHT) == RIGHT; }
+ inline bool IsTop(Location relPos) { return (relPos & TOP) == TOP; }
+}
+
+// NOTE: This needs to occur before Optional<LLRelPos::Location> declaration for proper compilation.
+namespace LLInitParam
+{
+ template<>
+ struct TypeValues<LLRelPos::Location> : public TypeValuesHelper<LLRelPos::Location>
+ {
+ static void declareValues();
+ };
+}
+
+//
+// Classes
+//
+
+class LLBadge
+: public LLUICtrl
+{
+public:
+ struct Params
+ : public LLInitParam::Block<Params, LLUICtrl::Params>
+ {
+ Optional< LLHandle<LLView> > owner; // Mandatory in code but not in xml
+
+ Optional< LLUIImage* > border_image;
+ Optional< LLUIColor > border_color;
+
+ Optional< LLUIImage* > image;
+ Optional< LLUIColor > image_color;
+
+ Optional< std::string > label;
+ Optional< LLUIColor > label_color;
+
+ Optional< LLRelPos::Location > location;
+ Optional< U32 > location_percent_hcenter;
+ Optional< U32 > location_percent_vcenter;
+
+ Optional< F32 > padding_horiz;
+ Optional< F32 > padding_vert;
+
+ Params();
+
+ bool equals(const Params&) const;
+ };
+
+protected:
+ friend class LLUICtrlFactory;
+ LLBadge(const Params& p);
+
+public:
+
+ ~LLBadge();
+
+ virtual void draw();
+
+ const std::string getLabel() const { return wstring_to_utf8str(mLabel); }
+ void setLabel( const LLStringExplicit& label);
+
+private:
+ LLPointer< LLUIImage > mBorderImage;
+ LLUIColor mBorderColor;
+
+ const LLFontGL* mGLFont;
+
+ LLPointer< LLUIImage > mImage;
+ LLUIColor mImageColor;
+
+ LLUIString mLabel;
+ LLUIColor mLabelColor;
+
+ LLRelPos::Location mLocation;
+ F32 mLocationPercentHCenter;
+ F32 mLocationPercentVCenter;
+
+ LLHandle< LLView > mOwner;
+
+ F32 mPaddingHoriz;
+ F32 mPaddingVert;
+};
+
+// Build time optimization, generate once in .cpp file
+#ifndef LLBADGE_CPP
+extern template class LLBadge* LLView::getChild<class LLBadge>(const std::string& name, BOOL recurse) const;
+#endif
+
+#endif // LL_LLBADGE_H
diff --git a/indra/llui/llbadgeowner.cpp b/indra/llui/llbadgeowner.cpp
new file mode 100644
index 0000000000..77f15567bf
--- /dev/null
+++ b/indra/llui/llbadgeowner.cpp
@@ -0,0 +1,126 @@
+/**
+ * @file llbadgeowner.cpp
+ * @brief Class to manage badges attached to a UI control
+ *
+ * $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 "llbadgeowner.h"
+#include "llpanel.h"
+
+//
+// Classes
+//
+
+LLBadgeOwner::LLBadgeOwner(LLHandle< LLView > viewHandle)
+ : mBadge(NULL)
+ , mBadgeOwnerView(viewHandle)
+{
+}
+
+void LLBadgeOwner::initBadgeParams(const LLBadge::Params& p)
+{
+ if (!p.equals(LLUICtrlFactory::getDefaultParams<LLBadge>()))
+ {
+ mBadge = createBadge(p);
+ }
+}
+
+void LLBadgeOwner::setBadgeLabel(const LLStringExplicit& label)
+{
+ if (mBadge == NULL)
+ {
+ mBadge = createBadge(LLUICtrlFactory::getDefaultParams<LLBadge>());
+
+ addBadgeToParentPanel();
+ }
+
+ if (mBadge)
+ {
+ mBadge->setLabel(label);
+
+ //
+ // Push the badge to the front so it renders on top
+ //
+
+ LLView * parent = mBadge->getParent();
+
+ if (parent)
+ {
+ parent->sendChildToFront(mBadge);
+ }
+ }
+}
+
+void LLBadgeOwner::setBadgeVisibility(bool visible)
+{
+ if (mBadge)
+ {
+ mBadge->setVisible(visible);
+ }
+}
+
+void LLBadgeOwner::addBadgeToParentPanel()
+{
+ LLView * owner_view = mBadgeOwnerView.get();
+
+ if (mBadge && owner_view)
+ {
+ // Badge parent is badge owner by default
+ LLView * badge_parent = owner_view;
+
+ // Find the appropriate parent for the badge
+ LLView * parent = owner_view->getParent();
+
+ while (parent)
+ {
+ LLPanel * parent_panel = dynamic_cast<LLPanel *>(parent);
+
+ if (parent_panel && parent_panel->acceptsBadge())
+ {
+ badge_parent = parent;
+ break;
+ }
+
+ parent = parent->getParent();
+ }
+
+ if (badge_parent)
+ {
+ badge_parent->addChild(mBadge);
+ }
+ else
+ {
+ llwarns << "Unable to find parent panel for badge " << mBadge->getName() << " on " << owner_view->getName() << llendl;
+ }
+ }
+}
+
+LLBadge* LLBadgeOwner::createBadge(const LLBadge::Params& p)
+{
+ LLBadge::Params badge_params(p);
+ badge_params.owner = mBadgeOwnerView;
+
+ return LLUICtrlFactory::create<LLBadge>(badge_params);
+}
diff --git a/indra/newview/lldrawpoolclouds.h b/indra/llui/llbadgeowner.h
index 019f11a795..a2399189a5 100644
--- a/indra/newview/lldrawpoolclouds.h
+++ b/indra/llui/llbadgeowner.h
@@ -1,8 +1,8 @@
/**
- * @file lldrawpoolclouds.h
- * @brief LLDrawPoolClouds class definition
+ * @file llbadgeowner.h
+ * @brief Header for badge owners
*
- * $LicenseInfo:firstyear=2006&license=viewerlgpl$
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2010, Linden Research, Inc.
*
@@ -24,31 +24,38 @@
* $/LicenseInfo$
*/
-#ifndef LL_LLDRAWPOOLCLOUDS_H
-#define LL_LLDRAWPOOLCLOUDS_H
+#ifndef LL_LLBADGEOWNER_H
+#define LL_LLBADGEOWNER_H
-#include "lldrawpool.h"
+#include "llbadge.h"
+#include "llview.h"
-class LLDrawPoolClouds : public LLDrawPool
+//
+// Classes
+//
+
+class LLBadgeOwner
{
public:
- enum
- {
- VERTEX_DATA_MASK = LLVertexBuffer::MAP_VERTEX |
- LLVertexBuffer::MAP_NORMAL |
- LLVertexBuffer::MAP_TEXCOORD0
- };
-
- BOOL addFace(LLFace* face);
- virtual U32 getVertexDataMask() { return VERTEX_DATA_MASK; }
-
- LLDrawPoolClouds();
-
- /*virtual*/ void prerender();
- /*virtual*/ LLDrawPool *instancePool();
- /*virtual*/ void enqueue(LLFace *face);
- /*virtual*/ void beginRenderPass(S32 pass);
- /*virtual*/ void render(S32 pass = 0);
+
+ LLBadgeOwner(LLHandle< LLView > viewHandle);
+
+ void initBadgeParams(const LLBadge::Params& p);
+ void addBadgeToParentPanel();
+
+ bool badgeHasParent() const { return (mBadge && mBadge->getParent()); }
+
+ void setBadgeLabel(const LLStringExplicit& label);
+ void setBadgeVisibility(bool visible);
+
+private:
+
+ LLBadge* createBadge(const LLBadge::Params& p);
+
+private:
+
+ LLBadge* mBadge;
+ LLHandle< LLView > mBadgeOwnerView;
};
-#endif // LL_LLDRAWPOOLSKY_H
+#endif // LL_LLBADGEOWNER_H
diff --git a/indra/llui/llbutton.cpp b/indra/llui/llbutton.cpp
index 45ceaff696..7b015bd576 100644
--- a/indra/llui/llbutton.cpp
+++ b/indra/llui/llbutton.cpp
@@ -99,7 +99,9 @@ LLButton::Params::Params()
scale_image("scale_image", true),
hover_glow_amount("hover_glow_amount"),
commit_on_return("commit_on_return", true),
- use_draw_context_alpha("use_draw_context_alpha", true)
+ use_draw_context_alpha("use_draw_context_alpha", true),
+ badge("badge"),
+ handle_right_mouse("handle_right_mouse")
{
addSynonym(is_toggle, "toggle");
held_down_delay.seconds = 0.5f;
@@ -109,6 +111,7 @@ LLButton::Params::Params()
LLButton::LLButton(const LLButton::Params& p)
: LLUICtrl(p),
+ LLBadgeOwner(LLView::getHandle()),
mMouseDownFrame(0),
mMouseHeldDownCount(0),
mBorderEnabled( FALSE ),
@@ -160,8 +163,8 @@ LLButton::LLButton(const LLButton::Params& p)
mMouseDownSignal(NULL),
mMouseUpSignal(NULL),
mHeldDownSignal(NULL),
- mUseDrawContextAlpha(p.use_draw_context_alpha)
-
+ mUseDrawContextAlpha(p.use_draw_context_alpha),
+ mHandleRightMouse(p.handle_right_mouse)
{
static LLUICachedControl<S32> llbutton_orig_h_pad ("UIButtonOrigHPad", 0);
static Params default_params(LLUICtrlFactory::getDefaultParams<LLButton>());
@@ -244,6 +247,11 @@ LLButton::LLButton(const LLButton::Params& p)
{
setHeldDownCallback(initCommitCallback(p.mouse_held_callback));
}
+
+ if (p.badge.isProvided())
+ {
+ LLBadgeOwner::initBadgeParams(p.badge());
+ }
}
LLButton::~LLButton()
@@ -327,8 +335,12 @@ boost::signals2::connection LLButton::setHeldDownCallback( button_callback_t cb,
BOOL LLButton::postBuild()
{
autoResize();
- return TRUE;
+
+ addBadgeToParentPanel();
+
+ return LLUICtrl::postBuild();
}
+
BOOL LLButton::handleUnicodeCharHere(llwchar uni_char)
{
BOOL handled = FALSE;
@@ -447,7 +459,7 @@ BOOL LLButton::handleMouseUp(S32 x, S32 y, MASK mask)
BOOL LLButton::handleRightMouseDown(S32 x, S32 y, MASK mask)
{
- if (!childrenHandleRightMouseDown(x, y, mask))
+ if (mHandleRightMouse && !childrenHandleRightMouseDown(x, y, mask))
{
// Route future Mouse messages here preemptively. (Release on mouse up.)
gFocusMgr.setMouseCapture( this );
@@ -460,37 +472,42 @@ BOOL LLButton::handleRightMouseDown(S32 x, S32 y, MASK mask)
// if (pointInView(x, y))
// {
// }
+ // send the mouse down signal
+ LLUICtrl::handleRightMouseDown(x,y,mask);
+ // *TODO: Return result of LLUICtrl call above? Should defer to base class
+ // but this might change the mouse handling of existing buttons in a bad way
+ // if they are not mouse opaque.
}
- // send the mouse down signal
- LLUICtrl::handleRightMouseDown(x,y,mask);
- // *TODO: Return result of LLUICtrl call above? Should defer to base class
- // but this might change the mouse handling of existing buttons in a bad way
- // if they are not mouse opaque.
+
return TRUE;
}
BOOL LLButton::handleRightMouseUp(S32 x, S32 y, MASK mask)
{
- // We only handle the click if the click both started and ended within us
- if( hasMouseCapture() )
+ if (mHandleRightMouse)
{
- // Always release the mouse
- gFocusMgr.setMouseCapture( NULL );
+ // We only handle the click if the click both started and ended within us
+ if( hasMouseCapture() )
+ {
+ // Always release the mouse
+ gFocusMgr.setMouseCapture( NULL );
-// if (pointInView(x, y))
-// {
-// mRightMouseUpSignal(this, x,y,mask);
-// }
- }
- else
- {
- childrenHandleRightMouseUp(x, y, mask);
+ // if (pointInView(x, y))
+ // {
+ // mRightMouseUpSignal(this, x,y,mask);
+ // }
+ }
+ else
+ {
+ childrenHandleRightMouseUp(x, y, mask);
+ }
+
+ // send the mouse up signal
+ LLUICtrl::handleRightMouseUp(x,y,mask);
+ // *TODO: Return result of LLUICtrl call above? Should defer to base class
+ // but this might change the mouse handling of existing buttons in a bad way.
+ // if they are not mouse opaque.
}
- // send the mouse up signal
- LLUICtrl::handleRightMouseUp(x,y,mask);
- // *TODO: Return result of LLUICtrl call above? Should defer to base class
- // but this might change the mouse handling of existing buttons in a bad way.
- // if they are not mouse opaque.
return TRUE;
}
diff --git a/indra/llui/llbutton.h b/indra/llui/llbutton.h
index 0cfc393e05..5968916006 100644
--- a/indra/llui/llbutton.h
+++ b/indra/llui/llbutton.h
@@ -27,6 +27,8 @@
#ifndef LL_LLBUTTON_H
#define LL_LLBUTTON_H
+#include "lluuid.h"
+#include "llbadgeowner.h"
#include "llcontrol.h"
#include "lluictrl.h"
#include "v4color.h"
@@ -52,15 +54,13 @@ S32 round_up(S32 grid, S32 value);
class LLUICtrlFactory;
-class LLUIImage;
-class LLUUID;
//
// Classes
//
class LLButton
-: public LLUICtrl
+: public LLUICtrl, public LLBadgeOwner
{
public:
struct Params
@@ -125,7 +125,11 @@ public:
Optional<F32> hover_glow_amount;
Optional<TimeIntervalParam> held_down_delay;
- Optional<bool> use_draw_context_alpha;
+ Optional<bool> use_draw_context_alpha;
+
+ Optional<LLBadge::Params> badge;
+
+ Optional<bool> handle_right_mouse;
Params();
};
@@ -249,7 +253,7 @@ public:
void setImageDisabledSelected(LLPointer<LLUIImage> image);
void setImageFlash(LLPointer<LLUIImage> image);
void setImagePressed(LLPointer<LLUIImage> image);
-
+
void setCommitOnReturn(BOOL commit) { mCommitOnReturn = commit; }
BOOL getCommitOnReturn() const { return mCommitOnReturn; }
@@ -357,6 +361,8 @@ private:
bool mForcePressedState;
LLFrameTimer mFlashingTimer;
+
+ bool mHandleRightMouse;
};
// Build time optimization, generate once in .cpp file
diff --git a/indra/llui/llconsole.cpp b/indra/llui/llconsole.cpp
index 06bad1f371..04040200d0 100644
--- a/indra/llui/llconsole.cpp
+++ b/indra/llui/llconsole.cpp
@@ -132,6 +132,9 @@ void LLConsole::setFontSize(S32 size_index)
void LLConsole::draw()
{
+ // Units in pixels
+ static const F32 padding_horizontal = 10;
+ static const F32 padding_vertical = 3;
LLGLSUIDefault gls_ui;
// skip lines added more than mLinePersistTime ago
@@ -176,11 +179,9 @@ void LLConsole::draw()
// draw remaining lines
F32 y_pos = 0.f;
- LLUIImagePtr imagep = LLUI::getUIImage("Rounded_Square");
+ LLUIImagePtr imagep = LLUI::getUIImage("transparent");
-// F32 console_opacity = llclamp(gSavedSettings.getF32("ConsoleBackgroundOpacity"), 0.f, 1.f);
F32 console_opacity = llclamp(LLUI::sSettingGroups["config"]->getF32("ConsoleBackgroundOpacity"), 0.f, 1.f);
-// LLColor4 color = LLUIColorTable::instance().getColor("ConsoleBackground");
LLColor4 color = LLUIColorTable::instance().getColor("ConsoleBackground");
color.mV[VALPHA] *= console_opacity;
@@ -188,8 +189,8 @@ void LLConsole::draw()
for(paragraph_it = mParagraphs.rbegin(); paragraph_it != mParagraphs.rend(); paragraph_it++)
{
- S32 target_height = llfloor( (*paragraph_it).mLines.size() * line_height + 8);
- S32 target_width = llfloor( (*paragraph_it).mMaxWidth +15);
+ S32 target_height = llfloor( (*paragraph_it).mLines.size() * line_height + padding_vertical);
+ S32 target_width = llfloor( (*paragraph_it).mMaxWidth + padding_horizontal);
y_pos += ((*paragraph_it).mLines.size()) * line_height;
imagep->drawSolid(-14, (S32)(y_pos + line_height - target_height), target_width, target_height, color);
@@ -234,7 +235,7 @@ void LLConsole::draw()
y_off += line_height;
}
}
- y_pos += 8;
+ y_pos += padding_vertical;
}
}
diff --git a/indra/llui/lllayoutstack.cpp b/indra/llui/lllayoutstack.cpp
index 9b6830a816..6a91ec56e4 100644
--- a/indra/llui/lllayoutstack.cpp
+++ b/indra/llui/lllayoutstack.cpp
@@ -49,6 +49,8 @@ void LLLayoutStack::OrientationNames::declareValues()
//
LLLayoutPanel::LLLayoutPanel(const Params& p)
: LLPanel(p),
+ mExpandedMinDimSpecified(false),
+ mExpandedMinDim(p.min_dim),
mMinDim(p.min_dim),
mMaxDim(p.max_dim),
mAutoResize(p.auto_resize),
@@ -58,6 +60,13 @@ LLLayoutPanel::LLLayoutPanel(const Params& p)
mVisibleAmt(1.f), // default to fully visible
mResizeBar(NULL)
{
+ // 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())
{
@@ -78,20 +87,20 @@ LLLayoutPanel::~LLLayoutPanel()
delete mResizeBar;
mResizeBar = NULL;
}
-
+
F32 LLLayoutPanel::getCollapseFactor(LLLayoutStack::ELayoutOrientation orientation)
{
if (orientation == LLLayoutStack::HORIZONTAL)
{
F32 collapse_amt =
- clamp_rescale(mCollapseAmt, 0.f, 1.f, 1.f, (F32)mMinDim / (F32)llmax(1, getRect().getWidth()));
+ clamp_rescale(mCollapseAmt, 0.f, 1.f, 1.f, (F32)getRelevantMinDim() / (F32)llmax(1, getRect().getWidth()));
return mVisibleAmt * collapse_amt;
}
else
{
- F32 collapse_amt =
- clamp_rescale(mCollapseAmt, 0.f, 1.f, 1.f, llmin(1.f, (F32)mMinDim / (F32)llmax(1, getRect().getHeight())));
- return mVisibleAmt * collapse_amt;
+ 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;
}
}
@@ -182,14 +191,14 @@ BOOL LLLayoutStack::postBuild()
}
bool LLLayoutStack::addChild(LLView* child, S32 tab_group)
- {
+{
LLLayoutPanel* panelp = dynamic_cast<LLLayoutPanel*>(child);
- if (panelp)
- {
+ if (panelp)
+ {
mPanels.push_back(panelp);
- }
+ }
return LLView::addChild(child, tab_group);
- }
+}
S32 LLLayoutStack::getDefaultHeight(S32 cur_height)
@@ -281,9 +290,9 @@ bool LLLayoutStack::getPanelMinSize(const std::string& panel_name, S32* min_dimp
{
LLLayoutPanel* panel = findEmbeddedPanelByName(panel_name);
- if (panel)
+ if (panel && min_dimp)
{
- if (min_dimp) *min_dimp = panel->mMinDim;
+ *min_dimp = panel->getRelevantMinDim();
}
return NULL != panel;
@@ -316,23 +325,23 @@ void LLLayoutStack::updateLayout(BOOL force_resize)
e_panel_list_t::iterator panel_it;
for (panel_it = mPanels.begin(); panel_it != mPanels.end(); ++panel_it)
{
- LLPanel* panelp = (*panel_it);
+ LLLayoutPanel* panelp = (*panel_it);
if (panelp->getVisible())
{
if (mAnimate)
{
if (!mAnimatedThisFrame)
{
- (*panel_it)->mVisibleAmt = lerp((*panel_it)->mVisibleAmt, 1.f, LLCriticalDamp::getInterpolant(mOpenTimeConstant));
- if ((*panel_it)->mVisibleAmt > 0.99f)
+ panelp->mVisibleAmt = lerp(panelp->mVisibleAmt, 1.f, LLCriticalDamp::getInterpolant(mOpenTimeConstant));
+ if (panelp->mVisibleAmt > 0.99f)
{
- (*panel_it)->mVisibleAmt = 1.f;
+ panelp->mVisibleAmt = 1.f;
}
}
}
else
{
- (*panel_it)->mVisibleAmt = 1.f;
+ panelp->mVisibleAmt = 1.f;
}
}
else // not visible
@@ -341,36 +350,36 @@ void LLLayoutStack::updateLayout(BOOL force_resize)
{
if (!mAnimatedThisFrame)
{
- (*panel_it)->mVisibleAmt = lerp((*panel_it)->mVisibleAmt, 0.f, LLCriticalDamp::getInterpolant(mCloseTimeConstant));
- if ((*panel_it)->mVisibleAmt < 0.001f)
+ panelp->mVisibleAmt = lerp(panelp->mVisibleAmt, 0.f, LLCriticalDamp::getInterpolant(mCloseTimeConstant));
+ if (panelp->mVisibleAmt < 0.001f)
{
- (*panel_it)->mVisibleAmt = 0.f;
+ panelp->mVisibleAmt = 0.f;
}
}
}
else
{
- (*panel_it)->mVisibleAmt = 0.f;
+ panelp->mVisibleAmt = 0.f;
}
}
- if ((*panel_it)->mCollapsed)
+ if (panelp->mCollapsed)
{
- (*panel_it)->mCollapseAmt = lerp((*panel_it)->mCollapseAmt, 1.f, LLCriticalDamp::getInterpolant(mCloseTimeConstant));
+ panelp->mCollapseAmt = lerp(panelp->mCollapseAmt, 1.f, LLCriticalDamp::getInterpolant(mCloseTimeConstant));
}
else
{
- (*panel_it)->mCollapseAmt = lerp((*panel_it)->mCollapseAmt, 0.f, LLCriticalDamp::getInterpolant(mCloseTimeConstant));
+ panelp->mCollapseAmt = lerp(panelp->mCollapseAmt, 0.f, LLCriticalDamp::getInterpolant(mCloseTimeConstant));
}
if (mOrientation == HORIZONTAL)
{
// enforce minimize size constraint by default
- if (panelp->getRect().getWidth() < (*panel_it)->mMinDim)
+ if (panelp->getRect().getWidth() < panelp->getRelevantMinDim())
{
- panelp->reshape((*panel_it)->mMinDim, panelp->getRect().getHeight());
+ panelp->reshape(panelp->getRelevantMinDim(), panelp->getRect().getHeight());
}
- total_width += llround(panelp->getRect().getWidth() * (*panel_it)->getCollapseFactor(mOrientation));
+ total_width += llround(panelp->getRect().getWidth() * panelp->getCollapseFactor(mOrientation));
// want n-1 panel gaps for n panels
if (panel_it != mPanels.begin())
{
@@ -380,11 +389,11 @@ void LLLayoutStack::updateLayout(BOOL force_resize)
else //VERTICAL
{
// enforce minimize size constraint by default
- if (panelp->getRect().getHeight() < (*panel_it)->mMinDim)
+ if (panelp->getRect().getHeight() < panelp->getRelevantMinDim())
{
- panelp->reshape(panelp->getRect().getWidth(), (*panel_it)->mMinDim);
+ panelp->reshape(panelp->getRect().getWidth(), panelp->getRelevantMinDim());
}
- total_height += llround(panelp->getRect().getHeight() * (*panel_it)->getCollapseFactor(mOrientation));
+ total_height += llround(panelp->getRect().getHeight() * panelp->getCollapseFactor(mOrientation));
if (panel_it != mPanels.begin())
{
total_height += mPanelSpacing;
@@ -403,34 +412,23 @@ void LLLayoutStack::updateLayout(BOOL force_resize)
continue;
}
+ 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 (mOrientation == HORIZONTAL)
- {
- shrink_headroom_total += (*panel_it)->getRect().getWidth() - (*panel_it)->mMinDim;
- }
- else //VERTICAL
- {
- shrink_headroom_total += (*panel_it)->getRect().getHeight() - (*panel_it)->mMinDim;
- }
+ shrink_headroom_total += relevant_dimension - relevant_min;
}
else
{
num_resizable_panels++;
- if (mOrientation == HORIZONTAL)
- {
- shrink_headroom_available += (*panel_it)->getRect().getWidth() - (*panel_it)->mMinDim;
- shrink_headroom_total += (*panel_it)->getRect().getWidth() - (*panel_it)->mMinDim;
- }
- else //VERTICAL
- {
- shrink_headroom_available += (*panel_it)->getRect().getHeight() - (*panel_it)->mMinDim;
- shrink_headroom_total += (*panel_it)->getRect().getHeight() - (*panel_it)->mMinDim;
- }
+
+ shrink_headroom_available += relevant_dimension - relevant_min;
+ shrink_headroom_total += relevant_dimension - relevant_min;
}
}
@@ -452,27 +450,28 @@ void LLLayoutStack::updateLayout(BOOL force_resize)
for (panel_it = mPanels.begin(); panel_it != mPanels.end(); ++panel_it)
{
- LLPanel* panelp = (*panel_it);
+ LLLayoutPanel* panelp = (*panel_it);
S32 cur_width = panelp->getRect().getWidth();
S32 cur_height = panelp->getRect().getHeight();
S32 new_width = cur_width;
- S32 new_height = cur_height;
+ S32 new_height = cur_height;
+ S32 relevant_min = panelp->getRelevantMinDim();
if (mOrientation == HORIZONTAL)
{
- new_width = llmax((*panel_it)->mMinDim, new_width);
+ new_width = llmax(relevant_min, new_width);
}
else
{
- new_height = llmax((*panel_it)->mMinDim, new_height);
+ new_height = llmax(relevant_min, new_height);
}
S32 delta_size = 0;
// if panel can automatically resize (not animating, and resize flag set)...
- if ((*panel_it)->getCollapseFactor(mOrientation) == 1.f
- && (force_resize || (*panel_it)->mAutoResize)
- && !(*panel_it)->mResizeBar->hasMouseCapture())
+ if (panelp->getCollapseFactor(mOrientation) == 1.f
+ && (force_resize || panelp->mAutoResize)
+ && !panelp->mResizeBar->hasMouseCapture())
{
if (mOrientation == HORIZONTAL)
{
@@ -481,8 +480,8 @@ void LLLayoutStack::updateLayout(BOOL force_resize)
{
// 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 - (*panel_it)->mMinDim) / (F32)shrink_headroom_available)) : 0;
- shrink_headroom_available -= (cur_width - (*panel_it)->mMinDim);
+ 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
{
@@ -491,7 +490,7 @@ void LLLayoutStack::updateLayout(BOOL force_resize)
num_resizable_panels--;
}
pixels_to_distribute -= delta_size;
- new_width = llmax((*panel_it)->mMinDim, cur_width + delta_size);
+ new_width = llmax(relevant_min, cur_width + delta_size);
}
else
{
@@ -504,8 +503,8 @@ void LLLayoutStack::updateLayout(BOOL force_resize)
{
// 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 - (*panel_it)->mMinDim) / (F32)shrink_headroom_available)) : 0;
- shrink_headroom_available -= (cur_height - (*panel_it)->mMinDim);
+ 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);
}
else
{
@@ -513,7 +512,7 @@ void LLLayoutStack::updateLayout(BOOL force_resize)
num_resizable_panels--;
}
pixels_to_distribute -= delta_size;
- new_height = llmax((*panel_it)->mMinDim, cur_height + delta_size);
+ new_height = llmax(relevant_min, cur_height + delta_size);
}
else
{
@@ -566,19 +565,20 @@ void LLLayoutStack::updateLayout(BOOL force_resize)
LLLayoutPanel* last_resizeable_panel = NULL;
for (panel_it = mPanels.begin(); panel_it != mPanels.end(); ++panel_it)
{
- LLPanel* panelp = (*panel_it);
+ LLLayoutPanel* panelp = (*panel_it);
+ S32 relevant_min = panelp->getRelevantMinDim();
if (mOrientation == HORIZONTAL)
{
(*panel_it)->mResizeBar->setResizeLimits(
- (*panel_it)->mMinDim,
- (*panel_it)->mMinDim + shrink_headroom_total);
+ relevant_min,
+ relevant_min + shrink_headroom_total);
}
else //VERTICAL
{
(*panel_it)->mResizeBar->setResizeLimits(
- (*panel_it)->mMinDim,
- (*panel_it)->mMinDim + shrink_headroom_total);
+ relevant_min,
+ relevant_min + shrink_headroom_total);
}
// toggle resize bars based on panel visibility, resizability, etc
@@ -658,7 +658,7 @@ void LLLayoutStack::calcMinExtents()
{
if (mOrientation == HORIZONTAL)
{
- mMinWidth += (*panel_it)->mMinDim;
+ mMinWidth += (*panel_it)->getRelevantMinDim();
if (panel_it != mPanels.begin())
{
mMinWidth += mPanelSpacing;
@@ -666,7 +666,7 @@ void LLLayoutStack::calcMinExtents()
}
else //VERTICAL
{
- mMinHeight += (*panel_it)->mMinDim;
+ mMinHeight += (*panel_it)->getRelevantMinDim();
if (panel_it != mPanels.begin())
{
mMinHeight += mPanelSpacing;
@@ -688,7 +688,7 @@ void LLLayoutStack::createResizeBars()
LLResizeBar::Params resize_params;
resize_params.name("resize");
resize_params.resizing_view(lp);
- resize_params.min_size(lp->mMinDim);
+ resize_params.min_size(lp->getRelevantMinDim());
resize_params.side(side);
resize_params.snapping_enabled(false);
LLResizeBar* resize_bar = LLUICtrlFactory::create<LLResizeBar>(resize_params);
diff --git a/indra/llui/lllayoutstack.h b/indra/llui/lllayoutstack.h
index 4ac8ef0ee9..d8ef0aeaca 100644
--- a/indra/llui/lllayoutstack.h
+++ b/indra/llui/lllayoutstack.h
@@ -30,10 +30,10 @@
#include "llpanel.h"
-class LLPanel;
class LLLayoutPanel;
+
class LLLayoutStack : public LLView, public LLInstanceTracker<LLLayoutStack>
{
public:
@@ -149,6 +149,7 @@ private:
F32 mCloseTimeConstant;
}; // end class LLLayoutStack
+
class LLLayoutPanel : public LLPanel
{
friend class LLLayoutStack;
@@ -156,13 +157,15 @@ friend class LLUICtrlFactory;
public:
struct Params : public LLInitParam::Block<Params, LLPanel::Params>
{
- Optional<S32> min_dim,
+ Optional<S32> expanded_min_dim,
+ min_dim,
max_dim;
Optional<bool> user_resize,
auto_resize;
Params()
- : min_dim("min_dim", 0),
+ : 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)
@@ -177,15 +180,36 @@ public:
~LLLayoutPanel();
void initFromParams(const Params& p);
- void setMinDim(S32 value) { mMinDim = value; }
+
+ S32 getMinDim() const { return mMinDim; }
+ void setMinDim(S32 value) { mMinDim = value; if (!mExpandedMinDimSpecified) mExpandedMinDim = value; }
+
+ S32 getMaxDim() const { return mMaxDim; }
void setMaxDim(S32 value) { mMaxDim = value; }
-protected:
- LLLayoutPanel(const Params& p) ;
+ S32 getExpandedMinDim() const { return mExpandedMinDim; }
+ void setExpandedMinDim(S32 value) { mExpandedMinDim = value; mExpandedMinDimSpecified = true; }
+
+ S32 getRelevantMinDim() const
+ {
+ S32 min_dim = mMinDim;
+
+ if (!mCollapsed)
+ {
+ min_dim = mExpandedMinDim;
+ }
+
+ return min_dim;
+ }
+protected:
+ LLLayoutPanel(const Params& p);
F32 getCollapseFactor(LLLayoutStack::ELayoutOrientation orientation);
+ bool mExpandedMinDimSpecified;
+ S32 mExpandedMinDim;
+
S32 mMinDim;
S32 mMaxDim;
BOOL mAutoResize;
diff --git a/indra/llui/lllineeditor.cpp b/indra/llui/lllineeditor.cpp
index 0196080d90..06fbc0f234 100644
--- a/indra/llui/lllineeditor.cpp
+++ b/indra/llui/lllineeditor.cpp
@@ -37,6 +37,7 @@
#include "llgl.h"
#include "lltimer.h"
+#include "llcalc.h"
//#include "llclipboard.h"
#include "llcontrol.h"
#include "llbutton.h"
@@ -81,6 +82,7 @@ LLLineEditor::Params::Params()
: max_length(""),
keystroke_callback("keystroke_callback"),
prevalidate_callback("prevalidate_callback"),
+ prevalidate_input_callback("prevalidate_input_callback"),
background_image("background_image"),
background_image_disabled("background_image_disabled"),
background_image_focused("background_image_focused"),
@@ -132,6 +134,7 @@ LLLineEditor::LLLineEditor(const LLLineEditor::Params& p)
mIgnoreTab( p.ignore_tab ),
mDrawAsterixes( p.is_password ),
mSelectAllonFocusReceived( p.select_on_focus ),
+ mSelectAllonCommit( TRUE ),
mPassDelete(FALSE),
mReadOnly(FALSE),
mBgImage( p.background_image ),
@@ -173,6 +176,7 @@ LLLineEditor::LLLineEditor(const LLLineEditor::Params& p)
updateTextPadding();
setCursor(mText.length());
+ setPrevalidateInput(p.prevalidate_input_callback());
setPrevalidate(p.prevalidate_callback());
LLContextMenu* menu = LLUICtrlFactory::instance().createFromFile<LLContextMenu>
@@ -228,7 +232,10 @@ void LLLineEditor::onCommit()
setControlValue(getValue());
LLUICtrl::onCommit();
- selectAll();
+
+ // Selection on commit needs to be turned off when evaluating maths
+ // expressions, to allow indication of the error position
+ if (mSelectAllonCommit) selectAll();
}
// Returns TRUE if user changed value at all
@@ -405,23 +412,15 @@ void LLLineEditor::setText(const LLStringExplicit &new_text)
// Picks a new cursor position based on the actual screen size of text being drawn.
void LLLineEditor::setCursorAtLocalPos( S32 local_mouse_x )
{
- const llwchar* wtext = mText.getWString().c_str();
- LLWString asterix_text;
- if (mDrawAsterixes)
- {
- for (S32 i = 0; i < mText.length(); i++)
- {
- asterix_text += utf8str_to_wstring(PASSWORD_ASTERISK);
- }
- wtext = asterix_text.c_str();
- }
+ S32 cursor_pos = calcCursorPos(local_mouse_x);
+
+ S32 left_pos = llmin( mSelectionStart, cursor_pos );
+ S32 length = llabs( mSelectionStart - cursor_pos );
+ const LLWString& substr = mText.getWString().substr(left_pos, length);
+
+ if (mIsSelecting && !prevalidateInput(substr))
+ return;
- S32 cursor_pos =
- mScrollHPos +
- mGLFont->charFromPixelOffset(
- wtext, mScrollHPos,
- (F32)(local_mouse_x - mTextLeftEdge),
- (F32)(mTextRightEdge - mTextLeftEdge + 1)); // min-max range is inclusive
setCursor(cursor_pos);
}
@@ -505,6 +504,11 @@ BOOL LLLineEditor::canSelectAll() const
void LLLineEditor::selectAll()
{
+ if (!prevalidateInput(mText.getWString()))
+ {
+ return;
+ }
+
mSelectionStart = mText.length();
mSelectionEnd = 0;
setCursor(mSelectionEnd);
@@ -590,6 +594,9 @@ BOOL LLLineEditor::handleMouseDown(S32 x, S32 y, MASK mask)
if (mask & MASK_SHIFT)
{
+ // assume we're starting a drag select
+ mIsSelecting = TRUE;
+
// Handle selection extension
S32 old_cursor_pos = getCursor();
setCursorAtLocalPos(x);
@@ -624,8 +631,6 @@ BOOL LLLineEditor::handleMouseDown(S32 x, S32 y, MASK mask)
mSelectionStart = old_cursor_pos;
mSelectionEnd = getCursor();
}
- // assume we're starting a drag select
- mIsSelecting = TRUE;
}
else
{
@@ -796,6 +801,9 @@ void LLLineEditor::removeChar()
{
if( getCursor() > 0 )
{
+ if (!prevalidateInput(mText.getWString().substr(getCursor()-1, 1)))
+ return;
+
mText.erase(getCursor() - 1, 1);
setCursor(getCursor() - 1);
@@ -816,6 +824,9 @@ void LLLineEditor::addChar(const llwchar uni_char)
}
else if (LL_KIM_OVERWRITE == gKeyboard->getInsertMode())
{
+ if (!prevalidateInput(mText.getWString().substr(getCursor(), 1)))
+ return;
+
mText.erase(getCursor(), 1);
}
@@ -864,6 +875,13 @@ void LLLineEditor::extendSelection( S32 new_cursor_pos )
startSelection();
}
+ S32 left_pos = llmin( mSelectionStart, new_cursor_pos );
+ S32 selection_length = llabs( mSelectionStart - new_cursor_pos );
+ const LLWString& selection = mText.getWString().substr(left_pos, selection_length);
+
+ if (!prevalidateInput(selection))
+ return;
+
setCursor(new_cursor_pos);
mSelectionEnd = getCursor();
}
@@ -994,8 +1012,12 @@ void LLLineEditor::deleteSelection()
{
if( !mReadOnly && hasSelection() )
{
- S32 left_pos = llmin( mSelectionStart, mSelectionEnd );
- S32 selection_length = llabs( mSelectionStart - mSelectionEnd );
+ S32 left_pos, selection_length;
+ getSelectionRange(&left_pos, &selection_length);
+ const LLWString& selection = mText.getWString().substr(left_pos, selection_length);
+
+ if (!prevalidateInput(selection))
+ return;
mText.erase(left_pos, selection_length);
deselect();
@@ -1013,12 +1035,16 @@ void LLLineEditor::cut()
{
if( canCut() )
{
+ S32 left_pos, length;
+ getSelectionRange(&left_pos, &length);
+ const LLWString& selection = mText.getWString().substr(left_pos, length);
+
+ if (!prevalidateInput(selection))
+ return;
+
// Prepare for possible rollback
LLLineEditorRollback rollback( this );
-
- S32 left_pos = llmin( mSelectionStart, mSelectionEnd );
- S32 length = llabs( mSelectionStart - mSelectionEnd );
gClipboard.copyFromSubstring( mText.getWString(), left_pos, length );
deleteSelection();
@@ -1098,6 +1124,9 @@ void LLLineEditor::pasteHelper(bool is_primary)
if (!paste.empty())
{
+ if (!prevalidateInput(paste))
+ return;
+
// Prepare for possible rollback
LLLineEditorRollback rollback(this);
@@ -1445,6 +1474,13 @@ BOOL LLLineEditor::handleUnicodeCharHere(llwchar uni_char)
LLLineEditorRollback rollback( this );
+ {
+ LLWString u_char;
+ u_char.assign(1, uni_char);
+ if (!prevalidateInput(u_char))
+ return handled;
+ }
+
addChar(uni_char);
mKeystrokeTimer.reset();
@@ -1496,6 +1532,15 @@ void LLLineEditor::doDelete()
}
else if ( getCursor() < mText.length())
{
+ const LLWString& text_to_delete = mText.getWString().substr(getCursor(), 1);
+
+ if (!prevalidateInput(text_to_delete))
+ {
+ if( mKeystrokeCallback )
+ mKeystrokeCallback( this );
+
+ return;
+ }
setCursor(getCursor() + 1);
removeChar();
}
@@ -1843,6 +1888,27 @@ S32 LLLineEditor::findPixelNearestPos(const S32 cursor_offset) const
return result;
}
+S32 LLLineEditor::calcCursorPos(S32 mouse_x)
+{
+ const llwchar* wtext = mText.getWString().c_str();
+ LLWString asterix_text;
+ if (mDrawAsterixes)
+ {
+ for (S32 i = 0; i < mText.length(); i++)
+ {
+ asterix_text += utf8str_to_wstring(PASSWORD_ASTERISK);
+ }
+ wtext = asterix_text.c_str();
+ }
+
+ S32 cur_pos = mScrollHPos +
+ mGLFont->charFromPixelOffset(
+ wtext, mScrollHPos,
+ (F32)(mouse_x - mTextLeftEdge),
+ (F32)(mTextRightEdge - mTextLeftEdge + 1)); // min-max range is inclusive
+
+ return cur_pos;
+}
//virtual
void LLLineEditor::clear()
{
@@ -1936,6 +2002,22 @@ void LLLineEditor::setPrevalidate(LLTextValidate::validate_func_t func)
updateAllowingLanguageInput();
}
+void LLLineEditor::setPrevalidateInput(LLTextValidate::validate_func_t func)
+{
+ mPrevalidateInputFunc = func;
+ updateAllowingLanguageInput();
+}
+
+bool LLLineEditor::prevalidateInput(const LLWString& wstr)
+{
+ if (mPrevalidateInputFunc && !mPrevalidateInputFunc(wstr))
+ {
+ return false;
+ }
+
+ return true;
+}
+
// static
BOOL LLLineEditor::postvalidateFloat(const std::string &str)
{
@@ -1995,6 +2077,32 @@ BOOL LLLineEditor::postvalidateFloat(const std::string &str)
return success;
}
+BOOL LLLineEditor::evaluateFloat()
+{
+ bool success;
+ F32 result = 0.f;
+ std::string expr = getText();
+ LLStringUtil::toUpper(expr);
+
+ success = LLCalc::getInstance()->evalString(expr, result);
+
+ if (!success)
+ {
+ // Move the cursor to near the error on failure
+ setCursor(LLCalc::getInstance()->getLastErrorPos());
+ // *TODO: Translated error message indicating the type of error? Select error text?
+ }
+ else
+ {
+ // Replace the expression with the result
+ std::string result_str = llformat("%f",result);
+ setText(result_str);
+ selectAll();
+ }
+
+ return success;
+}
+
void LLLineEditor::onMouseCaptureLost()
{
endSelection();
diff --git a/indra/llui/lllineeditor.h b/indra/llui/lllineeditor.h
index fe191e5971..583bde360a 100644
--- a/indra/llui/lllineeditor.h
+++ b/indra/llui/lllineeditor.h
@@ -76,6 +76,7 @@ public:
Optional<keystroke_callback_t> keystroke_callback;
Optional<LLTextValidate::validate_func_t, LLTextValidate::ValidateTextNamedFuncs> prevalidate_callback;
+ Optional<LLTextValidate::validate_func_t, LLTextValidate::ValidateTextNamedFuncs> prevalidate_input_callback;
Optional<LLViewBorder::Params> border;
@@ -220,6 +221,7 @@ public:
void deleteSelection();
void setSelectAllonFocusReceived(BOOL b);
+ void setSelectAllonCommit(BOOL b) { mSelectAllonCommit = b; }
typedef boost::function<void (LLLineEditor* caller, void* user_data)> callback_t;
void setKeystrokeCallback(callback_t callback, void* user_data);
@@ -232,8 +234,16 @@ public:
// Prevalidation controls which keystrokes can affect the editor
void setPrevalidate( LLTextValidate::validate_func_t func );
+ // This method sets callback that prevents from:
+ // - deleting, selecting, typing, cutting, pasting characters that are not valid.
+ // Also callback that this method sets differs from setPrevalidate in a way that it validates just inputed
+ // symbols, before existing text is modified, but setPrevalidate validates line after it was modified.
+ void setPrevalidateInput(LLTextValidate::validate_func_t func);
static BOOL postvalidateFloat(const std::string &str);
+ bool prevalidateInput(const LLWString& wstr);
+ BOOL evaluateFloat();
+
// line history support:
void setEnableLineHistory( BOOL enabled ) { mHaveHistory = enabled; } // switches line history on or off
void updateHistory(); // stores current line in history
@@ -251,6 +261,7 @@ private:
void addChar(const llwchar c);
void setCursorAtLocalPos(S32 local_mouse_x);
S32 findPixelNearestPos(S32 cursor_offset = 0) const;
+ S32 calcCursorPos(S32 mouse_x);
BOOL handleSpecialKey(KEY key, MASK mask);
BOOL handleSelectionKey(KEY key, MASK mask);
BOOL handleControlKey(KEY key, MASK mask);
@@ -312,6 +323,7 @@ protected:
S32 mLastSelectionEnd;
LLTextValidate::validate_func_t mPrevalidateFunc;
+ LLTextValidate::validate_func_t mPrevalidateInputFunc;
LLFrameTimer mKeystrokeTimer;
LLTimer mTripleClickTimer;
@@ -330,6 +342,7 @@ protected:
BOOL mDrawAsterixes;
BOOL mSelectAllonFocusReceived;
+ BOOL mSelectAllonCommit;
BOOL mPassDelete;
BOOL mReadOnly;
diff --git a/indra/llui/llloadingindicator.h b/indra/llui/llloadingindicator.h
index 4c47cc267c..7c44478848 100644
--- a/indra/llui/llloadingindicator.h
+++ b/indra/llui/llloadingindicator.h
@@ -86,6 +86,8 @@ public:
*/
void start();
+ void reset() { mCurImageIdx = 0; }
+
private:
LLLoadingIndicator(const Params&);
void initFromParams(const Params&);
diff --git a/indra/llui/llmultislider.cpp b/indra/llui/llmultislider.cpp
index f744e9db41..9052bc7d1d 100644
--- a/indra/llui/llmultislider.cpp
+++ b/indra/llui/llmultislider.cpp
@@ -511,7 +511,7 @@ void LLMultiSlider::draw()
mIt->second.mTop + extra_triangle_height,
mIt->second.mLeft + mIt->second.getWidth() / 2,
mIt->second.mBottom - extra_triangle_height,
- mTriangleColor.get(), TRUE);
+ mTriangleColor.get() % opacity, TRUE);
}
}
else if (!thumb_imagep)
diff --git a/indra/llui/llnotifications.cpp b/indra/llui/llnotifications.cpp
index bdac125eb0..6085c61f9a 100644
--- a/indra/llui/llnotifications.cpp
+++ b/indra/llui/llnotifications.cpp
@@ -1532,7 +1532,7 @@ bool LLNotifications::loadVisibilityRules()
// Add a simple notification (from XUI)
void LLNotifications::addFromCallback(const LLSD& name)
{
- add(LLNotification::Params().name(name.asString()));
+ add(name.asString(), LLSD(), LLSD());
}
LLNotificationPtr LLNotifications::add(const std::string& name,
diff --git a/indra/llui/llpanel.cpp b/indra/llui/llpanel.cpp
index b2383106a8..1dcdd79efa 100644
--- a/indra/llui/llpanel.cpp
+++ b/indra/llui/llpanel.cpp
@@ -87,7 +87,8 @@ LLPanel::Params::Params()
filename("filename"),
class_name("class"),
help_topic("help_topic"),
- visible_callback("visible_callback")
+ visible_callback("visible_callback"),
+ accepts_badge("accepts_badge")
{
name = "panel";
addSynonym(background_visible, "bg_visible");
@@ -113,7 +114,8 @@ LLPanel::LLPanel(const LLPanel::Params& p)
mCommitCallbackRegistrar(false),
mEnableCallbackRegistrar(false),
mXMLFilename(p.filename),
- mVisibleSignal(NULL)
+ mVisibleSignal(NULL),
+ mAcceptsBadge(p.accepts_badge)
// *NOTE: Be sure to also change LLPanel::initFromParams(). We have too
// many classes derived from LLPanel to retrofit them all to pass in params.
{
@@ -485,6 +487,8 @@ void LLPanel::initFromParams(const LLPanel::Params& p)
mBgAlphaImage = p.bg_alpha_image();
mBgOpaqueImageOverlay = p.bg_opaque_image_overlay;
mBgAlphaImageOverlay = p.bg_alpha_image_overlay;
+
+ mAcceptsBadge = p.accepts_badge;
}
static LLFastTimer::DeclareTimer FTM_PANEL_SETUP("Panel Setup");
diff --git a/indra/llui/llpanel.h b/indra/llui/llpanel.h
index 7bbbeaf709..67674fab7e 100644
--- a/indra/llui/llpanel.h
+++ b/indra/llui/llpanel.h
@@ -89,6 +89,8 @@ public:
Multiple<LocalizedString> strings;
Optional<CommitCallbackParam> visible_callback;
+
+ Optional<bool> accepts_badge;
Params();
};
@@ -250,6 +252,8 @@ public:
boost::signals2::connection setVisibleCallback( const commit_signal_t::slot_type& cb );
+ bool acceptsBadge() const { return mAcceptsBadge; }
+
protected:
// Override to set not found list
LLButton* getDefaultButton() { return mDefaultBtn; }
@@ -264,6 +268,7 @@ protected:
static factory_stack_t sFactoryStack;
private:
+ bool mAcceptsBadge;
BOOL mBgVisible; // any background at all?
BOOL mBgOpaque; // use opaque color or image
LLUIColor mBgOpaqueColor;
diff --git a/indra/llui/llresmgr.cpp b/indra/llui/llresmgr.cpp
index 39385786bc..820e7cb26a 100644
--- a/indra/llui/llresmgr.cpp
+++ b/indra/llui/llresmgr.cpp
@@ -337,7 +337,7 @@ LLLocale::LLLocale(const std::string& locale_string)
char* new_locale_string = setlocale( LC_ALL, locale_string.c_str());
if ( new_locale_string == NULL)
{
- llwarns << "Failed to set locale " << locale_string << llendl;
+ LL_WARNS_ONCE("LLLocale") << "Failed to set locale " << locale_string << LL_ENDL;
setlocale(LC_ALL, SYSTEM_LOCALE.c_str());
}
//else
diff --git a/indra/llui/llspinctrl.cpp b/indra/llui/llspinctrl.cpp
index 6b4e9cf923..934879cdfd 100644
--- a/indra/llui/llspinctrl.cpp
+++ b/indra/llui/llspinctrl.cpp
@@ -44,7 +44,7 @@
#include "llresmgr.h"
#include "lluictrlfactory.h"
-const U32 MAX_STRING_LENGTH = 32;
+const U32 MAX_STRING_LENGTH = 255;
static LLDefaultChildRegistry::Register<LLSpinCtrl> r2("spinner");
@@ -52,6 +52,7 @@ LLSpinCtrl::Params::Params()
: label_width("label_width"),
decimal_digits("decimal_digits"),
allow_text_entry("allow_text_entry", true),
+ label_wrap("label_wrap", false),
text_enabled_color("text_enabled_color"),
text_disabled_color("text_disabled_color"),
up_button("up_button"),
@@ -80,6 +81,7 @@ LLSpinCtrl::LLSpinCtrl(const LLSpinCtrl::Params& p)
{
LLRect label_rect( 0, centered_top, label_width, centered_bottom );
LLTextBox::Params params;
+ params.wrap(p.label_wrap);
params.name("SpinCtrl Label");
params.rect(label_rect);
params.initial_value(p.label());
@@ -122,14 +124,7 @@ LLSpinCtrl::LLSpinCtrl(const LLSpinCtrl::Params& p)
params.max_length.bytes(MAX_STRING_LENGTH);
params.commit_callback.function((boost::bind(&LLSpinCtrl::onEditorCommit, this, _2)));
- if( mPrecision>0 )//should accept float numbers
- {
- params.prevalidate_callback(&LLTextValidate::validateFloat);
- }
- else //should accept int numbers
- {
- params.prevalidate_callback(&LLTextValidate::validateInt);
- }
+ //*NOTE: allow entering of any chars for LLCalc, proper input will be evaluated on commit
params.follows.flags(FOLLOWS_LEFT | FOLLOWS_BOTTOM);
mEditor = LLUICtrlFactory::create<LLLineEditor> (params);
@@ -138,6 +133,7 @@ LLSpinCtrl::LLSpinCtrl(const LLSpinCtrl::Params& p)
// than when it doesn't. Instead, if you always have to double click to select all the text,
// it's easier to understand
//mEditor->setSelectAllonFocusReceived(TRUE);
+ mEditor->setSelectAllonCommit(FALSE);
addChild(mEditor);
updateEditor();
@@ -302,9 +298,10 @@ void LLSpinCtrl::onEditorCommit( const LLSD& data )
{
BOOL success = FALSE;
- std::string text = mEditor->getText();
- if( LLLineEditor::postvalidateFloat( text ) )
+ if( mEditor->evaluateFloat() )
{
+ std::string text = mEditor->getText();
+
LLLocale locale(LLLocale::USER_LOCALE);
F32 val = (F32) atof(text.c_str());
@@ -325,7 +322,11 @@ void LLSpinCtrl::onEditorCommit( const LLSD& data )
}
updateEditor();
- if( !success )
+ if( success )
+ {
+ updateEditor();
+ }
+ else
{
reportInvalidData();
}
diff --git a/indra/llui/llspinctrl.h b/indra/llui/llspinctrl.h
index 8960971594..d197084e38 100644
--- a/indra/llui/llspinctrl.h
+++ b/indra/llui/llspinctrl.h
@@ -44,6 +44,7 @@ public:
Optional<S32> label_width;
Optional<U32> decimal_digits;
Optional<bool> allow_text_entry;
+ Optional<bool> label_wrap;
Optional<LLUIColor> text_enabled_color;
Optional<LLUIColor> text_disabled_color;
diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp
index 1cc3cc04d6..349dbc3405 100644
--- a/indra/llui/lltextbase.cpp
+++ b/indra/llui/lltextbase.cpp
@@ -280,7 +280,7 @@ bool LLTextBase::truncate()
if (getLength() >= S32(mMaxTextByteLength / 4))
{
// Have to check actual byte size
- LLWString text(getWText());
+ LLWString text(getWText());
S32 utf8_byte_size = wstring_utf8_length(text);
if ( utf8_byte_size > mMaxTextByteLength )
{
@@ -547,8 +547,7 @@ void LLTextBase::drawText()
}
LLRect text_rect(line.mRect);
- text_rect.mRight = llmin(mDocumentView->getRect().getWidth(), text_rect.mRight); // clamp right edge to document extents
- text_rect.translate(mVisibleTextRect.mLeft, mVisibleTextRect.mBottom); // translate into display region of text widget
+ text_rect.mRight = mDocumentView->getRect().getWidth(); // clamp right edge to document extents
text_rect.translate(mDocumentView->getRect().mLeft, mDocumentView->getRect().mBottom); // adjust by scroll position
// draw a single line of text
@@ -655,7 +654,7 @@ S32 LLTextBase::insertStringNoUndo(S32 pos, const LLWString &wstr, LLTextBase::s
}
text.insert(pos, wstr);
- getViewModel()->setDisplay(text);
+ getViewModel()->setDisplay(text);
if ( truncate() )
{
@@ -670,7 +669,7 @@ S32 LLTextBase::insertStringNoUndo(S32 pos, const LLWString &wstr, LLTextBase::s
S32 LLTextBase::removeStringNoUndo(S32 pos, S32 length)
{
- LLWString text(getWText());
+ LLWString text(getWText());
segment_set_t::iterator seg_iter = getSegIterContaining(pos);
while(seg_iter != mSegments.end())
{
@@ -717,7 +716,7 @@ S32 LLTextBase::removeStringNoUndo(S32 pos, S32 length)
}
text.erase(pos, length);
- getViewModel()->setDisplay(text);
+ getViewModel()->setDisplay(text);
// recreate default segment in case we erased everything
createDefaultSegment();
@@ -734,9 +733,9 @@ S32 LLTextBase::overwriteCharNoUndo(S32 pos, llwchar wc)
{
return 0;
}
- LLWString text(getWText());
+ LLWString text(getWText());
text[pos] = wc;
- getViewModel()->setDisplay(text);
+ getViewModel()->setDisplay(text);
onValueChange(pos, pos + 1);
needsReflow(pos);
@@ -857,7 +856,7 @@ BOOL LLTextBase::handleMouseUp(S32 x, S32 y, MASK mask)
// Did we just click on a link?
if (mURLClickSignal
&& cur_segment->getStyle()
- && cur_segment->getStyle()->isLink())
+ && cur_segment->getStyle()->isLink())
{
// *TODO: send URL here?
(*mURLClickSignal)(this, LLSD() );
@@ -1035,27 +1034,27 @@ void LLTextBase::draw()
gl_rect_2d(text_rect, bg_color % alpha, TRUE);
}
- bool should_clip = mClip || mScroller != NULL;
- { LLLocalClipRect clip(text_rect, should_clip);
+ bool should_clip = mClip || mScroller != NULL;
+ { LLLocalClipRect clip(text_rect, should_clip);
- // draw document view
- if (mScroller)
+ // draw document view
+ if (mScroller)
+ {
+ drawChild(mScroller);
+ }
+ else
{
- drawChild(mScroller);
- }
- else
- {
- drawChild(mDocumentView);
- }
+ drawChild(mDocumentView);
+ }
drawSelectionBackground();
drawText();
drawCursor();
}
- mDocumentView->setVisible(FALSE);
- LLUICtrl::draw();
- mDocumentView->setVisible(TRUE);
+ mDocumentView->setVisible(FALSE);
+ LLUICtrl::draw();
+ mDocumentView->setVisible(TRUE);
}
@@ -1119,8 +1118,7 @@ void LLTextBase::updateScrollFromCursor()
// scroll so that the cursor is at the top of the page
LLRect scroller_doc_window = getVisibleDocumentRect();
- LLRect cursor_rect_doc = getLocalRectFromDocIndex(mCursorPos);
- cursor_rect_doc.translate(scroller_doc_window.mLeft, scroller_doc_window.mBottom);
+ LLRect cursor_rect_doc = getDocRectFromDocIndex(mCursorPos);
mScroller->scrollToShowRect(cursor_rect_doc, LLRect(0, scroller_doc_window.getHeight() - 5, scroller_doc_window.getWidth(), 5));
}
@@ -1366,9 +1364,9 @@ S32 LLTextBase::getLineStart( S32 line ) const
{
S32 num_lines = getLineCount();
if (num_lines == 0)
- {
+ {
return 0;
- }
+ }
line = llclamp(line, 0, num_lines-1);
return mLineInfoList[line].mDocIndexStart;
@@ -1378,9 +1376,9 @@ S32 LLTextBase::getLineEnd( S32 line ) const
{
S32 num_lines = getLineCount();
if (num_lines == 0)
- {
+ {
return 0;
- }
+ }
line = llclamp(line, 0, num_lines-1);
return mLineInfoList[line].mDocIndexEnd;
@@ -1656,7 +1654,7 @@ void LLTextBase::appendTextImpl(const std::string &new_text, const LLStyle::Para
LLUrlMatch match;
std::string text = new_text;
while ( LLUrlRegistry::instance().findUrl(text, match,
- boost::bind(&LLTextBase::replaceUrl, this, _1, _2, _3)) )
+ boost::bind(&LLTextBase::replaceUrl, this, _1, _2, _3)) )
{
LLTextUtil::processUrlMatch(&match,this);
@@ -1949,7 +1947,7 @@ void LLTextBase::setWText(const LLWString& text)
const LLWString& LLTextBase::getWText() const
{
- return getViewModel()->getDisplay();
+ return getViewModel()->getDisplay();
}
// If round is true, if the position is on the right half of a character, the cursor
@@ -1960,9 +1958,12 @@ S32 LLTextBase::getDocIndexFromLocalCoord( S32 local_x, S32 local_y, BOOL round,
{
// Figure out which line we're nearest to.
LLRect visible_region = getVisibleDocumentRect();
+ LLRect doc_rect = mDocumentView->getRect();
+
+ S32 doc_y = local_y - doc_rect.mBottom;
// binary search for line that starts before local_y
- line_list_t::const_iterator line_iter = std::lower_bound(mLineInfoList.begin(), mLineInfoList.end(), local_y - mVisibleTextRect.mBottom + visible_region.mBottom, compare_bottom());
+ line_list_t::const_iterator line_iter = std::lower_bound(mLineInfoList.begin(), mLineInfoList.end(), doc_y, compare_bottom());
if (line_iter == mLineInfoList.end())
{
@@ -1970,7 +1971,7 @@ S32 LLTextBase::getDocIndexFromLocalCoord( S32 local_x, S32 local_y, BOOL round,
}
S32 pos = getLength();
- S32 start_x = mVisibleTextRect.mLeft + line_iter->mRect.mLeft - visible_region.mLeft;
+ S32 start_x = line_iter->mRect.mLeft + doc_rect.mLeft;
segment_set_t::iterator line_seg_iter;
S32 line_seg_offset;
@@ -1992,7 +1993,7 @@ S32 LLTextBase::getDocIndexFromLocalCoord( S32 local_x, S32 local_y, BOOL round,
}
// if we've reached a line of text *below* the mouse cursor, doc index is first character on that line
- if (hit_past_end_of_line && local_y - mVisibleTextRect.mBottom + visible_region.mBottom > line_iter->mRect.mTop)
+ if (hit_past_end_of_line && doc_y > line_iter->mRect.mTop)
{
pos = segment_line_start;
break;
@@ -2461,7 +2462,7 @@ LLRect LLTextBase::getVisibleDocumentRect() const
LLRect doc_rect = mDocumentView->getLocalRect();
doc_rect.mLeft -= mDocumentView->getRect().mLeft;
// adjust for height of text above widget baseline
- doc_rect.mBottom = llmin(0, doc_rect.getHeight() - mVisibleTextRect.getHeight());
+ doc_rect.mBottom = doc_rect.getHeight() - mVisibleTextRect.getHeight();
return doc_rect;
}
}
@@ -2575,21 +2576,21 @@ F32 LLNormalTextSegment::drawClippedSegment(S32 seg_start, S32 seg_end, S32 sele
LLColor4 color = (mEditor.getReadOnly() ? mStyle->getReadOnlyColor() : mStyle->getColor()) % alpha;
- if( selection_start > seg_start )
+ if( selection_start > seg_start )
{
// Draw normally
S32 start = seg_start;
S32 end = llmin( selection_start, seg_end );
S32 length = end - start;
font->render(text, start,
- rect,
- color,
- LLFontGL::LEFT, mEditor.mVAlign,
- LLFontGL::NORMAL,
- mStyle->getShadowType(),
- length,
- &right_x,
- mEditor.getUseEllipses());
+ rect,
+ color,
+ LLFontGL::LEFT, mEditor.mVAlign,
+ LLFontGL::NORMAL,
+ mStyle->getShadowType(),
+ length,
+ &right_x,
+ mEditor.getUseEllipses());
}
rect.mLeft = (S32)ceil(right_x);
@@ -2601,14 +2602,14 @@ F32 LLNormalTextSegment::drawClippedSegment(S32 seg_start, S32 seg_end, S32 sele
S32 length = end - start;
font->render(text, start,
- rect,
- mStyle->getSelectedColor().get(),
- LLFontGL::LEFT, mEditor.mVAlign,
- LLFontGL::NORMAL,
- LLFontGL::NO_SHADOW,
- length,
- &right_x,
- mEditor.getUseEllipses());
+ rect,
+ mStyle->getSelectedColor().get(),
+ LLFontGL::LEFT, mEditor.mVAlign,
+ LLFontGL::NORMAL,
+ LLFontGL::NO_SHADOW,
+ length,
+ &right_x,
+ mEditor.getUseEllipses());
}
rect.mLeft = (S32)ceil(right_x);
if( selection_end < seg_end )
@@ -2618,14 +2619,14 @@ F32 LLNormalTextSegment::drawClippedSegment(S32 seg_start, S32 seg_end, S32 sele
S32 end = seg_end;
S32 length = end - start;
font->render(text, start,
- rect,
- color,
- LLFontGL::LEFT, mEditor.mVAlign,
- LLFontGL::NORMAL,
- mStyle->getShadowType(),
- length,
- &right_x,
- mEditor.getUseEllipses());
+ rect,
+ color,
+ LLFontGL::LEFT, mEditor.mVAlign,
+ LLFontGL::NORMAL,
+ mStyle->getShadowType(),
+ length,
+ &right_x,
+ mEditor.getUseEllipses());
}
return right_x;
}
diff --git a/indra/llui/lltextvalidate.cpp b/indra/llui/lltextvalidate.cpp
index 4b9faa0560..234e600ccd 100644
--- a/indra/llui/lltextvalidate.cpp
+++ b/indra/llui/lltextvalidate.cpp
@@ -188,6 +188,39 @@ namespace LLTextValidate
return success;
}
+ bool validateNonNegativeS32NoSpace(const LLWString &str)
+ {
+ LLLocale locale(LLLocale::USER_LOCALE);
+
+ LLWString test_str = str;
+ S32 len = test_str.length();
+ bool success = TRUE;
+ if(0 < len)
+ {
+ if('-' == test_str[0])
+ {
+ success = FALSE;
+ }
+ S32 i = 0;
+ while(success && (i < len))
+ {
+ if(!LLStringOps::isDigit(test_str[i]) || LLStringOps::isSpace(test_str[i++]))
+ {
+ success = FALSE;
+ }
+ }
+ }
+ if (success)
+ {
+ S32 val = strtol(wstring_to_utf8str(test_str).c_str(), NULL, 10);
+ if (val < 0)
+ {
+ success = FALSE;
+ }
+ }
+ return success;
+ }
+
bool validateAlphaNum(const LLWString &str)
{
LLLocale locale(LLLocale::USER_LOCALE);
diff --git a/indra/llui/lltextvalidate.h b/indra/llui/lltextvalidate.h
index 84644be30c..5c830d7db3 100644
--- a/indra/llui/lltextvalidate.h
+++ b/indra/llui/lltextvalidate.h
@@ -46,6 +46,7 @@ namespace LLTextValidate
bool validateInt(const LLWString &str );
bool validatePositiveS32(const LLWString &str);
bool validateNonNegativeS32(const LLWString &str);
+ bool validateNonNegativeS32NoSpace(const LLWString &str);
bool validateAlphaNum(const LLWString &str );
bool validateAlphaNumSpace(const LLWString &str );
bool validateASCIIPrintableNoPipe(const LLWString &str);
diff --git a/indra/llui/lltimectrl.cpp b/indra/llui/lltimectrl.cpp
new file mode 100644
index 0000000000..9ea1e8815e
--- /dev/null
+++ b/indra/llui/lltimectrl.cpp
@@ -0,0 +1,432 @@
+/**
+ * @file lltimectrl.cpp
+ * @brief LLTimeCtrl base 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$
+ */
+
+#include "linden_common.h"
+
+#include "lltimectrl.h"
+
+#include "llui.h"
+#include "lluiconstants.h"
+
+#include "llbutton.h"
+#include "llfontgl.h"
+#include "lllineeditor.h"
+#include "llkeyboard.h"
+#include "llstring.h"
+#include "lltextbox.h"
+#include "lluictrlfactory.h"
+
+static LLDefaultChildRegistry::Register<LLTimeCtrl> time_r("time");
+
+const U32 AMPM_LEN = 3;
+const U32 MINUTES_MIN = 0;
+const U32 MINUTES_MAX = 59;
+const U32 HOURS_MIN = 1;
+const U32 HOURS_MAX = 12;
+const U32 MINUTES_PER_HOUR = 60;
+const U32 MINUTES_PER_DAY = 24 * MINUTES_PER_HOUR;
+
+
+LLTimeCtrl::Params::Params()
+: label_width("label_width"),
+ snap_to("snap_to"),
+ allow_text_entry("allow_text_entry", true),
+ text_enabled_color("text_enabled_color"),
+ text_disabled_color("text_disabled_color"),
+ up_button("up_button"),
+ down_button("down_button")
+{}
+
+LLTimeCtrl::LLTimeCtrl(const LLTimeCtrl::Params& p)
+: LLUICtrl(p),
+ mLabelBox(NULL),
+ mTextEnabledColor(p.text_enabled_color()),
+ mTextDisabledColor(p.text_disabled_color()),
+ mTime(0),
+ mSnapToMin(5)
+{
+ static LLUICachedControl<S32> spinctrl_spacing ("UISpinctrlSpacing", 0);
+ static LLUICachedControl<S32> spinctrl_btn_width ("UISpinctrlBtnWidth", 0);
+ static LLUICachedControl<S32> spinctrl_btn_height ("UISpinctrlBtnHeight", 0);
+ S32 centered_top = getRect().getHeight();
+ S32 centered_bottom = getRect().getHeight() - 2 * spinctrl_btn_height;
+ S32 label_width = llclamp(p.label_width(), 0, llmax(0, getRect().getWidth() - 40));
+ S32 editor_left = label_width + spinctrl_spacing;
+
+ //================= Label =================//
+ if( !p.label().empty() )
+ {
+ LLRect label_rect( 0, centered_top, label_width, centered_bottom );
+ LLTextBox::Params params;
+ params.name("TimeCtrl Label");
+ params.rect(label_rect);
+ params.initial_value(p.label());
+ if (p.font.isProvided())
+ {
+ params.font(p.font);
+ }
+ mLabelBox = LLUICtrlFactory::create<LLTextBox> (params);
+ addChild(mLabelBox);
+
+ editor_left = label_rect.mRight + spinctrl_spacing;
+ }
+
+ S32 editor_right = getRect().getWidth() - spinctrl_btn_width - spinctrl_spacing;
+
+ //================= Editor ================//
+ LLRect editor_rect( editor_left, centered_top, editor_right, centered_bottom );
+ LLLineEditor::Params params;
+ params.name("SpinCtrl Editor");
+ params.rect(editor_rect);
+ if (p.font.isProvided())
+ {
+ params.font(p.font);
+ }
+
+ params.follows.flags(FOLLOWS_LEFT | FOLLOWS_BOTTOM);
+ params.max_length.chars(8);
+ params.keystroke_callback(boost::bind(&LLTimeCtrl::onTextEntry, this, _1));
+ mEditor = LLUICtrlFactory::create<LLLineEditor> (params);
+ mEditor->setPrevalidateInput(LLTextValidate::validateNonNegativeS32NoSpace);
+ mEditor->setPrevalidate(boost::bind(&LLTimeCtrl::isTimeStringValid, this, _1));
+ mEditor->setText(LLStringExplicit("12:00 AM"));
+ addChild(mEditor);
+
+ //================= Spin Buttons ==========//
+ LLButton::Params up_button_params(p.up_button);
+ up_button_params.rect = LLRect(editor_right + 1, getRect().getHeight(), editor_right + spinctrl_btn_width, getRect().getHeight() - spinctrl_btn_height);
+
+ up_button_params.click_callback.function(boost::bind(&LLTimeCtrl::onUpBtn, this));
+ up_button_params.mouse_held_callback.function(boost::bind(&LLTimeCtrl::onUpBtn, this));
+ mUpBtn = LLUICtrlFactory::create<LLButton>(up_button_params);
+ addChild(mUpBtn);
+
+ LLButton::Params down_button_params(p.down_button);
+ down_button_params.rect = LLRect(editor_right + 1, getRect().getHeight() - spinctrl_btn_height, editor_right + spinctrl_btn_width, getRect().getHeight() - 2 * spinctrl_btn_height);
+ down_button_params.click_callback.function(boost::bind(&LLTimeCtrl::onDownBtn, this));
+ down_button_params.mouse_held_callback.function(boost::bind(&LLTimeCtrl::onDownBtn, this));
+ mDownBtn = LLUICtrlFactory::create<LLButton>(down_button_params);
+ addChild(mDownBtn);
+
+ setUseBoundingRect( TRUE );
+}
+
+F32 LLTimeCtrl::getTime24() const
+{
+ // 0.0 - 23.99;
+ return mTime / 60.0f;
+}
+
+U32 LLTimeCtrl::getHours24() const
+{
+ return (U32) getTime24();
+}
+
+U32 LLTimeCtrl::getMinutes() const
+{
+ return mTime % MINUTES_PER_HOUR;
+}
+
+void LLTimeCtrl::setTime24(F32 time)
+{
+ time = llclamp(time, 0.0f, 23.99f); // fix out of range values
+ mTime = llround(time * MINUTES_PER_HOUR); // fixes values like 4.99999
+
+ updateText();
+}
+
+BOOL LLTimeCtrl::handleKeyHere(KEY key, MASK mask)
+{
+ if (mEditor->hasFocus())
+ {
+ if(key == KEY_UP)
+ {
+ onUpBtn();
+ return TRUE;
+ }
+ if(key == KEY_DOWN)
+ {
+ onDownBtn();
+ return TRUE;
+ }
+ if (key == KEY_RETURN)
+ {
+ onCommit();
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+void LLTimeCtrl::onUpBtn()
+{
+ switch(getEditingPart())
+ {
+ case HOURS:
+ increaseHours();
+ break;
+ case MINUTES:
+ increaseMinutes();
+ break;
+ case DAYPART:
+ switchDayPeriod();
+ break;
+ default:
+ break;
+ }
+
+ updateText();
+ onCommit();
+}
+
+void LLTimeCtrl::onDownBtn()
+{
+ switch(getEditingPart())
+ {
+ case HOURS:
+ decreaseHours();
+ break;
+ case MINUTES:
+ decreaseMinutes();
+ break;
+ case DAYPART:
+ switchDayPeriod();
+ break;
+ default:
+ break;
+ }
+
+ updateText();
+ onCommit();
+}
+
+void LLTimeCtrl::onFocusLost()
+{
+ updateText();
+ onCommit();
+ LLUICtrl::onFocusLost();
+}
+
+void LLTimeCtrl::onTextEntry(LLLineEditor* line_editor)
+{
+ std::string time_str = line_editor->getText();
+ U32 h12 = parseHours(getHoursString(time_str));
+ U32 m = parseMinutes(getMinutesString(time_str));
+ bool pm = parseAMPM(getAMPMString(time_str));
+
+ if (h12 == 12)
+ {
+ h12 = 0;
+ }
+
+ U32 h24 = pm ? h12 + 12 : h12;
+
+ mTime = h24 * MINUTES_PER_HOUR + m;
+}
+
+bool LLTimeCtrl::isTimeStringValid(const LLWString &wstr)
+{
+ std::string str = wstring_to_utf8str(wstr);
+
+ return isHoursStringValid(getHoursString(str)) &&
+ isMinutesStringValid(getMinutesString(str)) &&
+ isPMAMStringValid(getAMPMString(str));
+}
+
+void LLTimeCtrl::increaseMinutes()
+{
+ mTime = (mTime + mSnapToMin) % MINUTES_PER_DAY - (mTime % mSnapToMin);
+}
+
+void LLTimeCtrl::increaseHours()
+{
+ mTime = (mTime + MINUTES_PER_HOUR) % MINUTES_PER_DAY;
+}
+
+void LLTimeCtrl::decreaseMinutes()
+{
+ if (mTime < mSnapToMin)
+ {
+ mTime = MINUTES_PER_DAY - mTime;
+ }
+
+ mTime -= (mTime % mSnapToMin) ? mTime % mSnapToMin : mSnapToMin;
+}
+
+void LLTimeCtrl::decreaseHours()
+{
+ if (mTime < MINUTES_PER_HOUR)
+ {
+ mTime = 23 * MINUTES_PER_HOUR + mTime;
+ }
+ else
+ {
+ mTime -= MINUTES_PER_HOUR;
+ }
+}
+
+bool LLTimeCtrl::isPM() const
+{
+ return mTime >= (MINUTES_PER_DAY / 2);
+}
+
+void LLTimeCtrl::switchDayPeriod()
+{
+ if (isPM())
+ {
+ mTime -= MINUTES_PER_DAY / 2;
+ }
+ else
+ {
+ mTime += MINUTES_PER_DAY / 2;
+ }
+}
+
+void LLTimeCtrl::updateText()
+{
+ U32 h24 = getHours24();
+ U32 m = getMinutes();
+ U32 h12 = h24 > 12 ? h24 - 12 : h24;
+
+ if (h12 == 0)
+ h12 = 12;
+
+ mEditor->setText(llformat("%d:%02d %s", h12, m, isPM() ? "PM":"AM"));
+}
+
+LLTimeCtrl::EEditingPart LLTimeCtrl::getEditingPart()
+{
+ S32 cur_pos = mEditor->getCursor();
+ std::string time_str = mEditor->getText();
+
+ S32 colon_index = time_str.find_first_of(':');
+
+ if (cur_pos <= colon_index)
+ {
+ return HOURS;
+ }
+ else if (cur_pos > colon_index && cur_pos <= (S32)(time_str.length() - AMPM_LEN))
+ {
+ return MINUTES;
+ }
+ else if (cur_pos > (S32)(time_str.length() - AMPM_LEN))
+ {
+ return DAYPART;
+ }
+
+ return NONE;
+}
+
+// static
+std::string LLTimeCtrl::getHoursString(const std::string& str)
+{
+ size_t colon_index = str.find_first_of(':');
+ std::string hours_str = str.substr(0, colon_index);
+
+ return hours_str;
+}
+
+// static
+std::string LLTimeCtrl::getMinutesString(const std::string& str)
+{
+ size_t colon_index = str.find_first_of(':');
+ ++colon_index;
+
+ int minutes_len = str.length() - colon_index - AMPM_LEN;
+ std::string minutes_str = str.substr(colon_index, minutes_len);
+
+ return minutes_str;
+}
+
+// static
+std::string LLTimeCtrl::getAMPMString(const std::string& str)
+{
+ return str.substr(str.size() - 2, 2); // returns last two characters
+}
+
+// static
+bool LLTimeCtrl::isHoursStringValid(const std::string& str)
+{
+ U32 hours;
+ if ((!LLStringUtil::convertToU32(str, hours) || (hours <= HOURS_MAX)) && str.length() < 3)
+ return true;
+
+ return false;
+}
+
+// static
+bool LLTimeCtrl::isMinutesStringValid(const std::string& str)
+{
+ U32 minutes;
+ if (!LLStringUtil::convertToU32(str, minutes) || (minutes <= MINUTES_MAX) && str.length() < 3)
+ return true;
+
+ return false;
+}
+
+// static
+bool LLTimeCtrl::isPMAMStringValid(const std::string& str)
+{
+ S32 len = str.length();
+
+ bool valid = (str[--len] == 'M') && (str[--len] == 'P' || str[len] == 'A');
+
+ return valid;
+}
+
+// static
+U32 LLTimeCtrl::parseHours(const std::string& str)
+{
+ U32 hours;
+ if (LLStringUtil::convertToU32(str, hours) && (hours >= HOURS_MIN) && (hours <= HOURS_MAX))
+ {
+ return hours;
+ }
+ else
+ {
+ return HOURS_MIN;
+ }
+}
+
+// static
+U32 LLTimeCtrl::parseMinutes(const std::string& str)
+{
+ U32 minutes;
+ if (LLStringUtil::convertToU32(str, minutes) && (minutes >= MINUTES_MIN) && (minutes <= MINUTES_MAX))
+ {
+ return minutes;
+ }
+ else
+ {
+ return MINUTES_MIN;
+ }
+}
+
+// static
+bool LLTimeCtrl::parseAMPM(const std::string& str)
+{
+ return str == "PM";
+}
diff --git a/indra/llui/lltimectrl.h b/indra/llui/lltimectrl.h
new file mode 100644
index 0000000000..b5f268c76a
--- /dev/null
+++ b/indra/llui/lltimectrl.h
@@ -0,0 +1,131 @@
+/**
+ * @file lltimectrl.h
+ * @brief Time control
+ *
+ * $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 LLTIMECTRL_H_
+#define LLTIMECTRL_H_
+
+#include "stdtypes.h"
+#include "llbutton.h"
+#include "v4color.h"
+#include "llrect.h"
+
+class LLLineEditor;
+
+class LLTimeCtrl
+: public LLUICtrl
+{
+ LOG_CLASS(LLTimeCtrl);
+public:
+ struct Params : public LLInitParam::Block<Params, LLUICtrl::Params>
+ {
+ Optional<S32> label_width;
+ Optional<S32> snap_to;
+ Optional<bool> allow_text_entry;
+
+ Optional<LLUIColor> text_enabled_color;
+ Optional<LLUIColor> text_disabled_color;
+
+ Optional<LLButton::Params> up_button;
+ Optional<LLButton::Params> down_button;
+
+ Params();
+ };
+
+ F32 getTime24() const; // 0.0 - 24.0
+ U32 getHours24() const; // 0 - 23
+ U32 getMinutes() const; // 0 - 59
+
+ void setTime24(F32 time); // 0.0 - 23.98(3)
+
+protected:
+ LLTimeCtrl(const Params&);
+ friend class LLUICtrlFactory;
+
+private:
+
+ enum EDayPeriod
+ {
+ AM,
+ PM
+ };
+
+ enum EEditingPart
+ {
+ HOURS,
+ MINUTES,
+ DAYPART,
+ NONE
+ };
+
+ virtual void onFocusLost();
+ virtual BOOL handleKeyHere(KEY key, MASK mask);
+
+ void onUpBtn();
+ void onDownBtn();
+ void onTextEntry(LLLineEditor* line_editor);
+
+ bool isTimeStringValid(const LLWString& wstr);
+
+ void increaseMinutes();
+ void increaseHours();
+
+ void decreaseMinutes();
+ void decreaseHours();
+
+ bool isPM() const;
+ void switchDayPeriod();
+
+ void updateText();
+
+ EEditingPart getEditingPart();
+
+ static std::string getHoursString(const std::string& str);
+ static std::string getMinutesString(const std::string& str);
+ static std::string getAMPMString(const std::string& str);
+
+ static bool isHoursStringValid(const std::string& str);
+ static bool isMinutesStringValid(const std::string& str);
+ static bool isPMAMStringValid(const std::string& str);
+
+ static U32 parseHours(const std::string& str);
+ static U32 parseMinutes(const std::string& str);
+ static bool parseAMPM(const std::string& str);
+
+ class LLTextBox* mLabelBox;
+
+ class LLLineEditor* mEditor;
+ LLUIColor mTextEnabledColor;
+ LLUIColor mTextDisabledColor;
+
+ class LLButton* mUpBtn;
+ class LLButton* mDownBtn;
+
+ U32 mTime; // minutes since midnight: 0 - 1439
+ U32 mSnapToMin; // interval in minutes to snap to
+
+ BOOL mAllowEdit;
+};
+#endif /* LLTIMECTRL_H_ */
diff --git a/indra/llui/lluictrl.cpp b/indra/llui/lluictrl.cpp
index 0a06b5e74f..d58df5801b 100644
--- a/indra/llui/lluictrl.cpp
+++ b/indra/llui/lluictrl.cpp
@@ -68,6 +68,7 @@ LLUICtrl::ControlVisibility::ControlVisibility()
LLUICtrl::Params::Params()
: tab_stop("tab_stop", true),
chrome("chrome", false),
+ requests_front("requests_front", false),
label("label"),
initial_value("value"),
init_callback("init_callback"),
@@ -96,9 +97,10 @@ const LLUICtrl::Params& LLUICtrl::getDefaultParams()
LLUICtrl::LLUICtrl(const LLUICtrl::Params& p, const LLViewModelPtr& viewmodel)
: LLView(p),
- mTentative(FALSE),
mIsChrome(FALSE),
+ mRequestsFront(p.requests_front),
mTabStop(FALSE),
+ mTentative(FALSE),
mViewModel(viewmodel),
mControlVariable(NULL),
mEnabledControlVariable(NULL),
@@ -123,6 +125,8 @@ void LLUICtrl::initFromParams(const Params& p)
{
LLView::initFromParams(p);
+ mRequestsFront = p.requests_front;
+
setIsChrome(p.chrome);
setControlName(p.control_name);
if(p.enabled_controls.isProvided())
@@ -403,6 +407,36 @@ LLViewModel* LLUICtrl::getViewModel() const
return mViewModel;
}
+//virtual
+BOOL LLUICtrl::postBuild()
+{
+ //
+ // Find all of the children that want to be in front and move them to the front
+ //
+
+ if (getChildCount() > 0)
+ {
+ std::vector<LLUICtrl*> childrenToMoveToFront;
+
+ for (LLView::child_list_const_iter_t child_it = beginChild(); child_it != endChild(); ++child_it)
+ {
+ LLUICtrl* uictrl = dynamic_cast<LLUICtrl*>(*child_it);
+
+ if (uictrl && uictrl->mRequestsFront)
+ {
+ childrenToMoveToFront.push_back(uictrl);
+ }
+ }
+
+ for (std::vector<LLUICtrl*>::iterator it = childrenToMoveToFront.begin(); it != childrenToMoveToFront.end(); ++it)
+ {
+ sendChildToFront(*it);
+ }
+ }
+
+ return LLView::postBuild();
+}
+
bool LLUICtrl::setControlValue(const LLSD& value)
{
if (mControlVariable)
diff --git a/indra/llui/lluictrl.h b/indra/llui/lluictrl.h
index b37e9f6b1b..09bed9b958 100644
--- a/indra/llui/lluictrl.h
+++ b/indra/llui/lluictrl.h
@@ -94,7 +94,8 @@ public:
{
Optional<std::string> label;
Optional<bool> tab_stop,
- chrome;
+ chrome,
+ requests_front;
Optional<LLSD> initial_value;
Optional<CommitCallbackParam> init_callback,
@@ -143,6 +144,8 @@ protected:
virtual LLViewModel* getViewModel() const;
// We shouldn't ever need to set this directly
//virtual void setViewModel(const LLViewModelPtr&);
+
+ virtual BOOL postBuild();
public:
// LLView interface
@@ -301,8 +304,9 @@ protected:
private:
- BOOL mTabStop;
BOOL mIsChrome;
+ BOOL mRequestsFront;
+ BOOL mTabStop;
BOOL mTentative;
LLRootHandle<LLUICtrl> mUICtrlHandle;
diff --git a/indra/llui/llview.cpp b/indra/llui/llview.cpp
index 245126d178..8803d106ba 100644
--- a/indra/llui/llview.cpp
+++ b/indra/llui/llview.cpp
@@ -1299,15 +1299,7 @@ void LLView::drawChildren()
{
if (!mChildList.empty())
{
- static const LLRect* rootRect = NULL;
-
- if (!mParentView)
- {
- rootRect = &mRect;
- }
-
- LLRect screenRect;
-
+ LLView* rootp = LLUI::getRootView();
++sDepth;
for (child_list_reverse_iter_t child_iter = mChildList.rbegin(); child_iter != mChildList.rend();) // ++child_iter)
@@ -1317,9 +1309,8 @@ void LLView::drawChildren()
if (viewp->getVisible() && viewp->getRect().isValid())
{
- // Only draw views that are within the root view
- localRectToScreen(viewp->getRect(),&screenRect);
- if ( rootRect->overlaps(screenRect) && LLUI::sDirtyRect.overlaps(screenRect))
+ LLRect screen_rect = viewp->calcScreenRect();
+ if ( rootp->getLocalRect().overlaps(screen_rect) && LLUI::sDirtyRect.overlaps(screen_rect))
{
LLUI::pushMatrix();
{
diff --git a/indra/llui/tests/llurlmatch_test.cpp b/indra/llui/tests/llurlmatch_test.cpp
index e09ef33d49..3cd61e574e 100644
--- a/indra/llui/tests/llurlmatch_test.cpp
+++ b/indra/llui/tests/llurlmatch_test.cpp
@@ -95,7 +95,7 @@ namespace LLInitParam
{
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);
+ mEnclosingBlockOffset = 0x7FFFffff & ((U32)(my_addr - block_addr));
}
bool BaseBlock::deserializeBlock(Parser& p, Parser::name_stack_range_t name_stack, S32 generation){ return true; }
diff --git a/indra/llvfs/CMakeLists.txt b/indra/llvfs/CMakeLists.txt
index b6d1ce61e5..2c581cf8d6 100644
--- a/indra/llvfs/CMakeLists.txt
+++ b/indra/llvfs/CMakeLists.txt
@@ -62,11 +62,15 @@ list(APPEND llvfs_SOURCE_FILES ${llvfs_HEADER_FILES})
add_library (llvfs ${llvfs_SOURCE_FILES})
-target_link_libraries(llvfs
+set(vfs_BOOST_LIBRARIES
${BOOST_FILESYSTEM_LIBRARY}
${BOOST_SYSTEM_LIBRARY}
)
+target_link_libraries(llvfs
+ ${vfs_BOOST_LIBRARIES}
+ )
+
if (DARWIN)
include(CMakeFindFrameworks)
find_library(CARBON_LIBRARY Carbon)
@@ -76,15 +80,21 @@ endif (DARWIN)
# Add tests
if (LL_TESTS)
- include(LLAddBuildTest)
- # UNIT TESTS
- SET(llvfs_TEST_SOURCE_FILES
- # none so far
- )
- LL_ADD_PROJECT_UNIT_TESTS(llvfs "${llvfs_TEST_SOURCE_FILES}")
-
- # INTEGRATION TESTS
- set(test_libs llmath llcommon llvfs ${LLCOMMON_LIBRARIES} ${WINDOWS_LIBRARIES})
- # TODO: Some of these need refactoring to be proper Unit tests rather than Integration tests.
- LL_ADD_INTEGRATION_TEST(lldir "" "${test_libs}")
+ include(LLAddBuildTest)
+ # UNIT TESTS
+ SET(llvfs_TEST_SOURCE_FILES
+ lldiriterator.cpp
+ )
+
+ set_source_files_properties(lldiriterator.cpp
+ PROPERTIES
+ LL_TEST_ADDITIONAL_LIBRARIES "${vfs_BOOST_LIBRARIES}"
+ )
+ LL_ADD_PROJECT_UNIT_TESTS(llvfs "${llvfs_TEST_SOURCE_FILES}")
+
+ # INTEGRATION TESTS
+ set(test_libs llmath llcommon llvfs ${LLCOMMON_LIBRARIES} ${WINDOWS_LIBRARIES})
+
+ # TODO: Some of these need refactoring to be proper Unit tests rather than Integration tests.
+ LL_ADD_INTEGRATION_TEST(lldir "" "${test_libs}")
endif (LL_TESTS)
diff --git a/indra/llvfs/lldir_mac.cpp b/indra/llvfs/lldir_mac.cpp
index 8f48f92e2a..489bc3e4a7 100644
--- a/indra/llvfs/lldir_mac.cpp
+++ b/indra/llvfs/lldir_mac.cpp
@@ -258,38 +258,6 @@ U32 LLDir_Mac::countFilesInDir(const std::string &dirname, const std::string &ma
return (file_count);
}
-S32 LLDir_Mac::deleteFilesInDir(const std::string &dirname, const std::string &mask)
-{
- glob_t g;
- S32 result = 0;
-
- std::string tmp_str;
- tmp_str = dirname;
- tmp_str += mask;
-
- if(glob(tmp_str.c_str(), GLOB_NOSORT, NULL, &g) == 0)
- {
- int i;
-
- for(i = 0; i < g.gl_pathc; i++)
- {
-// llinfos << "deleteFilesInDir: deleting number " << i << ", path is " << g.gl_pathv[i] << llendl;
-
- if(unlink(g.gl_pathv[i]) != 0)
- {
- result = errno;
-
- llwarns << "Problem removing " << g.gl_pathv[i] << " - errorcode: "
- << result << llendl;
- }
- }
-
- globfree(&g);
- }
-
- return(result);
-}
-
std::string LLDir_Mac::getCurPath()
{
char tmp_str[LL_MAX_PATH]; /* Flawfinder: ignore */
diff --git a/indra/llvfs/lldir_mac.h b/indra/llvfs/lldir_mac.h
index bc3f0fac00..d190d70be4 100644
--- a/indra/llvfs/lldir_mac.h
+++ b/indra/llvfs/lldir_mac.h
@@ -44,7 +44,6 @@ public:
/*virtual*/ void initAppDirs(const std::string &app_name,
const std::string& app_read_only_data_dir);
- virtual S32 deleteFilesInDir(const std::string &dirname, const std::string &mask);
virtual std::string getCurPath();
virtual U32 countFilesInDir(const std::string &dirname, const std::string &mask);
virtual BOOL fileExists(const std::string &filename) const;
diff --git a/indra/llvfs/lldiriterator.cpp b/indra/llvfs/lldiriterator.cpp
index 5536ed8f69..25550321f0 100644
--- a/indra/llvfs/lldiriterator.cpp
+++ b/indra/llvfs/lldiriterator.cpp
@@ -55,7 +55,7 @@ LLDirIterator::Impl::Impl(const std::string &dirname, const std::string &mask)
// Check if path exists.
if (!fs::exists(dir_path))
{
- llerrs << "Invalid path: \"" << dir_path.string() << "\"" << llendl;
+ llwarns << "Invalid path: \"" << dir_path.string() << "\"" << llendl;
return;
}
@@ -100,7 +100,7 @@ bool LLDirIterator::Impl::next(std::string &fname)
if (!mIsValid)
{
- llerrs << "The iterator is not correctly initialized." << llendl;
+ llwarns << "The iterator is not correctly initialized." << llendl;
return false;
}
@@ -121,6 +121,14 @@ bool LLDirIterator::Impl::next(std::string &fname)
return found;
}
+/**
+Converts the incoming glob into a regex. This involves
+converting incoming glob expressions to regex equivilents and
+at the same time, escaping any regex meaningful characters which
+do not have glob meaning, i.e.
+ .()+|^$
+in the input.
+*/
std::string glob_to_regex(const std::string& glob)
{
std::string regex;
@@ -135,9 +143,6 @@ std::string glob_to_regex(const std::string& glob)
switch (c)
{
- case '.':
- regex+="\\.";
- break;
case '*':
if (glob.begin() == i)
{
@@ -170,8 +175,16 @@ std::string glob_to_regex(const std::string& glob)
case '!':
regex+= square_brace_open ? '^' : c;
break;
+ case '.': // This collection have different regex meaning
+ case '^': // and so need escaping.
+ case '(':
+ case ')':
+ case '+':
+ case '|':
+ case '$':
+ regex += '\\';
default:
- regex+=c;
+ regex += c;
break;
}
diff --git a/indra/llvfs/tests/lldiriterator_test.cpp b/indra/llvfs/tests/lldiriterator_test.cpp
new file mode 100644
index 0000000000..505d86faa7
--- /dev/null
+++ b/indra/llvfs/tests/lldiriterator_test.cpp
@@ -0,0 +1,65 @@
+/**
+ * @file lldiriterator_test.cpp
+ * @date 2011-06
+ * @brief LLDirIterator test cases.
+ *
+ * $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 "lltut.h"
+#include "../lldiriterator.h"
+
+
+namespace tut
+{
+
+ struct LLDirIteratorFixture
+ {
+ LLDirIteratorFixture()
+ {
+ }
+ };
+ typedef test_group<LLDirIteratorFixture> LLDirIteratorTest_factory;
+ typedef LLDirIteratorTest_factory::object LLDirIteratorTest_t;
+ LLDirIteratorTest_factory tf("LLDirIterator");
+
+ /*
+ CHOP-662 was originally introduced to deal with crashes deleting files from
+ a directory (VWR-25500). However, this introduced a crash looking for
+ old chat logs as the glob_to_regex function in lldiriterator wasn't escaping lots of regexp characters
+ */
+ void test_chop_662(void)
+ {
+ // Check a selection of bad group names from the crash reports
+ LLDirIterator iter(".","+bad-group-name]+??-??.*");
+ LLDirIterator iter1(".","))--@---bad-group-name2((??-??.*\\.txt");
+ LLDirIterator iter2(".","__^v--x)Cuide d sua vida(x--v^__??-??.*");
+ }
+
+ template<> template<>
+ void LLDirIteratorTest_t::test<1>()
+ {
+ test_chop_662();
+ }
+
+}
diff --git a/indra/llwindow/llkeyboardheadless.cpp b/indra/llwindow/llkeyboardheadless.cpp
index 4dfaaed4e1..c87617c9ff 100644
--- a/indra/llwindow/llkeyboardheadless.cpp
+++ b/indra/llwindow/llkeyboardheadless.cpp
@@ -46,5 +46,28 @@ MASK LLKeyboardHeadless::currentMask(BOOL for_mouse_event)
{ return MASK_NONE; }
void LLKeyboardHeadless::scanKeyboard()
-{ }
+{
+ for (S32 key = 0; key < KEY_COUNT; key++)
+ {
+ // Generate callback if any event has occurred on this key this frame.
+ // Can't just test mKeyLevel, because this could be a slow frame and
+ // key might have gone down then up. JC
+ if (mKeyLevel[key] || mKeyDown[key] || mKeyUp[key])
+ {
+ mCurScanKey = key;
+ mCallbacks->handleScanKey(key, mKeyDown[key], mKeyUp[key], mKeyLevel[key]);
+ }
+ }
+
+ // Reset edges for next frame
+ for (S32 key = 0; key < KEY_COUNT; key++)
+ {
+ mKeyUp[key] = FALSE;
+ mKeyDown[key] = FALSE;
+ if (mKeyLevel[key])
+ {
+ mKeyLevelFrameCount[key]++;
+ }
+ }
+}
diff --git a/indra/llxuixml/llinitparam.cpp b/indra/llxuixml/llinitparam.cpp
index b3312798dd..c024fd405e 100644
--- a/indra/llxuixml/llinitparam.cpp
+++ b/indra/llxuixml/llinitparam.cpp
@@ -40,7 +40,7 @@ namespace LLInitParam
{
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);
+ mEnclosingBlockOffset = 0x7FFFffff & ((U32)(my_addr - block_addr));
}
//
diff --git a/indra/llxuixml/llinitparam.h b/indra/llxuixml/llinitparam.h
index a853999e94..35c889b69f 100644
--- a/indra/llxuixml/llinitparam.h
+++ b/indra/llxuixml/llinitparam.h
@@ -34,6 +34,8 @@
#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; }
@@ -302,8 +304,9 @@ namespace LLInitParam
private:
friend class BaseBlock;
- U16 mEnclosingBlockOffset;
- bool mIsProvided;
+ U32 mEnclosingBlockOffset:31;
+ U32 mIsProvided:1;
+
};
// various callbacks and constraints associated with an individual param
diff --git a/indra/llxuixml/lltrans.cpp b/indra/llxuixml/lltrans.cpp
index b403b86048..5388069c24 100644
--- a/indra/llxuixml/lltrans.cpp
+++ b/indra/llxuixml/lltrans.cpp
@@ -30,6 +30,7 @@
#include "llfasttimer.h" // for call count statistics
#include "llxuiparser.h"
+#include "llsd.h"
#include "llxmlnode.h"
#include <map>
@@ -155,13 +156,28 @@ std::string LLTrans::getString(const std::string &xml_desc, const LLStringUtil::
}
else
{
- LLSD args;
- args["STRING_NAME"] = xml_desc;
LL_WARNS_ONCE("configuration") << "Missing String in strings.xml: [" << xml_desc << "]" << LL_ENDL;
+ return "MissingString("+xml_desc+")";
+ }
+}
- //LLNotificationsUtil::add("MissingString", args); // *TODO: resurrect
- //return xml_desc;
+//static
+std::string LLTrans::getString(const std::string &xml_desc, const LLSD& msg_args)
+{
+ // Don't care about time as much as call count. Make sure we're not
+ // calling LLTrans::getString() in an inner loop. JC
+ LLFastTimer timer(FTM_GET_TRANS);
+ template_map_t::iterator iter = sStringTemplates.find(xml_desc);
+ if (iter != sStringTemplates.end())
+ {
+ std::string text = iter->second.mText;
+ LLStringUtil::format(text, msg_args);
+ return text;
+ }
+ else
+ {
+ LL_WARNS_ONCE("configuration") << "Missing String in strings.xml: [" << xml_desc << "]" << LL_ENDL;
return "MissingString("+xml_desc+")";
}
}
@@ -183,11 +199,27 @@ bool LLTrans::findString(std::string &result, const std::string &xml_desc, const
}
else
{
- LLSD args;
- args["STRING_NAME"] = xml_desc;
- LL_WARNS_ONCE("configuration") << "Missing String in strings.xml: [" << xml_desc << "]" << LL_ENDL;
- //LLNotificationsUtil::add("MissingString", args);
-
+ LL_WARNS_ONCE("configuration") << "Missing String in strings.xml: [" << xml_desc << "]" << LL_ENDL;
+ return false;
+ }
+}
+
+//static
+bool LLTrans::findString(std::string &result, const std::string &xml_desc, const LLSD& msg_args)
+{
+ LLFastTimer timer(FTM_GET_TRANS);
+
+ template_map_t::iterator iter = sStringTemplates.find(xml_desc);
+ if (iter != sStringTemplates.end())
+ {
+ std::string text = iter->second.mText;
+ LLStringUtil::format(text, msg_args);
+ result = text;
+ return true;
+ }
+ else
+ {
+ LL_WARNS_ONCE("configuration") << "Missing String in strings.xml: [" << xml_desc << "]" << LL_ENDL;
return false;
}
}
diff --git a/indra/llxuixml/lltrans.h b/indra/llxuixml/lltrans.h
index b7091f77e8..128b51d383 100644
--- a/indra/llxuixml/lltrans.h
+++ b/indra/llxuixml/lltrans.h
@@ -34,6 +34,8 @@
class LLXMLNode;
+class LLSD;
+
/**
* @brief String template loaded from strings.xml
*/
@@ -74,7 +76,9 @@ public:
* @returns Translated string
*/
static std::string getString(const std::string &xml_desc, const LLStringUtil::format_map_t& args);
+ static std::string getString(const std::string &xml_desc, const LLSD& args);
static bool findString(std::string &result, const std::string &xml_desc, const LLStringUtil::format_map_t& args);
+ static bool findString(std::string &result, const std::string &xml_desc, const LLSD& args);
// Returns translated string with [COUNT] replaced with a number, following
// special per-language logic for plural nouns. For example, some languages
diff --git a/indra/lscript/lscript_compile/indra.l b/indra/lscript/lscript_compile/indra.l
index 188c9e1950..4e103ae2ba 100644
--- a/indra/lscript/lscript_compile/indra.l
+++ b/indra/lscript/lscript_compile/indra.l
@@ -603,6 +603,8 @@ extern "C" { int yyerror(const char *fmt, ...); }
"PARCEL_DETAILS_OWNER" { count(); yylval.ival = PARCEL_DETAILS_OWNER; return(INTEGER_CONSTANT); }
"PARCEL_DETAILS_GROUP" { count(); yylval.ival = PARCEL_DETAILS_GROUP; return(INTEGER_CONSTANT); }
"PARCEL_DETAILS_AREA" { count(); yylval.ival = PARCEL_DETAILS_AREA; return(INTEGER_CONSTANT); }
+"PARCEL_DETAILS_ID" { count(); yylval.ival = PARCEL_DETAILS_ID; return(INTEGER_CONSTANT); }
+"PARCEL_DETAILS_SEE_AVATARS" { count(); yylval.ival = PARCEL_DETAILS_SEE_AVATARS; return(INTEGER_CONSTANT); }
"STRING_TRIM_HEAD" { count(); yylval.ival = STRING_TRIM_HEAD; return(INTEGER_CONSTANT); }
"STRING_TRIM_TAIL" { count(); yylval.ival = STRING_TRIM_TAIL; return(INTEGER_CONSTANT); }
diff --git a/indra/lscript/lscript_library/lscript_library.cpp b/indra/lscript/lscript_library/lscript_library.cpp
index 967c69fea9..7ffe53a307 100644
--- a/indra/lscript/lscript_library/lscript_library.cpp
+++ b/indra/lscript/lscript_library/lscript_library.cpp
@@ -461,6 +461,9 @@ void LLScriptLibrary::init()
addFunction(10.f, 0.f, dummy_func, "llGetDisplayName", "s", "k");
addFunction(10.f, 0.f, dummy_func, "llRequestDisplayName", "k", "k");
+ addFunction(10.f, 0.f, dummy_func, "llGetEnv", "s", "s");
+ addFunction(10.f, 0.f, dummy_func, "llRegionSayTo", NULL, "kis");
+
// energy, sleep, dummy_func, name, return type, parameters, help text, gods-only
// IF YOU ADD NEW SCRIPT CALLS, YOU MUST PUT THEM AT THE END OF THIS LIST.
diff --git a/indra/mac_crash_logger/CrashReporter.nib/objects.xib b/indra/mac_crash_logger/CrashReporter.nib/objects.xib
index 634d1c5321..32647391b6 100644
--- a/indra/mac_crash_logger/CrashReporter.nib/objects.xib
+++ b/indra/mac_crash_logger/CrashReporter.nib/objects.xib
@@ -15,7 +15,7 @@
<string name="bounds">414 390 434 487 </string>
</object>
<object class="IBCarbonStaticText" id="181">
- <string name="title">Second Life appears to have crashed or frozen the last time it ran.&#10;&#10;This crash reporter collects information about your computer&apos;s hardware configuration, operating system, and some Second Life logs, all of which are used for debugging purposes only.&#10;&#10;In the space below, please briefly describe what you were doing or trying to do just prior to the crash. Thank you for your help!&#10;&#10;This report is NOT read by Customer Support. If you have billing or other questions, please go to: http://www.secondlife.com/support/&#10;&#10;If you don&apos;t wish to send Linden Lab a crash report, press Cancel.&#10;</string>
+ <string name="title">Second Life appears to have crashed or frozen the last time it ran.&#10;&#10;This crash reporter collects information about your computer&apos;s hardware configuration, operating system, and some Second Life logs, all of which are used for debugging purposes only.&#10;&#10;In the space below, please briefly describe what you were doing or trying to do just prior to the crash. Thank you for your help!&#10;&#10;This report is NOT read by Customer Support. If you have billing or other questions, please go to: http://www.secondlife.com/support/&#10;&#10;If you don&apos;t wish to send Linden Lab a crash report, press Don&apos;t Send.&#10;</string>
<string name="bounds">20 20 231 487 </string>
</object>
<object class="IBCarbonWindow" id="166">
diff --git a/indra/mac_crash_logger/llcrashloggermac.cpp b/indra/mac_crash_logger/llcrashloggermac.cpp
index bec8cce04e..b555e92b96 100644
--- a/indra/mac_crash_logger/llcrashloggermac.cpp
+++ b/indra/mac_crash_logger/llcrashloggermac.cpp
@@ -29,9 +29,6 @@
#include <Carbon/Carbon.h>
#include <iostream>
-#include <sstream>
-
-#include "boost/tokenizer.hpp"
#include "indra_constants.h" // CRASH_BEHAVIOR_ASK, CRASH_SETTING_NAME
#include "llerror.h"
@@ -247,7 +244,7 @@ bool LLCrashLoggerMac::mainLoop()
void LLCrashLoggerMac::updateApplication(const std::string& message)
{
- LLCrashLogger::updateApplication();
+ LLCrashLogger::updateApplication(message);
}
bool LLCrashLoggerMac::cleanup()
diff --git a/indra/mac_crash_logger/mac_crash_logger.cpp b/indra/mac_crash_logger/mac_crash_logger.cpp
index 20b491c401..6571b35241 100644
--- a/indra/mac_crash_logger/mac_crash_logger.cpp
+++ b/indra/mac_crash_logger/mac_crash_logger.cpp
@@ -25,22 +25,23 @@
*/
#include "linden_common.h"
-
#include "llcrashloggermac.h"
int main(int argc, char **argv)
{
- //time(&gLaunchTime);
-
- llinfos << "Starting Second Life Viewer Crash Reporter" << llendl;
+ llinfos << "Starting crash reporter." << llendl;
LLCrashLoggerMac app;
app.parseCommandOptions(argc, argv);
- if(!app.init())
+
+ if (! app.init())
{
- return 0;
+ llwarns << "Unable to initialize application." << llendl;
+ return 1;
}
+
app.mainLoop();
-
+ app.cleanup();
+ llinfos << "Crash reporter finished normally." << llendl;
return 0;
}
diff --git a/indra/media_plugins/webkit/media_plugin_webkit.cpp b/indra/media_plugins/webkit/media_plugin_webkit.cpp
index 9ba8edbb59..fca071c628 100644
--- a/indra/media_plugins/webkit/media_plugin_webkit.cpp
+++ b/indra/media_plugins/webkit/media_plugin_webkit.cpp
@@ -1168,6 +1168,72 @@ void MediaPluginWebKit::receiveMessage(const char *message_string)
authResponse(message_in);
}
else
+ if(message_name == "js_enable_object")
+ {
+#if LLQTWEBKIT_API_VERSION >= 9
+ bool enable = message_in.getValueBoolean( "enable" );
+ LLQtWebKit::getInstance()->setSLObjectEnabled( enable );
+#endif
+ }
+ else
+ if(message_name == "js_agent_location")
+ {
+#if LLQTWEBKIT_API_VERSION >= 9
+ F32 x = message_in.getValueReal("x");
+ F32 y = message_in.getValueReal("y");
+ F32 z = message_in.getValueReal("z");
+ LLQtWebKit::getInstance()->setAgentLocation( x, y, z );
+ LLQtWebKit::getInstance()->emitLocation();
+#endif
+ }
+ else
+ if(message_name == "js_agent_global_location")
+ {
+#if LLQTWEBKIT_API_VERSION >= 9
+ F32 x = message_in.getValueReal("x");
+ F32 y = message_in.getValueReal("y");
+ F32 z = message_in.getValueReal("z");
+ LLQtWebKit::getInstance()->setAgentGlobalLocation( x, y, z );
+ LLQtWebKit::getInstance()->emitLocation();
+#endif
+ }
+ else
+ if(message_name == "js_agent_orientation")
+ {
+#if LLQTWEBKIT_API_VERSION >= 9
+ F32 angle = message_in.getValueReal("angle");
+ LLQtWebKit::getInstance()->setAgentOrientation( angle );
+ LLQtWebKit::getInstance()->emitLocation();
+#endif
+ }
+ else
+ if(message_name == "js_agent_region")
+ {
+#if LLQTWEBKIT_API_VERSION >= 9
+ const std::string& region = message_in.getValue("region");
+ LLQtWebKit::getInstance()->setAgentRegion( region );
+ LLQtWebKit::getInstance()->emitLocation();
+#endif
+ }
+ else
+ if(message_name == "js_agent_maturity")
+ {
+#if LLQTWEBKIT_API_VERSION >= 9
+ const std::string& maturity = message_in.getValue("maturity");
+ LLQtWebKit::getInstance()->setAgentMaturity( maturity );
+ LLQtWebKit::getInstance()->emitMaturity();
+#endif
+ }
+ else
+ if(message_name == "js_agent_language")
+ {
+#if LLQTWEBKIT_API_VERSION >= 9
+ const std::string& language = message_in.getValue("language");
+ LLQtWebKit::getInstance()->setAgentLanguage( language );
+ LLQtWebKit::getInstance()->emitLanguage();
+#endif
+ }
+ else
{
// std::cerr << "MediaPluginWebKit::receiveMessage: unknown media message: " << message_string << std::endl;
}
@@ -1325,3 +1391,4 @@ int init_media_plugin(LLPluginInstance::sendMessageFunction host_send_func, void
return 0;
}
+
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 2ecce0ebd3..6292ee97c8 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -76,6 +76,8 @@ include_directories(
)
set(viewer_SOURCE_FILES
+ groupchatlistener.cpp
+ llaccountingquotamanager.cpp
llagent.cpp
llagentaccess.cpp
llagentcamera.cpp
@@ -118,7 +120,6 @@ set(viewer_SOURCE_FILES
llchiclet.cpp
llclassifiedinfo.cpp
llclassifiedstatsresponder.cpp
- llcloud.cpp
llcofwearables.cpp
llcolorswatch.cpp
llcommanddispatcherlistener.cpp
@@ -129,6 +130,7 @@ set(viewer_SOURCE_FILES
llcurrencyuimanager.cpp
llcylinder.cpp
lldateutil.cpp
+ lldaycyclemanager.cpp
lldebugmessagebox.cpp
lldebugview.cpp
lldelayedgestureerror.cpp
@@ -149,6 +151,8 @@ set(viewer_SOURCE_FILES
lldriverparam.cpp
lldynamictexture.cpp
llemote.cpp
+ llenvmanager.cpp
+ llestateinfomodel.cpp
lleventnotifier.cpp
lleventpoll.cpp
llexpandabletextbox.cpp
@@ -177,9 +181,12 @@ set(viewer_SOURCE_FILES
llfloaterbuyland.cpp
llfloatercamera.cpp
llfloatercolorpicker.cpp
- llfloaterdaycycle.cpp
+ llfloaterdeleteenvpreset.cpp
llfloaterdisplayname.cpp
- llfloaterenvsettings.cpp
+ llfloatereditdaycycle.cpp
+ llfloatereditsky.cpp
+ llfloatereditwater.cpp
+ llfloaterenvironmentsettings.cpp
llfloaterevent.cpp
llfloaterfonttest.cpp
llfloatergesture.cpp
@@ -202,6 +209,7 @@ set(viewer_SOURCE_FILES
llfloatermediasettings.cpp
llfloatermemleak.cpp
llfloatermodelpreview.cpp
+ llfloatermodeluploadbase.cpp
llfloatermodelwizard.cpp
llfloaternamedesc.cpp
llfloaternotificationsconsole.cpp
@@ -232,16 +240,15 @@ set(viewer_SOURCE_FILES
llfloateruipreview.cpp
llfloaterurlentry.cpp
llfloatervoiceeffect.cpp
- llfloaterwater.cpp
llfloaterwebcontent.cpp
llfloaterwhitelistentry.cpp
- llfloaterwindlight.cpp
llfloaterwindowsize.cpp
llfloaterworldmap.cpp
llfolderview.cpp
llfolderviewitem.cpp
llfollowcam.cpp
llfriendcard.cpp
+ llgesturelistener.cpp
llgesturemgr.cpp
llgiveinventory.cpp
llglsandbox.cpp
@@ -319,6 +326,7 @@ set(viewer_SOURCE_FILES
llnearbychat.cpp
llnearbychatbar.cpp
llnearbychathandler.cpp
+ llnearbychatbarlistener.cpp
llnetmap.cpp
llnotificationalerthandler.cpp
llnotificationgrouphandler.cpp
@@ -357,6 +365,9 @@ set(viewer_SOURCE_FILES
llpanellogin.cpp
llpanelloginlistener.cpp
llpanelmaininventory.cpp
+ llpanelmarketplaceinbox.cpp
+ llpanelmarketplaceinboxinventory.cpp
+ llpanelmarketplaceoutbox.cpp
llpanelmediasettingsgeneral.cpp
llpanelmediasettingspermissions.cpp
llpanelmediasettingssecurity.cpp
@@ -407,6 +418,7 @@ set(viewer_SOURCE_FILES
llproductinforequest.cpp
llprogressview.cpp
llrecentpeople.cpp
+ llregioninfomodel.cpp
llregionposition.cpp
llremoteparcelrequest.cpp
llsavedsettingsglue.cpp
@@ -492,6 +504,7 @@ set(viewer_SOURCE_FILES
lltranslate.cpp
lluilistener.cpp
lluploaddialog.cpp
+ lluploadfloaterobservers.cpp
llurl.cpp
llurldispatcher.cpp
llurldispatcherlistener.cpp
@@ -515,7 +528,7 @@ set(viewer_SOURCE_FILES
llviewerfloaterreg.cpp
llviewerfoldertype.cpp
llviewergenericmessage.cpp
- llviewergesture.cpp
+ llviewergesture.cpp
llviewerhelp.cpp
llviewerhelputil.cpp
llviewerhome.cpp
@@ -562,7 +575,6 @@ set(viewer_SOURCE_FILES
llvoavatardefines.cpp
llvoavatarself.cpp
llvocache.cpp
- llvoclouds.cpp
llvograss.cpp
llvoground.cpp
llvoicecallhandler.cpp
@@ -591,6 +603,7 @@ set(viewer_SOURCE_FILES
llwind.cpp
llwlanimator.cpp
llwldaycycle.cpp
+ llwlhandlers.cpp
llwlparammanager.cpp
llwlparamset.cpp
llworld.cpp
@@ -624,6 +637,8 @@ endif (LINUX)
set(viewer_HEADER_FILES
CMakeLists.txt
ViewerInstall.cmake
+ groupchatlistener.h
+ llaccountingquotamanager.h
llagent.h
llagentaccess.h
llagentcamera.h
@@ -667,7 +682,6 @@ set(viewer_HEADER_FILES
llchiclet.h
llclassifiedinfo.h
llclassifiedstatsresponder.h
- llcloud.h
llcofwearables.h
llcolorswatch.h
llcommanddispatcherlistener.h
@@ -678,6 +692,7 @@ set(viewer_HEADER_FILES
llcurrencyuimanager.h
llcylinder.h
lldateutil.h
+ lldaycyclemanager.h
lldebugmessagebox.h
lldebugview.h
lldelayedgestureerror.h
@@ -688,7 +703,6 @@ set(viewer_HEADER_FILES
lldrawpoolalpha.h
lldrawpoolavatar.h
lldrawpoolbump.h
- lldrawpoolclouds.h
lldrawpoolground.h
lldrawpoolsimple.h
lldrawpoolsky.h
@@ -699,6 +713,8 @@ set(viewer_HEADER_FILES
lldriverparam.h
lldynamictexture.h
llemote.h
+ llenvmanager.h
+ llestateinfomodel.h
lleventnotifier.h
lleventpoll.h
llexpandabletextbox.h
@@ -727,9 +743,12 @@ set(viewer_HEADER_FILES
llfloaterbuyland.h
llfloatercamera.h
llfloatercolorpicker.h
- llfloaterdaycycle.h
+ llfloaterdeleteenvpreset.h
llfloaterdisplayname.h
- llfloaterenvsettings.h
+ llfloatereditdaycycle.h
+ llfloatereditsky.h
+ llfloatereditwater.h
+ llfloaterenvironmentsettings.h
llfloaterevent.h
llfloaterfonttest.h
llfloatergesture.h
@@ -752,6 +771,7 @@ set(viewer_HEADER_FILES
llfloatermediasettings.h
llfloatermemleak.h
llfloatermodelpreview.h
+ llfloatermodeluploadbase.h
llfloatermodelwizard.h
llfloaternamedesc.h
llfloaternotificationsconsole.h
@@ -782,10 +802,8 @@ set(viewer_HEADER_FILES
llfloateruipreview.h
llfloaterurlentry.h
llfloatervoiceeffect.h
- llfloaterwater.h
llfloaterwebcontent.h
llfloaterwhitelistentry.h
- llfloaterwindlight.h
llfloaterwindowsize.h
llfloaterworldmap.h
llfolderview.h
@@ -793,6 +811,7 @@ set(viewer_HEADER_FILES
llfolderviewitem.h
llfollowcam.h
llfriendcard.h
+ llgesturelistener.h
llgesturemgr.h
llgiveinventory.h
llgroupactions.h
@@ -869,6 +888,7 @@ set(viewer_HEADER_FILES
llnearbychat.h
llnearbychatbar.h
llnearbychathandler.h
+ llnearbychatbarlistener.h
llnetmap.h
llnotificationhandler.h
llnotificationmanager.h
@@ -901,6 +921,9 @@ set(viewer_HEADER_FILES
llpanellogin.h
llpanelloginlistener.h
llpanelmaininventory.h
+ llpanelmarketplaceinbox.h
+ llpanelmarketplaceinboxinventory.h
+ llpanelmarketplaceoutbox.h
llpanelmediasettingsgeneral.h
llpanelmediasettingspermissions.h
llpanelmediasettingssecurity.h
@@ -951,6 +974,7 @@ set(viewer_HEADER_FILES
llproductinforequest.h
llprogressview.h
llrecentpeople.h
+ llregioninfomodel.h
llregionposition.h
llremoteparcelrequest.h
llresourcedata.h
@@ -990,7 +1014,7 @@ set(viewer_HEADER_FILES
llsurface.h
llsurfacepatch.h
llsyswellitem.h
- llsyswellwindow.h
+ llsyswellwindow.h
lltable.h
llteleporthistory.h
llteleporthistorystorage.h
@@ -1039,6 +1063,7 @@ set(viewer_HEADER_FILES
lluiconstants.h
lluilistener.h
lluploaddialog.h
+ lluploadfloaterobservers.h
llurl.h
llurldispatcher.h
llurldispatcherlistener.h
@@ -1062,7 +1087,7 @@ set(viewer_HEADER_FILES
llviewerfloaterreg.h
llviewerfoldertype.h
llviewergenericmessage.h
- llviewergesture.h
+ llviewergesture.h
llviewerhelp.h
llviewerhome.h
llviewerinventory.h
@@ -1106,7 +1131,6 @@ set(viewer_HEADER_FILES
llvoavatardefines.h
llvoavatarself.h
llvocache.h
- llvoclouds.h
llvograss.h
llvoground.h
llvoicechannel.h
@@ -1135,6 +1159,7 @@ set(viewer_HEADER_FILES
llwind.h
llwlanimator.h
llwldaycycle.h
+ llwlhandlers.h
llwlparammanager.h
llwlparamset.h
llworld.h
@@ -1217,7 +1242,7 @@ if (WINDOWS)
# precompiled header configuration
# llviewerprecompiledheaders.cpp generates
# the .pch file.
- # All sources added to viewer_SOURCE_FILES
+ # All sources added to viewer_SOURCE_FILES
# at this point use it.
if(USE_PRECOMPILED_HEADERS)
set_source_files_properties(llviewerprecompiledheaders.cpp
@@ -1226,7 +1251,7 @@ if (WINDOWS)
)
set(viewer_SOURCE_FILES "${viewer_SOURCE_FILES}" llviewerprecompiledheaders.cpp)
endif(USE_PRECOMPILED_HEADERS)
-
+
# Add resource files to the project.
# viewerRes.rc is the only buildable file, but
# the rest are all dependencies of it.
@@ -1271,8 +1296,8 @@ if (WINDOWS)
set_source_files_properties(${viewer_RESOURCE_FILES}
PROPERTIES HEADER_FILE_ONLY TRUE)
- set(viewer_RESOURCE_FILES
- res/viewerRes.rc
+ set(viewer_RESOURCE_FILES
+ res/viewerRes.rc
${viewer_RESOURCE_FILES}
)
@@ -1280,7 +1305,7 @@ if (WINDOWS)
if (NOT STANDALONE)
list(APPEND viewer_SOURCE_FILES ${viewer_RESOURCE_FILES})
- endif (NOT STANDALONE)
+ endif (NOT STANDALONE)
find_library(DINPUT_LIBRARY dinput8 ${DIRECTX_LIBRARY_DIR})
find_library(DXGUID_LIBRARY dxguid ${DIRECTX_LIBRARY_DIR})
@@ -1457,7 +1482,7 @@ set(PACKAGE ON CACHE BOOL
"Add a package target that builds an installer package.")
if (WINDOWS)
- set_target_properties(${VIEWER_BINARY_NAME}
+ set_target_properties(${VIEWER_BINARY_NAME}
PROPERTIES
# *TODO -reenable this once we get server usage sorted out
#LINK_FLAGS "/debug /NODEFAULTLIB:LIBCMT /SUBSYSTEM:WINDOWS /INCLUDE:\"__tcmalloc\""
@@ -1489,7 +1514,7 @@ if (WINDOWS)
${SHARED_LIB_STAGING_DIR}/Debug/libtcmalloc_minimal-debug.dll
)
endif(USE_GOOGLE_PERFTOOLS)
-
+
set(COPY_INPUT_DEPENDENCIES
# The following commented dependencies are determined at variably at build time. Can't do this here.
@@ -1587,24 +1612,24 @@ if (WINDOWS)
--grid=${GRID}
--source=${CMAKE_CURRENT_SOURCE_DIR}
--touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/copy_touched.bat
- DEPENDS
+ DEPENDS
${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
stage_third_party_libs
${COPY_INPUT_DEPENDENCIES}
COMMENT "Performing viewer_manifest copy"
)
-
- add_custom_target(copy_w_viewer_manifest ALL DEPENDS ${CMAKE_CFG_INTDIR}/copy_touched.bat)
+
+ add_custom_target(copy_w_viewer_manifest ALL DEPENDS ${CMAKE_CFG_INTDIR}/copy_touched.bat)
add_dependencies(${VIEWER_BINARY_NAME} stage_third_party_libs llcommon copy_w_viewer_manifest)
-
+
if (EXISTS ${CMAKE_SOURCE_DIR}/copy_win_scripts)
add_dependencies(${VIEWER_BINARY_NAME} copy_win_scripts)
endif (EXISTS ${CMAKE_SOURCE_DIR}/copy_win_scripts)
-
- add_dependencies(${VIEWER_BINARY_NAME}
- SLPlugin
- windows-updater
+
+ add_dependencies(${VIEWER_BINARY_NAME}
+ SLPlugin
+ windows-updater
windows-crash-logger
)
@@ -1614,7 +1639,7 @@ if (WINDOWS)
TARGET ${VIEWER_BINARY_NAME} POST_BUILD
COMMAND ${CMAKE_SOURCE_DIR}/tools/vstool/vstool.exe
ARGS
- --solution
+ --solution
${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}.sln
--workingdir
${VIEWER_BINARY_NAME}
@@ -1632,12 +1657,12 @@ if (WINDOWS)
${CMAKE_CURRENT_SOURCE_DIR}/..
${CMAKE_CURRENT_BINARY_DIR}
${CMAKE_CFG_INTDIR}
- DEPENDS
- lleventhost
+ DEPENDS
+ lleventhost
${EVENT_HOST_SCRIPTS}
${CMAKE_CURRENT_SOURCE_DIR}/event_host_manifest.py
)
-
+
add_custom_command(
OUTPUT ${CMAKE_CFG_INTDIR}/touched.bat
COMMAND ${PYTHON_EXECUTABLE}
@@ -1653,15 +1678,15 @@ if (WINDOWS)
--login_channel=${VIEWER_LOGIN_CHANNEL}
--source=${CMAKE_CURRENT_SOURCE_DIR}
--touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/touched.bat
- DEPENDS
- ${VIEWER_BINARY_NAME}
+ DEPENDS
+ ${VIEWER_BINARY_NAME}
${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
${COPY_INPUT_DEPENDENCIES}
)
- add_custom_target(package ALL DEPENDS
+ add_custom_target(package ALL DEPENDS
${CMAKE_CFG_INTDIR}/touched.bat
- windows-setup-build-all
+ windows-setup-build-all
)
# temporarily disable packaging of event_host until hg subrepos get
# sorted out on the parabuild cluster...
@@ -1729,7 +1754,7 @@ else (USE_KDU)
${LLIMAGEJ2COJ_LIBRARIES}
)
endif (USE_KDU)
-
+
build_version(viewer)
set(ARTWORK_DIR ${CMAKE_CURRENT_SOURCE_DIR} CACHE PATH
@@ -1788,13 +1813,13 @@ if (LINUX)
--dest=${CMAKE_CURRENT_BINARY_DIR}/packaged
--grid=${GRID}
--source=${CMAKE_CURRENT_SOURCE_DIR}
- DEPENDS
+ DEPENDS
${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
${COPY_INPUT_DEPENDENCIES}
COMMENT "Performing viewer_manifest copy"
)
-
- add_custom_target(copy_l_viewer_manifest ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/.${product}.copy_touched)
+
+ add_custom_target(copy_l_viewer_manifest ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/.${product}.copy_touched)
if (PACKAGE)
add_custom_target(package ALL DEPENDS ${product}.tar.bz2)
@@ -1839,7 +1864,7 @@ if (DARWIN)
add_dependencies(${VIEWER_BINARY_NAME} SLPlugin media_plugin_quicktime media_plugin_webkit mac-updater mac-crash-logger)
if (PACKAGE)
- add_custom_target(package ALL DEPENDS ${VIEWER_BINARY_NAME})
+ add_custom_target(package ALL DEPENDS ${VIEWER_BINARY_NAME})
add_custom_command(
TARGET package POST_BUILD
@@ -1934,7 +1959,7 @@ if (LL_TESTS)
)
##################################################
- # DISABLING PRECOMPILED HEADERS USAGE FOR TESTS
+ # DISABLING PRECOMPILED HEADERS USAGE FOR TESTS
##################################################
# if(USE_PRECOMPILED_HEADERS)
# set_source_files_properties(
@@ -1948,33 +1973,33 @@ if (LL_TESTS)
#set(TEST_DEBUG on)
set(test_sources llcapabilitylistener.cpp)
##################################################
- # DISABLING PRECOMPILED HEADERS USAGE FOR TESTS
+ # DISABLING PRECOMPILED HEADERS USAGE FOR TESTS
##################################################
# if(USE_PRECOMPILED_HEADERS)
# set(test_sources "${test_sources}" llviewerprecompiledheaders.cpp)
# endif(USE_PRECOMPILED_HEADERS)
- set(test_libs
- ${LLMESSAGE_LIBRARIES}
- ${WINDOWS_LIBRARIES}
+ set(test_libs
+ ${LLMESSAGE_LIBRARIES}
+ ${WINDOWS_LIBRARIES}
${LLVFS_LIBRARIES}
${LLMATH_LIBRARIES}
- ${LLCOMMON_LIBRARIES}
+ ${LLCOMMON_LIBRARIES}
${GOOGLEMOCK_LIBRARIES}
)
- LL_ADD_INTEGRATION_TEST(llcapabilitylistener
- "${test_sources}"
+ LL_ADD_INTEGRATION_TEST(llcapabilitylistener
+ "${test_sources}"
"${test_libs}"
${PYTHON_EXECUTABLE}
"${CMAKE_SOURCE_DIR}/llmessage/tests/test_llsdmessage_peer.py"
)
- set(test_libs
- ${LLMESSAGE_LIBRARIES}
- ${WINDOWS_LIBRARIES}
+ set(test_libs
+ ${LLMESSAGE_LIBRARIES}
+ ${WINDOWS_LIBRARIES}
${LLVFS_LIBRARIES}
${LLMATH_LIBRARIES}
- ${LLCOMMON_LIBRARIES}
+ ${LLCOMMON_LIBRARIES}
${GOOGLEMOCK_LIBRARIES}
${OPENSSL_LIBRARIES}
${CRYPTO_LIBRARIES}
@@ -2022,6 +2047,22 @@ if (LL_TESTS)
#ADD_VIEWER_BUILD_TEST(lltextureinfodetails viewer)
#ADD_VIEWER_BUILD_TEST(lltexturestatsuploader viewer)
+include(LLAddBuildTest)
+SET(viewer_TEST_SOURCE_FILES
+ llagentaccess.cpp
+ llwlparammanager.cpp
+ # Not *actually* a unit test, it's an integration test.
+ # Because it won't work in the new unit test iface, i've commented out
+ # and notified Nat. Delete this when it's replaced!
+ # + poppy & brad 2009-06-05
+ # llcapabilitylistener.cpp
+ )
+set_source_files_properties(
+ ${viewer_TEST_SOURCE_FILES}
+ PROPERTIES
+ LL_TEST_ADDITIONAL_SOURCE_FILES llviewerprecompiledheaders.cpp
+ )
+
endif (LL_TESTS)
check_message_template(${VIEWER_BINARY_NAME})
diff --git a/indra/newview/app_settings/cmd_line.xml b/indra/newview/app_settings/cmd_line.xml
index 89e5949fbe..15434f2b8f 100644
--- a/indra/newview/app_settings/cmd_line.xml
+++ b/indra/newview/app_settings/cmd_line.xml
@@ -220,8 +220,7 @@
<map>
<key>desc</key>
<string>Set the detail level.
- 0 - low, 1 - medium, 2 - high, 3 - ultra
- </string>
+0 - low, 1 - medium, 2 - high, 3 - ultra</string>
<key>count</key>
<integer>1</integer>
</map>
@@ -229,10 +228,7 @@
<key>setdefault</key>
<map>
<key>desc</key>
- <string> specify the value of a particular
- configuration variable which can be
- overridden by settings.xml
- </string>
+ <string>specify the value of a particular configuration variable which can be overridden by settings.xml.</string>
<key>count</key>
<integer>2</integer>
<!-- Special case. Mapped to settings procedurally. -->
@@ -241,10 +237,7 @@
<key>set</key>
<map>
<key>desc</key>
- <string> specify the value of a particular
- configuration variable that
- overrides all other settings
- </string>
+ <string>specify the value of a particular configuration variable that overrides all other settings.</string>
<key>count</key>
<integer>2</integer>
<key>compose</key>
diff --git a/indra/newview/app_settings/keys.xml b/indra/newview/app_settings/keys.xml
index d085475c6c..6e3673e7d9 100644
--- a/indra/newview/app_settings/keys.xml
+++ b/indra/newview/app_settings/keys.xml
@@ -181,7 +181,7 @@
<binding key="PAD_DIVIDE" mask="CTL_ALT_SHIFT" command="start_gesture"/>
</third_person>
- # Basic editing camera control
+ <!-- Basic editing camera control -->
<edit>
<binding key="A" mask="NONE" command="spin_around_cw"/>
<binding key="D" mask="NONE" command="spin_around_ccw"/>
diff --git a/indra/newview/app_settings/keywords.ini b/indra/newview/app_settings/keywords.ini
index 263b73ba23..9fa4046fdf 100644
--- a/indra/newview/app_settings/keywords.ini
+++ b/indra/newview/app_settings/keywords.ini
@@ -498,6 +498,7 @@ PARCEL_DETAILS_OWNER Used with llGetParcelDetails to get the parcel owner id.
PARCEL_DETAILS_GROUP Used with llGetParcelDetails to get the parcel group id.
PARCEL_DETAILS_AREA Used with llGetParcelDetails to get the parcel area in square meters.
PARCEL_DETAILS_ID Used with llGetParcelDetails to get the parcel id.
+PARCEL_DETAILS_SEE_AVATARS Used with llGetParcelDetails to get the avatars visibility setting.
STRING_TRIM_HEAD Used with llStringTrim to trim leading spaces from a string.
STRING_TRIM_TAIL Used with llStringTrim to trim trailing spaces from a string.
diff --git a/indra/newview/app_settings/logcontrol.xml b/indra/newview/app_settings/logcontrol.xml
index 937c4e4c6a..9f4e89691f 100644
--- a/indra/newview/app_settings/logcontrol.xml
+++ b/indra/newview/app_settings/logcontrol.xml
@@ -20,6 +20,7 @@
<key>tags</key>
<array>
<string>AppInit</string>
+ <string>Capabilities</string>
<string>SystemInfo</string>
<string>TextureCache</string>
<string>AppCache</string>
@@ -43,6 +44,7 @@
<array>
<!-- sample entry for debugging a specific item -->
<!-- <string>Voice</string> -->
+ <string>Capabilities</string>
</array>
</map>
</array>
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 0c0807a050..b8b61f1119 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -708,6 +708,17 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>BrowserEnableJSObject</key>
+ <map>
+ <key>Comment</key>
+ <string>(WARNING: Advanced feature. Use if you are aware of the implications). Enable or disable the viewer to Javascript bridge object.</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>BlockAvatarAppearanceMessages</key>
<map>
<key>Comment</key>
@@ -1924,17 +1935,6 @@
<key>Value</key>
<integer>0</integer>
</map>
- <key>DebugShowUploadCost</key>
- <map>
- <key>Comment</key>
- <string>Show what it would cost to upload assets in current scene</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
<key>DebugShowRenderMatrices</key>
<map>
<key>Comment</key>
@@ -1968,6 +1968,17 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>DebugShowUploadCost</key>
+ <map>
+ <key>Comment</key>
+ <string>Show mesh upload cost</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
<key>DebugShowXUINames</key>
<map>
<key>Comment</key>
@@ -3047,6 +3058,17 @@
<key>Value</key>
<integer>1</integer>
</map>
+ <key>EnableGestureSounds</key>
+ <map>
+ <key>Comment</key>
+ <string>Play sounds from gestures</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
<key>EnableMouselook</key>
<map>
<key>Comment</key>
@@ -3245,17 +3267,6 @@
<key>Value</key>
<integer>1</integer>
</map>
- <key>FirstLoginThisInstall</key>
- <map>
- <key>Comment</key>
- <string>Specifies that you have not successfully logged in since you installed the latest update</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>1</integer>
- </map>
<key>FirstName</key>
<map>
<key>Comment</key>
@@ -3980,18 +3991,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://search.secondlife.com/viewer/[CATEGORY]/?q=[QUERY]&amp;p=[AUTH_TOKEN]&amp;r=[MATURITY]&amp;lang=[LANGUAGE]&amp;g=[GODLIKE]&amp;sid=[SESSION_ID]&amp;rid=[REGION_ID]&amp;pid=[PARCEL_ID]&amp;channel=[CHANNEL]&amp;version=[VERSION]&amp;major=[VERSION_MAJOR]&amp;minor=[VERSION_MINOR]&amp;patch=[VERSION_PATCH]&amp;build=[VERSION_BUILD]</string>
- </map>
- <key>SearchURLBeta</key>
- <map>
- <key>Comment</key>
- <string>URL for Search website, displayed in the Find floater</string>
- <key>Persist</key>
- <integer>0</integer>
- <key>Type</key>
- <string>String</string>
- <key>Value</key>
- <string>http://beta.search.secondlife.com/viewer/[CATEGORY]/?q=[QUERY]&amp;p=[AUTH_TOKEN]&amp;r=[MATURITY]&amp;lang=[LANGUAGE]&amp;g=[GODLIKE]&amp;sid=[SESSION_ID]&amp;rid=[REGION_ID]&amp;pid=[PARCEL_ID]&amp;channel=[CHANNEL]&amp;version=[VERSION]&amp;major=[VERSION_MAJOR]&amp;minor=[VERSION_MINOR]&amp;patch=[VERSION_PATCH]&amp;build=[VERSION_BUILD]</string>
+ <string>http://search-beta.secondlife.com/viewer/[CATEGORY]/?q=[QUERY]&amp;p=[AUTH_TOKEN]&amp;r=[MATURITY]&amp;lang=[LANGUAGE]&amp;g=[GODLIKE]&amp;sid=[SESSION_ID]&amp;rid=[REGION_ID]&amp;pid=[PARCEL_ID]&amp;channel=[CHANNEL]&amp;version=[VERSION]&amp;major=[VERSION_MAJOR]&amp;minor=[VERSION_MINOR]&amp;patch=[VERSION_PATCH]&amp;build=[VERSION_BUILD]</string>
</map>
<key>WebProfileURL</key>
<map>
@@ -4180,6 +4180,28 @@
<key>Value</key>
<real>1.0</real>
</map>
+ <key>InventoryDisplayInbox</key>
+ <map>
+ <key>Comment</key>
+ <string>Override received items inventory inbox display</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>InventoryDisplayOutbox</key>
+ <map>
+ <key>Comment</key>
+ <string>Override merchant inventory outbox display</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>InventoryLinking</key>
<map>
<key>Comment</key>
@@ -4422,6 +4444,17 @@
<key>Value</key>
<real>2.0</real>
</map>
+ <key>LastInventoryInboxExpand</key>
+ <map>
+ <key>Comment</key>
+ <string>The last time the received items inbox was expanded.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string />
+ </map>
<key>LCDDestination</key>
<map>
<key>Comment</key>
@@ -4839,7 +4872,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string />
+ <string>http://viewer-login.agni.lindenlab.com/</string>
</map>
<key>LosslessJ2CUpload</key>
<map>
@@ -4861,7 +4894,7 @@
<key>Type</key>
<string>F32</string>
<key>Value</key>
- <real>20.0</real>
+ <real>60.0</real>
</map>
<key>MapOverlayIndex</key>
<map>
@@ -5587,12 +5620,12 @@
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
- <real>0</real>
+ <real>1</real>
</map>
- <key>MeshUseWholeModelUpload</key>
+ <key>MeshUploadLogXML</key>
<map>
<key>Comment</key>
- <string>Upload model in its entirety instead of mesh-by-mesh (new caps)</string>
+ <string>Verbose XML logging on mesh upload</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -5600,6 +5633,28 @@
<key>Value</key>
<real>0</real>
</map>
+ <key>MeshUploadFakeErrors</key>
+ <map>
+ <key>Comment</key>
+ <string>Force upload errors (for testing)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <real>0</real>
+ </map>
+ <key>MeshUploadTimeOut</key>
+ <map>
+ <key>Comment</key>
+ <string>Maximum time in seconds for llcurl to execute a mesh uoloading request</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <real>600</real>
+ </map>
<key>MigrateCacheDirectory</key>
<map>
<key>Comment</key>
@@ -6535,7 +6590,28 @@
<key>Value</key>
<integer>0</integer>
</map>
-
+ <key>PostFirstLoginIntroURL</key>
+ <map>
+ <key>Comment</key>
+ <string>URL of intro presenatation after first time users first login</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string></string>
+ </map>
+ <key>PostFirstLoginIntroViewed</key>
+ <map>
+ <key>Comment</key>
+ <string>Flag indicating if user has seen intro presenatation after first time users first login</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <string>0</string>
+ </map>
<key>PrecachingDelay</key>
<map>
<key>Comment</key>
@@ -7102,6 +7178,75 @@
<key>Value</key>
<integer>1</integer>
</map>
+
+ <key>OctreeMaxNodeCapacity</key>
+ <map>
+ <key>Comment</key>
+ <string>Maximum number of elements to store in a single octree node</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <integer>128</integer>
+ </map>
+
+ <key>OctreeStaticObjectSizeFactor</key>
+ <map>
+ <key>Comment</key>
+ <string>Multiplier on static object size for determining octree node size </string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>4</integer>
+ </map>
+
+ <key>OctreeAlphaDistanceFactor</key>
+ <map>
+ <key>Comment</key>
+ <string>Multiplier on alpha object distance for determining octree node size </string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Vector3</string>
+ <key>Value</key>
+ <array>
+ <real>0.1</real>
+ <real>0.0</real>
+ <real>0.0</real>
+ </array>
+ </map>
+
+ <key>OctreeAttachmentSizeFactor</key>
+ <map>
+ <key>Comment</key>
+ <string>Multiplier on attachment size for determining octree node size </string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>4</integer>
+ </map>
+
+ <key>OctreeDistanceFactor</key>
+ <map>
+ <key>Comment</key>
+ <string>Multiplier on distance for determining octree node size </string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Vector3</string>
+ <key>Value</key>
+ <array>
+ <real>0.01</real>
+ <real>0.0</real>
+ <real>0.0</real>
+ </array>
+ </map>
+
<key>RenderAnisotropic</key>
<map>
<key>Comment</key>
@@ -7281,7 +7426,7 @@
<key>Type</key>
<string>F32</string>
<key>Value</key>
- <integer>1.0</integer>
+ <real>1.0</real>
</map>
<key>RenderAvatarVP</key>
<map>
@@ -7537,6 +7682,17 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>RenderMaxTextureIndex</key>
+ <map>
+ <key>Comment</key>
+ <string>Maximum texture index to use for indexed texture rendering.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <integer>6</integer>
+ </map>
<key>RenderDebugTextureBind</key>
<map>
<key>Comment</key>
@@ -8682,7 +8838,7 @@
<key>Type</key>
<string>S32</string>
<key>Value</key>
- <integer>8192</integer>
+ <integer>65536</integer>
</map>
<key>RenderMaxVBOSize</key>
<map>
@@ -8960,17 +9116,6 @@
<key>Value</key>
<integer>0</integer>
</map>
- <key>RenderUseTriStrips</key>
- <map>
- <key>Comment</key>
- <string>Use triangle strips for rendering prims.</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
<key>RenderUseFarClip</key>
<map>
<key>Comment</key>
@@ -9035,7 +9180,7 @@
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
- <integer>1</integer>
+ <integer>0</integer>
</map>
<key>RenderUseStreamVBO</key>
<map>
@@ -9136,28 +9281,51 @@
<key>Value</key>
<real>1.0</real>
</map>
- <key>MeshStreamingCostScaler</key>
+ <key>MeshTriangleBudget</key>
<map>
<key>Comment</key>
- <string>DEBUG</string>
+ <string>Target visible triangle budget to use when estimating streaming cost.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
- <string>F32</string>
+ <string>U32</string>
<key>Value</key>
- <real>3.0</real>
+ <real>250000</real>
</map>
- <key>MeshThreadCount</key>
+ <key>MeshMetaDataDiscount</key>
<map>
<key>Comment</key>
- <string>Number of threads to use for loading meshes.</string>
+ <string>Number of bytes to deduct for metadata when determining streaming cost.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <real>384</real>
+ </map>
+ <key>MeshMinimumByteSize</key>
+ <map>
+ <key>Comment</key>
+ <string>Minimum number of bytes per LoD block when determining streaming cost.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <real>16</real>
+ </map>
+ <key>MeshBytesPerTriangle</key>
+ <map>
+ <key>Comment</key>
+ <string>Approximation of bytes per triangle to use for determining mesh streaming cost.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>U32</string>
<key>Value</key>
- <integer>8</integer>
+ <real>16</real>
</map>
+
<key>MeshMaxConcurrentRequests</key>
<map>
<key>Comment</key>
@@ -9389,6 +9557,17 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>ShowAdvancedBuilderOptions</key>
+ <map>
+ <key>Comment</key>
+ <string>Shows physics and display weight</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>ShowAdvancedGraphicsSettings</key>
<map>
<key>Comment</key>
@@ -9629,7 +9808,7 @@
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
- <integer>0</integer>
+ <integer>1</integer>
</map>
<key>ShowSnapshotButton</key>
<map>
@@ -9741,6 +9920,17 @@
<key>Value</key>
<integer>1</integer>
</map>
+ <key>NearbyListShowMap</key>
+ <map>
+ <key>Comment</key>
+ <string>Show/hide map above nearby people list</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
<key>NearbyListShowIcons</key>
<map>
<key>Comment</key>
@@ -10228,17 +10418,6 @@
<key>Value</key>
<real>0.300000011921</real>
</map>
- <key>SkyEditPresets</key>
- <map>
- <key>Comment</key>
- <string>Whether to be able to edit the sky defaults or not</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
<key>SkyNightColorShift</key>
<map>
<key>Comment</key>
@@ -10280,17 +10459,6 @@
<real>0.1</real>
</array>
</map>
- <key>SkyUseClassicClouds</key>
- <map>
- <key>Comment</key>
- <string>Whether to use the old Second Life particle clouds or not</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>1</integer>
- </map>
<key>SnapEnabled</key>
<map>
<key>Comment</key>
@@ -10905,7 +11073,7 @@
<key>Type</key>
<string>S32</string>
<key>Value</key>
- <real>-2</real>
+ <real>-1</real>
</map>
<key>UIExtraTriangleWidth</key>
<map>
@@ -10916,7 +11084,7 @@
<key>Type</key>
<string>S32</string>
<key>Value</key>
- <real>2</real>
+ <real>4</real>
</map>
<key>UIFloaterCloseBoxSize</key>
<map>
@@ -11908,6 +12076,61 @@
<key>Value</key>
<integer>1</integer>
</map>
+ <key>UseEnvironmentFromRegion</key>
+ <map>
+ <key>Comment</key>
+ <string>Choose whether to use the region's environment settings, or override them with the local settings.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>UseDayCycle</key>
+ <map>
+ <key>Comment</key>
+ <string>Whether to use use a day cycle or a fixed sky.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>WaterPresetName</key>
+ <map>
+ <key>Comment</key>
+ <string>Water preset to use. May be superseded by region settings.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>Default</string>
+ </map>
+ <key>SkyPresetName</key>
+ <map>
+ <key>Comment</key>
+ <string>Sky preset to use. May be superseded by region settings or by a day cycle (see DayCycleName).</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>Default</string>
+ </map>
+ <key>DayCycleName</key>
+ <map>
+ <key>Comment</key>
+ <string>Day cycle to use. May be superseded by region settings.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>Default</string>
+ </map>
<key>UseExternalBrowser</key>
<map>
<key>Comment</key>
@@ -12482,51 +12705,13 @@
<key>WatchdogEnabled</key>
<map>
<key>Comment</key>
- <string>Controls whether the thread watchdog timer is activated.</string>
+ <string>Controls whether the thread watchdog timer is activated. Value is boolean. Set to -1 to defer to built-in default.</string>
<key>Persist</key>
<integer>0</integer>
<key>Type</key>
<string>S32</string>
<key>Value</key>
- <integer>-1</integer>
- </map>
- <key>WaterEditPresets</key>
- <map>
- <key>Comment</key>
- <string>Whether to be able to edit the water defaults or not</string>
- <key>Persist</key>
<integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
- <key>WaterFogColor</key>
- <map>
- <key>Comment</key>
- <string>Water fog color</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Color4</string>
- <key>Value</key>
- <array>
- <real>0.0863</real>
- <real>0.168</real>
- <real>0.212</real>
- <real>0</real>
- </array>
- </map>
- <key>WaterFogDensity</key>
- <map>
- <key>Comment</key>
- <string>Water fog density</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>F32</string>
- <key>Value</key>
- <real>16.0</real>
</map>
<key>WaterGLFogDensityScale</key>
<map>
@@ -12836,6 +13021,17 @@
<key>Value</key>
<integer>1</integer>
</map>
+ <key>SLURLPassToOtherInstance</key>
+ <map>
+ <key>Comment</key>
+ <string>Pass execution to prevoius viewer instances if there is a given slurl</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
<key>soundsbeacon</key>
<map>
<key>Comment</key>
@@ -13331,5 +13527,43 @@
<key>Value</key>
<integer>1</integer>
</map>
+ <key>WebProfileRect</key>
+ <map>
+ <key>Comment</key>
+ <string>Web profile dimensions</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Rect</string>
+ <key>Value</key>
+ <array>
+ <integer>0</integer>
+ <integer>650</integer>
+ <integer>490</integer>
+ <integer>0</integer>
+ </array>
+ </map>
+ <key>HelpFloaterOpen</key>
+ <map>
+ <key>Comment</key>
+ <string>Show Help Floater on login?</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>0</integer>
+ </map>
</map>
</llsd>
diff --git a/indra/newview/app_settings/settings_files.xml b/indra/newview/app_settings/settings_files.xml
index 079a54f957..bfc09286e3 100644
--- a/indra/newview/app_settings/settings_files.xml
+++ b/indra/newview/app_settings/settings_files.xml
@@ -20,7 +20,8 @@
file_name="settings.xml"
file_name_setting="ClientSettingsFile"/>
<file name="CrashSettings"
- file_name="settings_crash_behavior"/>
+ file_name="settings_crash_behavior.xml"
+ file_name_setting="CrashSettingsFile"/>
<file name="Warnings"
file_name="ignorable_dialogs.xml"
file_name_setting="WarningSettingsFile"/>
@@ -61,4 +62,4 @@
file_name="colors.xml"
file_name_setting="SkinningSettingsFile"/>
</group>
-</settings_files> \ No newline at end of file
+</settings_files>
diff --git a/indra/newview/app_settings/settings_minimal.xml b/indra/newview/app_settings/settings_minimal.xml
index 70a75cb4ca..29e52ab054 100644
--- a/indra/newview/app_settings/settings_minimal.xml
+++ b/indra/newview/app_settings/settings_minimal.xml
@@ -459,5 +459,16 @@
<key>Value</key>
<integer>0</integer>
</map>
- </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>
diff --git a/indra/newview/app_settings/shaders/class1/avatar/avatarF.glsl b/indra/newview/app_settings/shaders/class1/avatar/avatarF.glsl
index 3f6b8b3323..b0fa0ddd3e 100644
--- a/indra/newview/app_settings/shaders/class1/avatar/avatarF.glsl
+++ b/indra/newview/app_settings/shaders/class1/avatar/avatarF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
void default_lighting();
diff --git a/indra/newview/app_settings/shaders/class1/avatar/avatarSkinV.glsl b/indra/newview/app_settings/shaders/class1/avatar/avatarSkinV.glsl
index 1ad87badfe..d9f29ced4f 100644
--- a/indra/newview/app_settings/shaders/class1/avatar/avatarSkinV.glsl
+++ b/indra/newview/app_settings/shaders/class1/avatar/avatarSkinV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
attribute vec4 weight; //1
diff --git a/indra/newview/app_settings/shaders/class1/avatar/avatarV.glsl b/indra/newview/app_settings/shaders/class1/avatar/avatarV.glsl
index a15846f192..2796222c68 100644
--- a/indra/newview/app_settings/shaders/class1/avatar/avatarV.glsl
+++ b/indra/newview/app_settings/shaders/class1/avatar/avatarV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
mat4 getSkinnedTransform();
diff --git a/indra/newview/app_settings/shaders/class1/avatar/eyeballF.glsl b/indra/newview/app_settings/shaders/class1/avatar/eyeballF.glsl
index 05fe100372..d86ef19a04 100644
--- a/indra/newview/app_settings/shaders/class1/avatar/eyeballF.glsl
+++ b/indra/newview/app_settings/shaders/class1/avatar/eyeballF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
void default_lighting();
diff --git a/indra/newview/app_settings/shaders/class1/avatar/eyeballV.glsl b/indra/newview/app_settings/shaders/class1/avatar/eyeballV.glsl
index 4b8a7604a1..2eb814bd91 100644
--- a/indra/newview/app_settings/shaders/class1/avatar/eyeballV.glsl
+++ b/indra/newview/app_settings/shaders/class1/avatar/eyeballV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
vec4 calcLightingSpecular(vec3 pos, vec3 norm, vec4 color, inout vec4 specularColor, vec4 baseCol);
void calcAtmospherics(vec3 inPositionEye);
diff --git a/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl b/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl
index ef823c28b1..7613e50dca 100644
--- a/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl
+++ b/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl
@@ -5,7 +5,7 @@
* $License$
*/
-#version 120
+
attribute vec4 object_weight;
diff --git a/indra/newview/app_settings/shaders/class1/avatar/pickAvatarF.glsl b/indra/newview/app_settings/shaders/class1/avatar/pickAvatarF.glsl
index 27ac59a840..2638351e96 100644
--- a/indra/newview/app_settings/shaders/class1/avatar/pickAvatarF.glsl
+++ b/indra/newview/app_settings/shaders/class1/avatar/pickAvatarF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
uniform sampler2D diffuseMap;
diff --git a/indra/newview/app_settings/shaders/class1/avatar/pickAvatarV.glsl b/indra/newview/app_settings/shaders/class1/avatar/pickAvatarV.glsl
index f1aa549a47..86b189b282 100644
--- a/indra/newview/app_settings/shaders/class1/avatar/pickAvatarV.glsl
+++ b/indra/newview/app_settings/shaders/class1/avatar/pickAvatarV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
mat4 getSkinnedTransform();
diff --git a/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl b/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl
index 3b12a07a27..4a0815a163 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl
@@ -5,13 +5,14 @@
* $/LicenseInfo$
*/
-#version 120
+
#extension GL_ARB_texture_rectangle : enable
-uniform sampler2D diffuseMap;
uniform sampler2DRect depthMap;
+vec4 diffuseLookup(vec2 texcoord);
+
uniform mat4 shadow_matrix[6];
uniform vec4 shadow_clip;
uniform vec2 screen_res;
@@ -47,7 +48,7 @@ void main()
vec4 pos = vec4(vary_position, 1.0);
- vec4 diff= texture2D(diffuseMap, gl_TexCoord[0].xy);
+ vec4 diff= diffuseLookup(gl_TexCoord[0].xy);
vec4 col = vec4(vary_ambient + vary_directional.rgb, gl_Color.a);
vec4 color = diff * col;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/alphaNonIndexedF.glsl b/indra/newview/app_settings/shaders/class1/deferred/alphaNonIndexedF.glsl
new file mode 100644
index 0000000000..b0d029dbf4
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/alphaNonIndexedF.glsl
@@ -0,0 +1,67 @@
+/**
+ * @file alphaF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/LicenseInfo$
+ */
+
+
+
+#extension GL_ARB_texture_rectangle : enable
+
+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;
+
+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,gl_TexCoord[0].xy);
+
+ vec4 col = vec4(vary_ambient + vary_directional.rgb, gl_Color.a);
+ 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;
+ //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/alphaSkinnedV.glsl b/indra/newview/app_settings/shaders/class1/deferred/alphaSkinnedV.glsl
index 5addbbb176..ac3f7189c2 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/alphaSkinnedV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/alphaSkinnedV.glsl
@@ -5,7 +5,7 @@
* $License$
*/
-#version 120
+
vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
mat4 getObjectSkinnedTransform();
@@ -35,19 +35,24 @@ float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, floa
//get distance
float d = length(lv);
- //normalize light vector
- lv *= 1.0/d;
+ float da = 0.0;
+
+ if (d > 0.0 && la > 0.0 && fa > 0.0)
+ {
+ //normalize light vector
+ lv *= 1.0/d;
- //distance attenuation
- float dist2 = d*d/(la*la);
- float da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
+ //distance attenuation
+ float dist2 = d*d/(la*la);
+ da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
- // spotlight coefficient.
- float spot = max(dot(-ln, lv), is_pointlight);
- da *= spot*spot; // GL_SPOT_EXPONENT=2
+ // spotlight coefficient.
+ float spot = max(dot(-ln, lv), is_pointlight);
+ da *= spot*spot; // GL_SPOT_EXPONENT=2
- //angular attenuation
- da *= calcDirectionalLight(n, lv);
+ //angular attenuation
+ da *= calcDirectionalLight(n, lv);
+ }
return da;
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl b/indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl
index 525b68c437..44cb78e914 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
void calcAtmospherics(vec3 inPositionEye);
@@ -23,6 +23,7 @@ varying vec3 vary_fragcoord;
varying vec3 vary_position;
varying vec3 vary_light;
varying vec3 vary_pointlight_col;
+varying float vary_texture_index;
uniform float near_clip;
uniform float shadow_offset;
@@ -36,19 +37,24 @@ float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, floa
//get distance
float d = length(lv);
- //normalize light vector
- lv *= 1.0/d;
+ float da = 0.0;
+
+ if (d > 0.0 && la > 0.0 && fa > 0.0)
+ {
+ //normalize light vector
+ lv *= 1.0/d;
- //distance attenuation
- float dist2 = d*d/(la*la);
- float da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
+ //distance attenuation
+ float dist2 = d*d/(la*la);
+ da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
- // spotlight coefficient.
- float spot = max(dot(-ln, lv), is_pointlight);
- da *= spot*spot; // GL_SPOT_EXPONENT=2
+ // spotlight coefficient.
+ float spot = max(dot(-ln, lv), is_pointlight);
+ da *= spot*spot; // GL_SPOT_EXPONENT=2
- //angular attenuation
- da *= calcDirectionalLight(n, lv);
+ //angular attenuation
+ da *= calcDirectionalLight(n, lv);
+ }
return da;
}
@@ -56,11 +62,13 @@ float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, floa
void main()
{
//transform vertex
- gl_Position = ftransform();
+ 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 * gl_Vertex);
+ vec4 pos = (gl_ModelViewMatrix * vert);
vec3 norm = normalize(gl_NormalMatrix * gl_Normal);
float dp_directional_light = max(0.0, dot(norm, gl_LightSource[0].position.xyz));
@@ -97,7 +105,7 @@ void main()
gl_FogFragCoord = pos.z;
- pos = gl_ModelViewProjectionMatrix * gl_Vertex;
+ pos = gl_ModelViewProjectionMatrix * 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 164322c3a7..870d593311 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/attachmentShadowF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/attachmentShadowF.glsl
@@ -5,7 +5,7 @@
* $License$
*/
-#version 120
+
uniform sampler2D diffuseMap;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/attachmentShadowV.glsl b/indra/newview/app_settings/shaders/class1/deferred/attachmentShadowV.glsl
index 5ae41cb730..c7a4f86727 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/attachmentShadowV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/attachmentShadowV.glsl
@@ -5,7 +5,7 @@
* $License$
*/
-#version 120
+
mat4 getObjectSkinnedTransform();
diff --git a/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaV.glsl b/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaV.glsl
index a2a7dea20d..68e4055cf2 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
mat4 getSkinnedTransform();
@@ -35,19 +35,24 @@ float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, floa
//get distance
float d = length(lv);
- //normalize light vector
- lv *= 1.0/d;
+ float da = 0.0;
+
+ if (d > 0.0 && la > 0.0 && fa > 0.0)
+ {
+ //normalize light vector
+ lv *= 1.0/d;
- //distance attenuation
- float dist2 = d*d/(la*la);
- float da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
+ //distance attenuation
+ float dist2 = d*d/(la*la);
+ da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
- // spotlight coefficient.
- float spot = max(dot(-ln, lv), is_pointlight);
- da *= spot*spot; // GL_SPOT_EXPONENT=2
+ // spotlight coefficient.
+ float spot = max(dot(-ln, lv), is_pointlight);
+ da *= spot*spot; // GL_SPOT_EXPONENT=2
- //angular attenuation
- da *= calcDirectionalLight(n, lv);
+ //angular attenuation
+ da *= calcDirectionalLight(n, lv);
+ }
return da;
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/avatarEyesV.glsl b/indra/newview/app_settings/shaders/class1/deferred/avatarEyesV.glsl
new file mode 100644
index 0000000000..7bc78fe407
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/avatarEyesV.glsl
@@ -0,0 +1,21 @@
+/**
+ * @file avatarEyesV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/LicenseInfo$
+ */
+
+
+
+varying vec3 vary_normal;
+
+void main()
+{
+ //transform vertex
+ gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
+ gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
+
+ vary_normal = normalize(gl_NormalMatrix * gl_Normal);
+
+ gl_FrontColor = gl_Color;
+}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/avatarF.glsl b/indra/newview/app_settings/shaders/class1/deferred/avatarF.glsl
index 9748727147..3268618093 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/avatarF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/avatarF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
uniform sampler2D diffuseMap;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/avatarShadowF.glsl b/indra/newview/app_settings/shaders/class1/deferred/avatarShadowF.glsl
index 1b7ae06888..78986ab12e 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/avatarShadowF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/avatarShadowF.glsl
@@ -5,14 +5,17 @@
* $/LicenseInfo$
*/
-#version 120
+
uniform sampler2D diffuseMap;
+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 cf6579a40d..f177fcd8f1 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/avatarShadowV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/avatarShadowV.glsl
@@ -5,12 +5,14 @@
* $/LicenseInfo$
*/
-#version 120
+
mat4 getSkinnedTransform();
attribute vec4 weight;
+varying vec4 post_pos;
+
void main()
{
gl_TexCoord[0] = gl_MultiTexCoord0;
@@ -30,8 +32,9 @@ void main()
norm = normalize(norm);
pos = gl_ProjectionMatrix * pos;
- pos.z = max(pos.z, -pos.w+0.01);
- gl_Position = 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 69c93799b5..7eac11287a 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/avatarV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/avatarV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
mat4 getSkinnedTransform();
diff --git a/indra/newview/app_settings/shaders/class1/deferred/blurLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/blurLightF.glsl
index d9f021b114..8c75c8045a 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/blurLightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/blurLightF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
#extension GL_ARB_texture_rectangle : enable
@@ -26,7 +26,7 @@ uniform vec2 screen_res;
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);
@@ -39,7 +39,7 @@ vec4 getPosition(vec2 pos_screen)
void main()
{
- vec2 tc = vary_fragcoord.xy;
+ vec2 tc = vary_fragcoord.xy;
vec3 norm = texture2DRect(normalMap, tc).xyz;
norm = vec3((norm.xy-0.5)*2.0,norm.z); // unpack norm
vec3 pos = getPosition(tc).xyz;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/blurLightMSF.glsl b/indra/newview/app_settings/shaders/class1/deferred/blurLightMSF.glsl
new file mode 100644
index 0000000000..6ca51377c1
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/blurLightMSF.glsl
@@ -0,0 +1,113 @@
+/**
+ * @file blurLightF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/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 c2d05c601a..862f809de5 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/blurLightV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/blurLightV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
varying vec2 vary_fragcoord;
uniform vec2 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 37bfaac32c..75b4dc624a 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/bumpF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/bumpF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
uniform sampler2D diffuseMap;
uniform sampler2D bumpMap;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/bumpSkinnedV.glsl b/indra/newview/app_settings/shaders/class1/deferred/bumpSkinnedV.glsl
index d884f2e4a5..dc69519a85 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/bumpSkinnedV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/bumpSkinnedV.glsl
@@ -5,7 +5,7 @@
* $License$
*/
-#version 120
+
varying vec3 vary_mat0;
varying vec3 vary_mat1;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/bumpV.glsl b/indra/newview/app_settings/shaders/class1/deferred/bumpV.glsl
index 9b109b2db6..5b6726488b 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/bumpV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/bumpV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
varying vec3 vary_mat0;
varying vec3 vary_mat1;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/cloudsF.glsl b/indra/newview/app_settings/shaders/class1/deferred/cloudsF.glsl
new file mode 100644
index 0000000000..ef300d5631
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/cloudsF.glsl
@@ -0,0 +1,79 @@
+/**
+ * @file WLCloudsF.glsl
+ *
+ * $LicenseInfo:firstyear=2005&license=viewerlgpl$
+ * $/LicenseInfo$
+ */
+
+
+
+/////////////////////////////////////////////////////////////////////////
+// The fragment shader for the sky
+/////////////////////////////////////////////////////////////////////////
+
+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;
+
+/// Soft clips the light with a gamma correction
+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()
+{
+ // Set variables
+ vec2 uv1 = gl_TexCoord[0].xy;
+ vec2 uv2 = gl_TexCoord[1].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;
+
+ // Offset texture coords
+ uv1 += cloud_pos_density1.xy; //large texture, visible density
+ uv2 += cloud_pos_density1.xy; //large texture, self shadow
+ uv3 += cloud_pos_density2.xy; //small texture, visible density
+ uv4 += cloud_pos_density2.xy; //small texture, self shadow
+
+
+ // Compute alpha1, the main cloud opacity
+ float alpha1 = (texture2D(cloud_noise_texture, uv1).x - 0.5) + (texture2D(cloud_noise_texture, uv3).x - 0.5) * cloud_pos_density2.z;
+ alpha1 = min(max(alpha1 + cloudDensity, 0.) * 10. * cloud_pos_density1.z, 1.);
+
+ // And smooth
+ alpha1 = 1. - alpha1 * alpha1;
+ alpha1 = 1. - alpha1 * alpha1;
+
+
+ // Compute alpha2, for self shadowing effect
+ // (1 - alpha2) will later be used as percentage of incoming sunlight
+ float alpha2 = (texture2D(cloud_noise_texture, uv2).x - 0.5);
+ alpha2 = min(max(alpha2 + cloudDensity, 0.) * 2.5 * cloud_pos_density1.z, 1.);
+
+ // And smooth
+ alpha2 = 1. - alpha2;
+ alpha2 = 1. - alpha2 * alpha2;
+
+ // Combine
+ vec4 color;
+ color = (cloudColorSun*(1.-alpha2) + cloudColorAmbient);
+ color *= 2.;
+
+ /// Gamma correct for WL (soft clip effect).
+ gl_FragData[0] = vec4(scaleSoftClip(color.rgb), alpha1);
+ gl_FragData[1] = vec4(0.0,0.0,0.0,0.0);
+ gl_FragData[2] = vec4(0,0,1,0);
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/deferred/cloudsV.glsl b/indra/newview/app_settings/shaders/class1/deferred/cloudsV.glsl
new file mode 100644
index 0000000000..3eac63076c
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/cloudsV.glsl
@@ -0,0 +1,165 @@
+/**
+ * @file WLCloudsV.glsl
+ *
+ * $LicenseInfo:firstyear=2005&license=viewerlgpl$
+ * $/LicenseInfo$
+ */
+
+
+
+//////////////////////////////////////////////////////////////////////////
+// The vertex shader for creating the atmospheric sky
+///////////////////////////////////////////////////////////////////////////////
+
+// Output parameters
+varying vec4 vary_CloudColorSun;
+varying vec4 vary_CloudColorAmbient;
+varying float vary_CloudDensity;
+
+// Inputs
+uniform vec3 camPosLocal;
+
+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 max_y;
+
+uniform vec4 glow;
+
+uniform vec4 cloud_color;
+
+uniform vec4 cloud_scale;
+
+void main()
+{
+
+ // World / view / projection
+ gl_Position = ftransform();
+
+ gl_TexCoord[0] = gl_MultiTexCoord0;
+
+ // Get relative position
+ vec3 P = gl_Vertex.xyz - camPosLocal.xyz + vec3(0,50,0);
+
+ // Set altitude
+ if (P.y > 0.)
+ {
+ P *= (max_y.x / P.y);
+ }
+ else
+ {
+ P *= (-32000. / P.y);
+ }
+
+ // Can normalize then
+ vec3 Pn = normalize(P);
+ float Plen = length(P);
+
+ // Initialize temp variables
+ vec4 temp1 = vec4(0.);
+ vec4 temp2 = vec4(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 + haze_density.x * 0.25) * (density_multiplier.x * max_y.x);
+
+ // Calculate relative weights
+ temp1 = blue_density + haze_density.x;
+ blue_weight = blue_density / temp1;
+ haze_weight = haze_density.x / temp1;
+
+ // Compute sunlight from P & lightnorm (for long rays like sky)
+ temp2.y = max(0., max(0., Pn.y) * 1.0 + lightnorm.y );
+ temp2.y = 1. / temp2.y;
+ sunlight *= exp( - light_atten * temp2.y);
+
+ // Distance
+ temp2.z = Plen * density_multiplier.x;
+
+ // Transparency (-> temp1)
+ // ATI Bugfix -- can't store temp1*temp2.z in a variable because the ati
+ // compiler gets confused.
+ temp1 = exp(-temp1 * temp2.z);
+
+
+ // Compute haze glow
+ temp2.x = dot(Pn, lightnorm.xyz);
+ temp2.x = 1. - temp2.x;
+ // temp2.x is 0 at the sun and increases away from sun
+ temp2.x = max(temp2.x, .001);
+ // 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;
+ tmpAmbient += (1. - tmpAmbient) * cloud_shadow.x * 0.5;
+
+ // Dim sunlight by cloud shadow percentage
+ sunlight *= (1. - cloud_shadow.x);
+
+ // Haze color below cloud
+ vec4 additiveColorBelowCloud = ( blue_horizon * blue_weight * (sunlight + tmpAmbient)
+ + (haze_horizon.r * haze_weight) * (sunlight * temp2.x + tmpAmbient)
+ );
+
+ // CLOUDS
+
+ sunlight = sunlight_color;
+ temp2.y = max(0., lightnorm.y * 2.);
+ temp2.y = 1. / temp2.y;
+ sunlight *= exp( - light_atten * temp2.y);
+
+ // Cloud color out
+ vary_CloudColorSun = (sunlight * temp2.x) * cloud_color;
+ vary_CloudColorAmbient = tmpAmbient * cloud_color;
+
+ // Attenuate cloud color by atmosphere
+ temp1 = sqrt(temp1); //less atmos opacity (more transparency) below clouds
+ vary_CloudColorSun *= temp1;
+ vary_CloudColorAmbient *= temp1;
+ vec4 oHazeColorBelowCloud = additiveColorBelowCloud * (1. - temp1);
+
+ // Make a nice cloud density based on the cloud_shadow value that was passed in.
+ vary_CloudDensity = 2. * (cloud_shadow.x - 0.25);
+
+
+ // 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;
+
+ gl_TexCoord[1] = gl_TexCoord[0];
+ gl_TexCoord[1].x += lightnorm.x * 0.0125;
+ gl_TexCoord[1].y += lightnorm.z * 0.0125;
+
+ gl_TexCoord[2] = gl_TexCoord[0] * 16.;
+ gl_TexCoord[3] = gl_TexCoord[1] * 16.;
+
+ // Combine these to minimize register use
+ vary_CloudColorAmbient += oHazeColorBelowCloud;
+
+ // needs this to compile on mac
+ //vary_AtmosAttenuation = vec3(0.0,0.0,0.0);
+
+ // END CLOUDS
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/deferred/diffuseF.glsl b/indra/newview/app_settings/shaders/class1/deferred/diffuseF.glsl
index 35cfb80c93..43af480c50 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/diffuseF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/diffuseF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
uniform sampler2D diffuseMap;
@@ -20,3 +20,4 @@ void main()
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
new file mode 100644
index 0000000000..e7b5dcce7f
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/diffuseIndexedF.glsl
@@ -0,0 +1,19 @@
+/**
+ * @file diffuseIndexedF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/LicenseInfo$
+ */
+
+varying vec3 vary_normal;
+
+void main()
+{
+ vec3 col = gl_Color.rgb * diffuseLookup(gl_TexCoord[0].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
+ 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/diffuseSkinnedV.glsl b/indra/newview/app_settings/shaders/class1/deferred/diffuseSkinnedV.glsl
index 9a45c03237..2c4caea109 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/diffuseSkinnedV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/diffuseSkinnedV.glsl
@@ -5,7 +5,7 @@
* $License$
*/
-#version 120
+
varying vec3 vary_normal;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/diffuseV.glsl b/indra/newview/app_settings/shaders/class1/deferred/diffuseV.glsl
index 03d3322cb6..b56d1493c3 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/diffuseV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/diffuseV.glsl
@@ -5,16 +5,18 @@
* $/LicenseInfo$
*/
-#version 120
+
varying vec3 vary_normal;
+varying float vary_texture_index;
void main()
{
//transform vertex
- gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
+ gl_Position = gl_ModelViewProjectionMatrix * vec4(gl_Vertex.xyz, 1.0);
gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
+ vary_texture_index = gl_Vertex.w;
vary_normal = normalize(gl_NormalMatrix * gl_Normal);
gl_FrontColor = gl_Color;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl
index 3429877397..d781e08548 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl
@@ -5,60 +5,24 @@
* $/LicenseInfo$
*/
-#version 120
-#extension GL_ARB_texture_rectangle : enable
-
-uniform sampler2D diffuseMap;
-uniform sampler2DRect depthMap;
-uniform sampler2D noiseMap;
-uniform vec4 shadow_clip;
-uniform vec2 screen_res;
+#extension GL_ARB_texture_rectangle : enable
vec3 fullbrightAtmosTransport(vec3 light);
vec3 fullbrightScaleSoftClip(vec3 light);
-varying vec3 vary_ambient;
-varying vec3 vary_directional;
-varying vec4 vary_position;
-varying vec3 vary_normal;
-varying vec3 vary_fragcoord;
-
-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;
-
- vec3 samp_pos = getPosition(frag).xyz;
-
float shadow = 1.0;
- vec4 pos = vary_position;
- vec4 color = texture2D(diffuseMap, gl_TexCoord[0].xy)*gl_Color;
+ vec4 color = diffuseLookup(gl_TexCoord[0].xy)*gl_Color;
color.rgb = fullbrightAtmosTransport(color.rgb);
color.rgb = fullbrightScaleSoftClip(color.rgb);
- //gl_FragColor = gl_Color;
gl_FragColor = color;
- //gl_FragColor = vec4(1,0,1,1);
-
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/fullbrightV.glsl b/indra/newview/app_settings/shaders/class1/deferred/fullbrightV.glsl
index 6c38d220e2..2eed044b7c 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/fullbrightV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/fullbrightV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
void calcAtmospherics(vec3 inPositionEye);
@@ -14,30 +14,23 @@ vec3 atmosAffectDirectionalLight(float lightIntensity);
vec3 scaleDownLight(vec3 light);
vec3 scaleUpLight(vec3 light);
-varying vec3 vary_ambient;
-varying vec3 vary_directional;
-varying vec3 vary_normal;
-varying vec3 vary_fragcoord;
-uniform float near_clip;
-varying vec4 vary_position;
+varying float vary_texture_index;
void main()
{
//transform vertex
- gl_Position = ftransform();
+ 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 * gl_Vertex);
- vary_position = pos;
-
+ vec4 pos = (gl_ModelViewMatrix * vert);
+
calcAtmospherics(pos.xyz);
gl_FrontColor = gl_Color;
gl_FogFragCoord = pos.z;
-
- pos = gl_ModelViewProjectionMatrix * gl_Vertex;
- vary_fragcoord.xyz = pos.xyz + vec3(0,0,near_clip);
-
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/giF.glsl b/indra/newview/app_settings/shaders/class1/deferred/giF.glsl
index 75b555e8ae..41c149e774 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/giF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/giF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
#extension GL_ARB_texture_rectangle : enable
diff --git a/indra/newview/app_settings/shaders/class1/deferred/giV.glsl b/indra/newview/app_settings/shaders/class1/deferred/giV.glsl
index 8dc1410ea5..e86f2896da 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/giV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/giV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
varying vec2 vary_fragcoord;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/impostorF.glsl b/indra/newview/app_settings/shaders/class1/deferred/impostorF.glsl
index e3c15a2ab2..fa811f0d55 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/impostorF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/impostorF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
uniform sampler2D diffuseMap;
uniform sampler2D normalMap;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/impostorV.glsl b/indra/newview/app_settings/shaders/class1/deferred/impostorV.glsl
index 37148b3f1a..723777bd3a 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/impostorV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/impostorV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
void main()
{
diff --git a/indra/newview/app_settings/shaders/class1/deferred/luminanceF.glsl b/indra/newview/app_settings/shaders/class1/deferred/luminanceF.glsl
index 78df54d5dc..25e93ae266 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/luminanceF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/luminanceF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
uniform sampler2DRect diffuseMap;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/luminanceV.glsl b/indra/newview/app_settings/shaders/class1/deferred/luminanceV.glsl
index 0c820bfc6c..4baf1fc65a 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/luminanceV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/luminanceV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
varying vec2 vary_fragcoord;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl
index c5ddf31ac0..3c5c780d94 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
#extension GL_ARB_texture_rectangle : enable
@@ -23,8 +23,9 @@ uniform float sun_wash;
uniform int light_count;
-uniform vec4 light[16];
-uniform vec4 light_col[16];
+#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;
@@ -35,7 +36,7 @@ uniform mat4 inv_proj;
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);
@@ -63,50 +64,56 @@ void main()
float noise = texture2D(noiseMap, frag.xy/128.0).b;
vec3 out_col = vec3(0,0,0);
vec3 npos = normalize(-pos);
-
- for (int i = 0; i < light_count; ++i)
+
+ // 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)
{
- continue;
+ light_contrib = false;
}
float da = dot(norm, lv);
if (da < 0.0)
{
- continue;
+ light_contrib = false;
}
-
- 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)
+ if (light_contrib)
{
- //vec3 ref = dot(pos+lv, norm);
+ 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;
- float sa = dot(normalize(lv+npos),norm);
+ vec3 col = light_col[i].rgb*lit*diff;
+ //vec3 col = vec3(dist2, light_col[i].a, lit);
- if (sa > 0.0)
+ if (spec.a > 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;
+ //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;
}
-
- out_col += col;
}
if (dot(out_col, out_col) <= 0.0)
diff --git a/indra/newview/app_settings/shaders/class1/deferred/multiPointLightMSF.glsl b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightMSF.glsl
new file mode 100644
index 0000000000..6c43679acf
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightMSF.glsl
@@ -0,0 +1,137 @@
+/**
+ * @file multiPointLightF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/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 2e3e84dd15..434fb6f534 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/multiPointLightV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
varying vec4 vary_fragcoord;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl
index a9f03f7615..0d25d7792d 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
//class 1 -- no shadows
diff --git a/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightMSF.glsl b/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightMSF.glsl
new file mode 100644
index 0000000000..c80a54346e
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightMSF.glsl
@@ -0,0 +1,232 @@
+/**
+ * @file multiSpotLightF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/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/pointLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl
index 22ed9dcd40..5efa3200d4 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
- #version 120
+
#extension GL_ARB_texture_rectangle : enable
@@ -30,7 +30,7 @@ uniform vec4 viewport;
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-viewport.xy)*2.0;
sc /= viewport.zw;
sc -= vec2(1.0,1.0);
diff --git a/indra/newview/app_settings/shaders/class1/deferred/pointLightMSF.glsl b/indra/newview/app_settings/shaders/class1/deferred/pointLightMSF.glsl
new file mode 100644
index 0000000000..feaf38115d
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/pointLightMSF.glsl
@@ -0,0 +1,108 @@
+/**
+ * @file pointLightF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/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 8e74feb615..c510d8ad77 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/pointLightV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/pointLightV.glsl
@@ -5,19 +5,14 @@
* $/LicenseInfo$
*/
-#version 120
+
varying vec4 vary_light;
varying vec4 vary_fragcoord;
-uniform vec2 screen_res;
-uniform float near_clip;
-
void main()
{
//transform vertex
- gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
-
vec4 pos = gl_ModelViewProjectionMatrix * gl_Vertex;
vary_fragcoord = pos;
@@ -25,6 +20,8 @@ void main()
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 77f1b2224c..f6b0402bb9 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
#extension GL_ARB_texture_rectangle : enable
@@ -29,7 +29,7 @@ varying vec2 vary_fragcoord;
float getDepth(vec2 pos_screen)
{
- float z = texture2DRect(depthMap, pos_screen.xy).a;
+ 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;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/postDeferredMSF.glsl b/indra/newview/app_settings/shaders/class1/deferred/postDeferredMSF.glsl
new file mode 100644
index 0000000000..62ae5f917a
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/postDeferredMSF.glsl
@@ -0,0 +1,133 @@
+/**
+ * @file postDeferredF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/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 ab48d08bbb..bf829bfc56 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/postDeferredNoDoFF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/postDeferredNoDoFF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
#extension GL_ARB_texture_rectangle : enable
diff --git a/indra/newview/app_settings/shaders/class1/deferred/postDeferredNoDoFMSF.glsl b/indra/newview/app_settings/shaders/class1/deferred/postDeferredNoDoFMSF.glsl
new file mode 100644
index 0000000000..bf35dfe11c
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/postDeferredNoDoFMSF.glsl
@@ -0,0 +1,37 @@
+/**
+ * @file postDeferredF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/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 12983baa94..876f65ee3a 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/postDeferredV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/postDeferredV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
varying vec2 vary_fragcoord;
uniform vec2 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 63b3c9f205..fa3f04bcc8 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/postgiF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/postgiF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
uniform sampler2DRect depthMap;
uniform sampler2DRect normalMap;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/postgiV.glsl b/indra/newview/app_settings/shaders/class1/deferred/postgiV.glsl
index ae57227fe5..eebe930666 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/postgiV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/postgiV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
varying vec2 vary_fragcoord;
uniform vec2 screen_res;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/shadowF.glsl b/indra/newview/app_settings/shaders/class1/deferred/shadowF.glsl
index 6674c4a5aa..e0c5406483 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/shadowF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/shadowF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
uniform sampler2D diffuseMap;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/shadowV.glsl b/indra/newview/app_settings/shaders/class1/deferred/shadowV.glsl
index db3bddc6be..9271a5115c 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/shadowV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/shadowV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
varying vec4 post_pos;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/skyF.glsl b/indra/newview/app_settings/shaders/class1/deferred/skyF.glsl
new file mode 100644
index 0000000000..820c82ffd7
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/skyF.glsl
@@ -0,0 +1,44 @@
+/**
+ * @file WLSkyF.glsl
+ *
+ * $LicenseInfo:firstyear=2005&license=viewerlgpl$
+ * $/LicenseInfo$
+ */
+
+
+
+/////////////////////////////////////////////////////////////////////////
+// The fragment shader for the sky
+/////////////////////////////////////////////////////////////////////////
+
+varying vec4 vary_HazeColor;
+
+uniform sampler2D cloud_noise_texture;
+uniform vec4 gamma;
+
+/// Soft clips the light with a gamma correction
+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()
+{
+ // Potential Fill-rate optimization. Add cloud calculation
+ // back in and output alpha of 0 (so that alpha culling kills
+ // the fragment) if the sky wouldn't show up because the clouds
+ // are fully opaque.
+
+ vec4 color;
+ color = vary_HazeColor;
+ color *= 2.;
+
+ /// Gamma correct for WL (soft clip effect).
+ gl_FragData[0] = vec4(scaleSoftClip(color.rgb), 1.0);
+ gl_FragData[1] = vec4(0.0,0.0,0.0,0.0);
+ gl_FragData[2] = vec4(0,0,1,0);
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/deferred/skyV.glsl b/indra/newview/app_settings/shaders/class1/deferred/skyV.glsl
new file mode 100644
index 0000000000..1ea00f723a
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/skyV.glsl
@@ -0,0 +1,140 @@
+/**
+ * @file WLSkyV.glsl
+ *
+ * $LicenseInfo:firstyear=2005&license=viewerlgpl$
+ * $/LicenseInfo$
+ */
+
+
+
+// SKY ////////////////////////////////////////////////////////////////////////
+// The vertex shader for creating the atmospheric sky
+///////////////////////////////////////////////////////////////////////////////
+
+// Output parameters
+varying vec4 vary_HazeColor;
+
+// Inputs
+uniform vec3 camPosLocal;
+
+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 max_y;
+
+uniform vec4 glow;
+
+uniform vec4 cloud_color;
+
+uniform vec4 cloud_scale;
+
+void main()
+{
+
+ // World / view / projection
+ gl_Position = ftransform();
+ gl_TexCoord[0] = gl_MultiTexCoord0;
+
+ // Get relative position
+ vec3 P = gl_Vertex.xyz - camPosLocal.xyz + vec3(0,50,0);
+ //vec3 P = gl_Vertex.xyz + vec3(0,50,0);
+
+ // Set altitude
+ if (P.y > 0.)
+ {
+ P *= (max_y.x / P.y);
+ }
+ else
+ {
+ P *= (-32000. / P.y);
+ }
+
+ // Can normalize then
+ vec3 Pn = normalize(P);
+ float Plen = length(P);
+
+ // Initialize temp variables
+ vec4 temp1 = vec4(0.);
+ vec4 temp2 = vec4(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 + haze_density.x * 0.25) * (density_multiplier.x * max_y.x);
+
+ // Calculate relative weights
+ temp1 = blue_density + haze_density.x;
+ blue_weight = blue_density / temp1;
+ haze_weight = haze_density.x / temp1;
+
+ // Compute sunlight from P & lightnorm (for long rays like sky)
+ temp2.y = max(0., max(0., Pn.y) * 1.0 + lightnorm.y );
+ temp2.y = 1. / temp2.y;
+ sunlight *= exp( - light_atten * temp2.y);
+
+ // Distance
+ temp2.z = Plen * density_multiplier.x;
+
+ // Transparency (-> temp1)
+ // ATI Bugfix -- can't store temp1*temp2.z in a variable because the ati
+ // compiler gets confused.
+ temp1 = exp(-temp1 * temp2.z);
+
+
+ // Compute haze glow
+ temp2.x = dot(Pn, lightnorm.xyz);
+ temp2.x = 1. - temp2.x;
+ // temp2.x is 0 at the sun and increases away from sun
+ temp2.x = max(temp2.x, .001);
+ // 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;
+
+
+ // Haze color above cloud
+ vary_HazeColor = ( blue_horizon * blue_weight * (sunlight + ambient)
+ + (haze_horizon.r * haze_weight) * (sunlight * temp2.x + ambient)
+ );
+
+
+ // Increase ambient when there are more clouds
+ vec4 tmpAmbient = ambient;
+ tmpAmbient += (1. - tmpAmbient) * cloud_shadow.x * 0.5;
+
+ // Dim sunlight by cloud shadow percentage
+ sunlight *= (1. - cloud_shadow.x);
+
+ // Haze color below cloud
+ vec4 additiveColorBelowCloud = ( blue_horizon * blue_weight * (sunlight + tmpAmbient)
+ + (haze_horizon.r * haze_weight) * (sunlight * temp2.x + tmpAmbient)
+ );
+
+ // Final atmosphere additive
+ vary_HazeColor *= (1. - temp1);
+
+ // Attenuate cloud color by atmosphere
+ temp1 = sqrt(temp1); //less atmos opacity (more transparency) below clouds
+
+ // At horizon, blend high altitude sky color towards the darker color below the clouds
+ vary_HazeColor += (additiveColorBelowCloud - vary_HazeColor) * (1. - sqrt(temp1));
+
+ // won't compile on mac without this being set
+ //vary_AtmosAttenuation = vec3(0.0,0.0,0.0);
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl
index 29340c7e9f..60082f40d6 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
#extension GL_ARB_texture_rectangle : enable
@@ -259,7 +259,7 @@ vec3 scaleSoftClip(vec3 light)
void main()
{
vec2 tc = vary_fragcoord.xy;
- float depth = texture2DRect(depthMap, tc.xy).a;
+ float depth = texture2DRect(depthMap, tc.xy).r;
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
diff --git a/indra/newview/app_settings/shaders/class1/deferred/softenLightMSF.glsl b/indra/newview/app_settings/shaders/class1/deferred/softenLightMSF.glsl
new file mode 100644
index 0000000000..9dfacfb520
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/softenLightMSF.glsl
@@ -0,0 +1,318 @@
+/**
+ * @file softenLightF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/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);
+
+ vec3 fcol = vec3(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);
+ if (diffuse.a >= 1.0)
+ {
+ fcol += diffuse.rgb;
+ }
+ else
+ {
+ vec4 spec = texelFetch(specularRect, itc, i);
+
+ calcAtmospherics(pos.xyz, 1.0);
+
+ vec3 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
+ col += dumbshiny * spec.rgb;
+ }
+
+ col = atmosLighting(col);
+ col = scaleSoftClip(col);
+ fcol += col;
+ }
+ }
+
+ gl_FragColor.rgb = fcol.rgb/samples;
+ gl_FragColor.a = 0.0;
+}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/softenLightV.glsl b/indra/newview/app_settings/shaders/class1/deferred/softenLightV.glsl
index 8f0bcca76b..745cc01992 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/softenLightV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/softenLightV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
uniform vec2 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 29fac46bfe..9aaffc15bf 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
#extension GL_ARB_texture_rectangle : enable
diff --git a/indra/newview/app_settings/shaders/class1/deferred/spotLightMSF.glsl b/indra/newview/app_settings/shaders/class1/deferred/spotLightMSF.glsl
new file mode 100644
index 0000000000..4bb9bad275
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/spotLightMSF.glsl
@@ -0,0 +1,234 @@
+/**
+ * @file multiSpotLightF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/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
new file mode 100644
index 0000000000..2cf7d194cc
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/starsF.glsl
@@ -0,0 +1,19 @@
+/**
+ * @file starsF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/LicenseInfo$
+ */
+
+
+
+uniform sampler2D diffuseMap;
+
+void main()
+{
+ vec4 col = gl_Color * texture2D(diffuseMap, gl_TexCoord[0].xy);
+
+ gl_FragData[0] = col;
+ gl_FragData[1] = vec4(0,0,0,0);
+ gl_FragData[2] = vec4(0,0,1,0);
+}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/starsV.glsl b/indra/newview/app_settings/shaders/class1/deferred/starsV.glsl
new file mode 100644
index 0000000000..c43125dad9
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/starsV.glsl
@@ -0,0 +1,17 @@
+/**
+ * @file starsV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/LicenseInfo$
+ */
+
+
+
+
+void main()
+{
+ //transform vertex
+ gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
+ gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
+ gl_FrontColor = gl_Color;
+}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/sunLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/sunLightF.glsl
index 00093836a2..f20886565a 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/sunLightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/sunLightF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
//class 1, no shadow, no SSAO, should never be called
diff --git a/indra/newview/app_settings/shaders/class1/deferred/sunLightMSF.glsl b/indra/newview/app_settings/shaders/class1/deferred/sunLightMSF.glsl
new file mode 100644
index 0000000000..f20886565a
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/sunLightMSF.glsl
@@ -0,0 +1,17 @@
+/**
+ * @file sunLightF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/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 cd91351ad4..665d8126a0 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOF.glsl
@@ -5,7 +5,7 @@
* $License$
*/
-#version 120
+
#extension GL_ARB_texture_rectangle : enable
@@ -35,7 +35,7 @@ uniform float shadow_offset;
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);
diff --git a/indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOMSF.glsl b/indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOMSF.glsl
new file mode 100644
index 0000000000..32d1b2149a
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOMSF.glsl
@@ -0,0 +1,123 @@
+/**
+ * @file sunLightSSAOF.glsl
+ *
+ * Copyright (c) 2007-$CurrentYear$, Linden Research, Inc.
+ * $License$
+ */
+
+
+
+#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 9beb513ad8..814deb3677 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/sunLightV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/sunLightV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
varying vec4 vary_light;
varying vec2 vary_fragcoord;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/terrainF.glsl b/indra/newview/app_settings/shaders/class1/deferred/terrainF.glsl
index 0edae47918..d005f67bf6 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/terrainF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/terrainF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
uniform sampler2D detail_0;
uniform sampler2D detail_1;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/terrainV.glsl b/indra/newview/app_settings/shaders/class1/deferred/terrainV.glsl
index a6163063be..3038fd2966 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/terrainV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/terrainV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
varying vec3 vary_normal;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/treeF.glsl b/indra/newview/app_settings/shaders/class1/deferred/treeF.glsl
index c54d9a1e3e..de7e038402 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/treeF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/treeF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
uniform sampler2D diffuseMap;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/treeV.glsl b/indra/newview/app_settings/shaders/class1/deferred/treeV.glsl
index 29689ecbaf..a9bef4292d 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/treeV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/treeV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
varying vec3 vary_normal;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/waterF.glsl b/indra/newview/app_settings/shaders/class1/deferred/waterF.glsl
index e76f598d09..2710422d32 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/waterF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/waterF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
#extension GL_ARB_texture_rectangle : enable
diff --git a/indra/newview/app_settings/shaders/class1/deferred/waterV.glsl b/indra/newview/app_settings/shaders/class1/deferred/waterV.glsl
index 649e392630..5397290b11 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/waterV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/waterV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
void calcAtmospherics(vec3 inPositionEye);
diff --git a/indra/newview/app_settings/shaders/class1/effects/glowExtractF.glsl b/indra/newview/app_settings/shaders/class1/effects/glowExtractF.glsl
index f2023fa5ea..32f5f5f236 100644
--- a/indra/newview/app_settings/shaders/class1/effects/glowExtractF.glsl
+++ b/indra/newview/app_settings/shaders/class1/effects/glowExtractF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
#extension GL_ARB_texture_rectangle : enable
diff --git a/indra/newview/app_settings/shaders/class1/effects/glowExtractMSF.glsl b/indra/newview/app_settings/shaders/class1/effects/glowExtractMSF.glsl
new file mode 100644
index 0000000000..9267a8585d
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/effects/glowExtractMSF.glsl
@@ -0,0 +1,38 @@
+/**
+ * @file glowExtractF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/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 0ca0608b45..76736fed53 100644
--- a/indra/newview/app_settings/shaders/class1/effects/glowExtractV.glsl
+++ b/indra/newview/app_settings/shaders/class1/effects/glowExtractV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
void main()
{
diff --git a/indra/newview/app_settings/shaders/class1/effects/glowF.glsl b/indra/newview/app_settings/shaders/class1/effects/glowF.glsl
index 65fc2e9f99..d3225546b3 100644
--- a/indra/newview/app_settings/shaders/class1/effects/glowF.glsl
+++ b/indra/newview/app_settings/shaders/class1/effects/glowF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
uniform sampler2D diffuseMap;
uniform float glowStrength;
diff --git a/indra/newview/app_settings/shaders/class1/effects/glowV.glsl b/indra/newview/app_settings/shaders/class1/effects/glowV.glsl
index 0bd44cec90..9bb41626ae 100644
--- a/indra/newview/app_settings/shaders/class1/effects/glowV.glsl
+++ b/indra/newview/app_settings/shaders/class1/effects/glowV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
uniform vec2 glowDelta;
diff --git a/indra/newview/app_settings/shaders/class1/environment/terrainF.glsl b/indra/newview/app_settings/shaders/class1/environment/terrainF.glsl
index ac00f15b35..cdc2ca3da2 100644
--- a/indra/newview/app_settings/shaders/class1/environment/terrainF.glsl
+++ b/indra/newview/app_settings/shaders/class1/environment/terrainF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
uniform sampler2D detail0;
uniform sampler2D detail1;
diff --git a/indra/newview/app_settings/shaders/class1/environment/terrainV.glsl b/indra/newview/app_settings/shaders/class1/environment/terrainV.glsl
index 1e19ee7699..8af981915b 100644
--- a/indra/newview/app_settings/shaders/class1/environment/terrainV.glsl
+++ b/indra/newview/app_settings/shaders/class1/environment/terrainV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
diff --git a/indra/newview/app_settings/shaders/class1/environment/terrainWaterF.glsl b/indra/newview/app_settings/shaders/class1/environment/terrainWaterF.glsl
index 34f78565a5..d94d986581 100644
--- a/indra/newview/app_settings/shaders/class1/environment/terrainWaterF.glsl
+++ b/indra/newview/app_settings/shaders/class1/environment/terrainWaterF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
// this class1 shader is just a copy of terrainF
diff --git a/indra/newview/app_settings/shaders/class1/environment/underWaterF.glsl b/indra/newview/app_settings/shaders/class1/environment/underWaterF.glsl
index 0dfac84a6e..06854fcc0a 100644
--- a/indra/newview/app_settings/shaders/class1/environment/underWaterF.glsl
+++ b/indra/newview/app_settings/shaders/class1/environment/underWaterF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
uniform sampler2D diffuseMap;
uniform sampler2D bumpMap;
diff --git a/indra/newview/app_settings/shaders/class1/environment/waterF.glsl b/indra/newview/app_settings/shaders/class1/environment/waterF.glsl
index 4e9c09b1ea..0f24e3c35a 100644
--- a/indra/newview/app_settings/shaders/class1/environment/waterF.glsl
+++ b/indra/newview/app_settings/shaders/class1/environment/waterF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
vec3 scaleSoftClip(vec3 inColor);
vec3 atmosTransport(vec3 inColor);
diff --git a/indra/newview/app_settings/shaders/class1/environment/waterFogF.glsl b/indra/newview/app_settings/shaders/class1/environment/waterFogF.glsl
index a34cf23790..630459b324 100644
--- a/indra/newview/app_settings/shaders/class1/environment/waterFogF.glsl
+++ b/indra/newview/app_settings/shaders/class1/environment/waterFogF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
vec4 applyWaterFog(vec4 color)
{
diff --git a/indra/newview/app_settings/shaders/class1/environment/waterV.glsl b/indra/newview/app_settings/shaders/class1/environment/waterV.glsl
index 161c794c68..831d6a761c 100644
--- a/indra/newview/app_settings/shaders/class1/environment/waterV.glsl
+++ b/indra/newview/app_settings/shaders/class1/environment/waterV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
void calcAtmospherics(vec3 inPositionEye);
diff --git a/indra/newview/app_settings/shaders/class1/interface/highlightF.glsl b/indra/newview/app_settings/shaders/class1/interface/highlightF.glsl
index 6f821f893d..f6c6d945de 100644
--- a/indra/newview/app_settings/shaders/class1/interface/highlightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/interface/highlightF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
uniform sampler2D diffuseMap;
diff --git a/indra/newview/app_settings/shaders/class1/interface/highlightV.glsl b/indra/newview/app_settings/shaders/class1/interface/highlightV.glsl
index d1c98bf70c..f114f766bf 100644
--- a/indra/newview/app_settings/shaders/class1/interface/highlightV.glsl
+++ b/indra/newview/app_settings/shaders/class1/interface/highlightV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
void main()
{
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightF.glsl
index 9c59e8c3ad..1796730c92 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/lightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
uniform sampler2D diffuseMap;
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightF.glsl
index 1fee99c446..bfe0be9fdf 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
uniform sampler2D diffuseMap;
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyF.glsl
index fb5da21c72..6f1fe91007 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyF.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
uniform sampler2D diffuseMap;
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyWaterF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyWaterF.glsl
index 1bdaccf9b8..19072cd052 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyWaterF.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyWaterF.glsl
@@ -6,7 +6,7 @@
*/
-#version 120
+
uniform sampler2D diffuseMap;
uniform samplerCube environmentMap;
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightWaterF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightWaterF.glsl
index 2e94d3bbf1..0ae6dc89e2 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightWaterF.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightWaterF.glsl
@@ -6,7 +6,7 @@
*/
-#version 120
+
uniform sampler2D diffuseMap;
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightFuncSpecularV.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightFuncSpecularV.glsl
index 714f9a2551..5d4bf2c33e 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/lightFuncSpecularV.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightFuncSpecularV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
float calcDirectionalLight(vec3 n, vec3 l)
{
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightFuncV.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightFuncV.glsl
index 65b45f8081..574252af12 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/lightFuncV.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightFuncV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
float calcDirectionalLight(vec3 n, vec3 l)
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightShinyF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightShinyF.glsl
index 7f65ea76f7..29f575b7e5 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/lightShinyF.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightShinyF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
uniform sampler2D diffuseMap;
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightShinyWaterF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightShinyWaterF.glsl
index 8f13e6dc04..65da5a6825 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/lightShinyWaterF.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightShinyWaterF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
uniform sampler2D diffuseMap;
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightSpecularV.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightSpecularV.glsl
index 56f31f6a79..d491f1102e 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/lightSpecularV.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightSpecularV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
float calcDirectionalLight(vec3 n, vec3 l);
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightV.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightV.glsl
index 64d549ff52..ef38ee9699 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/lightV.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
float calcDirectionalLight(vec3 n, vec3 l);
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightWaterF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightWaterF.glsl
index c5d084c132..286c92326b 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/lightWaterF.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightWaterF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
uniform sampler2D diffuseMap;
diff --git a/indra/newview/app_settings/shaders/class1/lighting/sumLightsSpecularV.glsl b/indra/newview/app_settings/shaders/class1/lighting/sumLightsSpecularV.glsl
index 732d246471..772a420e33 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/sumLightsSpecularV.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/sumLightsSpecularV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
float calcDirectionalLightSpecular(inout vec4 specular, vec3 view, vec3 n, vec3 l, vec3 lightCol, float da);
vec3 atmosAmbient(vec3 light);
diff --git a/indra/newview/app_settings/shaders/class1/lighting/sumLightsV.glsl b/indra/newview/app_settings/shaders/class1/lighting/sumLightsV.glsl
index 73e1a1ec26..da60a3ddf5 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/sumLightsV.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/sumLightsV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
float calcDirectionalLight(vec3 n, vec3 l);
diff --git a/indra/newview/app_settings/shaders/class1/objects/fullbrightF.glsl b/indra/newview/app_settings/shaders/class1/objects/fullbrightF.glsl
index afc3dc89bf..c0b72115dd 100644
--- a/indra/newview/app_settings/shaders/class1/objects/fullbrightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/fullbrightF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
void fullbright_lighting();
diff --git a/indra/newview/app_settings/shaders/class1/objects/fullbrightShinyF.glsl b/indra/newview/app_settings/shaders/class1/objects/fullbrightShinyF.glsl
index 3dc4294f67..391c06edc8 100644
--- a/indra/newview/app_settings/shaders/class1/objects/fullbrightShinyF.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/fullbrightShinyF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
void fullbright_shiny_lighting();
diff --git a/indra/newview/app_settings/shaders/class1/objects/fullbrightShinySkinnedV.glsl b/indra/newview/app_settings/shaders/class1/objects/fullbrightShinySkinnedV.glsl
index f0baeeeee5..f44a5ce32e 100644
--- a/indra/newview/app_settings/shaders/class1/objects/fullbrightShinySkinnedV.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/fullbrightShinySkinnedV.glsl
@@ -5,7 +5,7 @@
* $License$
*/
-#version 120
+
void calcAtmospherics(vec3 inPositionEye);
mat4 getObjectSkinnedTransform();
diff --git a/indra/newview/app_settings/shaders/class1/objects/fullbrightShinyV.glsl b/indra/newview/app_settings/shaders/class1/objects/fullbrightShinyV.glsl
index 02367b9439..31e0f0a429 100644
--- a/indra/newview/app_settings/shaders/class1/objects/fullbrightShinyV.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/fullbrightShinyV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
void calcAtmospherics(vec3 inPositionEye);
diff --git a/indra/newview/app_settings/shaders/class1/objects/fullbrightShinyWaterF.glsl b/indra/newview/app_settings/shaders/class1/objects/fullbrightShinyWaterF.glsl
index 5daf66fb31..8ffb252f57 100644
--- a/indra/newview/app_settings/shaders/class1/objects/fullbrightShinyWaterF.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/fullbrightShinyWaterF.glsl
@@ -5,7 +5,7 @@
* $License$
*/
-#version 120
+
void fullbright_shiny_lighting_water();
diff --git a/indra/newview/app_settings/shaders/class1/objects/fullbrightSkinnedV.glsl b/indra/newview/app_settings/shaders/class1/objects/fullbrightSkinnedV.glsl
index 02ff3cc2a9..e5dafa8c78 100644
--- a/indra/newview/app_settings/shaders/class1/objects/fullbrightSkinnedV.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/fullbrightSkinnedV.glsl
@@ -5,7 +5,7 @@
* $License$
*/
-#version 120
+
void calcAtmospherics(vec3 inPositionEye);
mat4 getObjectSkinnedTransform();
diff --git a/indra/newview/app_settings/shaders/class1/objects/fullbrightV.glsl b/indra/newview/app_settings/shaders/class1/objects/fullbrightV.glsl
index 38e07dbd80..3382384c99 100644
--- a/indra/newview/app_settings/shaders/class1/objects/fullbrightV.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/fullbrightV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
void calcAtmospherics(vec3 inPositionEye);
diff --git a/indra/newview/app_settings/shaders/class1/objects/fullbrightWaterF.glsl b/indra/newview/app_settings/shaders/class1/objects/fullbrightWaterF.glsl
index afaac4f69c..220f26614f 100644
--- a/indra/newview/app_settings/shaders/class1/objects/fullbrightWaterF.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/fullbrightWaterF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
void fullbright_lighting_water();
diff --git a/indra/newview/app_settings/shaders/class1/objects/shinyF.glsl b/indra/newview/app_settings/shaders/class1/objects/shinyF.glsl
index 2cf7a69baa..d079de5377 100644
--- a/indra/newview/app_settings/shaders/class1/objects/shinyF.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/shinyF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
void shiny_lighting();
diff --git a/indra/newview/app_settings/shaders/class1/objects/shinySimpleSkinnedV.glsl b/indra/newview/app_settings/shaders/class1/objects/shinySimpleSkinnedV.glsl
index 4146646058..cd655f3bb5 100644
--- a/indra/newview/app_settings/shaders/class1/objects/shinySimpleSkinnedV.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/shinySimpleSkinnedV.glsl
@@ -5,7 +5,7 @@
* $License$
*/
-#version 120
+
vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
void calcAtmospherics(vec3 inPositionEye);
diff --git a/indra/newview/app_settings/shaders/class1/objects/shinyV.glsl b/indra/newview/app_settings/shaders/class1/objects/shinyV.glsl
index 6ea83b721d..68a086dbc1 100644
--- a/indra/newview/app_settings/shaders/class1/objects/shinyV.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/shinyV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
void calcAtmospherics(vec3 inPositionEye);
diff --git a/indra/newview/app_settings/shaders/class1/objects/shinyWaterF.glsl b/indra/newview/app_settings/shaders/class1/objects/shinyWaterF.glsl
index e3babe2210..4649d1c47c 100644
--- a/indra/newview/app_settings/shaders/class1/objects/shinyWaterF.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/shinyWaterF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
void shiny_lighting_water();
diff --git a/indra/newview/app_settings/shaders/class1/objects/simpleF.glsl b/indra/newview/app_settings/shaders/class1/objects/simpleF.glsl
index d449d37c0c..b4e4dcfbbf 100644
--- a/indra/newview/app_settings/shaders/class1/objects/simpleF.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/simpleF.glsl
@@ -5,8 +5,6 @@
* $/LicenseInfo$
*/
-#version 120
-
void default_lighting();
void main()
diff --git a/indra/newview/app_settings/shaders/class1/objects/simpleSkinnedV.glsl b/indra/newview/app_settings/shaders/class1/objects/simpleSkinnedV.glsl
index be38a14d52..900448035c 100644
--- a/indra/newview/app_settings/shaders/class1/objects/simpleSkinnedV.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/simpleSkinnedV.glsl
@@ -5,7 +5,7 @@
* $License$
*/
-#version 120
+
vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
void calcAtmospherics(vec3 inPositionEye);
diff --git a/indra/newview/app_settings/shaders/class1/objects/simpleV.glsl b/indra/newview/app_settings/shaders/class1/objects/simpleV.glsl
index 0d8e14e2e3..b493f76fcc 100644
--- a/indra/newview/app_settings/shaders/class1/objects/simpleV.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/simpleV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
void calcAtmospherics(vec3 inPositionEye);
diff --git a/indra/newview/app_settings/shaders/class1/objects/simpleWaterF.glsl b/indra/newview/app_settings/shaders/class1/objects/simpleWaterF.glsl
index 68bd81e029..4ec5ee43b4 100644
--- a/indra/newview/app_settings/shaders/class1/objects/simpleWaterF.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/simpleWaterF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
void default_lighting_water();
diff --git a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsF.glsl b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsF.glsl
index f337bde329..3d05850ab3 100644
--- a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsF.glsl
+++ b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
vec3 atmosLighting(vec3 light)
{
diff --git a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsHelpersV.glsl b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsHelpersV.glsl
index 4b402a7028..f1a0af21af 100644
--- a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsHelpersV.glsl
+++ b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsHelpersV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
vec3 atmosAmbient(vec3 light)
{
diff --git a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsV.glsl b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsV.glsl
index 20948b1e46..73bbd57315 100644
--- a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsV.glsl
+++ b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
void setPositionEye(vec3 v);
diff --git a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsF.glsl b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsF.glsl
index 8a2c2a7186..e0eb7b3767 100644
--- a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsF.glsl
+++ b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
varying vec3 vary_PositionEye;
diff --git a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsV.glsl b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsV.glsl
index a1dd4ed5fe..a251213ff5 100644
--- a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsV.glsl
+++ b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
varying vec3 vary_PositionEye;
diff --git a/indra/newview/app_settings/shaders/class1/windlight/gammaF.glsl b/indra/newview/app_settings/shaders/class1/windlight/gammaF.glsl
index 7aed1fd3b5..4958cb2f72 100644
--- a/indra/newview/app_settings/shaders/class1/windlight/gammaF.glsl
+++ b/indra/newview/app_settings/shaders/class1/windlight/gammaF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
uniform vec4 gamma;
diff --git a/indra/newview/app_settings/shaders/class1/windlight/transportF.glsl b/indra/newview/app_settings/shaders/class1/windlight/transportF.glsl
index 6780dc4d3e..75929bc609 100644
--- a/indra/newview/app_settings/shaders/class1/windlight/transportF.glsl
+++ b/indra/newview/app_settings/shaders/class1/windlight/transportF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
vec3 atmosTransport(vec3 light)
{
diff --git a/indra/newview/app_settings/shaders/class2/avatar/eyeballV.glsl b/indra/newview/app_settings/shaders/class2/avatar/eyeballV.glsl
index 172c2ca078..3e8b719f93 100644
--- a/indra/newview/app_settings/shaders/class2/avatar/eyeballV.glsl
+++ b/indra/newview/app_settings/shaders/class2/avatar/eyeballV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
vec4 calcLightingSpecular(vec3 pos, vec3 norm, vec4 color, inout vec4 specularColor, vec4 baseCol);
void calcAtmospherics(vec3 inPositionEye);
diff --git a/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl b/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl
index 6dfc1b952c..681e52de2a 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl
@@ -5,11 +5,10 @@
* $/LicenseInfo$
*/
-#version 120
+
#extension GL_ARB_texture_rectangle : enable
-uniform sampler2D diffuseMap;
uniform sampler2DRectShadow shadowMap0;
uniform sampler2DRectShadow shadowMap1;
uniform sampler2DRectShadow shadowMap2;
@@ -105,7 +104,7 @@ void main()
}
}
- vec4 diff= texture2D(diffuseMap, gl_TexCoord[0].xy);
+ vec4 diff = diffuseLookup(gl_TexCoord[0].xy);
vec4 col = vec4(vary_ambient + vary_directional.rgb*shadow, gl_Color.a);
vec4 color = diff * col;
diff --git a/indra/newview/app_settings/shaders/class2/deferred/alphaNonIndexedF.glsl b/indra/newview/app_settings/shaders/class2/deferred/alphaNonIndexedF.glsl
new file mode 100644
index 0000000000..5350359f75
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class2/deferred/alphaNonIndexedF.glsl
@@ -0,0 +1,125 @@
+/**
+ * @file alphaF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/LicenseInfo$
+ */
+
+
+
+#extension GL_ARB_texture_rectangle : enable
+
+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;
+
+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,gl_TexCoord[0].xy);
+
+ vec4 col = vec4(vary_ambient + vary_directional.rgb*shadow, gl_Color.a);
+ vec4 color = diff * col;
+
+ color.rgb = atmosLighting(color.rgb);
+
+ color.rgb = scaleSoftClip(color.rgb);
+
+ 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/alphaSkinnedV.glsl b/indra/newview/app_settings/shaders/class2/deferred/alphaSkinnedV.glsl
index d227346163..948a52da5b 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/alphaSkinnedV.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/alphaSkinnedV.glsl
@@ -5,7 +5,7 @@
* $License$
*/
-#version 120
+
vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
void calcAtmospherics(vec3 inPositionEye);
@@ -35,19 +35,24 @@ float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, floa
//get distance
float d = length(lv);
- //normalize light vector
- lv *= 1.0/d;
+ float da = 0.0;
+
+ if (d > 0.0 && la > 0.0 && fa > 0.0)
+ {
+ //normalize light vector
+ lv *= 1.0/d;
- //distance attenuation
- float dist2 = d*d/(la*la);
- float da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
+ //distance attenuation
+ float dist2 = d*d/(la*la);
+ da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
- // spotlight coefficient.
- float spot = max(dot(-ln, lv), is_pointlight);
- da *= spot*spot; // GL_SPOT_EXPONENT=2
+ // spotlight coefficient.
+ float spot = max(dot(-ln, lv), is_pointlight);
+ da *= spot*spot; // GL_SPOT_EXPONENT=2
- //angular attenuation
- da *= calcDirectionalLight(n, lv);
+ //angular attenuation
+ da *= calcDirectionalLight(n, lv);
+ }
return da;
}
diff --git a/indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl b/indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl
index 86f014df35..f616ecc872 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
void calcAtmospherics(vec3 inPositionEye);
@@ -22,6 +22,7 @@ varying vec3 vary_directional;
varying vec3 vary_fragcoord;
varying vec3 vary_position;
varying vec3 vary_pointlight_col;
+varying float vary_texture_index;
uniform float near_clip;
uniform float shadow_offset;
@@ -35,19 +36,24 @@ float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, floa
//get distance
float d = length(lv);
- //normalize light vector
- lv *= 1.0/d;
+ float da = 0.0;
+
+ if (d > 0.0 && la > 0.0 && fa > 0.0)
+ {
+ //normalize light vector
+ lv *= 1.0/d;
- //distance attenuation
- float dist2 = d*d/(la*la);
- float da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
+ //distance attenuation
+ float dist2 = d*d/(la*la);
+ da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
- // spotlight coefficient.
- float spot = max(dot(-ln, lv), is_pointlight);
- da *= spot*spot; // GL_SPOT_EXPONENT=2
+ // spotlight coefficient.
+ float spot = max(dot(-ln, lv), is_pointlight);
+ da *= spot*spot; // GL_SPOT_EXPONENT=2
- //angular attenuation
- da *= calcDirectionalLight(n, lv);
+ //angular attenuation
+ da *= calcDirectionalLight(n, lv);
+ }
return da;
}
@@ -55,11 +61,13 @@ float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, floa
void main()
{
//transform vertex
- gl_Position = ftransform();
+ 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 * gl_Vertex);
+ vec4 pos = (gl_ModelViewMatrix * vert);
vec3 norm = normalize(gl_NormalMatrix * gl_Normal);
float dp_directional_light = max(0.0, dot(norm, gl_LightSource[0].position.xyz));
@@ -94,7 +102,7 @@ void main()
gl_FogFragCoord = pos.z;
- pos = gl_ModelViewProjectionMatrix * gl_Vertex;
+ pos = gl_ModelViewProjectionMatrix * 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 495e86c8db..01e40afc4f 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/avatarAlphaV.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/avatarAlphaV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
mat4 getSkinnedTransform();
@@ -37,19 +37,24 @@ float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, floa
//get distance
float d = length(lv);
- //normalize light vector
- lv *= 1.0/d;
+ float da = 0.0;
+
+ if (d > 0.0 && la > 0.0 && fa > 0.0)
+ {
+ //normalize light vector
+ lv *= 1.0/d;
- //distance attenuation
- float dist2 = d*d/(la*la);
- float da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
+ //distance attenuation
+ float dist2 = d*d/(la*la);
+ da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
- // spotlight coefficient.
- float spot = max(dot(-ln, lv), is_pointlight);
- da *= spot*spot; // GL_SPOT_EXPONENT=2
+ // spotlight coefficient.
+ float spot = max(dot(-ln, lv), is_pointlight);
+ da *= spot*spot; // GL_SPOT_EXPONENT=2
- //angular attenuation
- da *= calcDirectionalLight(n, lv);
+ //angular attenuation
+ da *= calcDirectionalLight(n, lv);
+ }
return da;
}
diff --git a/indra/newview/app_settings/shaders/class2/deferred/edgeF.glsl b/indra/newview/app_settings/shaders/class2/deferred/edgeF.glsl
index 3155f3f929..729e4b5543 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/edgeF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/edgeF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
#extension GL_ARB_texture_rectangle : enable
@@ -22,7 +22,7 @@ uniform vec2 screen_res;
float getDepth(vec2 pos_screen)
{
- float z = texture2DRect(depthMap, pos_screen.xy).a;
+ 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;
diff --git a/indra/newview/app_settings/shaders/class2/deferred/edgeMSF.glsl b/indra/newview/app_settings/shaders/class2/deferred/edgeMSF.glsl
new file mode 100644
index 0000000000..b22bc5b288
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class2/deferred/edgeMSF.glsl
@@ -0,0 +1,74 @@
+/**
+ * @file edgeF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/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
index b3413c301f..393084a3db 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/edgeV.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/edgeV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
varying vec2 vary_fragcoord;
uniform vec2 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 d6cd984ebe..f54186ffca 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
#extension GL_ARB_texture_rectangle : enable
@@ -91,7 +91,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);
diff --git a/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightMSF.glsl b/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightMSF.glsl
new file mode 100644
index 0000000000..fee32be3e3
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightMSF.glsl
@@ -0,0 +1,244 @@
+/**
+ * @file multiSpotLightF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/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 0160e84278..66a1a8515f 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
#extension GL_ARB_texture_rectangle : enable
@@ -71,7 +71,7 @@ vec4 getPosition_d(vec2 pos_screen, float depth)
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;
+ float depth = texture2DRect(depthMap, pos_screen.xy).r;
return getPosition_d(pos_screen, depth);
}
@@ -258,7 +258,7 @@ vec3 scaleSoftClip(vec3 light)
void main()
{
vec2 tc = vary_fragcoord.xy;
- float depth = texture2DRect(depthMap, tc.xy).a;
+ float depth = texture2DRect(depthMap, tc.xy).r;
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
@@ -288,54 +288,8 @@ void main()
float sa = dot(refnormpersp, vary_light.xyz);
vec3 dumbshiny = vary_SunlitColor*scol_ambocc.r*texture2D(lightFunc, vec2(sa, spec.a)).a;
- /*
- // screen-space cheap fakey reflection map
- //
- vec3 refnorm = normalize(reflect(vec3(0,0,-1), norm.xyz));
- depth -= 0.5; // unbias depth
- // first figure out where we'll make our 2D guess from
- vec2 ref2d = (0.25 * screen_res.y) * (refnorm.xy) * abs(refnorm.z) / depth;
- // Offset the guess source a little according to a trivial
- // checkerboard dither function and spec.a.
- // This is meant to be similar to sampling a blurred version
- // of the diffuse map. LOD would be better in that regard.
- // The goal of the blur is to soften reflections in surfaces
- // with low shinyness, and also to disguise our lameness.
- float checkerboard = floor(mod(tc.x+tc.y, 2.0)); // 0.0, 1.0
- float checkoffset = (3.0 + (7.0*(1.0-spec.a)))*(checkerboard-0.5);
- ref2d += vec2(checkoffset, checkoffset);
- ref2d += tc.xy; // use as offset from destination
- // Get attributes from the 2D guess point.
- // We average two samples of diffuse (not of anything else) per
- // pixel to try to reduce aliasing some more.
- vec3 refcol = 0.5 * (texture2DRect(diffuseRect, ref2d + vec2(0.0, -checkoffset)).rgb +
- texture2DRect(diffuseRect, ref2d + vec2(-checkoffset, 0.0)).rgb);
- float refdepth = texture2DRect(depthMap, ref2d).a;
- vec3 refpos = getPosition_d(ref2d, refdepth).xyz;
- float refshad = texture2DRect(lightMap, ref2d).r;
- vec3 refn = texture2DRect(normalMap, ref2d).rgb;
- refn = vec3((refn.xy-0.5)*2.0,refn.z); // unpack norm
- refn = normalize(refn);
- // figure out how appropriate our guess actually was
- float refapprop = max(0.0, dot(-refnorm, normalize(pos - refpos)));
- // darken reflections from points which face away from the reflected ray - our guess was a back-face
- //refapprop *= step(dot(refnorm, refn), 0.0);
- refapprop = min(refapprop, max(0.0, -dot(refnorm, refn))); // more conservative variant
- // get appropriate light strength for guess-point
- // reflect light direction to increase the illusion that
- // these are reflections.
- vec3 reflight = reflect(lightnorm.xyz, norm.xyz);
- float reflit = min(max(dot(refn, reflight.xyz), 0.0), refshad);
- // apply sun color to guess-point, dampen according to inappropriateness of guess
- float refmod = min(refapprop, reflit);
- vec3 refprod = vary_SunlitColor * refcol.rgb * refmod;
- vec3 ssshiny = (refprod * spec.a);
- ssshiny *= 0.3; // dampen it even more
- */
- vec3 ssshiny = vec3(0,0,0);
-
// add the two types of shiny together
- col += (ssshiny + dumbshiny) * spec.rgb;
+ col += dumbshiny * spec.rgb;
}
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
new file mode 100644
index 0000000000..0bae10ca7d
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class2/deferred/softenLightMSF.glsl
@@ -0,0 +1,307 @@
+/**
+ * @file softenLightMSF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/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);
+
+ vec3 fcol = vec3(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);
+ vec4 spec = texelFetch(specularRect, itc, i);
+
+ float amb = 0;
+
+ float scol = max(scol_ambocc.r, diffuse.a);
+ amb += ambocc;
+
+ calcAtmospherics(pos.xyz, ambocc);
+
+ vec3 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
+ col += dumbshiny * spec.rgb;
+ }
+
+ col = atmosLighting(col);
+ col = scaleSoftClip(col);
+
+ fcol += col;
+ }
+
+ gl_FragColor.rgb = fcol/samples;
+ gl_FragColor.a = 0.0;
+}
diff --git a/indra/newview/app_settings/shaders/class2/deferred/softenLightV.glsl b/indra/newview/app_settings/shaders/class2/deferred/softenLightV.glsl
index 8f0bcca76b..745cc01992 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/softenLightV.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/softenLightV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
uniform vec2 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 50b9ef276e..cd3828fbd4 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
#extension GL_ARB_texture_rectangle : enable
diff --git a/indra/newview/app_settings/shaders/class2/deferred/spotLightMSF.glsl b/indra/newview/app_settings/shaders/class2/deferred/spotLightMSF.glsl
new file mode 100644
index 0000000000..ec9b547a47
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class2/deferred/spotLightMSF.glsl
@@ -0,0 +1,245 @@
+/**
+ * @file multiSpotLightF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/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 4369b3b34f..315139b415 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
#extension GL_ARB_texture_rectangle : enable
@@ -45,7 +45,7 @@ uniform float spot_shadow_offset;
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);
diff --git a/indra/newview/app_settings/shaders/class2/deferred/sunLightMSF.glsl b/indra/newview/app_settings/shaders/class2/deferred/sunLightMSF.glsl
new file mode 100644
index 0000000000..63d13c996d
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class2/deferred/sunLightMSF.glsl
@@ -0,0 +1,202 @@
+/**
+ * @file sunLightMSF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/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 847b36b1ac..d53850b489 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl
@@ -5,7 +5,7 @@
* $License$
*/
-#version 120
+
#extension GL_ARB_texture_rectangle : enable
@@ -45,7 +45,7 @@ uniform float spot_shadow_offset;
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);
@@ -234,7 +234,7 @@ void main()
gl_FragColor[0] = shadow;
gl_FragColor[1] = calcAmbientOcclusion(pos, norm);
- spos.xyz = shadow_pos+offset*spot_shadow_offset;
+ spos.xyz = shadow_pos+norm*spot_shadow_offset;
//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
new file mode 100644
index 0000000000..a2a76eed9f
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOMSF.glsl
@@ -0,0 +1,241 @@
+/**
+ * @file sunLightSSAOF.glsl
+ *
+ * Copyright (c) 2007-$CurrentYear$, Linden Research, Inc.
+ * $License$
+ */
+
+
+
+#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 9beb513ad8..814deb3677 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/sunLightV.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/sunLightV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
varying vec4 vary_light;
varying vec2 vary_fragcoord;
diff --git a/indra/newview/app_settings/shaders/class2/effects/blurF.glsl b/indra/newview/app_settings/shaders/class2/effects/blurF.glsl
index a4ad0bfa15..dff4d4a68f 100644
--- a/indra/newview/app_settings/shaders/class2/effects/blurF.glsl
+++ b/indra/newview/app_settings/shaders/class2/effects/blurF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
uniform sampler2DRect RenderTexture;
uniform float bloomStrength;
diff --git a/indra/newview/app_settings/shaders/class2/effects/blurV.glsl b/indra/newview/app_settings/shaders/class2/effects/blurV.glsl
index d471a6c5e5..de469542f9 100644
--- a/indra/newview/app_settings/shaders/class2/effects/blurV.glsl
+++ b/indra/newview/app_settings/shaders/class2/effects/blurV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
uniform vec2 texelSize;
uniform vec2 blurDirection;
diff --git a/indra/newview/app_settings/shaders/class2/effects/colorFilterF.glsl b/indra/newview/app_settings/shaders/class2/effects/colorFilterF.glsl
index 66880b958e..8871bb3fc7 100644
--- a/indra/newview/app_settings/shaders/class2/effects/colorFilterF.glsl
+++ b/indra/newview/app_settings/shaders/class2/effects/colorFilterF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
uniform sampler2DRect RenderTexture;
uniform float brightness;
diff --git a/indra/newview/app_settings/shaders/class2/effects/drawQuadV.glsl b/indra/newview/app_settings/shaders/class2/effects/drawQuadV.glsl
index c35c500d62..9c52b8dd5d 100644
--- a/indra/newview/app_settings/shaders/class2/effects/drawQuadV.glsl
+++ b/indra/newview/app_settings/shaders/class2/effects/drawQuadV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
void main(void)
{
diff --git a/indra/newview/app_settings/shaders/class2/effects/extractF.glsl b/indra/newview/app_settings/shaders/class2/effects/extractF.glsl
index e77baa5bee..713f8021de 100644
--- a/indra/newview/app_settings/shaders/class2/effects/extractF.glsl
+++ b/indra/newview/app_settings/shaders/class2/effects/extractF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
uniform sampler2DRect RenderTexture;
uniform float extractLow;
diff --git a/indra/newview/app_settings/shaders/class2/effects/nightVisionF.glsl b/indra/newview/app_settings/shaders/class2/effects/nightVisionF.glsl
index 8e0eec6f5e..fd94b2e95f 100644
--- a/indra/newview/app_settings/shaders/class2/effects/nightVisionF.glsl
+++ b/indra/newview/app_settings/shaders/class2/effects/nightVisionF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
uniform sampler2DRect RenderTexture;
uniform sampler2D NoiseTexture;
diff --git a/indra/newview/app_settings/shaders/class2/effects/simpleF.glsl b/indra/newview/app_settings/shaders/class2/effects/simpleF.glsl
index 98a50e22fc..a1a9c9716c 100644
--- a/indra/newview/app_settings/shaders/class2/effects/simpleF.glsl
+++ b/indra/newview/app_settings/shaders/class2/effects/simpleF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
uniform sampler2DRect RenderTexture;
diff --git a/indra/newview/app_settings/shaders/class2/environment/terrainF.glsl b/indra/newview/app_settings/shaders/class2/environment/terrainF.glsl
index bbb8951f3a..9527dc469b 100644
--- a/indra/newview/app_settings/shaders/class2/environment/terrainF.glsl
+++ b/indra/newview/app_settings/shaders/class2/environment/terrainF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
uniform sampler2D detail_0;
uniform sampler2D detail_1;
diff --git a/indra/newview/app_settings/shaders/class2/environment/terrainV.glsl b/indra/newview/app_settings/shaders/class2/environment/terrainV.glsl
index 84906c16bf..2658bee88d 100644
--- a/indra/newview/app_settings/shaders/class2/environment/terrainV.glsl
+++ b/indra/newview/app_settings/shaders/class2/environment/terrainV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
void calcAtmospherics(vec3 inPositionEye);
diff --git a/indra/newview/app_settings/shaders/class2/environment/terrainWaterF.glsl b/indra/newview/app_settings/shaders/class2/environment/terrainWaterF.glsl
index 7590c542ef..974e227b77 100644
--- a/indra/newview/app_settings/shaders/class2/environment/terrainWaterF.glsl
+++ b/indra/newview/app_settings/shaders/class2/environment/terrainWaterF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
uniform sampler2D detail_0;
uniform sampler2D detail_1;
diff --git a/indra/newview/app_settings/shaders/class2/environment/underWaterF.glsl b/indra/newview/app_settings/shaders/class2/environment/underWaterF.glsl
index 900f1a6cb8..702e0881ac 100644
--- a/indra/newview/app_settings/shaders/class2/environment/underWaterF.glsl
+++ b/indra/newview/app_settings/shaders/class2/environment/underWaterF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
uniform sampler2D diffuseMap;
uniform sampler2D bumpMap;
diff --git a/indra/newview/app_settings/shaders/class2/environment/waterF.glsl b/indra/newview/app_settings/shaders/class2/environment/waterF.glsl
index f4f6b6e90f..c4e4bc08c5 100644
--- a/indra/newview/app_settings/shaders/class2/environment/waterF.glsl
+++ b/indra/newview/app_settings/shaders/class2/environment/waterF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
vec3 scaleSoftClip(vec3 inColor);
vec3 atmosTransport(vec3 inColor);
diff --git a/indra/newview/app_settings/shaders/class2/environment/waterFogF.glsl b/indra/newview/app_settings/shaders/class2/environment/waterFogF.glsl
index 9f3328cbf0..b66b72b401 100644
--- a/indra/newview/app_settings/shaders/class2/environment/waterFogF.glsl
+++ b/indra/newview/app_settings/shaders/class2/environment/waterFogF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
uniform vec4 lightnorm;
uniform vec4 waterPlane;
diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightF.glsl
index 342bc2ab66..4c31602736 100644
--- a/indra/newview/app_settings/shaders/class2/lighting/lightF.glsl
+++ b/indra/newview/app_settings/shaders/class2/lighting/lightF.glsl
@@ -5,16 +5,14 @@
* $/LicenseInfo$
*/
-#version 120
-uniform sampler2D diffuseMap;
vec3 atmosLighting(vec3 light);
vec3 scaleSoftClip(vec3 light);
void default_lighting()
{
- vec4 color = texture2D(diffuseMap, gl_TexCoord[0].xy) * gl_Color;
+ vec4 color = diffuseLookup(gl_TexCoord[0].xy) * gl_Color;
color.rgb = atmosLighting(color.rgb);
diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightF.glsl
index dad18b5883..95bd052b5d 100644
--- a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightF.glsl
+++ b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightF.glsl
@@ -5,16 +5,14 @@
* $/LicenseInfo$
*/
-#version 120
-uniform sampler2D diffuseMap;
vec3 fullbrightAtmosTransport(vec3 light);
vec3 fullbrightScaleSoftClip(vec3 light);
void fullbright_lighting()
{
- vec4 color = texture2D(diffuseMap, gl_TexCoord[0].xy) * gl_Color;
+ vec4 color = diffuseLookup(gl_TexCoord[0].xy) * gl_Color;
color.rgb = fullbrightAtmosTransport(color.rgb);
diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightNonIndexedF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightNonIndexedF.glsl
new file mode 100644
index 0000000000..b1e61e1a33
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightNonIndexedF.glsl
@@ -0,0 +1,25 @@
+/**
+ * @file lightFullbrightF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/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
index 73ff81e03a..26f0ea84e0 100644
--- a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyF.glsl
+++ b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyF.glsl
@@ -5,9 +5,8 @@
* $/LicenseInfo$
*/
-#version 120
-uniform sampler2D diffuseMap;
+
uniform samplerCube environmentMap;
vec3 fullbrightShinyAtmosTransport(vec3 light);
@@ -15,7 +14,7 @@ vec3 fullbrightScaleSoftClip(vec3 light);
void fullbright_shiny_lighting()
{
- vec4 color = texture2D(diffuseMap, gl_TexCoord[0].xy);
+ vec4 color = diffuseLookup(gl_TexCoord[0].xy);
color.rgb *= gl_Color.rgb;
vec3 envColor = textureCube(environmentMap, gl_TexCoord[1].xyz).rgb;
diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyNonIndexedF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyNonIndexedF.glsl
new file mode 100644
index 0000000000..953298da0d
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyNonIndexedF.glsl
@@ -0,0 +1,32 @@
+/**
+ * @file lightFullbrightShinyF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/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
index 9b4b584369..a6e10a249d 100644
--- a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyWaterF.glsl
+++ b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyWaterF.glsl
@@ -5,9 +5,9 @@
* $License$
*/
-#version 120
-uniform sampler2D diffuseMap;
+
+
uniform samplerCube environmentMap;
vec3 fullbrightShinyAtmosTransport(vec3 light);
@@ -16,7 +16,7 @@ vec4 applyWaterFog(vec4 color);
void fullbright_shiny_lighting_water()
{
- vec4 color = texture2D(diffuseMap, gl_TexCoord[0].xy);
+ vec4 color = diffuseLookup(gl_TexCoord[0].xy);
color.rgb *= gl_Color.rgb;
vec3 envColor = textureCube(environmentMap, gl_TexCoord[1].xyz).rgb;
diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyWaterNonIndexedF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyWaterNonIndexedF.glsl
new file mode 100644
index 0000000000..b4bb665a2b
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyWaterNonIndexedF.glsl
@@ -0,0 +1,32 @@
+/**
+ * @file lightFullbrightShinyWaterF.glsl
+ *
+ * Copyright (c) 2007-$CurrentYear$, Linden Research, Inc.
+ * $License$
+ */
+
+
+
+
+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/lightFullbrightWaterF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightWaterF.glsl
index 3d46c8d874..887d4130e7 100644
--- a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightWaterF.glsl
+++ b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightWaterF.glsl
@@ -5,16 +5,16 @@
* $/LicenseInfo$
*/
-#version 120
-uniform sampler2D diffuseMap;
+
+vec4 diffuseLookup(vec2 texcoord);
vec3 fullbrightAtmosTransport(vec3 light);
vec4 applyWaterFog(vec4 color);
void fullbright_lighting_water()
{
- vec4 color = texture2D(diffuseMap, gl_TexCoord[0].xy) * gl_Color;
+ vec4 color = diffuseLookup(gl_TexCoord[0].xy) * gl_Color;
color.rgb = fullbrightAtmosTransport(color.rgb);
diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightWaterNonIndexedF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightWaterNonIndexedF.glsl
new file mode 100644
index 0000000000..1234682ae9
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightWaterNonIndexedF.glsl
@@ -0,0 +1,23 @@
+/**
+ * @file lightFullbrightWaterF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/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
new file mode 100644
index 0000000000..149cf791f5
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class2/lighting/lightNonIndexedF.glsl
@@ -0,0 +1,25 @@
+/**
+ * @file lightF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/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
index ebe21320b4..300fcac092 100644
--- a/indra/newview/app_settings/shaders/class2/lighting/lightShinyF.glsl
+++ b/indra/newview/app_settings/shaders/class2/lighting/lightShinyF.glsl
@@ -5,9 +5,9 @@
* $/LicenseInfo$
*/
-#version 120
-uniform sampler2D diffuseMap;
+
+
uniform samplerCube environmentMap;
vec3 scaleSoftClip(vec3 light);
@@ -16,7 +16,7 @@ vec4 applyWaterFog(vec4 color);
void shiny_lighting()
{
- vec4 color = texture2D(diffuseMap, gl_TexCoord[0].xy);
+ vec4 color = diffuseLookup(gl_TexCoord[0].xy);
color.rgb *= gl_Color.rgb;
vec3 envColor = textureCube(environmentMap, gl_TexCoord[1].xyz).rgb;
diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightShinyNonIndexedF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightShinyNonIndexedF.glsl
new file mode 100644
index 0000000000..e877c0abb1
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class2/lighting/lightShinyNonIndexedF.glsl
@@ -0,0 +1,32 @@
+/**
+ * @file lightShinyF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/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
index 7f48e2cf1d..07572fa915 100644
--- a/indra/newview/app_settings/shaders/class2/lighting/lightShinyWaterF.glsl
+++ b/indra/newview/app_settings/shaders/class2/lighting/lightShinyWaterF.glsl
@@ -5,10 +5,9 @@
* $/LicenseInfo$
*/
-#version 120
-uniform sampler2D diffuseMap;
+
uniform samplerCube environmentMap;
vec3 atmosLighting(vec3 light);
@@ -16,7 +15,7 @@ vec4 applyWaterFog(vec4 color);
void shiny_lighting_water()
{
- vec4 color = texture2D(diffuseMap, gl_TexCoord[0].xy);
+ vec4 color = diffuseLookup(gl_TexCoord[0].xy);
color.rgb *= gl_Color.rgb;
vec3 envColor = textureCube(environmentMap, gl_TexCoord[1].xyz).rgb;
diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightShinyWaterNonIndexedF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightShinyWaterNonIndexedF.glsl
new file mode 100644
index 0000000000..3904179427
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class2/lighting/lightShinyWaterNonIndexedF.glsl
@@ -0,0 +1,29 @@
+/**
+ * @file lightShinyWaterF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/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
index ad1dc4da77..3384f64d07 100644
--- a/indra/newview/app_settings/shaders/class2/lighting/lightSpecularV.glsl
+++ b/indra/newview/app_settings/shaders/class2/lighting/lightSpecularV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
// All lights, no specular highlights
diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightV.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightV.glsl
index a0f6e019ef..10c770fcc2 100644
--- a/indra/newview/app_settings/shaders/class2/lighting/lightV.glsl
+++ b/indra/newview/app_settings/shaders/class2/lighting/lightV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
// All lights, no specular highlights
diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightWaterF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightWaterF.glsl
index 97eba92d7b..61341a9f1f 100644
--- a/indra/newview/app_settings/shaders/class2/lighting/lightWaterF.glsl
+++ b/indra/newview/app_settings/shaders/class2/lighting/lightWaterF.glsl
@@ -5,16 +5,14 @@
* $/LicenseInfo$
*/
-#version 120
-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;
+ vec4 color = diffuseLookup(gl_TexCoord[0].xy) * gl_Color;
color.rgb = atmosLighting(color.rgb);
diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightWaterNonIndexedF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightWaterNonIndexedF.glsl
new file mode 100644
index 0000000000..ba850b61d0
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class2/lighting/lightWaterNonIndexedF.glsl
@@ -0,0 +1,23 @@
+/**
+ * @file lightWaterF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/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 fde32ed035..8df2e6f222 100644
--- a/indra/newview/app_settings/shaders/class2/lighting/sumLightsSpecularV.glsl
+++ b/indra/newview/app_settings/shaders/class2/lighting/sumLightsSpecularV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
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);
diff --git a/indra/newview/app_settings/shaders/class2/lighting/sumLightsV.glsl b/indra/newview/app_settings/shaders/class2/lighting/sumLightsV.glsl
index 8fe49e3be0..3d43a1813a 100644
--- a/indra/newview/app_settings/shaders/class2/lighting/sumLightsV.glsl
+++ b/indra/newview/app_settings/shaders/class2/lighting/sumLightsV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
float calcDirectionalLight(vec3 n, vec3 l);
float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float is_pointlight);
diff --git a/indra/newview/app_settings/shaders/class2/objects/fullbrightShinyV.glsl b/indra/newview/app_settings/shaders/class2/objects/fullbrightShinyV.glsl
new file mode 100644
index 0000000000..f49e74406f
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class2/objects/fullbrightShinyV.glsl
@@ -0,0 +1,35 @@
+/**
+ * @file fullbrightShinyV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/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
new file mode 100644
index 0000000000..3076fa3260
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class2/objects/fullbrightV.glsl
@@ -0,0 +1,29 @@
+/**
+ * @file fullbrightV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/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
index 4cebb06df0..49992d3535 100644
--- a/indra/newview/app_settings/shaders/class2/objects/shinyV.glsl
+++ b/indra/newview/app_settings/shaders/class2/objects/shinyV.glsl
@@ -5,20 +5,24 @@
* $/LicenseInfo$
*/
-#version 120
+
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
- gl_Position = ftransform();
+ vec4 vert = vec4(gl_Vertex.xyz,1.0);
+ vary_texture_index = gl_Vertex.w;
+ gl_Position = gl_ModelViewProjectionMatrix*vert;
- vec4 pos = (gl_ModelViewMatrix * gl_Vertex);
+ vec4 pos = (gl_ModelViewMatrix * vert);
vec3 norm = normalize(gl_NormalMatrix * gl_Normal);
vec3 ref = reflect(pos.xyz, -norm);
diff --git a/indra/newview/app_settings/shaders/class2/objects/simpleV.glsl b/indra/newview/app_settings/shaders/class2/objects/simpleV.glsl
new file mode 100644
index 0000000000..5e02391767
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class2/objects/simpleV.glsl
@@ -0,0 +1,33 @@
+/**
+ * @file simpleV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/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/atmosphericsF.glsl b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsF.glsl
index 77d15fba9a..21a0812c1b 100644
--- a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsF.glsl
+++ b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
//////////////////////////////////////////////////////////
// The fragment shader for the terrain atmospherics
diff --git a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsHelpersV.glsl b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsHelpersV.glsl
index 8c5b864cbe..ab4cf4806d 100644
--- a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsHelpersV.glsl
+++ b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsHelpersV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
// Output variables
vec3 getSunlitColor();
diff --git a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsV.glsl b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsV.glsl
index 8d365c15ca..b61b0bb396 100644
--- a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsV.glsl
+++ b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
// varying param funcs
void setSunlitColor(vec3 v);
diff --git a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsVarsF.glsl b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsVarsF.glsl
index cf9ef30632..3a6585bb33 100644
--- a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsVarsF.glsl
+++ b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsVarsF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
varying vec3 vary_PositionEye;
diff --git a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsVarsV.glsl b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsVarsV.glsl
index 398f1556a0..0f6e231ca6 100644
--- a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsVarsV.glsl
+++ b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsVarsV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
varying vec3 vary_PositionEye;
diff --git a/indra/newview/app_settings/shaders/class2/windlight/cloudsF.glsl b/indra/newview/app_settings/shaders/class2/windlight/cloudsF.glsl
index 13207997b2..20f907a006 100644
--- a/indra/newview/app_settings/shaders/class2/windlight/cloudsF.glsl
+++ b/indra/newview/app_settings/shaders/class2/windlight/cloudsF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
/////////////////////////////////////////////////////////////////////////
// The fragment shader for the sky
diff --git a/indra/newview/app_settings/shaders/class2/windlight/cloudsV.glsl b/indra/newview/app_settings/shaders/class2/windlight/cloudsV.glsl
index 267ef36d4d..3eac63076c 100644
--- a/indra/newview/app_settings/shaders/class2/windlight/cloudsV.glsl
+++ b/indra/newview/app_settings/shaders/class2/windlight/cloudsV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
//////////////////////////////////////////////////////////////////////////
// The vertex shader for creating the atmospheric sky
diff --git a/indra/newview/app_settings/shaders/class2/windlight/gammaF.glsl b/indra/newview/app_settings/shaders/class2/windlight/gammaF.glsl
index a658edd21f..6570dcb608 100644
--- a/indra/newview/app_settings/shaders/class2/windlight/gammaF.glsl
+++ b/indra/newview/app_settings/shaders/class2/windlight/gammaF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
uniform vec4 gamma;
diff --git a/indra/newview/app_settings/shaders/class2/windlight/skyF.glsl b/indra/newview/app_settings/shaders/class2/windlight/skyF.glsl
index 77ca4868a6..d14c638130 100644
--- a/indra/newview/app_settings/shaders/class2/windlight/skyF.glsl
+++ b/indra/newview/app_settings/shaders/class2/windlight/skyF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
/////////////////////////////////////////////////////////////////////////
// The fragment shader for the sky
diff --git a/indra/newview/app_settings/shaders/class2/windlight/skyV.glsl b/indra/newview/app_settings/shaders/class2/windlight/skyV.glsl
index 03bca8f27e..1ea00f723a 100644
--- a/indra/newview/app_settings/shaders/class2/windlight/skyV.glsl
+++ b/indra/newview/app_settings/shaders/class2/windlight/skyV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
// SKY ////////////////////////////////////////////////////////////////////////
// The vertex shader for creating the atmospheric sky
diff --git a/indra/newview/app_settings/shaders/class2/windlight/transportF.glsl b/indra/newview/app_settings/shaders/class2/windlight/transportF.glsl
index 7f1ad4d5b4..28381482c1 100644
--- a/indra/newview/app_settings/shaders/class2/windlight/transportF.glsl
+++ b/indra/newview/app_settings/shaders/class2/windlight/transportF.glsl
@@ -5,8 +5,6 @@
* $/LicenseInfo$
*/
-#version 120
-
//////////////////////////////////////////////////////////
// The fragment shader for the terrain atmospherics
//////////////////////////////////////////////////////////
diff --git a/indra/newview/app_settings/shaders/class3/avatar/avatarV.glsl b/indra/newview/app_settings/shaders/class3/avatar/avatarV.glsl
index a003e2a1f1..3d970d252c 100644
--- a/indra/newview/app_settings/shaders/class3/avatar/avatarV.glsl
+++ b/indra/newview/app_settings/shaders/class3/avatar/avatarV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
mat4 getSkinnedTransform();
diff --git a/indra/newview/app_settings/shaders/class3/deferred/giDownsampleF.glsl b/indra/newview/app_settings/shaders/class3/deferred/giDownsampleF.glsl
index fc370ef367..498fee7c66 100644
--- a/indra/newview/app_settings/shaders/class3/deferred/giDownsampleF.glsl
+++ b/indra/newview/app_settings/shaders/class3/deferred/giDownsampleF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
uniform sampler2DRect giLightMap;
diff --git a/indra/newview/app_settings/shaders/class3/deferred/giDownsampleV.glsl b/indra/newview/app_settings/shaders/class3/deferred/giDownsampleV.glsl
index ae57227fe5..eebe930666 100644
--- a/indra/newview/app_settings/shaders/class3/deferred/giDownsampleV.glsl
+++ b/indra/newview/app_settings/shaders/class3/deferred/giDownsampleV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
varying vec2 vary_fragcoord;
uniform vec2 screen_res;
diff --git a/indra/newview/app_settings/shaders/class3/deferred/giF.glsl b/indra/newview/app_settings/shaders/class3/deferred/giF.glsl
index 951e3e97ae..9896f8dafe 100644
--- a/indra/newview/app_settings/shaders/class3/deferred/giF.glsl
+++ b/indra/newview/app_settings/shaders/class3/deferred/giF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
#extension GL_ARB_texture_rectangle : enable
diff --git a/indra/newview/app_settings/shaders/class3/deferred/giFinalF.glsl b/indra/newview/app_settings/shaders/class3/deferred/giFinalF.glsl
index b2f8b2c633..df4c6b3e0a 100644
--- a/indra/newview/app_settings/shaders/class3/deferred/giFinalF.glsl
+++ b/indra/newview/app_settings/shaders/class3/deferred/giFinalF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
#extension GL_ARB_texture_rectangle : enable
diff --git a/indra/newview/app_settings/shaders/class3/deferred/giFinalV.glsl b/indra/newview/app_settings/shaders/class3/deferred/giFinalV.glsl
index 19c4e07b8b..7e20d71529 100644
--- a/indra/newview/app_settings/shaders/class3/deferred/giFinalV.glsl
+++ b/indra/newview/app_settings/shaders/class3/deferred/giFinalV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
varying vec2 vary_fragcoord;
uniform vec2 screen_res;
diff --git a/indra/newview/app_settings/shaders/class3/deferred/giV.glsl b/indra/newview/app_settings/shaders/class3/deferred/giV.glsl
index 8dc1410ea5..e86f2896da 100644
--- a/indra/newview/app_settings/shaders/class3/deferred/giV.glsl
+++ b/indra/newview/app_settings/shaders/class3/deferred/giV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
varying vec2 vary_fragcoord;
diff --git a/indra/newview/app_settings/shaders/class3/deferred/luminanceF.glsl b/indra/newview/app_settings/shaders/class3/deferred/luminanceF.glsl
index 5f3bf68b24..980def6443 100644
--- a/indra/newview/app_settings/shaders/class3/deferred/luminanceF.glsl
+++ b/indra/newview/app_settings/shaders/class3/deferred/luminanceF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
#extension GL_ARB_texture_rectangle : enable
diff --git a/indra/newview/app_settings/shaders/class3/deferred/luminanceV.glsl b/indra/newview/app_settings/shaders/class3/deferred/luminanceV.glsl
index a24eda35dc..9afeac6ddf 100644
--- a/indra/newview/app_settings/shaders/class3/deferred/luminanceV.glsl
+++ b/indra/newview/app_settings/shaders/class3/deferred/luminanceV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
varying vec2 vary_fragcoord;
diff --git a/indra/newview/app_settings/shaders/class3/deferred/postDeferredF.glsl b/indra/newview/app_settings/shaders/class3/deferred/postDeferredF.glsl
index ab99a88971..6d4c20f68c 100644
--- a/indra/newview/app_settings/shaders/class3/deferred/postDeferredF.glsl
+++ b/indra/newview/app_settings/shaders/class3/deferred/postDeferredF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
#extension GL_ARB_texture_rectangle : enable
diff --git a/indra/newview/app_settings/shaders/class3/deferred/postDeferredV.glsl b/indra/newview/app_settings/shaders/class3/deferred/postDeferredV.glsl
index 12983baa94..876f65ee3a 100644
--- a/indra/newview/app_settings/shaders/class3/deferred/postDeferredV.glsl
+++ b/indra/newview/app_settings/shaders/class3/deferred/postDeferredV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
varying vec2 vary_fragcoord;
uniform vec2 screen_res;
diff --git a/indra/newview/app_settings/shaders/class3/deferred/postgiF.glsl b/indra/newview/app_settings/shaders/class3/deferred/postgiF.glsl
index f037754708..fc65881680 100644
--- a/indra/newview/app_settings/shaders/class3/deferred/postgiF.glsl
+++ b/indra/newview/app_settings/shaders/class3/deferred/postgiF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
#extension GL_ARB_texture_rectangle : enable
diff --git a/indra/newview/app_settings/shaders/class3/deferred/postgiV.glsl b/indra/newview/app_settings/shaders/class3/deferred/postgiV.glsl
index ae57227fe5..eebe930666 100644
--- a/indra/newview/app_settings/shaders/class3/deferred/postgiV.glsl
+++ b/indra/newview/app_settings/shaders/class3/deferred/postgiV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
varying vec2 vary_fragcoord;
uniform vec2 screen_res;
diff --git a/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl
index ce32f66000..d38d33cc21 100644
--- a/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl
+++ b/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
#extension GL_ARB_texture_rectangle : enable
diff --git a/indra/newview/app_settings/shaders/class3/deferred/softenLightV.glsl b/indra/newview/app_settings/shaders/class3/deferred/softenLightV.glsl
index 8f0bcca76b..745cc01992 100644
--- a/indra/newview/app_settings/shaders/class3/deferred/softenLightV.glsl
+++ b/indra/newview/app_settings/shaders/class3/deferred/softenLightV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
uniform vec2 screen_res;
diff --git a/indra/newview/app_settings/shaders/class3/deferred/treeF.glsl b/indra/newview/app_settings/shaders/class3/deferred/treeF.glsl
index c54d9a1e3e..de7e038402 100644
--- a/indra/newview/app_settings/shaders/class3/deferred/treeF.glsl
+++ b/indra/newview/app_settings/shaders/class3/deferred/treeF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
uniform sampler2D diffuseMap;
diff --git a/indra/newview/app_settings/shaders/class3/lighting/sumLightsSpecularV.glsl b/indra/newview/app_settings/shaders/class3/lighting/sumLightsSpecularV.glsl
index 04533fdce1..92347a5b4a 100644
--- a/indra/newview/app_settings/shaders/class3/lighting/sumLightsSpecularV.glsl
+++ b/indra/newview/app_settings/shaders/class3/lighting/sumLightsSpecularV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
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);
diff --git a/indra/newview/app_settings/shaders/class3/lighting/sumLightsV.glsl b/indra/newview/app_settings/shaders/class3/lighting/sumLightsV.glsl
index 73bc18b866..24bbc0a1a1 100644
--- a/indra/newview/app_settings/shaders/class3/lighting/sumLightsV.glsl
+++ b/indra/newview/app_settings/shaders/class3/lighting/sumLightsV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
float calcDirectionalLight(vec3 n, vec3 l);
float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float is_pointlight);
diff --git a/indra/newview/app_settings/windlight/days/Colder%20Tones.xml b/indra/newview/app_settings/windlight/days/Colder%20Tones.xml
new file mode 100644
index 0000000000..63d0b099e1
--- /dev/null
+++ b/indra/newview/app_settings/windlight/days/Colder%20Tones.xml
@@ -0,0 +1,28 @@
+<llsd>
+ <array>
+ <array>
+ <real>0</real>
+ <string>Midnight</string>
+ </array>
+ <array>
+ <real>0.24999989569187164</real>
+ <string>Purple</string>
+ </array>
+ <array>
+ <real>0.49999979138374329</real>
+ <string>Blue Midday</string>
+ </array>
+ <array>
+ <real>0.74999970197677612</real>
+ <string>Blizzard</string>
+ </array>
+ <array>
+ <real>0.87499958276748657</real>
+ <string>Ghost</string>
+ </array>
+ <array>
+ <real>0.99999958276748657</real>
+ <string>Midnight</string>
+ </array>
+ </array>
+</llsd>
diff --git a/indra/newview/app_settings/windlight/days/Dynamic%20Richness.xml b/indra/newview/app_settings/windlight/days/Dynamic%20Richness.xml
new file mode 100644
index 0000000000..f75b52e6ed
--- /dev/null
+++ b/indra/newview/app_settings/windlight/days/Dynamic%20Richness.xml
@@ -0,0 +1,32 @@
+<llsd>
+ <array>
+ <array>
+ <real>0</real>
+ <string>Night</string>
+ </array>
+ <array>
+ <real>0.12499994784593582</real>
+ <string>Blizzard</string>
+ </array>
+ <array>
+ <real>0.24999989569187164</real>
+ <string>Sunrise</string>
+ </array>
+ <array>
+ <real>0.49999979138374329</real>
+ <string>Midday 3</string>
+ </array>
+ <array>
+ <real>0.68749970197677612</real>
+ <string>Pirate</string>
+ </array>
+ <array>
+ <real>0.81249970197677612</real>
+ <string>Coastal Sunset</string>
+ </array>
+ <array>
+ <real>0.99999958276748657</real>
+ <string>Midnight</string>
+ </array>
+ </array>
+</llsd>
diff --git a/indra/newview/app_settings/windlight/days/Pirate%27s%20Dream.xml b/indra/newview/app_settings/windlight/days/Pirate%27s%20Dream.xml
new file mode 100644
index 0000000000..6dc1ba9f4d
--- /dev/null
+++ b/indra/newview/app_settings/windlight/days/Pirate%27s%20Dream.xml
@@ -0,0 +1,44 @@
+<llsd>
+ <array>
+ <array>
+ <real>0</real>
+ <string>A-12AM</string>
+ </array>
+ <array>
+ <real>0.12499994784593582</real>
+ <string>A-3AM</string>
+ </array>
+ <array>
+ <real>0.22222213447093964</real>
+ <string>Barcelona</string>
+ </array>
+ <array>
+ <real>0.30208322405815125</real>
+ <string>Sunrise</string>
+ </array>
+ <array>
+ <real>0.37499985098838806</real>
+ <string>Sailor&apos;s Delight</string>
+ </array>
+ <array>
+ <real>0.53819423913955688</real>
+ <string>Coastal Afternoon</string>
+ </array>
+ <array>
+ <real>0.63194417953491211</real>
+ <string>Pirate</string>
+ </array>
+ <array>
+ <real>0.7048608660697937</real>
+ <string>Desert Sunset</string>
+ </array>
+ <array>
+ <real>0.74999970197677612</real>
+ <string>Coastal Sunset</string>
+ </array>
+ <array>
+ <real>0.87499958276748657</real>
+ <string>Blizzard</string>
+ </array>
+ </array>
+</llsd>
diff --git a/indra/newview/app_settings/windlight/days/Psycho%20Strobe%21.xml b/indra/newview/app_settings/windlight/days/Psycho%20Strobe%21.xml
new file mode 100644
index 0000000000..302af5a9ba
--- /dev/null
+++ b/indra/newview/app_settings/windlight/days/Psycho%20Strobe%21.xml
@@ -0,0 +1,72 @@
+<llsd>
+ <array>
+ <array>
+ <real>0</real>
+ <string>Sheer Surreality</string>
+ </array>
+ <array>
+ <real>0.062499973922967911</real>
+ <string>A-12AM</string>
+ </array>
+ <array>
+ <real>0.12499994784593582</real>
+ <string>Sheer Surreality</string>
+ </array>
+ <array>
+ <real>0.18749992549419403</real>
+ <string>A-3AM</string>
+ </array>
+ <array>
+ <real>0.24999989569187164</real>
+ <string>Sheer Surreality</string>
+ </array>
+ <array>
+ <real>0.31249985098838806</real>
+ <string>A-6AM</string>
+ </array>
+ <array>
+ <real>0.37499985098838806</real>
+ <string>Sheer Surreality</string>
+ </array>
+ <array>
+ <real>0.43749979138374329</real>
+ <string>A-9AM</string>
+ </array>
+ <array>
+ <real>0.49999979138374329</real>
+ <string>Sheer Surreality</string>
+ </array>
+ <array>
+ <real>0.5624997615814209</real>
+ <string>A-12PM</string>
+ </array>
+ <array>
+ <real>0.62499970197677612</real>
+ <string>Sheer Surreality</string>
+ </array>
+ <array>
+ <real>0.68749970197677612</real>
+ <string>A-3PM</string>
+ </array>
+ <array>
+ <real>0.74999970197677612</real>
+ <string>Sheer Surreality</string>
+ </array>
+ <array>
+ <real>0.81249970197677612</real>
+ <string>A-6PM</string>
+ </array>
+ <array>
+ <real>0.87499958276748657</real>
+ <string>Sheer Surreality</string>
+ </array>
+ <array>
+ <real>0.93749958276748657</real>
+ <string>A-9PM</string>
+ </array>
+ <array>
+ <real>0.99999958276748657</real>
+ <string>Sheer Surreality</string>
+ </array>
+ </array>
+</llsd>
diff --git a/indra/newview/app_settings/windlight/days/Tropicalia.xml b/indra/newview/app_settings/windlight/days/Tropicalia.xml
new file mode 100644
index 0000000000..89a56d4a13
--- /dev/null
+++ b/indra/newview/app_settings/windlight/days/Tropicalia.xml
@@ -0,0 +1,32 @@
+<llsd>
+ <array>
+ <array>
+ <real>0.062499973922967911</real>
+ <string>Purple</string>
+ </array>
+ <array>
+ <real>0.16666659712791443</real>
+ <string>Funky Funky</string>
+ </array>
+ <array>
+ <real>0.31249985098838806</real>
+ <string>Sunrise</string>
+ </array>
+ <array>
+ <real>0.49999979138374329</real>
+ <string>Fine Day</string>
+ </array>
+ <array>
+ <real>0.66666638851165771</real>
+ <string>Desert Sunset</string>
+ </array>
+ <array>
+ <real>0.74999970197677612</real>
+ <string>Sailor&apos;s Delight</string>
+ </array>
+ <array>
+ <real>0.95833295583724976</real>
+ <string>Midnight</string>
+ </array>
+ </array>
+</llsd>
diff --git a/indra/newview/app_settings/windlight/days/Weird-O.xml b/indra/newview/app_settings/windlight/days/Weird-O.xml
new file mode 100644
index 0000000000..1e312f2464
--- /dev/null
+++ b/indra/newview/app_settings/windlight/days/Weird-O.xml
@@ -0,0 +1,56 @@
+<llsd>
+ <array>
+ <array>
+ <real>0</real>
+ <string>Funky Funky</string>
+ </array>
+ <array>
+ <real>0.13194438815116882</real>
+ <string>Funky Funky Funky</string>
+ </array>
+ <array>
+ <real>0.26041656732559204</real>
+ <string>Gelatto</string>
+ </array>
+ <array>
+ <real>0.40624985098838806</real>
+ <string>Funky Funky Funky</string>
+ </array>
+ <array>
+ <real>0.43749979138374329</real>
+ <string>Ghost</string>
+ </array>
+ <array>
+ <real>0.46874979138374329</real>
+ <string>Gelatto</string>
+ </array>
+ <array>
+ <real>0.5486108660697937</real>
+ <string>Sheer Surreality</string>
+ </array>
+ <array>
+ <real>0.6076386570930481</real>
+ <string>Gelatto</string>
+ </array>
+ <array>
+ <real>0.68055528402328491</real>
+ <string>Ghost</string>
+ </array>
+ <array>
+ <real>0.75694411993026733</real>
+ <string>Sheer Surreality</string>
+ </array>
+ <array>
+ <real>0.87847185134887695</real>
+ <string>Gelatto</string>
+ </array>
+ <array>
+ <real>0.91319411993026733</real>
+ <string>Funky Funky Funky</string>
+ </array>
+ <array>
+ <real>0.96527737379074097</real>
+ <string>Funky Funky Funky</string>
+ </array>
+ </array>
+</llsd>
diff --git a/indra/newview/app_settings/windlight/postprocesseffects.xml b/indra/newview/app_settings/windlight/postprocesseffects.xml
index 4645215a47..60fbfd3483 100644
--- a/indra/newview/app_settings/windlight/postprocesseffects.xml
+++ b/indra/newview/app_settings/windlight/postprocesseffects.xml
@@ -1,2 +1 @@
<llsd><map><key>Asi Weird</key><map><key>bloom_strength</key><real>4.5799999237060547</real><key>bloom_width</key><real>12.539999961853027</real><key>brightness</key><real>0.89999997615814209</real><key>brightness_multiplier</key><real>3</real><key>contrast</key><real>0.22999998927116394</real><key>contrast_base</key><array><real>1</real><real>1</real><real>1</real><real>0.5</real></array><key>enable_bloom</key><integer>1</integer><key>enable_color_filter</key><integer>1</integer><key>enable_night_vision</key><boolean>0</boolean><key>extract_high</key><real>1</real><key>extract_low</key><real>0.47999998927116394</real><key>noise_size</key><real>25</real><key>noise_strength</key><real>0.40000000000000002</real><key>saturation</key><real>-1</real></map><key>NegativeSaturation</key><map><key>bloom_strength</key><real>1.5</real><key>bloom_width</key><real>2.25</real><key>brightness</key><real>1</real><key>brightness_multiplier</key><real>3</real><key>contrast</key><real>1</real><key>contrast_base</key><array><real>1</real><real>1</real><real>1</real><real>0.5</real></array><key>enable_bloom</key><boolean>0</boolean><key>enable_color_filter</key><integer>1</integer><key>enable_night_vision</key><boolean>0</boolean><key>extract_high</key><real>1</real><key>extract_low</key><real>0.94999999999999996</real><key>noise_size</key><real>25</real><key>noise_strength</key><real>0.40000000000000002</real><key>saturation</key><real>-1</real></map><key>NightVision</key><map><key>bloom_strength</key><real>1.5</real><key>bloom_width</key><real>2.25</real><key>brightness</key><real>1</real><key>brightness_multiplier</key><real>3</real><key>contrast</key><real>1</real><key>contrast_base</key><array><real>1</real><real>1</real><real>1</real><real>0.5</real></array><key>enable_bloom</key><boolean>0</boolean><key>enable_color_filter</key><boolean>0</boolean><key>enable_night_vision</key><integer>1</integer><key>extract_high</key><real>1</real><key>extract_low</key><real>0.94999999999999996</real><key>noise_size</key><real>25</real><key>noise_strength</key><real>0.40000000000000002</real><key>saturation</key><real>1</real></map><key>WGhost</key><map><key>bloom_strength</key><real>2.0399999618530273</real><key>bloom_width</key><real>2.25</real><key>brightness</key><real>1</real><key>brightness_multiplier</key><real>3</real><key>contrast</key><real>1</real><key>contrast_base</key><array><real>1</real><real>1</real><real>1</real><real>0.5</real></array><key>enable_bloom</key><integer>1</integer><key>enable_color_filter</key><boolean>0</boolean><key>enable_night_vision</key><boolean>0</boolean><key>extract_high</key><real>1</real><key>extract_low</key><real>0.22999998927116394</real><key>noise_size</key><real>25</real><key>noise_strength</key><real>0.40000000000000002</real><key>saturation</key><real>1</real></map><key>default</key><map><key>bloom_strength</key><real>1.5</real><key>bloom_width</key><real>2.25</real><key>brightness</key><real>1</real><key>brightness_multiplier</key><real>3</real><key>contrast</key><real>1</real><key>contrast_base</key><array><real>1</real><real>1</real><real>1</real><real>0.5</real></array><key>enable_bloom</key><boolean>0</boolean><key>enable_color_filter</key><boolean>0</boolean><key>enable_night_vision</key><boolean>0</boolean><key>extract_high</key><real>1</real><key>extract_low</key><real>0.94999999999999996</real><key>noise_size</key><real>25</real><key>noise_strength</key><real>0.40000000000000002</real><key>saturation</key><real>1</real></map></map></llsd>
-><map><key>bloom_strength</key><real>1.5</real><key>bloom_width</key><real>2.25</real><key>brightness</key><real>1</real><key>brightness_multiplier</key><real>3</real><key>contrast</key><real>1</real><key>contrast_base</key><array><real>1</real><real>1</real><real>1</real><real>0.5</real></array><key>enable_bloom</key><boolean>0</boolean><key>enable_color_filter</key><boolean>0</boolean><key>enable_night_vision</key><boolean>0</boolean><key>extract_high</key><real>1</real><key>extract_low</key><real>0.94999999999999996</real><key>noise_size</key><real>25</real><key>noise_strength</key><real>0.40000000000000002</real><key>saturation</key><real>1</real></map></map></llsd>
diff --git a/indra/newview/app_settings/windlight/skies/Midday.xml b/indra/newview/app_settings/windlight/skies/Midday.xml
new file mode 100644
index 0000000000..119b3e1418
--- /dev/null
+++ b/indra/newview/app_settings/windlight/skies/Midday.xml
@@ -0,0 +1,141 @@
+<llsd>
+ <map>
+ <key>ambient</key>
+ <array>
+ <real>1.0499999523162842</real>
+ <real>1.0499999523162842</real>
+ <real>1.0499999523162842</real>
+ <real>0.34999999403953552</real>
+ </array>
+ <key>blue_density</key>
+ <array>
+ <real>0.24475815892219543</real>
+ <real>0.44872328639030457</real>
+ <real>0.75999999046325684</real>
+ <real>0.37999999523162842</real>
+ </array>
+ <key>blue_horizon</key>
+ <array>
+ <real>0.49548381567001343</real>
+ <real>0.49548381567001343</real>
+ <real>0.63999998569488525</real>
+ <real>0.31999999284744263</real>
+ </array>
+ <key>cloud_color</key>
+ <array>
+ <real>0.40999999642372131</real>
+ <real>0.40999999642372131</real>
+ <real>0.40999999642372131</real>
+ <real>0.40999999642372131</real>
+ </array>
+ <key>cloud_pos_density1</key>
+ <array>
+ <real>1.6884100437164307</real>
+ <real>0.52609699964523315</real>
+ <real>1</real>
+ <real>1</real>
+ </array>
+ <key>cloud_pos_density2</key>
+ <array>
+ <real>1.6884100437164307</real>
+ <real>0.52609699964523315</real>
+ <real>0.125</real>
+ <real>1</real>
+ </array>
+ <key>cloud_scale</key>
+ <array>
+ <real>0.41999998688697815</real>
+ <real>0</real>
+ <real>0</real>
+ <real>1</real>
+ </array>
+ <key>cloud_scroll_rate</key>
+ <array>
+ <real>10.199999809265137</real>
+ <real>10.01099967956543</real>
+ </array>
+ <key>cloud_shadow</key>
+ <array>
+ <real>0.26999998092651367</real>
+ <real>0</real>
+ <real>0</real>
+ <real>1</real>
+ </array>
+ <key>density_multiplier</key>
+ <array>
+ <real>0.00017999998817685992</real>
+ <real>0</real>
+ <real>0</real>
+ <real>1</real>
+ </array>
+ <key>distance_multiplier</key>
+ <array>
+ <real>0.80000001192092896</real>
+ <real>0</real>
+ <real>0</real>
+ <real>1</real>
+ </array>
+ <key>east_angle</key>
+ <real>0</real>
+ <key>enable_cloud_scroll</key>
+ <array>
+ <boolean>1</boolean>
+ <boolean>1</boolean>
+ </array>
+ <key>gamma</key>
+ <array>
+ <real>1</real>
+ <real>0</real>
+ <real>0</real>
+ <real>1</real>
+ </array>
+ <key>glow</key>
+ <array>
+ <real>5</real>
+ <real>0.0010000000474974513</real>
+ <real>-0.47999998927116394</real>
+ <real>1</real>
+ </array>
+ <key>haze_density</key>
+ <array>
+ <real>0.69999998807907104</real>
+ <real>0</real>
+ <real>0</real>
+ <real>1</real>
+ </array>
+ <key>haze_horizon</key>
+ <array>
+ <real>0.18999999761581421</real>
+ <real>0.19915600121021271</real>
+ <real>0.19915600121021271</real>
+ <real>1</real>
+ </array>
+ <key>lightnorm</key>
+ <array>
+ <real>0</real>
+ <real>1</real>
+ <real>-4.3711388286737929e-008</real>
+ <real>0</real>
+ </array>
+ <key>max_y</key>
+ <array>
+ <real>1605</real>
+ <real>0</real>
+ <real>0</real>
+ <real>1</real>
+ </array>
+ <key>preset_num</key>
+ <integer>22</integer>
+ <key>star_brightness</key>
+ <real>0</real>
+ <key>sun_angle</key>
+ <real>1.5707963705062866</real>
+ <key>sunlight_color</key>
+ <array>
+ <real>0.7342105507850647</real>
+ <real>0.78157895803451538</real>
+ <real>0.89999997615814209</real>
+ <real>0.29999998211860657</real>
+ </array>
+ </map>
+</llsd>
diff --git a/indra/newview/app_settings/windlight/skies/Midnight.xml b/indra/newview/app_settings/windlight/skies/Midnight.xml
new file mode 100644
index 0000000000..0aba31214a
--- /dev/null
+++ b/indra/newview/app_settings/windlight/skies/Midnight.xml
@@ -0,0 +1,141 @@
+<llsd>
+ <map>
+ <key>ambient</key>
+ <array>
+ <real>0.20405027270317078</real>
+ <real>0.24246673285961151</real>
+ <real>0.32999998331069946</real>
+ <real>0.10999999940395355</real>
+ </array>
+ <key>blue_density</key>
+ <array>
+ <real>0.44999998807907104</real>
+ <real>0.44999998807907104</real>
+ <real>0.44999998807907104</real>
+ <real>1</real>
+ </array>
+ <key>blue_horizon</key>
+ <array>
+ <real>0.23999999463558197</real>
+ <real>0.23999999463558197</real>
+ <real>0.23999999463558197</real>
+ <real>1</real>
+ </array>
+ <key>cloud_color</key>
+ <array>
+ <real>0.22615399956703186</real>
+ <real>0.22615399956703186</real>
+ <real>0.22615399956703186</real>
+ <real>1</real>
+ </array>
+ <key>cloud_pos_density1</key>
+ <array>
+ <real>1.6884100437164307</real>
+ <real>0.52609699964523315</real>
+ <real>0.87999999523162842</real>
+ <real>1</real>
+ </array>
+ <key>cloud_pos_density2</key>
+ <array>
+ <real>1.6884100437164307</real>
+ <real>0.52609699964523315</real>
+ <real>0.125</real>
+ <real>1</real>
+ </array>
+ <key>cloud_scale</key>
+ <array>
+ <real>0.41999998688697815</real>
+ <real>0</real>
+ <real>0</real>
+ <real>1</real>
+ </array>
+ <key>cloud_scroll_rate</key>
+ <array>
+ <real>10.49940013885498</real>
+ <real>10.01099967956543</real>
+ </array>
+ <key>cloud_shadow</key>
+ <array>
+ <real>0.26999998092651367</real>
+ <real>0</real>
+ <real>0</real>
+ <real>1</real>
+ </array>
+ <key>density_multiplier</key>
+ <array>
+ <real>0.00030000001424923539</real>
+ <real>0</real>
+ <real>0</real>
+ <real>1</real>
+ </array>
+ <key>distance_multiplier</key>
+ <array>
+ <real>0</real>
+ <real>0</real>
+ <real>0</real>
+ <real>1</real>
+ </array>
+ <key>east_angle</key>
+ <real>0</real>
+ <key>enable_cloud_scroll</key>
+ <array>
+ <boolean>1</boolean>
+ <boolean>1</boolean>
+ </array>
+ <key>gamma</key>
+ <array>
+ <real>1</real>
+ <real>0</real>
+ <real>0</real>
+ <real>1</real>
+ </array>
+ <key>glow</key>
+ <array>
+ <real>5</real>
+ <real>0.0010000000474974513</real>
+ <real>-0.47999998927116394</real>
+ <real>1</real>
+ </array>
+ <key>haze_density</key>
+ <array>
+ <real>4</real>
+ <real>0</real>
+ <real>0</real>
+ <real>1</real>
+ </array>
+ <key>haze_horizon</key>
+ <array>
+ <real>0</real>
+ <real>0.19915600121021271</real>
+ <real>0.19915600121021271</real>
+ <real>1</real>
+ </array>
+ <key>lightnorm</key>
+ <array>
+ <real>0</real>
+ <real>1</real>
+ <real>-4.8876205482883961e-007</real>
+ <real>1</real>
+ </array>
+ <key>max_y</key>
+ <array>
+ <real>906.20001220703125</real>
+ <real>0</real>
+ <real>0</real>
+ <real>1</real>
+ </array>
+ <key>preset_num</key>
+ <integer>22</integer>
+ <key>star_brightness</key>
+ <real>2</real>
+ <key>sun_angle</key>
+ <real>4.7123894691467285</real>
+ <key>sunlight_color</key>
+ <array>
+ <real>0.34876692295074463</real>
+ <real>0.35574248433113098</real>
+ <real>0.65999996662139893</real>
+ <real>0.2199999988079071</real>
+ </array>
+ </map>
+</llsd>
diff --git a/indra/newview/app_settings/windlight/skies/Sunrise.xml b/indra/newview/app_settings/windlight/skies/Sunrise.xml
new file mode 100644
index 0000000000..bbc7aeec59
--- /dev/null
+++ b/indra/newview/app_settings/windlight/skies/Sunrise.xml
@@ -0,0 +1,141 @@
+<llsd>
+ <map>
+ <key>ambient</key>
+ <array>
+ <real>0.80999994277954102</real>
+ <real>0.46289783716201782</real>
+ <real>0.62999993562698364</real>
+ <real>0.26999998092651367</real>
+ </array>
+ <key>blue_density</key>
+ <array>
+ <real>0.15793180465698242</real>
+ <real>0.43499568104743958</real>
+ <real>0.87000000476837158</real>
+ <real>0.87000000476837158</real>
+ </array>
+ <key>blue_horizon</key>
+ <array>
+ <real>0.20673196017742157</real>
+ <real>0.40988314151763916</real>
+ <real>0.47999998927116394</real>
+ <real>0.47999998927116394</real>
+ </array>
+ <key>cloud_color</key>
+ <array>
+ <real>0.22616604226328718</real>
+ <real>0.22616604226328718</real>
+ <real>0.22616604226328718</real>
+ <real>0.99997219085526012</real>
+ </array>
+ <key>cloud_pos_density1</key>
+ <array>
+ <real>1.6884100437164307</real>
+ <real>0.52609699964523315</real>
+ <real>0.88000025272481253</real>
+ <real>1</real>
+ </array>
+ <key>cloud_pos_density2</key>
+ <array>
+ <real>1.6884100437164307</real>
+ <real>0.52609699964523315</real>
+ <real>0.125</real>
+ <real>1</real>
+ </array>
+ <key>cloud_scale</key>
+ <array>
+ <real>0.41999998688697815</real>
+ <real>0</real>
+ <real>0</real>
+ <real>1</real>
+ </array>
+ <key>cloud_scroll_rate</key>
+ <array>
+ <real>10.49940013883861</real>
+ <real>10.010999679576344</real>
+ </array>
+ <key>cloud_shadow</key>
+ <array>
+ <real>0.26999998092651367</real>
+ <real>0</real>
+ <real>0</real>
+ <real>1</real>
+ </array>
+ <key>density_multiplier</key>
+ <array>
+ <real>0.00062000000616535544</real>
+ <real>0</real>
+ <real>0</real>
+ <real>1</real>
+ </array>
+ <key>distance_multiplier</key>
+ <array>
+ <real>2.6999279499073054</real>
+ <real>0</real>
+ <real>0</real>
+ <real>1</real>
+ </array>
+ <key>east_angle</key>
+ <real>0</real>
+ <key>enable_cloud_scroll</key>
+ <array>
+ <boolean>1</boolean>
+ <boolean>1</boolean>
+ </array>
+ <key>gamma</key>
+ <array>
+ <real>1</real>
+ <real>0</real>
+ <real>0</real>
+ <real>1</real>
+ </array>
+ <key>glow</key>
+ <array>
+ <real>5.0009990693069994</real>
+ <real>0.0010000000474963411</real>
+ <real>-0.48000101923815919</real>
+ <real>1</real>
+ </array>
+ <key>haze_density</key>
+ <array>
+ <real>0.53999996185302734</real>
+ <real>0</real>
+ <real>0</real>
+ <real>1</real>
+ </array>
+ <key>haze_horizon</key>
+ <array>
+ <real>0.15999999642372131</real>
+ <real>0.19915600121021271</real>
+ <real>0.19915600121021271</real>
+ <real>1</real>
+ </array>
+ <key>lightnorm</key>
+ <array>
+ <real>0</real>
+ <real>0.094108223915100098</real>
+ <real>0.99556195735931396</real>
+ <real>0</real>
+ </array>
+ <key>max_y</key>
+ <array>
+ <real>563</real>
+ <real>0</real>
+ <real>0</real>
+ <real>1</real>
+ </array>
+ <key>preset_num</key>
+ <integer>22</integer>
+ <key>star_brightness</key>
+ <real>0</real>
+ <key>sun_angle</key>
+ <real>0.094247691333293915</real>
+ <key>sunlight_color</key>
+ <array>
+ <real>2.369999885559082</real>
+ <real>2.369999885559082</real>
+ <real>2.369999885559082</real>
+ <real>0.78999996185302734</real>
+ </array>
+ </map>
+</llsd>
diff --git a/indra/newview/app_settings/windlight/skies/Sunset.xml b/indra/newview/app_settings/windlight/skies/Sunset.xml
new file mode 100644
index 0000000000..ebf08e1a3f
--- /dev/null
+++ b/indra/newview/app_settings/windlight/skies/Sunset.xml
@@ -0,0 +1,142 @@
+<llsd>
+ <map>
+ <key>ambient</key>
+ <array>
+ <real>1.0199999809265137</real>
+ <real>0.80999994277954102</real>
+ <real>0.80999994277954102</real>
+ <real>1.0199999809265137</real>
+ </array>
+ <key>blue_density</key>
+ <array>
+ <real>0.14522500336170197</real>
+ <real>0.39999699592590332</real>
+ <real>0.80000197887420654</real>
+ <real>1</real>
+ </array>
+ <key>blue_horizon</key>
+ <array>
+ <real>0.10767599940299988</real>
+ <real>0.21348699927330017</real>
+ <real>0.25</real>
+ <real>1</real>
+ </array>
+ <key>cloud_color</key>
+ <array>
+ <real>0.22615399956703186</real>
+ <real>0.22615399956703186</real>
+ <real>0.22615399956703186</real>
+ <real>1</real>
+ </array>
+ <key>cloud_pos_density1</key>
+ <array>
+ <real>1.6884100437164307</real>
+ <real>0.52609699964523315</real>
+ <real>0.87999999523162842</real>
+ <real>1</real>
+ </array>
+ <key>cloud_pos_density2</key>
+ <array>
+ <real>1.6884100437164307</real>
+ <real>0.52609699964523315</real>
+ <real>0.125</real>
+ <real>1</real>
+ </array>
+ <key>cloud_scale</key>
+ <array>
+ <real>0.41999998688697815</real>
+ <real>0</real>
+ <real>0</real>
+ <real>1</real>
+ </array>
+ <key>cloud_scroll_rate</key>
+ <array>
+ <real>10.49940013885498</real>
+ <real>10.01099967956543</real>
+ </array>
+ <key>cloud_shadow</key>
+ <array>
+ <real>0.26999998092651367</real>
+ <real>0</real>
+ <real>0</real>
+ <real>1</real>
+ </array>
+ <key>density_multiplier</key>
+ <array>
+ <real>0.00046000001020729542</real>
+ <real>0</real>
+ <real>0</real>
+ <real>1</real>
+ </array>
+ <key>distance_multiplier</key>
+ <array>
+ <real>1</real>
+ <real>0</real>
+ <real>0</real>
+ <real>1</real>
+ </array>
+ <key>east_angle</key>
+ <real>0</real>
+ <key>enable_cloud_scroll</key>
+ <array>
+ <boolean>1</boolean>
+ <boolean>1</boolean>
+ </array>
+ <key>gamma</key>
+ <array>
+ <real>1</real>
+ <real>0</real>
+ <real>0</real>
+ <real>1</real>
+ </array>
+ <key>glow</key>
+ <array>
+ <real>5</real>
+ <real>0.0010000000474974513</real>
+ <real>-0.47999998927116394</real>
+ <real>1</real>
+ </array>
+ <key>haze_density</key>
+ <array>
+ <real>0.69999998807907104</real>
+ <real>0</real>
+ <real>0</real>
+ <real>1</real>
+ </array>
+ <key>haze_horizon</key>
+ <array>
+ <real>0.15999999642372131</real>
+ <real>0.19915600121021271</real>
+ <real>0.19915600121021271</real>
+ <real>1</real>
+ </array>
+ <key>lightnorm</key>
+ <array>
+ <real>0</real>
+ <real>0.07532646507024765</real>
+ <real>-0.99715894460678101</real>
+ <real>0</real>
+ </array>
+ <key>max_y</key>
+ <array>
+ <real>562.5</real>
+ <real>0</real>
+ <real>0</real>
+ <real>1</real>
+ </array>
+ <key>preset_num</key>
+ <integer>22</integer>
+ <key>star_brightness</key>
+ <real>0</real>
+ <key>sun_angle</key>
+ <real>3.0661947727203369</real>
+ <key>sunlight_color</key>
+ <array>
+ <real>2.8385701179504395</real>
+ <real>2.8385701179504395</real>
+ <real>2.8385701179504395</real>
+ <real>1</real>
+ </array>
+ </map>
+</llsd>
+
diff --git a/indra/newview/featuretable.txt b/indra/newview/featuretable.txt
index dd8a88e558..22c79a4cbd 100644
--- a/indra/newview/featuretable.txt
+++ b/indra/newview/featuretable.txt
@@ -1,4 +1,4 @@
-version 27
+version 30
// NOTE: This is mostly identical to featuretable_mac.txt with a few differences
// Should be combined into one table
@@ -48,6 +48,7 @@ RenderTransparentWater 1 1
RenderTreeLODFactor 1 1.0
RenderUseImpostors 1 1
RenderVBOEnable 1 1
+RenderVBOMappingDisable 1 1
RenderVolumeLODFactor 1 2.0
UseStartScreen 1 1
UseOcclusion 1 1
@@ -59,11 +60,11 @@ Disregard96DefaultDrawDistance 1 1
RenderTextureMemoryMultiple 1 1.0
RenderShaderLightingMaxLevel 1 3
RenderDeferred 1 1
-SkyUseClassicClouds 1 1
RenderDeferredSSAO 1 1
RenderShadowDetail 1 2
WatchdogDisabled 1 1
RenderUseStreamVBO 1 1
+RenderFSAASamples 1 16
//
// Low Graphics Settings
@@ -91,10 +92,10 @@ RenderVolumeLODFactor 1 0.5
VertexShaderEnable 1 0
WindLightUseAtmosShaders 1 0
WLSkyDetail 1 48
-SkyUseClassicClouds 1 0
RenderDeferred 1 0
RenderDeferredSSAO 1 0
RenderShadowDetail 1 0
+RenderFSAASamples 1 0
//
// Mid Graphics Settings
@@ -124,6 +125,7 @@ WLSkyDetail 1 48
RenderDeferred 1 0
RenderDeferredSSAO 1 0
RenderShadowDetail 1 0
+RenderFSAASamples 1 0
//
// High Graphics Settings (purty)
@@ -153,6 +155,7 @@ WLSkyDetail 1 48
RenderDeferred 1 0
RenderDeferredSSAO 1 0
RenderShadowDetail 1 0
+RenderFSAASamples 1 4
//
// Ultra graphics (REALLY PURTY!)
@@ -181,6 +184,8 @@ WLSkyDetail 1 128
RenderDeferred 1 1
RenderDeferredSSAO 1 1
RenderShadowDetail 1 2
+RenderFSAASamples 1 8
+
//
// Class Unknown Hardware (unknown)
@@ -238,6 +243,12 @@ RenderDeferred 0 0
RenderDeferredSSAO 0 0
RenderShadowDetail 0 0
+//
+// No GL_ARB_map_buffer_range
+//
+list NoMapBufferRange
+RenderVBOMappingDisable 1 0
+
//
// "Default" setups for safe, low, medium, high
@@ -284,6 +295,7 @@ RenderDeferred 0 0
list Intel
RenderAnisotropic 1 0
+RenderVBOEnable 1 0
list GeForce2
RenderAnisotropic 1 0
@@ -467,7 +479,6 @@ RenderAvatarCloth 0 0
list ATI
RenderUseStreamVBO 1 0
-RenderAvatarVP 1 0
// Disable vertex buffer objects by default for ATI cards with little video memory
list ATIVramLT256
diff --git a/indra/newview/featuretable_linux.txt b/indra/newview/featuretable_linux.txt
index 058bdcc730..649f5ebd18 100644
--- a/indra/newview/featuretable_linux.txt
+++ b/indra/newview/featuretable_linux.txt
@@ -1,4 +1,4 @@
-version 23
+version 25
// NOTE: This is mostly identical to featuretable_mac.txt with a few differences
// Should be combined into one table
@@ -48,6 +48,7 @@ RenderTransparentWater 1 1
RenderTreeLODFactor 1 1.0
RenderUseImpostors 1 1
RenderVBOEnable 1 1
+RenderVBOMappingDisable 1 1
RenderVolumeLODFactor 1 2.0
UseStartScreen 1 1
UseOcclusion 1 1
@@ -57,11 +58,11 @@ WLSkyDetail 1 128
Disregard128DefaultDrawDistance 1 1
Disregard96DefaultDrawDistance 1 1
RenderTextureMemoryMultiple 1 1.0
-SkyUseClassicClouds 1 1
RenderShaderLightingMaxLevel 1 3
RenderDeferred 1 1
RenderDeferredSSAO 1 1
RenderShadowDetail 1 2
+RenderFSAASamples 1 16
//
// Low Graphics Settings
@@ -89,10 +90,10 @@ RenderVolumeLODFactor 1 0.5
VertexShaderEnable 1 0
WindLightUseAtmosShaders 1 0
WLSkyDetail 1 48
-SkyUseClassicClouds 1 0
RenderDeferred 1 0
RenderDeferredSSAO 1 0
RenderShadowDetail 1 0
+RenderFSAASamples 1 0
//
// Mid Graphics Settings
@@ -122,6 +123,7 @@ WLSkyDetail 1 48
RenderDeferred 1 0
RenderDeferredSSAO 1 0
RenderShadowDetail 1 0
+RenderFSAASamples 1 0
//
// High Graphics Settings (purty)
@@ -151,6 +153,7 @@ WLSkyDetail 1 48
RenderDeferred 1 0
RenderDeferredSSAO 1 0
RenderShadowDetail 1 0
+RenderFSAASamples 1 4
//
// Ultra graphics (REALLY PURTY!)
@@ -180,6 +183,7 @@ WLSkyDetail 1 128
RenderDeferred 1 1
RenderDeferredSSAO 1 1
RenderShadowDetail 1 2
+RenderFSAASamples 1 8
//
// Class Unknown Hardware (unknown)
@@ -237,6 +241,13 @@ RenderDeferred 0 0
RenderDeferredSSAO 0 0
RenderShadowDetail 0 0
+//
+// No GL_ARB_map_buffer_range
+//
+list NoMapBufferRange
+RenderVBOMappingDisable 1 0
+
+
// "Default" setups for safe, low, medium, high
//
diff --git a/indra/newview/featuretable_mac.txt b/indra/newview/featuretable_mac.txt
index c075c660f3..ee08e78af5 100644
--- a/indra/newview/featuretable_mac.txt
+++ b/indra/newview/featuretable_mac.txt
@@ -1,4 +1,4 @@
-version 23
+version 26
// NOTE: This is mostly identical to featuretable_mac.txt with a few differences
// Should be combined into one table
@@ -48,6 +48,7 @@ RenderTransparentWater 1 1
RenderTreeLODFactor 1 1.0
RenderUseImpostors 1 1
RenderVBOEnable 1 1
+RenderVBOMappingDisable 1 1
RenderVolumeLODFactor 1 2.0
UseStartScreen 1 1
UseOcclusion 1 1
@@ -58,12 +59,12 @@ Disregard128DefaultDrawDistance 1 1
Disregard96DefaultDrawDistance 1 1
RenderTextureMemoryMultiple 1 0.5
RenderShaderLightingMaxLevel 1 3
-SkyUseClassicClouds 1 1
RenderDeferred 1 1
RenderDeferredSSAO 1 1
RenderShadowDetail 1 2
WatchdogDisabled 1 1
RenderUseStreamVBO 1 1
+RenderFSAASamples 1 16
//
// Low Graphics Settings
@@ -91,10 +92,10 @@ RenderVolumeLODFactor 1 0.5
VertexShaderEnable 1 0
WindLightUseAtmosShaders 1 0
WLSkyDetail 1 48
-SkyUseClassicClouds 1 0
RenderDeferred 1 0
RenderDeferredSSAO 1 0
RenderShadowDetail 1 0
+RenderFSAASamples 1 0
//
// Mid Graphics Settings
@@ -124,6 +125,7 @@ WLSkyDetail 1 48
RenderDeferred 1 0
RenderDeferredSSAO 1 0
RenderShadowDetail 1 0
+RenderFSAASamples 1 0
//
// High Graphics Settings (purty)
@@ -153,6 +155,7 @@ WLSkyDetail 1 48
RenderDeferred 1 0
RenderDeferredSSAO 1 0
RenderShadowDetail 1 2
+RenderFSAASamples 1 4
//
// Ultra graphics (REALLY PURTY!)
@@ -182,6 +185,7 @@ WLSkyDetail 1 128
RenderDeferred 1 0
RenderDeferredSSAO 1 0
RenderShadowDetail 1 2
+RenderFSAASamples 1 8
//
// Class Unknown Hardware (unknown)
@@ -240,6 +244,13 @@ RenderDeferredSSAO 0 0
RenderShadowDetail 0 0
//
+// No GL_ARB_map_buffer_range
+//
+list NoMapBufferRange
+RenderVBOMappingDisable 1 0
+
+
+//
// "Default" setups for safe, low, medium, high
//
list safe
@@ -281,6 +292,9 @@ RenderVBOEnable 1 0
list TexUnit8orLess
RenderDeferredSSAO 0 0
+list ATI
+RenderDeferredSSAO 0 0
+
list Intel
RenderAnisotropic 1 0
RenderLocalLights 1 0
@@ -409,31 +423,6 @@ Disregard128DefaultDrawDistance 1 0
list ATI_Mobility_Radeon_X1xxx
Disregard128DefaultDrawDistance 1 0
-
-
-
-// Avatar hardware skinning causes
-// invisible avatars on HD 2600... so I masked
-// out other possible bad ones till it's fixed
-
-list ATI_Radeon_HD_2300
-RenderAvatarVP 0 0
-RenderAvatarCloth 0 0
-Disregard128DefaultDrawDistance 1 0
-list ATI_Radeon_HD_2400
-RenderAvatarVP 0 0
-RenderAvatarCloth 0 0
-Disregard128DefaultDrawDistance 1 0
-list ATI_Radeon_HD_2600
-RenderAvatarVP 0 0
-RenderAvatarCloth 0 0
-list ATI_Radeon_HD_2900
-RenderAvatarVP 0 0
-RenderAvatarCloth 0 0
-list ATI_Radeon_HD_3800
-RenderAvatarVP 0 0
-RenderAvatarCloth 0 0
-
/// Tweaked NVIDIA
list NVIDIA_GeForce_FX_5100
diff --git a/indra/newview/featuretable_xp.txt b/indra/newview/featuretable_xp.txt
index 3339172a1a..ba74f9a6c2 100644
--- a/indra/newview/featuretable_xp.txt
+++ b/indra/newview/featuretable_xp.txt
@@ -1,4 +1,4 @@
-version 27
+version 30
// NOTE: This is mostly identical to featuretable_mac.txt with a few differences
// Should be combined into one table
@@ -48,6 +48,7 @@ RenderTransparentWater 1 1
RenderTreeLODFactor 1 1.0
RenderUseImpostors 1 1
RenderVBOEnable 1 1
+RenderVBOMappingDisable 1 1
RenderVolumeLODFactor 1 2.0
UseStartScreen 1 1
UseOcclusion 1 1
@@ -58,12 +59,12 @@ Disregard128DefaultDrawDistance 1 1
Disregard96DefaultDrawDistance 1 1
RenderTextureMemoryMultiple 1 1.0
RenderShaderLightingMaxLevel 1 3
-SkyUseClassicClouds 1 1
RenderDeferred 1 0
RenderDeferredSSAO 1 0
RenderShadowDetail 1 0
WatchdogDisabled 1 1
RenderUseStreamVBO 1 1
+RenderFSAASamples 1 16
//
// Low Graphics Settings
@@ -91,10 +92,10 @@ RenderVolumeLODFactor 1 0.5
VertexShaderEnable 1 0
WindLightUseAtmosShaders 1 0
WLSkyDetail 1 48
-SkyUseClassicClouds 1 0
RenderDeferred 1 0
RenderDeferredSSAO 1 0
RenderShadowDetail 1 0
+RenderFSAASamples 1 0
//
// Mid Graphics Settings
@@ -124,6 +125,7 @@ WLSkyDetail 1 48
RenderDeferred 1 0
RenderDeferredSSAO 1 0
RenderShadowDetail 1 0
+RenderFSAASamples 1 0
//
// High Graphics Settings (purty)
@@ -153,6 +155,7 @@ WLSkyDetail 1 48
RenderDeferred 1 0
RenderDeferredSSAO 1 0
RenderShadowDetail 1 2
+RenderFSAASamples 1 4
//
// Ultra graphics (REALLY PURTY!)
@@ -182,6 +185,7 @@ WLSkyDetail 1 128
RenderDeferred 1 0
RenderDeferredSSAO 1 0
RenderShadowDetail 1 2
+RenderFSAASamples 1 8
//
// Class Unknown Hardware (unknown)
@@ -240,6 +244,13 @@ RenderDeferredSSAO 0 0
RenderShadowDetail 0 0
//
+// No GL_ARB_map_buffer_range
+//
+list NoMapBufferRange
+RenderVBOMappingDisable 1 0
+
+
+//
// "Default" setups for safe, low, medium, high
//
list safe
@@ -282,6 +293,7 @@ RenderDeferred 0 0
list Intel
RenderAnisotropic 1 0
+RenderVBOEnable 1 0
list GeForce2
RenderAnisotropic 1 0
@@ -466,7 +478,6 @@ RenderAvatarCloth 0 0
list ATI
RenderUseStreamVBO 1 0
-RenderAvatarVP 1 0
// Disable vertex buffer objects by default for ATI cards with little video memory
list ATIVramLT256
diff --git a/indra/newview/gpu_table.txt b/indra/newview/gpu_table.txt
index 66b3b97f00..6ed4e3b7f7 100644
--- a/indra/newview/gpu_table.txt
+++ b/indra/newview/gpu_table.txt
@@ -1,10 +1,20 @@
-//
+//
// Categorizes graphics chips into various classes by name
//
-// The table contains chip names regular expressions to match
+// The table contains regular expressions to match
// against driver strings, a class number, and whether we claim
// to support them or not.
//
+// 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):
+//
+// 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>
+//
// Class Numbers:
// 0 - Defaults to low graphics settings. No shaders on by default
// 1 - Defaults to mid graphics settings. Basic shaders on by default
@@ -15,336 +25,495 @@
// 0 - We claim to not support this card.
// 1 - We claim to support this card.
//
-// Format:
-// <chip name> <regexp> <class> <supported>
-//
-3Dfx .*3Dfx.* 0 0
-3Dlabs .*3Dlabs.* 0 0
-ATI 3D-Analyze .*ATI.*3D-Analyze.* 0 0
-ATI All-in-Wonder 7500 .*ATI.*All-in-Wonder 75.* 0 1
-ATI All-in-Wonder 8500 .*ATI.*All-in-Wonder 85.* 0 1
-ATI All-in-Wonder 9200 .*ATI.*All-in-Wonder 92.* 0 1
-ATI All-in-Wonder 9xxx .*ATI.*All-in-Wonder 9.* 1 1
-ATI All-in-Wonder HD .*ATI.*All-in-Wonder HD.* 1 1
-ATI All-in-Wonder X600 .*ATI.*All-in-Wonder X6.* 1 1
-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 ASUS A9xxx .*ATI.*ASUS.*A9.* 1 1
-ATI ASUS AH24xx .*ATI.*ASUS.*AH24.* 1 1
-ATI ASUS AH26xx .*ATI.*ASUS.*AH26.* 3 1
-ATI ASUS AH34xx .*ATI.*ASUS.*AH34.* 1 1
-ATI ASUS AH36xx .*ATI.*ASUS.*AH36.* 3 1
-ATI ASUS AH46xx .*ATI.*ASUS.*AH46.* 3 1
-ATI ASUS AX3xx .*ATI.*ASUS.*AX3.* 1 1
-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 EAH34xx .*ATI.*ASUS.*EAH34.* 1 1
-ATI ASUS EAH36xx .*ATI.*ASUS.*EAH36.* 3 1
-ATI ASUS EAH38xx .*ATI.*ASUS.*EAH38.* 3 1
-ATI ASUS EAH43xx .*ATI.*ASUS.*EAH43.* 1 1
-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 Radeon X1xxx .*ATI.*ASUS.*X1.* 3 1
-ATI Radeon X7xx .*ATI.*ASUS.*X7.* 1 1
-ATI Radeon X500 .*ATI.*Diamond X5.* 1 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 Display Adapter .*ATI.*display adapter.* 0 1
-ATI FireGL 5200 .*ATI.*FireGL V52.* 0 1
-ATI FireGL 5xxx .*ATI.*FireGL V5.* 1 1
-ATI FireGL .*ATI.*Fire.*GL.* 0 1
-ATI FireMV .*ATI.*FireMV.* 0 0
-ATI Generic .*ATI.*Generic.* 0 0
-ATI Hercules 9800 .*ATI.*Hercules.*9800.* 1 1
-ATI IGP 340M .*ATI.*IGP.*340M.* 0 0
-ATI M52 .*ATI.*M52.* 1 1
-ATI M54 .*ATI.*M54.* 1 1
-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 *41.* 0 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.* 0 1
-ATI Mobility Radeon 9700 .*ATI.*Mobility *97.* 0 1
-ATI Mobility Radeon 9600 .*ATI.*Mobility *96.* 0 1
-ATI Mobility Radeon HD 2300 .*ATI.*Mobility *HD *23.* 1 1
-ATI Mobility Radeon HD 2400 .*ATI.*Mobility *HD *24.* 1 1
-ATI Mobility Radeon HD 2600 .*ATI.*Mobility *HD *26.* 3 1
-ATI Mobility Radeon HD 3400 .*ATI.*Mobility *HD *34.* 1 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 5400 .*ATI.*Mobility *HD *54.* 1 1
-ATI Mobility Radeon HD 5500 .*ATI.*Mobility *HD *55.* 1 1
-ATI Mobility Radeon X1xxx .*ATI.*Mobility *X1.* 0 1
-ATI Mobility Radeon X2xxx .*ATI.*Mobility *X2.* 0 1
-ATI Mobility Radeon X3xx .*ATI.*Mobility *X3.* 1 1
-ATI Mobility Radeon X6xx .*ATI.*Mobility *X6.* 1 1
-ATI Mobility Radeon X7xx .*ATI.*Mobility *X7.* 1 1
-ATI Mobility Radeon Xxxx .*ATI.*Mobility *X.* 0 1
-ATI Radeon HD 2300 .*ATI.*Radeon HD *23.* 0 1
-ATI Radeon HD 2400 .*ATI.*Radeon HD *24.* 1 1
-ATI Radeon HD 2600 .*ATI.*Radeon HD *26.* 2 1
-ATI Radeon HD 2900 .*ATI.*Radeon HD *29.* 3 1
-ATI Radeon HD 3200 .*ATI.*Radeon *HD *32.* 0 1
-ATI Radeon HD 3300 .*ATI.*Radeon HD *33.* 1 1
-ATI Radeon HD 3400 .*ATI.*Radeon HD *34.* 1 1
-ATI Radeon HD 3600 .*ATI.*Radeon HD *36.* 3 1
-ATI Radeon HD 3800 .*ATI.*Radeon HD *38.* 3 1
-ATI Radeon HD 4200 .*ATI.*Radeon HD *42.* 1 1
-ATI Radeon HD 4300 .*ATI.*Radeon HD *43.* 1 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 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.* 0 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 *RX80.* 2 1
-ATI Radeon RX9550 .*ATI.*RX9550.* 1 1
-ATI Radeon VE .*ATI.*Radeon.*VE.* 0 0
-ATI Radeon X1000 .*ATI.*Radeon *X10.* 0 1
-ATI Radeon X1200 .*ATI.*Radeon *X12.* 0 1
-ATI Radeon X1300 .*ATI.*Radeon *X13.* 1 1
-ATI Radeon X1400 .*ATI.*Radeon *X14.* 1 1
-ATI Radeon X1500 .*ATI.*Radeon *X15.* 1 1
-ATI Radeon X1600 .*ATI.*Radeon *X16.* 1 1
-ATI Radeon X1700 .*ATI.*Radeon *X17.* 1 1
-ATI Radeon X1800 .*ATI.*Radeon *X18.* 3 1
-ATI Radeon X1900 .*ATI.*Radeon *X19.* 3 1
-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 0
-ATI Rage 128 .*ATI.*Rage 128.* 0 1
-ATI RV250 .*ATI.*RV250.* 0 1
-ATI RV380 .*ATI.*RV380.* 0 1
-ATI RV530 .*ATI.*RV530.* 1 1
-ATI RX700 .*ATI.*RX700.* 1 1
-Intel X3100 .*Intel.*X3100.* 0 1
-Intel 830M .*Intel.*830M 0 0
-Intel 845G .*Intel.*845G 0 0
-Intel 855GM .*Intel.*855GM 0 0
-Intel 865G .*Intel.*865G 0 0
-Intel 900 .*Intel.*900.*900 0 0
-Intel 915GM .*Intel.*915GM 0 0
-Intel 915G .*Intel.*915G 0 0
-Intel 945GM .*Intel.*945GM.* 0 1
-Intel 945G .*Intel.*945G.* 0 1
-Intel 950 .*Intel.*950.* 0 1
-Intel 965 .*Intel.*965.* 0 1
-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 Brookdale .*Intel.*Brookdale.* 0 0
-Intel Cantiga .*Intel.*Cantiga.* 0 0
-Intel Eaglelake .*Intel.*Eaglelake.* 0 1
-Intel Graphics Media HD .*Intel(R) Graphics Media.*HD.* 0 1
-Intel HD Graphics .*Intel(R) HD Graphics.* 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
-Intel Springdale .*Intel.*Springdale.* 0 0
-Matrox .*Matrox.* 0 0
-Mesa .*Mesa.* 0 0
-NVIDIA 310M .*NVIDIA.*GeForce 310M.* 0 1
-NVIDIA 310 .*NVIDIA.*GeForce 310.* 0 1
-NVIDIA 320M .*NVIDIA.*GeForce 320M.* 0 1
-NVIDIA G100M .*NVIDIA.*GeForce G *100M.* 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 G210M .*NVIDIA.*GeForce G210M.* 0 1
-NVIDIA GT 120 .*NVIDIA.*GeForce GT 12.* 1 1
-NVIDIA GT 130 .*NVIDIA.*GeForce GT 13.* 1 1
-NVIDIA GT 220 .*NVIDIA.*GeForce GT 22.* 1 1
-NVIDIA GT 230 .*NVIDIA.*GeForce GT 23.* 1 1
-NVIDIA GT 240 .*NVIDIA.*GeForce GT 24.* 1 1
-NVIDIA GT 320 .*NVIDIA.*GeForce GT 32.* 0 1
-NVIDIA GT 330M .*NVIDIA.*GeForce GT 330M.* 1 1
-NVIDIA GTS 240 .*NVIDIA.*GeForce GTS 24.* 1 1
-NVIDIA GTS 250 .*NVIDIA.*GeForce GTS 25.* 3 1
-NVIDIA GTS 360M .*NVIDIA.*GeForce GTS 360M.* 3 1
-NVIDIA GTX 260 .*NVIDIA.*GeForce GTX 26.* 3 1
-NVIDIA GTX 270 .*NVIDIA.*GeForce GTX 27.* 3 1
-NVIDIA GTX 280 .*NVIDIA.*GeForce GTX 28.* 3 1
-NVIDIA GTX 290 .*NVIDIA.*GeForce GTX 29.* 3 1
-NVIDIA GTX 470 .*NVIDIA.*GeForce GTX 47.* 3 1
-NVIDIA GTX 480 .*NVIDIA.*GeForce GTX 48.* 3 1
-NVIDIA GTX 580 .*NVIDIA.*GeForce GTX 58.* 3 1
-NVIDIA C51 .*NVIDIA.*C51.* 0 1
-NVIDIA G72 .*NVIDIA.*G72.* 1 1
-NVIDIA G73 .*NVIDIA.*G73.* 1 1
-NVIDIA G84 .*NVIDIA.*G84.* 3 1
-NVIDIA G86 .*NVIDIA.*G86.* 3 1
-NVIDIA G92 .*NVIDIA.*G92.* 3 1
-NVIDIA GeForce .*GeForce 256.* 0 0
-NVIDIA GeForce 2 .*GeForce2.* 0 1
-NVIDIA GeForce 3 .*GeForce3.* 0 1
-NVIDIA GeForce 4 Go .*NVIDIA.*GeForce4.*Go.* 0 1
-NVIDIA GeForce 4 MX .*NVIDIA.*GeForce4 MX.* 0 1
-NVIDIA GeForce 4 Ti .*NVIDIA.*GeForce4 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.* 1 1
-NVIDIA GeForce 7800 .*NVIDIA.*GeForce 78.* 1 1
-NVIDIA GeForce 7900 .*NVIDIA.*GeForce 79.* 1 1
-NVIDIA GeForce 8100 .*NVIDIA.*GeForce 81.* 1 1
-NVIDIA GeForce 8200 .*NVIDIA.*GeForce 82.* 1 1
-NVIDIA GeForce 8300 .*NVIDIA.*GeForce 83.* 1 1
-NVIDIA GeForce 8400 .*NVIDIA.*GeForce 84.* 1 1
-NVIDIA GeForce 8500 .*GeForce 85.* 1 1
-NVIDIA GeForce 8600M .*NVIDIA.*GeForce.*8600M.* 1 1
-NVIDIA GeForce 8600 .*NVIDIA.*GeForce 86.* 3 1
-NVIDIA GeForce 8700 .*NVIDIA.*GeForce 87.* 3 1
-NVIDIA GeForce 8800 .*NVIDIA.*GeForce 88.* 3 1
-NVIDIA GeForce 9100 .*NVIDIA.*GeForce 9100.* 0 1
-NVIDIA GeForce 9200 .*NVIDIA.*GeForce 9200.* 0 1
-NVIDIA GeForce 9300M .*NVIDIA.*GeForce 9300M.* 1 1
-NVIDIA GeForce 9400M .*NVIDIA.*GeForce 9400M.* 1 1
-NVIDIA GeForce 9500M .*NVIDIA.*GeForce 9500M.* 2 1
-NVIDIA GeForce 9600M .*NVIDIA.*GeForce 9600M.* 3 1
-NVIDIA GeForce 9700M .*NVIDIA.*GeForce 9700M.* 3 1
-NVIDIA GeForce 9300 .*NVIDIA.*GeForce 93.* 1 1
-NVIDIA GeForce 9400 .*GeForce 94.* 1 1
-NVIDIA GeForce 9500 .*NVIDIA.*GeForce 95.* 2 1
-NVIDIA GeForce 9600 .*NVIDIA.*GeForce.*96.* 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 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 Go 6100 .*NVIDIA.*GeForce Go 61.* 0 1
-NVIDIA GeForce Go 6200 .*NVIDIA.*GeForce Go 62.* 0 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 .*NVIDIA.*GeForce Go 73.* 1 1
-NVIDIA GeForce Go 7300 LE .*NVIDIA.*GeForce Go 73.*LE.* 0 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 .*D9M.* 1 1
-NVIDIA G84 .*G84.* 1 1
-NVIDIA G92 .*G92.* 3 1
-NVIDIA G94 .*G94.* 3 1
-NVIDIA GeForce Go 6 .*GeForce Go 6.* 1 1
-NVIDIA ION .*NVIDIA ION.* 1 1
-NVIDIA NB9M .*GeForce NB9M.* 1 1
-NVIDIA NB9P .*GeForce NB9P.* 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 Quadro2 .*Quadro2.* 0 1
-NVIDIA Quadro4 .*Quadro4.* 0 1
-NVIDIA Quadro DCC .*Quadro DCC.* 0 1
-NVIDIA Quadro FX 1400 .*Quadro.*FX.*1400.* 1 1
-NVIDIA Quadro FX 1500 .*Quadro.*FX.*1500.* 1 1
-NVIDIA Quadro FX 1700 .*Quadro.*FX.*1700.* 2 1
-NVIDIA Quadro FX 1800 .*Quadro.*FX.*1800.* 2 1
-NVIDIA Quadro FX 3400 .*Quadro.*FX.*3400.* 1 1
-NVIDIA Quadro FX 3450 .*Quadro.*FX.*3450.* 1 1
-NVIDIA Quadro FX 3500 .*Quadro.*FX.*3500.* 1 1
-NVIDIA Quadro FX 3700 .*Quadro.*FX.*3700.* 2 1
-NVIDIA Quadro FX 3800 .*Quadro.*FX.*3800.* 2 1
-NVIDIA Quadro FX 370 .*Quadro.*FX.*370.* 2 1
-NVIDIA Quadro FX 380 .*Quadro.*FX.*380.* 2 1
-NVIDIA Quadro FX 4000 .*Quadro.*FX.*4000.* 1 1
-NVIDIA Quadro FX 4500 .*Quadro.*FX.*4500.* 1 1
-NVIDIA Quadro FX 4600 .*Quadro.*FX.*4600.* 2 1
-NVIDIA Quadro FX 4700 .*Quadro.*FX.*4700.* 2 1
-NVIDIA Quadro FX 4800 .*Quadro.*FX.*4800.* 2 1
-NVIDIA Quadro FX 470 .*Quadro.*FX.*470.* 2 1
-NVIDIA Quadro FX 5500 .*Quadro.*FX.*5500.* 1 1
-NVIDIA Quadro FX 5600 .*Quadro.*FX.*5600.* 2 1
-NVIDIA Quadro FX 5700 .*Quadro.*FX.*5700.* 2 1
-NVIDIA Quadro FX 5800 .*Quadro.*FX.*5800.* 2 1
-NVIDIA Quadro FX 540 .*Quadro.*FX.*540.* 1 1
-NVIDIA Quadro FX 550 .*Quadro.*FX.*550.* 1 1
-NVIDIA Quadro FX 560 .*Quadro.*FX.*560.* 1 1
-NVIDIA Quadro FX 570 .*Quadro.*FX.*570.* 2 1
-NVIDIA Quadro FX 580 .*Quadro.*FX.*580.* 2 1
-NVIDIA Quadro FX .*Quadro FX.* 0 1
-NVIDIA Quadro VX 200 .*Quadro VX.*200.* 2 1
-NVIDIA Quadro 2000 .*Quadro.*2000.* 2 1
-NVIDIA Quadro 4000 .*Quadro.*4000.* 2 1
-NVIDIA Quadro 5000 .*Quadro.*5000.* 2 1
-NVIDIA Quadro 6000 .*Quadro.*6000.* 2 1
-NVIDIA Quadro 600 .*Quadro.*600.* 2 1
-NVIDIA Quadro NVS .*Quadro NVS.* 0 1
-NVIDIA RIVA TNT .*RIVA TNT.* 0 0
-S3 .*S3 Graphics.* 0 0
-SiS SiS.* 0 0
-Trident Trident.* 0 0
-Tungsten Graphics Tungsten.* 0 0
-XGI XGI.* 0 0
-VIA VIA.* 0 0
-Apple Generic Apple.*Generic.* 0 0
-Apple Software Renderer Apple.*Software Renderer.* 0 0
+3Dfx .*3Dfx.* 0 0
+3Dlabs .*3Dlabs.* 0 0
+ATI 3D-Analyze .*ATI.*3D-Analyze.* 0 0
+ATI All-in-Wonder 7500 .*ATI.*All-in-Wonder 75.* 0 1
+ATI All-in-Wonder 8500 .*ATI.*All-in-Wonder 85.* 0 1
+ATI All-in-Wonder 9200 .*ATI.*All-in-Wonder 92.* 0 1
+ATI All-in-Wonder 9xxx .*ATI.*All-in-Wonder 9.* 1 1
+ATI All-in-Wonder HD .*ATI.*All-in-Wonder HD.* 1 1
+ATI All-in-Wonder X600 .*ATI.*All-in-Wonder X6.* 1 1
+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 ASUS A9xxx .*ATI.*ASUS.*A9.* 1 1
+ATI ASUS AH24xx .*ATI.*ASUS.*AH24.* 1 1
+ATI ASUS AH26xx .*ATI.*ASUS.*AH26.* 3 1
+ATI ASUS AH34xx .*ATI.*ASUS.*AH34.* 1 1
+ATI ASUS AH36xx .*ATI.*ASUS.*AH36.* 3 1
+ATI ASUS AH46xx .*ATI.*ASUS.*AH46.* 3 1
+ATI ASUS AX3xx .*ATI.*ASUS.*AX3.* 1 1
+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 EAH34xx .*ATI.*ASUS.*EAH34.* 1 1
+ATI ASUS EAH36xx .*ATI.*ASUS.*EAH36.* 3 1
+ATI ASUS EAH38xx .*ATI.*ASUS.*EAH38.* 3 1
+ATI ASUS EAH43xx .*ATI.*ASUS.*EAH43.* 1 1
+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 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 Display Adapter .*ATI.*display adapter.* 0 1
+ATI FireGL 5200 .*ATI.*FireGL V52.* 0 1
+ATI FireGL 5xxx .*ATI.*FireGL V5.* 1 1
+ATI FireGL .*ATI.*Fire.*GL.* 0 1
+ATI FirePro M3900 .*ATI.*FirePro.*M39.* 2 1
+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 Generic .*ATI.*Generic.* 0 0
+ATI Hercules 9800 .*ATI.*Hercules.*9800.* 1 1
+ATI IGP 340M .*ATI.*IGP.*340M.* 0 0
+ATI M52 .*ATI.*M52.* 1 1
+ATI M54 .*ATI.*M54.* 1 1
+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 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 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 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
+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
+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 FirePro 2000 .*ATI.*FirePro 2.* 1 1
+ATI FirePro 3000 .*ATI.*FirePro V3.* 1 1
+ATI FirePro 4000 .*ATI.*FirePro V4.* 2 1
+ATI FirePro 5000 .*ATI.*FirePro V5.* 3 1
+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
+Intel X3100 .*Intel.*X3100.* 0 1
+Intel 830M .*Intel.*830M 0 0
+Intel 845G .*Intel.*845G 0 0
+Intel 855GM .*Intel.*855GM 0 0
+Intel 865G .*Intel.*865G 0 0
+Intel 900 .*Intel.*900.*900 0 0
+Intel 915GM .*Intel.*915GM 0 0
+Intel 915G .*Intel.*915G 0 0
+Intel 945GM .*Intel.*945GM.* 0 1
+Intel 945G .*Intel.*945G.* 0 1
+Intel 950 .*Intel.*950.* 0 1
+Intel 965 .*Intel.*965.* 0 1
+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 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 Media Graphics HD .*Intel.*Media Graphics HD.* 0 1
+Intel Montara .*Intel.*Montara.* 0 0
+Intel Pineview .*Intel.*Pineview.* 0 1
+Intel Springdale .*Intel.*Springdale.* 0 0
+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 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 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 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 Quadro2 .*Quadro2.* 0 1
+NVIDIA Quadro 1000M .*Quadro.*1000M.* 2 1
+NVIDIA Quadro 2000 M/D .*Quadro.*2000(M|D)?.* 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 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 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
+NVIDIA Quadro FX 2500M .*Quadro.*FX *2500M.* 2 1
+NVIDIA Quadro FX 2700M .*Quadro.*FX *2700M.* 3 1
+NVIDIA Quadro FX 2800M .*Quadro.*FX *2800M.* 3 1
+NVIDIA Quadro FX 3500 .*Quadro.*FX *3500.* 2 1
+NVIDIA Quadro FX 3600 .*Quadro.*FX *3600.* 3 1
+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 .*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 RIVA TNT .*RIVA TNT.* 0 0
+S3 .*S3 Graphics.* 0 0
+SiS SiS.* 0 0
+Trident Trident.* 0 0
+Tungsten Graphics Tungsten.* 0 0
+XGI XGI.* 0 0
+VIA VIA.* 0 0
+Apple Generic Apple.*Generic.* 0 0
+Apple Software Renderer Apple.*Software Renderer.* 0 0
diff --git a/indra/newview/groupchatlistener.cpp b/indra/newview/groupchatlistener.cpp
new file mode 100644
index 0000000000..ef015a950d
--- /dev/null
+++ b/indra/newview/groupchatlistener.cpp
@@ -0,0 +1,76 @@
+/**
+ * @file groupchatlistener.cpp
+ * @author Nat Goodspeed
+ * @date 2011-04-11
+ * @brief Implementation for groupchatlistener.
+ *
+ * $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 "groupchatlistener.h"
+// STL headers
+// std headers
+// external library headers
+// other Linden headers
+#include "llgroupactions.h"
+#include "llimview.h"
+
+
+namespace {
+ void startIm_wrapper(LLSD const & event)
+ {
+ LLUUID session_id = LLGroupActions::startIM(event["id"].asUUID());
+ sendReply(LLSDMap("session_id", LLSD(session_id)), event);
+ }
+
+ void send_message_wrapper(const std::string& text, const LLUUID& session_id, const LLUUID& group_id)
+ {
+ LLIMModel::sendMessage(text, session_id, group_id, IM_SESSION_GROUP_START);
+ }
+}
+
+
+GroupChatListener::GroupChatListener():
+ LLEventAPI("GroupChat",
+ "API to enter, leave, send and intercept group chat messages")
+{
+ add("startIM",
+ "Enter a group chat in group with UUID [\"id\"]\n"
+ "Assumes the logged-in agent is already a member of this group.",
+ &startIm_wrapper);
+ add("endIM",
+ "Leave a group chat in group with UUID [\"id\"]\n"
+ "Assumes a prior successful startIM request.",
+ &LLGroupActions::endIM,
+ LLSDArray("id"));
+ add("sendIM",
+ "send a groupchat IM",
+ &send_message_wrapper,
+ LLSDArray("text")("session_id")("group_id"));
+}
+/*
+ static void sendMessage(const std::string& utf8_text, const LLUUID& im_session_id,
+ const LLUUID& other_participant_id, EInstantMessage dialog);
+*/
diff --git a/indra/newview/groupchatlistener.h b/indra/newview/groupchatlistener.h
new file mode 100644
index 0000000000..0c76db305e
--- /dev/null
+++ b/indra/newview/groupchatlistener.h
@@ -0,0 +1,40 @@
+/**
+ * @file groupchatlistener.h
+ * @author Nat Goodspeed
+ * @date 2011-04-11
+ * @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_GROUPCHATLISTENER_H)
+#define LL_GROUPCHATLISTENER_H
+
+#include "lleventapi.h"
+
+class GroupChatListener: public LLEventAPI
+{
+public:
+ GroupChatListener();
+};
+
+#endif /* ! defined(LL_GROUPCHATLISTENER_H) */
diff --git a/indra/newview/llaccountingquotamanager.cpp b/indra/newview/llaccountingquotamanager.cpp
new file mode 100644
index 0000000000..a4f5de5632
--- /dev/null
+++ b/indra/newview/llaccountingquotamanager.cpp
@@ -0,0 +1,278 @@
+/**
+ * @file LLAccountingQuotaManager.cpp
+ * @ Handles the setting and accessing for costs associated with mesh
+ *
+ * $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$
+ */
+
+#include "llviewerprecompiledheaders.h"
+#include "llaccountingquotamanager.h"
+#include "llagent.h"
+#include "llviewerregion.h"
+#include "llviewerobject.h"
+#include "llviewerobjectlist.h"
+#include "llviewerparcelmgr.h"
+#include "llparcel.h"
+
+//===============================================================================
+LLAccountingQuotaManager::LLAccountingQuotaManager()
+{
+}
+//===============================================================================
+class LLAccountingQuotaResponder : public LLCurl::Responder
+{
+public:
+ LLAccountingQuotaResponder( const LLSD& objectIDs )
+ : mObjectIDs( objectIDs )
+ {
+ }
+
+ void clearPendingRequests ( void )
+ {
+ for ( LLSD::array_iterator iter = mObjectIDs.beginArray(); iter != mObjectIDs.endArray(); ++iter )
+ {
+ LLAccountingQuotaManager::getInstance()->removePendingObjectQuota( iter->asUUID() );
+ }
+ }
+
+ void error( U32 statusNum, const std::string& reason )
+ {
+ llwarns << "Transport error "<<reason<<llendl;
+ //prep#do we really want to remove all because of one failure - verify
+ clearPendingRequests();
+ }
+
+ void result( const LLSD& content )
+ {
+ if ( !content.isMap() || content.has("error") )
+ {
+ llwarns << "Error on fetched data"<< llendl;
+ //prep#do we really want to remove all because of one failure - verify
+ clearPendingRequests();
+ return;
+ }
+
+ //Differentiate what the incoming caps could be from the data
+ bool containsParcel = content.has("parcel");
+ bool containsSelection = content.has("selected");
+
+ //Loop over the stored object ids checking against the incoming data
+ for ( LLSD::array_iterator iter = mObjectIDs.beginArray(); iter != mObjectIDs.endArray(); ++iter )
+ {
+ LLUUID objectID = iter->asUUID();
+
+ LLAccountingQuotaManager::getInstance()->removePendingObjectQuota( objectID );
+
+ if ( containsParcel )
+ {
+ //Typically should be one
+ S32 dataCount = content["parcel"].size();
+ for(S32 i = 0; i < dataCount; i++)
+ {
+ //prep#todo verify that this is safe, otherwise just add a bool
+ LLUUID parcelId;
+ //S32 parcelOwner = 0;
+ if ( content["parcel"][i].has("parcel_id") )
+ {
+ parcelId = content["parcel"][i]["parcel_id"].asUUID();
+ }
+
+ //if ( content["parcel"][i].has("parcel_owner") )
+ //{
+ // parcelOwner = content["parcel"][i]["parcel_owner"].asInteger();
+ //}
+
+ F32 ownerRenderCost = 0;
+ F32 ownerPhysicsCost = 0;
+ F32 ownerNetworkCost = 0;
+ F32 ownerSimulationCost = 0;
+
+ F32 groupRenderCost = 0;
+ F32 groupPhysicsCost = 0;
+ F32 groupNetworkCost = 0;
+ F32 groupSimulationCost = 0;
+
+ F32 otherRenderCost = 0;
+ F32 otherPhysicsCost = 0;
+ F32 otherNetworkCost = 0;
+ F32 otherSimulationCost = 0;
+
+ F32 tempRenderCost = 0;
+ F32 tempPhysicsCost = 0;
+ F32 tempNetworkCost = 0;
+ F32 tempSimulationCost = 0;
+
+ F32 selectedRenderCost = 0;
+ F32 selectedPhysicsCost = 0;
+ F32 selectedNetworkCost = 0;
+ F32 selectedSimulationCost = 0;
+
+ F32 parcelCapacity = 0;
+
+ if ( content["parcel"][i].has("capacity") )
+ {
+ parcelCapacity = content["parcel"][i].has("capacity");
+ }
+
+ if ( content["parcel"][i].has("owner") )
+ {
+ ownerRenderCost = content["parcel"][i]["owner"]["rendering"].asReal();
+ ownerPhysicsCost = content["parcel"][i]["owner"]["physics"].asReal();
+ ownerNetworkCost = content["parcel"][i]["owner"]["streaming"].asReal();
+ ownerSimulationCost = content["parcel"][i]["owner"]["simulation"].asReal();
+ }
+
+ if ( content["parcel"][i].has("group") )
+ {
+ groupRenderCost = content["parcel"][i]["group"]["rendering"].asReal();
+ groupPhysicsCost = content["parcel"][i]["group"]["physics"].asReal();
+ groupNetworkCost = content["parcel"][i]["group"]["streaming"].asReal();
+ groupSimulationCost = content["parcel"][i]["group"]["simulation"].asReal();
+
+ }
+ if ( content["parcel"][i].has("other") )
+ {
+ otherRenderCost = content["parcel"][i]["other"]["rendering"].asReal();
+ otherPhysicsCost = content["parcel"][i]["other"]["physics"].asReal();
+ otherNetworkCost = content["parcel"][i]["other"]["streaming"].asReal();
+ otherSimulationCost = content["parcel"][i]["other"]["simulation"].asReal();
+ }
+
+ if ( content["parcel"][i].has("temp") )
+ {
+ tempRenderCost = content["parcel"][i]["total"]["rendering"].asReal();
+ tempPhysicsCost = content["parcel"][i]["total"]["physics"].asReal();
+ tempNetworkCost = content["parcel"][i]["total"]["streaming"].asReal();
+ tempSimulationCost = content["parcel"][i]["total"]["simulation"].asReal();
+ }
+
+ if ( content["parcel"][i].has("selected") )
+ {
+ selectedRenderCost = content["parcel"][i]["total"]["rendering"].asReal();
+ selectedPhysicsCost = content["parcel"][i]["total"]["physics"].asReal();
+ selectedNetworkCost = content["parcel"][i]["total"]["streaming"].asReal();
+ selectedSimulationCost = content["parcel"][i]["total"]["simulation"].asReal();
+ }
+
+ ParcelQuota parcelQuota( ownerRenderCost, ownerPhysicsCost, ownerNetworkCost, ownerSimulationCost,
+ groupRenderCost, groupPhysicsCost, groupNetworkCost, groupSimulationCost,
+ otherRenderCost, otherPhysicsCost, otherNetworkCost, otherSimulationCost,
+ tempRenderCost, tempPhysicsCost, tempNetworkCost, tempSimulationCost,
+ selectedRenderCost, selectedPhysicsCost, selectedNetworkCost, selectedSimulationCost,
+ parcelCapacity );
+ //Update the Parcel
+ LLParcel* pParcel = LLViewerParcelMgr::getInstance()->getParcelSelection()->getParcel();
+ if ( pParcel )
+ {
+ pParcel->updateQuota( objectID, parcelQuota );
+ }
+ }
+ }
+ else
+ if ( containsSelection )
+ {
+ S32 dataCount = content["selected"].size();
+ for(S32 i = 0; i < dataCount; i++)
+ {
+
+ F32 renderCost = 0;
+ F32 physicsCost = 0;
+ F32 networkCost = 0;
+ F32 simulationCost = 0;
+
+ LLUUID objectId;
+
+ objectId = content["selected"][i]["local_id"].asUUID();
+ renderCost = content["selected"][i]["rendering"].asReal();
+ physicsCost = content["selected"][i]["physics"].asReal();
+ networkCost = content["selected"][i]["streaming"].asReal();
+ simulationCost = content["selected"][i]["simulation"].asReal();
+
+ SelectionQuota selectionQuota( objectId, renderCost, physicsCost, networkCost, simulationCost );
+
+ //Update the objects
+ gObjectList.updateQuota( objectId, selectionQuota );
+
+ }
+ }
+ else
+ {
+ //Nothing in string
+ LLAccountingQuotaManager::getInstance()->removePendingObjectQuota( objectID );
+ }
+ }
+ }
+
+private:
+ //List of posted objects
+ LLSD mObjectIDs;
+};
+//===============================================================================
+void LLAccountingQuotaManager::fetchQuotas( const std::string& url )
+{
+ // Invoking system must have already determined capability availability
+ if ( !url.empty() )
+ {
+ LLSD objectList;
+ U32 objectIndex = 0;
+ IDIt IDIter = mUpdateObjectQuota.begin();
+ IDIt IDIterEnd = mUpdateObjectQuota.end();
+
+ for ( ; IDIter != IDIterEnd; ++IDIter )
+ {
+ // Check to see if a request for this object has already been made.
+ if ( mPendingObjectQuota.find( *IDIter ) == mPendingObjectQuota.end() )
+ {
+ mPendingObjectQuota.insert( *IDIter );
+ objectList[objectIndex++] = *IDIter;
+ }
+ }
+
+ mUpdateObjectQuota.clear();
+
+ //Post results
+ if ( objectList.size() > 0 )
+ {
+ LLSD dataToPost = LLSD::emptyMap();
+ dataToPost["object_ids"] = objectList;
+ LLHTTPClient::post( url, dataToPost, new LLAccountingQuotaResponder( objectList ));
+ }
+ }
+ else
+ {
+ //url was empty - warn & continue
+ llwarns<<"Supplied url is empty "<<llendl;
+ mUpdateObjectQuota.clear();
+ mPendingObjectQuota.clear();
+ }
+}
+//===============================================================================
+void LLAccountingQuotaManager::updateObjectCost( const LLUUID& objectID )
+{
+ mUpdateObjectQuota.insert( objectID );
+}
+//===============================================================================
+void LLAccountingQuotaManager::removePendingObjectQuota( const LLUUID& objectID )
+{
+ mPendingObjectQuota.erase( objectID );
+}
+//===============================================================================
diff --git a/indra/newview/llaccountingquotamanager.h b/indra/newview/llaccountingquotamanager.h
new file mode 100644
index 0000000000..9251ef9351
--- /dev/null
+++ b/indra/newview/llaccountingquotamanager.h
@@ -0,0 +1,55 @@
+/**
+ * @file lllAccountingQuotaManager.h
+ * @
+ *
+ * $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_ACCOUNTINGQUOTAMANAGER_H
+#define LL_ACCOUNTINGQUOTAMANAGER_H
+//===============================================================================
+#include "llaccountingquota.h"
+//===============================================================================
+class LLAccountingQuotaManager : public LLSingleton<LLAccountingQuotaManager>
+{
+public:
+ //Ctor
+ LLAccountingQuotaManager();
+ //Store an object that will be eventually fetched
+ void updateObjectCost( const LLUUID& objectID );
+ //Request quotas for object list
+ void fetchQuotas( const std::string& url );
+ //Delete a specific object from the pending list
+ void removePendingObjectQuota( const LLUUID& objectID );
+
+private:
+ //Set of objects that need to update their cost
+ std::set<LLUUID> mUpdateObjectQuota;
+ //During fetchQuota we move object into a the pending set to signify that
+ //a fetch has been instigated.
+ std::set<LLUUID> mPendingObjectQuota;
+ typedef std::set<LLUUID>::iterator IDIt;
+};
+//===============================================================================
+
+#endif // LLACCOUNTINGQUOTAMANAGER
+
diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp
index 08d71fc8fc..492cfe7c1b 100644..100755
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -41,6 +41,7 @@
#include "llcapabilitylistener.h"
#include "llchannelmanager.h"
#include "llconsole.h"
+#include "llenvmanager.h"
#include "llfirstuse.h"
#include "llfloatercamera.h"
#include "llfloaterreg.h"
@@ -84,6 +85,7 @@
#include "llwindow.h"
#include "llworld.h"
#include "llworldmap.h"
+#include "stringize.h"
using namespace LLVOAvatarDefines;
@@ -206,6 +208,7 @@ LLAgent::LLAgent() :
mAutoPilot(FALSE),
mAutoPilotFlyOnStop(FALSE),
+ mAutoPilotAllowFlying(TRUE),
mAutoPilotTargetGlobal(),
mAutoPilotStopDistance(1.f),
mAutoPilotUseRotation(FALSE),
@@ -574,7 +577,10 @@ void LLAgent::setFlying(BOOL fly)
// static
void LLAgent::toggleFlying()
{
- LLToolPie::instance().stopClickToWalk();
+ if ( gAgent.mAutoPilot )
+ {
+ LLToolPie::instance().stopClickToWalk();
+ }
BOOL fly = !gAgent.getFlying();
@@ -607,6 +613,8 @@ void LLAgent::standUp()
//-----------------------------------------------------------------------------
void LLAgent::setRegion(LLViewerRegion *regionp)
{
+ bool teleport = true;
+
llassert(regionp);
if (mRegionp != regionp)
{
@@ -644,6 +652,8 @@ void LLAgent::setRegion(LLViewerRegion *regionp)
gSky.mVOGroundp->setRegion(regionp);
}
+ // Notify windlight managers
+ teleport = (gAgent.getTeleportState() != LLAgent::TELEPORT_NONE);
}
else
{
@@ -684,6 +694,15 @@ void LLAgent::setRegion(LLViewerRegion *regionp)
LLSelectMgr::getInstance()->updateSelectionCenter();
LLFloaterMove::sUpdateFlyingStatus();
+
+ if (teleport)
+ {
+ LLEnvManagerNew::instance().onTeleport();
+ }
+ else
+ {
+ LLEnvManagerNew::instance().onRegionCrossing();
+ }
}
@@ -1230,17 +1249,26 @@ void LLAgent::startAutoPilotGlobal(
const LLQuaternion *target_rotation,
void (*finish_callback)(BOOL, void *),
void *callback_data,
- F32 stop_distance, F32 rot_threshold)
+ F32 stop_distance,
+ F32 rot_threshold,
+ BOOL allow_flying)
{
if (!isAgentAvatarValid())
{
return;
}
+ // Are there any pending callbacks from previous auto pilot requests?
+ if (mAutoPilotFinishedCallback)
+ {
+ mAutoPilotFinishedCallback(dist_vec(gAgent.getPositionGlobal(), mAutoPilotTargetGlobal) < mAutoPilotStopDistance, mAutoPilotCallbackData);
+ }
+
mAutoPilotFinishedCallback = finish_callback;
mAutoPilotCallbackData = callback_data;
mAutoPilotRotationThreshold = rot_threshold;
mAutoPilotBehaviorName = behavior_name;
+ mAutoPilotAllowFlying = allow_flying;
LLVector3d delta_pos( target_global );
delta_pos -= getPositionGlobal();
@@ -1268,14 +1296,23 @@ void LLAgent::startAutoPilotGlobal(
}
}
- mAutoPilotFlyOnStop = getFlying();
+ if (mAutoPilotAllowFlying)
+ {
+ mAutoPilotFlyOnStop = getFlying();
+ }
+ else
+ {
+ mAutoPilotFlyOnStop = FALSE;
+ }
- if (distance > 30.0)
+ if (distance > 30.0 && mAutoPilotAllowFlying)
{
setFlying(TRUE);
}
- if ( distance > 1.f && heightDelta > (sqrtf(mAutoPilotStopDistance) + 1.f))
+ if ( distance > 1.f &&
+ mAutoPilotAllowFlying &&
+ heightDelta > (sqrtf(mAutoPilotStopDistance) + 1.f))
{
setFlying(TRUE);
// Do not force flying for "Sit" behavior to prevent flying after pressing "Stand"
@@ -1285,22 +1322,8 @@ void LLAgent::startAutoPilotGlobal(
}
mAutoPilot = TRUE;
- mAutoPilotTargetGlobal = target_global;
+ setAutoPilotTargetGlobal(target_global);
- // trace ray down to find height of destination from ground
- LLVector3d traceEndPt = target_global;
- traceEndPt.mdV[VZ] -= 20.f;
-
- LLVector3d targetOnGround;
- LLVector3 groundNorm;
- LLViewerObject *obj;
-
- LLWorld::getInstance()->resolveStepHeightGlobal(NULL, target_global, traceEndPt, targetOnGround, groundNorm, &obj);
- F64 target_height = llmax((F64)gAgentAvatarp->getPelvisToFoot(), target_global.mdV[VZ] - targetOnGround.mdV[VZ]);
-
- // clamp z value of target to minimum height above ground
- mAutoPilotTargetGlobal.mdV[VZ] = targetOnGround.mdV[VZ] + target_height;
- mAutoPilotTargetDist = (F32)dist_vec(gAgent.getPositionGlobal(), mAutoPilotTargetGlobal);
if (target_rotation)
{
mAutoPilotUseRotation = TRUE;
@@ -1318,12 +1341,36 @@ void LLAgent::startAutoPilotGlobal(
//-----------------------------------------------------------------------------
-// startFollowPilot()
+// setAutoPilotTargetGlobal
//-----------------------------------------------------------------------------
-void LLAgent::startFollowPilot(const LLUUID &leader_id)
+void LLAgent::setAutoPilotTargetGlobal(const LLVector3d &target_global)
{
- if (!mAutoPilot) return;
+ if (mAutoPilot)
+ {
+ mAutoPilotTargetGlobal = target_global;
+
+ // trace ray down to find height of destination from ground
+ LLVector3d traceEndPt = target_global;
+ traceEndPt.mdV[VZ] -= 20.f;
+
+ LLVector3d targetOnGround;
+ LLVector3 groundNorm;
+ LLViewerObject *obj;
+
+ LLWorld::getInstance()->resolveStepHeightGlobal(NULL, target_global, traceEndPt, targetOnGround, groundNorm, &obj);
+ F64 target_height = llmax((F64)gAgentAvatarp->getPelvisToFoot(), target_global.mdV[VZ] - targetOnGround.mdV[VZ]);
+ // clamp z value of target to minimum height above ground
+ mAutoPilotTargetGlobal.mdV[VZ] = targetOnGround.mdV[VZ] + target_height;
+ mAutoPilotTargetDist = (F32)dist_vec(gAgent.getPositionGlobal(), mAutoPilotTargetGlobal);
+ }
+}
+
+//-----------------------------------------------------------------------------
+// startFollowPilot()
+//-----------------------------------------------------------------------------
+void LLAgent::startFollowPilot(const LLUUID &leader_id, BOOL allow_flying, F32 stop_distance)
+{
mLeaderID = leader_id;
if ( mLeaderID.isNull() ) return;
@@ -1334,7 +1381,14 @@ void LLAgent::startFollowPilot(const LLUUID &leader_id)
return;
}
- startAutoPilotGlobal(object->getPositionGlobal());
+ startAutoPilotGlobal(object->getPositionGlobal(),
+ std::string(), // behavior_name
+ NULL, // target_rotation
+ NULL, // finish_callback
+ NULL, // callback_data
+ stop_distance,
+ 0.03f, // rotation_threshold
+ allow_flying);
}
@@ -1360,7 +1414,8 @@ void LLAgent::stopAutoPilot(BOOL user_cancel)
//NB: auto pilot can terminate for a reason other than reaching the destination
if (mAutoPilotFinishedCallback)
{
- mAutoPilotFinishedCallback(!user_cancel && dist_vec_squared(gAgent.getPositionGlobal(), mAutoPilotTargetGlobal) < (mAutoPilotStopDistance * mAutoPilotStopDistance), mAutoPilotCallbackData);
+ mAutoPilotFinishedCallback(!user_cancel && dist_vec(gAgent.getPositionGlobal(), mAutoPilotTargetGlobal) < mAutoPilotStopDistance, mAutoPilotCallbackData);
+ mAutoPilotFinishedCallback = NULL;
}
mLeaderID = LLUUID::null;
@@ -1400,7 +1455,7 @@ void LLAgent::autoPilot(F32 *delta_yaw)
if (!isAgentAvatarValid()) return;
- if (gAgentAvatarp->mInAir)
+ if (gAgentAvatarp->mInAir && mAutoPilotAllowFlying)
{
setFlying(TRUE);
}
@@ -3298,6 +3353,9 @@ bool LLAgent::teleportCore(bool is_local)
// hide land floater too - it'll be out of date
LLFloaterReg::hideInstance("about_land");
+ // hide the Region/Estate floater
+ LLFloaterReg::hideInstance("region_info");
+
// hide the search floater (EXT-8276)
LLFloaterReg::hideInstance("search");
diff --git a/indra/newview/llagent.h b/indra/newview/llagent.h
index 54c5649f97..67ed1923c0 100644
--- a/indra/newview/llagent.h
+++ b/indra/newview/llagent.h
@@ -469,19 +469,29 @@ public:
public:
BOOL getAutoPilot() const { return mAutoPilot; }
LLVector3d getAutoPilotTargetGlobal() const { return mAutoPilotTargetGlobal; }
+ LLUUID getAutoPilotLeaderID() const { return mLeaderID; }
+ F32 getAutoPilotStopDistance() const { return mAutoPilotStopDistance; }
+ F32 getAutoPilotTargetDist() const { return mAutoPilotTargetDist; }
+ BOOL getAutoPilotUseRotation() const { return mAutoPilotUseRotation; }
+ LLVector3 getAutoPilotTargetFacing() const { return mAutoPilotTargetFacing; }
+ F32 getAutoPilotRotationThreshold() const { return mAutoPilotRotationThreshold; }
+ std::string getAutoPilotBehaviorName() const { return mAutoPilotBehaviorName; }
+
void startAutoPilotGlobal(const LLVector3d &pos_global,
const std::string& behavior_name = std::string(),
const LLQuaternion *target_rotation = NULL,
void (*finish_callback)(BOOL, void *) = NULL, void *callback_data = NULL,
- F32 stop_distance = 0.f, F32 rotation_threshold = 0.03f);
- void startFollowPilot(const LLUUID &leader_id);
+ F32 stop_distance = 0.f, F32 rotation_threshold = 0.03f,
+ BOOL allow_flying = TRUE);
+ void startFollowPilot(const LLUUID &leader_id, BOOL allow_flying = TRUE, F32 stop_distance = 0.5f);
void stopAutoPilot(BOOL user_cancel = FALSE);
- void setAutoPilotGlobal(const LLVector3d &pos_global);
+ void setAutoPilotTargetGlobal(const LLVector3d &target_global);
void autoPilot(F32 *delta_yaw); // Autopilot walking action, angles in radians
void renderAutoPilotTarget();
private:
BOOL mAutoPilot;
BOOL mAutoPilotFlyOnStop;
+ BOOL mAutoPilotAllowFlying;
LLVector3d mAutoPilotTargetGlobal;
F32 mAutoPilotStopDistance;
BOOL mAutoPilotUseRotation;
diff --git a/indra/newview/llagentcamera.cpp b/indra/newview/llagentcamera.cpp
index c6b5a0113f..f195c985c0 100644
--- a/indra/newview/llagentcamera.cpp
+++ b/indra/newview/llagentcamera.cpp
@@ -392,9 +392,7 @@ LLVector3 LLAgentCamera::calcFocusOffset(LLViewerObject *object, LLVector3 origi
}
LLQuaternion inv_obj_rot = ~obj_rot; // get inverse of rotation
- LLVector3 object_extents;
- const LLVector4a* oe4 = object->mDrawable->getSpatialExtents();
- object_extents.set( oe4[1][0], oe4[1][1], oe4[1][2] );
+ LLVector3 object_extents = object->getScale();
// make sure they object extents are non-zero
object_extents.clamp(0.001f, F32_MAX);
diff --git a/indra/newview/llagentlistener.cpp b/indra/newview/llagentlistener.cpp
index ed24febf41..a8d2222c03 100644
--- a/indra/newview/llagentlistener.cpp
+++ b/indra/newview/llagentlistener.cpp
@@ -31,6 +31,7 @@
#include "llagentlistener.h"
#include "llagent.h"
+#include "llvoavatar.h"
#include "llcommandhandler.h"
#include "llslurl.h"
#include "llurldispatcher.h"
@@ -39,87 +40,242 @@
#include "llviewerregion.h"
#include "llsdutil.h"
#include "llsdutil_math.h"
+#include "lltoolgrab.h"
+#include "llhudeffectlookat.h"
+#include "llagentcamera.h"
LLAgentListener::LLAgentListener(LLAgent &agent)
: LLEventAPI("LLAgent",
"LLAgent listener to (e.g.) teleport, sit, stand, etc."),
mAgent(agent)
{
- add("requestTeleport",
+ add("requestTeleport",
"Teleport: [\"regionname\"], [\"x\"], [\"y\"], [\"z\"]\n"
"If [\"skip_confirmation\"] is true, use LLURLDispatcher rather than LLCommandDispatcher.",
&LLAgentListener::requestTeleport);
- add("requestSit",
- "Ask to sit on the object specified in [\"obj_uuid\"]",
+ add("requestSit",
+ "[\"obj_uuid\"]: id of object to sit on, use this or [\"position\"] to indicate the sit target"
+ "[\"position\"]: region position {x, y, z} where to find closest object to sit on",
&LLAgentListener::requestSit);
- add("requestStand",
+ add("requestStand",
"Ask to stand up",
&LLAgentListener::requestStand);
+ add("requestTouch",
+ "[\"obj_uuid\"]: id of object to touch, use this or [\"position\"] to indicate the object to touch"
+ "[\"position\"]: region position {x, y, z} where to find closest object to touch"
+ "[\"face\"]: optional object face number to touch[Default: 0]",
+ &LLAgentListener::requestTouch);
add("resetAxes",
"Set the agent to a fixed orientation (optionally specify [\"lookat\"] = array of [x, y, z])",
&LLAgentListener::resetAxes);
add("getAxes",
+ "Obsolete - use getPosition instead\n"
"Send information about the agent's orientation on [\"reply\"]:\n"
"[\"euler\"]: map of {roll, pitch, yaw}\n"
"[\"quat\"]: array of [x, y, z, w] quaternion values",
&LLAgentListener::getAxes,
LLSDMap("reply", LLSD()));
+ add("getPosition",
+ "Send information about the agent's position and orientation on [\"reply\"]:\n"
+ "[\"region\"]: array of region {x, y, z} position\n"
+ "[\"global\"]: array of global {x, y, z} position\n"
+ "[\"euler\"]: map of {roll, pitch, yaw}\n"
+ "[\"quat\"]: array of [x, y, z, w] quaternion values",
+ &LLAgentListener::getPosition,
+ LLSDMap("reply", LLSD()));
+ add("startAutoPilot",
+ "Start the autopilot system using the following parameters:\n"
+ "[\"target_global\"]: array of target global {x, y, z} position\n"
+ "[\"stop_distance\"]: target maxiumum distance from target [default: autopilot guess]\n"
+ "[\"target_rotation\"]: array of [x, y, z, w] quaternion values [default: no target]\n"
+ "[\"rotation_threshold\"]: target maximum angle from target facing rotation [default: 0.03 radians]\n"
+ "[\"behavior_name\"]: name of the autopilot behavior [default: \"\"]"
+ "[\"allow_flying\"]: allow flying during autopilot [default: True]",
+ //"[\"callback_pump\"]: pump to send success/failure and callback data to [default: none]\n"
+ //"[\"callback_data\"]: data to send back during a callback [default: none]",
+ &LLAgentListener::startAutoPilot);
+ add("getAutoPilot",
+ "Send information about current state of the autopilot system to [\"reply\"]:\n"
+ "[\"enabled\"]: boolean indicating whether or not autopilot is enabled\n"
+ "[\"target_global\"]: array of target global {x, y, z} position\n"
+ "[\"leader_id\"]: uuid of target autopilot is following\n"
+ "[\"stop_distance\"]: target maximum distance from target\n"
+ "[\"target_distance\"]: last known distance from target\n"
+ "[\"use_rotation\"]: boolean indicating if autopilot has a target facing rotation\n"
+ "[\"target_facing\"]: array of {x, y} target direction to face\n"
+ "[\"rotation_threshold\"]: target maximum angle from target facing rotation\n"
+ "[\"behavior_name\"]: name of the autopilot behavior",
+ &LLAgentListener::getAutoPilot,
+ LLSDMap("reply", LLSD()));
+ add("startFollowPilot",
+ "[\"leader_id\"]: uuid of target to follow using the autopilot system (optional with avatar_name)\n"
+ "[\"avatar_name\"]: avatar name to follow using the autopilot system (optional with leader_id)\n"
+ "[\"allow_flying\"]: allow flying during autopilot [default: True]\n"
+ "[\"stop_distance\"]: target maxiumum distance from target [default: autopilot guess]",
+ &LLAgentListener::startFollowPilot);
+ add("setAutoPilotTarget",
+ "Update target for currently running autopilot:\n"
+ "[\"target_global\"]: array of target global {x, y, z} position",
+ &LLAgentListener::setAutoPilotTarget);
+ add("stopAutoPilot",
+ "Stop the autopilot system:\n"
+ "[\"user_cancel\"] indicates whether or not to act as though user canceled autopilot [default: false]",
+ &LLAgentListener::stopAutoPilot);
+ add("lookAt",
+ "[\"type\"]: number to indicate the lookAt type, 0 to clear\n"
+ "[\"obj_uuid\"]: id of object to look at, use this or [\"position\"] to indicate the target\n"
+ "[\"position\"]: region position {x, y, z} where to find closest object or avatar to look at",
+ &LLAgentListener::lookAt);
}
void LLAgentListener::requestTeleport(LLSD const & event_data) const
{
- if(event_data["skip_confirmation"].asBoolean())
+ if(event_data["skip_confirmation"].asBoolean())
+ {
+ LLSD params(LLSD::emptyArray());
+ params.append(event_data["regionname"]);
+ params.append(event_data["x"]);
+ params.append(event_data["y"]);
+ params.append(event_data["z"]);
+ LLCommandDispatcher::dispatch("teleport", params, LLSD(), NULL, "clicked", true);
+ // *TODO - lookup other LLCommandHandlers for "agent", "classified", "event", "group", "floater", "parcel", "login", login_refresh", "balance", "chat"
+ // should we just compose LLCommandHandler and LLDispatchListener?
+ }
+ else
+ {
+ std::string url = LLSLURL(event_data["regionname"],
+ LLVector3(event_data["x"].asReal(),
+ event_data["y"].asReal(),
+ event_data["z"].asReal())).getSLURLString();
+ LLURLDispatcher::dispatch(url, "clicked", NULL, false);
+ }
+}
+
+void LLAgentListener::requestSit(LLSD const & event_data) const
+{
+ //mAgent.getAvatarObject()->sitOnObject();
+ // shamelessly ripped from llviewermenu.cpp:handle_sit_or_stand()
+ // *TODO - find a permanent place to share this code properly.
+
+ LLViewerObject *object = NULL;
+ if (event_data.has("obj_uuid"))
+ {
+ object = gObjectList.findObject(event_data["obj_uuid"]);
+ }
+ else if (event_data.has("position"))
{
- LLSD params(LLSD::emptyArray());
- params.append(event_data["regionname"]);
- params.append(event_data["x"]);
- params.append(event_data["y"]);
- params.append(event_data["z"]);
- LLCommandDispatcher::dispatch("teleport", params, LLSD(), NULL, "clicked", true);
- // *TODO - lookup other LLCommandHandlers for "agent", "classified", "event", "group", "floater", "parcel", "login", login_refresh", "balance", "chat"
- // should we just compose LLCommandHandler and LLDispatchListener?
+ LLVector3 target_position = ll_vector3_from_sd(event_data["position"]);
+ object = findObjectClosestTo(target_position);
}
+
+ if (object && object->getPCode() == LL_PCODE_VOLUME)
+ {
+ gMessageSystem->newMessageFast(_PREHASH_AgentRequestSit);
+ gMessageSystem->nextBlockFast(_PREHASH_AgentData);
+ gMessageSystem->addUUIDFast(_PREHASH_AgentID, mAgent.getID());
+ gMessageSystem->addUUIDFast(_PREHASH_SessionID, mAgent.getSessionID());
+ gMessageSystem->nextBlockFast(_PREHASH_TargetObject);
+ gMessageSystem->addUUIDFast(_PREHASH_TargetID, object->mID);
+ gMessageSystem->addVector3Fast(_PREHASH_Offset, LLVector3(0,0,0));
+
+ object->getRegion()->sendReliableMessage();
+ }
else
{
- std::string url = LLSLURL(event_data["regionname"],
- LLVector3(event_data["x"].asReal(),
- event_data["y"].asReal(),
- event_data["z"].asReal())).getSLURLString();
- LLURLDispatcher::dispatch(url, "clicked", NULL, false);
+ llwarns << "LLAgent requestSit could not find the sit target: "
+ << event_data << llendl;
}
}
-void LLAgentListener::requestSit(LLSD const & event_data) const
+void LLAgentListener::requestStand(LLSD const & event_data) const
{
- //mAgent.getAvatarObject()->sitOnObject();
- // shamelessly ripped from llviewermenu.cpp:handle_sit_or_stand()
- // *TODO - find a permanent place to share this code properly.
- LLViewerObject *object = gObjectList.findObject(event_data["obj_uuid"]);
+ mAgent.setControlFlags(AGENT_CONTROL_STAND_UP);
+}
- if (object && object->getPCode() == LL_PCODE_VOLUME)
- {
- gMessageSystem->newMessageFast(_PREHASH_AgentRequestSit);
- gMessageSystem->nextBlockFast(_PREHASH_AgentData);
- gMessageSystem->addUUIDFast(_PREHASH_AgentID, mAgent.getID());
- gMessageSystem->addUUIDFast(_PREHASH_SessionID, mAgent.getSessionID());
- gMessageSystem->nextBlockFast(_PREHASH_TargetObject);
- gMessageSystem->addUUIDFast(_PREHASH_TargetID, object->mID);
- gMessageSystem->addVector3Fast(_PREHASH_Offset, LLVector3(0,0,0));
- object->getRegion()->sendReliableMessage();
+LLViewerObject * LLAgentListener::findObjectClosestTo( const LLVector3 & position ) const
+{
+ LLViewerObject *object = NULL;
+
+ // Find the object closest to that position
+ F32 min_distance = 10000.0f; // Start big
+ S32 num_objects = gObjectList.getNumObjects();
+ S32 cur_index = 0;
+ while (cur_index < num_objects)
+ {
+ LLViewerObject * cur_object = gObjectList.getObject(cur_index++);
+ if (cur_object)
+ { // Calculate distance from the target position
+ LLVector3 target_diff = cur_object->getPositionRegion() - position;
+ F32 distance_to_target = target_diff.length();
+ if (distance_to_target < min_distance)
+ { // Found an object closer
+ min_distance = distance_to_target;
+ object = cur_object;
+ }
+ }
}
+
+ return object;
}
-void LLAgentListener::requestStand(LLSD const & event_data) const
+
+void LLAgentListener::requestTouch(LLSD const & event_data) const
{
- mAgent.setControlFlags(AGENT_CONTROL_STAND_UP);
+ LLViewerObject *object = NULL;
+
+ if (event_data.has("obj_uuid"))
+ {
+ object = gObjectList.findObject(event_data["obj_uuid"]);
+ }
+ else if (event_data.has("position"))
+ {
+ LLVector3 target_position = ll_vector3_from_sd(event_data["position"]);
+ object = findObjectClosestTo(target_position);
+ }
+
+ S32 face = 0;
+ if (event_data.has("face"))
+ {
+ face = event_data["face"].asInteger();
+ }
+
+ if (object && object->getPCode() == LL_PCODE_VOLUME)
+ {
+ // Fake enough pick info to get it to (hopefully) work
+ LLPickInfo pick;
+ pick.mObjectFace = face;
+
+ /*
+ These values are sent to the simulator, but face seems to be easiest to use
+
+ pick.mUVCoords "UVCoord"
+ pick.mSTCoords "STCoord"
+ pick.mObjectFace "FaceIndex"
+ pick.mIntersection "Position"
+ pick.mNormal "Normal"
+ pick.mBinormal "Binormal"
+ */
+
+ // A touch is a sketchy message sequence ... send a grab, immediately
+ // followed by un-grabbing, crossing fingers and hoping packets arrive in
+ // the correct order
+ send_ObjectGrab_message(object, pick, LLVector3::zero);
+ send_ObjectDeGrab_message(object, pick);
+ }
+ else
+ {
+ llwarns << "LLAgent requestTouch could not find the touch target "
+ << event_data["obj_uuid"].asUUID() << llendl;
+ }
}
-void LLAgentListener::resetAxes(const LLSD& event) const
+
+void LLAgentListener::resetAxes(const LLSD& event_data) const
{
- if (event.has("lookat"))
+ if (event_data.has("lookat"))
{
- mAgent.resetAxes(ll_vector3_from_sd(event["lookat"]));
+ mAgent.resetAxes(ll_vector3_from_sd(event_data["lookat"]));
}
else
{
@@ -128,15 +284,226 @@ void LLAgentListener::resetAxes(const LLSD& event) const
}
}
-void LLAgentListener::getAxes(const LLSD& event) const
+void LLAgentListener::getAxes(const LLSD& event_data) const
{
LLQuaternion quat(mAgent.getQuat());
F32 roll, pitch, yaw;
quat.getEulerAngles(&roll, &pitch, &yaw);
// The official query API for LLQuaternion's [x, y, z, w] values is its
// public member mQ...
- sendReply(LLSDMap
- ("quat", llsd_copy_array(boost::begin(quat.mQ), boost::end(quat.mQ)))
- ("euler", LLSDMap("roll", roll)("pitch", pitch)("yaw", yaw)),
- event);
+ LLSD reply = LLSD::emptyMap();
+ reply["quat"] = llsd_copy_array(boost::begin(quat.mQ), boost::end(quat.mQ));
+ reply["euler"] = LLSD::emptyMap();
+ reply["euler"]["roll"] = roll;
+ reply["euler"]["pitch"] = pitch;
+ reply["euler"]["yaw"] = yaw;
+ sendReply(reply, event_data);
+}
+
+void LLAgentListener::getPosition(const LLSD& event_data) const
+{
+ F32 roll, pitch, yaw;
+ LLQuaternion quat(mAgent.getQuat());
+ quat.getEulerAngles(&roll, &pitch, &yaw);
+
+ LLSD reply = LLSD::emptyMap();
+ reply["quat"] = llsd_copy_array(boost::begin(quat.mQ), boost::end(quat.mQ));
+ reply["euler"] = LLSD::emptyMap();
+ reply["euler"]["roll"] = roll;
+ reply["euler"]["pitch"] = pitch;
+ reply["euler"]["yaw"] = yaw;
+ reply["region"] = ll_sd_from_vector3(mAgent.getPositionAgent());
+ reply["global"] = ll_sd_from_vector3d(mAgent.getPositionGlobal());
+
+ sendReply(reply, event_data);
+}
+
+
+void LLAgentListener::startAutoPilot(LLSD const & event_data)
+{
+ LLQuaternion target_rotation_value;
+ LLQuaternion* target_rotation = NULL;
+ if (event_data.has("target_rotation"))
+ {
+ target_rotation_value = ll_quaternion_from_sd(event_data["target_rotation"]);
+ target_rotation = &target_rotation_value;
+ }
+ // *TODO: Use callback_pump and callback_data
+ F32 rotation_threshold = 0.03f;
+ if (event_data.has("rotation_threshold"))
+ {
+ rotation_threshold = event_data["rotation_threshold"].asReal();
+ }
+
+ BOOL allow_flying = TRUE;
+ if (event_data.has("allow_flying"))
+ {
+ allow_flying = (BOOL) event_data["allow_flying"].asBoolean();
+ mAgent.setFlying(allow_flying);
+ }
+
+ F32 stop_distance = 0.f;
+ if (event_data.has("stop_distance"))
+ {
+ stop_distance = event_data["stop_distance"].asReal();
+ }
+
+ // Clear follow target, this is doing a path
+ mFollowTarget.setNull();
+
+ mAgent.startAutoPilotGlobal(ll_vector3d_from_sd(event_data["target_global"]),
+ event_data["behavior_name"],
+ target_rotation,
+ NULL, NULL,
+ stop_distance,
+ rotation_threshold,
+ allow_flying);
+}
+
+void LLAgentListener::getAutoPilot(const LLSD& event_data) const
+{
+ LLSD reply = LLSD::emptyMap();
+
+ LLSD::Boolean enabled = mAgent.getAutoPilot();
+ reply["enabled"] = enabled;
+
+ reply["target_global"] = ll_sd_from_vector3d(mAgent.getAutoPilotTargetGlobal());
+
+ reply["leader_id"] = mAgent.getAutoPilotLeaderID();
+
+ reply["stop_distance"] = mAgent.getAutoPilotStopDistance();
+
+ reply["target_distance"] = mAgent.getAutoPilotTargetDist();
+ if (!enabled &&
+ mFollowTarget.notNull())
+ { // Get an actual distance from the target object we were following
+ LLViewerObject * target = gObjectList.findObject(mFollowTarget);
+ if (target)
+ { // Found the target AV, return the actual distance to them as well as their ID
+ LLVector3 difference = target->getPositionRegion() - mAgent.getPositionAgent();
+ reply["target_distance"] = difference.length();
+ reply["leader_id"] = mFollowTarget;
+ }
+ }
+
+ reply["use_rotation"] = (LLSD::Boolean) mAgent.getAutoPilotUseRotation();
+ reply["target_facing"] = ll_sd_from_vector3(mAgent.getAutoPilotTargetFacing());
+ reply["rotation_threshold"] = mAgent.getAutoPilotRotationThreshold();
+ reply["behavior_name"] = mAgent.getAutoPilotBehaviorName();
+ reply["fly"] = (LLSD::Boolean) mAgent.getFlying();
+
+ sendReply(reply, event_data);
+}
+
+void LLAgentListener::startFollowPilot(LLSD const & event_data)
+{
+ LLUUID target_id;
+
+ BOOL allow_flying = TRUE;
+ if (event_data.has("allow_flying"))
+ {
+ allow_flying = (BOOL) event_data["allow_flying"].asBoolean();
+ }
+
+ if (event_data.has("leader_id"))
+ {
+ target_id = event_data["leader_id"];
+ }
+ else if (event_data.has("avatar_name"))
+ { // Find the avatar with matching name
+ std::string target_name = event_data["avatar_name"].asString();
+
+ if (target_name.length() > 0)
+ {
+ S32 num_objects = gObjectList.getNumObjects();
+ S32 cur_index = 0;
+ while (cur_index < num_objects)
+ {
+ LLViewerObject * cur_object = gObjectList.getObject(cur_index++);
+ if (cur_object &&
+ cur_object->asAvatar() &&
+ cur_object->asAvatar()->getFullname() == target_name)
+ { // Found avatar with matching name, extract id and break out of loop
+ target_id = cur_object->getID();
+ break;
+ }
+ }
+ }
+ }
+
+ F32 stop_distance = 0.f;
+ if (event_data.has("stop_distance"))
+ {
+ stop_distance = event_data["stop_distance"].asReal();
+ }
+
+ if (target_id.notNull())
+ {
+ mAgent.setFlying(allow_flying);
+ mFollowTarget = target_id; // Save follow target so we can report distance later
+
+ mAgent.startFollowPilot(target_id, allow_flying, stop_distance);
+ }
+}
+
+void LLAgentListener::setAutoPilotTarget(LLSD const & event_data) const
+{
+ if (event_data.has("target_global"))
+ {
+ LLVector3d target_global(ll_vector3d_from_sd(event_data["target_global"]));
+ mAgent.setAutoPilotTargetGlobal(target_global);
+ }
+}
+
+void LLAgentListener::stopAutoPilot(LLSD const & event_data) const
+{
+ BOOL user_cancel = FALSE;
+ if (event_data.has("user_cancel"))
+ {
+ user_cancel = event_data["user_cancel"].asBoolean();
+ }
+ mAgent.stopAutoPilot(user_cancel);
+}
+
+void LLAgentListener::lookAt(LLSD const & event_data) const
+{
+ LLViewerObject *object = NULL;
+ if (event_data.has("obj_uuid"))
+ {
+ object = gObjectList.findObject(event_data["obj_uuid"]);
+ }
+ else if (event_data.has("position"))
+ {
+ LLVector3 target_position = ll_vector3_from_sd(event_data["position"]);
+ object = findObjectClosestTo(target_position);
+ }
+
+ S32 look_at_type = (S32) LOOKAT_TARGET_NONE;
+ if (event_data.has("type"))
+ {
+ look_at_type = event_data["type"].asInteger();
+ }
+ if (look_at_type >= (S32) LOOKAT_TARGET_NONE &&
+ look_at_type < (S32) LOOKAT_NUM_TARGETS)
+ {
+ gAgentCamera.setLookAt((ELookAtType) look_at_type, object);
+ }
+}
+
+void LLAgentListener::getGroups(const LLSD& event) const
+{
+ LLSD reply(LLSD::emptyArray());
+ for (LLDynamicArray<LLGroupData>::const_iterator
+ gi(mAgent.mGroups.begin()), gend(mAgent.mGroups.end());
+ gi != gend; ++gi)
+ {
+ reply.append(LLSDMap
+ ("id", gi->mID)
+ ("name", gi->mName)
+ ("insignia", gi->mInsigniaID)
+ ("notices", bool(gi->mAcceptNotices))
+ ("display", bool(gi->mListInProfile))
+ ("contrib", gi->mContribution));
+ }
+ sendReply(LLSDMap("groups", reply), event);
}
diff --git a/indra/newview/llagentlistener.h b/indra/newview/llagentlistener.h
index 0aa58d0b16..9a9c4073fe 100644
--- a/indra/newview/llagentlistener.h
+++ b/indra/newview/llagentlistener.h
@@ -34,21 +34,35 @@
class LLAgent;
class LLSD;
+class LLViewerObject;
+class LLVector3d;
class LLAgentListener : public LLEventAPI
{
public:
- LLAgentListener(LLAgent &agent);
+ LLAgentListener(LLAgent &agent);
private:
- void requestTeleport(LLSD const & event_data) const;
- void requestSit(LLSD const & event_data) const;
- void requestStand(LLSD const & event_data) const;
- void resetAxes(const LLSD& event) const;
- void getAxes(const LLSD& event) const;
+ void requestTeleport(LLSD const & event_data) const;
+ void requestSit(LLSD const & event_data) const;
+ void requestStand(LLSD const & event_data) const;
+ void requestTouch(LLSD const & event_data) const;
+ void resetAxes(const LLSD& event_data) const;
+ void getAxes(const LLSD& event_data) const;
+ void getGroups(const LLSD& event) const;
+ void getPosition(const LLSD& event_data) const;
+ void startAutoPilot(const LLSD& event_data);
+ void getAutoPilot(const LLSD& event_data) const;
+ void startFollowPilot(const LLSD& event_data);
+ void setAutoPilotTarget(const LLSD& event_data) const;
+ void stopAutoPilot(const LLSD& event_data) const;
+ void lookAt(LLSD const & event_data) const;
+
+ LLViewerObject * findObjectClosestTo( const LLVector3 & position ) const;
private:
- LLAgent & mAgent;
+ LLAgent & mAgent;
+ LLUUID mFollowTarget;
};
#endif // LL_LLAGENTLISTENER_H
diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp
index d426afb17c..36272f0c7c 100644
--- a/indra/newview/llagentwearables.cpp
+++ b/indra/newview/llagentwearables.cpp
@@ -33,7 +33,6 @@
#include "llagentwearablesfetch.h"
#include "llappearancemgr.h"
#include "llcallbacklist.h"
-#include "llfolderview.h"
#include "llgesturemgr.h"
#include "llinventorybridge.h"
#include "llinventoryfunctions.h"
@@ -45,6 +44,7 @@
#include "llsidepanelappearance.h"
#include "llsidetray.h"
#include "lltexlayer.h"
+#include "lltooldraganddrop.h"
#include "llviewerregion.h"
#include "llvoavatarself.h"
#include "llwearable.h"
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index 746d2480b8..862fc49c0e 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -1,4 +1,4 @@
- /**
+/**
* @file llappviewer.cpp
* @brief The LLAppViewer class definitions
*
@@ -56,6 +56,7 @@
#include "llallocator.h"
#include "llares.h"
#include "llcurl.h"
+#include "llcalc.h"
#include "lltexturestats.h"
#include "lltexturestats.h"
#include "llviewerwindow.h"
@@ -308,7 +309,7 @@ BOOL gLogoutInProgress = FALSE;
////////////////////////////////////////////////////////////
// Internal globals... that should be removed.
-static std::string gArgs = "Mesh Beta";
+static std::string gArgs;
const std::string MARKER_FILE_NAME("SecondLife.exec_marker");
const std::string ERROR_MARKER_FILE_NAME("SecondLife.error_marker");
@@ -468,18 +469,6 @@ void request_initial_instant_messages()
}
}
-// A settings system callback for CrashSubmitBehavior
-bool handleCrashSubmitBehaviorChanged(const LLSD& newvalue)
-{
- S32 cb = newvalue.asInteger();
- const S32 NEVER_SUBMIT_REPORT = 2;
- if(cb == NEVER_SUBMIT_REPORT)
- {
- LLAppViewer::instance()->destroyMainloopTimeout();
- }
- return true;
-}
-
// Use these strictly for things that are constructed at startup,
// or for things that are performance critical. JC
static void settings_to_globals()
@@ -611,9 +600,6 @@ bool LLAppViewer::sendURLToOtherInstance(const std::string& url)
// Static members.
// The single viewer app.
LLAppViewer* LLAppViewer::sInstance = NULL;
-
-const std::string LLAppViewer::sGlobalSettingsName = "Global";
-
LLTextureCache* LLAppViewer::sTextureCache = NULL;
LLImageDecodeThread* LLAppViewer::sImageDecodeThread = NULL;
LLTextureFetch* LLAppViewer::sTextureFetch = NULL;
@@ -695,6 +681,8 @@ bool LLAppViewer::init()
if (!initConfiguration())
return false;
+ LL_INFOS("InitInfo") << "Configuration initialized." << LL_ENDL ;
+
// write Google Breakpad minidump files to our log directory
std::string logdir = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "");
logdir += gDirUtilp->getDirDelimiter();
@@ -721,6 +709,8 @@ bool LLAppViewer::init()
// *NOTE:Mani - LLCurl::initClass is not thread safe.
// Called before threads are created.
LLCurl::initClass();
+ LL_INFOS("InitInfo") << "LLCurl initialized." << LL_ENDL ;
+
LLMachineID::init();
{
@@ -739,6 +729,8 @@ bool LLAppViewer::init()
}
initThreads();
+ LL_INFOS("InitInfo") << "Threads initialized." << LL_ENDL ;
+
writeSystemInfo();
// Initialize updater service (now that we have an io pump)
@@ -765,15 +757,6 @@ bool LLAppViewer::init()
LL_INFOS("InitInfo") << "J2C Engine is: " << LLImageJ2C::getEngineInfo() << LL_ENDL;
LL_INFOS("InitInfo") << "libcurl version is: " << LLCurl::getVersionString() << LL_ENDL;
- // Get the single value from the crash settings file, if it exists
- std::string crash_settings_filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, CRASH_SETTINGS_FILE);
- gCrashSettings.loadFromFile(crash_settings_filename);
- if(gSavedSettings.getBOOL("IgnoreAllNotifications"))
- {
- gCrashSettings.setS32(CRASH_BEHAVIOR_SETTING, CRASH_BEHAVIOR_ALWAYS_SEND);
- gCrashSettings.saveToFile(crash_settings_filename, FALSE);
- }
-
/////////////////////////////////////////////////
// OS-specific login dialogs
/////////////////////////////////////////////////
@@ -821,6 +804,8 @@ bool LLAppViewer::init()
// Let code in llui access the viewer help floater
LLUI::sHelpImpl = LLViewerHelp::getInstance();
+ LL_INFOS("InitInfo") << "UI initialization is done." << LL_ENDL ;
+
// Load translations for tooltips
LLFloater::initClass();
@@ -870,6 +855,7 @@ bool LLAppViewer::init()
// Early out from user choice.
return false;
}
+ LL_INFOS("InitInfo") << "Hardware test initialization done." << LL_ENDL ;
// Prepare for out-of-memory situations, during which we will crash on
// purpose and save a dump.
@@ -890,7 +876,8 @@ bool LLAppViewer::init()
OSMessageBox(msg.str(),LLStringUtil::null,OSMB_OK);
return 1;
}
-
+ LL_INFOS("InitInfo") << "Cache initialization is done." << LL_ENDL ;
+
// Initialize the repeater service.
LLMainLoopRepeater::instance().start();
@@ -899,6 +886,7 @@ bool LLAppViewer::init()
//
gGLActive = TRUE;
initWindow();
+ LL_INFOS("InitInfo") << "Window is initialized." << LL_ENDL ;
// initWindow also initializes the Feature List, so now we can initialize this global.
LLCubeMap::sUseCubeMaps = LLFeatureManager::getInstance()->isFeatureAvailable("RenderCubeMap");
@@ -1036,12 +1024,14 @@ bool LLAppViewer::init()
}
LLViewerMedia::initClass();
+ LL_INFOS("InitInfo") << "Viewer media initialized." << LL_ENDL ;
+
LLTextUtil::TextHelpers::iconCallbackCreationFunction = create_text_segment_icon_from_url_match;
//EXT-7013 - On windows for some locale (Japanese) standard
//datetime formatting functions didn't support some parameters such as "weekday".
//Names for days and months localized in xml are also useful for Polish locale(STORM-107).
- std::string language = LLControlGroup::getInstance(sGlobalSettingsName)->getString("Language");
+ std::string language = gSavedSettings.getString("Language");
if(language == "ja" || language == "pl")
{
LLStringOps::setupWeekDaysNames(LLTrans::getString("dateTimeWeekdaysNames"));
@@ -1179,11 +1169,11 @@ 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 (gViewerWindow->mWindow->getVisible()
+ if ((gHeadlessClient || gViewerWindow->mWindow->getVisible())
&& gViewerWindow->getActive()
&& !gViewerWindow->mWindow->getMinimized()
&& LLStartUp::getStartupState() == STATE_STARTED
- && !gViewerWindow->getShowProgress()
+ && (gHeadlessClient || !gViewerWindow->getShowProgress())
&& !gFocusMgr.focusLocked())
{
LLMemType mjk(LLMemType::MTYPE_JOY_KEY);
@@ -1529,7 +1519,9 @@ bool LLAppViewer::cleanup()
// Note: this is where gLocalSpeakerMgr and gActiveSpeakerMgr used to be deleted.
LLWorldMap::getInstance()->reset(); // release any images
-
+
+ LLCalc::cleanUp();
+
llinfos << "Global stuff deleted" << llendflush;
if (gAudiop)
@@ -1626,9 +1618,7 @@ bool LLAppViewer::cleanup()
llinfos << "Cleaning up Objects" << llendflush;
LLViewerObject::cleanupVOClasses();
-
- LLWaterParamManager::cleanupClass();
- LLWLParamManager::cleanupClass();
+
LLPostProcess::cleanupClass();
LLTracker::cleanupInstance();
@@ -1694,10 +1684,6 @@ bool LLAppViewer::cleanup()
llinfos << "Saved settings" << llendflush;
}
- std::string crash_settings_filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, CRASH_SETTINGS_FILE);
- // save all settings, even if equals defaults
- gCrashSettings.saveToFile(crash_settings_filename, FALSE);
-
std::string warnings_settings_filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, getSettingsFilename("Default", "Warnings"));
gWarningSettings.saveToFile(warnings_settings_filename, TRUE);
@@ -1827,7 +1813,6 @@ bool LLAppViewer::cleanup()
gSavedSettings.cleanup();
LLUIColorTable::instance().clear();
- gCrashSettings.cleanup();
LLWatchdog::getInstance()->cleanup();
@@ -1970,7 +1955,6 @@ bool LLAppViewer::loadSettingsFromDirectory(const std::string& location_key,
llerrs << "Invalid settings location list" << llendl;
}
- LLControlGroup* global_settings = LLControlGroup::getInstance(sGlobalSettingsName);
for(LLInitParam::ParamIterator<SettingsGroup>::const_iterator it = mSettingsLocationList->groups.begin(), end_it = mSettingsLocationList->groups.end();
it != end_it;
++it)
@@ -2003,11 +1987,15 @@ bool LLAppViewer::loadSettingsFromDirectory(const std::string& location_key,
std::string full_settings_path;
if (file_it->file_name_setting.isProvided()
- && global_settings->controlExists(file_it->file_name_setting))
+ && gSavedSettings.controlExists(file_it->file_name_setting))
{
// try to find filename stored in file_name_setting control
- full_settings_path = global_settings->getString(file_it->file_name_setting);
- if (!gDirUtilp->fileExists(full_settings_path))
+ full_settings_path = gSavedSettings.getString(file_it->file_name_setting);
+ if (full_settings_path.empty())
+ {
+ continue;
+ }
+ else if (!gDirUtilp->fileExists(full_settings_path))
{
// search in default path
full_settings_path = gDirUtilp->getExpandedFilename((ELLPath)path_index, full_settings_path);
@@ -2153,8 +2141,6 @@ bool LLAppViewer::initConfiguration()
gSavedSettings.setS32("WatchdogEnabled", 0);
#endif
- gCrashSettings.getControl(CRASH_BEHAVIOR_SETTING)->getSignal()->connect(boost::bind(&handleCrashSubmitBehaviorChanged, _2));
-
// These are warnings that appear on the first experience of that condition.
// They are already set in the settings_default.xml file, but still need to be added to LLFirstUse
// for disable/reset ability
@@ -2285,15 +2271,33 @@ bool LLAppViewer::initConfiguration()
{
const std::string& name = *itr;
const std::string& value = *(++itr);
- LLControlVariable* c = LLControlGroup::getInstance(sGlobalSettingsName)->getControl(name);
- if(c)
+ std::string name_part;
+ std::string group_part;
+ LLControlVariable* control = NULL;
+
+ // Name can be further split into ControlGroup.Name, with the default control group being Global
+ size_t pos = name.find('.');
+ if (pos != std::string::npos)
+ {
+ group_part = name.substr(0, pos);
+ name_part = name.substr(pos+1);
+ llinfos << "Setting " << group_part << "." << name_part << " to " << value << llendl;
+ LLControlGroup* g = LLControlGroup::getInstance(group_part);
+ if (g) control = g->getControl(name_part);
+ }
+ else
+ {
+ llinfos << "Setting Global." << name << " to " << value << llendl;
+ control = gSavedSettings.getControl(name);
+ }
+
+ if (control)
{
- c->setValue(value, false);
+ control->setValue(value, false);
}
else
{
- llwarns << "'--set' specified with unknown setting: '"
- << name << "'." << llendl;
+ llwarns << "Failed --set " << name << ": setting name unknown." << llendl;
}
}
}
@@ -2502,7 +2506,8 @@ bool LLAppViewer::initConfiguration()
// it relies on checking a marker file which will not work when running
// out of different directories
- if (LLStartUp::getStartSLURL().isValid())
+ if (LLStartUp::getStartSLURL().isValid() &&
+ (gSavedSettings.getBOOL("SLURLPassToOtherInstance")))
{
if (sendURLToOtherInstance(LLStartUp::getStartSLURL().getSLURLString()))
{
@@ -2749,7 +2754,8 @@ void LLAppViewer::checkForCrash(void)
// Pop up a freeze or crash warning dialog
//
S32 choice;
- if(gCrashSettings.getS32(CRASH_BEHAVIOR_SETTING) == CRASH_BEHAVIOR_ASK)
+ const S32 cb = gCrashSettings.getS32("CrashSubmitBehavior");
+ if(cb == CRASH_BEHAVIOR_ASK)
{
std::ostringstream msg;
msg << LLTrans::getString("MBFrozenCrashed");
@@ -2758,7 +2764,7 @@ void LLAppViewer::checkForCrash(void)
alert,
OSMB_YESNO);
}
- else if(gCrashSettings.getS32(CRASH_BEHAVIOR_SETTING) == CRASH_BEHAVIOR_NEVER_SEND)
+ else if(cb == CRASH_BEHAVIOR_NEVER_SEND)
{
choice = OSBTN_NO;
}
@@ -2812,11 +2818,12 @@ bool LLAppViewer::initWindow()
gSavedSettings.getS32("WindowWidth"), gSavedSettings.getS32("WindowHeight"),
gSavedSettings.getBOOL("WindowFullScreen"), ignorePixelDepth);
+ LL_INFOS("AppInit") << "gViewerwindow created." << LL_ENDL;
+
// Need to load feature table before cheking to start watchdog.
- const S32 NEVER_SUBMIT_REPORT = 2;
bool use_watchdog = false;
int watchdog_enabled_setting = gSavedSettings.getS32("WatchdogEnabled");
- if(watchdog_enabled_setting == -1)
+ if (watchdog_enabled_setting == -1)
{
use_watchdog = !LLFeatureManager::getInstance()->isFeatureAvailable("WatchdogDisabled");
}
@@ -2826,11 +2833,11 @@ bool LLAppViewer::initWindow()
use_watchdog = bool(watchdog_enabled_setting);
}
- bool send_reports = gCrashSettings.getS32(CRASH_BEHAVIOR_SETTING) != NEVER_SUBMIT_REPORT;
- if(use_watchdog && send_reports)
+ if (use_watchdog)
{
LLWatchdog::getInstance()->init(watchdog_killer_callback);
}
+ LL_INFOS("AppInit") << "watchdog setting is done." << LL_ENDL;
LLNotificationsUI::LLNotificationManager::getInstance();
@@ -2853,7 +2860,8 @@ bool LLAppViewer::initWindow()
gSavedSettings.saveToFile( gSavedSettings.getString("ClientSettingsFile"), TRUE );
gPipeline.init();
-
+ LL_INFOS("AppInit") << "gPipeline Initialized" << LL_ENDL;
+
stop_glerror();
gViewerWindow->initGLDefaults();
@@ -2892,7 +2900,7 @@ bool LLAppViewer::initWindow()
// show viewer window
//gViewerWindow->mWindow->show();
-
+ LL_INFOS("AppInit") << "Window initialization done." << LL_ENDL;
return true;
}
@@ -3478,7 +3486,7 @@ void LLAppViewer::migrateCacheDirectory()
// Migrate inventory cache to avoid pain to inventory database after mass update
S32 file_count = 0;
std::string file_name;
- std::string mask = delimiter + "*.*";
+ std::string mask = "*.*";
LLDirIterator iter(old_cache_dir, mask);
while (iter.next(file_name))
@@ -3634,11 +3642,25 @@ bool LLAppViewer::initCache()
// Init the texture cache
// Allocate 80% of the cache size for textures
- const S32 MB = 1024*1024;
+ const S32 MB = 1024 * 1024;
+ const S64 MIN_CACHE_SIZE = 64 * MB;
+ const S64 MAX_CACHE_SIZE = 9984ll * MB;
+ const S64 MAX_VFS_SIZE = 1024 * MB; // 1 GB
+
S64 cache_size = (S64)(gSavedSettings.getU32("CacheSize")) * MB;
- const S64 MAX_CACHE_SIZE = 1024*MB;
- cache_size = llmin(cache_size, MAX_CACHE_SIZE);
- S64 texture_cache_size = ((cache_size * 8)/10);
+ cache_size = llclamp(cache_size, MIN_CACHE_SIZE, MAX_CACHE_SIZE);
+
+ S64 texture_cache_size = ((cache_size * 8) / 10);
+ S64 vfs_size = cache_size - texture_cache_size;
+
+ if (vfs_size > MAX_VFS_SIZE)
+ {
+ // Give the texture cache more space, since the VFS can't be bigger than 1GB.
+ // This happens when the user's CacheSize setting is greater than 5GB.
+ vfs_size = MAX_VFS_SIZE;
+ texture_cache_size = cache_size - MAX_VFS_SIZE;
+ }
+
S64 extra = LLAppViewer::getTextureCache()->initCache(LL_PATH_CACHE, texture_cache_size, texture_cache_mismatch);
texture_cache_size -= extra;
@@ -3647,21 +3669,19 @@ bool LLAppViewer::initCache()
LLSplashScreen::update(LLTrans::getString("StartupInitializingVFS"));
// Init the VFS
- S64 vfs_size = cache_size - texture_cache_size;
- const S64 MAX_VFS_SIZE = 1024 * MB; // 1 GB
- vfs_size = llmin(vfs_size, MAX_VFS_SIZE);
+ vfs_size = llmin(vfs_size + extra, MAX_VFS_SIZE);
vfs_size = (vfs_size / MB) * MB; // make sure it is MB aligned
U32 vfs_size_u32 = (U32)vfs_size;
U32 old_vfs_size = gSavedSettings.getU32("VFSOldSize") * MB;
bool resize_vfs = (vfs_size_u32 != old_vfs_size);
if (resize_vfs)
{
- gSavedSettings.setU32("VFSOldSize", vfs_size_u32/MB);
+ gSavedSettings.setU32("VFSOldSize", vfs_size_u32 / MB);
}
- LL_INFOS("AppCache") << "VFS CACHE SIZE: " << vfs_size/(1024*1024) << " MB" << LL_ENDL;
+ LL_INFOS("AppCache") << "VFS CACHE SIZE: " << vfs_size / (1024*1024) << " MB" << LL_ENDL;
// This has to happen BEFORE starting the vfs
- //time_t ltime;
+ // time_t ltime;
srand(time(NULL)); // Flawfinder: ignore
U32 old_salt = gSavedSettings.getU32("VFSSalt");
U32 new_salt;
@@ -3682,10 +3702,10 @@ bool LLAppViewer::initCache()
do
{
new_salt = rand();
- } while( new_salt == old_salt );
+ } while(new_salt == old_salt);
}
- old_vfs_data_file = gDirUtilp->getExpandedFilename(LL_PATH_CACHE,VFS_DATA_FILE_BASE) + llformat("%u",old_salt);
+ old_vfs_data_file = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, VFS_DATA_FILE_BASE) + llformat("%u", old_salt);
// make sure this file exists
llstat s;
@@ -3694,12 +3714,11 @@ bool LLAppViewer::initCache()
{
// doesn't exist, look for a data file
std::string mask;
- mask = gDirUtilp->getDirDelimiter();
- mask += VFS_DATA_FILE_BASE;
+ mask = VFS_DATA_FILE_BASE;
mask += "*";
std::string dir;
- dir = gDirUtilp->getExpandedFilename(LL_PATH_CACHE,"");
+ dir = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, "");
std::string found_file;
LLDirIterator iter(dir, mask);
@@ -3716,7 +3735,7 @@ bool LLAppViewer::initCache()
}
}
- old_vfs_index_file = gDirUtilp->getExpandedFilename(LL_PATH_CACHE,VFS_INDEX_FILE_BASE) + llformat("%u",old_salt);
+ old_vfs_index_file = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, VFS_INDEX_FILE_BASE) + llformat("%u", old_salt);
stat_result = LLFile::stat(old_vfs_index_file, &s);
if (stat_result)
@@ -3729,27 +3748,25 @@ bool LLAppViewer::initCache()
// Just in case, nuke any other old cache files in the directory.
std::string dir;
- dir = gDirUtilp->getExpandedFilename(LL_PATH_CACHE,"");
+ dir = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, "");
std::string mask;
- mask = gDirUtilp->getDirDelimiter();
- mask += VFS_DATA_FILE_BASE;
+ mask = VFS_DATA_FILE_BASE;
mask += "*";
gDirUtilp->deleteFilesInDir(dir, mask);
- mask = gDirUtilp->getDirDelimiter();
- mask += VFS_INDEX_FILE_BASE;
+ mask = VFS_INDEX_FILE_BASE;
mask += "*";
gDirUtilp->deleteFilesInDir(dir, mask);
}
- new_vfs_data_file = gDirUtilp->getExpandedFilename(LL_PATH_CACHE,VFS_DATA_FILE_BASE) + llformat("%u",new_salt);
- new_vfs_index_file = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, VFS_INDEX_FILE_BASE) + llformat("%u",new_salt);
+ new_vfs_data_file = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, VFS_DATA_FILE_BASE) + llformat("%u", new_salt);
+ new_vfs_index_file = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, VFS_INDEX_FILE_BASE) + llformat("%u", new_salt);
- static_vfs_data_file = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS,"static_data.db2");
- static_vfs_index_file = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS,"static_index.db2");
+ static_vfs_data_file = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "static_data.db2");
+ static_vfs_index_file = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "static_index.db2");
if (resize_vfs)
{
@@ -3772,19 +3789,19 @@ bool LLAppViewer::initCache()
// Don't remove VFS after viewer crashes. If user has corrupt data, they can reinstall. JC
gVFS = LLVFS::createLLVFS(new_vfs_index_file, new_vfs_data_file, false, vfs_size_u32, false);
- if( !gVFS )
+ if (!gVFS)
{
return false;
}
gStaticVFS = LLVFS::createLLVFS(static_vfs_index_file, static_vfs_data_file, true, 0, false);
- if( !gStaticVFS )
+ if (!gStaticVFS)
{
return false;
}
BOOL success = gVFS->isValid() && gStaticVFS->isValid();
- if( !success )
+ if (!success)
{
return false;
}
@@ -3805,11 +3822,11 @@ bool LLAppViewer::initCache()
void LLAppViewer::purgeCache()
{
- LL_INFOS("AppCache") << "Purging Cache and Texture Cache..." << llendl;
+ LL_INFOS("AppCache") << "Purging Cache and Texture Cache..." << LL_ENDL;
LLAppViewer::getTextureCache()->purgeCache(LL_PATH_CACHE);
LLVOCache::getInstance()->removeCache(LL_PATH_CACHE);
- std::string mask = gDirUtilp->getDirDelimiter() + "*.*";
- gDirUtilp->deleteFilesInDir(gDirUtilp->getExpandedFilename(LL_PATH_CACHE,""),mask);
+ std::string mask = "*.*";
+ gDirUtilp->deleteFilesInDir(gDirUtilp->getExpandedFilename(LL_PATH_CACHE, ""), mask);
}
std::string LLAppViewer::getSecondLifeTitle() const
@@ -4313,7 +4330,6 @@ void LLAppViewer::idle()
//
// Update weather effects
//
- LLWorld::getInstance()->updateClouds(gFrameDTClamped);
gSky.propagateHeavenlyBodies(gFrameDTClamped); // moves sun, moon, and planets
// Update wind vector
@@ -4329,9 +4345,6 @@ void LLAppViewer::idle()
// Compute average wind and use to drive motion of water
average_wind = regionp->mWind.getAverage();
- F32 cloud_density = regionp->mCloudLayer.getDensityRegion(wind_position_region);
-
- gSky.setCloudDensityAtAgent(cloud_density);
gSky.setWind(average_wind);
//LLVOWater::setWind(average_wind);
}
@@ -4491,7 +4504,7 @@ void LLAppViewer::idleShutdown()
void LLAppViewer::sendLogoutRequest()
{
- if(!mLogoutRequestSent)
+ if(!mLogoutRequestSent && gMessageSystem)
{
LLMessageSystem* msg = gMessageSystem;
msg->newMessageFast(_PREHASH_LogoutRequest);
diff --git a/indra/newview/llappviewerlinux.cpp b/indra/newview/llappviewerlinux.cpp
index 714e0e6163..48d02dfeaa 100644
--- a/indra/newview/llappviewerlinux.cpp
+++ b/indra/newview/llappviewerlinux.cpp
@@ -361,46 +361,35 @@ void LLAppViewerLinux::handleCrashReporting(bool reportFreeze)
}
else
{
- const S32 cb = gCrashSettings.getS32(CRASH_BEHAVIOR_SETTING);
-
- // Always generate the report, have the logger do the asking, and
- // don't wait for the logger before exiting (-> total cleanup).
- if (CRASH_BEHAVIOR_NEVER_SEND != cb)
- {
- // launch the actual crash logger
- const char* ask_dialog = "-dialog";
- if (CRASH_BEHAVIOR_ASK != cb)
- ask_dialog = ""; // omit '-dialog' option
- const char * cmdargv[] =
- {cmd.c_str(),
- ask_dialog,
- "-user",
- (char*)LLGridManager::getInstance()->getGridLabel().c_str(),
- "-name",
- LLAppViewer::instance()->getSecondLifeTitle().c_str(),
- NULL};
- fflush(NULL);
- pid_t pid = fork();
- if (pid == 0)
- { // child
- execv(cmd.c_str(), (char* const*) cmdargv); /* Flawfinder: ignore */
- llwarns << "execv failure when trying to start " << cmd << llendl;
- _exit(1); // avoid atexit()
+ // launch the actual crash logger
+ const char * cmdargv[] =
+ {cmd.c_str(),
+ "-user",
+ (char*)LLGridManager::getInstance()->getGridLabel().c_str(),
+ "-name",
+ LLAppViewer::instance()->getSecondLifeTitle().c_str(),
+ NULL};
+ fflush(NULL);
+ pid_t pid = fork();
+ if (pid == 0)
+ { // child
+ execv(cmd.c_str(), (char* const*) cmdargv); /* Flawfinder: ignore */
+ llwarns << "execv failure when trying to start " << cmd << llendl;
+ _exit(1); // avoid atexit()
+ }
+ else
+ {
+ if (pid > 0)
+ {
+ // DO NOT wait for child proc to die; we want
+ // the logger to outlive us while we quit to
+ // free up the screen/keyboard/etc.
+ ////int childExitStatus;
+ ////waitpid(pid, &childExitStatus, 0);
}
else
{
- if (pid > 0)
- {
- // DO NOT wait for child proc to die; we want
- // the logger to outlive us while we quit to
- // free up the screen/keyboard/etc.
- ////int childExitStatus;
- ////waitpid(pid, &childExitStatus, 0);
- }
- else
- {
- llwarns << "fork failure." << llendl;
- }
+ llwarns << "fork failure." << llendl;
}
}
// Sometimes signals don't seem to quit the viewer. Also, we may
diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp
index 6396ca91ff..f94c843ad9 100644
--- a/indra/newview/llappviewerwin32.cpp
+++ b/indra/newview/llappviewerwin32.cpp
@@ -295,23 +295,44 @@ void create_console()
// redirect unbuffered STDOUT to the console
l_std_handle = (long)GetStdHandle(STD_OUTPUT_HANDLE);
h_con_handle = _open_osfhandle(l_std_handle, _O_TEXT);
- fp = _fdopen( h_con_handle, "w" );
- *stdout = *fp;
- setvbuf( stdout, NULL, _IONBF, 0 );
+ if (h_con_handle == -1)
+ {
+ llwarns << "create_console() failed to open stdout handle" << llendl;
+ }
+ else
+ {
+ fp = _fdopen( h_con_handle, "w" );
+ *stdout = *fp;
+ setvbuf( stdout, NULL, _IONBF, 0 );
+ }
// redirect unbuffered STDIN to the console
l_std_handle = (long)GetStdHandle(STD_INPUT_HANDLE);
h_con_handle = _open_osfhandle(l_std_handle, _O_TEXT);
- fp = _fdopen( h_con_handle, "r" );
- *stdin = *fp;
- setvbuf( stdin, NULL, _IONBF, 0 );
+ if (h_con_handle == -1)
+ {
+ llwarns << "create_console() failed to open stdin handle" << llendl;
+ }
+ else
+ {
+ fp = _fdopen( h_con_handle, "r" );
+ *stdin = *fp;
+ setvbuf( stdin, NULL, _IONBF, 0 );
+ }
// redirect unbuffered STDERR to the console
l_std_handle = (long)GetStdHandle(STD_ERROR_HANDLE);
h_con_handle = _open_osfhandle(l_std_handle, _O_TEXT);
- fp = _fdopen( h_con_handle, "w" );
- *stderr = *fp;
- setvbuf( stderr, NULL, _IONBF, 0 );
+ if (h_con_handle == -1)
+ {
+ llwarns << "create_console() failed to open stderr handle" << llendl;
+ }
+ else
+ {
+ fp = _fdopen( h_con_handle, "w" );
+ *stderr = *fp;
+ setvbuf( stderr, NULL, _IONBF, 0 );
+ }
}
LLAppViewerWin32::LLAppViewerWin32(const char* cmd_line) :
@@ -497,11 +518,7 @@ void LLAppViewerWin32::handleCrashReporting(bool reportFreeze)
}
else
{
- S32 cb = gCrashSettings.getS32(CRASH_BEHAVIOR_SETTING);
- if(cb != CRASH_BEHAVIOR_NEVER_SEND)
- {
- _spawnl(_P_NOWAIT, exe_path.c_str(), arg_str, NULL);
- }
+ _spawnl(_P_NOWAIT, exe_path.c_str(), arg_str, NULL);
}
}
diff --git a/indra/newview/llassetuploadresponders.cpp b/indra/newview/llassetuploadresponders.cpp
index c08771c5e7..966f5b941e 100644
--- a/indra/newview/llassetuploadresponders.cpp
+++ b/indra/newview/llassetuploadresponders.cpp
@@ -127,6 +127,15 @@ void on_new_single_inventory_upload_complete(
group_perms,
next_owner_perms);
+ U32 inventory_item_flags = 0;
+ if (server_response.has("inventory_flags"))
+ {
+ inventory_item_flags = (U32) server_response["inventory_flags"].asInteger();
+ if (inventory_item_flags != 0)
+ {
+ llinfos << "inventory_item_flags " << inventory_item_flags << llendl;
+ }
+ }
S32 creation_date_now = time_corrected();
LLPointer<LLViewerInventoryItem> item = new LLViewerInventoryItem(
server_response["new_inventory_item"].asUUID(),
@@ -138,7 +147,7 @@ void on_new_single_inventory_upload_complete(
item_name,
item_description,
LLSaleInfo::DEFAULT,
- LLInventoryItemFlags::II_FLAGS_NONE,
+ inventory_item_flags,
creation_date_now);
gInventory.updateItem(item);
@@ -384,18 +393,18 @@ void LLNewAgentInventoryResponder::uploadComplete(const LLSD& content)
// Continuing the horrible hack above, we need to extract the originally requested permissions data, if any,
// and use them for each next file to be uploaded. Note the requested perms are not the same as the
U32 everyone_perms =
- content.has("everyone_mask") ?
- content["everyone_mask"].asInteger() :
+ content.has("new_everyone_mask") ?
+ content["new_everyone_mask"].asInteger() :
PERM_NONE;
U32 group_perms =
- content.has("group_mask") ?
- content["group_mask"].asInteger() :
+ content.has("new_group_mask") ?
+ content["new_group_mask"].asInteger() :
PERM_NONE;
U32 next_owner_perms =
- content.has("next_owner_mask") ?
- content["next_owner_mask"].asInteger() :
+ content.has("new_next_owner_mask") ?
+ content["new_next_owner_mask"].asInteger() :
PERM_NONE;
std::string display_name = LLStringUtil::null;
@@ -449,7 +458,7 @@ void LLSendTexLayerResponder::uploadComplete(const LLSD& content)
std::string result = content["state"];
LLUUID new_id = content["new_asset"];
- llinfos << "result: " << result << "new_id:" << new_id << llendl;
+ llinfos << "result: " << result << " new_id: " << new_id << llendl;
if (result == "complete"
&& mBakedUploadData != NULL)
{ // Invoke
diff --git a/indra/newview/llassetuploadresponders.h b/indra/newview/llassetuploadresponders.h
index 70871b62e2..381b919c4a 100644
--- a/indra/newview/llassetuploadresponders.h
+++ b/indra/newview/llassetuploadresponders.h
@@ -112,6 +112,7 @@ private:
struct LLBakedUploadData;
class LLSendTexLayerResponder : public LLAssetUploadResponder
{
+ LOG_CLASS(LLSendTexLayerResponder);
public:
LLSendTexLayerResponder(const LLSD& post_data,
const LLUUID& vfile_id,
diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp
index cbbdcb2983..8344b08bfb 100644..100755
--- a/indra/newview/llavataractions.cpp
+++ b/indra/newview/llavataractions.cpp
@@ -49,6 +49,7 @@
#include "llfloaterpay.h"
#include "llfloaterwebcontent.h"
#include "llfloaterworldmap.h"
+#include "llfolderview.h"
#include "llgiveinventory.h"
#include "llinventorybridge.h"
#include "llinventorymodel.h" // for gInventory.findCategoryUUIDForType
@@ -69,6 +70,7 @@
#include "lltrans.h"
#include "llcallingcard.h"
#include "llslurl.h" // IDEVO
+#include "llsidepanelinventory.h"
// static
void LLAvatarActions::requestFriendshipDialog(const LLUUID& id, const std::string& name)
@@ -312,7 +314,9 @@ static void on_avatar_name_show_profile(const LLUUID& agent_id, const LLAvatarNa
std::string url = getProfileURL(username);
// PROFILES: open in webkit window
- LLWeb::loadWebURLInternal(url, "", agent_id.asString());
+ const bool show_chrome = false;
+ static LLCachedControl<LLRect> profile_rect(gSavedSettings, "WebProfileRect");
+ LLFloaterWebContent::create(url, "", agent_id.asString(), show_chrome, profile_rect);
}
// static
@@ -444,8 +448,6 @@ void LLAvatarActions::share(const LLUUID& id)
namespace action_give_inventory
{
- typedef std::set<LLUUID> uuid_set_t;
-
/**
* Returns a pointer to 'Add More' inventory panel of Edit Outfit SP.
*/
@@ -475,18 +477,16 @@ namespace action_give_inventory
/**
* Checks My Inventory visibility.
*/
+
static bool is_give_inventory_acceptable()
{
- LLInventoryPanel* active_panel = get_active_inventory_panel();
- if (!active_panel) return false;
-
// check selection in the panel
- const uuid_set_t inventory_selected_uuids = active_panel->getRootFolder()->getSelectionList();
+ const std::set<LLUUID> inventory_selected_uuids = LLAvatarActions::getInventorySelectedUUIDs();
if (inventory_selected_uuids.empty()) return false; // nothing selected
bool acceptable = false;
- uuid_set_t::const_iterator it = inventory_selected_uuids.begin();
- const uuid_set_t::const_iterator it_end = inventory_selected_uuids.end();
+ std::set<LLUUID>::const_iterator it = inventory_selected_uuids.begin();
+ const std::set<LLUUID>::const_iterator it_end = inventory_selected_uuids.end();
for (; it != it_end; ++it)
{
LLViewerInventoryCategory* inv_cat = gInventory.getCategory(*it);
@@ -529,12 +529,12 @@ namespace action_give_inventory
}
}
- static void build_items_string(const uuid_set_t& inventory_selected_uuids , std::string& items_string)
+ static void build_items_string(const std::set<LLUUID>& inventory_selected_uuids , std::string& items_string)
{
llassert(inventory_selected_uuids.size() > 0);
const std::string& separator = LLTrans::getString("words_separator");
- for (uuid_set_t::const_iterator it = inventory_selected_uuids.begin(); ; )
+ for (std::set<LLUUID>::const_iterator it = inventory_selected_uuids.begin(); ; )
{
LLViewerInventoryCategory* inv_cat = gInventory.getCategory(*it);
if (NULL != inv_cat)
@@ -570,10 +570,7 @@ namespace action_give_inventory
return;
}
- LLInventoryPanel* active_panel = get_active_inventory_panel();
- if (!active_panel) return;
-
- const uuid_set_t inventory_selected_uuids = active_panel->getRootFolder()->getSelectionList();
+ const std::set<LLUUID> inventory_selected_uuids = LLAvatarActions::getInventorySelectedUUIDs();
if (inventory_selected_uuids.empty())
{
return;
@@ -590,8 +587,8 @@ namespace action_give_inventory
// We souldn't open IM session, just calculate session ID for logging purpose. See EXT-6710
const LLUUID session_id = gIMMgr->computeSessionID(IM_NOTHING_SPECIAL, avatar_uuid);
- uuid_set_t::const_iterator it = inventory_selected_uuids.begin();
- const uuid_set_t::const_iterator it_end = inventory_selected_uuids.end();
+ std::set<LLUUID>::const_iterator it = inventory_selected_uuids.begin();
+ const std::set<LLUUID>::const_iterator it_end = inventory_selected_uuids.end();
const std::string& separator = LLTrans::getString("words_separator");
std::string noncopy_item_names;
@@ -654,10 +651,7 @@ namespace action_give_inventory
{
llassert(avatar_names.size() == avatar_uuids.size());
- LLInventoryPanel* active_panel = get_active_inventory_panel();
- if (!active_panel) return;
-
- const uuid_set_t inventory_selected_uuids = active_panel->getRootFolder()->getSelectionList();
+ const std::set<LLUUID> inventory_selected_uuids = LLAvatarActions::getInventorySelectedUUIDs();
if (inventory_selected_uuids.empty())
{
return;
@@ -678,6 +672,33 @@ namespace action_give_inventory
}
}
+
+
+//static
+std::set<LLUUID> LLAvatarActions::getInventorySelectedUUIDs()
+{
+ std::set<LLUUID> inventory_selected_uuids;
+
+ LLInventoryPanel* active_panel = action_give_inventory::get_active_inventory_panel();
+ if (active_panel)
+ {
+ inventory_selected_uuids = active_panel->getRootFolder()->getSelectionList();
+ }
+
+ if (inventory_selected_uuids.empty())
+ {
+ LLSidepanelInventory * sidepanel_inventory = LLSideTray::getInstance()->getPanel<LLSidepanelInventory>("sidepanel_inventory");
+ LLInventoryPanel * inbox = sidepanel_inventory->findChild<LLInventoryPanel>("inventory_inbox");
+ if (inbox)
+ {
+ inventory_selected_uuids = inbox->getRootFolder()->getSelectionList();
+ }
+
+ }
+
+ return inventory_selected_uuids;
+}
+
//static
void LLAvatarActions::shareWithAvatars()
{
@@ -705,12 +726,12 @@ bool LLAvatarActions::canShareSelectedItems(LLInventoryPanel* inv_panel /* = NUL
// check selection in the panel
LLFolderView* root_folder = inv_panel->getRootFolder();
- const uuid_set_t inventory_selected_uuids = root_folder->getSelectionList();
+ const std::set<LLUUID> inventory_selected_uuids = root_folder->getSelectionList();
if (inventory_selected_uuids.empty()) return false; // nothing selected
bool can_share = true;
- uuid_set_t::const_iterator it = inventory_selected_uuids.begin();
- const uuid_set_t::const_iterator it_end = inventory_selected_uuids.end();
+ std::set<LLUUID>::const_iterator it = inventory_selected_uuids.begin();
+ const std::set<LLUUID>::const_iterator it_end = inventory_selected_uuids.end();
for (; it != it_end; ++it)
{
LLViewerInventoryCategory* inv_cat = gInventory.getCategory(*it);
@@ -773,6 +794,10 @@ bool LLAvatarActions::canOfferTeleport(const LLUUID& id)
// static
bool LLAvatarActions::canOfferTeleport(const uuid_vec_t& ids)
{
+ // We can't send more than 250 lures in a single message, so disable this
+ // button when there are too many id's selected.
+ if(ids.size() > 250) return false;
+
bool result = true;
for (uuid_vec_t::const_iterator it = ids.begin(); it != ids.end(); ++it)
{
diff --git a/indra/newview/llavataractions.h b/indra/newview/llavataractions.h
index 956fed7461..fbfd815f41 100644
--- a/indra/newview/llavataractions.h
+++ b/indra/newview/llavataractions.h
@@ -36,6 +36,7 @@
class LLInventoryPanel;
+
/**
* Friend-related actions (add, remove, offer teleport, etc)
*/
@@ -196,6 +197,8 @@ public:
*/
static bool canShareSelectedItems(LLInventoryPanel* inv_panel = NULL);
+ static std::set<LLUUID> getInventorySelectedUUIDs();
+
private:
static bool callbackAddFriendWithMessage(const LLSD& notification, const LLSD& response);
static bool handleRemove(const LLSD& notification, const LLSD& response);
diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp
index f51552aae5..79e6c7b66b 100644
--- a/indra/newview/llbottomtray.cpp
+++ b/indra/newview/llbottomtray.cpp
@@ -46,6 +46,7 @@
#include "llhints.h"
#include "llimfloater.h" // for LLIMFloater
#include "llnearbychatbar.h"
+#include "llnearbychatbarlistener.h"
#include "llsidetray.h"
#include "llspeakbutton.h"
#include "llsplitbutton.h"
@@ -385,6 +386,7 @@ void LLBottomTray::onChange(EStatusType status, const std::string &channelURI, b
{
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);
@@ -537,6 +539,8 @@ BOOL LLBottomTray::postBuild()
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");
@@ -567,7 +571,7 @@ BOOL LLBottomTray::postBuild()
// 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);
diff --git a/indra/newview/llbottomtray.h b/indra/newview/llbottomtray.h
index d9c95d82e5..62718531ef 100644
--- a/indra/newview/llbottomtray.h
+++ b/indra/newview/llbottomtray.h
@@ -39,6 +39,7 @@ class LLIMChiclet;
class LLBottomTrayLite;
class LLLayoutPanel;
class LLMenuGL;
+class LLNearbyChatBarListener;
// Build time optimization, generate once in .cpp file
#ifndef LLBOTTOMTRAY_CPP
@@ -555,6 +556,9 @@ protected:
* 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/llchatbar.cpp b/indra/newview/llchatbar.cpp
index 6e58be8174..cf0374075a 100644
--- a/indra/newview/llchatbar.cpp
+++ b/indra/newview/llchatbar.cpp
@@ -671,6 +671,9 @@ void LLChatBar::onCommitGesture(LLUICtrl* ctrl)
}
}
+
+/* Cruft - global gChatHandler declared below has been commented out,
+ so this class is never used. See similar code in llnearbychatbar.cpp
class LLChatHandler : public LLCommandHandler
{
public:
@@ -691,7 +694,7 @@ public:
{
S32 channel = tokens[0].asInteger();
// VWR-19499 Restrict function to chat channels greater than 0.
- if ((channel > 0) && (channel < 2147483647))
+ if ((channel > 0) && (channel < CHAT_CHANNEL_DEBUG))
{
retval = true;
// Say mesg on channel
@@ -710,3 +713,4 @@ public:
// Creating the object registers with the dispatcher.
//LLChatHandler gChatHandler;
+cruft */
diff --git a/indra/newview/llcloud.cpp b/indra/newview/llcloud.cpp
deleted file mode 100644
index cda0f6e4a2..0000000000
--- a/indra/newview/llcloud.cpp
+++ /dev/null
@@ -1,538 +0,0 @@
-/**
- * @file llcloud.cpp
- * @brief Implementation of viewer LLCloudLayer class
- *
- * $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 "llmath.h"
-//#include "vmath.h"
-#include "v3math.h"
-#include "v4math.h"
-#include "llquaternion.h"
-#include "llrand.h"
-#include "v4color.h"
-
-#include "llwind.h"
-#include "llcloud.h"
-#include "llgl.h"
-#include "llviewerobjectlist.h"
-#include "llvoclouds.h"
-#include "llvosky.h"
-#include "llsky.h"
-#include "llviewerregion.h"
-#include "patch_dct.h"
-#include "patch_code.h"
-#include "llglheaders.h"
-#include "pipeline.h"
-#include "lldrawpool.h"
-#include "llworld.h"
-
-extern LLPipeline gPipeline;
-
-const F32 CLOUD_UPDATE_RATE = 1.0f; // Global time dilation for clouds
-const F32 CLOUD_GROW_RATE = 0.05f;
-const F32 CLOUD_DECAY_RATE = -0.05f;
-const F32 CLOUD_VELOCITY_SCALE = 0.01f;
-const F32 CLOUD_DENSITY = 25.f;
-const S32 CLOUD_COUNT_MAX = 20;
-const F32 CLOUD_HEIGHT_RANGE = 48.f;
-const F32 CLOUD_HEIGHT_MEAN = 192.f;
-
-enum
-{
- LL_PUFF_GROWING = 0,
- LL_PUFF_DYING = 1
-};
-
-// Used for patch decoder
-S32 gBuffer[16*16];
-
-
-//static
-S32 LLCloudPuff::sPuffCount = 0;
-
-LLCloudPuff::LLCloudPuff() :
- mAlpha(0.01f),
- mRate(CLOUD_GROW_RATE*CLOUD_UPDATE_RATE),
- mLifeState(LL_PUFF_GROWING)
-{
-}
-
-LLCloudGroup::LLCloudGroup() :
- mCloudLayerp(NULL),
- mDensity(0.f),
- mTargetPuffCount(0),
- mVOCloudsp(NULL)
-{
-}
-
-void LLCloudGroup::cleanup()
-{
- if (mVOCloudsp)
- {
- if (!mVOCloudsp->isDead())
- {
- gObjectList.killObject(mVOCloudsp);
- }
- mVOCloudsp = NULL;
- }
-}
-
-void LLCloudGroup::setCenterRegion(const LLVector3 &center)
-{
- mCenterRegion = center;
-}
-
-void LLCloudGroup::updatePuffs(const F32 dt)
-{
- mDensity = mCloudLayerp->getDensityRegion(mCenterRegion);
-
- if (!mVOCloudsp)
- {
- mVOCloudsp = (LLVOClouds *)gObjectList.createObjectViewer(LLViewerObject::LL_VO_CLOUDS, mCloudLayerp->getRegion());
- mVOCloudsp->setCloudGroup(this);
- mVOCloudsp->setPositionRegion(mCenterRegion);
- mVOCloudsp->setScale(LLVector3(256.f/CLOUD_GROUPS_PER_EDGE + CLOUD_PUFF_WIDTH,
- 256.f/CLOUD_GROUPS_PER_EDGE + CLOUD_PUFF_WIDTH,
- CLOUD_HEIGHT_RANGE + CLOUD_PUFF_HEIGHT)*0.5f);
- gPipeline.createObject(mVOCloudsp);
- }
-
- LLVector3 velocity;
- LLVector3d vel_d;
- // Update the positions of all of the clouds
- for (U32 i = 0; i < mCloudPuffs.size(); i++)
- {
- LLCloudPuff &puff = mCloudPuffs[i];
- velocity = mCloudLayerp->getRegion()->mWind.getCloudVelocity(mCloudLayerp->getRegion()->getPosRegionFromGlobal(puff.mPositionGlobal));
- velocity *= CLOUD_VELOCITY_SCALE*CLOUD_UPDATE_RATE;
- vel_d.setVec(velocity);
- mCloudPuffs[i].mPositionGlobal += vel_d;
- mCloudPuffs[i].mAlpha += mCloudPuffs[i].mRate * dt;
- mCloudPuffs[i].mAlpha = llmin(1.f, mCloudPuffs[i].mAlpha);
- mCloudPuffs[i].mAlpha = llmax(0.f, mCloudPuffs[i].mAlpha);
- }
-}
-
-void LLCloudGroup::updatePuffOwnership()
-{
- U32 i = 0;
- while (i < mCloudPuffs.size())
- {
- if (mCloudPuffs[i].getLifeState() == LL_PUFF_DYING)
- {
- i++;
- continue;
- }
- if (inGroup(mCloudPuffs[i]))
- {
- i++;
- continue;
- }
-
- //llinfos << "Cloud moving to new group" << llendl;
- LLCloudGroup *new_cgp = LLWorld::getInstance()->findCloudGroup(mCloudPuffs[i]);
- if (!new_cgp)
- {
- //llinfos << "Killing puff not in group" << llendl;
- mCloudPuffs[i].setLifeState(LL_PUFF_DYING);
- mCloudPuffs[i].mRate = CLOUD_DECAY_RATE*CLOUD_UPDATE_RATE;
- i++;
- continue;
- }
- //llinfos << "Puff handed off!" << llendl;
- LLCloudPuff puff;
- puff.mPositionGlobal = mCloudPuffs[i].mPositionGlobal;
- puff.mAlpha = mCloudPuffs[i].mAlpha;
- mCloudPuffs.erase(mCloudPuffs.begin() + i);
- new_cgp->mCloudPuffs.push_back(puff);
- }
-
- //llinfos << "Puff count: " << LLCloudPuff::sPuffCount << llendl;
-}
-
-void LLCloudGroup::updatePuffCount()
-{
- if (!mVOCloudsp)
- {
- return;
- }
- S32 i;
- S32 target_puff_count = llround(CLOUD_DENSITY * mDensity);
- target_puff_count = llmax(0, target_puff_count);
- target_puff_count = llmin(CLOUD_COUNT_MAX, target_puff_count);
- S32 current_puff_count = (S32) mCloudPuffs.size();
- // Create a new cloud if we need one
- if (current_puff_count < target_puff_count)
- {
- LLVector3d puff_pos_global;
- mCloudPuffs.resize(target_puff_count);
- for (i = current_puff_count; i < target_puff_count; i++)
- {
- puff_pos_global = mVOCloudsp->getPositionGlobal();
- F32 x = ll_frand(256.f/CLOUD_GROUPS_PER_EDGE) - 128.f/CLOUD_GROUPS_PER_EDGE;
- F32 y = ll_frand(256.f/CLOUD_GROUPS_PER_EDGE) - 128.f/CLOUD_GROUPS_PER_EDGE;
- F32 z = ll_frand(CLOUD_HEIGHT_RANGE) - 0.5f*CLOUD_HEIGHT_RANGE;
- puff_pos_global += LLVector3d(x, y, z);
- mCloudPuffs[i].mPositionGlobal = puff_pos_global;
- mCloudPuffs[i].mAlpha = 0.01f;
- LLCloudPuff::sPuffCount++;
- }
- }
-
- // Count the number of live puffs
- S32 live_puff_count = 0;
- for (i = 0; i < (S32) mCloudPuffs.size(); i++)
- {
- if (mCloudPuffs[i].getLifeState() != LL_PUFF_DYING)
- {
- live_puff_count++;
- }
- }
-
-
- // Start killing enough puffs so the live puff count == target puff count
- S32 new_dying_count = llmax(0, live_puff_count - target_puff_count);
- i = 0;
- while (new_dying_count > 0)
- {
- if (mCloudPuffs[i].getLifeState() != LL_PUFF_DYING)
- {
- //llinfos << "Killing extra live cloud" << llendl;
- mCloudPuffs[i].setLifeState(LL_PUFF_DYING);
- mCloudPuffs[i].mRate = CLOUD_DECAY_RATE*CLOUD_UPDATE_RATE;
- new_dying_count--;
- }
- i++;
- }
-
- // Remove fully dead puffs
- i = 0;
- while (i < (S32) mCloudPuffs.size())
- {
- if (mCloudPuffs[i].isDead())
- {
- //llinfos << "Removing dead puff!" << llendl;
- mCloudPuffs.erase(mCloudPuffs.begin() + i);
- LLCloudPuff::sPuffCount--;
- }
- else
- {
- i++;
- }
- }
-}
-
-BOOL LLCloudGroup::inGroup(const LLCloudPuff &puff) const
-{
- // Do min/max check on center of the cloud puff
- F32 min_x, min_y, max_x, max_y;
- F32 delta = 128.f/CLOUD_GROUPS_PER_EDGE;
- min_x = mCenterRegion.mV[VX] - delta;
- min_y = mCenterRegion.mV[VY] - delta;
- max_x = mCenterRegion.mV[VX] + delta;
- max_y = mCenterRegion.mV[VY] + delta;
-
- LLVector3 pos_region = mCloudLayerp->getRegion()->getPosRegionFromGlobal(puff.getPositionGlobal());
-
- if ((pos_region.mV[VX] < min_x)
- || (pos_region.mV[VY] < min_y)
- || (pos_region.mV[VX] > max_x)
- || (pos_region.mV[VY] > max_y))
- {
- return FALSE;
- }
- return TRUE;
-}
-
-LLCloudLayer::LLCloudLayer()
-: mOriginGlobal(0.0f, 0.0f, 0.0f),
- mMetersPerEdge(1.0f),
- mMetersPerGrid(1.0f),
- mWindp(NULL),
- mDensityp(NULL)
-{
- S32 i, j;
- for (i = 0; i < 4; i++)
- {
- mNeighbors[i] = NULL;
- }
-
- F32 x, y;
- for (i = 0; i < CLOUD_GROUPS_PER_EDGE; i++)
- {
- y = (0.5f + i)*(256.f/CLOUD_GROUPS_PER_EDGE);
- for (j = 0; j < CLOUD_GROUPS_PER_EDGE; j++)
- {
- x = (0.5f + j)*(256.f/CLOUD_GROUPS_PER_EDGE);
-
- mCloudGroups[i][j].setCloudLayerp(this);
- mCloudGroups[i][j].setCenterRegion(LLVector3(x, y, CLOUD_HEIGHT_MEAN));
- }
- }
-}
-
-
-
-LLCloudLayer::~LLCloudLayer()
-{
- destroy();
-}
-
-
-void LLCloudLayer::create(LLViewerRegion *regionp)
-{
- llassert(regionp);
-
- mRegionp = regionp;
- mDensityp = new F32 [CLOUD_GRIDS_PER_EDGE * CLOUD_GRIDS_PER_EDGE];
-
- U32 i;
- for (i = 0; i < CLOUD_GRIDS_PER_EDGE*CLOUD_GRIDS_PER_EDGE; i++)
- {
- mDensityp[i] = 0.f;
- }
-}
-
-void LLCloudLayer::setRegion(LLViewerRegion *regionp)
-{
- mRegionp = regionp;
-}
-
-void LLCloudLayer::destroy()
-{
- reset();
-
- delete [] mDensityp;
- mDensityp = NULL;
- mWindp = NULL;
-}
-
-
-void LLCloudLayer::reset()
-{
- // Kill all of the existing puffs
- S32 i, j;
-
- for (i = 0; i < CLOUD_GROUPS_PER_EDGE; i++)
- {
- for (j = 0; j < CLOUD_GROUPS_PER_EDGE; j++)
- {
- mCloudGroups[i][j].cleanup();
- }
- }
-}
-
-void LLCloudLayer::setWindPointer(LLWind *windp)
-{
- if (mWindp)
- {
- mWindp->setCloudDensityPointer(NULL);
- }
- mWindp = windp;
- if (mWindp)
- {
- mWindp->setCloudDensityPointer(mDensityp);
- }
-}
-
-
-void LLCloudLayer::setWidth(F32 width)
-{
- mMetersPerEdge = width;
- mMetersPerGrid = width / CLOUD_GRIDS_PER_EDGE;
-}
-
-
-F32 LLCloudLayer::getDensityRegion(const LLVector3 &pos_region)
-{
- // "position" is region-local
- S32 i, j, ii, jj;
-
- i = lltrunc(pos_region.mV[VX] / mMetersPerGrid);
- j = lltrunc(pos_region.mV[VY] / mMetersPerGrid);
- ii = i + 1;
- jj = j + 1;
-
-
- // clamp
- if (i >= (S32)CLOUD_GRIDS_PER_EDGE)
- {
- i = CLOUD_GRIDS_PER_EDGE - 1;
- ii = i;
- }
- else if (i < 0)
- {
- i = 0;
- ii = i;
- }
- else if (ii >= (S32)CLOUD_GRIDS_PER_EDGE || ii < 0)
- {
- ii = i;
- }
-
- if (j >= (S32)CLOUD_GRIDS_PER_EDGE)
- {
- j = CLOUD_GRIDS_PER_EDGE - 1;
- jj = j;
- }
- else if (j < 0)
- {
- j = 0;
- jj = j;
- }
- else if (jj >= (S32)CLOUD_GRIDS_PER_EDGE || jj < 0)
- {
- jj = j;
- }
-
- F32 dx = (pos_region.mV[VX] - (F32) i * mMetersPerGrid) / mMetersPerGrid;
- F32 dy = (pos_region.mV[VY] - (F32) j * mMetersPerGrid) / mMetersPerGrid;
- F32 omdx = 1.0f - dx;
- F32 omdy = 1.0f - dy;
-
- F32 density = dx * dy * *(mDensityp + ii + jj * CLOUD_GRIDS_PER_EDGE) +
- dx * omdy * *(mDensityp + i + jj * CLOUD_GRIDS_PER_EDGE) +
- omdx * dy * *(mDensityp + ii + j * CLOUD_GRIDS_PER_EDGE) +
- omdx * omdy * *(mDensityp + i + j * CLOUD_GRIDS_PER_EDGE);
-
- return density;
-}
-
-void LLCloudLayer::decompress(LLBitPack &bitpack, LLGroupHeader *group_headerp)
-{
- LLPatchHeader patch_header;
-
- init_patch_decompressor(group_headerp->patch_size);
-
- // Don't use the packed group_header stride because the strides used on
- // simulator and viewer are not equal.
- group_headerp->stride = group_headerp->patch_size; // offset required to step up one row
- set_group_of_patch_header(group_headerp);
-
- decode_patch_header(bitpack, &patch_header);
- decode_patch(bitpack, gBuffer);
- decompress_patch(mDensityp, gBuffer, &patch_header);
-}
-
-void LLCloudLayer::updatePuffs(const F32 dt)
-{
- // We want to iterate through all of the cloud groups
- // and update their density targets
-
- S32 i, j;
-
- for (i = 0; i < CLOUD_GROUPS_PER_EDGE; i++)
- {
- for (j = 0; j < CLOUD_GROUPS_PER_EDGE; j++)
- {
- mCloudGroups[i][j].updatePuffs(dt);
- }
- }
-}
-
-void LLCloudLayer::updatePuffOwnership()
-{
- S32 i, j;
-
- for (i = 0; i < CLOUD_GROUPS_PER_EDGE; i++)
- {
- for (j = 0; j < CLOUD_GROUPS_PER_EDGE; j++)
- {
- mCloudGroups[i][j].updatePuffOwnership();
- }
- }
-}
-
-void LLCloudLayer::updatePuffCount()
-{
- S32 i, j;
-
- for (i = 0; i < CLOUD_GROUPS_PER_EDGE; i++)
- {
- for (j = 0; j < CLOUD_GROUPS_PER_EDGE; j++)
- {
- mCloudGroups[i][j].updatePuffCount();
- }
- }
-}
-
-LLCloudGroup *LLCloudLayer::findCloudGroup(const LLCloudPuff &puff)
-{
- S32 i, j;
-
- for (i = 0; i < CLOUD_GROUPS_PER_EDGE; i++)
- {
- for (j = 0; j < CLOUD_GROUPS_PER_EDGE; j++)
- {
- if (mCloudGroups[i][j].inGroup(puff))
- {
- return &(mCloudGroups[i][j]);
- }
- }
- }
- return NULL;
-}
-
-
-
-void LLCloudLayer::connectNeighbor(LLCloudLayer *cloudp, U32 direction)
-{
- if (direction >= 4)
- {
- // Only care about cardinal 4 directions.
- return;
- }
-
- mNeighbors[direction] = cloudp;
- if (cloudp)
- mNeighbors[direction]->mNeighbors[gDirOpposite[direction]] = this;
-}
-
-
-void LLCloudLayer::disconnectNeighbor(U32 direction)
-{
- if (direction >= 4)
- {
- // Only care about cardinal 4 directions.
- return;
- }
-
- if (mNeighbors[direction])
- {
- mNeighbors[direction]->mNeighbors[gDirOpposite[direction]] = NULL;
- mNeighbors[direction] = NULL;
- }
-}
-
-
-void LLCloudLayer::disconnectAllNeighbors()
-{
- S32 i;
- for (i = 0; i < 4; i++)
- {
- disconnectNeighbor(i);
- }
-}
diff --git a/indra/newview/llcloud.h b/indra/newview/llcloud.h
deleted file mode 100644
index 0435ba1ece..0000000000
--- a/indra/newview/llcloud.h
+++ /dev/null
@@ -1,199 +0,0 @@
-/**
- * @file llcloud.h
- * @brief Description of viewer LLCloudLayer class
- *
- * $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_LLCLOUD_H
-#define LL_LLCLOUD_H
-
-// Some ideas on how clouds should work
-//
-// Each region has a cloud layer
-// Each cloud layer has pre-allocated space for N clouds
-// The LLSky class knows the max number of clouds to render M.
-// All clouds use the same texture, but the tex-coords can take on 8 configurations
-// (four rotations, front and back)
-//
-// The sky's part
-// --------------
-// The sky knows that A clouds have been assigned to regions and there are B left over.
-// Divide B by number of active regions to get C.
-// Ask each region to add C more clouds and return total number D.
-// Add up all the D's to get a new A.
-//
-// The cloud layer's part
-// ----------------------
-// The cloud layer is a grid of possibility. Each grid's value represents the probablility
-// (0.0 to 1.0) that a cloud placement query will succeed.
-//
-// The sky asks the region to add C more clouds.
-// The cloud layer tries a total of E times to place clouds and returns total cloud count.
-//
-// Clouds move according to local wind velocity.
-// If a cloud moves out of region then it's location is sent to neighbor region
-// or it is allowed to drift and decay.
-//
-// The clouds in non-visible regions do not propagate every frame.
-// Each frame one non-visible region is allowed to propagate it's clouds
-// (might have to check to see if incoming cloud was already visible or not).
-//
-//
-
-#include "llmath.h"
-//#include "vmath.h"
-#include "v3math.h"
-#include "v3dmath.h"
-#include "v4math.h"
-#include "v4color.h"
-#include "llpointer.h"
-#include "lldarray.h"
-
-#include "llframetimer.h"
-
-const U32 CLOUD_GRIDS_PER_EDGE = 16;
-
-const F32 CLOUD_PUFF_WIDTH = 64.f;
-const F32 CLOUD_PUFF_HEIGHT = 48.f;
-
-class LLWind;
-class LLVOClouds;
-class LLViewerRegion;
-class LLCloudLayer;
-class LLBitPack;
-class LLGroupHeader;
-
-const S32 CLOUD_GROUPS_PER_EDGE = 4;
-
-class LLCloudPuff
-{
-public:
- LLCloudPuff();
-
- const LLVector3d &getPositionGlobal() const { return mPositionGlobal; }
- friend class LLCloudGroup;
-
- void updatePuffs(const F32 dt);
- void updatePuffOwnership();
-
- F32 getAlpha() const { return mAlpha; }
- U32 getLifeState() const { return mLifeState; }
- void setLifeState(const U32 state) { mLifeState = state; }
- BOOL isDead() const { return mAlpha <= 0.f; }
-
-
- static S32 sPuffCount;
-protected:
- F32 mAlpha;
- F32 mRate;
- LLVector3d mPositionGlobal;
-
- BOOL mLifeState;
-};
-
-class LLCloudGroup
-{
-public:
- LLCloudGroup();
-
- void cleanup();
-
- void setCloudLayerp(LLCloudLayer *clp) { mCloudLayerp = clp; }
- void setCenterRegion(const LLVector3 &center);
-
- void updatePuffs(const F32 dt);
- void updatePuffOwnership();
- void updatePuffCount();
-
- BOOL inGroup(const LLCloudPuff &puff) const;
-
- F32 getDensity() const { return mDensity; }
- S32 getNumPuffs() const { return (S32) mCloudPuffs.size(); }
- const LLCloudPuff &getPuff(const S32 i) { return mCloudPuffs[i]; }
-protected:
- LLCloudLayer *mCloudLayerp;
- LLVector3 mCenterRegion;
- F32 mDensity;
- S32 mTargetPuffCount;
-
- std::vector<LLCloudPuff> mCloudPuffs;
- LLPointer<LLVOClouds> mVOCloudsp;
-};
-
-
-class LLCloudLayer
-{
-public:
- LLCloudLayer();
- ~LLCloudLayer();
-
- void create(LLViewerRegion *regionp);
- void destroy();
-
- void reset(); // Clears all active cloud puffs
-
-
- void updatePuffs(const F32 dt);
- void updatePuffOwnership();
- void updatePuffCount();
-
- LLCloudGroup *findCloudGroup(const LLCloudPuff &puff);
-
- void setRegion(LLViewerRegion *regionp);
- LLViewerRegion* getRegion() const { return mRegionp; }
- void setWindPointer(LLWind *windp);
- void setOriginGlobal(const LLVector3d &origin_global) { mOriginGlobal = origin_global; }
- void setWidth(F32 width);
-
- void setBrightness(F32 brightness);
- void setSunColor(const LLColor4 &color);
-
- F32 getDensityRegion(const LLVector3 &pos_region); // "position" is in local coordinates
-
- void decompress(LLBitPack &bitpack, LLGroupHeader *group_header);
-
- LLCloudLayer* getNeighbor(const S32 n) const { return mNeighbors[n]; }
-
- void connectNeighbor(LLCloudLayer *cloudp, U32 direction);
- void disconnectNeighbor(U32 direction);
- void disconnectAllNeighbors();
-
-public:
- LLVector3d mOriginGlobal;
- F32 mMetersPerEdge;
- F32 mMetersPerGrid;
-
-
- F32 mMaxAlpha; // The max cloud puff _render_ alpha
-
-protected:
- LLCloudLayer *mNeighbors[4];
- LLWind *mWindp;
- LLViewerRegion *mRegionp;
- F32 *mDensityp; // the probability density grid
-
- LLCloudGroup mCloudGroups[CLOUD_GROUPS_PER_EDGE][CLOUD_GROUPS_PER_EDGE];
-};
-
-
-#endif
diff --git a/indra/newview/llcofwearables.cpp b/indra/newview/llcofwearables.cpp
index 84c560639e..254c0adef1 100644
--- a/indra/newview/llcofwearables.cpp
+++ b/indra/newview/llcofwearables.cpp
@@ -317,7 +317,6 @@ BOOL LLCOFWearables::postBuild()
mAttachments->setComparator(&WEARABLE_NAME_COMPARATOR);
mBodyParts->setComparator(&WEARABLE_NAME_COMPARATOR);
-
mClothingTab = getChild<LLAccordionCtrlTab>("tab_clothing");
mClothingTab->setDropDownStateChangedCallback(boost::bind(&LLCOFWearables::onAccordionTabStateChanged, this, _1, _2));
@@ -499,6 +498,10 @@ 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)
}
+ else
+ {
+ mAttachments->setNoItemsCommentText(LLTrans::getString("no_attachments"));
+ }
if (mBodyParts->size())
{
diff --git a/indra/newview/llcommandhandler.cpp b/indra/newview/llcommandhandler.cpp
index 19dba3f917..19dba3f917 100644..100755
--- a/indra/newview/llcommandhandler.cpp
+++ b/indra/newview/llcommandhandler.cpp
diff --git a/indra/newview/lldaycyclemanager.cpp b/indra/newview/lldaycyclemanager.cpp
new file mode 100644
index 0000000000..347a467a8b
--- /dev/null
+++ b/indra/newview/lldaycyclemanager.cpp
@@ -0,0 +1,230 @@
+/**
+ * @file lldaycyclemanager.cpp
+ * @brief Implementation for the LLDayCycleManager 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 "lldaycyclemanager.h"
+
+#include "lldiriterator.h"
+
+void LLDayCycleManager::getPresetNames(preset_name_list_t& names) const
+{
+ names.clear();
+
+ for (dc_map_t::const_iterator it = mDayCycleMap.begin(); it != mDayCycleMap.end(); ++it)
+ {
+ names.push_back(it->first);
+ }
+}
+
+void LLDayCycleManager::getPresetNames(preset_name_list_t& user, preset_name_list_t& sys) const
+{
+ user.clear();
+ sys.clear();
+
+ for (dc_map_t::const_iterator it = mDayCycleMap.begin(); it != mDayCycleMap.end(); ++it)
+ {
+ const std::string& name = it->first;
+
+ if (isSystemPreset(name))
+ {
+ sys.push_back(name);
+ }
+ else
+ {
+ user.push_back(name);
+ }
+ }
+}
+
+void LLDayCycleManager::getUserPresetNames(preset_name_list_t& user) const
+{
+ preset_name_list_t sys; // unused
+ getPresetNames(user, sys);
+}
+
+bool LLDayCycleManager::getPreset(const std::string name, LLWLDayCycle& day_cycle) const
+{
+ dc_map_t::const_iterator it = mDayCycleMap.find(name);
+ if (it == mDayCycleMap.end())
+ {
+ return false;
+ }
+
+ day_cycle = it->second;
+ return true;
+}
+
+bool LLDayCycleManager::getPreset(const std::string name, LLSD& day_cycle) const
+{
+ LLWLDayCycle dc;
+ if (!getPreset(name, dc))
+ {
+ return false;
+ }
+
+ day_cycle = dc.asLLSD();
+ return true;
+}
+
+bool LLDayCycleManager::presetExists(const std::string name) const
+{
+ LLWLDayCycle dummy;
+ return getPreset(name, dummy);
+}
+
+bool LLDayCycleManager::isSystemPreset(const std::string& name) const
+{
+ return gDirUtilp->fileExists(getSysDir() + LLURI::escape(name) + ".xml");
+}
+
+bool LLDayCycleManager::savePreset(const std::string& name, const LLSD& data)
+{
+ // Save given preset.
+ LLWLDayCycle day;
+ day.loadDayCycle(data, LLEnvKey::SCOPE_LOCAL);
+ day.save(getUserDir() + LLURI::escape(name) + ".xml");
+
+ // Add it to our map.
+ addPreset(name, data);
+ mModifySignal();
+ return true;
+}
+
+bool LLDayCycleManager::deletePreset(const std::string& name)
+{
+ // Remove it from the map.
+ dc_map_t::iterator it = mDayCycleMap.find(name);
+ if (it == mDayCycleMap.end())
+ {
+ LL_WARNS("Windlight") << "No day cycle named " << name << LL_ENDL;
+ return false;
+ }
+ mDayCycleMap.erase(it);
+
+ // Remove from the filesystem.
+ std::string filename = LLURI::escape(name) + ".xml";
+ if (gDirUtilp->fileExists(getUserDir() + filename))
+ {
+ gDirUtilp->deleteFilesInDir(getUserDir(), filename);
+ }
+
+ // Signal interested parties.
+ mModifySignal();
+ return true;
+}
+
+bool LLDayCycleManager::isSkyPresetReferenced(const std::string& preset_name) const
+{
+ // We're traversing local day cycles, they can only reference local skies.
+ LLWLParamKey key(preset_name, LLEnvKey::SCOPE_LOCAL);
+
+ for (dc_map_t::const_iterator it = mDayCycleMap.begin(); it != mDayCycleMap.end(); ++it)
+ {
+ if (it->second.hasReferencesTo(key))
+ {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+boost::signals2::connection LLDayCycleManager::setModifyCallback(const modify_signal_t::slot_type& cb)
+{
+ return mModifySignal.connect(cb);
+}
+
+// virtual
+void LLDayCycleManager::initSingleton()
+{
+ LL_DEBUGS("Windlight") << "Loading all day cycles" << LL_ENDL;
+ loadAllPresets();
+}
+
+void LLDayCycleManager::loadAllPresets()
+{
+ mDayCycleMap.clear();
+
+ // First, load system (coming out of the box) day cycles.
+ loadPresets(getSysDir());
+
+ // Then load user presets. Note that user day cycles will modify any system ones already loaded.
+ loadPresets(getUserDir());
+}
+
+void LLDayCycleManager::loadPresets(const std::string& dir)
+{
+ LLDirIterator dir_iter(dir, "*.xml");
+
+ while (1)
+ {
+ std::string file;
+ if (!dir_iter.next(file)) break; // no more files
+ loadPreset(dir + file);
+ }
+}
+
+bool LLDayCycleManager::loadPreset(const std::string& path)
+{
+ LLSD data = LLWLDayCycle::loadDayCycleFromPath(path);
+ if (data.isUndefined())
+ {
+ llwarns << "Error loading day cycle from " << path << llendl;
+ return false;
+ }
+
+ std::string name(gDirUtilp->getBaseFileName(LLURI::unescape(path), /*strip_exten = */ true));
+ addPreset(name, data);
+
+ return true;
+}
+
+bool LLDayCycleManager::addPreset(const std::string& name, const LLSD& data)
+{
+ if (name.empty())
+ {
+ llassert(name.empty());
+ return false;
+ }
+
+ LLWLDayCycle day;
+ day.loadDayCycle(data, LLEnvKey::SCOPE_LOCAL);
+ mDayCycleMap[name] = day;
+ return true;
+}
+
+// static
+std::string LLDayCycleManager::getSysDir()
+{
+ return gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight/days", "");
+}
+
+// static
+std::string LLDayCycleManager::getUserDir()
+{
+ return gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS , "windlight/days", "");
+}
diff --git a/indra/newview/lldaycyclemanager.h b/indra/newview/lldaycyclemanager.h
new file mode 100644
index 0000000000..3d2144960d
--- /dev/null
+++ b/indra/newview/lldaycyclemanager.h
@@ -0,0 +1,84 @@
+/**
+ * @file lldaycyclemanager.h
+ * @brief Implementation for the LLDayCycleManager 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_LLDAYCYCLEMANAGER_H
+#define LL_LLDAYCYCLEMANAGER_H
+
+#include <map>
+#include <string>
+
+#include "llwldaycycle.h"
+#include "llwlparammanager.h"
+
+/**
+ * WindLight day cycles manager class
+ *
+ * Provides interface for accessing, loading and saving day cycles.
+ */
+class LLDayCycleManager : public LLSingleton<LLDayCycleManager>
+{
+ LOG_CLASS(LLDayCycleManager);
+
+public:
+ typedef std::list<std::string> preset_name_list_t;
+
+ typedef std::map<std::string, LLWLDayCycle> dc_map_t;
+ typedef boost::signals2::signal<void()> modify_signal_t;
+
+ void getPresetNames(preset_name_list_t& names) const;
+ void getPresetNames(preset_name_list_t& user, preset_name_list_t& sys) const;
+ void getUserPresetNames(preset_name_list_t& user) const;
+
+ bool getPreset(const std::string name, LLWLDayCycle& day_cycle) const;
+ bool getPreset(const std::string name, LLSD& day_cycle) const;
+ bool presetExists(const std::string name) const;
+ bool isSystemPreset(const std::string& name) const;
+ bool savePreset(const std::string& name, const LLSD& data);
+ bool deletePreset(const std::string& name);
+
+ /// @return true if there is a day cycle that refers to the sky preset.
+ bool isSkyPresetReferenced(const std::string& preset_name) const;
+
+ /// Emitted when a preset gets added or deleted.
+ boost::signals2::connection setModifyCallback(const modify_signal_t::slot_type& cb);
+
+private:
+ friend class LLSingleton<LLDayCycleManager>;
+ /*virtual*/ void initSingleton();
+
+ void loadAllPresets();
+ void loadPresets(const std::string& dir);
+ bool loadPreset(const std::string& path);
+ bool addPreset(const std::string& name, const LLSD& data);
+
+ static std::string getSysDir();
+ static std::string getUserDir();
+
+ dc_map_t mDayCycleMap;
+ modify_signal_t mModifySignal;
+};
+
+#endif // LL_LLDAYCYCLEMANAGER_H
diff --git a/indra/newview/lldebugview.cpp b/indra/newview/lldebugview.cpp
index b6d67899f8..216cc66ef8 100644
--- a/indra/newview/lldebugview.cpp
+++ b/indra/newview/lldebugview.cpp
@@ -62,7 +62,8 @@ void LLDebugView::init()
LLRect r;
LLRect rect = getLocalRect();
- r.set(10, rect.getHeight() - 100, rect.getWidth()/2, 100);
+ // Rectangle to draw debug data in (full height, 3/4 width)
+ r.set(10, rect.getHeight() - 100, ((rect.getWidth()*3)/4), 100);
LLConsole::Params cp;
cp.name("debug console");
cp.max_lines(20);
diff --git a/indra/newview/lldrawable.cpp b/indra/newview/lldrawable.cpp
index bdc12ec0e3..debac9dcbf 100644
--- a/indra/newview/lldrawable.cpp
+++ b/indra/newview/lldrawable.cpp
@@ -94,7 +94,9 @@ void LLDrawable::init()
mRenderType = 0;
mCurrentScale = LLVector3(1,1,1);
mDistanceWRTCamera = 0.0f;
-
+ mPositionGroup.clear();
+ mExtents[0].clear();
+ mExtents[1].clear();
mQuietCount = 0;
mState = 0;
@@ -385,7 +387,6 @@ void LLDrawable::makeActive()
pcode == LLViewerObject::LL_VO_SURFACE_PATCH ||
pcode == LLViewerObject::LL_VO_PART_GROUP ||
pcode == LLViewerObject::LL_VO_HUD_PART_GROUP ||
- pcode == LLViewerObject::LL_VO_CLOUDS ||
pcode == LLViewerObject::LL_VO_GROUND ||
pcode == LLViewerObject::LL_VO_SKY)
{
@@ -587,7 +588,10 @@ void LLDrawable::setRadius(F32 radius)
void LLDrawable::moveUpdatePipeline(BOOL moved)
{
- makeActive();
+ if (moved)
+ {
+ makeActive();
+ }
// Update the face centers.
for (S32 i = 0; i < getNumFaces(); i++)
@@ -695,7 +699,8 @@ void LLDrawable::updateDistance(LLCamera& camera, bool force_update)
{
if (LLViewerCamera::sCurCameraID != LLViewerCamera::CAMERA_WORLD)
{
- llerrs << "WTF?" << llendl;
+ llwarns << "Attempted to update distance for non-world camera." << llendl;
+ return;
}
//switch LOD with the spatial group to avoid artifacts
@@ -1513,10 +1518,6 @@ BOOL LLDrawable::isAnimating() const
{
return TRUE;
}
- if (mVObjp->getPCode() == LLViewerObject::LL_VO_CLOUDS)
- {
- return TRUE;
- }
if (!isRoot() && !mVObjp->getAngularVelocity().isExactlyZero())
{
diff --git a/indra/newview/lldrawable.h b/indra/newview/lldrawable.h
index 9ebe1a45b4..e268640a21 100644
--- a/indra/newview/lldrawable.h
+++ b/indra/newview/lldrawable.h
@@ -276,6 +276,7 @@ public:
REBUILD_SHADOW = 0x02000000,
HAS_ALPHA = 0x04000000,
RIGGED = 0x08000000,
+ PARTITION_MOVE = 0x10000000,
} EDrawableFlags;
private: //aligned members
diff --git a/indra/newview/lldrawpool.cpp b/indra/newview/lldrawpool.cpp
index 25e4bc847c..fa7d6e2a40 100644
--- a/indra/newview/lldrawpool.cpp
+++ b/indra/newview/lldrawpool.cpp
@@ -35,7 +35,6 @@
#include "lldrawpoolalpha.h"
#include "lldrawpoolavatar.h"
#include "lldrawpoolbump.h"
-#include "lldrawpoolclouds.h"
#include "lldrawpoolground.h"
#include "lldrawpoolsimple.h"
#include "lldrawpoolsky.h"
@@ -191,6 +190,16 @@ void LLDrawPool::renderPostDeferred(S32 pass)
//virtual
void LLDrawPool::endRenderPass( S32 pass )
{
+ for (U32 i = 0; i < gGLManager.mNumTextureImageUnits; i++)
+ { //dummy cleanup of any currently bound textures
+ if (gGL.getTexUnit(i)->getCurrType() != LLTexUnit::TT_NONE)
+ {
+ gGL.getTexUnit(i)->unbind(gGL.getTexUnit(i)->getCurrType());
+ gGL.getTexUnit(i)->disable();
+ }
+ }
+
+ gGL.getTexUnit(0)->activate();
}
//virtual
@@ -430,14 +439,14 @@ void LLRenderPass::renderTexture(U32 type, U32 mask)
pushBatches(type, mask, TRUE);
}
-void LLRenderPass::pushBatches(U32 type, U32 mask, BOOL texture)
+void LLRenderPass::pushBatches(U32 type, U32 mask, BOOL texture, BOOL batch_textures)
{
for (LLCullResult::drawinfo_list_t::iterator i = gPipeline.beginRenderMap(type); i != gPipeline.endRenderMap(type); ++i)
{
LLDrawInfo* pparams = *i;
if (pparams)
{
- pushBatch(*pparams, mask, texture);
+ pushBatch(*pparams, mask, texture, batch_textures);
}
}
}
@@ -456,26 +465,43 @@ void LLRenderPass::applyModelMatrix(LLDrawInfo& params)
}
}
-void LLRenderPass::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture)
+void LLRenderPass::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture, BOOL batch_textures)
{
applyModelMatrix(params);
+ bool tex_setup = false;
+
if (texture)
{
- if (params.mTexture.notNull())
+ if (batch_textures && params.mTextureList.size() > 1)
{
- params.mTexture->addTextureStats(params.mVSize);
- gGL.getTexUnit(0)->bind(params.mTexture, TRUE) ;
- if (params.mTextureMatrix)
+ for (U32 i = 0; i < params.mTextureList.size(); ++i)
{
- glMatrixMode(GL_TEXTURE);
- glLoadMatrixf((GLfloat*) params.mTextureMatrix->mMatrix);
- gPipeline.mTextureMatrixOps++;
+ if (params.mTextureList[i].notNull())
+ {
+ gGL.getTexUnit(i)->bind(params.mTextureList[i], TRUE);
+ }
}
}
else
- {
- gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+ { //not batching textures or batch has only 1 texture -- might need a texture matrix
+ if (params.mTexture.notNull())
+ {
+ params.mTexture->addTextureStats(params.mVSize);
+ gGL.getTexUnit(0)->bind(params.mTexture, TRUE) ;
+ if (params.mTextureMatrix)
+ {
+ tex_setup = true;
+ gGL.getTexUnit(0)->activate();
+ glMatrixMode(GL_TEXTURE);
+ glLoadMatrixf((GLfloat*) params.mTextureMatrix->mMatrix);
+ gPipeline.mTextureMatrixOps++;
+ }
+ }
+ else
+ {
+ gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+ }
}
}
@@ -490,7 +516,7 @@ void LLRenderPass::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture)
gPipeline.addTrianglesDrawn(params.mCount, params.mDrawMode);
}
- if (params.mTextureMatrix && texture && params.mTexture.notNull())
+ if (tex_setup)
{
glLoadIdentity();
glMatrixMode(GL_MODELVIEW);
diff --git a/indra/newview/lldrawpool.h b/indra/newview/lldrawpool.h
index d3fd9ead0d..c7acbb42c6 100644
--- a/indra/newview/lldrawpool.h
+++ b/indra/newview/lldrawpool.h
@@ -146,8 +146,8 @@ public:
void resetDrawOrders() { }
static void applyModelMatrix(LLDrawInfo& params);
- virtual void pushBatches(U32 type, U32 mask, BOOL texture = TRUE);
- virtual void pushBatch(LLDrawInfo& params, U32 mask, BOOL texture);
+ virtual void pushBatches(U32 type, U32 mask, BOOL texture = TRUE, BOOL batch_textures = FALSE);
+ virtual void pushBatch(LLDrawInfo& params, U32 mask, BOOL texture, BOOL batch_textures = FALSE);
virtual void renderGroup(LLSpatialGroup* group, U32 type, U32 mask, BOOL texture = TRUE);
virtual void renderGroups(U32 type, U32 mask, BOOL texture = TRUE);
virtual void renderTexture(U32 type, U32 mask);
diff --git a/indra/newview/lldrawpoolalpha.cpp b/indra/newview/lldrawpoolalpha.cpp
index 8b5a2ce781..ad7e3ad593 100644
--- a/indra/newview/lldrawpoolalpha.cpp
+++ b/indra/newview/lldrawpoolalpha.cpp
@@ -124,7 +124,10 @@ void LLDrawPoolAlpha::beginPostDeferredPass(S32 pass)
if (pass == 0)
{
simple_shader = &gDeferredAlphaProgram;
- fullbright_shader = &gDeferredFullbrightProgram;
+ fullbright_shader = &gObjectFullbrightProgram;
+
+ //prime simple shader (loads shadow relevant uniforms)
+ gPipeline.bindDeferredShader(*simple_shader);
}
else
{
@@ -228,13 +231,13 @@ void LLDrawPoolAlpha::render(S32 pass)
if (!LLPipeline::sRenderDeferred)
{
simple_shader->bind();
- pushBatches(LLRenderPass::PASS_ALPHA_MASK, getVertexDataMask());
+ pushBatches(LLRenderPass::PASS_ALPHA_MASK, getVertexDataMask() | LLVertexBuffer::MAP_TEXTURE_INDEX, TRUE, TRUE);
}
if (fullbright_shader)
{
fullbright_shader->bind();
}
- pushBatches(LLRenderPass::PASS_FULLBRIGHT_ALPHA_MASK, getVertexDataMask());
+ pushBatches(LLRenderPass::PASS_FULLBRIGHT_ALPHA_MASK, getVertexDataMask() | LLVertexBuffer::MAP_TEXTURE_INDEX, TRUE, TRUE);
LLGLSLShader::bindNoShader();
}
else
@@ -273,7 +276,14 @@ void LLDrawPoolAlpha::render(S32 pass)
}
}
- renderAlpha(getVertexDataMask());
+ if (mVertexShaderLevel > 0)
+ {
+ renderAlpha(getVertexDataMask() | LLVertexBuffer::MAP_TEXTURE_INDEX);
+ }
+ else
+ {
+ renderAlpha(getVertexDataMask());
+ }
gGL.setColorMask(true, false);
@@ -283,23 +293,26 @@ void LLDrawPoolAlpha::render(S32 pass)
gGL.setSceneBlendType(LLRender::BT_ALPHA);
}
- if (deferred_render && current_shader != NULL)
- {
- gPipeline.unbindDeferredShader(*current_shader);
- }
-
if (sShowDebugAlpha)
{
- if(gPipeline.canUseWindLightShaders())
+ BOOL shaders = gPipeline.canUseVertexShaders();
+ if(shaders)
{
- LLGLSLShader::bindNoShader();
+ gObjectFullbrightNonIndexedProgram.bind();
+ }
+ else
+ {
+ gPipeline.enableLightsFullbright(LLColor4(1,1,1,1));
}
- gPipeline.enableLightsFullbright(LLColor4(1,1,1,1));
glColor4f(1,0,0,1);
LLViewerFetchedTexture::sSmokeImagep->addTextureStats(1024.f*1024.f);
gGL.getTexUnit(0)->bind(LLViewerFetchedTexture::sSmokeImagep, TRUE) ;
renderAlphaHighlight(LLVertexBuffer::MAP_VERTEX |
LLVertexBuffer::MAP_TEXCOORD0);
+ if(shaders)
+ {
+ gObjectFullbrightNonIndexedProgram.unbind();
+ }
}
}
@@ -339,12 +352,9 @@ void LLDrawPoolAlpha::renderAlpha(U32 mask)
{
BOOL initialized_lighting = FALSE;
BOOL light_enabled = TRUE;
- S32 diffuse_channel = 0;
-
- BOOL use_shaders = (LLPipeline::sUnderWaterRender && gPipeline.canUseVertexShaders())
- || gPipeline.canUseWindLightShadersOnObjects();
-
+ BOOL use_shaders = gPipeline.canUseVertexShaders();
+
for (LLCullResult::sg_list_t::iterator i = gPipeline.beginAlphaGroups(); i != gPipeline.endAlphaGroups(); ++i)
{
LLSpatialGroup* group = *i;
@@ -357,7 +367,6 @@ void LLDrawPoolAlpha::renderAlpha(U32 mask)
bool draw_glow_for_this_partition = mVertexShaderLevel > 0 && // no shaders = no glow.
// All particle systems seem to come off the wire with texture entries which claim that they glow. This is probably a bug in the data. Suppress.
group->mSpatialPartition->mPartitionType != LLViewerRegion::PARTITION_PARTICLE &&
- group->mSpatialPartition->mPartitionType != LLViewerRegion::PARTITION_CLOUD &&
group->mSpatialPartition->mPartitionType != LLViewerRegion::PARTITION_HUD_PARTICLE;
LLSpatialGroup::drawmap_elem_t& draw_info = group->mDrawMap[LLRenderPass::PASS_ALPHA];
@@ -368,92 +377,89 @@ void LLDrawPoolAlpha::renderAlpha(U32 mask)
LLRenderPass::applyModelMatrix(params);
+
+ if (params.mFullbright)
{
- if (params.mFullbright)
- {
- // Turn off lighting if it hasn't already been so.
- if (light_enabled || !initialized_lighting)
- {
- initialized_lighting = TRUE;
- if (use_shaders)
- {
- target_shader = fullbright_shader;
- }
- else
- {
- gPipeline.enableLightsFullbright(LLColor4(1,1,1,1));
- }
- light_enabled = FALSE;
- }
- }
- // Turn on lighting if it isn't already.
- else if (!light_enabled || !initialized_lighting)
+ // Turn off lighting if it hasn't already been so.
+ if (light_enabled || !initialized_lighting)
{
initialized_lighting = TRUE;
if (use_shaders)
{
- target_shader = simple_shader;
+ target_shader = fullbright_shader;
}
else
{
- gPipeline.enableLightsDynamic();
+ gPipeline.enableLightsFullbright(LLColor4(1,1,1,1));
}
- light_enabled = TRUE;
+ light_enabled = FALSE;
}
-
- // If we need shaders, and we're not ALREADY using the proper shader, then bind it
- // (this way we won't rebind shaders unnecessarily).
- if(use_shaders && (current_shader != target_shader))
+ }
+ // Turn on lighting if it isn't already.
+ else if (!light_enabled || !initialized_lighting)
+ {
+ initialized_lighting = TRUE;
+ if (use_shaders)
{
- llassert(target_shader != NULL);
- if (deferred_render && current_shader != NULL)
- {
- gPipeline.unbindDeferredShader(*current_shader);
- diffuse_channel = 0;
- }
- current_shader = target_shader;
- if (deferred_render)
- {
- gPipeline.bindDeferredShader(*current_shader);
- diffuse_channel = current_shader->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
- }
- else
- {
- current_shader->bind();
- }
+ target_shader = simple_shader;
}
- else if (!use_shaders && current_shader != NULL)
+ else
{
- if (deferred_render)
- {
- gPipeline.unbindDeferredShader(*current_shader);
- diffuse_channel = 0;
- }
- LLGLSLShader::bindNoShader();
- current_shader = NULL;
+ gPipeline.enableLightsDynamic();
}
+ light_enabled = TRUE;
+ }
- if (params.mGroup)
- {
- params.mGroup->rebuildMesh();
- }
+ // If we need shaders, and we're not ALREADY using the proper shader, then bind it
+ // (this way we won't rebind shaders unnecessarily).
+ if(use_shaders && (current_shader != target_shader))
+ {
+ llassert(target_shader != NULL);
+ current_shader = target_shader;
+ current_shader->bind();
+ }
+ else if (!use_shaders && current_shader != NULL)
+ {
+ LLGLSLShader::bindNoShader();
+ current_shader = NULL;
+ }
-
- if (params.mTexture.notNull())
+ if (params.mGroup)
+ {
+ params.mGroup->rebuildMesh();
+ }
+
+ bool tex_setup = false;
+
+ if (use_shaders && params.mTextureList.size() > 1)
+ {
+ for (U32 i = 0; i < params.mTextureList.size(); ++i)
{
- gGL.getTexUnit(diffuse_channel)->bind(params.mTexture.get());
- if(params.mTexture.notNull())
+ if (params.mTextureList[i].notNull())
{
- params.mTexture->addTextureStats(params.mVSize);
+ gGL.getTexUnit(i)->bind(params.mTextureList[i], TRUE);
}
+ }
+ }
+ else
+ { //not batching textures or batch has only 1 texture -- might need a texture matrix
+ if (params.mTexture.notNull())
+ {
+ params.mTexture->addTextureStats(params.mVSize);
+ gGL.getTexUnit(0)->bind(params.mTexture, TRUE) ;
if (params.mTextureMatrix)
{
+ tex_setup = true;
gGL.getTexUnit(0)->activate();
glMatrixMode(GL_TEXTURE);
glLoadMatrixf((GLfloat*) params.mTextureMatrix->mMatrix);
gPipeline.mTextureMatrixOps++;
}
}
+ else
+ {
+ gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+ }
}
params.mVertexBuffer->setBuffer(mask);
@@ -480,7 +486,7 @@ void LLDrawPoolAlpha::renderAlpha(U32 mask)
gGL.blendFunc(mColorSFactor, mColorDFactor, mAlphaSFactor, mAlphaDFactor);
}
- if (params.mTextureMatrix && params.mTexture.notNull())
+ if (tex_setup)
{
gGL.getTexUnit(0)->activate();
glLoadIdentity();
@@ -490,15 +496,8 @@ void LLDrawPoolAlpha::renderAlpha(U32 mask)
}
}
- if (deferred_render && current_shader != NULL)
- {
- gPipeline.unbindDeferredShader(*current_shader);
- LLVertexBuffer::unbind();
- LLGLState::checkStates();
- LLGLState::checkTextureChannels();
- LLGLState::checkClientArrays();
- }
-
+ LLVertexBuffer::unbind();
+
if (!light_enabled)
{
gPipeline.enableLightsDynamic();
diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp
index 645c7ebcae..9f790d03fe 100644
--- a/indra/newview/lldrawpoolavatar.cpp
+++ b/indra/newview/lldrawpoolavatar.cpp
@@ -459,14 +459,6 @@ S32 LLDrawPoolAvatar::getNumPasses()
{
return 10;
}
- if (LLPipeline::sImpostorRender)
- {
- return 1;
- }
- else
- {
- return 3;
- }
}
@@ -613,11 +605,11 @@ void LLDrawPoolAvatar::beginRigid()
{
if (LLPipeline::sUnderWaterRender)
{
- sVertexProgram = &gObjectSimpleWaterProgram;
+ sVertexProgram = &gObjectSimpleNonIndexedWaterProgram;
}
else
{
- sVertexProgram = &gObjectSimpleProgram;
+ sVertexProgram = &gObjectSimpleNonIndexedProgram;
}
if (sVertexProgram != NULL)
@@ -669,7 +661,7 @@ void LLDrawPoolAvatar::endDeferredImpostor()
void LLDrawPoolAvatar::beginDeferredRigid()
{
- sVertexProgram = &gDeferredDiffuseProgram;
+ sVertexProgram = &gDeferredNonIndexedDiffuseProgram;
sVertexProgram->bind();
}
@@ -700,11 +692,11 @@ void LLDrawPoolAvatar::beginSkinned()
{
if (LLPipeline::sUnderWaterRender)
{
- sVertexProgram = &gObjectSimpleWaterProgram;
+ sVertexProgram = &gObjectSimpleNonIndexedWaterProgram;
}
else
{
- sVertexProgram = &gObjectSimpleProgram;
+ sVertexProgram = &gObjectSimpleNonIndexedProgram;
}
}
@@ -789,11 +781,11 @@ void LLDrawPoolAvatar::beginRiggedSimple()
{
if (LLPipeline::sUnderWaterRender)
{
- sVertexProgram = &gObjectSimpleWaterProgram;
+ sVertexProgram = &gObjectSimpleNonIndexedWaterProgram;
}
else
{
- sVertexProgram = &gObjectSimpleProgram;
+ sVertexProgram = &gObjectSimpleNonIndexedProgram;
}
}
@@ -864,11 +856,11 @@ void LLDrawPoolAvatar::beginRiggedFullbright()
{
if (LLPipeline::sUnderWaterRender)
{
- sVertexProgram = &gObjectFullbrightWaterProgram;
+ sVertexProgram = &gObjectFullbrightNonIndexedWaterProgram;
}
else
{
- sVertexProgram = &gObjectFullbrightProgram;
+ sVertexProgram = &gObjectFullbrightNonIndexedProgram;
}
}
@@ -908,11 +900,11 @@ void LLDrawPoolAvatar::beginRiggedShinySimple()
{
if (LLPipeline::sUnderWaterRender)
{
- sVertexProgram = &gObjectShinyWaterProgram;
+ sVertexProgram = &gObjectShinyNonIndexedWaterProgram;
}
else
{
- sVertexProgram = &gObjectShinyProgram;
+ sVertexProgram = &gObjectShinyNonIndexedProgram;
}
}
@@ -953,11 +945,11 @@ void LLDrawPoolAvatar::beginRiggedFullbrightShiny()
{
if (LLPipeline::sUnderWaterRender)
{
- sVertexProgram = &gObjectFullbrightShinyWaterProgram;
+ sVertexProgram = &gObjectFullbrightShinyNonIndexedWaterProgram;
}
else
{
- sVertexProgram = &gObjectFullbrightShinyProgram;
+ sVertexProgram = &gObjectFullbrightShinyNonIndexedProgram;
}
}
@@ -1419,7 +1411,7 @@ void LLDrawPoolAvatar::updateRiggedFaceVertexBuffer(LLVOAvatar* avatar, LLFace*
void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, bool glow)
{
- if (avatar->isSelf() && !gAgent.needsRenderAvatar())
+ if (avatar->isSelf() && !gAgent.needsRenderAvatar() || !gMeshRepo.meshRezEnabled())
{
return;
}
@@ -1456,7 +1448,7 @@ void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, bool glow)
continue;
}
- const LLMeshSkinInfo* skin = gMeshRepo.getSkinInfo(mesh_id);
+ const LLMeshSkinInfo* skin = gMeshRepo.getSkinInfo(mesh_id, vobj);
if (!skin)
{
continue;
diff --git a/indra/newview/lldrawpoolbump.cpp b/indra/newview/lldrawpoolbump.cpp
index 29b50761d8..813b3820ee 100644
--- a/indra/newview/lldrawpoolbump.cpp
+++ b/indra/newview/lldrawpoolbump.cpp
@@ -94,6 +94,13 @@ void LLStandardBumpmap::restoreGL()
// static
void LLStandardBumpmap::addstandard()
{
+ if(!gTextureList.isInitialized())
+ {
+ //Note: loading pre-configuration sometimes triggers this call.
+ //But it is safe to return here because bump images will be reloaded during initialization later.
+ return ;
+ }
+
// can't assert; we destroyGL and restoreGL a lot during *first* startup, which populates this list already, THEN we explicitly init the list as part of *normal* startup. Sigh. So clear the list every time before we (re-)add the standard bumpmaps.
//llassert( LLStandardBumpmap::sStandardBumpmapCount == 0 );
clear();
@@ -309,6 +316,9 @@ void LLDrawPoolBump::endRenderPass(S32 pass)
llassert(0);
break;
}
+
+ //to cleanup texture channels
+ LLRenderPass::endRenderPass(pass);
}
//static
@@ -347,6 +357,11 @@ void LLDrawPoolBump::beginShiny(bool invisible)
}
bindCubeMap(shader, mVertexShaderLevel, diffuse_channel, cube_channel, invisible);
+
+ if (mVertexShaderLevel > 1)
+ { //indexed texture rendering, channel 0 is always diffuse
+ diffuse_channel = 0;
+ }
}
//static
@@ -414,16 +429,16 @@ void LLDrawPoolBump::renderShiny(bool invisible)
LLGLEnable blend_enable(GL_BLEND);
if (!invisible && mVertexShaderLevel > 1)
{
- LLRenderPass::renderTexture(LLRenderPass::PASS_SHINY, sVertexMask);
+ LLRenderPass::pushBatches(LLRenderPass::PASS_SHINY, sVertexMask | LLVertexBuffer::MAP_TEXTURE_INDEX, TRUE, TRUE);
}
else if (!invisible)
{
renderGroups(LLRenderPass::PASS_SHINY, sVertexMask);
}
- else // invisible
- {
- renderGroups(LLRenderPass::PASS_INVISI_SHINY, sVertexMask);
- }
+ //else // invisible (deprecated)
+ //{
+ //renderGroups(LLRenderPass::PASS_INVISI_SHINY, sVertexMask);
+ //}
}
}
@@ -522,6 +537,12 @@ void LLDrawPoolBump::beginFullbrightShiny()
gGL.getTexUnit(cube_channel)->bind(cube_map);
gGL.getTexUnit(0)->activate();
}
+
+ if (mVertexShaderLevel > 1)
+ { //indexed texture rendering, channel 0 is always diffuse
+ diffuse_channel = 0;
+ }
+
mShiny = TRUE;
}
@@ -536,7 +557,15 @@ void LLDrawPoolBump::renderFullbrightShiny()
if( gSky.mVOSkyp->getCubeMap() )
{
LLGLEnable blend_enable(GL_BLEND);
- LLRenderPass::renderTexture(LLRenderPass::PASS_FULLBRIGHT_SHINY, sVertexMask);
+
+ if (mVertexShaderLevel > 1)
+ {
+ LLRenderPass::pushBatches(LLRenderPass::PASS_FULLBRIGHT_SHINY, sVertexMask | LLVertexBuffer::MAP_TEXTURE_INDEX, TRUE, TRUE);
+ }
+ else
+ {
+ LLRenderPass::renderTexture(LLRenderPass::PASS_FULLBRIGHT_SHINY, sVertexMask);
+ }
}
}
@@ -836,6 +865,9 @@ void LLDrawPoolBump::endPostDeferredPass(S32 pass)
endBump(LLRenderPass::PASS_POST_BUMP);
break;
}
+
+ //to disable texture channels
+ LLRenderPass::endRenderPass(pass);
}
void LLDrawPoolBump::renderPostDeferred(S32 pass)
@@ -889,9 +921,10 @@ void LLBumpImageList::destroyGL()
void LLBumpImageList::restoreGL()
{
- if(!gTextureList.isInitialized())
- {
- return ;
+ if(!gTextureList.isInitialized())
+ {
+ //safe to return here because bump images will be reloaded during initialization later.
+ return ;
}
LLStandardBumpmap::restoreGL();
@@ -1292,43 +1325,60 @@ void LLDrawPoolBump::renderBump(U32 type, U32 mask)
}
}
-void LLDrawPoolBump::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture)
+void LLDrawPoolBump::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture, BOOL batch_textures)
{
applyModelMatrix(params);
- if (params.mTextureMatrix)
+ bool tex_setup = false;
+
+ if (batch_textures && params.mTextureList.size() > 1)
{
- if (mShiny)
+ for (U32 i = 0; i < params.mTextureList.size(); ++i)
{
- gGL.getTexUnit(0)->activate();
- glMatrixMode(GL_TEXTURE);
+ if (params.mTextureList[i].notNull())
+ {
+ gGL.getTexUnit(i)->bind(params.mTextureList[i], TRUE);
+ }
}
- else
+ }
+ else
+ { //not batching textures or batch has only 1 texture -- might need a texture matrix
+ if (params.mTextureMatrix)
{
- gGL.getTexUnit(1)->activate();
- glMatrixMode(GL_TEXTURE);
+ if (mShiny)
+ {
+ gGL.getTexUnit(0)->activate();
+ glMatrixMode(GL_TEXTURE);
+ }
+ else
+ {
+ gGL.getTexUnit(1)->activate();
+ glMatrixMode(GL_TEXTURE);
+ glLoadMatrixf((GLfloat*) params.mTextureMatrix->mMatrix);
+ gPipeline.mTextureMatrixOps++;
+ gGL.getTexUnit(0)->activate();
+ }
+
glLoadMatrixf((GLfloat*) params.mTextureMatrix->mMatrix);
gPipeline.mTextureMatrixOps++;
- gGL.getTexUnit(0)->activate();
- }
- glLoadMatrixf((GLfloat*) params.mTextureMatrix->mMatrix);
- gPipeline.mTextureMatrixOps++;
- }
-
- if (mShiny && mVertexShaderLevel > 1 && texture)
- {
- if (params.mTexture.notNull())
- {
- gGL.getTexUnit(diffuse_channel)->bind(params.mTexture) ;
- params.mTexture->addTextureStats(params.mVSize);
+ tex_setup = true;
}
- else
+
+ if (mShiny && mVertexShaderLevel > 1 && texture)
{
- gGL.getTexUnit(diffuse_channel)->unbind(LLTexUnit::TT_TEXTURE);
+ if (params.mTexture.notNull())
+ {
+ gGL.getTexUnit(diffuse_channel)->bind(params.mTexture) ;
+ params.mTexture->addTextureStats(params.mVSize);
+ }
+ else
+ {
+ gGL.getTexUnit(diffuse_channel)->unbind(LLTexUnit::TT_TEXTURE);
+ }
}
}
-
+
if (params.mGroup)
{
params.mGroup->rebuildMesh();
@@ -1336,7 +1386,7 @@ void LLDrawPoolBump::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture)
params.mVertexBuffer->setBuffer(mask);
params.mVertexBuffer->drawRange(params.mDrawMode, params.mStart, params.mEnd, params.mCount, params.mOffset);
gPipeline.addTrianglesDrawn(params.mCount, params.mDrawMode);
- if (params.mTextureMatrix)
+ if (tex_setup)
{
if (mShiny)
{
diff --git a/indra/newview/lldrawpoolbump.h b/indra/newview/lldrawpoolbump.h
index f4702bf61d..476b1d41b7 100644
--- a/indra/newview/lldrawpoolbump.h
+++ b/indra/newview/lldrawpoolbump.h
@@ -55,7 +55,7 @@ public:
virtual void endRenderPass( S32 pass );
virtual S32 getNumPasses();
/*virtual*/ void prerender();
- /*virtual*/ void pushBatch(LLDrawInfo& params, U32 mask, BOOL texture);
+ /*virtual*/ void pushBatch(LLDrawInfo& params, U32 mask, BOOL texture, BOOL batch_textures = FALSE);
void renderBump(U32 type, U32 mask);
void renderGroup(LLSpatialGroup* group, U32 type, U32 mask, BOOL texture);
diff --git a/indra/newview/lldrawpoolclouds.cpp b/indra/newview/lldrawpoolclouds.cpp
deleted file mode 100644
index 5db1d8cfed..0000000000
--- a/indra/newview/lldrawpoolclouds.cpp
+++ /dev/null
@@ -1,97 +0,0 @@
-/**
- * @file lldrawpoolclouds.cpp
- * @brief LLDrawPoolClouds class implementation
- *
- * $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 "lldrawpoolclouds.h"
-
-#include "llface.h"
-#include "llsky.h"
-#include "llviewercamera.h"
-#include "llvoclouds.h"
-#include "pipeline.h"
-
-LLDrawPoolClouds::LLDrawPoolClouds() :
- LLDrawPool(POOL_CLOUDS)
-{
-}
-
-LLDrawPool *LLDrawPoolClouds::instancePool()
-{
- return new LLDrawPoolClouds();
-}
-
-BOOL LLDrawPoolClouds::addFace(LLFace* face)
-{
- llerrs << "WTF?" << llendl;
- return FALSE;
-}
-
-void LLDrawPoolClouds::enqueue(LLFace *facep)
-{
- mDrawFace.push_back(facep);
- facep->mDistance = (facep->mCenterAgent - gCamera->getOrigin()) * gCamera->getAtAxis();
-}
-
-void LLDrawPoolClouds::beginRenderPass(S32 pass)
-{
- glEnableClientState(GL_VERTEX_ARRAY);
- glEnableClientState(GL_TEXTURE_COORD_ARRAY);
- glEnableClientState(GL_NORMAL_ARRAY);
-}
-
-void LLDrawPoolClouds::prerender()
-{
- mVertexShaderLevel = gPipeline.getVertexShaderLevel(LLPipeline::SHADER_ENVIRONMENT);
-}
-
-void LLDrawPoolClouds::render(S32 pass)
-{
- LLFastTimer ftm(LLFastTimer::FTM_RENDER_CLOUDS);
- if (!(gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_CLOUDS)))
- {
- return;
- }
-
- if (mDrawFace.empty())
- {
- return;
- }
-
- LLGLSPipelineAlpha gls_pipeline_alpha;
- LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE);
- glAlphaFunc(GL_GREATER,0.01f);
-
- gPipeline.enableLightsFullbright(LLColor4(1.f,1.f,1.f));
-
- mDrawFace[0]->bindTexture();
-
- std::sort(mDrawFace.begin(), mDrawFace.end(), LLFace::CompareDistanceGreater());
-
- drawLoop();
-}
-
-
diff --git a/indra/newview/lldrawpoolsimple.cpp b/indra/newview/lldrawpoolsimple.cpp
index 2e83167851..5dbb27cabb 100644
--- a/indra/newview/lldrawpoolsimple.cpp
+++ b/indra/newview/lldrawpoolsimple.cpp
@@ -44,6 +44,36 @@ static LLGLSLShader* fullbright_shader = NULL;
static LLFastTimer::DeclareTimer FTM_RENDER_SIMPLE_DEFERRED("Deferred Simple");
static LLFastTimer::DeclareTimer FTM_RENDER_GRASS_DEFERRED("Deferred Grass");
+void LLDrawPoolGlow::beginPostDeferredPass(S32 pass)
+{
+ gDeferredFullbrightProgram.bind();
+}
+
+void LLDrawPoolGlow::renderPostDeferred(S32 pass)
+{
+ LLFastTimer t(FTM_RENDER_GLOW);
+ LLGLEnable blend(GL_BLEND);
+ LLGLDisable test(GL_ALPHA_TEST);
+ gGL.flush();
+ /// Get rid of z-fighting with non-glow pass.
+ LLGLEnable polyOffset(GL_POLYGON_OFFSET_FILL);
+ glPolygonOffset(-1.0f, -1.0f);
+ gGL.setSceneBlendType(LLRender::BT_ADD);
+
+ LLGLDepthTest depth(GL_TRUE, GL_FALSE);
+ gGL.setColorMask(false, true);
+ pushBatches(LLRenderPass::PASS_GLOW, getVertexDataMask() | LLVertexBuffer::MAP_TEXTURE_INDEX, TRUE, TRUE);
+
+ gGL.setColorMask(true, false);
+ gGL.setSceneBlendType(LLRender::BT_ALPHA);
+}
+
+void LLDrawPoolGlow::endPostDeferredPass(S32 pass)
+{
+ gDeferredFullbrightProgram.unbind();
+ LLRenderPass::endRenderPass(pass);
+}
+
void LLDrawPoolGlow::render(S32 pass)
{
LLFastTimer t(FTM_RENDER_GLOW);
@@ -68,7 +98,15 @@ void LLDrawPoolGlow::render(S32 pass)
LLGLDepthTest depth(GL_TRUE, GL_FALSE);
gGL.setColorMask(false, true);
- renderTexture(LLRenderPass::PASS_GLOW, getVertexDataMask());
+
+ if (shader_level > 1)
+ {
+ pushBatches(LLRenderPass::PASS_GLOW, getVertexDataMask() | LLVertexBuffer::MAP_TEXTURE_INDEX, TRUE, TRUE);
+ }
+ else
+ {
+ renderTexture(LLRenderPass::PASS_GLOW, getVertexDataMask());
+ }
gGL.setColorMask(true, false);
gGL.setSceneBlendType(LLRender::BT_ALPHA);
@@ -79,10 +117,10 @@ void LLDrawPoolGlow::render(S32 pass)
}
}
-void LLDrawPoolGlow::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture)
+void LLDrawPoolGlow::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture, BOOL batch_textures)
{
glColor4ubv(params.mGlowColor.mV);
- LLRenderPass::pushBatch(params, mask, texture);
+ LLRenderPass::pushBatch(params, mask, texture, batch_textures);
}
@@ -126,10 +164,11 @@ void LLDrawPoolSimple::beginRenderPass(S32 pass)
void LLDrawPoolSimple::endRenderPass(S32 pass)
{
LLFastTimer t(FTM_RENDER_SIMPLE);
+ stop_glerror();
LLRenderPass::endRenderPass(pass);
-
- if (mVertexShaderLevel > 0){
-
+ stop_glerror();
+ if (mVertexShaderLevel > 0)
+ {
simple_shader->unbind();
}
}
@@ -142,13 +181,24 @@ void LLDrawPoolSimple::render(S32 pass)
{ //render simple
LLFastTimer t(FTM_RENDER_SIMPLE);
gPipeline.enableLightsDynamic();
- renderTexture(LLRenderPass::PASS_SIMPLE, getVertexDataMask());
- if (LLPipeline::sRenderDeferred)
- { //if deferred rendering is enabled, bump faces aren't registered as simple
- //render bump faces here as simple so bump faces will appear under water
- renderTexture(LLRenderPass::PASS_BUMP, getVertexDataMask());
+ if (mVertexShaderLevel > 0)
+ {
+ U32 mask = getVertexDataMask() | LLVertexBuffer::MAP_TEXTURE_INDEX;
+
+ pushBatches(LLRenderPass::PASS_SIMPLE, mask, TRUE, TRUE);
+
+ if (LLPipeline::sRenderDeferred)
+ { //if deferred rendering is enabled, bump faces aren't registered as simple
+ //render bump faces here as simple so bump faces will appear under water
+ pushBatches(LLRenderPass::PASS_BUMP, mask, TRUE, TRUE);
+ }
+ }
+ else
+ {
+ renderTexture(LLRenderPass::PASS_SIMPLE, getVertexDataMask());
}
+
}
}
@@ -177,7 +227,7 @@ void LLDrawPoolSimple::renderDeferred(S32 pass)
{ //render simple
LLFastTimer t(FTM_RENDER_SIMPLE_DEFERRED);
- renderTexture(LLRenderPass::PASS_SIMPLE, getVertexDataMask());
+ pushBatches(LLRenderPass::PASS_SIMPLE, getVertexDataMask() | LLVertexBuffer::MAP_TEXTURE_INDEX, TRUE, TRUE);
}
}
@@ -200,11 +250,11 @@ void LLDrawPoolGrass::beginRenderPass(S32 pass)
if (LLPipeline::sUnderWaterRender)
{
- simple_shader = &gObjectSimpleWaterProgram;
+ simple_shader = &gObjectSimpleNonIndexedWaterProgram;
}
else
{
- simple_shader = &gObjectSimpleProgram;
+ simple_shader = &gObjectSimpleNonIndexedProgram;
}
if (mVertexShaderLevel > 0)
@@ -285,6 +335,26 @@ void LLDrawPoolFullbright::prerender()
mVertexShaderLevel = LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_OBJECT);
}
+void LLDrawPoolFullbright::beginPostDeferredPass(S32 pass)
+{
+ gDeferredFullbrightProgram.bind();
+}
+
+void LLDrawPoolFullbright::renderPostDeferred(S32 pass)
+{
+ LLFastTimer t(FTM_RENDER_FULLBRIGHT);
+
+ gGL.setSceneBlendType(LLRender::BT_ALPHA);
+ U32 fullbright_mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0 | LLVertexBuffer::MAP_COLOR | LLVertexBuffer::MAP_TEXTURE_INDEX;
+ pushBatches(LLRenderPass::PASS_FULLBRIGHT, fullbright_mask, TRUE, TRUE);
+}
+
+void LLDrawPoolFullbright::endPostDeferredPass(S32 pass)
+{
+ gDeferredFullbrightProgram.unbind();
+ LLRenderPass::endRenderPass(pass);
+}
+
void LLDrawPoolFullbright::beginRenderPass(S32 pass)
{
LLFastTimer t(FTM_RENDER_FULLBRIGHT);
@@ -313,25 +383,21 @@ void LLDrawPoolFullbright::endRenderPass(S32 pass)
void LLDrawPoolFullbright::render(S32 pass)
{ //render fullbright
LLFastTimer t(FTM_RENDER_FULLBRIGHT);
+ gGL.setSceneBlendType(LLRender::BT_ALPHA);
+
if (mVertexShaderLevel > 0)
{
fullbright_shader->bind();
fullbright_shader->uniform1f(LLViewerShaderMgr::FULLBRIGHT, 1.f);
+ U32 fullbright_mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0 | LLVertexBuffer::MAP_COLOR | LLVertexBuffer::MAP_TEXTURE_INDEX;
+ pushBatches(LLRenderPass::PASS_FULLBRIGHT, fullbright_mask, TRUE, TRUE);
}
else
{
gPipeline.enableLightsFullbright(LLColor4(1,1,1,1));
+ U32 fullbright_mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0 | LLVertexBuffer::MAP_COLOR;
+ renderTexture(LLRenderPass::PASS_FULLBRIGHT, fullbright_mask);
}
-
- //gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.25f);
-
- //LLGLEnable test(GL_ALPHA_TEST);
- //LLGLEnable blend(GL_BLEND);
- gGL.setSceneBlendType(LLRender::BT_ALPHA);
- U32 fullbright_mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0 | LLVertexBuffer::MAP_COLOR;
- renderTexture(LLRenderPass::PASS_FULLBRIGHT, fullbright_mask);
-
- //gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);
}
S32 LLDrawPoolFullbright::getNumPasses()
diff --git a/indra/newview/lldrawpoolsimple.h b/indra/newview/lldrawpoolsimple.h
index 5f3bbebbda..3811b3d398 100644
--- a/indra/newview/lldrawpoolsimple.h
+++ b/indra/newview/lldrawpoolsimple.h
@@ -98,9 +98,9 @@ public:
LLDrawPoolFullbright();
/*virtual*/ S32 getNumPostDeferredPasses() { return 1; }
- /*virtual*/ void beginPostDeferredPass(S32 pass) { beginRenderPass(pass); }
- /*virtual*/ void endPostDeferredPass(S32 pass) { endRenderPass(pass); }
- /*virtual*/ void renderPostDeferred(S32 pass) { render(pass); }
+ /*virtual*/ void beginPostDeferredPass(S32 pass);
+ /*virtual*/ void endPostDeferredPass(S32 pass);
+ /*virtual*/ void renderPostDeferred(S32 pass);
/*virtual*/ void beginRenderPass(S32 pass);
/*virtual*/ void endRenderPass(S32 pass);
@@ -126,12 +126,12 @@ public:
virtual void prerender() { }
/*virtual*/ S32 getNumPostDeferredPasses() { return 1; }
- /*virtual*/ void beginPostDeferredPass(S32 pass) { beginRenderPass(pass); }
- /*virtual*/ void endPostDeferredPass(S32 pass) { endRenderPass(pass); }
- /*virtual*/ void renderPostDeferred(S32 pass) { render(pass); }
+ /*virtual*/ void beginPostDeferredPass(S32 pass);
+ /*virtual*/ void endPostDeferredPass(S32 pass);
+ /*virtual*/ void renderPostDeferred(S32 pass);
void render(S32 pass = 0);
- void pushBatch(LLDrawInfo& params, U32 mask, BOOL texture = TRUE);
+ void pushBatch(LLDrawInfo& params, U32 mask, BOOL texture = TRUE, BOOL batch_textures = FALSE);
};
diff --git a/indra/newview/lldrawpoolterrain.cpp b/indra/newview/lldrawpoolterrain.cpp
index 84eeace9c6..3daa0f8261 100644
--- a/indra/newview/lldrawpoolterrain.cpp
+++ b/indra/newview/lldrawpoolterrain.cpp
@@ -143,7 +143,7 @@ void LLDrawPoolTerrain::beginRenderPass( S32 pass )
void LLDrawPoolTerrain::endRenderPass( S32 pass )
{
LLFastTimer t(FTM_RENDER_TERRAIN);
- LLFacePool::endRenderPass(pass);
+ //LLFacePool::endRenderPass(pass);
if (mVertexShaderLevel > 1 && sShader->mShaderLevel > 0) {
sShader->unbind();
@@ -215,8 +215,10 @@ void LLDrawPoolTerrain::render(S32 pass)
{ //use fullbright shader for highlighting
LLGLSLShader* old_shader = sShader;
sShader->unbind();
- sShader = &gObjectFullbrightProgram;
+ sShader = &gObjectFullbrightNonIndexedProgram;
sShader->bind();
+ LLGLEnable polyOffset(GL_POLYGON_OFFSET_FILL);
+ glPolygonOffset(-1.0f, -1.0f);
renderOwnership();
sShader = old_shader;
sShader->bind();
diff --git a/indra/newview/lldrawpooltree.cpp b/indra/newview/lldrawpooltree.cpp
index 195ee60a2e..81c796b146 100644
--- a/indra/newview/lldrawpooltree.cpp
+++ b/indra/newview/lldrawpooltree.cpp
@@ -66,11 +66,11 @@ void LLDrawPoolTree::beginRenderPass(S32 pass)
if (LLPipeline::sUnderWaterRender)
{
- shader = &gObjectSimpleWaterProgram;
+ shader = &gObjectSimpleNonIndexedWaterProgram;
}
else
{
- shader = &gObjectSimpleProgram;
+ shader = &gObjectSimpleNonIndexedProgram;
}
if (gPipeline.canUseWindLightShadersOnObjects())
diff --git a/indra/newview/lldrawpoolwater.cpp b/indra/newview/lldrawpoolwater.cpp
index dc94924da4..31c14361b5 100644
--- a/indra/newview/lldrawpoolwater.cpp
+++ b/indra/newview/lldrawpoolwater.cpp
@@ -108,7 +108,7 @@ void LLDrawPoolWater::prerender()
// got rid of modulation by light color since it got a little too
// green at sunset and sl-57047 (underwater turns black at 8:00)
- sWaterFogColor = LLWaterParamManager::instance()->getFogColor();
+ sWaterFogColor = LLWaterParamManager::instance().getFogColor();
sWaterFogColor.mV[3] = 0;
}
@@ -527,7 +527,7 @@ void LLDrawPoolWater::shade()
//bind normal map
S32 bumpTex = shader->enableTexture(LLViewerShaderMgr::BUMP_MAP);
- LLWaterParamManager * param_mgr = LLWaterParamManager::instance();
+ LLWaterParamManager * param_mgr = &LLWaterParamManager::instance();
// change mWaterNormp if needed
if (mWaterNormp->getID() != param_mgr->getNormalMapID())
diff --git a/indra/newview/lldrawpoolwlsky.cpp b/indra/newview/lldrawpoolwlsky.cpp
index 696c2d1abd..bf79c2100c 100644
--- a/indra/newview/lldrawpoolwlsky.cpp
+++ b/indra/newview/lldrawpoolwlsky.cpp
@@ -34,6 +34,8 @@
#include "llviewercamera.h"
#include "llimage.h"
#include "llwlparammanager.h"
+#include "llviewershadermgr.h"
+#include "llglslshader.h"
#include "llsky.h"
#include "llvowlsky.h"
#include "llviewerregion.h"
@@ -44,6 +46,8 @@ LLPointer<LLViewerTexture> LLDrawPoolWLSky::sCloudNoiseTexture = NULL;
LLPointer<LLImageRaw> LLDrawPoolWLSky::sCloudNoiseRawImage = NULL;
+static LLGLSLShader* cloud_shader = NULL;
+static LLGLSLShader* sky_shader = NULL;
LLDrawPoolWLSky::LLDrawPoolWLSky(void) :
@@ -66,7 +70,7 @@ LLDrawPoolWLSky::LLDrawPoolWLSky(void) :
sCloudNoiseTexture = LLViewerTextureManager::getLocalTexture(sCloudNoiseRawImage.get(), TRUE);
- LLWLParamManager::instance()->propagateParameters();
+ LLWLParamManager::getInstance()->propagateParameters();
}
LLDrawPoolWLSky::~LLDrawPoolWLSky()
@@ -83,12 +87,32 @@ LLViewerTexture *LLDrawPoolWLSky::getDebugTexture()
void LLDrawPoolWLSky::beginRenderPass( S32 pass )
{
+ sky_shader =
+ LLPipeline::sUnderWaterRender ?
+ &gObjectSimpleWaterProgram :
+ &gWLSkyProgram;
+
+ cloud_shader =
+ LLPipeline::sUnderWaterRender ?
+ &gObjectSimpleWaterProgram :
+ &gWLCloudProgram;
}
void LLDrawPoolWLSky::endRenderPass( S32 pass )
{
}
+void LLDrawPoolWLSky::beginDeferredPass(S32 pass)
+{
+ sky_shader = &gDeferredWLSkyProgram;
+ cloud_shader = &gDeferredWLCloudProgram;
+}
+
+void LLDrawPoolWLSky::endDeferredPass(S32 pass)
+{
+
+}
+
void LLDrawPoolWLSky::renderDome(F32 camHeightLocal, LLGLSLShader * shader) const
{
LLVector3 const & origin = LLViewerCamera::getInstance()->getOrigin();
@@ -128,19 +152,14 @@ void LLDrawPoolWLSky::renderSkyHaze(F32 camHeightLocal) const
{
if (gPipeline.canUseWindLightShaders() && gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_SKY))
{
- LLGLSLShader* shader =
- LLPipeline::sUnderWaterRender ?
- &gObjectSimpleWaterProgram :
- &gWLSkyProgram;
-
LLGLDisable blend(GL_BLEND);
- shader->bind();
+ sky_shader->bind();
/// Render the skydome
- renderDome(camHeightLocal, shader);
+ renderDome(camHeightLocal, sky_shader);
- shader->unbind();
+ sky_shader->unbind();
}
}
@@ -161,7 +180,7 @@ void LLDrawPoolWLSky::renderStars(void) const
// clamping and allow the star_alpha param to brighten the stars.
bool error;
LLColor4 star_alpha(LLColor4::black);
- star_alpha.mV[3] = LLWLParamManager::instance()->mCurParams.getFloat("star_brightness", error) / 2.f;
+ star_alpha.mV[3] = LLWLParamManager::getInstance()->mCurParams.getFloat("star_brightness", error) / 2.f;
llassert_always(!error);
gGL.getTexUnit(0)->bind(gSky.mVOSkyp->getBloomTex());
@@ -186,23 +205,18 @@ void LLDrawPoolWLSky::renderSkyClouds(F32 camHeightLocal) const
{
if (gPipeline.canUseWindLightShaders() && gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_CLOUDS))
{
- LLGLSLShader* shader =
- LLPipeline::sUnderWaterRender ?
- &gObjectSimpleWaterProgram :
- &gWLCloudProgram;
-
LLGLEnable blend(GL_BLEND);
gGL.setSceneBlendType(LLRender::BT_ALPHA);
gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);
gGL.getTexUnit(0)->bind(sCloudNoiseTexture);
- shader->bind();
+ cloud_shader->bind();
/// Render the skydome
- renderDome(camHeightLocal, shader);
+ renderDome(camHeightLocal, cloud_shader);
- shader->unbind();
+ cloud_shader->unbind();
}
}
@@ -246,6 +260,53 @@ void LLDrawPoolWLSky::renderHeavenlyBodies()
}
}
+void LLDrawPoolWLSky::renderDeferred(S32 pass)
+{
+ if (!gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_SKY))
+ {
+ return;
+ }
+ LLFastTimer ftm(FTM_RENDER_WL_SKY);
+
+ const F32 camHeightLocal = LLWLParamManager::getInstance()->getDomeOffset() * LLWLParamManager::getInstance()->getDomeRadius();
+
+ LLGLSNoFog disableFog;
+ LLGLDepthTest depth(GL_TRUE, GL_FALSE);
+ LLGLDisable clip(GL_CLIP_PLANE0);
+
+ gGL.setColorMask(true, false);
+
+ LLGLSquashToFarClip far_clip(glh_get_current_projection());
+
+ renderSkyHaze(camHeightLocal);
+
+ LLVector3 const & origin = LLViewerCamera::getInstance()->getOrigin();
+ glPushMatrix();
+
+
+ glTranslatef(origin.mV[0], origin.mV[1], origin.mV[2]);
+
+ gDeferredStarProgram.bind();
+ // *NOTE: have to bind a texture here since register combiners blending in
+ // renderStars() requires something to be bound and we might as well only
+ // bind the moon's texture once.
+ gGL.getTexUnit(0)->bind(gSky.mVOSkyp->mFace[LLVOSky::FACE_MOON]->getTexture());
+
+ renderHeavenlyBodies();
+
+ renderStars();
+
+ gDeferredStarProgram.unbind();
+
+ glPopMatrix();
+
+ renderSkyClouds(camHeightLocal);
+
+ gGL.setColorMask(true, true);
+ //gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+
+}
+
void LLDrawPoolWLSky::render(S32 pass)
{
if (!gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_SKY))
@@ -254,7 +315,7 @@ void LLDrawPoolWLSky::render(S32 pass)
}
LLFastTimer ftm(FTM_RENDER_WL_SKY);
- const F32 camHeightLocal = LLWLParamManager::instance()->getDomeOffset() * LLWLParamManager::instance()->getDomeRadius();
+ const F32 camHeightLocal = LLWLParamManager::getInstance()->getDomeOffset() * LLWLParamManager::getInstance()->getDomeRadius();
LLGLSNoFog disableFog;
LLGLDepthTest depth(GL_TRUE, GL_FALSE);
diff --git a/indra/newview/lldrawpoolwlsky.h b/indra/newview/lldrawpoolwlsky.h
index 8ca1ebb942..cd15c991ee 100644
--- a/indra/newview/lldrawpoolwlsky.h
+++ b/indra/newview/lldrawpoolwlsky.h
@@ -44,10 +44,10 @@ public:
/*virtual*/ BOOL isDead() { return FALSE; }
- /*virtual*/ S32 getNumPostDeferredPasses() { return getNumPasses(); }
- /*virtual*/ void beginPostDeferredPass(S32 pass) { beginRenderPass(pass); }
- /*virtual*/ void endPostDeferredPass(S32 pass) { endRenderPass(pass); }
- /*virtual*/ void renderPostDeferred(S32 pass) { render(pass); }
+ /*virtual*/ S32 getNumDeferredPasses() { return 1; }
+ /*virtual*/ void beginDeferredPass(S32 pass);
+ /*virtual*/ void endDeferredPass(S32 pass);
+ /*virtual*/ void renderDeferred(S32 pass);
/*virtual*/ LLViewerTexture *getDebugTexture();
/*virtual*/ void beginRenderPass( S32 pass );
diff --git a/indra/newview/llenvmanager.cpp b/indra/newview/llenvmanager.cpp
new file mode 100644
index 0000000000..c2720eaf28
--- /dev/null
+++ b/indra/newview/llenvmanager.cpp
@@ -0,0 +1,684 @@
+/**
+ * @file llenvmanager.cpp
+ * @brief Implementation of classes managing WindLight and water settings.
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llenvmanager.h"
+
+#include "llagent.h"
+#include "lldaycyclemanager.h"
+#include "llviewercontrol.h" // for gSavedSettings
+#include "llviewerregion.h"
+#include "llwaterparammanager.h"
+#include "llwlhandlers.h"
+#include "llwlparammanager.h"
+
+std::string LLEnvPrefs::getWaterPresetName() const
+{
+ if (mWaterPresetName.empty())
+ {
+ llwarns << "Water preset name is empty" << llendl;
+ }
+
+ return mWaterPresetName;
+}
+
+std::string LLEnvPrefs::getSkyPresetName() const
+{
+ if (mSkyPresetName.empty())
+ {
+ llwarns << "Sky preset name is empty" << llendl;
+ }
+
+ return mSkyPresetName;
+}
+
+std::string LLEnvPrefs::getDayCycleName() const
+{
+ if (mDayCycleName.empty())
+ {
+ llwarns << "Day cycle name is empty" << llendl;
+ }
+
+ return mDayCycleName;
+}
+
+void LLEnvPrefs::setUseRegionSettings(bool val)
+{
+ mUseRegionSettings = val;
+}
+
+void LLEnvPrefs::setUseWaterPreset(const std::string& name)
+{
+ mUseRegionSettings = false;
+ mWaterPresetName = name;
+}
+
+void LLEnvPrefs::setUseSkyPreset(const std::string& name)
+{
+ mUseRegionSettings = false;
+ mUseDayCycle = false;
+ mSkyPresetName = name;
+}
+
+void LLEnvPrefs::setUseDayCycle(const std::string& name)
+{
+ mUseRegionSettings = false;
+ mUseDayCycle = true;
+ mDayCycleName = name;
+}
+
+//=============================================================================
+LLEnvManagerNew::LLEnvManagerNew()
+{
+ mInterpNextChangeMessage = true;
+
+ // Set default environment settings.
+ mUserPrefs.mUseRegionSettings = true;
+ mUserPrefs.mUseDayCycle = true;
+ mUserPrefs.mWaterPresetName = "Default";
+ mUserPrefs.mSkyPresetName = "Default";
+ mUserPrefs.mDayCycleName = "Default";
+}
+
+bool LLEnvManagerNew::getUseRegionSettings() const
+{
+ return mUserPrefs.getUseRegionSettings();
+}
+
+bool LLEnvManagerNew::getUseDayCycle() const
+{
+ return mUserPrefs.getUseDayCycle();
+}
+
+bool LLEnvManagerNew::getUseFixedSky() const
+{
+ return mUserPrefs.getUseFixedSky();
+}
+
+std::string LLEnvManagerNew::getWaterPresetName() const
+{
+ return mUserPrefs.getWaterPresetName();
+}
+
+std::string LLEnvManagerNew::getSkyPresetName() const
+{
+ return mUserPrefs.getSkyPresetName();
+}
+
+std::string LLEnvManagerNew::getDayCycleName() const
+{
+ return mUserPrefs.getDayCycleName();
+}
+
+const LLEnvironmentSettings& LLEnvManagerNew::getRegionSettings() const
+{
+ return !mNewRegionPrefs.isEmpty() ? mNewRegionPrefs : mCachedRegionPrefs;
+}
+
+void LLEnvManagerNew::setRegionSettings(const LLEnvironmentSettings& new_settings)
+{
+ // Set region settings override that will be used locally
+ // until user either uploads the changes or goes to another region.
+ mNewRegionPrefs = new_settings;
+}
+
+bool LLEnvManagerNew::usePrefs()
+{
+ LL_DEBUGS("Windlight") << "Displaying preferred environment" << LL_ENDL;
+ updateManagersFromPrefs(false);
+ return true;
+}
+
+bool LLEnvManagerNew::useDefaults()
+{
+ bool rslt;
+
+ rslt = useDefaultWater();
+ rslt &= useDefaultSky();
+
+ return rslt;
+}
+
+bool LLEnvManagerNew::useRegionSettings()
+{
+ bool rslt;
+
+ rslt = useRegionSky();
+ rslt &= useRegionWater();
+
+ return rslt;
+}
+
+bool LLEnvManagerNew::useWaterPreset(const std::string& name)
+{
+ LL_DEBUGS("Windlight") << "Displaying water preset " << name << LL_ENDL;
+ LLWaterParamManager& water_mgr = LLWaterParamManager::instance();
+ bool rslt = water_mgr.getParamSet(name, water_mgr.mCurParams);
+ llassert(rslt == true);
+ return rslt;
+}
+
+bool LLEnvManagerNew::useWaterParams(const LLSD& params)
+{
+ LL_DEBUGS("Windlight") << "Displaying water params" << LL_ENDL;
+ LLWaterParamManager::instance().mCurParams.setAll(params);
+ return true;
+}
+
+bool LLEnvManagerNew::useSkyPreset(const std::string& name)
+{
+ LLWLParamManager& sky_mgr = LLWLParamManager::instance();
+ LLWLParamSet param_set;
+
+ if (!sky_mgr.getParamSet(LLWLParamKey(name, LLEnvKey::SCOPE_LOCAL), param_set))
+ {
+ llwarns << "No sky preset named " << name << llendl;
+ return false;
+ }
+
+ LL_DEBUGS("Windlight") << "Displaying sky preset " << name << LL_ENDL;
+ sky_mgr.applySkyParams(param_set.getAll());
+ return true;
+}
+
+bool LLEnvManagerNew::useSkyParams(const LLSD& params)
+{
+ LL_DEBUGS("Windlight") << "Displaying sky params" << LL_ENDL;
+ LLWLParamManager::instance().applySkyParams(params);
+ return true;
+}
+
+bool LLEnvManagerNew::useDayCycle(const std::string& name, LLEnvKey::EScope scope)
+{
+ LLSD params;
+
+ if (scope == LLEnvKey::SCOPE_REGION)
+ {
+ LL_DEBUGS("Windlight") << "Displaying region day cycle " << name << LL_ENDL;
+ params = getRegionSettings().getWLDayCycle();
+ }
+ else
+ {
+ LL_DEBUGS("Windlight") << "Displaying local day cycle " << name << LL_ENDL;
+
+ if (!LLDayCycleManager::instance().getPreset(name, params))
+ {
+ llwarns << "No day cycle named " << name << llendl;
+ return false;
+ }
+ }
+
+ bool rslt = LLWLParamManager::instance().applyDayCycleParams(params, scope);
+ llassert(rslt == true);
+ return rslt;
+}
+
+bool LLEnvManagerNew::useDayCycleParams(const LLSD& params, LLEnvKey::EScope scope, F32 time /* = 0.5*/)
+{
+ LL_DEBUGS("Windlight") << "Displaying day cycle params" << LL_ENDL;
+ return LLWLParamManager::instance().applyDayCycleParams(params, scope);
+}
+
+void LLEnvManagerNew::setUseRegionSettings(bool val)
+{
+ mUserPrefs.setUseRegionSettings(val);
+ saveUserPrefs();
+ updateManagersFromPrefs(false);
+}
+
+void LLEnvManagerNew::setUseWaterPreset(const std::string& name)
+{
+ // *TODO: make sure the preset exists.
+ if (name.empty())
+ {
+ llwarns << "Empty water preset name passed" << llendl;
+ return;
+ }
+
+ mUserPrefs.setUseWaterPreset(name);
+ saveUserPrefs();
+ updateManagersFromPrefs(false);
+}
+
+void LLEnvManagerNew::setUseSkyPreset(const std::string& name)
+{
+ // *TODO: make sure the preset exists.
+ if (name.empty())
+ {
+ llwarns << "Empty sky preset name passed" << llendl;
+ return;
+ }
+
+ mUserPrefs.setUseSkyPreset(name);
+ saveUserPrefs();
+ updateManagersFromPrefs(false);
+}
+
+void LLEnvManagerNew::setUseDayCycle(const std::string& name)
+{
+ if (!LLDayCycleManager::instance().presetExists(name))
+ {
+ llwarns << "Invalid day cycle name passed" << llendl;
+ return;
+ }
+
+ mUserPrefs.setUseDayCycle(name);
+ saveUserPrefs();
+ updateManagersFromPrefs(false);
+}
+
+void LLEnvManagerNew::loadUserPrefs()
+{
+ // operate on members directly to avoid side effects
+ mUserPrefs.mWaterPresetName = gSavedSettings.getString("WaterPresetName");
+ mUserPrefs.mSkyPresetName = gSavedSettings.getString("SkyPresetName");
+ mUserPrefs.mDayCycleName = gSavedSettings.getString("DayCycleName");
+
+ mUserPrefs.mUseRegionSettings = gSavedSettings.getBOOL("UseEnvironmentFromRegion");
+ mUserPrefs.mUseDayCycle = gSavedSettings.getBOOL("UseDayCycle");
+}
+
+void LLEnvManagerNew::saveUserPrefs()
+{
+ gSavedSettings.setString("WaterPresetName", getWaterPresetName());
+ gSavedSettings.setString("SkyPresetName", getSkyPresetName());
+ gSavedSettings.setString("DayCycleName", getDayCycleName());
+
+ gSavedSettings.setBOOL("UseEnvironmentFromRegion", getUseRegionSettings());
+ gSavedSettings.setBOOL("UseDayCycle", getUseDayCycle());
+
+ mUsePrefsChangeSignal();
+}
+
+void LLEnvManagerNew::setUserPrefs(
+ const std::string& water_preset,
+ const std::string& sky_preset,
+ const std::string& day_cycle_preset,
+ bool use_fixed_sky,
+ bool use_region_settings)
+{
+ // operate on members directly to avoid side effects
+ mUserPrefs.mWaterPresetName = water_preset;
+ mUserPrefs.mSkyPresetName = sky_preset;
+ mUserPrefs.mDayCycleName = day_cycle_preset;
+
+ mUserPrefs.mUseRegionSettings = use_region_settings;
+ mUserPrefs.mUseDayCycle = !use_fixed_sky;
+
+ saveUserPrefs();
+ updateManagersFromPrefs(false);
+}
+
+void LLEnvManagerNew::dumpUserPrefs()
+{
+ LL_DEBUGS("Windlight") << "WaterPresetName: " << gSavedSettings.getString("WaterPresetName") << LL_ENDL;
+ LL_DEBUGS("Windlight") << "SkyPresetName: " << gSavedSettings.getString("SkyPresetName") << LL_ENDL;
+ LL_DEBUGS("Windlight") << "DayCycleName: " << gSavedSettings.getString("DayCycleName") << LL_ENDL;
+
+ LL_DEBUGS("Windlight") << "UseEnvironmentFromRegion: " << gSavedSettings.getBOOL("UseEnvironmentFromRegion") << LL_ENDL;
+ LL_DEBUGS("Windlight") << "UseDayCycle: " << gSavedSettings.getBOOL("UseDayCycle") << LL_ENDL;
+}
+
+void LLEnvManagerNew::dumpPresets()
+{
+ const LLEnvironmentSettings& region_settings = getRegionSettings();
+ std::string region_name = gAgent.getRegion() ? gAgent.getRegion()->getName() : "Unknown region";
+
+ // Dump water presets.
+ LL_DEBUGS("Windlight") << "Waters:" << LL_ENDL;
+ if (region_settings.getWaterParams().size() != 0)
+ {
+ LL_DEBUGS("Windlight") << " - " << region_name << LL_ENDL;
+ }
+ LLWaterParamManager::preset_name_list_t water_presets;
+ LLWaterParamManager::instance().getPresetNames(water_presets);
+ for (LLWaterParamManager::preset_name_list_t::const_iterator it = water_presets.begin(); it != water_presets.end(); ++it)
+ {
+ LL_DEBUGS("Windlight") << " - " << *it << LL_ENDL;
+ }
+
+ // Dump sky presets.
+ LL_DEBUGS("Windlight") << "Skies:" << LL_ENDL;
+ LLWLParamManager::preset_key_list_t sky_preset_keys;
+ LLWLParamManager::instance().getPresetKeys(sky_preset_keys);
+ for (LLWLParamManager::preset_key_list_t::const_iterator it = sky_preset_keys.begin(); it != sky_preset_keys.end(); ++it)
+ {
+ std::string preset_name = it->name;
+ std::string item_title;
+
+ if (it->scope == LLEnvKey::SCOPE_LOCAL) // local preset
+ {
+ item_title = preset_name;
+ }
+ else // region preset
+ {
+ item_title = preset_name + " (" + region_name + ")";
+ }
+ LL_DEBUGS("Windlight") << " - " << item_title << LL_ENDL;
+ }
+
+ // Dump day cycles.
+ LL_DEBUGS("Windlight") << "Days:" << LL_ENDL;
+ const LLSD& cur_region_dc = region_settings.getWLDayCycle();
+ if (cur_region_dc.size() != 0)
+ {
+ LL_DEBUGS("Windlight") << " - " << region_name << LL_ENDL;
+ }
+ LLDayCycleManager::preset_name_list_t days;
+ LLDayCycleManager::instance().getPresetNames(days);
+ for (LLDayCycleManager::preset_name_list_t::const_iterator it = days.begin(); it != days.end(); ++it)
+ {
+ LL_DEBUGS("Windlight") << " - " << *it << LL_ENDL;
+ }
+}
+
+void LLEnvManagerNew::requestRegionSettings()
+{
+ LLEnvironmentRequest::initiate();
+}
+
+bool LLEnvManagerNew::sendRegionSettings(const LLEnvironmentSettings& new_settings)
+{
+ LLSD metadata;
+
+ metadata["regionID"] = gAgent.getRegion()->getRegionID();
+ // add last received update ID to outbound message so simulator can handle concurrent updates
+ metadata["messageID"] = mLastReceivedID;
+
+ return LLEnvironmentApply::initiateRequest(new_settings.makePacket(metadata));
+}
+
+boost::signals2::connection LLEnvManagerNew::setPreferencesChangeCallback(const prefs_change_signal_t::slot_type& cb)
+{
+ return mUsePrefsChangeSignal.connect(cb);
+}
+
+boost::signals2::connection LLEnvManagerNew::setRegionSettingsChangeCallback(const region_settings_change_signal_t::slot_type& cb)
+{
+ return mRegionSettingsChangeSignal.connect(cb);
+}
+
+boost::signals2::connection LLEnvManagerNew::setRegionChangeCallback(const region_change_signal_t::slot_type& cb)
+{
+ return mRegionChangeSignal.connect(cb);
+}
+
+boost::signals2::connection LLEnvManagerNew::setRegionSettingsAppliedCallback(const region_settings_applied_signal_t::slot_type& cb)
+{
+ return mRegionSettingsAppliedSignal.connect(cb);
+}
+
+// static
+bool LLEnvManagerNew::canEditRegionSettings()
+{
+ LLViewerRegion* region = gAgent.getRegion();
+ BOOL owner_or_god = gAgent.isGodlike() || (region && region->getOwner() == gAgent.getID());
+ BOOL owner_or_god_or_manager = owner_or_god || (region && region->isEstateManager());
+
+ LL_DEBUGS("Windlight") << "Can edit region settings: " << (bool) owner_or_god_or_manager << LL_ENDL;
+ return owner_or_god_or_manager;
+}
+
+// static
+const std::string LLEnvManagerNew::getScopeString(LLEnvKey::EScope scope)
+{
+ switch(scope)
+ {
+ case LLEnvKey::SCOPE_LOCAL:
+ return LLTrans::getString("LocalSettings");
+ case LLEnvKey::SCOPE_REGION:
+ return LLTrans::getString("RegionSettings");
+ default:
+ return " (?)";
+ }
+}
+
+void LLEnvManagerNew::onRegionCrossing()
+{
+ LL_DEBUGS("Windlight") << "Crossed region" << LL_ENDL;
+ onRegionChange(true);
+}
+
+void LLEnvManagerNew::onTeleport()
+{
+ LL_DEBUGS("Windlight") << "Teleported" << LL_ENDL;
+ onRegionChange(false);
+}
+
+void LLEnvManagerNew::onRegionSettingsResponse(const LLSD& content)
+{
+ // If the message was valid, grab the UUID from it and save it for next outbound update message.
+ mLastReceivedID = content[0]["messageID"].asUUID();
+
+ // Refresh cached region settings.
+ LL_DEBUGS("Windlight") << "Caching region environment settings: " << content << LL_ENDL;
+ F32 sun_hour = 0; // *TODO
+ LLEnvironmentSettings new_settings(content[1], content[2], content[3], sun_hour);
+ mCachedRegionPrefs = new_settings;
+
+ // Load region sky presets.
+ LLWLParamManager::instance().refreshRegionPresets();
+
+ // If using server settings, update managers.
+ if (getUseRegionSettings())
+ {
+ updateManagersFromPrefs(mInterpNextChangeMessage);
+ }
+
+ // Let interested parties know about the region settings update.
+ mRegionSettingsChangeSignal();
+
+ // reset
+ mInterpNextChangeMessage = false;
+}
+
+void LLEnvManagerNew::onRegionSettingsApplyResponse(bool ok)
+{
+ LL_DEBUGS("Windlight") << "Applying region settings " << (ok ? "succeeded" : "failed") << LL_ENDL;
+
+ // Clear locally modified region settings because they have just been uploaded.
+ mNewRegionPrefs.clear();
+
+ mRegionSettingsAppliedSignal(ok);
+}
+
+//-- private methods ----------------------------------------------------------
+
+// virtual
+void LLEnvManagerNew::initSingleton()
+{
+ LL_DEBUGS("Windlight") << "Initializing LLEnvManagerNew" << LL_ENDL;
+
+ loadUserPrefs();
+}
+
+void LLEnvManagerNew::updateSkyFromPrefs()
+{
+ bool success = true;
+
+ // Sync sky with user prefs.
+ if (getUseRegionSettings()) // apply region-wide settings
+ {
+ success = useRegionSky();
+ }
+ else // apply user-specified settings
+ {
+ if (getUseDayCycle())
+ {
+ success = useDayCycle(getDayCycleName(), LLEnvKey::SCOPE_LOCAL);
+ }
+ else
+ {
+ success = useSkyPreset(getSkyPresetName());
+ }
+ }
+
+ // If something went wrong, fall back to defaults.
+ if (!success)
+ {
+ // *TODO: fix user prefs
+ useDefaultSky();
+ }
+}
+
+void LLEnvManagerNew::updateWaterFromPrefs(bool interpolate)
+{
+ LLWaterParamManager& water_mgr = LLWaterParamManager::instance();
+ LLSD target_water_params;
+
+ // Determine new water settings based on user prefs.
+
+ {
+ // Fall back to default water.
+ LLWaterParamSet default_water;
+ water_mgr.getParamSet("Default", default_water);
+ target_water_params = default_water.getAll();
+ }
+
+ if (getUseRegionSettings())
+ {
+ // *TODO: make sure whether region settings belong to the current region?
+ const LLSD& region_water_params = getRegionSettings().getWaterParams();
+ if (region_water_params.size() != 0) // region has no water settings
+ {
+ LL_DEBUGS("Windlight") << "Applying region water" << LL_ENDL;
+ target_water_params = region_water_params;
+ }
+ else
+ {
+ LL_DEBUGS("Windlight") << "Applying default water" << LL_ENDL;
+ }
+ }
+ else
+ {
+ std::string water = getWaterPresetName();
+ LL_DEBUGS("Windlight") << "Applying water preset [" << water << "]" << LL_ENDL;
+ LLWaterParamSet params;
+ if (!water_mgr.getParamSet(water, params))
+ {
+ llwarns << "No water preset named " << water << ", falling back to defaults" << llendl;
+ water_mgr.getParamSet("Default", params);
+
+ // *TODO: Fix user preferences accordingly.
+ }
+ target_water_params = params.getAll();
+ }
+
+ // Sync water with user prefs.
+ water_mgr.applyParams(target_water_params, interpolate);
+}
+
+void LLEnvManagerNew::updateManagersFromPrefs(bool interpolate)
+{
+ // Apply water settings.
+ updateWaterFromPrefs(interpolate);
+
+ // Apply sky settings.
+ updateSkyFromPrefs();
+}
+
+bool LLEnvManagerNew::useRegionSky()
+{
+ const LLEnvironmentSettings& region_settings = getRegionSettings();
+
+ // If region is set to defaults,
+ if (region_settings.getSkyMap().size() == 0)
+ {
+ // well... apply the default sky settings.
+ useDefaultSky();
+ return true;
+ }
+
+ // *TODO: Support fixed sky from region.
+
+ // Otherwise apply region day cycle.
+ LL_DEBUGS("Windlight") << "Applying region sky" << LL_ENDL;
+ return useDayCycleParams(
+ region_settings.getWLDayCycle(),
+ LLEnvKey::SCOPE_REGION,
+ region_settings.getDayTime());
+}
+
+bool LLEnvManagerNew::useRegionWater()
+{
+ const LLEnvironmentSettings& region_settings = getRegionSettings();
+ const LLSD& region_water = region_settings.getWaterParams();
+
+ // If region is set to defaults,
+ if (region_water.size() == 0)
+ {
+ // well... apply the default water settings.
+ return useDefaultWater();
+ }
+
+ // Otherwise apply region water.
+ LL_DEBUGS("Windlight") << "Applying region sky" << LL_ENDL;
+ return useWaterParams(region_water);
+}
+
+bool LLEnvManagerNew::useDefaultSky()
+{
+ return useDayCycle("Default", LLEnvKey::SCOPE_LOCAL);
+}
+
+bool LLEnvManagerNew::useDefaultWater()
+{
+ return useWaterPreset("Default");
+}
+
+
+void LLEnvManagerNew::onRegionChange(bool interpolate)
+{
+ // Avoid duplicating region setting requests
+ // by checking whether the region is actually changing.
+ LLViewerRegion* regionp = gAgent.getRegion();
+ LLUUID region_uuid = regionp ? regionp->getRegionID() : LLUUID::null;
+ if (region_uuid == mCurRegionUUID)
+ {
+ return;
+ }
+
+ // Clear locally modified region settings.
+ mNewRegionPrefs.clear();
+
+ // *TODO: clear environment settings of the previous region?
+
+ // Request environment settings of the new region.
+ LL_DEBUGS("Windlight") << "New viewer region: " << region_uuid << LL_ENDL;
+ mCurRegionUUID = region_uuid;
+ mInterpNextChangeMessage = interpolate;
+ requestRegionSettings();
+
+ // Let interested parties know agent region has been changed.
+ mRegionChangeSignal();
+}
diff --git a/indra/newview/llenvmanager.h b/indra/newview/llenvmanager.h
new file mode 100644
index 0000000000..96af102c1a
--- /dev/null
+++ b/indra/newview/llenvmanager.h
@@ -0,0 +1,283 @@
+/**
+ * @file llenvmanager.h
+ * @brief Declaration of classes managing WindLight and water settings.
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLENVMANAGER_H
+#define LL_LLENVMANAGER_H
+
+#include "llmemory.h"
+#include "llsd.h"
+
+class LLWLParamManager;
+class LLWaterParamManager;
+class LLWLAnimator;
+
+// generic key
+struct LLEnvKey
+{
+public:
+ // Note: enum ordering is important; for example, a region-level floater (1) will see local and region (all values that are <=)
+ typedef enum e_scope
+ {
+ SCOPE_LOCAL, // 0
+ SCOPE_REGION//, // 1
+ // SCOPE_ESTATE, // 2
+ // etc.
+ } EScope;
+};
+
+class LLEnvironmentSettings
+{
+public:
+ LLEnvironmentSettings() :
+ mWLDayCycle(LLSD::emptyMap()),
+ mSkyMap(LLSD::emptyMap()),
+ mWaterParams(LLSD::emptyMap()),
+ mDayTime(0.f)
+ {}
+ LLEnvironmentSettings(const LLSD& dayCycle, const LLSD& skyMap, const LLSD& waterParams, F64 dayTime) :
+ mWLDayCycle(dayCycle),
+ mSkyMap(skyMap),
+ mWaterParams(waterParams),
+ mDayTime(dayTime)
+ {}
+ ~LLEnvironmentSettings() {}
+
+ void saveParams(const LLSD& dayCycle, const LLSD& skyMap, const LLSD& waterParams, F64 dayTime)
+ {
+ mWLDayCycle = dayCycle;
+ mSkyMap = skyMap;
+ mWaterParams = waterParams;
+ mDayTime = dayTime;
+ }
+
+ const LLSD& getWLDayCycle() const
+ {
+ return mWLDayCycle;
+ }
+
+ const LLSD& getWaterParams() const
+ {
+ return mWaterParams;
+ }
+
+ const LLSD& getSkyMap() const
+ {
+ return mSkyMap;
+ }
+
+ F64 getDayTime() const
+ {
+ return mDayTime;
+ }
+
+ bool isEmpty() const
+ {
+ return mWLDayCycle.size() == 0;
+ }
+
+ void clear()
+ {
+ *this = LLEnvironmentSettings();
+ }
+
+ LLSD makePacket(const LLSD& metadata) const
+ {
+ LLSD full_packet = LLSD::emptyArray();
+
+ // 0: metadata
+ full_packet.append(metadata);
+
+ // 1: day cycle
+ full_packet.append(mWLDayCycle);
+
+ // 2: map of sky setting names to sky settings (as LLSD)
+ full_packet.append(mSkyMap);
+
+ // 3: water params
+ full_packet.append(mWaterParams);
+
+ return full_packet;
+ }
+
+private:
+ LLSD mWLDayCycle, mWaterParams, mSkyMap;
+ F64 mDayTime;
+};
+
+/**
+ * User environment preferences.
+ */
+class LLEnvPrefs
+{
+public:
+ LLEnvPrefs() : mUseRegionSettings(true), mUseDayCycle(true) {}
+
+ bool getUseRegionSettings() const { return mUseRegionSettings; }
+ bool getUseDayCycle() const { return mUseDayCycle; }
+ bool getUseFixedSky() const { return !getUseDayCycle(); }
+
+ std::string getWaterPresetName() const;
+ std::string getSkyPresetName() const;
+ std::string getDayCycleName() const;
+
+ void setUseRegionSettings(bool val);
+ void setUseWaterPreset(const std::string& name);
+ void setUseSkyPreset(const std::string& name);
+ void setUseDayCycle(const std::string& name);
+
+ bool mUseRegionSettings;
+ bool mUseDayCycle;
+ std::string mWaterPresetName;
+ std::string mSkyPresetName;
+ std::string mDayCycleName;
+};
+
+/**
+ * Setting:
+ * 1. Use region settings.
+ * 2. Use my setting: <water preset> + <fixed_sky>|<day_cycle>
+ */
+class LLEnvManagerNew : public LLSingleton<LLEnvManagerNew>
+{
+ LOG_CLASS(LLEnvManagerNew);
+public:
+ typedef boost::signals2::signal<void()> prefs_change_signal_t;
+ typedef boost::signals2::signal<void()> region_settings_change_signal_t;
+ typedef boost::signals2::signal<void()> region_change_signal_t;
+ typedef boost::signals2::signal<void(bool)> region_settings_applied_signal_t;
+
+ LLEnvManagerNew();
+
+ // getters to access user env. preferences
+ bool getUseRegionSettings() const;
+ bool getUseDayCycle() const;
+ bool getUseFixedSky() const;
+ std::string getWaterPresetName() const;
+ std::string getSkyPresetName() const;
+ std::string getDayCycleName() const;
+
+ /// @return cached env. settings of the current region.
+ const LLEnvironmentSettings& getRegionSettings() const;
+
+ /**
+ * Set new region settings without uploading them to the region.
+ *
+ * The override will be reset when the changes are applied to the region (=uploaded)
+ * or user teleports to another region.
+ */
+ void setRegionSettings(const LLEnvironmentSettings& new_settings);
+
+ // Change environment w/o changing user preferences.
+ bool usePrefs();
+ bool useDefaults();
+ bool useRegionSettings();
+ bool useWaterPreset(const std::string& name);
+ bool useWaterParams(const LLSD& params);
+ bool useSkyPreset(const std::string& name);
+ bool useSkyParams(const LLSD& params);
+ bool useDayCycle(const std::string& name, LLEnvKey::EScope scope);
+ bool useDayCycleParams(const LLSD& params, LLEnvKey::EScope scope, F32 time = 0.5);
+
+ // setters for user env. preferences
+ void setUseRegionSettings(bool val);
+ void setUseWaterPreset(const std::string& name);
+ void setUseSkyPreset(const std::string& name);
+ void setUseDayCycle(const std::string& name);
+ void setUserPrefs(
+ const std::string& water_preset,
+ const std::string& sky_preset,
+ const std::string& day_cycle_preset,
+ bool use_fixed_sky,
+ bool use_region_settings);
+
+ // debugging methods
+ void dumpUserPrefs();
+ void dumpPresets();
+
+ // Misc.
+ void requestRegionSettings();
+ bool sendRegionSettings(const LLEnvironmentSettings& new_settings);
+ boost::signals2::connection setPreferencesChangeCallback(const prefs_change_signal_t::slot_type& cb);
+ boost::signals2::connection setRegionSettingsChangeCallback(const region_settings_change_signal_t::slot_type& cb);
+ boost::signals2::connection setRegionChangeCallback(const region_change_signal_t::slot_type& cb);
+ boost::signals2::connection setRegionSettingsAppliedCallback(const region_settings_applied_signal_t::slot_type& cb);
+
+ static bool canEditRegionSettings(); /// @return true if we have access to editing region environment
+ static const std::string getScopeString(LLEnvKey::EScope scope);
+
+ // Public callbacks.
+ void onRegionCrossing();
+ void onTeleport();
+ void onRegionSettingsResponse(const LLSD& content);
+ void onRegionSettingsApplyResponse(bool ok);
+
+private:
+ friend class LLSingleton<LLEnvManagerNew>;
+ /*virtual*/ void initSingleton();
+
+ void loadUserPrefs();
+ void saveUserPrefs();
+
+ void updateSkyFromPrefs();
+ void updateWaterFromPrefs(bool interpolate);
+ void updateManagersFromPrefs(bool interpolate);
+
+ bool useRegionSky();
+ bool useRegionWater();
+
+ bool useDefaultSky();
+ bool useDefaultWater();
+
+ void onRegionChange(bool interpolate);
+
+ /// Emitted when user environment preferences change.
+ prefs_change_signal_t mUsePrefsChangeSignal;
+
+ /// Emitted when region environment settings update comes.
+ region_settings_change_signal_t mRegionSettingsChangeSignal;
+
+ /// Emitted when agent region changes. Move to LLAgent?
+ region_change_signal_t mRegionChangeSignal;
+
+ /// Emitted when agent region changes. Move to LLAgent?
+ region_settings_applied_signal_t mRegionSettingsAppliedSignal;
+
+ LLEnvPrefs mUserPrefs; /// User environment preferences.
+ LLEnvironmentSettings mCachedRegionPrefs; /// Cached region environment settings.
+ LLEnvironmentSettings mNewRegionPrefs; /// Not-yet-uploaded modified region env. settings.
+ bool mInterpNextChangeMessage; /// Interpolate env. settings on next region change.
+ LLUUID mCurRegionUUID; /// To avoid duplicated region env. settings requests.
+ LLUUID mLastReceivedID; /// Id of last received region env. settings.
+};
+
+#endif // LL_LLENVMANAGER_H
+
diff --git a/indra/newview/llestateinfomodel.cpp b/indra/newview/llestateinfomodel.cpp
new file mode 100644
index 0000000000..7ed22d68f6
--- /dev/null
+++ b/indra/newview/llestateinfomodel.cpp
@@ -0,0 +1,230 @@
+/**
+ * @file llestateinfomodel.cpp
+ * @brief Estate info model
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llestateinfomodel.h"
+
+// libs
+#include "llhttpclient.h"
+#include "llregionflags.h"
+#include "message.h"
+
+// viewer
+#include "llagent.h"
+#include "llfloaterregioninfo.h" // for invoice id
+#include "llviewerregion.h"
+
+LLEstateInfoModel::LLEstateInfoModel()
+: mID(0)
+, mFlags(0)
+, mSunHour(0)
+{
+}
+
+boost::signals2::connection LLEstateInfoModel::setUpdateCallback(const update_signal_t::slot_type& cb)
+{
+ return mUpdateSignal.connect(cb);
+}
+
+boost::signals2::connection LLEstateInfoModel::setCommitCallback(const update_signal_t::slot_type& cb)
+{
+ return mCommitSignal.connect(cb);
+}
+
+void LLEstateInfoModel::sendEstateInfo()
+{
+ if (!commitEstateInfoCaps())
+ {
+ // the caps method failed, try the old way
+ LLFloaterRegionInfo::nextInvoice();
+ commitEstateInfoDataserver();
+ }
+}
+
+bool LLEstateInfoModel::getUseFixedSun() const { return mFlags & REGION_FLAGS_SUN_FIXED; }
+bool LLEstateInfoModel::getIsExternallyVisible() const { return mFlags & REGION_FLAGS_EXTERNALLY_VISIBLE; }
+bool LLEstateInfoModel::getAllowDirectTeleport() const { return mFlags & REGION_FLAGS_ALLOW_DIRECT_TELEPORT; }
+bool LLEstateInfoModel::getDenyAnonymous() const { return mFlags & REGION_FLAGS_DENY_ANONYMOUS; }
+bool LLEstateInfoModel::getDenyAgeUnverified() const { return mFlags & REGION_FLAGS_DENY_AGEUNVERIFIED; }
+bool LLEstateInfoModel::getAllowVoiceChat() const { return mFlags & REGION_FLAGS_ALLOW_VOICE; }
+
+void LLEstateInfoModel::setUseFixedSun(bool val) { setFlag(REGION_FLAGS_SUN_FIXED, val); }
+void LLEstateInfoModel::setIsExternallyVisible(bool val) { setFlag(REGION_FLAGS_EXTERNALLY_VISIBLE, val); }
+void LLEstateInfoModel::setAllowDirectTeleport(bool val) { setFlag(REGION_FLAGS_ALLOW_DIRECT_TELEPORT, val); }
+void LLEstateInfoModel::setDenyAnonymous(bool val) { setFlag(REGION_FLAGS_DENY_ANONYMOUS, val); }
+void LLEstateInfoModel::setDenyAgeUnverified(bool val) { setFlag(REGION_FLAGS_DENY_AGEUNVERIFIED, val); }
+void LLEstateInfoModel::setAllowVoiceChat(bool val) { setFlag(REGION_FLAGS_ALLOW_VOICE, val); }
+
+void LLEstateInfoModel::update(const strings_t& strings)
+{
+ // NOTE: LLDispatcher extracts strings with an extra \0 at the
+ // end. If we pass the std::string direct to the UI/renderer
+ // it draws with a weird character at the end of the string.
+ mName = strings[0].c_str();
+ mOwnerID = LLUUID(strings[1].c_str());
+ mID = strtoul(strings[2].c_str(), NULL, 10);
+ mFlags = strtoul(strings[3].c_str(), NULL, 10);
+ mSunHour = ((F32)(strtod(strings[4].c_str(), NULL)))/1024.0f;
+
+ LL_DEBUGS("Windlight Sync") << "Received estate info: "
+ << "is_sun_fixed = " << getUseFixedSun()
+ << ", sun_hour = " << getSunHour() << LL_ENDL;
+ lldebugs << getInfoDump() << llendl;
+
+ // Update region owner.
+ LLViewerRegion* regionp = gAgent.getRegion();
+ regionp->setOwner(mOwnerID);
+
+ // Let interested parties know that estate info has been updated.
+ mUpdateSignal();
+}
+
+void LLEstateInfoModel::notifyCommit()
+{
+ mCommitSignal();
+}
+
+//== PRIVATE STUFF ============================================================
+
+class LLEstateChangeInfoResponder : public LLHTTPClient::Responder
+{
+public:
+
+ // if we get a normal response, handle it here
+ virtual void result(const LLSD& content)
+ {
+ llinfos << "Committed estate info" << llendl;
+ LLEstateInfoModel::instance().notifyCommit();
+ }
+
+ // if we get an error response
+ virtual void error(U32 status, const std::string& reason)
+ {
+ llwarns << "Failed to commit estate info (" << status << "): " << reason << llendl;
+ }
+};
+
+// tries to send estate info using a cap; returns true if it succeeded
+bool LLEstateInfoModel::commitEstateInfoCaps()
+{
+ std::string url = gAgent.getRegion()->getCapability("EstateChangeInfo");
+
+ if (url.empty())
+ {
+ // whoops, couldn't find the cap, so bail out
+ return false;
+ }
+
+ LLSD body;
+ body["estate_name" ] = getName();
+ body["sun_hour" ] = getSunHour();
+
+ body["is_sun_fixed" ] = getUseFixedSun();
+ body["is_externally_visible"] = getIsExternallyVisible();
+ body["allow_direct_teleport"] = getAllowDirectTeleport();
+ body["deny_anonymous" ] = getDenyAnonymous();
+ body["deny_age_unverified" ] = getDenyAgeUnverified();
+ body["allow_voice_chat" ] = getAllowVoiceChat();
+
+ body["invoice" ] = LLFloaterRegionInfo::getLastInvoice();
+
+ LL_DEBUGS("Windlight Sync") << "Sending estate caps: "
+ << "is_sun_fixed = " << getUseFixedSun()
+ << ", sun_hour = " << getSunHour() << LL_ENDL;
+ lldebugs << body << LL_ENDL;
+
+ // we use a responder so that we can re-get the data after committing to the database
+ LLHTTPClient::post(url, body, new LLEstateChangeInfoResponder);
+ return true;
+}
+
+/* This is the old way of doing things, is deprecated, and should be
+ deleted when the dataserver model can be removed */
+// key = "estatechangeinfo"
+// strings[0] = str(estate_id) (added by simulator before relay - not here)
+// strings[1] = estate_name
+// strings[2] = str(estate_flags)
+// strings[3] = str((S32)(sun_hour * 1024.f))
+void LLEstateInfoModel::commitEstateInfoDataserver()
+{
+ LL_DEBUGS("Windlight Sync") << "Sending estate info: "
+ << "is_sun_fixed = " << getUseFixedSun()
+ << ", sun_hour = " << getSunHour() << LL_ENDL;
+ lldebugs << getInfoDump() << LL_ENDL;
+
+ LLMessageSystem* msg = gMessageSystem;
+ msg->newMessage("EstateOwnerMessage");
+ msg->nextBlockFast(_PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+ msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+ msg->addUUIDFast(_PREHASH_TransactionID, LLUUID::null); //not used
+
+ msg->nextBlock("MethodData");
+ msg->addString("Method", "estatechangeinfo");
+ msg->addUUID("Invoice", LLFloaterRegionInfo::getLastInvoice());
+
+ msg->nextBlock("ParamList");
+ msg->addString("Parameter", getName());
+
+ msg->nextBlock("ParamList");
+ msg->addString("Parameter", llformat("%u", getFlags()));
+
+ msg->nextBlock("ParamList");
+ msg->addString("Parameter", llformat("%d", (S32) (getSunHour() * 1024.0f)));
+
+ gAgent.sendMessage();
+}
+
+void LLEstateInfoModel::setFlag(U32 flag, bool val)
+{
+ if (val)
+ {
+ mFlags |= flag;
+ }
+ else
+ {
+ mFlags &= ~flag;
+ }
+}
+
+std::string LLEstateInfoModel::getInfoDump()
+{
+ LLSD dump;
+ dump["estate_name" ] = getName();
+ dump["sun_hour" ] = getSunHour();
+
+ dump["is_sun_fixed" ] = getUseFixedSun();
+ dump["is_externally_visible"] = getIsExternallyVisible();
+ dump["allow_direct_teleport"] = getAllowDirectTeleport();
+ dump["deny_anonymous" ] = getDenyAnonymous();
+ dump["deny_age_unverified" ] = getDenyAgeUnverified();
+ dump["allow_voice_chat" ] = getAllowVoiceChat();
+
+ std::stringstream dump_str;
+ dump_str << dump;
+ return dump_str.str();
+}
diff --git a/indra/newview/llestateinfomodel.h b/indra/newview/llestateinfomodel.h
new file mode 100644
index 0000000000..56391eda91
--- /dev/null
+++ b/indra/newview/llestateinfomodel.h
@@ -0,0 +1,103 @@
+/**
+ * @file llestateinfomodel.h
+ * @brief Estate info model
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLESTATEINFOMODEL_H
+#define LL_LLESTATEINFOMODEL_H
+
+class LLMessageSystem;
+
+#include "llsingleton.h"
+
+/**
+ * Contains estate info, notifies interested parties of its changes.
+ */
+class LLEstateInfoModel : public LLSingleton<LLEstateInfoModel>
+{
+ LOG_CLASS(LLEstateInfoModel);
+
+public:
+ typedef boost::signals2::signal<void()> update_signal_t;
+ boost::signals2::connection setUpdateCallback(const update_signal_t::slot_type& cb); /// the model has been externally updated
+ boost::signals2::connection setCommitCallback(const update_signal_t::slot_type& cb); /// our changes have been applied
+
+ void sendEstateInfo(); /// send estate info to the simulator
+
+ // getters
+ bool getUseFixedSun() const;
+ bool getIsExternallyVisible() const;
+ bool getAllowDirectTeleport() const;
+ bool getDenyAnonymous() const;
+ bool getDenyAgeUnverified() const;
+ bool getAllowVoiceChat() const;
+
+ const std::string& getName() const { return mName; }
+ const LLUUID& getOwnerID() const { return mOwnerID; }
+ U32 getID() const { return mID; }
+ F32 getSunHour() const { return getUseFixedSun() ? mSunHour : 0.f; }
+
+ // setters
+ void setUseFixedSun(bool val);
+ void setIsExternallyVisible(bool val);
+ void setAllowDirectTeleport(bool val);
+ void setDenyAnonymous(bool val);
+ void setDenyAgeUnverified(bool val);
+ void setAllowVoiceChat(bool val);
+
+ void setSunHour(F32 sun_hour) { mSunHour = sun_hour; }
+
+protected:
+ typedef std::vector<std::string> strings_t;
+
+ friend class LLSingleton<LLEstateInfoModel>;
+ friend class LLDispatchEstateUpdateInfo;
+ friend class LLEstateChangeInfoResponder;
+
+ LLEstateInfoModel();
+
+ /// refresh model with data from the incoming server message
+ void update(const strings_t& strings);
+
+ void notifyCommit();
+
+private:
+ bool commitEstateInfoCaps();
+ void commitEstateInfoDataserver();
+ U32 getFlags() const { return mFlags; }
+ void setFlag(U32 flag, bool val);
+ std::string getInfoDump();
+
+ // estate info
+ std::string mName; /// estate name
+ LLUUID mOwnerID; /// estate owner id
+ U32 mID; /// estate id
+ U32 mFlags; /// estate flags
+ F32 mSunHour; /// estate sun hour
+
+ update_signal_t mUpdateSignal; /// emitted when we receive update from sim
+ update_signal_t mCommitSignal; /// emitted when our update gets applied to sim
+};
+
+#endif // LL_LLESTATEINFOMODEL_H
diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp
index 5398c13c44..b6566fcbd0 100644
--- a/indra/newview/llface.cpp
+++ b/indra/newview/llface.cpp
@@ -165,6 +165,7 @@ void LLFace::init(LLDrawable* drawablep, LLViewerObject* objp)
mIndexInTex = 0;
mTexture = NULL;
mTEOffset = -1;
+ mTextureIndex = 255;
setDrawable(drawablep);
mVObjp = objp;
@@ -364,14 +365,7 @@ void LLFace::setSize(S32 num_vertices, S32 num_indices, bool align)
//allocate vertices in blocks of 4 for alignment
num_vertices = (num_vertices + 0x3) & ~0x3;
}
- else
- {
- if (mDrawablep->getVOVolume())
- {
- llerrs << "WTF?" << llendl;
- }
- }
-
+
if (mGeomCount != num_vertices ||
mIndicesCount != num_indices)
{
@@ -393,6 +387,26 @@ void LLFace::setGeomIndex(U16 idx)
}
}
+void LLFace::setTextureIndex(U8 index)
+{
+ if (index != mTextureIndex)
+ {
+ mTextureIndex = index;
+
+ if (mTextureIndex != 255)
+ {
+ mDrawablep->setState(LLDrawable::REBUILD_POSITION);
+ }
+ else
+ {
+ if (mDrawInfo && !mDrawInfo->mTextureList.empty())
+ {
+ llerrs << "Face with no texture index references indexed texture draw info." << llendl;
+ }
+ }
+ }
+}
+
void LLFace::setIndicesIndex(S32 idx)
{
if (mIndicesIndex != idx)
@@ -415,11 +429,11 @@ U16 LLFace::getGeometryAvatar(
if (mVertexBuffer.notNull())
{
- mVertexBuffer->getVertexStrider (vertices, mGeomIndex);
- mVertexBuffer->getNormalStrider (normals, mGeomIndex);
- mVertexBuffer->getTexCoord0Strider (tex_coords, mGeomIndex);
- mVertexBuffer->getWeightStrider(vertex_weights, mGeomIndex);
- mVertexBuffer->getClothWeightStrider(clothing_weights, mGeomIndex);
+ mVertexBuffer->getVertexStrider (vertices, mGeomIndex, mGeomCount);
+ mVertexBuffer->getNormalStrider (normals, mGeomIndex, mGeomCount);
+ mVertexBuffer->getTexCoord0Strider (tex_coords, mGeomIndex, mGeomCount);
+ mVertexBuffer->getWeightStrider(vertex_weights, mGeomIndex, mGeomCount);
+ mVertexBuffer->getClothWeightStrider(clothing_weights, mGeomIndex, mGeomCount);
}
return mGeomIndex;
@@ -432,17 +446,17 @@ U16 LLFace::getGeometry(LLStrider<LLVector3> &vertices, LLStrider<LLVector3> &no
if (mVertexBuffer.notNull())
{
- mVertexBuffer->getVertexStrider(vertices, mGeomIndex);
+ mVertexBuffer->getVertexStrider(vertices, mGeomIndex, mGeomCount);
if (mVertexBuffer->hasDataType(LLVertexBuffer::TYPE_NORMAL))
{
- mVertexBuffer->getNormalStrider(normals, mGeomIndex);
+ mVertexBuffer->getNormalStrider(normals, mGeomIndex, mGeomCount);
}
if (mVertexBuffer->hasDataType(LLVertexBuffer::TYPE_TEXCOORD0))
{
- mVertexBuffer->getTexCoord0Strider(tex_coords, mGeomIndex);
+ mVertexBuffer->getTexCoord0Strider(tex_coords, mGeomIndex, mGeomCount);
}
- mVertexBuffer->getIndexStrider(indicesp, mIndicesIndex);
+ mVertexBuffer->getIndexStrider(indicesp, mIndicesIndex, mIndicesCount);
}
return mGeomIndex;
@@ -679,6 +693,19 @@ static void xform(LLVector2 &tex_coord, F32 cosAng, F32 sinAng, F32 offS, F32 of
}
+bool less_than_max_mag(const LLVector4a& vec)
+{
+ LLVector4a MAX_MAG;
+ MAX_MAG.splat(1024.f*1024.f);
+
+ LLVector4a val;
+ val.setAbs(vec);
+
+ S32 lt = val.lessThan(MAX_MAG).getGatheredBits() & 0x7;
+
+ return lt == 0x7;
+}
+
BOOL LLFace::genVolumeBBoxes(const LLVolume &volume, S32 f,
const LLMatrix4& mat_vert_in, const LLMatrix3& mat_normal_in, BOOL global_volume)
{
@@ -713,6 +740,8 @@ BOOL LLFace::genVolumeBBoxes(const LLVolume &volume, S32 f,
min = face.mExtents[0];
max = face.mExtents[1];
+ llassert(less_than_max_mag(min));
+ llassert(less_than_max_mag(max));
//min, max are in volume space, convert to drawable render space
LLVector4a center;
@@ -724,6 +753,9 @@ BOOL LLFace::genVolumeBBoxes(const LLVolume &volume, S32 f,
size.setSub(max, min);
size.mul(0.5f);
+ llassert(less_than_max_mag(min));
+ llassert(less_than_max_mag(max));
+
if (!global_volume)
{
//VECTORIZE THIS
@@ -761,6 +793,8 @@ BOOL LLFace::genVolumeBBoxes(const LLVolume &volume, S32 f,
newMin = newMax = center;
+ llassert(less_than_max_mag(center));
+
for (U32 i = 0; i < 4; i++)
{
LLVector4a delta;
@@ -772,6 +806,9 @@ BOOL LLFace::genVolumeBBoxes(const LLVolume &volume, S32 f,
newMin.setMin(newMin,min);
newMax.setMax(newMax,max);
+
+ llassert(less_than_max_mag(newMin));
+ llassert(less_than_max_mag(newMax));
}
if (!mDrawablep->isActive())
@@ -780,14 +817,22 @@ BOOL LLFace::genVolumeBBoxes(const LLVolume &volume, S32 f,
offset.load3(mDrawablep->getRegion()->getOriginAgent().mV);
newMin.add(offset);
newMax.add(offset);
+
+ llassert(less_than_max_mag(newMin));
+ llassert(less_than_max_mag(newMax));
}
t.setAdd(newMin, newMax);
t.mul(0.5f);
+ llassert(less_than_max_mag(t));
+
//VECTORIZE THIS
mCenterLocal.set(t.getF32ptr());
+ llassert(less_than_max_mag(newMin));
+ llassert(less_than_max_mag(newMax));
+
t.setSub(newMax,newMin);
mBoundingSphereRadius = t.getLength3().getF32()*0.5f;
@@ -1078,27 +1123,6 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
const LLTextureEntry *tep = mVObjp->getTE(f);
const U8 bump_code = tep ? tep->getBumpmap() : 0;
- if (rebuild_pos)
- {
- mVertexBuffer->getVertexStrider(vert, mGeomIndex);
- vertices = (LLVector4a*) vert.get();
- }
- if (rebuild_normal)
- {
- mVertexBuffer->getNormalStrider(norm, mGeomIndex);
- normals = (LLVector4a*) norm.get();
- }
- if (rebuild_binormal)
- {
- mVertexBuffer->getBinormalStrider(binorm, mGeomIndex);
- binormals = (LLVector4a*) binorm.get();
- }
- if (rebuild_weights)
- {
- mVertexBuffer->getWeight4Strider(wght, mGeomIndex);
- weights = (LLVector4a*) wght.get();
- }
-
F32 tcoord_xoffset = 0.f ;
F32 tcoord_yoffset = 0.f ;
F32 tcoord_xscale = 1.f ;
@@ -1107,12 +1131,6 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
if (rebuild_tcoord)
{
- mVertexBuffer->getTexCoord0Strider(tex_coords, mGeomIndex);
- if (bump_code && mVertexBuffer->hasDataType(LLVertexBuffer::TYPE_TEXCOORD1))
- {
- mVertexBuffer->getTexCoord1Strider(tex_coords2, mGeomIndex);
- }
-
in_atlas = isAtlasInUse() ;
if(in_atlas)
{
@@ -1125,11 +1143,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
tcoord_yscale = tmp->mV[1] ;
}
}
- if (rebuild_color)
- {
- mVertexBuffer->getColorStrider(colors, mGeomIndex);
- }
-
+
BOOL is_static = mDrawablep->isStatic();
BOOL is_global = is_static;
@@ -1168,7 +1182,8 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
// INDICES
if (full_rebuild)
{
- mVertexBuffer->getIndexStrider(indicesp, mIndicesIndex);
+ mVertexBuffer->getIndexStrider(indicesp, mIndicesIndex, mIndicesCount, true);
+
__m128i* dst = (__m128i*) indicesp.get();
__m128i* src = (__m128i*) vf.mIndices;
__m128i offset = _mm_set1_epi16(index_offset);
@@ -1185,6 +1200,8 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
{
indicesp[i] = vf.mIndices[i]+index_offset;
}
+
+ mVertexBuffer->setBuffer(0);
}
LLMatrix4a mat_normal;
@@ -1330,6 +1347,8 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
if (!in_atlas && !do_bump)
{ //not in atlas or not bump mapped, might be able to do a cheap update
+ mVertexBuffer->getTexCoord0Strider(tex_coords, mGeomIndex, mGeomCount);
+
if (texgen != LLTextureEntry::TEX_GEN_PLANAR)
{
if (!do_tex_mat)
@@ -1402,9 +1421,15 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
}
}
}
+
+ mVertexBuffer->setBuffer(0);
}
else
{ //either bump mapped or in atlas, just do the whole expensive loop
+ mVertexBuffer->getTexCoord0Strider(tex_coords, mGeomIndex, mGeomCount, true);
+
+ std::vector<LLVector2> bump_tc;
+
for (S32 i = 0; i < num_vertices; i++)
{
LLVector2 tc(vf.mTexCoords[i]);
@@ -1535,8 +1560,20 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
*tex_coords++ = tc;
-
- if (bump_code && mVertexBuffer->hasDataType(LLVertexBuffer::TYPE_TEXCOORD1))
+ if (do_bump)
+ {
+ bump_tc.push_back(tc);
+ }
+ }
+
+ mVertexBuffer->setBuffer(0);
+
+
+ if (do_bump)
+ {
+ mVertexBuffer->getTexCoord1Strider(tex_coords2, mGeomIndex, mGeomCount, true);
+
+ for (S32 i = 0; i < num_vertices; i++)
{
LLVector4a tangent;
tangent.setCross3(vf.mBinormals[i], vf.mNormals[i]);
@@ -1558,16 +1595,22 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
}
binormal.normalize3fast();
+ LLVector2 tc = bump_tc[i];
tc += LLVector2( bump_s_primary_light_ray.dot3(tangent).getF32(), bump_t_primary_light_ray.dot3(binormal).getF32() );
*tex_coords2++ = tc;
- }
+ }
+
+ mVertexBuffer->setBuffer(0);
}
}
}
if (rebuild_pos)
{
+ mVertexBuffer->getVertexStrider(vert, mGeomIndex, mGeomCount, true);
+ vertices = (LLVector4a*) vert.get();
+
LLMatrix4a mat_vert;
mat_vert.loadu(mat_vert_in);
@@ -1580,10 +1623,28 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
mat_vert.affineTransform(*src++, *dst++);
}
while(dst < end);
+
+ F32 index = (F32) (mTextureIndex < 255 ? mTextureIndex : 0);
+ F32 *index_dst = (F32*) vertices;
+ F32 *index_end = (F32*) end;
+
+ index_dst += 3;
+ index_end += 3;
+ do
+ {
+ *index_dst = index;
+ index_dst += 4;
+ }
+ while (index_dst < index_end);
+
+ mVertexBuffer->setBuffer(0);
}
if (rebuild_normal)
{
+ mVertexBuffer->getNormalStrider(norm, mGeomIndex, mGeomCount, true);
+ normals = (LLVector4a*) norm.get();
+
for (S32 i = 0; i < num_vertices; i++)
{
LLVector4a normal;
@@ -1591,10 +1652,15 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
normal.normalize3fast();
normals[i] = normal;
}
+
+ mVertexBuffer->setBuffer(0);
}
if (rebuild_binormal)
{
+ mVertexBuffer->getBinormalStrider(binorm, mGeomIndex, mGeomCount, true);
+ binormals = (LLVector4a*) binorm.get();
+
for (S32 i = 0; i < num_vertices; i++)
{
LLVector4a binormal;
@@ -1602,15 +1668,22 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
binormal.normalize3fast();
binormals[i] = binormal;
}
+
+ mVertexBuffer->setBuffer(0);
}
if (rebuild_weights && vf.mWeights)
{
+ mVertexBuffer->getWeight4Strider(wght, mGeomIndex, mGeomCount, true);
+ weights = (LLVector4a*) wght.get();
LLVector4a::memcpyNonAliased16((F32*) weights, (F32*) vf.mWeights, num_vertices*4*sizeof(F32));
+ mVertexBuffer->setBuffer(0);
}
if (rebuild_color)
{
+ mVertexBuffer->getColorStrider(colors, mGeomIndex, mGeomCount, true);
+
LLVector4a src;
U32 vec[4];
@@ -1629,6 +1702,8 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
{
dst[i] = src;
}
+
+ mVertexBuffer->setBuffer(0);
}
if (rebuild_tcoord)
@@ -2045,13 +2120,13 @@ S32 LLFace::getColors(LLStrider<LLColor4U> &colors)
}
// llassert(mGeomIndex >= 0);
- mVertexBuffer->getColorStrider(colors, mGeomIndex);
+ mVertexBuffer->getColorStrider(colors, mGeomIndex, mGeomCount);
return mGeomIndex;
}
S32 LLFace::getIndices(LLStrider<U16> &indicesp)
{
- mVertexBuffer->getIndexStrider(indicesp, mIndicesIndex);
+ mVertexBuffer->getIndexStrider(indicesp, mIndicesIndex, mIndicesCount);
llassert(indicesp[0] != indicesp[1]);
return mIndicesIndex;
}
diff --git a/indra/newview/llface.h b/indra/newview/llface.h
index b2170c4cf3..b5eaeecd60 100644
--- a/indra/newview/llface.h
+++ b/indra/newview/llface.h
@@ -94,6 +94,8 @@ public:
U16 getGeomCount() const { return mGeomCount; } // vertex count for this face
U16 getGeomIndex() const { return mGeomIndex; } // index into draw pool
U16 getGeomStart() const { return mGeomIndex; } // index into draw pool
+ void setTextureIndex(U8 index);
+ U8 getTextureIndex() const { return mTextureIndex; }
void setTexture(LLViewerTexture* tex) ;
void switchTexture(LLViewerTexture* new_texture);
void dirtyTexture();
@@ -262,6 +264,7 @@ private:
U16 mGeomCount; // vertex count for this face
U16 mGeomIndex; // index into draw pool
+ U8 mTextureIndex; // index of texture channel to use for pseudo-atlasing
U32 mIndicesCount;
U32 mIndicesIndex; // index into draw pool for indices (yeah, I know!)
S32 mIndexInTex ;
diff --git a/indra/newview/llfeaturemanager.cpp b/indra/newview/llfeaturemanager.cpp
index 524d2d74ef..83844048d1 100644
--- a/indra/newview/llfeaturemanager.cpp
+++ b/indra/newview/llfeaturemanager.cpp
@@ -203,7 +203,7 @@ BOOL LLFeatureManager::maskFeatures(const std::string& name)
LL_DEBUGS("RenderInit") << "Unknown feature mask " << name << LL_ENDL;
return FALSE;
}
- LL_DEBUGS("RenderInit") << "Applying Feature Mask: " << name << LL_ENDL;
+ LL_INFOS("RenderInit") << "Applying GPU Feature list: " << name << LL_ENDL;
return maskList(*maskp);
}
@@ -378,13 +378,16 @@ void LLFeatureManager::parseGPUTable(std::string filename)
return;
}
- std::string renderer = gGLManager.getRawGLString();
+ std::string rawRenderer = gGLManager.getRawGLString();
+ std::string renderer = rawRenderer;
for (std::string::iterator i = renderer.begin(); i != renderer.end(); ++i)
{
*i = tolower(*i);
}
-
- while (!file.eof())
+
+ bool gpuFound;
+ U32 lineNumber;
+ for (gpuFound = false, lineNumber = 0; !gpuFound && !file.eof(); lineNumber++)
{
char buffer[MAX_STRING]; /*Flawfinder: ignore*/
buffer[0] = 0;
@@ -431,6 +434,7 @@ void LLFeatureManager::parseGPUTable(std::string filename)
if (label.empty() || expr.empty() || cls.empty() || supported.empty())
{
+ LL_WARNS("RenderInit") << "invald gpu_table.txt:" << lineNumber << ": '" << buffer << "'" << LL_ENDL;
continue;
}
@@ -444,18 +448,26 @@ void LLFeatureManager::parseGPUTable(std::string filename)
if(boost::regex_search(renderer, re))
{
// if we found it, stop!
- file.close();
- LL_INFOS("RenderInit") << "GPU is " << label << llendl;
+ gpuFound = true;
mGPUString = label;
mGPUClass = (EGPUClass) strtol(cls.c_str(), NULL, 10);
mGPUSupported = (BOOL) strtol(supported.c_str(), NULL, 10);
- file.close();
- return;
}
}
file.close();
- LL_WARNS("RenderInit") << "Couldn't match GPU to a class: " << gGLManager.getRawGLString() << LL_ENDL;
+ if ( gpuFound )
+ {
+ LL_INFOS("RenderInit") << "GPU '" << rawRenderer << "' recognized as '" << mGPUString << "'" << LL_ENDL;
+ if (!mGPUSupported)
+ {
+ LL_INFOS("RenderInit") << "GPU '" << mGPUString << "' is not supported." << LL_ENDL;
+ }
+ }
+ else
+ {
+ LL_WARNS("RenderInit") << "GPU '" << rawRenderer << "' not recognized" << LL_ENDL;
+ }
}
// responder saves table into file
@@ -753,7 +765,7 @@ void LLFeatureManager::applyBaseMasks()
{
maskFeatures("OpenGLPre30");
}
- if (gGLManager.mNumTextureUnits <= 8)
+ if (gGLManager.mNumTextureImageUnits <= 8)
{
maskFeatures("TexUnit8orLess");
}
diff --git a/indra/newview/llfilteredwearablelist.cpp b/indra/newview/llfilteredwearablelist.cpp
index cd5e779c4d..a29ccf2b6d 100644
--- a/indra/newview/llfilteredwearablelist.cpp
+++ b/indra/newview/llfilteredwearablelist.cpp
@@ -31,6 +31,7 @@
#include "llinventoryfunctions.h"
#include "llinventoryitemslist.h"
#include "llinventorymodel.h"
+#include "llviewerinventory.h"
LLFilteredWearableListManager::LLFilteredWearableListManager(LLInventoryItemsList* list, LLInventoryCollectFunctor* collector)
diff --git a/indra/newview/llfirstuse.cpp b/indra/newview/llfirstuse.cpp
index 2c4153688a..a9f52282a5 100644
--- a/indra/newview/llfirstuse.cpp
+++ b/indra/newview/llfirstuse.cpp
@@ -131,7 +131,7 @@ void LLFirstUse::notMoving(bool enable)
// static
void LLFirstUse::viewPopup(bool enable)
{
- firstUseNotification("FirstViewPopup", enable, "HintView", LLSD(), LLSD().with("target", "view_popup").with("direction", "right"));
+// firstUseNotification("FirstViewPopup", enable, "HintView", LLSD(), LLSD().with("target", "view_popup").with("direction", "right"));
}
// static
diff --git a/indra/newview/llflexibleobject.cpp b/indra/newview/llflexibleobject.cpp
index 3d1650d2f5..32a533570a 100644
--- a/indra/newview/llflexibleobject.cpp
+++ b/indra/newview/llflexibleobject.cpp
@@ -366,7 +366,7 @@ void LLVolumeImplFlexible::doFlexibleUpdate()
LLFastTimer ftm(FTM_DO_FLEXIBLE_UPDATE);
LLVolume* volume = mVO->getVolume();
LLPath *path = &volume->getPath();
- if ((mSimulateRes == 0 || !mInitialized) && mVO->mDrawable->isVisible()) // if its uninitialized but not visible, what then? - Nyx
+ if ((mSimulateRes == 0 || !mInitialized) && mVO->mDrawable->isVisible())
{
mVO->markForUpdate(TRUE);
if (!doIdleUpdate(gAgent, *LLWorld::getInstance(), 0.0))
@@ -375,7 +375,11 @@ void LLVolumeImplFlexible::doFlexibleUpdate()
}
}
- llassert_always(mInitialized);
+ if(!mInitialized)
+ {
+ //the object is not visible
+ return ;
+ }
S32 num_sections = 1 << mSimulateRes;
diff --git a/indra/newview/llfloaterauction.cpp b/indra/newview/llfloaterauction.cpp
index c95b046707..2939d31087 100644
--- a/indra/newview/llfloaterauction.cpp
+++ b/indra/newview/llfloaterauction.cpp
@@ -27,7 +27,6 @@
#include "llviewerprecompiledheaders.h"
#include "llfloaterauction.h"
-#include "llfloaterregioninfo.h"
#include "llgl.h"
#include "llimagej2c.h"
@@ -40,6 +39,7 @@
#include "llagent.h"
#include "llcombobox.h"
+#include "llestateinfomodel.h"
#include "llmimetypes.h"
#include "llnotifications.h"
#include "llnotificationsutil.h"
@@ -55,6 +55,7 @@
#include "llrender.h"
#include "llsdutil.h"
#include "llsdutil_math.h"
+#include "lltrans.h"
///----------------------------------------------------------------------------
/// Local function declarations, constants, enums, and typedefs
@@ -113,16 +114,9 @@ void LLFloaterAuction::initialize()
getChildView("reset_parcel_btn")->setEnabled(TRUE);
getChildView("start_auction_btn")->setEnabled(TRUE);
- LLPanelEstateInfo* panel = LLFloaterRegionInfo::getPanelEstate();
- if (panel)
- { // Only enable "Sell to Anyone" on Teen grid or if we don't know the ID yet
- U32 estate_id = panel->getEstateID();
- getChildView("sell_to_anyone_btn")->setEnabled((estate_id == ESTATE_TEEN || estate_id == 0));
- }
- else
- { // Don't have the panel up, so don't know if we're on the teen grid or not. Default to enabling it
- getChildView("sell_to_anyone_btn")->setEnabled(TRUE);
- }
+ U32 estate_id = LLEstateInfoModel::instance().getID();
+ // Only enable "Sell to Anyone" on Teen grid or if we don't know the ID yet
+ getChildView("sell_to_anyone_btn")->setEnabled(estate_id == ESTATE_TEEN || estate_id == 0);
}
else
{
@@ -457,7 +451,7 @@ void LLFloaterAuction::onClickSellToAnyone(void* data)
LLSD args;
args["LAND_SIZE"] = llformat("%d", area);
args["SALE_PRICE"] = llformat("%d", sale_price);
- args["NAME"] = "Anyone";
+ args["NAME"] = LLTrans::getString("Anyone");
LLNotification::Params params("ConfirmLandSaleChange"); // Re-use existing dialog
params.substitutions(args)
diff --git a/indra/newview/llfloaterbuildoptions.cpp b/indra/newview/llfloaterbuildoptions.cpp
index 4b6fe4a115..86c1bf0534 100644
--- a/indra/newview/llfloaterbuildoptions.cpp
+++ b/indra/newview/llfloaterbuildoptions.cpp
@@ -34,15 +34,81 @@
#include "llfloaterbuildoptions.h"
#include "lluictrlfactory.h"
+#include "llcombobox.h"
+#include "llselectmgr.h"
+
//
// Methods
//
+
+void commit_grid_mode(LLUICtrl *);
+
LLFloaterBuildOptions::LLFloaterBuildOptions(const LLSD& key)
- : LLFloater(key)
+ : LLFloater(key),
+ mComboGridMode(NULL)
{
+ mCommitCallbackRegistrar.add("GridOptions.gridMode", boost::bind(&commit_grid_mode,_1));
}
LLFloaterBuildOptions::~LLFloaterBuildOptions()
+{}
+
+BOOL LLFloaterBuildOptions::postBuild()
+{
+ mComboGridMode = getChild<LLComboBox>("combobox grid mode");
+
+ return TRUE;
+}
+
+void LLFloaterBuildOptions::setGridMode(EGridMode mode)
+{
+ mComboGridMode->setCurrentByIndex((S32)mode);
+}
+
+void LLFloaterBuildOptions::updateGridMode()
{
+ if (mComboGridMode)
+ {
+ S32 index = mComboGridMode->getCurrentIndex();
+ mComboGridMode->removeall();
+
+ switch (mObjectSelection->getSelectType())
+ {
+ case SELECT_TYPE_HUD:
+ mComboGridMode->add(getString("grid_screen_text"));
+ mComboGridMode->add(getString("grid_local_text"));
+ break;
+ case SELECT_TYPE_WORLD:
+ mComboGridMode->add(getString("grid_world_text"));
+ mComboGridMode->add(getString("grid_local_text"));
+ mComboGridMode->add(getString("grid_reference_text"));
+ break;
+ case SELECT_TYPE_ATTACHMENT:
+ mComboGridMode->add(getString("grid_attachment_text"));
+ mComboGridMode->add(getString("grid_local_text"));
+ mComboGridMode->add(getString("grid_reference_text"));
+ break;
+ }
+
+ mComboGridMode->setCurrentByIndex(index);
+ }
+}
+
+// virtual
+void LLFloaterBuildOptions::onOpen(const LLSD& key)
+{
+ mObjectSelection = LLSelectMgr::getInstance()->getEditSelection();
}
+// virtual
+void LLFloaterBuildOptions::onClose(bool app_quitting)
+{
+ mObjectSelection = NULL;
+}
+
+void commit_grid_mode(LLUICtrl *ctrl)
+{
+ LLComboBox* combo = (LLComboBox*)ctrl;
+
+ LLSelectMgr::getInstance()->setGridMode((EGridMode)combo->getCurrentIndex());
+}
diff --git a/indra/newview/llfloaterbuildoptions.h b/indra/newview/llfloaterbuildoptions.h
index 164944d7bc..7f3811bf1c 100644
--- a/indra/newview/llfloaterbuildoptions.h
+++ b/indra/newview/llfloaterbuildoptions.h
@@ -33,15 +33,34 @@
#define LL_LLFLOATERBUILDOPTIONS_H
#include "llfloater.h"
+#include "llselectmgr.h"
+class LLComboBox;
+class LLObjectSelection;
+
+typedef LLSafeHandle<LLObjectSelection> LLObjectSelectionHandle;
class LLFloaterBuildOptions
: public LLFloater
{
- friend class LLFloaterReg;
+public:
+
+ virtual BOOL postBuild();
+
+ /*virtual*/ void onOpen(const LLSD& key);
+ /*virtual*/ void onClose(bool app_quitting);
+
+ void setGridMode(EGridMode mode);
+ void updateGridMode();
+
private:
+
+ friend class LLFloaterReg;
+
LLFloaterBuildOptions(const LLSD& key);
~LLFloaterBuildOptions();
-};
+ LLComboBox* mComboGridMode;
+ LLObjectSelectionHandle mObjectSelection;
+};
#endif
diff --git a/indra/newview/llfloaterbuyland.cpp b/indra/newview/llfloaterbuyland.cpp
index 50b19a4221..610142b5a9 100644
--- a/indra/newview/llfloaterbuyland.cpp
+++ b/indra/newview/llfloaterbuyland.cpp
@@ -461,15 +461,15 @@ void LLFloaterBuyLandUI::updateParcelInfo()
if (!authorizedBuyer.isNull() && buyer != authorizedBuyer)
{
- // Maybe the parcel is set for sale to a group we are in.
- bool authorized_group =
- gAgent.hasPowerInGroup(authorizedBuyer,GP_LAND_DEED)
- && gAgent.hasPowerInGroup(authorizedBuyer,GP_LAND_SET_SALE_INFO);
-
- if (!authorized_group)
- {
- mCannotBuyReason = getString("set_to_sell_to_other");
- return;
+ // Maybe the parcel is set for sale to a group we are in.
+ bool authorized_group =
+ gAgent.hasPowerInGroup(authorizedBuyer,GP_LAND_DEED)
+ && gAgent.hasPowerInGroup(authorizedBuyer,GP_LAND_SET_SALE_INFO);
+
+ if (!authorized_group)
+ {
+ mCannotBuyReason = getString("set_to_sell_to_other");
+ return;
}
}
}
diff --git a/indra/newview/llfloaterdaycycle.cpp b/indra/newview/llfloaterdaycycle.cpp
deleted file mode 100644
index 22816ee802..0000000000
--- a/indra/newview/llfloaterdaycycle.cpp
+++ /dev/null
@@ -1,531 +0,0 @@
-/**
- * @file llfloaterdaycycle.cpp
- * @brief LLFloaterDayCycle class definition
- *
- * $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 "llfloaterdaycycle.h"
-
-#include "pipeline.h"
-#include "llsky.h"
-
-#include "llsliderctrl.h"
-#include "llmultislider.h"
-#include "llmultisliderctrl.h"
-#include "llspinctrl.h"
-#include "llcheckboxctrl.h"
-#include "lluictrlfactory.h"
-#include "llviewercamera.h"
-#include "llcombobox.h"
-#include "lllineeditor.h"
-#include "llwlanimator.h"
-
-#include "v4math.h"
-#include "llviewerdisplay.h"
-#include "llviewercontrol.h"
-#include "llviewerwindow.h"
-
-#include "llwlparamset.h"
-#include "llwlparammanager.h"
-#include "llpostprocess.h"
-#include "llfloaterwindlight.h"
-
-
-std::map<std::string, LLWLSkyKey> LLFloaterDayCycle::sSliderToKey;
-const F32 LLFloaterDayCycle::sHoursPerDay = 24.0f;
-
-LLFloaterDayCycle::LLFloaterDayCycle(const LLSD& key)
-: LLFloater(key)
-{
-}
-
-BOOL LLFloaterDayCycle::postBuild()
-{
- // add the combo boxes
- LLComboBox* keyCombo = getChild<LLComboBox>("WLKeyPresets");
-
- if(keyCombo != NULL)
- {
- keyCombo->removeall();
- std::map<std::string, LLWLParamSet>::iterator mIt =
- LLWLParamManager::instance()->mParamList.begin();
- for(; mIt != LLWLParamManager::instance()->mParamList.end(); mIt++)
- {
- keyCombo->add(std::string(mIt->first));
- }
-
- // set defaults on combo boxes
- keyCombo->selectFirstItem();
- }
-
- // add the time slider
- LLMultiSliderCtrl* sldr = getChild<LLMultiSliderCtrl>("WLTimeSlider");
-
- sldr->addSlider();
-
- // load it up
- initCallbacks();
-
- syncMenu();
- syncSliderTrack();
-
- return TRUE;
-}
-
-LLFloaterDayCycle::~LLFloaterDayCycle()
-{
-}
-
-void LLFloaterDayCycle::initCallbacks(void)
-{
- // WL Day Cycle
- getChild<LLUICtrl>("WLTimeSlider")->setCommitCallback(boost::bind(&LLFloaterDayCycle::onTimeSliderMoved, this, _1));
- getChild<LLUICtrl>("WLDayCycleKeys")->setCommitCallback(boost::bind(&LLFloaterDayCycle::onKeyTimeMoved, this, _1));
- getChild<LLUICtrl>("WLCurKeyHour")->setCommitCallback(boost::bind(&LLFloaterDayCycle::onKeyTimeChanged, this, _1));
- getChild<LLUICtrl>("WLCurKeyMin")->setCommitCallback(boost::bind(&LLFloaterDayCycle::onKeyTimeChanged, this, _1));
- getChild<LLUICtrl>("WLKeyPresets")->setCommitCallback(boost::bind(&LLFloaterDayCycle::onKeyPresetChanged, this, _1));
-
- getChild<LLUICtrl>("WLLengthOfDayHour")->setCommitCallback(boost::bind(&LLFloaterDayCycle::onTimeRateChanged, this, _1));
- getChild<LLUICtrl>("WLLengthOfDayMin")->setCommitCallback(boost::bind(&LLFloaterDayCycle::onTimeRateChanged, this, _1));
- getChild<LLUICtrl>("WLLengthOfDaySec")->setCommitCallback(boost::bind(&LLFloaterDayCycle::onTimeRateChanged, this, _1));
- getChild<LLUICtrl>("WLUseLindenTime")->setCommitCallback(boost::bind(&LLFloaterDayCycle::onUseLindenTime, this, _1));
- getChild<LLUICtrl>("WLAnimSky")->setCommitCallback(boost::bind(&LLFloaterDayCycle::onRunAnimSky, this, _1));
- getChild<LLUICtrl>("WLStopAnimSky")->setCommitCallback(boost::bind(&LLFloaterDayCycle::onStopAnimSky, this, _1));
-
- getChild<LLUICtrl>("WLLoadDayCycle")->setCommitCallback(boost::bind(&LLFloaterDayCycle::onLoadDayCycle, this, _1));
- getChild<LLUICtrl>("WLSaveDayCycle")->setCommitCallback(boost::bind(&LLFloaterDayCycle::onSaveDayCycle, this, _1));
-
- getChild<LLUICtrl>("WLAddKey")->setCommitCallback(boost::bind(&LLFloaterDayCycle::onAddKey, this, _1));
- getChild<LLUICtrl>("WLDeleteKey")->setCommitCallback(boost::bind(&LLFloaterDayCycle::onDeleteKey, this, _1));
-}
-
-void LLFloaterDayCycle::syncMenu()
-{
-// std::map<std::string, LLVector4> & currentParams = LLWLParamManager::instance()->mCurParams.mParamValues;
-
- // set time
- LLMultiSliderCtrl* sldr = getChild<LLMultiSliderCtrl>("WLTimeSlider");
- sldr->setCurSliderValue((F32)LLWLParamManager::instance()->mAnimator.getDayTime() * sHoursPerDay);
-
- LLSpinCtrl* secSpin = getChild<LLSpinCtrl>("WLLengthOfDaySec");
- LLSpinCtrl* minSpin = getChild<LLSpinCtrl>("WLLengthOfDayMin");
- LLSpinCtrl* hourSpin = getChild<LLSpinCtrl>("WLLengthOfDayHour");
-
- F32 curRate;
- F32 hours, min, sec;
-
- // get the current rate
- curRate = LLWLParamManager::instance()->mDay.mDayRate;
- hours = (F32)((int)(curRate / 60 / 60));
- curRate -= (hours * 60 * 60);
- min = (F32)((int)(curRate / 60));
- curRate -= (min * 60);
- sec = curRate;
-
- hourSpin->setValue(hours);
- minSpin->setValue(min);
- secSpin->setValue(sec);
-
- // turn off Use Estate Time button if it's already being used
- if( LLWLParamManager::instance()->mAnimator.mUseLindenTime == true)
- {
- getChildView("WLUseLindenTime")->setEnabled(FALSE);
- }
- else
- {
- getChildView("WLUseLindenTime")->setEnabled(TRUE);
- }
-}
-
-void LLFloaterDayCycle::syncSliderTrack()
-{
- // clear the slider
- LLMultiSliderCtrl* kSldr = getChild<LLMultiSliderCtrl>("WLDayCycleKeys");
-
- kSldr->clear();
- sSliderToKey.clear();
-
- // add sliders
- std::map<F32, std::string>::iterator mIt =
- LLWLParamManager::instance()->mDay.mTimeMap.begin();
- for(; mIt != LLWLParamManager::instance()->mDay.mTimeMap.end(); mIt++)
- {
- addSliderKey(mIt->first * sHoursPerDay, mIt->second);
- }
-}
-
-void LLFloaterDayCycle::syncTrack()
-{
- // if no keys, do nothing
- if(sSliderToKey.size() == 0)
- {
- return;
- }
-
- LLMultiSliderCtrl* sldr;
- sldr = getChild<LLMultiSliderCtrl>(
- "WLDayCycleKeys");
- llassert_always(sSliderToKey.size() == sldr->getValue().size());
-
- LLMultiSliderCtrl* tSldr;
- tSldr = getChild<LLMultiSliderCtrl>(
- "WLTimeSlider");
-
- // create a new animation track
- LLWLParamManager::instance()->mDay.clearKeys();
-
- // add the keys one by one
- std::map<std::string, LLWLSkyKey>::iterator mIt = sSliderToKey.begin();
- for(; mIt != sSliderToKey.end(); mIt++)
- {
- LLWLParamManager::instance()->mDay.addKey(mIt->second.time / sHoursPerDay,
- mIt->second.presetName);
- }
-
- // set the param manager's track to the new one
- LLWLParamManager::instance()->resetAnimator(
- tSldr->getCurSliderValue() / sHoursPerDay, false);
-
- LLWLParamManager::instance()->mAnimator.update(
- LLWLParamManager::instance()->mCurParams);
-}
-
-void LLFloaterDayCycle::onRunAnimSky(LLUICtrl* ctrl)
-{
- // if no keys, do nothing
- if(sSliderToKey.size() == 0)
- {
- return;
- }
-
- LLMultiSliderCtrl* sldr;
- sldr = getChild<LLMultiSliderCtrl>("WLDayCycleKeys");
- llassert_always(sSliderToKey.size() == sldr->getValue().size());
-
- LLMultiSliderCtrl* tSldr;
- tSldr = getChild<LLMultiSliderCtrl>("WLTimeSlider");
-
- // turn off linden time
- LLWLParamManager::instance()->mAnimator.mUseLindenTime = false;
-
- // set the param manager's track to the new one
- LLWLParamManager::instance()->resetAnimator(
- tSldr->getCurSliderValue() / sHoursPerDay, true);
-
- llassert_always(LLWLParamManager::instance()->mAnimator.mTimeTrack.size() == sldr->getValue().size());
-}
-
-void LLFloaterDayCycle::onStopAnimSky(LLUICtrl* ctrl)
-{
- // if no keys, do nothing
- if(sSliderToKey.size() == 0) {
- return;
- }
-
- // turn off animation and using linden time
- LLWLParamManager::instance()->mAnimator.mIsRunning = false;
- LLWLParamManager::instance()->mAnimator.mUseLindenTime = false;
-}
-
-void LLFloaterDayCycle::onUseLindenTime(LLUICtrl* ctrl)
-{
- LLComboBox* box = getChild<LLComboBox>("WLPresetsCombo");
- box->selectByValue("");
-
- LLWLParamManager::instance()->mAnimator.mIsRunning = true;
- LLWLParamManager::instance()->mAnimator.mUseLindenTime = true;
-}
-
-void LLFloaterDayCycle::onLoadDayCycle(LLUICtrl* ctrl)
-{
- LLWLParamManager::instance()->mDay.loadDayCycle("Default.xml");
-
- // sync it all up
- syncSliderTrack();
- syncMenu();
-
- // set the param manager's track to the new one
- LLMultiSliderCtrl* tSldr;
- tSldr = getChild<LLMultiSliderCtrl>(
- "WLTimeSlider");
- LLWLParamManager::instance()->resetAnimator(
- tSldr->getCurSliderValue() / sHoursPerDay, false);
-
- // and draw it
- LLWLParamManager::instance()->mAnimator.update(
- LLWLParamManager::instance()->mCurParams);
-}
-
-void LLFloaterDayCycle::onSaveDayCycle(LLUICtrl* ctrl)
-{
- LLWLParamManager::instance()->mDay.saveDayCycle("Default.xml");
-}
-
-
-void LLFloaterDayCycle::onTimeSliderMoved(LLUICtrl* ctrl)
-{
- LLMultiSliderCtrl* sldr = getChild<LLMultiSliderCtrl>(
- "WLTimeSlider");
-
- /// get the slider value
- F32 val = sldr->getCurSliderValue() / sHoursPerDay;
-
- // set the value, turn off animation
- LLWLParamManager::instance()->mAnimator.setDayTime((F64)val);
- LLWLParamManager::instance()->mAnimator.mIsRunning = false;
- LLWLParamManager::instance()->mAnimator.mUseLindenTime = false;
-
- // then call update once
- LLWLParamManager::instance()->mAnimator.update(
- LLWLParamManager::instance()->mCurParams);
-}
-
-void LLFloaterDayCycle::onKeyTimeMoved(LLUICtrl* ctrl)
-{
- LLComboBox* comboBox = getChild<LLComboBox>("WLKeyPresets");
- LLMultiSliderCtrl* sldr = getChild<LLMultiSliderCtrl>("WLDayCycleKeys");
- LLSpinCtrl* hourSpin = getChild<LLSpinCtrl>("WLCurKeyHour");
- LLSpinCtrl* minSpin = getChild<LLSpinCtrl>("WLCurKeyMin");
-
- if(sldr->getValue().size() == 0) {
- return;
- }
-
- // make sure we have a slider
- const std::string& curSldr = sldr->getCurSlider();
- if(curSldr == "") {
- return;
- }
-
- F32 time = sldr->getCurSliderValue();
-
- // check to see if a key exists
- std::string presetName = sSliderToKey[curSldr].presetName;
- sSliderToKey[curSldr].time = time;
-
- // if it exists, turn on check box
- comboBox->selectByValue(presetName);
-
- // now set the spinners
- F32 hour = (F32)((S32)time);
- F32 min = (time - hour) * 60;
-
- // handle imprecision
- if(min >= 59) {
- min = 0;
- hour += 1;
- }
-
- hourSpin->set(hour);
- minSpin->set(min);
-
- syncTrack();
-
-}
-
-void LLFloaterDayCycle::onKeyTimeChanged(LLUICtrl* ctrl)
-{
- // if no keys, skipped
- if(sSliderToKey.size() == 0) {
- return;
- }
-
- LLMultiSliderCtrl* sldr = getChild<LLMultiSliderCtrl>(
- "WLDayCycleKeys");
- LLSpinCtrl* hourSpin = getChild<LLSpinCtrl>(
- "WLCurKeyHour");
- LLSpinCtrl* minSpin = getChild<LLSpinCtrl>(
- "WLCurKeyMin");
-
- F32 hour = hourSpin->get();
- F32 min = minSpin->get();
- F32 val = hour + min / 60.0f;
-
- const std::string& curSldr = sldr->getCurSlider();
- sldr->setCurSliderValue(val, TRUE);
- F32 time = sldr->getCurSliderValue() / sHoursPerDay;
-
- // now set the key's time in the sliderToKey map
- std::string presetName = sSliderToKey[curSldr].presetName;
- sSliderToKey[curSldr].time = time;
-
- syncTrack();
-}
-
-void LLFloaterDayCycle::onKeyPresetChanged(LLUICtrl* ctrl)
-{
- // get the time
- LLComboBox* comboBox = getChild<LLComboBox>(
- "WLKeyPresets");
- LLMultiSliderCtrl* sldr = getChild<LLMultiSliderCtrl>(
- "WLDayCycleKeys");
-
- // do nothing if no sliders
- if(sldr->getValue().size() == 0) {
- return;
- }
-
- // change the map
- std::string newPreset(comboBox->getSelectedValue().asString());
- const std::string& curSldr = sldr->getCurSlider();
-
- // if null, don't use
- if(curSldr == "") {
- return;
- }
-
- sSliderToKey[curSldr].presetName = newPreset;
-
- syncTrack();
-}
-
-void LLFloaterDayCycle::onTimeRateChanged(LLUICtrl* ctrl)
-{
- // get the time
- LLSpinCtrl* secSpin = getChild<LLSpinCtrl>(
- "WLLengthOfDaySec");
-
- LLSpinCtrl* minSpin = getChild<LLSpinCtrl>(
- "WLLengthOfDayMin");
-
- LLSpinCtrl* hourSpin = getChild<LLSpinCtrl>(
- "WLLengthOfDayHour");
-
- F32 hour;
- hour = (F32)hourSpin->getValue().asReal();
- F32 min;
- min = (F32)minSpin->getValue().asReal();
- F32 sec;
- sec = (F32)secSpin->getValue().asReal();
-
- F32 time = 60.0f * 60.0f * hour + 60.0f * min + sec;
- if(time <= 0) {
- time = 1;
- }
- LLWLParamManager::instance()->mDay.mDayRate = time;
-
- syncTrack();
-}
-
-void LLFloaterDayCycle::onAddKey(LLUICtrl* ctrl)
-{
- LLComboBox* comboBox = getChild<LLComboBox>(
- "WLKeyPresets");
- LLMultiSliderCtrl* kSldr = getChild<LLMultiSliderCtrl>(
- "WLDayCycleKeys");
- LLMultiSliderCtrl* tSldr = getChild<LLMultiSliderCtrl>(
- "WLTimeSlider");
-
- llassert_always(sSliderToKey.size() == kSldr->getValue().size());
-
- // get the values
- std::string newPreset(comboBox->getSelectedValue().asString());
-
- // add the slider key
- addSliderKey(tSldr->getCurSliderValue(), newPreset);
-
- syncTrack();
-}
-
-void LLFloaterDayCycle::addSliderKey(F32 time, const std::string & presetName)
-{
- LLMultiSliderCtrl* kSldr = getChild<LLMultiSliderCtrl>(
- "WLDayCycleKeys");
-
- // make a slider
- const std::string& sldrName = kSldr->addSlider(time);
- if(sldrName == "") {
- return;
- }
-
- // set the key
- LLWLSkyKey newKey;
- newKey.presetName = presetName;
- newKey.time = kSldr->getCurSliderValue();
-
- llassert_always(sldrName != LLStringUtil::null);
-
- // add to map
- sSliderToKey.insert(std::pair<std::string, LLWLSkyKey>(sldrName, newKey));
-
- llassert_always(sSliderToKey.size() == kSldr->getValue().size());
-
-}
-
-void LLFloaterDayCycle::deletePreset(std::string& presetName)
-{
- LLMultiSliderCtrl* sldr = getChild<LLMultiSliderCtrl>("WLDayCycleKeys");
-
- /// delete any reference
- std::map<std::string, LLWLSkyKey>::iterator curr_preset, next_preset;
- for(curr_preset = sSliderToKey.begin(); curr_preset != sSliderToKey.end(); curr_preset = next_preset)
- {
- next_preset = curr_preset;
- ++next_preset;
- if (curr_preset->second.presetName == presetName)
- {
- sldr->deleteSlider(curr_preset->first);
- sSliderToKey.erase(curr_preset);
- }
- }
-}
-
-void LLFloaterDayCycle::onDeleteKey(LLUICtrl* ctrl)
-{
- if(sSliderToKey.size() == 0) {
- return;
- }
-
- LLComboBox* comboBox = getChild<LLComboBox>(
- "WLKeyPresets");
- LLMultiSliderCtrl* sldr = getChild<LLMultiSliderCtrl>("WLDayCycleKeys");
-
- // delete from map
- const std::string& sldrName = sldr->getCurSlider();
- std::map<std::string, LLWLSkyKey>::iterator mIt = sSliderToKey.find(sldrName);
- sSliderToKey.erase(mIt);
-
- sldr->deleteCurSlider();
-
- if(sSliderToKey.size() == 0) {
- return;
- }
-
- const std::string& name = sldr->getCurSlider();
- comboBox->selectByValue(sSliderToKey[name].presetName);
- F32 time = sSliderToKey[name].time;
-
- LLSpinCtrl* hourSpin = getChild<LLSpinCtrl>("WLCurKeyHour");
- LLSpinCtrl* minSpin = getChild<LLSpinCtrl>("WLCurKeyMin");
-
- // now set the spinners
- F32 hour = (F32)((S32)time);
- F32 min = (time - hour) / 60;
- hourSpin->set(hour);
- minSpin->set(min);
-
- syncTrack();
-
-}
diff --git a/indra/newview/llfloaterdaycycle.h b/indra/newview/llfloaterdaycycle.h
deleted file mode 100644
index 993ddb8f07..0000000000
--- a/indra/newview/llfloaterdaycycle.h
+++ /dev/null
@@ -1,120 +0,0 @@
-/**
- * @file llfloaterdaycycle.h
- * @brief LLFloaterDayCycle class definition
- *
- * $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_LLFLOATERDAYCYCLE_H
-#define LL_LLFLOATERDAYCYCLE_H
-
-#include "llfloater.h"
-
-#include <vector>
-#include "llwlparamset.h"
-#include "llwlanimator.h"
-
-struct WLColorControl;
-struct WLFloatControl;
-
-/// convenience class for holding keys mapped to sliders
-struct LLWLSkyKey
-{
-public:
- std::string presetName;
- F32 time;
-};
-
-/// Menu for all of windlight's functionality.
-/// Menuing system for adjusting the atmospheric settings of the world.
-class LLFloaterDayCycle : public LLFloater
-{
-public:
-
- LLFloaterDayCycle(const LLSD& key);
- virtual ~LLFloaterDayCycle();
- /*virtual*/ BOOL postBuild();
-
- /// initialize all
- void initCallbacks(void);
-
- /// on time slider moved
- void onTimeSliderMoved(LLUICtrl* ctrl);
-
- /// what happens when you move the key frame
- void onKeyTimeMoved(LLUICtrl* ctrl);
-
- /// what happens when you change the key frame's time
- void onKeyTimeChanged(LLUICtrl* ctrl);
-
- /// if you change the combo box, change the frame
- void onKeyPresetChanged(LLUICtrl* ctrl);
-
- /// run this when user says to run the sky animation
- void onRunAnimSky(LLUICtrl* ctrl);
-
- /// run this when user says to stop the sky animation
- void onStopAnimSky(LLUICtrl* ctrl);
-
- /// if you change the combo box, change the frame
- void onTimeRateChanged(LLUICtrl* ctrl);
-
- /// add a new key on slider
- void onAddKey(LLUICtrl* ctrl);
-
- /// delete any and all reference to a preset
- void deletePreset(std::string& presetName);
-
- /// delete a key frame
- void onDeleteKey(LLUICtrl* ctrl);
-
- /// button to load day
- void onLoadDayCycle(LLUICtrl* ctrl);
-
- /// button to save day
- void onSaveDayCycle(LLUICtrl* ctrl);
-
- /// toggle for Linden time
- void onUseLindenTime(LLUICtrl* ctrl);
-
- /// sync up sliders with day cycle structure
- void syncMenu();
-
- // makes sure key slider has what's in day cycle
- void syncSliderTrack();
-
- /// makes sure day cycle data structure has what's in menu
- void syncTrack();
-
- /// add a slider to the track
- void addSliderKey(F32 time, const std::string& presetName);
-
-private:
-
- // map of sliders to parameters
- static std::map<std::string, LLWLSkyKey> sSliderToKey;
-
- static const F32 sHoursPerDay;
-};
-
-
-#endif
diff --git a/indra/newview/llfloaterdeleteenvpreset.cpp b/indra/newview/llfloaterdeleteenvpreset.cpp
new file mode 100644
index 0000000000..d08aa81cfe
--- /dev/null
+++ b/indra/newview/llfloaterdeleteenvpreset.cpp
@@ -0,0 +1,285 @@
+/**
+ * @file llfloaterdeleteenvpreset.cpp
+ * @brief Floater to delete a water / sky / day cycle preset.
+ *
+ * $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 "llfloaterdeleteenvpreset.h"
+
+// libs
+#include "llbutton.h"
+#include "llcombobox.h"
+#include "llnotificationsutil.h"
+
+// newview
+#include "lldaycyclemanager.h"
+#include "llwaterparammanager.h"
+
+static bool confirmation_callback(const LLSD& notification, const LLSD& response, boost::function<void()> cb)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ if (option == 0)
+ {
+ cb();
+ }
+ return false;
+
+}
+
+LLFloaterDeleteEnvPreset::LLFloaterDeleteEnvPreset(const LLSD &key)
+: LLFloater(key)
+, mPresetCombo(NULL)
+{
+}
+
+// virtual
+BOOL LLFloaterDeleteEnvPreset::postBuild()
+{
+ mPresetCombo = getChild<LLComboBox>("preset_combo");
+ mPresetCombo->setCommitCallback(boost::bind(&LLFloaterDeleteEnvPreset::postPopulate, this));
+
+ getChild<LLButton>("delete")->setCommitCallback(boost::bind(&LLFloaterDeleteEnvPreset::onBtnDelete, this));
+ getChild<LLButton>("cancel")->setCommitCallback(boost::bind(&LLFloaterDeleteEnvPreset::onBtnCancel, this));
+
+ // Listen to user preferences change, in which case we need to rebuild the presets list
+ // to disable the [new] current preset.
+ LLEnvManagerNew::instance().setPreferencesChangeCallback(boost::bind(&LLFloaterDeleteEnvPreset::populatePresetsList, this));
+
+ // Listen to presets addition/removal.
+ LLDayCycleManager::instance().setModifyCallback(boost::bind(&LLFloaterDeleteEnvPreset::populateDayCyclesList, this));
+ LLWLParamManager::instance().setPresetListChangeCallback(boost::bind(&LLFloaterDeleteEnvPreset::populateSkyPresetsList, this));
+ LLWaterParamManager::instance().setPresetListChangeCallback(boost::bind(&LLFloaterDeleteEnvPreset::populateWaterPresetsList, this));
+
+ return TRUE;
+}
+
+// virtual
+void LLFloaterDeleteEnvPreset::onOpen(const LLSD& key)
+{
+ std::string param = key.asString();
+ std::string floater_title = getString(std::string("title_") + param);
+ std::string combo_label = getString(std::string("label_" + param));
+
+ // Update floater title.
+ setTitle(floater_title);
+
+ // Update the combobox label.
+ getChild<LLUICtrl>("label")->setValue(combo_label);
+
+ // Populate the combobox.
+ populatePresetsList();
+}
+
+void LLFloaterDeleteEnvPreset::onBtnDelete()
+{
+ std::string param = mKey.asString();
+ std::string preset_name = mPresetCombo->getValue().asString();
+ boost::function<void()> confirm_cb;
+
+ if (param == "water")
+ {
+ // Don't allow deleting system presets.
+ if (LLWaterParamManager::instance().isSystemPreset(preset_name))
+ {
+ LLNotificationsUtil::add("WLNoEditDefault");
+ return;
+ }
+
+ confirm_cb = boost::bind(&LLFloaterDeleteEnvPreset::onDeleteWaterPresetConfirmation, this);
+ }
+ else if (param == "sky")
+ {
+ // Don't allow deleting presets referenced by local day cycles.
+ if (LLDayCycleManager::instance().isSkyPresetReferenced(preset_name))
+ {
+ LLNotificationsUtil::add("GenericAlert", LLSD().with("MESSAGE", getString("msg_sky_is_referenced")));
+ return;
+ }
+
+ LLWLParamManager& wl_mgr = LLWLParamManager::instance();
+
+ // Don't allow deleting system presets.
+ if (wl_mgr.isSystemPreset(preset_name))
+ {
+ LLNotificationsUtil::add("WLNoEditDefault");
+ return;
+ }
+
+ confirm_cb = boost::bind(&LLFloaterDeleteEnvPreset::onDeleteSkyPresetConfirmation, this);
+ }
+ else if (param == "day_cycle")
+ {
+ LLDayCycleManager& day_mgr = LLDayCycleManager::instance();
+
+ // Don't allow deleting system presets.
+ if (day_mgr.isSystemPreset(preset_name))
+ {
+ LLNotificationsUtil::add("WLNoEditDefault");
+ return;
+ }
+
+ confirm_cb = boost::bind(&LLFloaterDeleteEnvPreset::onDeleteDayCycleConfirmation, this);
+ }
+ else
+ {
+ llwarns << "Unrecognized key" << llendl;
+ }
+
+ LLSD args;
+ args["MESSAGE"] = getString("msg_confirm_deletion");
+ LLNotificationsUtil::add("GenericAlertYesCancel", args, LLSD(),
+ boost::bind(&confirmation_callback, _1, _2, confirm_cb));
+}
+
+void LLFloaterDeleteEnvPreset::onBtnCancel()
+{
+ closeFloater();
+}
+
+void LLFloaterDeleteEnvPreset::populatePresetsList()
+{
+ std::string param = mKey.asString();
+
+ if (param == "water")
+ {
+ populateWaterPresetsList();
+ }
+ else if (param == "sky")
+ {
+ populateSkyPresetsList();
+ }
+ else if (param == "day_cycle")
+ {
+ populateDayCyclesList();
+ }
+ else
+ {
+ llwarns << "Unrecognized key" << llendl;
+ }
+}
+
+void LLFloaterDeleteEnvPreset::populateWaterPresetsList()
+{
+ if (mKey.asString() != "water") return;
+
+ mPresetCombo->removeall();
+
+ std::string cur_preset;
+ LLEnvManagerNew& env_mgr = LLEnvManagerNew::instance();
+ if (!env_mgr.getUseRegionSettings())
+ {
+ cur_preset = env_mgr.getWaterPresetName();
+ }
+
+ LLWaterParamManager::preset_name_list_t presets;
+ LLWaterParamManager::instance().getUserPresetNames(presets); // list only user presets
+ for (LLWaterParamManager::preset_name_list_t::const_iterator it = presets.begin(); it != presets.end(); ++it)
+ {
+ std::string name = *it;
+
+ bool enabled = (name != cur_preset); // don't allow deleting current preset
+ mPresetCombo->add(name, ADD_BOTTOM, enabled);
+ }
+
+ postPopulate();
+}
+
+void LLFloaterDeleteEnvPreset::populateSkyPresetsList()
+{
+ if (mKey.asString() != "sky") return;
+
+ mPresetCombo->removeall();
+
+ std::string cur_preset;
+ LLEnvManagerNew& env_mgr = LLEnvManagerNew::instance();
+ if (!env_mgr.getUseRegionSettings() && env_mgr.getUseFixedSky())
+ {
+ cur_preset = env_mgr.getSkyPresetName();
+ }
+
+ LLWLParamManager::preset_name_list_t user_presets;
+ LLWLParamManager::instance().getUserPresetNames(user_presets);
+ for (LLWLParamManager::preset_name_list_t::const_iterator it = user_presets.begin(); it != user_presets.end(); ++it)
+ {
+ const std::string& name = *it;
+ mPresetCombo->add(name, ADD_BOTTOM, /*enabled = */ name != cur_preset);
+ }
+
+ postPopulate();
+}
+
+void LLFloaterDeleteEnvPreset::populateDayCyclesList()
+{
+ if (mKey.asString() != "day_cycle") return;
+
+ mPresetCombo->removeall();
+
+ std::string cur_day;
+ LLEnvManagerNew& env_mgr = LLEnvManagerNew::instance();
+ if (!env_mgr.getUseRegionSettings() && env_mgr.getUseDayCycle())
+ {
+ cur_day = env_mgr.getDayCycleName();
+ }
+
+ LLDayCycleManager& day_mgr = LLDayCycleManager::instance();
+ LLDayCycleManager::preset_name_list_t user_days;
+ day_mgr.getUserPresetNames(user_days); // list only user presets
+ for (LLDayCycleManager::preset_name_list_t::const_iterator it = user_days.begin(); it != user_days.end(); ++it)
+ {
+ const std::string& name = *it;
+ mPresetCombo->add(name, ADD_BOTTOM, name != cur_day);
+ }
+
+ postPopulate();
+}
+
+void LLFloaterDeleteEnvPreset::postPopulate()
+{
+ // Handle empty list and empty selection.
+ bool has_selection = mPresetCombo->getItemCount() > 0 && mPresetCombo->getSelectedValue().isDefined();
+
+ if (!has_selection)
+ {
+ mPresetCombo->setLabel(getString("combo_label"));
+ }
+
+ getChild<LLButton>("delete")->setEnabled(has_selection);
+}
+
+void LLFloaterDeleteEnvPreset::onDeleteDayCycleConfirmation()
+{
+ LLDayCycleManager::instance().deletePreset(mPresetCombo->getValue().asString());
+}
+
+void LLFloaterDeleteEnvPreset::onDeleteSkyPresetConfirmation()
+{
+ LLWLParamKey key(mPresetCombo->getValue().asString(), LLEnvKey::SCOPE_LOCAL);
+ LLWLParamManager::instance().removeParamSet(key, true);
+}
+
+void LLFloaterDeleteEnvPreset::onDeleteWaterPresetConfirmation()
+{
+ LLWaterParamManager::instance().removeParamSet(mPresetCombo->getValue().asString(), true);
+}
diff --git a/indra/newview/llfloaterdeleteenvpreset.h b/indra/newview/llfloaterdeleteenvpreset.h
new file mode 100644
index 0000000000..1211505273
--- /dev/null
+++ b/indra/newview/llfloaterdeleteenvpreset.h
@@ -0,0 +1,62 @@
+/**
+ * @file llfloaterdeleteenvpreset.h
+ * @brief Floater to delete a water / sky / day cycle preset.
+ *
+ * $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_LLFLOATERDELETEENVPRESET_H
+#define LL_LLFLOATERDELETEENVPRESET_H
+
+#include "llfloater.h"
+
+class LLComboBox;
+
+class LLFloaterDeleteEnvPreset : public LLFloater
+{
+ LOG_CLASS(LLFloaterDeleteEnvPreset);
+
+public:
+ LLFloaterDeleteEnvPreset(const LLSD &key);
+
+ /*virtual*/ BOOL postBuild();
+ /*virtual*/ void onOpen(const LLSD& key);
+
+ void onBtnDelete();
+ void onBtnCancel();
+
+private:
+ void populatePresetsList();
+ void populateWaterPresetsList();
+ void populateSkyPresetsList();
+ void populateDayCyclesList();
+
+ void postPopulate();
+
+ void onDeleteDayCycleConfirmation();
+ void onDeleteSkyPresetConfirmation();
+ void onDeleteWaterPresetConfirmation();
+
+ LLComboBox* mPresetCombo;
+};
+
+#endif // LL_LLFLOATERDELETEENVPRESET_H
diff --git a/indra/newview/llfloatereditdaycycle.cpp b/indra/newview/llfloatereditdaycycle.cpp
new file mode 100644
index 0000000000..b63677b258
--- /dev/null
+++ b/indra/newview/llfloatereditdaycycle.cpp
@@ -0,0 +1,825 @@
+/**
+ * @file llfloatereditdaycycle.cpp
+ * @brief Floater to create or edit a day cycle
+ *
+ * $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 "llfloatereditdaycycle.h"
+
+// libs
+#include "llbutton.h"
+#include "llcheckboxctrl.h"
+#include "llcombobox.h"
+#include "llloadingindicator.h"
+#include "llmultisliderctrl.h"
+#include "llnotifications.h"
+#include "llnotificationsutil.h"
+#include "llspinctrl.h"
+#include "lltimectrl.h"
+
+// newview
+#include "llagent.h"
+#include "lldaycyclemanager.h"
+#include "llenvmanager.h"
+#include "llregioninfomodel.h"
+#include "llviewerregion.h"
+#include "llwlparammanager.h"
+
+const F32 LLFloaterEditDayCycle::sHoursPerDay = 24.0f;
+
+LLFloaterEditDayCycle::LLFloaterEditDayCycle(const LLSD &key)
+: LLFloater(key)
+, mDayCycleNameEditor(NULL)
+, mDayCyclesCombo(NULL)
+, mTimeSlider(NULL)
+, mKeysSlider(NULL)
+, mSkyPresetsCombo(NULL)
+, mTimeCtrl(NULL)
+, mMakeDefaultCheckBox(NULL)
+, mSaveButton(NULL)
+{
+}
+
+// virtual
+BOOL LLFloaterEditDayCycle::postBuild()
+{
+ mDayCycleNameEditor = getChild<LLLineEditor>("day_cycle_name");
+ mDayCyclesCombo = getChild<LLComboBox>("day_cycle_combo");
+
+ mTimeSlider = getChild<LLMultiSliderCtrl>("WLTimeSlider");
+ mKeysSlider = getChild<LLMultiSliderCtrl>("WLDayCycleKeys");
+ mSkyPresetsCombo = getChild<LLComboBox>("WLSkyPresets");
+ mTimeCtrl = getChild<LLTimeCtrl>("time");
+ mSaveButton = getChild<LLButton>("save");
+ mMakeDefaultCheckBox = getChild<LLCheckBoxCtrl>("make_default_cb");
+
+ initCallbacks();
+
+ // add the time slider
+ mTimeSlider->addSlider();
+
+ return TRUE;
+}
+
+// virtual
+void LLFloaterEditDayCycle::onOpen(const LLSD& key)
+{
+ bool new_day = isNewDay();
+ std::string param = key.asString();
+ std::string floater_title = getString(std::string("title_") + param);
+ std::string hint = getString(std::string("hint_" + param));
+
+ // Update floater title.
+ setTitle(floater_title);
+
+ // Update the hint at the top.
+ getChild<LLUICtrl>("hint")->setValue(hint);
+
+ // Hide the hint to the right of the combo if we're invoked to create a new preset.
+ getChildView("note")->setVisible(!new_day);
+
+ // Switch between the day cycle presets combobox and day cycle name input field.
+ mDayCyclesCombo->setVisible(!new_day);
+ mDayCycleNameEditor->setVisible(new_day);
+
+ // TODO: Make sure only one instance of the floater exists?
+
+ reset();
+}
+
+// virtual
+void LLFloaterEditDayCycle::onClose(bool app_quitting)
+{
+ if (!app_quitting) // there's no point to change environment if we're quitting
+ {
+ LLEnvManagerNew::instance().usePrefs(); // revert changes made to current day cycle
+ }
+}
+
+// virtual
+void LLFloaterEditDayCycle::draw()
+{
+ syncTimeSlider();
+ LLFloater::draw();
+}
+
+void LLFloaterEditDayCycle::initCallbacks(void)
+{
+ mDayCycleNameEditor->setKeystrokeCallback(boost::bind(&LLFloaterEditDayCycle::onDayCycleNameEdited, this), NULL);
+ mDayCyclesCombo->setCommitCallback(boost::bind(&LLFloaterEditDayCycle::onDayCycleSelected, this));
+ mDayCyclesCombo->setTextEntryCallback(boost::bind(&LLFloaterEditDayCycle::onDayCycleNameEdited, this));
+ mTimeSlider->setCommitCallback(boost::bind(&LLFloaterEditDayCycle::onTimeSliderMoved, this));
+ mKeysSlider->setCommitCallback(boost::bind(&LLFloaterEditDayCycle::onKeyTimeMoved, this));
+ mTimeCtrl->setCommitCallback(boost::bind(&LLFloaterEditDayCycle::onKeyTimeChanged, this));
+ mSkyPresetsCombo->setCommitCallback(boost::bind(&LLFloaterEditDayCycle::onKeyPresetChanged, this));
+
+ getChild<LLButton>("WLAddKey")->setClickedCallback(boost::bind(&LLFloaterEditDayCycle::onAddKey, this));
+ getChild<LLButton>("WLDeleteKey")->setClickedCallback(boost::bind(&LLFloaterEditDayCycle::onDeleteKey, this));
+
+ mSaveButton->setCommitCallback(boost::bind(&LLFloaterEditDayCycle::onBtnSave, this));
+ mSaveButton->setRightMouseDownCallback(boost::bind(&LLFloaterEditDayCycle::dumpTrack, this));
+ getChild<LLButton>("cancel")->setCommitCallback(boost::bind(&LLFloaterEditDayCycle::onBtnCancel, this));
+
+ // Connect to env manager events.
+ LLEnvManagerNew& env_mgr = LLEnvManagerNew::instance();
+ env_mgr.setRegionSettingsChangeCallback(boost::bind(&LLFloaterEditDayCycle::onRegionSettingsChange, this));
+ env_mgr.setRegionChangeCallback(boost::bind(&LLFloaterEditDayCycle::onRegionChange, this));
+ env_mgr.setRegionSettingsAppliedCallback(boost::bind(&LLFloaterEditDayCycle::onRegionSettingsApplied, this, _1));
+
+ // Connect to day cycle manager events.
+ LLDayCycleManager::instance().setModifyCallback(boost::bind(&LLFloaterEditDayCycle::onDayCycleListChange, this));
+
+ // Connect to sky preset list changes.
+ LLWLParamManager::instance().setPresetListChangeCallback(boost::bind(&LLFloaterEditDayCycle::onSkyPresetListChange, this));
+
+ // Connect to region info updates.
+ LLRegionInfoModel::instance().setUpdateCallback(boost::bind(&LLFloaterEditDayCycle::onRegionInfoUpdate, this));
+}
+
+void LLFloaterEditDayCycle::syncTimeSlider()
+{
+ // set time
+ mTimeSlider->setCurSliderValue((F32)LLWLParamManager::getInstance()->mAnimator.getDayTime() * sHoursPerDay);
+}
+
+void LLFloaterEditDayCycle::loadTrack()
+{
+ // clear the slider
+ mKeysSlider->clear();
+ mSliderToKey.clear();
+
+ // add sliders
+
+ lldebugs << "Adding " << LLWLParamManager::getInstance()->mDay.mTimeMap.size() << " keys to slider" << llendl;
+
+ LLWLDayCycle& cur_dayp = LLWLParamManager::instance().mDay;
+ for (std::map<F32, LLWLParamKey>::iterator it = cur_dayp.mTimeMap.begin(); it != cur_dayp.mTimeMap.end(); ++it)
+ {
+ addSliderKey(it->first * sHoursPerDay, it->second);
+ }
+
+ // set drop-down menu to match preset of currently-selected keyframe (one is automatically selected initially)
+ const std::string& cur_sldr = mKeysSlider->getCurSlider();
+ if (strlen(cur_sldr.c_str()) > 0) // only do this if there is a curSldr, otherwise we put an invalid entry into the map
+ {
+ mSkyPresetsCombo->selectByValue(mSliderToKey[cur_sldr].keyframe.toStringVal());
+ }
+
+ syncTimeSlider();
+}
+
+void LLFloaterEditDayCycle::applyTrack()
+{
+ lldebugs << "Applying track (" << mSliderToKey.size() << ")" << llendl;
+
+ // if no keys, do nothing
+ if (mSliderToKey.size() == 0)
+ {
+ lldebugs << "No keys, not syncing" << llendl;
+ return;
+ }
+
+ llassert_always(mSliderToKey.size() == mKeysSlider->getValue().size());
+
+ // create a new animation track
+ LLWLParamManager::getInstance()->mDay.clearKeyframes();
+
+ // add the keys one by one
+ for (std::map<std::string, SliderKey>::iterator it = mSliderToKey.begin();
+ it != mSliderToKey.end(); ++it)
+ {
+ LLWLParamManager::getInstance()->mDay.addKeyframe(it->second.time / sHoursPerDay,
+ it->second.keyframe);
+ }
+
+ // set the param manager's track to the new one
+ LLWLParamManager::getInstance()->resetAnimator(
+ mTimeSlider->getCurSliderValue() / sHoursPerDay, false);
+
+ LLWLParamManager::getInstance()->mAnimator.update(
+ LLWLParamManager::getInstance()->mCurParams);
+}
+
+void LLFloaterEditDayCycle::refreshSkyPresetsList()
+{
+ // Don't allow selecting region skies for a local day cycle,
+ // because thus we may end up with invalid day cycle.
+ bool include_region_skies = getSelectedDayCycle().scope == LLEnvKey::SCOPE_REGION;
+
+ mSkyPresetsCombo->removeall();
+
+ LLWLParamManager::preset_name_list_t region_presets;
+ LLWLParamManager::preset_name_list_t user_presets, sys_presets;
+ LLWLParamManager::instance().getPresetNames(region_presets, user_presets, sys_presets);
+
+ if (include_region_skies)
+ {
+ // Add region presets.
+ for (LLWLParamManager::preset_name_list_t::const_iterator it = region_presets.begin(); it != region_presets.end(); ++it)
+ {
+ std::string preset_name = *it;
+ std::string item_title = preset_name + " (" + getRegionName() + ")";
+ mSkyPresetsCombo->add(preset_name, LLWLParamKey(*it, LLEnvKey::SCOPE_REGION).toStringVal());
+ }
+
+ if (!region_presets.empty())
+ {
+ mSkyPresetsCombo->addSeparator();
+ }
+ }
+
+ // Add user presets.
+ for (LLWLParamManager::preset_name_list_t::const_iterator it = user_presets.begin(); it != user_presets.end(); ++it)
+ {
+ mSkyPresetsCombo->add(*it, LLWLParamKey(*it, LLEnvKey::SCOPE_LOCAL).toStringVal());
+ }
+
+ if (!user_presets.empty())
+ {
+ mSkyPresetsCombo->addSeparator();
+ }
+
+ // Add system presets.
+ for (LLWLParamManager::preset_name_list_t::const_iterator it = sys_presets.begin(); it != sys_presets.end(); ++it)
+ {
+ mSkyPresetsCombo->add(*it, LLWLParamKey(*it, LLEnvKey::SCOPE_LOCAL).toStringVal());
+ }
+
+ // set defaults on combo boxes
+ mSkyPresetsCombo->selectFirstItem();
+}
+
+void LLFloaterEditDayCycle::refreshDayCyclesList()
+{
+ llassert(isNewDay() == false);
+
+ mDayCyclesCombo->removeall();
+
+#if 0 // Disable editing existing day cycle until the workflow is clear enough.
+ const LLSD& region_day = LLEnvManagerNew::instance().getRegionSettings().getWLDayCycle();
+ if (region_day.size() > 0)
+ {
+ LLWLParamKey key(getRegionName(), LLEnvKey::SCOPE_REGION);
+ mDayCyclesCombo->add(key.name, key.toLLSD());
+ mDayCyclesCombo->addSeparator();
+ }
+#endif
+
+ LLDayCycleManager::preset_name_list_t user_days, sys_days;
+ LLDayCycleManager::instance().getPresetNames(user_days, sys_days);
+
+ // Add user days.
+ for (LLDayCycleManager::preset_name_list_t::const_iterator it = user_days.begin(); it != user_days.end(); ++it)
+ {
+ mDayCyclesCombo->add(*it, LLWLParamKey(*it, LLEnvKey::SCOPE_LOCAL).toLLSD());
+ }
+
+ if (user_days.size() > 0)
+ {
+ mDayCyclesCombo->addSeparator();
+ }
+
+ // Add system days.
+ for (LLDayCycleManager::preset_name_list_t::const_iterator it = sys_days.begin(); it != sys_days.end(); ++it)
+ {
+ mDayCyclesCombo->add(*it, LLWLParamKey(*it, LLEnvKey::SCOPE_LOCAL).toLLSD());
+ }
+
+ mDayCyclesCombo->setLabel(getString("combo_label"));
+}
+
+void LLFloaterEditDayCycle::onTimeSliderMoved()
+{
+ /// get the slider value
+ F32 val = mTimeSlider->getCurSliderValue() / sHoursPerDay;
+
+ // set the value, turn off animation
+ LLWLParamManager::getInstance()->mAnimator.setDayTime((F64)val);
+ LLWLParamManager::getInstance()->mAnimator.deactivate();
+
+ // then call update once
+ LLWLParamManager::getInstance()->mAnimator.update(
+ LLWLParamManager::getInstance()->mCurParams);
+}
+
+void LLFloaterEditDayCycle::onKeyTimeMoved()
+{
+ if (mKeysSlider->getValue().size() == 0)
+ {
+ return;
+ }
+
+ // make sure we have a slider
+ const std::string& cur_sldr = mKeysSlider->getCurSlider();
+ if (cur_sldr == "")
+ {
+ return;
+ }
+
+ F32 time24 = mKeysSlider->getCurSliderValue();
+
+ // check to see if a key exists
+ LLWLParamKey key = mSliderToKey[cur_sldr].keyframe;
+ lldebugs << "Setting key time: " << time24 << LL_ENDL;
+ mSliderToKey[cur_sldr].time = time24;
+
+ // if it exists, turn on check box
+ mSkyPresetsCombo->selectByValue(key.toStringVal());
+
+ mTimeCtrl->setTime24(time24);
+
+ applyTrack();
+}
+
+void LLFloaterEditDayCycle::onKeyTimeChanged()
+{
+ // if no keys, skipped
+ if (mSliderToKey.size() == 0)
+ {
+ return;
+ }
+
+ F32 time24 = mTimeCtrl->getTime24();
+
+ const std::string& cur_sldr = mKeysSlider->getCurSlider();
+ mKeysSlider->setCurSliderValue(time24, TRUE);
+ F32 time = mKeysSlider->getCurSliderValue() / sHoursPerDay;
+
+ // now set the key's time in the sliderToKey map
+ lldebugs << "Setting key time: " << time << LL_ENDL;
+ mSliderToKey[cur_sldr].time = time;
+
+ applyTrack();
+}
+
+void LLFloaterEditDayCycle::onKeyPresetChanged()
+{
+ // do nothing if no sliders
+ if (mKeysSlider->getValue().size() == 0)
+ {
+ return;
+ }
+
+ // change the map
+
+ std::string stringVal = mSkyPresetsCombo->getSelectedValue().asString();
+ LLWLParamKey new_key(stringVal);
+ llassert(!new_key.name.empty());
+ const std::string& cur_sldr = mKeysSlider->getCurSlider();
+
+ // if null, don't use
+ if (cur_sldr == "")
+ {
+ return;
+ }
+
+ mSliderToKey[cur_sldr].keyframe = new_key;
+
+ // Apply changes to current day cycle.
+ applyTrack();
+}
+
+void LLFloaterEditDayCycle::onAddKey()
+{
+ llassert_always(mSliderToKey.size() == mKeysSlider->getValue().size());
+
+ S32 max_sliders;
+ LLEnvKey::EScope scope = LLEnvKey::SCOPE_LOCAL; // *TODO: editing region day cycle
+ switch (scope)
+ {
+ case LLEnvKey::SCOPE_LOCAL:
+ max_sliders = 20; // *HACK this should be LLWLPacketScrubber::MAX_LOCAL_KEY_FRAMES;
+ break;
+ case LLEnvKey::SCOPE_REGION:
+ max_sliders = 12; // *HACK this should be LLWLPacketScrubber::MAX_REGION_KEY_FRAMES;
+ break;
+ default:
+ max_sliders = (S32) mKeysSlider->getMaxValue();
+ break;
+ }
+
+ if ((S32)mSliderToKey.size() >= max_sliders)
+ {
+ LLSD args;
+ args["SCOPE"] = LLEnvManagerNew::getScopeString(scope);
+ args["MAX"] = max_sliders;
+ LLNotificationsUtil::add("DayCycleTooManyKeyframes", args, LLSD(), LLNotificationFunctorRegistry::instance().DONOTHING);
+ return;
+ }
+
+ // add the slider key
+ std::string key_val = mSkyPresetsCombo->getSelectedValue().asString();
+ LLWLParamKey sky_params(key_val);
+ llassert(!sky_params.name.empty());
+
+ F32 time = mTimeSlider->getCurSliderValue();
+ addSliderKey(time, sky_params);
+
+ // apply the change to current day cycles
+ applyTrack();
+}
+
+void LLFloaterEditDayCycle::addSliderKey(F32 time, LLWLParamKey keyframe)
+{
+ // make a slider
+ const std::string& sldr_name = mKeysSlider->addSlider(time);
+ if (sldr_name.empty())
+ {
+ return;
+ }
+
+ // set the key
+ SliderKey newKey(keyframe, mKeysSlider->getCurSliderValue());
+
+ llassert_always(sldr_name != LLStringUtil::null);
+
+ // add to map
+ mSliderToKey.insert(std::pair<std::string, SliderKey>(sldr_name, newKey));
+
+ llassert_always(mSliderToKey.size() == mKeysSlider->getValue().size());
+}
+
+LLWLParamKey LLFloaterEditDayCycle::getSelectedDayCycle()
+{
+ LLWLParamKey dc_key;
+
+ if (mDayCycleNameEditor->getVisible())
+ {
+ dc_key.name = mDayCycleNameEditor->getText();
+ dc_key.scope = LLEnvKey::SCOPE_LOCAL;
+ }
+ else
+ {
+ LLSD combo_val = mDayCyclesCombo->getValue();
+
+ if (!combo_val.isArray()) // manually typed text
+ {
+ dc_key.name = combo_val.asString();
+ dc_key.scope = LLEnvKey::SCOPE_LOCAL;
+ }
+ else
+ {
+ dc_key.fromLLSD(combo_val);
+ }
+ }
+
+ return dc_key;
+}
+
+bool LLFloaterEditDayCycle::isNewDay() const
+{
+ return mKey.asString() == "new";
+}
+
+void LLFloaterEditDayCycle::dumpTrack()
+{
+ LL_DEBUGS("Windlight") << "Dumping day cycle" << LL_ENDL;
+
+ LLWLDayCycle& cur_dayp = LLWLParamManager::instance().mDay;
+ for (std::map<F32, LLWLParamKey>::iterator it = cur_dayp.mTimeMap.begin(); it != cur_dayp.mTimeMap.end(); ++it)
+ {
+ F32 time = it->first * 24.0f;
+ S32 h = (S32) time;
+ S32 m = (S32) ((time - h) * 60.0f);
+ LL_DEBUGS("Windlight") << llformat("(%.3f) %02d:%02d", time, h, m) << " => " << it->second.name << LL_ENDL;
+ }
+}
+
+void LLFloaterEditDayCycle::enableEditing(bool enable)
+{
+ mSkyPresetsCombo->setEnabled(enable);
+ mTimeCtrl->setEnabled(enable);
+ getChild<LLPanel>("day_cycle_slider_panel")->setCtrlsEnabled(enable);
+ mSaveButton->setEnabled(enable);
+ mMakeDefaultCheckBox->setEnabled(enable);
+}
+
+void LLFloaterEditDayCycle::reset()
+{
+ // clear the slider
+ mKeysSlider->clear();
+ mSliderToKey.clear();
+
+ refreshSkyPresetsList();
+
+ if (isNewDay())
+ {
+ mDayCycleNameEditor->setValue(LLSD());
+ F32 time = 0.5f * sHoursPerDay;
+ mSaveButton->setEnabled(FALSE); // will be enabled as soon as users enters a name
+ mTimeSlider->setCurSliderValue(time);
+
+ addSliderKey(time, LLWLParamKey("Default", LLEnvKey::SCOPE_LOCAL));
+ onKeyTimeMoved(); // update the time control and sky sky combo
+
+ applyTrack();
+ }
+ else
+ {
+ refreshDayCyclesList();
+
+ // Disable controls until a day cycle to edit is selected.
+ enableEditing(false);
+ }
+}
+
+void LLFloaterEditDayCycle::saveRegionDayCycle()
+{
+ LLEnvManagerNew& env_mgr = LLEnvManagerNew::instance();
+ LLWLDayCycle& cur_dayp = LLWLParamManager::instance().mDay; // the day cycle being edited
+
+ // Get current day cycle and the sky preset it references.
+ LLSD day_cycle = cur_dayp.asLLSD();
+ LLSD sky_map;
+ cur_dayp.getSkyMap(sky_map);
+
+ // Apply it to the region.
+ LLEnvironmentSettings new_region_settings;
+ new_region_settings.saveParams(day_cycle, sky_map, env_mgr.getRegionSettings().getWaterParams(), 0.0f);
+
+#if 1
+ LLEnvManagerNew::instance().setRegionSettings(new_region_settings);
+#else // Temporary disabled ability to upload new region settings from the Day Cycle Editor.
+ if (!LLEnvManagerNew::instance().sendRegionSettings(new_region_settings))
+ {
+ llwarns << "Error applying region environment settings" << llendl;
+ return;
+ }
+
+ setApplyProgress(true);
+#endif
+}
+
+void LLFloaterEditDayCycle::setApplyProgress(bool started)
+{
+ LLLoadingIndicator* indicator = getChild<LLLoadingIndicator>("progress_indicator");
+
+ indicator->setVisible(started);
+
+ if (started)
+ {
+ indicator->start();
+ }
+ else
+ {
+ indicator->stop();
+ }
+}
+
+bool LLFloaterEditDayCycle::getApplyProgress() const
+{
+ return getChild<LLLoadingIndicator>("progress_indicator")->getVisible();
+}
+
+void LLFloaterEditDayCycle::onDeleteKey()
+{
+ if (mSliderToKey.size() == 0)
+ {
+ return;
+ }
+ else if (mSliderToKey.size() == 1)
+ {
+ LLNotifications::instance().add("EnvCannotDeleteLastDayCycleKey", LLSD(), LLSD());
+ return;
+ }
+
+ // delete from map
+ const std::string& sldr_name = mKeysSlider->getCurSlider();
+ std::map<std::string, SliderKey>::iterator mIt = mSliderToKey.find(sldr_name);
+ mSliderToKey.erase(mIt);
+
+ mKeysSlider->deleteCurSlider();
+
+ if (mSliderToKey.size() == 0)
+ {
+ return;
+ }
+
+ const std::string& name = mKeysSlider->getCurSlider();
+ mSkyPresetsCombo->selectByValue(mSliderToKey[name].keyframe.toStringVal());
+ F32 time24 = mSliderToKey[name].time;
+
+ mTimeCtrl->setTime24(time24);
+
+ applyTrack();
+}
+
+void LLFloaterEditDayCycle::onRegionSettingsChange()
+{
+ LL_DEBUGS("Windlight") << "Region settings changed" << LL_ENDL;
+
+ if (getApplyProgress()) // our region settings have being applied
+ {
+ setApplyProgress(false);
+
+ // Change preference if requested.
+ if (mMakeDefaultCheckBox->getValue())
+ {
+ LL_DEBUGS("Windlight") << "Changed environment preference to region settings" << llendl;
+ LLEnvManagerNew::instance().setUseRegionSettings(true);
+ }
+
+ closeFloater();
+ }
+}
+
+void LLFloaterEditDayCycle::onRegionChange()
+{
+ LL_DEBUGS("Windlight") << "Region changed" << LL_ENDL;
+
+ // If we're editing the region day cycle
+ if (getSelectedDayCycle().scope == LLEnvKey::SCOPE_REGION)
+ {
+ reset(); // undoes all unsaved changes
+ }
+}
+
+void LLFloaterEditDayCycle::onRegionSettingsApplied(bool success)
+{
+ LL_DEBUGS("Windlight") << "Region settings applied: " << success << LL_ENDL;
+
+ if (!success)
+ {
+ // stop progress indicator
+ setApplyProgress(false);
+ }
+}
+
+void LLFloaterEditDayCycle::onRegionInfoUpdate()
+{
+ LL_DEBUGS("Windlight") << "Region info updated" << LL_ENDL;
+ bool can_edit = true;
+
+ // If we've selected the region day cycle for editing.
+ if (getSelectedDayCycle().scope == LLEnvKey::SCOPE_REGION)
+ {
+ // check whether we have the access
+ can_edit = LLEnvManagerNew::canEditRegionSettings();
+ }
+
+ enableEditing(can_edit);
+}
+
+void LLFloaterEditDayCycle::onDayCycleNameEdited()
+{
+ // Disable saving a day cycle having empty name.
+ LLWLParamKey key = getSelectedDayCycle();
+ mSaveButton->setEnabled(!key.name.empty());
+}
+
+void LLFloaterEditDayCycle::onDayCycleSelected()
+{
+ LLSD day_data;
+ LLWLParamKey dc_key = getSelectedDayCycle();
+ bool can_edit = true;
+
+ if (dc_key.scope == LLEnvKey::SCOPE_LOCAL)
+ {
+ if (!LLDayCycleManager::instance().getPreset(dc_key.name, day_data))
+ {
+ llwarns << "No day cycle named " << dc_key.name << llendl;
+ return;
+ }
+ }
+ else
+ {
+ day_data = LLEnvManagerNew::instance().getRegionSettings().getWLDayCycle();
+ if (day_data.size() == 0)
+ {
+ llwarns << "Empty region day cycle" << llendl;
+ llassert(day_data.size() > 0);
+ return;
+ }
+
+ can_edit = LLEnvManagerNew::canEditRegionSettings();
+ }
+
+ // We may need to add or remove region skies from the list.
+ refreshSkyPresetsList();
+
+ F32 slider_time = mTimeSlider->getCurSliderValue() / sHoursPerDay;
+ LLWLParamManager::instance().applyDayCycleParams(day_data, dc_key.scope, slider_time);
+ loadTrack();
+
+ enableEditing(can_edit);
+}
+
+void LLFloaterEditDayCycle::onBtnSave()
+{
+ LLDayCycleManager& day_mgr = LLDayCycleManager::instance();
+ LLWLParamKey selected_day = getSelectedDayCycle();
+
+ if (selected_day.scope == LLEnvKey::SCOPE_REGION)
+ {
+ saveRegionDayCycle();
+ closeFloater();
+ return;
+ }
+
+ std::string name = selected_day.name;
+ if (name.empty())
+ {
+ // *TODO: show an alert
+ llwarns << "Empty day cycle name" << llendl;
+ return;
+ }
+
+ // Don't allow overwriting system presets.
+ if (day_mgr.isSystemPreset(name))
+ {
+ LLNotificationsUtil::add("WLNoEditDefault");
+ return;
+ }
+
+ // Save, ask for confirmation for overwriting an existing preset.
+ if (day_mgr.presetExists(name))
+ {
+ LLNotificationsUtil::add("WLSavePresetAlert", LLSD(), LLSD(), boost::bind(&LLFloaterEditDayCycle::onSaveAnswer, this, _1, _2));
+ }
+ else
+ {
+ // new preset, hence no confirmation needed
+ onSaveConfirmed();
+ }
+}
+
+void LLFloaterEditDayCycle::onBtnCancel()
+{
+ closeFloater();
+}
+
+bool LLFloaterEditDayCycle::onSaveAnswer(const LLSD& notification, const LLSD& response)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+
+ // If they choose save, do it. Otherwise, don't do anything
+ if (option == 0)
+ {
+ onSaveConfirmed();
+ }
+
+ return false;
+}
+
+void LLFloaterEditDayCycle::onSaveConfirmed()
+{
+ std::string name = getSelectedDayCycle().name;
+
+ // Save preset.
+ LLSD data = LLWLParamManager::instance().mDay.asLLSD();
+ LL_DEBUGS("Windlight") << "Saving day cycle " << name << ": " << data << LL_ENDL;
+ LLDayCycleManager::instance().savePreset(name, data);
+
+ // Change preference if requested.
+ if (mMakeDefaultCheckBox->getValue())
+ {
+ LL_DEBUGS("Windlight") << name << " is now the new preferred day cycle" << llendl;
+ LLEnvManagerNew::instance().setUseDayCycle(name);
+ }
+
+ closeFloater();
+}
+
+void LLFloaterEditDayCycle::onDayCycleListChange()
+{
+ if (!isNewDay())
+ {
+ refreshDayCyclesList();
+ }
+}
+
+void LLFloaterEditDayCycle::onSkyPresetListChange()
+{
+ refreshSkyPresetsList();
+
+ // Refresh sliders from the currently visible day cycle.
+ loadTrack();
+}
+
+// static
+std::string LLFloaterEditDayCycle::getRegionName()
+{
+ return gAgent.getRegion() ? gAgent.getRegion()->getName() : LLTrans::getString("Unknown");
+}
diff --git a/indra/newview/llfloatereditdaycycle.h b/indra/newview/llfloatereditdaycycle.h
new file mode 100644
index 0000000000..e6e4fe39c1
--- /dev/null
+++ b/indra/newview/llfloatereditdaycycle.h
@@ -0,0 +1,137 @@
+/**
+ * @file llfloatereditdaycycle.h
+ * @brief Floater to create or edit a day cycle
+ *
+ * $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_LLFLOATEREDITDAYCYCLE_H
+#define LL_LLFLOATEREDITDAYCYCLE_H
+
+#include "llfloater.h"
+
+#include "llwlparammanager.h" // for LLWLParamKey
+
+class LLCheckBoxCtrl;
+class LLComboBox;
+class LLLineEditor;
+class LLMultiSliderCtrl;
+class LLTimeCtrl;
+
+/**
+ * Floater for creating or editing a day cycle.
+ */
+class LLFloaterEditDayCycle : public LLFloater
+{
+ LOG_CLASS(LLFloaterEditDayCycle);
+
+public:
+ LLFloaterEditDayCycle(const LLSD &key);
+
+ /*virtual*/ BOOL postBuild();
+ /*virtual*/ void onOpen(const LLSD& key);
+ /*virtual*/ void onClose(bool app_quitting);
+ /*virtual*/ void draw();
+
+private:
+
+ /// sync the time slider with day cycle structure
+ void syncTimeSlider();
+
+ // makes sure key slider has what's in day cycle
+ void loadTrack();
+
+ /// makes sure day cycle data structure has what's in menu
+ void applyTrack();
+
+ /// refresh the sky presets combobox
+ void refreshSkyPresetsList();
+
+ /// refresh the day cycle combobox
+ void refreshDayCyclesList();
+
+ /// add a slider to the track
+ void addSliderKey(F32 time, LLWLParamKey keyframe);
+
+ void initCallbacks();
+ LLWLParamKey getSelectedDayCycle();
+ bool isNewDay() const;
+ void dumpTrack();
+ void enableEditing(bool enable);
+ void reset();
+ void saveRegionDayCycle();
+
+ void setApplyProgress(bool started);
+ bool getApplyProgress() const;
+
+ void onTimeSliderMoved(); /// time slider moved
+ void onKeyTimeMoved(); /// a key frame moved
+ void onKeyTimeChanged(); /// a key frame's time changed
+ void onKeyPresetChanged(); /// sky preset selected
+ void onAddKey(); /// new key added on slider
+ void onDeleteKey(); /// a key frame deleted
+
+ void onRegionSettingsChange();
+ void onRegionChange();
+ void onRegionSettingsApplied(bool success);
+ void onRegionInfoUpdate();
+
+ void onDayCycleNameEdited();
+ void onDayCycleSelected();
+ void onBtnSave();
+ void onBtnCancel();
+
+ bool onSaveAnswer(const LLSD& notification, const LLSD& response);
+ void onSaveConfirmed();
+
+ void onDayCycleListChange();
+ void onSkyPresetListChange();
+
+ static std::string getRegionName();
+
+ /// convenience class for holding keyframes mapped to sliders
+ struct SliderKey
+ {
+ public:
+ SliderKey(LLWLParamKey kf, F32 t) : keyframe(kf), time(t) {}
+ SliderKey() : keyframe(), time(0.f) {} // Don't use this default constructor
+
+ LLWLParamKey keyframe;
+ F32 time;
+ };
+
+ static const F32 sHoursPerDay;
+
+ LLLineEditor* mDayCycleNameEditor;
+ LLComboBox* mDayCyclesCombo;
+ LLMultiSliderCtrl* mTimeSlider;
+ LLMultiSliderCtrl* mKeysSlider;
+ LLComboBox* mSkyPresetsCombo;
+ LLTimeCtrl* mTimeCtrl;
+ LLCheckBoxCtrl* mMakeDefaultCheckBox;
+ LLButton* mSaveButton;
+
+ // map of sliders to parameters
+ std::map<std::string, SliderKey> mSliderToKey;
+};
+
+#endif // LL_LLFLOATEREDITDAYCYCLE_H
diff --git a/indra/newview/llfloatereditsky.cpp b/indra/newview/llfloatereditsky.cpp
new file mode 100644
index 0000000000..abee7b5dc9
--- /dev/null
+++ b/indra/newview/llfloatereditsky.cpp
@@ -0,0 +1,923 @@
+/**
+ * @file llfloatereditsky.cpp
+ * @brief Floater to create or edit a sky preset
+ *
+ * $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 "llfloatereditsky.h"
+
+// libs
+#include "llbutton.h"
+#include "llcheckboxctrl.h"
+#include "llcombobox.h"
+#include "llmultisliderctrl.h"
+#include "llnotifications.h"
+#include "llnotificationsutil.h"
+#include "llsliderctrl.h"
+#include "lltabcontainer.h"
+#include "lltimectrl.h"
+
+// newview
+#include "llagent.h"
+#include "llcolorswatch.h"
+#include "llregioninfomodel.h"
+#include "llviewerregion.h"
+
+static const F32 WL_SUN_AMBIENT_SLIDER_SCALE = 3.0f;
+static const F32 WL_BLUE_HORIZON_DENSITY_SCALE = 2.0f;
+static const F32 WL_CLOUD_SLIDER_SCALE = 1.0f;
+
+static F32 sun_pos_to_time24(F32 sun_pos)
+{
+ return fmodf(sun_pos * 24.0f + 6, 24.0f);
+}
+
+static F32 time24_to_sun_pos(F32 time24)
+{
+ F32 sun_pos = fmodf((time24 - 6) / 24.0f, 1.0f);
+ if (sun_pos < 0) ++sun_pos;
+ return sun_pos;
+}
+
+LLFloaterEditSky::LLFloaterEditSky(const LLSD &key)
+: LLFloater(key)
+, mSkyPresetNameEditor(NULL)
+, mSkyPresetCombo(NULL)
+, mMakeDefaultCheckBox(NULL)
+, mSaveButton(NULL)
+{
+}
+
+// virtual
+BOOL LLFloaterEditSky::postBuild()
+{
+ mSkyPresetNameEditor = getChild<LLLineEditor>("sky_preset_name");
+ mSkyPresetCombo = getChild<LLComboBox>("sky_preset_combo");
+ mMakeDefaultCheckBox = getChild<LLCheckBoxCtrl>("make_default_cb");
+ mSaveButton = getChild<LLButton>("save");
+
+ initCallbacks();
+
+ // Create the sun position scrubber on the slider.
+ getChild<LLMultiSliderCtrl>("WLSunPos")->addSlider(12.f);
+
+ return TRUE;
+}
+
+// virtual
+void LLFloaterEditSky::onOpen(const LLSD& key)
+{
+ bool new_preset = isNewPreset();
+ std::string param = key.asString();
+ std::string floater_title = getString(std::string("title_") + param);
+ std::string hint = getString(std::string("hint_" + param));
+
+ // Update floater title.
+ setTitle(floater_title);
+
+ // Update the hint at the top.
+ getChild<LLUICtrl>("hint")->setValue(hint);
+
+ // Hide the hint to the right of the combo if we're invoked to create a new preset.
+ getChildView("note")->setVisible(!new_preset);
+
+ // Switch between the sky presets combobox and preset name input field.
+ mSkyPresetCombo->setVisible(!new_preset);
+ mSkyPresetNameEditor->setVisible(new_preset);
+
+ reset();
+}
+
+// virtual
+void LLFloaterEditSky::onClose(bool app_quitting)
+{
+ if (!app_quitting) // there's no point to change environment if we're quitting
+ {
+ LLEnvManagerNew::instance().usePrefs(); // revert changes made to current environment
+ }
+}
+
+// virtual
+void LLFloaterEditSky::draw()
+{
+ syncControls();
+ LLFloater::draw();
+}
+
+void LLFloaterEditSky::initCallbacks(void)
+{
+ // *TODO: warn user if a region environment update comes while we're editing a region sky preset.
+
+ mSkyPresetNameEditor->setKeystrokeCallback(boost::bind(&LLFloaterEditSky::onSkyPresetNameEdited, this), NULL);
+ mSkyPresetCombo->setCommitCallback(boost::bind(&LLFloaterEditSky::onSkyPresetSelected, this));
+ mSkyPresetCombo->setTextEntryCallback(boost::bind(&LLFloaterEditSky::onSkyPresetNameEdited, this));
+
+ mSaveButton->setCommitCallback(boost::bind(&LLFloaterEditSky::onBtnSave, this));
+ getChild<LLButton>("cancel")->setCommitCallback(boost::bind(&LLFloaterEditSky::onBtnCancel, this));
+
+ LLEnvManagerNew::instance().setRegionSettingsChangeCallback(boost::bind(&LLFloaterEditSky::onRegionSettingsChange, this));
+ LLWLParamManager::instance().setPresetListChangeCallback(boost::bind(&LLFloaterEditSky::onSkyPresetListChange, this));
+
+ // Connect to region info updates.
+ LLRegionInfoModel::instance().setUpdateCallback(boost::bind(&LLFloaterEditSky::onRegionInfoUpdate, this));
+
+ //-------------------------------------------------------------------------
+
+ LLWLParamManager& param_mgr = LLWLParamManager::instance();
+
+ // blue horizon
+ getChild<LLUICtrl>("WLBlueHorizon")->setCommitCallback(boost::bind(&LLFloaterEditSky::onColorControlMoved, this, _1, &param_mgr.mBlueHorizon));
+
+ // haze density, horizon, mult, and altitude
+ getChild<LLUICtrl>("WLHazeDensity")->setCommitCallback(boost::bind(&LLFloaterEditSky::onColorControlRMoved, this, _1, &param_mgr.mHazeDensity));
+ getChild<LLUICtrl>("WLHazeHorizon")->setCommitCallback(boost::bind(&LLFloaterEditSky::onColorControlRMoved, this, _1, &param_mgr.mHazeHorizon));
+ getChild<LLUICtrl>("WLDensityMult")->setCommitCallback(boost::bind(&LLFloaterEditSky::onFloatControlMoved, this, _1, &param_mgr.mDensityMult));
+ getChild<LLUICtrl>("WLMaxAltitude")->setCommitCallback(boost::bind(&LLFloaterEditSky::onFloatControlMoved, this, _1, &param_mgr.mMaxAlt));
+
+ // blue density
+ getChild<LLUICtrl>("WLBlueDensity")->setCommitCallback(boost::bind(&LLFloaterEditSky::onColorControlMoved, this, _1, &param_mgr.mBlueDensity));
+
+ // Lighting
+
+ // sunlight
+ getChild<LLUICtrl>("WLSunlight")->setCommitCallback(boost::bind(&LLFloaterEditSky::onColorControlMoved, this, _1, &param_mgr.mSunlight));
+
+ // glow
+ getChild<LLUICtrl>("WLGlowR")->setCommitCallback(boost::bind(&LLFloaterEditSky::onGlowRMoved, this, _1, &param_mgr.mGlow));
+ getChild<LLUICtrl>("WLGlowB")->setCommitCallback(boost::bind(&LLFloaterEditSky::onGlowBMoved, this, _1, &param_mgr.mGlow));
+
+ // ambient
+ getChild<LLUICtrl>("WLAmbient")->setCommitCallback(boost::bind(&LLFloaterEditSky::onColorControlMoved, this, _1, &param_mgr.mAmbient));
+
+ // time of day
+ getChild<LLUICtrl>("WLSunPos")->setCommitCallback(boost::bind(&LLFloaterEditSky::onSunMoved, this, _1, &param_mgr.mLightnorm)); // multi-slider
+ getChild<LLTimeCtrl>("WLDayTime")->setCommitCallback(boost::bind(&LLFloaterEditSky::onTimeChanged, this)); // time ctrl
+ getChild<LLUICtrl>("WLEastAngle")->setCommitCallback(boost::bind(&LLFloaterEditSky::onSunMoved, this, _1, &param_mgr.mLightnorm));
+
+ // Clouds
+
+ // Cloud Color
+ getChild<LLUICtrl>("WLCloudColor")->setCommitCallback(boost::bind(&LLFloaterEditSky::onColorControlMoved, this, _1, &param_mgr.mCloudColor));
+
+ // Cloud
+ getChild<LLUICtrl>("WLCloudX")->setCommitCallback(boost::bind(&LLFloaterEditSky::onColorControlRMoved, this, _1, &param_mgr.mCloudMain));
+ getChild<LLUICtrl>("WLCloudY")->setCommitCallback(boost::bind(&LLFloaterEditSky::onColorControlGMoved, this, _1, &param_mgr.mCloudMain));
+ getChild<LLUICtrl>("WLCloudDensity")->setCommitCallback(boost::bind(&LLFloaterEditSky::onColorControlBMoved, this, _1, &param_mgr.mCloudMain));
+
+ // Cloud Detail
+ getChild<LLUICtrl>("WLCloudDetailX")->setCommitCallback(boost::bind(&LLFloaterEditSky::onColorControlRMoved, this, _1, &param_mgr.mCloudDetail));
+ getChild<LLUICtrl>("WLCloudDetailY")->setCommitCallback(boost::bind(&LLFloaterEditSky::onColorControlGMoved, this, _1, &param_mgr.mCloudDetail));
+ getChild<LLUICtrl>("WLCloudDetailDensity")->setCommitCallback(boost::bind(&LLFloaterEditSky::onColorControlBMoved, this, _1, &param_mgr.mCloudDetail));
+
+ // Cloud extras
+ getChild<LLUICtrl>("WLCloudCoverage")->setCommitCallback(boost::bind(&LLFloaterEditSky::onFloatControlMoved, this, _1, &param_mgr.mCloudCoverage));
+ getChild<LLUICtrl>("WLCloudScale")->setCommitCallback(boost::bind(&LLFloaterEditSky::onFloatControlMoved, this, _1, &param_mgr.mCloudScale));
+ getChild<LLUICtrl>("WLCloudLockX")->setCommitCallback(boost::bind(&LLFloaterEditSky::onCloudScrollXToggled, this, _1));
+ getChild<LLUICtrl>("WLCloudLockY")->setCommitCallback(boost::bind(&LLFloaterEditSky::onCloudScrollYToggled, this, _1));
+ getChild<LLUICtrl>("WLCloudScrollX")->setCommitCallback(boost::bind(&LLFloaterEditSky::onCloudScrollXMoved, this, _1));
+ getChild<LLUICtrl>("WLCloudScrollY")->setCommitCallback(boost::bind(&LLFloaterEditSky::onCloudScrollYMoved, this, _1));
+ getChild<LLUICtrl>("WLDistanceMult")->setCommitCallback(boost::bind(&LLFloaterEditSky::onFloatControlMoved, this, _1, &param_mgr.mDistanceMult));
+
+ // Dome
+ getChild<LLUICtrl>("WLGamma")->setCommitCallback(boost::bind(&LLFloaterEditSky::onFloatControlMoved, this, _1, &param_mgr.mWLGamma));
+ getChild<LLUICtrl>("WLStarAlpha")->setCommitCallback(boost::bind(&LLFloaterEditSky::onStarAlphaMoved, this, _1));
+}
+
+//=================================================================================================
+
+void LLFloaterEditSky::syncControls()
+{
+ bool err;
+
+ LLWLParamManager * param_mgr = LLWLParamManager::getInstance();
+
+ LLWLParamSet& cur_params = param_mgr->mCurParams;
+
+ // blue horizon
+ param_mgr->mBlueHorizon = cur_params.getVector(param_mgr->mBlueHorizon.mName, err);
+ setColorSwatch("WLBlueHorizon", param_mgr->mBlueHorizon, WL_BLUE_HORIZON_DENSITY_SCALE);
+
+ // haze density, horizon, mult, and altitude
+ param_mgr->mHazeDensity = cur_params.getVector(param_mgr->mHazeDensity.mName, err);
+ childSetValue("WLHazeDensity", param_mgr->mHazeDensity.r);
+ param_mgr->mHazeHorizon = cur_params.getVector(param_mgr->mHazeHorizon.mName, err);
+ childSetValue("WLHazeHorizon", param_mgr->mHazeHorizon.r);
+ param_mgr->mDensityMult = cur_params.getVector(param_mgr->mDensityMult.mName, err);
+ childSetValue("WLDensityMult", param_mgr->mDensityMult.x *
+ param_mgr->mDensityMult.mult);
+ param_mgr->mMaxAlt = cur_params.getVector(param_mgr->mMaxAlt.mName, err);
+ childSetValue("WLMaxAltitude", param_mgr->mMaxAlt.x);
+
+ // blue density
+ param_mgr->mBlueDensity = cur_params.getVector(param_mgr->mBlueDensity.mName, err);
+ setColorSwatch("WLBlueDensity", param_mgr->mBlueDensity, WL_BLUE_HORIZON_DENSITY_SCALE);
+
+ // Lighting
+
+ // sunlight
+ param_mgr->mSunlight = cur_params.getVector(param_mgr->mSunlight.mName, err);
+ setColorSwatch("WLSunlight", param_mgr->mSunlight, WL_SUN_AMBIENT_SLIDER_SCALE);
+
+ // glow
+ param_mgr->mGlow = cur_params.getVector(param_mgr->mGlow.mName, err);
+ childSetValue("WLGlowR", 2 - param_mgr->mGlow.r / 20.0f);
+ childSetValue("WLGlowB", -param_mgr->mGlow.b / 5.0f);
+
+ // ambient
+ param_mgr->mAmbient = cur_params.getVector(param_mgr->mAmbient.mName, err);
+ setColorSwatch("WLAmbient", param_mgr->mAmbient, WL_SUN_AMBIENT_SLIDER_SCALE);
+
+ F32 time24 = sun_pos_to_time24(param_mgr->mCurParams.getFloat("sun_angle",err) / F_TWO_PI);
+ getChild<LLMultiSliderCtrl>("WLSunPos")->setCurSliderValue(time24, TRUE);
+ getChild<LLTimeCtrl>("WLDayTime")->setTime24(time24);
+ childSetValue("WLEastAngle", param_mgr->mCurParams.getFloat("east_angle",err) / F_TWO_PI);
+
+ // Clouds
+
+ // Cloud Color
+ param_mgr->mCloudColor = cur_params.getVector(param_mgr->mCloudColor.mName, err);
+ setColorSwatch("WLCloudColor", param_mgr->mCloudColor, WL_CLOUD_SLIDER_SCALE);
+
+ // Cloud
+ param_mgr->mCloudMain = cur_params.getVector(param_mgr->mCloudMain.mName, err);
+ childSetValue("WLCloudX", param_mgr->mCloudMain.r);
+ childSetValue("WLCloudY", param_mgr->mCloudMain.g);
+ childSetValue("WLCloudDensity", param_mgr->mCloudMain.b);
+
+ // Cloud Detail
+ param_mgr->mCloudDetail = cur_params.getVector(param_mgr->mCloudDetail.mName, err);
+ childSetValue("WLCloudDetailX", param_mgr->mCloudDetail.r);
+ childSetValue("WLCloudDetailY", param_mgr->mCloudDetail.g);
+ childSetValue("WLCloudDetailDensity", param_mgr->mCloudDetail.b);
+
+ // Cloud extras
+ param_mgr->mCloudCoverage = cur_params.getVector(param_mgr->mCloudCoverage.mName, err);
+ param_mgr->mCloudScale = cur_params.getVector(param_mgr->mCloudScale.mName, err);
+ childSetValue("WLCloudCoverage", param_mgr->mCloudCoverage.x);
+ childSetValue("WLCloudScale", param_mgr->mCloudScale.x);
+
+ // cloud scrolling
+ bool lockX = !param_mgr->mCurParams.getEnableCloudScrollX();
+ bool lockY = !param_mgr->mCurParams.getEnableCloudScrollY();
+ childSetValue("WLCloudLockX", lockX);
+ childSetValue("WLCloudLockY", lockY);
+
+ // disable if locked, enable if not
+ if (lockX)
+ {
+ childDisable("WLCloudScrollX");
+ }
+ else
+ {
+ childEnable("WLCloudScrollX");
+ }
+ if (lockY)
+ {
+ childDisable("WLCloudScrollY");
+ }
+ else
+ {
+ childEnable("WLCloudScrollY");
+ }
+
+ // *HACK cloud scrolling is off my an additive of 10
+ childSetValue("WLCloudScrollX", param_mgr->mCurParams.getCloudScrollX() - 10.0f);
+ childSetValue("WLCloudScrollY", param_mgr->mCurParams.getCloudScrollY() - 10.0f);
+
+ param_mgr->mDistanceMult = cur_params.getVector(param_mgr->mDistanceMult.mName, err);
+ childSetValue("WLDistanceMult", param_mgr->mDistanceMult.x);
+
+ // Tweak extras
+
+ param_mgr->mWLGamma = cur_params.getVector(param_mgr->mWLGamma.mName, err);
+ childSetValue("WLGamma", param_mgr->mWLGamma.x);
+
+ childSetValue("WLStarAlpha", param_mgr->mCurParams.getStarBrightness());
+}
+
+void LLFloaterEditSky::setColorSwatch(const std::string& name, const WLColorControl& from_ctrl, F32 k)
+{
+ // Set the value, dividing it by <k> first.
+ LLVector4 color_vec = from_ctrl;
+ getChild<LLColorSwatchCtrl>(name)->set(LLColor4(color_vec / k));
+}
+
+// color control callbacks
+void LLFloaterEditSky::onColorControlMoved(LLUICtrl* ctrl, WLColorControl* color_ctrl)
+{
+ LLWLParamManager::getInstance()->mAnimator.deactivate();
+
+ LLColorSwatchCtrl* swatch = static_cast<LLColorSwatchCtrl*>(ctrl);
+ LLVector4 color_vec(swatch->get().mV);
+
+ // Set intensity to maximum of the RGB values.
+ color_vec.mV[3] = llmax(color_vec.mV[0], llmax(color_vec.mV[1], color_vec.mV[2]));
+
+ // Multiply RGB values by the appropriate factor.
+ F32 k = WL_CLOUD_SLIDER_SCALE;
+ if (color_ctrl->isSunOrAmbientColor)
+ {
+ k = WL_SUN_AMBIENT_SLIDER_SCALE;
+ }
+ if (color_ctrl->isBlueHorizonOrDensity)
+ {
+ k = WL_BLUE_HORIZON_DENSITY_SCALE;
+ }
+
+ color_vec *= k; // intensity isn't affected by the multiplication
+
+ // Apply the new RGBI value.
+ *color_ctrl = color_vec;
+ color_ctrl->update(LLWLParamManager::getInstance()->mCurParams);
+ LLWLParamManager::getInstance()->propagateParameters();
+}
+
+void LLFloaterEditSky::onColorControlRMoved(LLUICtrl* ctrl, void* userdata)
+{
+ LLWLParamManager::getInstance()->mAnimator.deactivate();
+
+ LLSliderCtrl* sldr_ctrl = static_cast<LLSliderCtrl*>(ctrl);
+ WLColorControl* color_ctrl = static_cast<WLColorControl *>(userdata);
+
+ color_ctrl->r = sldr_ctrl->getValueF32();
+ if (color_ctrl->isSunOrAmbientColor)
+ {
+ color_ctrl->r *= WL_SUN_AMBIENT_SLIDER_SCALE;
+ }
+ if (color_ctrl->isBlueHorizonOrDensity)
+ {
+ color_ctrl->r *= WL_BLUE_HORIZON_DENSITY_SCALE;
+ }
+
+ // move i if it's the max
+ if (color_ctrl->r >= color_ctrl->g && color_ctrl->r >= color_ctrl->b && color_ctrl->hasSliderName)
+ {
+ color_ctrl->i = color_ctrl->r;
+ std::string name = color_ctrl->mSliderName;
+ name.append("I");
+
+ if (color_ctrl->isSunOrAmbientColor)
+ {
+ childSetValue(name, color_ctrl->r / WL_SUN_AMBIENT_SLIDER_SCALE);
+ }
+ else if (color_ctrl->isBlueHorizonOrDensity)
+ {
+ childSetValue(name, color_ctrl->r / WL_BLUE_HORIZON_DENSITY_SCALE);
+ }
+ else
+ {
+ childSetValue(name, color_ctrl->r);
+ }
+ }
+
+ color_ctrl->update(LLWLParamManager::getInstance()->mCurParams);
+
+ LLWLParamManager::getInstance()->propagateParameters();
+}
+
+void LLFloaterEditSky::onColorControlGMoved(LLUICtrl* ctrl, void* userdata)
+{
+ LLWLParamManager::getInstance()->mAnimator.deactivate();
+
+ LLSliderCtrl* sldr_ctrl = static_cast<LLSliderCtrl*>(ctrl);
+ WLColorControl* color_ctrl = static_cast<WLColorControl *>(userdata);
+
+ color_ctrl->g = sldr_ctrl->getValueF32();
+ if (color_ctrl->isSunOrAmbientColor)
+ {
+ color_ctrl->g *= WL_SUN_AMBIENT_SLIDER_SCALE;
+ }
+ if (color_ctrl->isBlueHorizonOrDensity)
+ {
+ color_ctrl->g *= WL_BLUE_HORIZON_DENSITY_SCALE;
+ }
+
+ // move i if it's the max
+ if (color_ctrl->g >= color_ctrl->r && color_ctrl->g >= color_ctrl->b && color_ctrl->hasSliderName)
+ {
+ color_ctrl->i = color_ctrl->g;
+ std::string name = color_ctrl->mSliderName;
+ name.append("I");
+
+ if (color_ctrl->isSunOrAmbientColor)
+ {
+ childSetValue(name, color_ctrl->g / WL_SUN_AMBIENT_SLIDER_SCALE);
+ }
+ else if (color_ctrl->isBlueHorizonOrDensity)
+ {
+ childSetValue(name, color_ctrl->g / WL_BLUE_HORIZON_DENSITY_SCALE);
+ }
+ else
+ {
+ childSetValue(name, color_ctrl->g);
+ }
+ }
+
+ color_ctrl->update(LLWLParamManager::getInstance()->mCurParams);
+
+ LLWLParamManager::getInstance()->propagateParameters();
+}
+
+void LLFloaterEditSky::onColorControlBMoved(LLUICtrl* ctrl, void* userdata)
+{
+ LLWLParamManager::getInstance()->mAnimator.deactivate();
+
+ LLSliderCtrl* sldr_ctrl = static_cast<LLSliderCtrl*>(ctrl);
+ WLColorControl* color_ctrl = static_cast<WLColorControl *>(userdata);
+
+ color_ctrl->b = sldr_ctrl->getValueF32();
+ if (color_ctrl->isSunOrAmbientColor)
+ {
+ color_ctrl->b *= WL_SUN_AMBIENT_SLIDER_SCALE;
+ }
+ if (color_ctrl->isBlueHorizonOrDensity)
+ {
+ color_ctrl->b *= WL_BLUE_HORIZON_DENSITY_SCALE;
+ }
+
+ // move i if it's the max
+ if (color_ctrl->b >= color_ctrl->r && color_ctrl->b >= color_ctrl->g && color_ctrl->hasSliderName)
+ {
+ color_ctrl->i = color_ctrl->b;
+ std::string name = color_ctrl->mSliderName;
+ name.append("I");
+
+ if (color_ctrl->isSunOrAmbientColor)
+ {
+ childSetValue(name, color_ctrl->b / WL_SUN_AMBIENT_SLIDER_SCALE);
+ }
+ else if (color_ctrl->isBlueHorizonOrDensity)
+ {
+ childSetValue(name, color_ctrl->b / WL_BLUE_HORIZON_DENSITY_SCALE);
+ }
+ else
+ {
+ childSetValue(name, color_ctrl->b);
+ }
+ }
+
+ color_ctrl->update(LLWLParamManager::getInstance()->mCurParams);
+
+ LLWLParamManager::getInstance()->propagateParameters();
+}
+
+/// GLOW SPECIFIC CODE
+void LLFloaterEditSky::onGlowRMoved(LLUICtrl* ctrl, void* userdata)
+{
+ LLWLParamManager::getInstance()->mAnimator.deactivate();
+
+ LLSliderCtrl* sldr_ctrl = static_cast<LLSliderCtrl*>(ctrl);
+ WLColorControl* color_ctrl = static_cast<WLColorControl *>(userdata);
+
+ // scaled by 20
+ color_ctrl->r = (2 - sldr_ctrl->getValueF32()) * 20;
+
+ color_ctrl->update(LLWLParamManager::getInstance()->mCurParams);
+ LLWLParamManager::getInstance()->propagateParameters();
+}
+
+/// \NOTE that we want NEGATIVE (-) B
+void LLFloaterEditSky::onGlowBMoved(LLUICtrl* ctrl, void* userdata)
+{
+ LLWLParamManager::getInstance()->mAnimator.deactivate();
+
+ LLSliderCtrl* sldr_ctrl = static_cast<LLSliderCtrl*>(ctrl);
+ WLColorControl* color_ctrl = static_cast<WLColorControl *>(userdata);
+
+ /// \NOTE that we want NEGATIVE (-) B and NOT by 20 as 20 is too big
+ color_ctrl->b = -sldr_ctrl->getValueF32() * 5;
+
+ color_ctrl->update(LLWLParamManager::getInstance()->mCurParams);
+ LLWLParamManager::getInstance()->propagateParameters();
+}
+
+void LLFloaterEditSky::onFloatControlMoved(LLUICtrl* ctrl, void* userdata)
+{
+ LLWLParamManager::getInstance()->mAnimator.deactivate();
+
+ LLSliderCtrl* sldr_ctrl = static_cast<LLSliderCtrl*>(ctrl);
+ WLFloatControl * floatControl = static_cast<WLFloatControl *>(userdata);
+
+ floatControl->x = sldr_ctrl->getValueF32() / floatControl->mult;
+
+ floatControl->update(LLWLParamManager::getInstance()->mCurParams);
+ LLWLParamManager::getInstance()->propagateParameters();
+}
+
+
+// Lighting callbacks
+
+// time of day
+void LLFloaterEditSky::onSunMoved(LLUICtrl* ctrl, void* userdata)
+{
+ LLWLParamManager::getInstance()->mAnimator.deactivate();
+
+ LLMultiSliderCtrl* sun_msldr = getChild<LLMultiSliderCtrl>("WLSunPos");
+ LLSliderCtrl* east_sldr = getChild<LLSliderCtrl>("WLEastAngle");
+ LLTimeCtrl* time_ctrl = getChild<LLTimeCtrl>("WLDayTime");
+ WLColorControl* color_ctrl = static_cast<WLColorControl *>(userdata);
+
+ F32 time24 = sun_msldr->getCurSliderValue();
+ time_ctrl->setTime24(time24); // sync the time ctrl with the new sun position
+
+ // get the two angles
+ LLWLParamManager * param_mgr = LLWLParamManager::getInstance();
+
+ param_mgr->mCurParams.setSunAngle(F_TWO_PI * time24_to_sun_pos(time24));
+ param_mgr->mCurParams.setEastAngle(F_TWO_PI * east_sldr->getValueF32());
+
+ // set the sun vector
+ color_ctrl->r = -sin(param_mgr->mCurParams.getEastAngle()) *
+ cos(param_mgr->mCurParams.getSunAngle());
+ color_ctrl->g = sin(param_mgr->mCurParams.getSunAngle());
+ color_ctrl->b = cos(param_mgr->mCurParams.getEastAngle()) *
+ cos(param_mgr->mCurParams.getSunAngle());
+ color_ctrl->i = 1.f;
+
+ color_ctrl->update(param_mgr->mCurParams);
+ param_mgr->propagateParameters();
+}
+
+void LLFloaterEditSky::onTimeChanged()
+{
+ F32 time24 = getChild<LLTimeCtrl>("WLDayTime")->getTime24();
+ getChild<LLMultiSliderCtrl>("WLSunPos")->setCurSliderValue(time24, TRUE);
+ onSunMoved(getChild<LLUICtrl>("WLSunPos"), &LLWLParamManager::instance().mLightnorm);
+}
+
+void LLFloaterEditSky::onStarAlphaMoved(LLUICtrl* ctrl)
+{
+ LLWLParamManager::getInstance()->mAnimator.deactivate();
+
+ LLSliderCtrl* sldr_ctrl = static_cast<LLSliderCtrl*>(ctrl);
+
+ LLWLParamManager::getInstance()->mCurParams.setStarBrightness(sldr_ctrl->getValueF32());
+}
+
+// Clouds
+void LLFloaterEditSky::onCloudScrollXMoved(LLUICtrl* ctrl)
+{
+ LLWLParamManager::getInstance()->mAnimator.deactivate();
+
+ LLSliderCtrl* sldr_ctrl = static_cast<LLSliderCtrl*>(ctrl);
+ // *HACK all cloud scrolling is off by an additive of 10.
+ LLWLParamManager::getInstance()->mCurParams.setCloudScrollX(sldr_ctrl->getValueF32() + 10.0f);
+}
+
+void LLFloaterEditSky::onCloudScrollYMoved(LLUICtrl* ctrl)
+{
+ LLWLParamManager::getInstance()->mAnimator.deactivate();
+
+ LLSliderCtrl* sldr_ctrl = static_cast<LLSliderCtrl*>(ctrl);
+
+ // *HACK all cloud scrolling is off by an additive of 10.
+ LLWLParamManager::getInstance()->mCurParams.setCloudScrollY(sldr_ctrl->getValueF32() + 10.0f);
+}
+
+void LLFloaterEditSky::onCloudScrollXToggled(LLUICtrl* ctrl)
+{
+ LLWLParamManager::getInstance()->mAnimator.deactivate();
+
+ LLCheckBoxCtrl* cb_ctrl = static_cast<LLCheckBoxCtrl*>(ctrl);
+
+ bool lock = cb_ctrl->get();
+ LLWLParamManager::getInstance()->mCurParams.setEnableCloudScrollX(!lock);
+
+ LLSliderCtrl* sldr = getChild<LLSliderCtrl>("WLCloudScrollX");
+
+ if (cb_ctrl->get())
+ {
+ sldr->setEnabled(false);
+ }
+ else
+ {
+ sldr->setEnabled(true);
+ }
+
+}
+
+void LLFloaterEditSky::onCloudScrollYToggled(LLUICtrl* ctrl)
+{
+ LLWLParamManager::getInstance()->mAnimator.deactivate();
+
+ LLCheckBoxCtrl* cb_ctrl = static_cast<LLCheckBoxCtrl*>(ctrl);
+ bool lock = cb_ctrl->get();
+ LLWLParamManager::getInstance()->mCurParams.setEnableCloudScrollY(!lock);
+
+ LLSliderCtrl* sldr = getChild<LLSliderCtrl>("WLCloudScrollY");
+
+ if (cb_ctrl->get())
+ {
+ sldr->setEnabled(false);
+ }
+ else
+ {
+ sldr->setEnabled(true);
+ }
+}
+
+//=================================================================================================
+
+void LLFloaterEditSky::reset()
+{
+ if (isNewPreset())
+ {
+ mSkyPresetNameEditor->setValue(LLSD());
+ mSaveButton->setEnabled(FALSE); // will be enabled as soon as users enters a name
+ }
+ else
+ {
+ refreshSkyPresetsList();
+
+ // Disable controls until a sky preset to edit is selected.
+ enableEditing(false);
+ }
+}
+
+bool LLFloaterEditSky::isNewPreset() const
+{
+ return mKey.asString() == "new";
+}
+
+void LLFloaterEditSky::refreshSkyPresetsList()
+{
+ mSkyPresetCombo->removeall();
+
+ LLWLParamManager::preset_name_list_t region_presets, user_presets, sys_presets;
+ LLWLParamManager::instance().getPresetNames(region_presets, user_presets, sys_presets);
+
+#if 0 // Disable editing region skies until the workflow is clear enough.
+ // Add region presets.
+ std::string region_name = gAgent.getRegion() ? gAgent.getRegion()->getName() : LLTrans::getString("Unknown");
+ for (LLWLParamManager::preset_name_list_t::const_iterator it = region_presets.begin(); it != region_presets.end(); ++it)
+ {
+ std::string item_title = *it + " (" + region_name + ")";
+ mSkyPresetCombo->add(item_title, LLWLParamKey(*it, LLEnvKey::SCOPE_REGION).toLLSD());
+ }
+ if (region_presets.size() > 0)
+ {
+ mSkyPresetCombo->addSeparator();
+ }
+#endif
+
+ // Add user presets.
+ for (LLWLParamManager::preset_name_list_t::const_iterator it = user_presets.begin(); it != user_presets.end(); ++it)
+ {
+ mSkyPresetCombo->add(*it, LLWLParamKey(*it, LLEnvKey::SCOPE_LOCAL).toLLSD());
+ }
+ if (user_presets.size() > 0)
+ {
+ mSkyPresetCombo->addSeparator();
+ }
+
+ // Add system presets.
+ for (LLWLParamManager::preset_name_list_t::const_iterator it = sys_presets.begin(); it != sys_presets.end(); ++it)
+ {
+ mSkyPresetCombo->add(*it, LLWLParamKey(*it, LLEnvKey::SCOPE_LOCAL).toLLSD());
+ }
+
+ mSkyPresetCombo->setLabel(getString("combo_label"));
+}
+
+void LLFloaterEditSky::enableEditing(bool enable)
+{
+ // Enable/disable the tab and their contents.
+ LLTabContainer* tab_container = getChild<LLTabContainer>("WindLight Tabs");
+ tab_container->setEnabled(enable);
+ for (S32 i = 0; i < tab_container->getTabCount(); ++i)
+ {
+ tab_container->enableTabButton(i, enable);
+ tab_container->getPanelByIndex(i)->setCtrlsEnabled(enable);
+ }
+
+ // Enable/disable saving.
+ mSaveButton->setEnabled(enable);
+ mMakeDefaultCheckBox->setEnabled(enable);
+}
+
+void LLFloaterEditSky::saveRegionSky()
+{
+ LLWLParamKey key(getSelectedSkyPreset());
+ llassert(key.scope == LLEnvKey::SCOPE_REGION);
+
+ LL_DEBUGS("Windlight") << "Saving region sky preset: " << key.name << llendl;
+ LLWLParamManager& wl_mgr = LLWLParamManager::instance();
+ wl_mgr.mCurParams.mName = key.name;
+ wl_mgr.setParamSet(key, wl_mgr.mCurParams);
+
+ // *TODO: save to cached region settings.
+ LL_WARNS("Windlight") << "Saving region sky is not fully implemented yet" << LL_ENDL;
+}
+
+LLWLParamKey LLFloaterEditSky::getSelectedSkyPreset()
+{
+ LLWLParamKey key;
+
+ if (mSkyPresetNameEditor->getVisible())
+ {
+ key.name = mSkyPresetNameEditor->getText();
+ key.scope = LLEnvKey::SCOPE_LOCAL;
+ }
+ else
+ {
+ LLSD combo_val = mSkyPresetCombo->getValue();
+
+ if (!combo_val.isArray()) // manually typed text
+ {
+ key.name = combo_val.asString();
+ key.scope = LLEnvKey::SCOPE_LOCAL;
+ }
+ else
+ {
+ key.fromLLSD(combo_val);
+ }
+ }
+
+ return key;
+}
+
+void LLFloaterEditSky::onSkyPresetNameEdited()
+{
+ // Disable saving a sky preset having empty name.
+ LLWLParamKey key = getSelectedSkyPreset();
+ mSaveButton->setEnabled(!key.name.empty());
+}
+
+void LLFloaterEditSky::onSkyPresetSelected()
+{
+ LLWLParamKey key = getSelectedSkyPreset();
+ LLWLParamSet sky_params;
+
+ if (!LLWLParamManager::instance().getParamSet(key, sky_params))
+ {
+ // Manually entered string?
+ LL_WARNS("Windlight") << "No sky preset named " << key.toString() << LL_ENDL;
+ return;
+ }
+
+ LLEnvManagerNew::instance().useSkyParams(sky_params.getAll());
+ //syncControls();
+
+ bool can_edit = (key.scope == LLEnvKey::SCOPE_LOCAL || LLEnvManagerNew::canEditRegionSettings());
+ enableEditing(can_edit);
+
+ mMakeDefaultCheckBox->setEnabled(key.scope == LLEnvKey::SCOPE_LOCAL);
+}
+
+bool LLFloaterEditSky::onSaveAnswer(const LLSD& notification, const LLSD& response)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+
+ // If they choose save, do it. Otherwise, don't do anything
+ if (option == 0)
+ {
+ onSaveConfirmed();
+ }
+
+ return false;
+}
+
+void LLFloaterEditSky::onSaveConfirmed()
+{
+ // Save current params to the selected preset.
+ LLWLParamKey key(getSelectedSkyPreset());
+
+ LL_DEBUGS("Windlight") << "Saving sky preset " << key.name << LL_ENDL;
+ LLWLParamManager& wl_mgr = LLWLParamManager::instance();
+ if (wl_mgr.hasParamSet(key))
+ {
+ wl_mgr.setParamSet(key, wl_mgr.mCurParams);
+ }
+ else
+ {
+ wl_mgr.addParamSet(key, wl_mgr.mCurParams);
+ }
+
+ wl_mgr.savePreset(key);
+
+ // Change preference if requested.
+ if (mMakeDefaultCheckBox->getValue())
+ {
+ LL_DEBUGS("Windlight") << key.name << " is now the new preferred sky preset" << llendl;
+ LLEnvManagerNew::instance().setUseSkyPreset(key.name);
+ }
+
+ closeFloater();
+}
+
+void LLFloaterEditSky::onBtnSave()
+{
+ LLWLParamKey selected_sky = getSelectedSkyPreset();
+ LLWLParamManager& wl_mgr = LLWLParamManager::instance();
+
+ if (selected_sky.scope == LLEnvKey::SCOPE_REGION)
+ {
+ saveRegionSky();
+ closeFloater();
+ return;
+ }
+
+ std::string name = selected_sky.name;
+ if (name.empty())
+ {
+ // *TODO: show an alert
+ llwarns << "Empty sky preset name" << llendl;
+ return;
+ }
+
+ // Don't allow overwriting system presets.
+ if (wl_mgr.isSystemPreset(name))
+ {
+ LLNotificationsUtil::add("WLNoEditDefault");
+ return;
+ }
+
+ // Save, ask for confirmation for overwriting an existing preset.
+ if (wl_mgr.hasParamSet(selected_sky))
+ {
+ LLNotificationsUtil::add("WLSavePresetAlert", LLSD(), LLSD(), boost::bind(&LLFloaterEditSky::onSaveAnswer, this, _1, _2));
+ }
+ else
+ {
+ // new preset, hence no confirmation needed
+ onSaveConfirmed();
+ }
+}
+
+void LLFloaterEditSky::onBtnCancel()
+{
+ closeFloater();
+}
+
+void LLFloaterEditSky::onSkyPresetListChange()
+{
+ LLWLParamKey key = getSelectedSkyPreset(); // preset being edited
+ if (!LLWLParamManager::instance().hasParamSet(key))
+ {
+ // Preset we've been editing doesn't exist anymore. Close the floater.
+ closeFloater(false);
+ }
+ else
+ {
+ // A new preset has been added.
+ // Refresh the presets list, though it may not make sense as the floater is about to be closed.
+ refreshSkyPresetsList();
+ }
+}
+
+void LLFloaterEditSky::onRegionSettingsChange()
+{
+ // If creating a new sky, don't bother.
+ if (isNewPreset())
+ {
+ return;
+ }
+
+ if (getSelectedSkyPreset().scope == LLEnvKey::SCOPE_REGION) // if editing a region sky
+ {
+ // reset the floater to its initial state
+ reset();
+
+ // *TODO: Notify user?
+ }
+ else // editing a local sky
+ {
+ refreshSkyPresetsList();
+ }
+}
+
+void LLFloaterEditSky::onRegionInfoUpdate()
+{
+ bool can_edit = true;
+
+ // If we've selected a region sky preset for editing.
+ if (getSelectedSkyPreset().scope == LLEnvKey::SCOPE_REGION)
+ {
+ // check whether we have the access
+ can_edit = LLEnvManagerNew::canEditRegionSettings();
+ }
+
+ enableEditing(can_edit);
+}
diff --git a/indra/newview/llfloatereditsky.h b/indra/newview/llfloatereditsky.h
new file mode 100644
index 0000000000..a06c4fc5fa
--- /dev/null
+++ b/indra/newview/llfloatereditsky.h
@@ -0,0 +1,113 @@
+/**
+ * @file llfloatereditsky.h
+ * @brief Floater to create or edit a sky preset
+ *
+ * $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_LLFLOATEREDITSKY_H
+#define LL_LLFLOATEREDITSKY_H
+
+#include "llfloater.h"
+#include "llwlparammanager.h"
+
+class LLButton;
+class LLCheckBoxCtrl;
+class LLComboBox;
+class LLLineEditor;
+
+/**
+ * Floater for creating or editing a sky preset.
+ */
+class LLFloaterEditSky : public LLFloater
+{
+ LOG_CLASS(LLFloaterEditSky);
+
+public:
+ LLFloaterEditSky(const LLSD &key);
+
+ /*virtual*/ BOOL postBuild();
+ /*virtual*/ void onOpen(const LLSD& key);
+ /*virtual*/ void onClose(bool app_quitting);
+ /*virtual*/ void draw();
+
+private:
+ void initCallbacks(void);
+
+ //-- WL stuff begins ------------------------------------------------------
+
+ void syncControls(); /// sync up sliders with parameters
+
+ void setColorSwatch(const std::string& name, const WLColorControl& from_ctrl, F32 k);
+
+ // general purpose callbacks for dealing with color controllers
+ void onColorControlMoved(LLUICtrl* ctrl, WLColorControl* color_ctrl);
+ void onColorControlRMoved(LLUICtrl* ctrl, void* userdata);
+ void onColorControlGMoved(LLUICtrl* ctrl, void* userdata);
+ void onColorControlBMoved(LLUICtrl* ctrl, void* userdata);
+ void onFloatControlMoved(LLUICtrl* ctrl, void* userdata);
+
+ // lighting callbacks for glow
+ void onGlowRMoved(LLUICtrl* ctrl, void* userdata);
+ void onGlowBMoved(LLUICtrl* ctrl, void* userdata);
+
+ // lighting callbacks for sun
+ void onSunMoved(LLUICtrl* ctrl, void* userdata);
+ void onTimeChanged();
+
+ // for handling when the star slider is moved to adjust the alpha
+ void onStarAlphaMoved(LLUICtrl* ctrl);
+
+ // handle cloud scrolling
+ void onCloudScrollXMoved(LLUICtrl* ctrl);
+ void onCloudScrollYMoved(LLUICtrl* ctrl);
+ void onCloudScrollXToggled(LLUICtrl* ctrl);
+ void onCloudScrollYToggled(LLUICtrl* ctrl);
+
+ //-- WL stuff ends --------------------------------------------------------
+
+ void reset(); /// reset the floater to its initial state
+ bool isNewPreset() const;
+ void refreshSkyPresetsList();
+ void enableEditing(bool enable);
+ void saveRegionSky();
+ LLWLParamKey getSelectedSkyPreset();
+
+ void onSkyPresetNameEdited();
+ void onSkyPresetSelected();
+ bool onSaveAnswer(const LLSD& notification, const LLSD& response);
+ void onSaveConfirmed();
+
+ void onBtnSave();
+ void onBtnCancel();
+
+ void onSkyPresetListChange();
+ void onRegionSettingsChange();
+ void onRegionInfoUpdate();
+
+ LLLineEditor* mSkyPresetNameEditor;
+ LLComboBox* mSkyPresetCombo;
+ LLCheckBoxCtrl* mMakeDefaultCheckBox;
+ LLButton* mSaveButton;
+};
+
+#endif // LL_LLFLOATEREDITSKY_H
diff --git a/indra/newview/llfloatereditwater.cpp b/indra/newview/llfloatereditwater.cpp
new file mode 100644
index 0000000000..64cfc4054f
--- /dev/null
+++ b/indra/newview/llfloatereditwater.cpp
@@ -0,0 +1,772 @@
+/**
+ * @file llfloatereditwater.cpp
+ * @brief Floater to create or edit a water preset
+ *
+ * $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 "llfloatereditwater.h"
+
+// libs
+#include "llbutton.h"
+#include "llcheckboxctrl.h"
+#include "llcolorswatch.h"
+#include "llcombobox.h"
+//#include "llnotifications.h"
+#include "llnotificationsutil.h"
+#include "llsliderctrl.h"
+#include "lltexturectrl.h"
+
+// newview
+#include "llagent.h"
+#include "llregioninfomodel.h"
+#include "llviewerregion.h"
+#include "llwaterparammanager.h"
+
+#undef max // Fixes a Windows compiler error
+
+LLFloaterEditWater::LLFloaterEditWater(const LLSD &key)
+: LLFloater(key)
+, mWaterPresetNameEditor(NULL)
+, mWaterPresetCombo(NULL)
+, mMakeDefaultCheckBox(NULL)
+, mSaveButton(NULL)
+{
+}
+
+// virtual
+BOOL LLFloaterEditWater::postBuild()
+{
+ mWaterPresetNameEditor = getChild<LLLineEditor>("water_preset_name");
+ mWaterPresetCombo = getChild<LLComboBox>("water_preset_combo");
+ mMakeDefaultCheckBox = getChild<LLCheckBoxCtrl>("make_default_cb");
+ mSaveButton = getChild<LLButton>("save");
+
+ initCallbacks();
+ refreshWaterPresetsList();
+ syncControls();
+
+ return TRUE;
+}
+
+// virtual
+void LLFloaterEditWater::onOpen(const LLSD& key)
+{
+ bool new_preset = isNewPreset();
+ std::string param = key.asString();
+ std::string floater_title = getString(std::string("title_") + param);
+ std::string hint = getString(std::string("hint_" + param));
+
+ // Update floater title.
+ setTitle(floater_title);
+
+ // Update the hint at the top.
+ getChild<LLUICtrl>("hint")->setValue(hint);
+
+ // Hide the hint to the right of the combo if we're invoked to create a new preset.
+ getChildView("note")->setVisible(!new_preset);
+
+ // Switch between the water presets combobox and preset name input field.
+ mWaterPresetCombo->setVisible(!new_preset);
+ mWaterPresetNameEditor->setVisible(new_preset);
+
+ reset();
+}
+
+// virtual
+void LLFloaterEditWater::onClose(bool app_quitting)
+{
+ if (!app_quitting) // there's no point to change environment if we're quitting
+ {
+ LLEnvManagerNew::instance().usePrefs(); // revert changes made to current environment
+ }
+}
+
+// virtual
+void LLFloaterEditWater::draw()
+{
+ syncControls();
+ LLFloater::draw();
+}
+
+void LLFloaterEditWater::initCallbacks(void)
+{
+ mWaterPresetNameEditor->setKeystrokeCallback(boost::bind(&LLFloaterEditWater::onWaterPresetNameEdited, this), NULL);
+ mWaterPresetCombo->setCommitCallback(boost::bind(&LLFloaterEditWater::onWaterPresetSelected, this));
+ mWaterPresetCombo->setTextEntryCallback(boost::bind(&LLFloaterEditWater::onWaterPresetNameEdited, this));
+
+ mSaveButton->setCommitCallback(boost::bind(&LLFloaterEditWater::onBtnSave, this));
+ getChild<LLButton>("cancel")->setCommitCallback(boost::bind(&LLFloaterEditWater::onBtnCancel, this));
+
+ LLEnvManagerNew::instance().setRegionSettingsChangeCallback(boost::bind(&LLFloaterEditWater::onRegionSettingsChange, this));
+ LLWaterParamManager::instance().setPresetListChangeCallback(boost::bind(&LLFloaterEditWater::onWaterPresetListChange, this));
+
+ // Connect to region info updates.
+ LLRegionInfoModel::instance().setUpdateCallback(boost::bind(&LLFloaterEditWater::onRegionInfoUpdate, this));
+
+ //-------------------------------------------------------------------------
+
+ LLWaterParamManager& water_mgr = LLWaterParamManager::instance();
+
+ getChild<LLUICtrl>("WaterFogColor")->setCommitCallback(boost::bind(&LLFloaterEditWater::onWaterFogColorMoved, this, _1, &water_mgr.mFogColor));
+ //getChild<LLUICtrl>("WaterGlow")->setCommitCallback(boost::bind(&LLFloaterEditWater::onColorControlAMoved, this, _1, &water_mgr.mFogColor));
+
+ // fog density
+ getChild<LLUICtrl>("WaterFogDensity")->setCommitCallback(boost::bind(&LLFloaterEditWater::onExpFloatControlMoved, this, _1, &water_mgr.mFogDensity));
+ getChild<LLUICtrl>("WaterUnderWaterFogMod")->setCommitCallback(boost::bind(&LLFloaterEditWater::onFloatControlMoved, this, _1, &water_mgr.mUnderWaterFogMod));
+
+ // blue density
+ getChild<LLUICtrl>("WaterNormalScaleX")->setCommitCallback(boost::bind(&LLFloaterEditWater::onVector3ControlXMoved, this, _1, &water_mgr.mNormalScale));
+ getChild<LLUICtrl>("WaterNormalScaleY")->setCommitCallback(boost::bind(&LLFloaterEditWater::onVector3ControlYMoved, this, _1, &water_mgr.mNormalScale));
+ getChild<LLUICtrl>("WaterNormalScaleZ")->setCommitCallback(boost::bind(&LLFloaterEditWater::onVector3ControlZMoved, this, _1, &water_mgr.mNormalScale));
+
+ // fresnel
+ getChild<LLUICtrl>("WaterFresnelScale")->setCommitCallback(boost::bind(&LLFloaterEditWater::onFloatControlMoved, this, _1, &water_mgr.mFresnelScale));
+ getChild<LLUICtrl>("WaterFresnelOffset")->setCommitCallback(boost::bind(&LLFloaterEditWater::onFloatControlMoved, this, _1, &water_mgr.mFresnelOffset));
+
+ // scale above/below
+ getChild<LLUICtrl>("WaterScaleAbove")->setCommitCallback(boost::bind(&LLFloaterEditWater::onFloatControlMoved, this, _1, &water_mgr.mScaleAbove));
+ getChild<LLUICtrl>("WaterScaleBelow")->setCommitCallback(boost::bind(&LLFloaterEditWater::onFloatControlMoved, this, _1, &water_mgr.mScaleBelow));
+
+ // blur mult
+ getChild<LLUICtrl>("WaterBlurMult")->setCommitCallback(boost::bind(&LLFloaterEditWater::onFloatControlMoved, this, _1, &water_mgr.mBlurMultiplier));
+
+ // wave direction
+ getChild<LLUICtrl>("WaterWave1DirX")->setCommitCallback(boost::bind(&LLFloaterEditWater::onVector2ControlXMoved, this, _1, &water_mgr.mWave1Dir));
+ getChild<LLUICtrl>("WaterWave1DirY")->setCommitCallback(boost::bind(&LLFloaterEditWater::onVector2ControlYMoved, this, _1, &water_mgr.mWave1Dir));
+ getChild<LLUICtrl>("WaterWave2DirX")->setCommitCallback(boost::bind(&LLFloaterEditWater::onVector2ControlXMoved, this, _1, &water_mgr.mWave2Dir));
+ getChild<LLUICtrl>("WaterWave2DirY")->setCommitCallback(boost::bind(&LLFloaterEditWater::onVector2ControlYMoved, this, _1, &water_mgr.mWave2Dir));
+
+ LLTextureCtrl* texture_ctrl = getChild<LLTextureCtrl>("WaterNormalMap");
+ texture_ctrl->setDefaultImageAssetID(DEFAULT_WATER_NORMAL);
+ texture_ctrl->setCommitCallback(boost::bind(&LLFloaterEditWater::onNormalMapPicked, this, _1));
+}
+
+//=============================================================================
+
+void LLFloaterEditWater::syncControls()
+{
+ // *TODO: Eliminate slow getChild() calls.
+
+ bool err;
+
+ LLWaterParamManager& water_mgr = LLWaterParamManager::instance();
+
+ LLWaterParamSet& current_params = water_mgr.mCurParams;
+
+ // blue horizon
+ water_mgr.mFogColor = current_params.getVector4(water_mgr.mFogColor.mName, err);
+
+ LLColor4 col = water_mgr.getFogColor();
+ //getChild<LLUICtrl>("WaterGlow")->setValue(col.mV[3]);
+ col.mV[3] = 1.0f;
+ getChild<LLColorSwatchCtrl>("WaterFogColor")->set(col);
+
+ // fog and wavelets
+ water_mgr.mFogDensity.mExp =
+ log(current_params.getFloat(water_mgr.mFogDensity.mName, err)) /
+ log(water_mgr.mFogDensity.mBase);
+ water_mgr.setDensitySliderValue(water_mgr.mFogDensity.mExp);
+ getChild<LLUICtrl>("WaterFogDensity")->setValue(water_mgr.mFogDensity.mExp);
+
+ water_mgr.mUnderWaterFogMod.mX =
+ current_params.getFloat(water_mgr.mUnderWaterFogMod.mName, err);
+ getChild<LLUICtrl>("WaterUnderWaterFogMod")->setValue(water_mgr.mUnderWaterFogMod.mX);
+
+ water_mgr.mNormalScale = current_params.getVector3(water_mgr.mNormalScale.mName, err);
+ getChild<LLUICtrl>("WaterNormalScaleX")->setValue(water_mgr.mNormalScale.mX);
+ getChild<LLUICtrl>("WaterNormalScaleY")->setValue(water_mgr.mNormalScale.mY);
+ getChild<LLUICtrl>("WaterNormalScaleZ")->setValue(water_mgr.mNormalScale.mZ);
+
+ // Fresnel
+ water_mgr.mFresnelScale.mX = current_params.getFloat(water_mgr.mFresnelScale.mName, err);
+ getChild<LLUICtrl>("WaterFresnelScale")->setValue(water_mgr.mFresnelScale.mX);
+ water_mgr.mFresnelOffset.mX = current_params.getFloat(water_mgr.mFresnelOffset.mName, err);
+ getChild<LLUICtrl>("WaterFresnelOffset")->setValue(water_mgr.mFresnelOffset.mX);
+
+ // Scale Above/Below
+ water_mgr.mScaleAbove.mX = current_params.getFloat(water_mgr.mScaleAbove.mName, err);
+ getChild<LLUICtrl>("WaterScaleAbove")->setValue(water_mgr.mScaleAbove.mX);
+ water_mgr.mScaleBelow.mX = current_params.getFloat(water_mgr.mScaleBelow.mName, err);
+ getChild<LLUICtrl>("WaterScaleBelow")->setValue(water_mgr.mScaleBelow.mX);
+
+ // blur mult
+ water_mgr.mBlurMultiplier.mX = current_params.getFloat(water_mgr.mBlurMultiplier.mName, err);
+ getChild<LLUICtrl>("WaterBlurMult")->setValue(water_mgr.mBlurMultiplier.mX);
+
+ // wave directions
+ water_mgr.mWave1Dir = current_params.getVector2(water_mgr.mWave1Dir.mName, err);
+ getChild<LLUICtrl>("WaterWave1DirX")->setValue(water_mgr.mWave1Dir.mX);
+ getChild<LLUICtrl>("WaterWave1DirY")->setValue(water_mgr.mWave1Dir.mY);
+
+ water_mgr.mWave2Dir = current_params.getVector2(water_mgr.mWave2Dir.mName, err);
+ getChild<LLUICtrl>("WaterWave2DirX")->setValue(water_mgr.mWave2Dir.mX);
+ getChild<LLUICtrl>("WaterWave2DirY")->setValue(water_mgr.mWave2Dir.mY);
+
+ LLTextureCtrl* textCtrl = getChild<LLTextureCtrl>("WaterNormalMap");
+ textCtrl->setImageAssetID(water_mgr.getNormalMapID());
+}
+
+// color control callbacks
+void LLFloaterEditWater::onColorControlRMoved(LLUICtrl* ctrl, WaterColorControl* color_ctrl)
+{
+ LLSliderCtrl* sldr_ctrl = static_cast<LLSliderCtrl*>(ctrl);
+
+ color_ctrl->mR = sldr_ctrl->getValueF32();
+
+ // move i if it's the max
+ if (color_ctrl->mR >= color_ctrl->mG
+ && color_ctrl->mR >= color_ctrl->mB
+ && color_ctrl->mHasSliderName)
+ {
+ color_ctrl->mI = color_ctrl->mR;
+ std::string name = color_ctrl->mSliderName;
+ name.append("I");
+
+ getChild<LLUICtrl>(name)->setValue(color_ctrl->mR);
+ }
+
+ color_ctrl->update(LLWaterParamManager::getInstance()->mCurParams);
+
+ LLWaterParamManager::getInstance()->propagateParameters();
+}
+
+void LLFloaterEditWater::onColorControlGMoved(LLUICtrl* ctrl, WaterColorControl* color_ctrl)
+{
+ LLSliderCtrl* sldr_ctrl = static_cast<LLSliderCtrl*>(ctrl);
+
+ color_ctrl->mG = sldr_ctrl->getValueF32();
+
+ // move i if it's the max
+ if (color_ctrl->mG >= color_ctrl->mR
+ && color_ctrl->mG >= color_ctrl->mB
+ && color_ctrl->mHasSliderName)
+ {
+ color_ctrl->mI = color_ctrl->mG;
+ std::string name = color_ctrl->mSliderName;
+ name.append("I");
+
+ getChild<LLUICtrl>(name)->setValue(color_ctrl->mG);
+
+ }
+
+ color_ctrl->update(LLWaterParamManager::getInstance()->mCurParams);
+
+ LLWaterParamManager::getInstance()->propagateParameters();
+}
+
+void LLFloaterEditWater::onColorControlBMoved(LLUICtrl* ctrl, WaterColorControl* color_ctrl)
+{
+ LLSliderCtrl* sldr_ctrl = static_cast<LLSliderCtrl*>(ctrl);
+
+ color_ctrl->mB = sldr_ctrl->getValueF32();
+
+ // move i if it's the max
+ if (color_ctrl->mB >= color_ctrl->mR
+ && color_ctrl->mB >= color_ctrl->mG
+ && color_ctrl->mHasSliderName)
+ {
+ color_ctrl->mI = color_ctrl->mB;
+ std::string name = color_ctrl->mSliderName;
+ name.append("I");
+
+ getChild<LLUICtrl>(name)->setValue(color_ctrl->mB);
+ }
+
+ color_ctrl->update(LLWaterParamManager::getInstance()->mCurParams);
+
+ LLWaterParamManager::getInstance()->propagateParameters();
+}
+
+void LLFloaterEditWater::onColorControlAMoved(LLUICtrl* ctrl, WaterColorControl* color_ctrl)
+{
+ LLSliderCtrl* sldr_ctrl = static_cast<LLSliderCtrl*>(ctrl);
+
+ color_ctrl->mA = sldr_ctrl->getValueF32();
+
+ color_ctrl->update(LLWaterParamManager::getInstance()->mCurParams);
+
+ LLWaterParamManager::getInstance()->propagateParameters();
+}
+
+
+void LLFloaterEditWater::onColorControlIMoved(LLUICtrl* ctrl, WaterColorControl* color_ctrl)
+{
+ LLSliderCtrl* sldr_ctrl = static_cast<LLSliderCtrl*>(ctrl);
+
+ color_ctrl->mI = sldr_ctrl->getValueF32();
+
+ // only for sliders where we pass a name
+ if (color_ctrl->mHasSliderName)
+ {
+ // set it to the top
+ F32 maxVal = std::max(std::max(color_ctrl->mR, color_ctrl->mG), color_ctrl->mB);
+ F32 iVal;
+
+ iVal = color_ctrl->mI;
+
+ // get the names of the other sliders
+ std::string rName = color_ctrl->mSliderName;
+ rName.append("R");
+ std::string gName = color_ctrl->mSliderName;
+ gName.append("G");
+ std::string bName = color_ctrl->mSliderName;
+ bName.append("B");
+
+ // handle if at 0
+ if (iVal == 0)
+ {
+ color_ctrl->mR = 0;
+ color_ctrl->mG = 0;
+ color_ctrl->mB = 0;
+
+ // if all at the start
+ // set them all to the intensity
+ }
+ else if (maxVal == 0)
+ {
+ color_ctrl->mR = iVal;
+ color_ctrl->mG = iVal;
+ color_ctrl->mB = iVal;
+ }
+ else
+ {
+ // add delta amounts to each
+ F32 delta = (iVal - maxVal) / maxVal;
+ color_ctrl->mR *= (1.0f + delta);
+ color_ctrl->mG *= (1.0f + delta);
+ color_ctrl->mB *= (1.0f + delta);
+ }
+
+ // set the sliders to the new vals
+ getChild<LLUICtrl>(rName)->setValue(color_ctrl->mR);
+ getChild<LLUICtrl>(gName)->setValue(color_ctrl->mG);
+ getChild<LLUICtrl>(bName)->setValue(color_ctrl->mB);
+ }
+
+ // now update the current parameters and send them to shaders
+ color_ctrl->update(LLWaterParamManager::getInstance()->mCurParams);
+ LLWaterParamManager::getInstance()->propagateParameters();
+}
+
+// vector control callbacks
+void LLFloaterEditWater::onVector3ControlXMoved(LLUICtrl* ctrl, WaterVector3Control* vector_ctrl)
+{
+ LLSliderCtrl* sldr_ctrl = static_cast<LLSliderCtrl*>(ctrl);
+
+ vector_ctrl->mX = sldr_ctrl->getValueF32();
+
+ vector_ctrl->update(LLWaterParamManager::getInstance()->mCurParams);
+
+ LLWaterParamManager::getInstance()->propagateParameters();
+}
+
+// vector control callbacks
+void LLFloaterEditWater::onVector3ControlYMoved(LLUICtrl* ctrl, WaterVector3Control* vector_ctrl)
+{
+ LLSliderCtrl* sldr_ctrl = static_cast<LLSliderCtrl*>(ctrl);
+
+ vector_ctrl->mY = sldr_ctrl->getValueF32();
+
+ vector_ctrl->update(LLWaterParamManager::getInstance()->mCurParams);
+
+ LLWaterParamManager::getInstance()->propagateParameters();
+}
+
+// vector control callbacks
+void LLFloaterEditWater::onVector3ControlZMoved(LLUICtrl* ctrl, WaterVector3Control* vector_ctrl)
+{
+ LLSliderCtrl* sldr_ctrl = static_cast<LLSliderCtrl*>(ctrl);
+
+ vector_ctrl->mZ = sldr_ctrl->getValueF32();
+
+ vector_ctrl->update(LLWaterParamManager::getInstance()->mCurParams);
+
+ LLWaterParamManager::getInstance()->propagateParameters();
+}
+
+
+// vector control callbacks
+void LLFloaterEditWater::onVector2ControlXMoved(LLUICtrl* ctrl, WaterVector2Control* vector_ctrl)
+{
+ LLSliderCtrl* sldr_ctrl = static_cast<LLSliderCtrl*>(ctrl);
+
+ vector_ctrl->mX = sldr_ctrl->getValueF32();
+
+ vector_ctrl->update(LLWaterParamManager::getInstance()->mCurParams);
+
+ LLWaterParamManager::getInstance()->propagateParameters();
+}
+
+// vector control callbacks
+void LLFloaterEditWater::onVector2ControlYMoved(LLUICtrl* ctrl, WaterVector2Control* vector_ctrl)
+{
+ LLSliderCtrl* sldr_ctrl = static_cast<LLSliderCtrl*>(ctrl);
+
+ vector_ctrl->mY = sldr_ctrl->getValueF32();
+
+ vector_ctrl->update(LLWaterParamManager::getInstance()->mCurParams);
+
+ LLWaterParamManager::getInstance()->propagateParameters();
+}
+
+void LLFloaterEditWater::onFloatControlMoved(LLUICtrl* ctrl, WaterFloatControl* floatControl)
+{
+ LLSliderCtrl* sldr_ctrl = static_cast<LLSliderCtrl*>(ctrl);
+
+ floatControl->mX = sldr_ctrl->getValueF32() / floatControl->mMult;
+
+ floatControl->update(LLWaterParamManager::getInstance()->mCurParams);
+ LLWaterParamManager::getInstance()->propagateParameters();
+}
+
+void LLFloaterEditWater::onExpFloatControlMoved(LLUICtrl* ctrl, WaterExpFloatControl* expFloatControl)
+{
+ LLSliderCtrl* sldr_ctrl = static_cast<LLSliderCtrl*>(ctrl);
+
+ F32 val = sldr_ctrl->getValueF32();
+ expFloatControl->mExp = val;
+ LLWaterParamManager::getInstance()->setDensitySliderValue(val);
+
+ expFloatControl->update(LLWaterParamManager::getInstance()->mCurParams);
+ LLWaterParamManager::getInstance()->propagateParameters();
+}
+
+void LLFloaterEditWater::onWaterFogColorMoved(LLUICtrl* ctrl, WaterColorControl* color_ctrl)
+{
+ LLColorSwatchCtrl* swatch = static_cast<LLColorSwatchCtrl*>(ctrl);
+ *color_ctrl = swatch->get();
+
+ color_ctrl->update(LLWaterParamManager::getInstance()->mCurParams);
+ LLWaterParamManager::getInstance()->propagateParameters();
+}
+
+void LLFloaterEditWater::onNormalMapPicked(LLUICtrl* ctrl)
+{
+ LLTextureCtrl* textCtrl = static_cast<LLTextureCtrl*>(ctrl);
+ LLUUID textID = textCtrl->getImageAssetID();
+ LLWaterParamManager::getInstance()->setNormalMapID(textID);
+}
+
+//=============================================================================
+
+void LLFloaterEditWater::reset()
+{
+ if (isNewPreset())
+ {
+ mWaterPresetNameEditor->setValue(LLSD());
+ mSaveButton->setEnabled(FALSE); // will be enabled as soon as users enters a name
+ }
+ else
+ {
+ refreshWaterPresetsList();
+
+ // Disable controls until a water preset to edit is selected.
+ enableEditing(false);
+ }
+}
+
+bool LLFloaterEditWater::isNewPreset() const
+{
+ return mKey.asString() == "new";
+}
+
+void LLFloaterEditWater::refreshWaterPresetsList()
+{
+ mWaterPresetCombo->removeall();
+
+#if 0 // *TODO: enable when we have a clear workflow to edit existing region environment
+ // If the region already has water params, add them to the list.
+ const LLEnvironmentSettings& region_settings = LLEnvManagerNew::instance().getRegionSettings();
+ if (region_settings.getWaterParams().size() != 0)
+ {
+ const std::string& region_name = gAgent.getRegion()->getName();
+ mWaterPresetCombo->add(region_name, LLSD().with(0, region_name).with(1, LLEnvKey::SCOPE_REGION));
+ mWaterPresetCombo->addSeparator();
+ }
+#endif
+
+ std::list<std::string> user_presets, system_presets;
+ LLWaterParamManager::instance().getPresetNames(user_presets, system_presets);
+
+ // Add local user presets first.
+ for (std::list<std::string>::const_iterator it = user_presets.begin(); it != user_presets.end(); ++it)
+ {
+ const std::string& name = *it;
+ mWaterPresetCombo->add(name, LLSD().with(0, name).with(1, LLEnvKey::SCOPE_LOCAL)); // [<name>, <scope>]
+ }
+
+ if (user_presets.size() > 0)
+ {
+ mWaterPresetCombo->addSeparator();
+ }
+
+ // Add local system presets.
+ for (std::list<std::string>::const_iterator it = system_presets.begin(); it != system_presets.end(); ++it)
+ {
+ const std::string& name = *it;
+ mWaterPresetCombo->add(name, LLSD().with(0, name).with(1, LLEnvKey::SCOPE_LOCAL)); // [<name>, <scope>]
+ }
+
+ mWaterPresetCombo->setLabel(getString("combo_label"));
+}
+
+void LLFloaterEditWater::enableEditing(bool enable)
+{
+ // Enable/disable water controls.
+ getChild<LLPanel>("panel_water_preset")->setCtrlsEnabled(enable);
+
+ // Enable/disable saving.
+ mSaveButton->setEnabled(enable);
+ mMakeDefaultCheckBox->setEnabled(enable);
+}
+
+void LLFloaterEditWater::saveRegionWater()
+{
+ llassert(getCurrentScope() == LLEnvKey::SCOPE_REGION); // make sure we're editing region water
+
+ LL_DEBUGS("Windlight") << "Saving region water preset" << llendl;
+
+ //LLWaterParamSet region_water = water_mgr.mCurParams;
+
+ // *TODO: save to cached region settings.
+ LL_WARNS("Windlight") << "Saving region water is not fully implemented yet" << LL_ENDL;
+}
+
+std::string LLFloaterEditWater::getCurrentPresetName() const
+{
+ std::string name;
+ LLEnvKey::EScope scope;
+ getSelectedPreset(name, scope);
+ return name;
+}
+
+LLEnvKey::EScope LLFloaterEditWater::getCurrentScope() const
+{
+ std::string name;
+ LLEnvKey::EScope scope;
+ getSelectedPreset(name, scope);
+ return scope;
+}
+
+void LLFloaterEditWater::getSelectedPreset(std::string& name, LLEnvKey::EScope& scope) const
+{
+ if (mWaterPresetNameEditor->getVisible())
+ {
+ name = mWaterPresetNameEditor->getText();
+ scope = LLEnvKey::SCOPE_LOCAL;
+ }
+ else
+ {
+ LLSD combo_val = mWaterPresetCombo->getValue();
+
+ if (!combo_val.isArray()) // manually typed text
+ {
+ name = combo_val.asString();
+ scope = LLEnvKey::SCOPE_LOCAL;
+ }
+ else
+ {
+ name = combo_val[0].asString();
+ scope = (LLEnvKey::EScope) combo_val[1].asInteger();
+ }
+ }
+}
+
+void LLFloaterEditWater::onWaterPresetNameEdited()
+{
+ // Disable saving a water preset having empty name.
+ mSaveButton->setEnabled(!getCurrentPresetName().empty());
+}
+
+void LLFloaterEditWater::onWaterPresetSelected()
+{
+ LLWaterParamSet water_params;
+ std::string name;
+ LLEnvKey::EScope scope;
+
+ getSelectedPreset(name, scope);
+
+ // Display selected preset.
+ if (scope == LLEnvKey::SCOPE_REGION)
+ {
+ water_params.setAll(LLEnvManagerNew::instance().getRegionSettings().getWaterParams());
+ }
+ else // local preset selected
+ {
+ if (!LLWaterParamManager::instance().getParamSet(name, water_params))
+ {
+ // Manually entered string?
+ LL_WARNS("Windlight") << "No water preset named " << name << LL_ENDL;
+ return;
+ }
+ }
+
+ LLEnvManagerNew::instance().useWaterParams(water_params.getAll());
+
+ bool can_edit = (scope == LLEnvKey::SCOPE_LOCAL || LLEnvManagerNew::canEditRegionSettings());
+ enableEditing(can_edit);
+
+ mMakeDefaultCheckBox->setEnabled(scope == LLEnvKey::SCOPE_LOCAL);
+}
+
+bool LLFloaterEditWater::onSaveAnswer(const LLSD& notification, const LLSD& response)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+
+ // If they choose save, do it. Otherwise, don't do anything
+ if (option == 0)
+ {
+ onSaveConfirmed();
+ }
+
+ return false;
+}
+
+void LLFloaterEditWater::onSaveConfirmed()
+{
+ // Save currently displayed water params to the selected preset.
+ std::string name = getCurrentPresetName();
+
+ LL_DEBUGS("Windlight") << "Saving sky preset " << name << LL_ENDL;
+ LLWaterParamManager& water_mgr = LLWaterParamManager::instance();
+ if (water_mgr.hasParamSet(name))
+ {
+ water_mgr.setParamSet(name, water_mgr.mCurParams);
+ }
+ else
+ {
+ water_mgr.addParamSet(name, water_mgr.mCurParams);
+ }
+
+ water_mgr.savePreset(name);
+
+ // Change preference if requested.
+ if (mMakeDefaultCheckBox->getEnabled() && mMakeDefaultCheckBox->getValue())
+ {
+ LL_DEBUGS("Windlight") << name << " is now the new preferred water preset" << llendl;
+ LLEnvManagerNew::instance().setUseWaterPreset(name);
+ }
+
+ closeFloater();
+}
+
+void LLFloaterEditWater::onBtnSave()
+{
+ LLEnvKey::EScope scope;
+ std::string name;
+ getSelectedPreset(name, scope);
+
+ if (scope == LLEnvKey::SCOPE_REGION)
+ {
+ saveRegionWater();
+ closeFloater();
+ return;
+ }
+
+ if (name.empty())
+ {
+ // *TODO: show an alert
+ llwarns << "Empty water preset name" << llendl;
+ return;
+ }
+
+ // Don't allow overwriting system presets.
+ LLWaterParamManager& water_mgr = LLWaterParamManager::instance();
+ if (water_mgr.isSystemPreset(name))
+ {
+ LLNotificationsUtil::add("WLNoEditDefault");
+ return;
+ }
+
+ // Save, ask for confirmation for overwriting an existing preset.
+ if (water_mgr.hasParamSet(name))
+ {
+ LLNotificationsUtil::add("WLSavePresetAlert", LLSD(), LLSD(), boost::bind(&LLFloaterEditWater::onSaveAnswer, this, _1, _2));
+ }
+ else
+ {
+ // new preset, hence no confirmation needed
+ onSaveConfirmed();
+ }
+}
+
+void LLFloaterEditWater::onBtnCancel()
+{
+ closeFloater();
+}
+
+void LLFloaterEditWater::onWaterPresetListChange()
+{
+ std::string name;
+ LLEnvKey::EScope scope;
+ getSelectedPreset(name, scope); // preset being edited
+
+ if (scope == LLEnvKey::SCOPE_LOCAL && !LLWaterParamManager::instance().hasParamSet(name))
+ {
+ // Preset we've been editing doesn't exist anymore. Close the floater.
+ closeFloater(false);
+ }
+ else
+ {
+ // A new preset has been added.
+ // Refresh the presets list, though it may not make sense as the floater is about to be closed.
+ refreshWaterPresetsList();
+ }
+}
+
+void LLFloaterEditWater::onRegionSettingsChange()
+{
+ // If creating a new preset, don't bother.
+ if (isNewPreset())
+ {
+ return;
+ }
+
+ if (getCurrentScope() == LLEnvKey::SCOPE_REGION) // if editing region water
+ {
+ // reset the floater to its initial state
+ reset();
+
+ // *TODO: Notify user?
+ }
+ else // editing a local preset
+ {
+ refreshWaterPresetsList();
+ }
+}
+
+void LLFloaterEditWater::onRegionInfoUpdate()
+{
+ bool can_edit = true;
+
+ // If we've selected the region water for editing.
+ if (getCurrentScope() == LLEnvKey::SCOPE_REGION)
+ {
+ // check whether we have the access
+ can_edit = LLEnvManagerNew::canEditRegionSettings();
+ }
+
+ enableEditing(can_edit);
+}
diff --git a/indra/newview/llfloaterwater.h b/indra/newview/llfloatereditwater.h
index e3db91e80d..2211bca59f 100644
--- a/indra/newview/llfloaterwater.h
+++ b/indra/newview/llfloatereditwater.h
@@ -1,10 +1,10 @@
/**
- * @file llfloaterwindlight.h
- * @brief LLFloaterWater class definition
+ * @file llfloatereditwater.h
+ * @brief Floater to create or edit a water preset
*
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
* Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
+ * 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
@@ -24,17 +24,16 @@
* $/LicenseInfo$
*/
-/*
- * Menu for adjusting the atmospheric settings of the world
- */
-
-#ifndef LL_LLFLOATER_WATER_H
-#define LL_LLFLOATER_WATER_H
+#ifndef LL_LLFLOATEREDITWATER_H
+#define LL_LLFLOATEREDITWATER_H
#include "llfloater.h"
+#include "llenvmanager.h" // for LLEnvKey
-#include <vector>
-#include "llwlparamset.h"
+class LLButton;
+class LLCheckBoxCtrl;
+class LLComboBox;
+class LLLineEditor;
struct WaterVector2Control;
struct WaterVector3Control;
@@ -42,66 +41,75 @@ struct WaterColorControl;
struct WaterFloatControl;
struct WaterExpFloatControl;
-/// Menuing system for all of windlight's functionality
-class LLFloaterWater : public LLFloater
+class LLFloaterEditWater : public LLFloater
{
+ LOG_CLASS(LLFloaterEditWater);
+
public:
+ LLFloaterEditWater(const LLSD &key);
- LLFloaterWater(const LLSD& key);
- virtual ~LLFloaterWater();
/*virtual*/ BOOL postBuild();
- /// initialize all
+ /*virtual*/ void onOpen(const LLSD& key);
+ /*virtual*/ void onClose(bool app_quitting);
+ /*virtual*/ void draw();
+
+private:
void initCallbacks(void);
- bool newPromptCallback(const LLSD& notification, const LLSD& response);
+ //-- WL stuff begins ------------------------------------------------------
- /// general purpose callbacks for dealing with color controllers
- void onColorControlRMoved(LLUICtrl* ctrl, WaterColorControl* colorControl);
- void onColorControlGMoved(LLUICtrl* ctrl, WaterColorControl* colorControl);
- void onColorControlBMoved(LLUICtrl* ctrl, WaterColorControl* colorControl);
- void onColorControlAMoved(LLUICtrl* ctrl, WaterColorControl* colorControl);
- void onColorControlIMoved(LLUICtrl* ctrl, WaterColorControl* colorControl);
+ void syncControls(); /// sync up sliders with parameters
- void onVector3ControlXMoved(LLUICtrl* ctrl, WaterVector3Control* vectorControl);
- void onVector3ControlYMoved(LLUICtrl* ctrl, WaterVector3Control* vectorControl);
- void onVector3ControlZMoved(LLUICtrl* ctrl, WaterVector3Control* vectorControl);
+ // general purpose callbacks for dealing with color controllers
+ void onColorControlRMoved(LLUICtrl* ctrl, WaterColorControl* color_ctrl);
+ void onColorControlGMoved(LLUICtrl* ctrl, WaterColorControl* color_ctrl);
+ void onColorControlBMoved(LLUICtrl* ctrl, WaterColorControl* color_ctrl);
+ void onColorControlAMoved(LLUICtrl* ctrl, WaterColorControl* color_ctrl);
+ void onColorControlIMoved(LLUICtrl* ctrl, WaterColorControl* color_ctrl);
+
+ void onVector3ControlXMoved(LLUICtrl* ctrl, WaterVector3Control* vector_ctrl);
+ void onVector3ControlYMoved(LLUICtrl* ctrl, WaterVector3Control* vector_ctrl);
+ void onVector3ControlZMoved(LLUICtrl* ctrl, WaterVector3Control* vector_ctrl);
+
+ void onVector2ControlXMoved(LLUICtrl* ctrl, WaterVector2Control* vector_ctrl);
+ void onVector2ControlYMoved(LLUICtrl* ctrl, WaterVector2Control* vector_ctrl);
- void onVector2ControlXMoved(LLUICtrl* ctrl, WaterVector2Control* vectorControl);
- void onVector2ControlYMoved(LLUICtrl* ctrl, WaterVector2Control* vectorControl);
-
void onFloatControlMoved(LLUICtrl* ctrl, WaterFloatControl* floatControl);
void onExpFloatControlMoved(LLUICtrl* ctrl, WaterExpFloatControl* expFloatControl);
- void onWaterFogColorMoved(LLUICtrl* ctrl, WaterColorControl* colorControl);
-
- /// handle if they choose a new normal map
- void onNormalMapPicked(LLUICtrl* ctrl);
+ void onWaterFogColorMoved(LLUICtrl* ctrl, WaterColorControl* color_ctrl);
- /// when user hits the load preset button
- void onNewPreset();
+ void onNormalMapPicked(LLUICtrl* ctrl); /// handle if they choose a new normal map
- /// when user hits the save preset button
- void onSavePreset();
+ //-- WL stuff ends --------------------------------------------------------
- /// prompts a user when overwriting a preset
- bool saveAlertCallback(const LLSD& notification, const LLSD& response);
+ void reset();
+ bool isNewPreset() const;
+ void refreshWaterPresetsList();
+ void enableEditing(bool enable);
+ void saveRegionWater();
- /// when user hits the save preset button
- void onDeletePreset();
+ std::string getCurrentPresetName() const;
+ LLEnvKey::EScope getCurrentScope() const;
+ void getSelectedPreset(std::string& name, LLEnvKey::EScope& scope) const;
- /// prompts a user when overwriting a preset
- bool deleteAlertCallback(const LLSD& notification, const LLSD& response);
+ void onWaterPresetNameEdited();
+ void onWaterPresetSelected();
+ bool onSaveAnswer(const LLSD& notification, const LLSD& response);
+ void onSaveConfirmed();
- /// what to do when you change the preset name
- void onChangePresetName(LLUICtrl* ctrl);
+ void onBtnSave();
+ void onBtnCancel();
- /// sync up sliders with parameters
- void syncMenu();
+ void onWaterPresetListChange();
+ void onRegionSettingsChange();
+ void onRegionInfoUpdate();
-private:
- static std::set<std::string> sDefaultPresets;
+ LLLineEditor* mWaterPresetNameEditor;
+ LLComboBox* mWaterPresetCombo;
+ LLCheckBoxCtrl* mMakeDefaultCheckBox;
+ LLButton* mSaveButton;
};
-
-#endif
+#endif // LL_LLFLOATEREDITWATER_H
diff --git a/indra/newview/llfloaterenvironmentsettings.cpp b/indra/newview/llfloaterenvironmentsettings.cpp
new file mode 100644
index 0000000000..4dbc8cdee0
--- /dev/null
+++ b/indra/newview/llfloaterenvironmentsettings.cpp
@@ -0,0 +1,282 @@
+/**
+ * @file llfloaterenvironmentsettings.cpp
+ * @brief LLFloaterEnvironmentSettings 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 "llfloaterenvironmentsettings.h"
+
+#include "llcombobox.h"
+#include "llradiogroup.h"
+
+#include "lldaycyclemanager.h"
+#include "llenvmanager.h"
+#include "llwaterparammanager.h"
+#include "llwlparamset.h"
+#include "llwlparammanager.h"
+
+LLFloaterEnvironmentSettings::LLFloaterEnvironmentSettings(const LLSD &key)
+: LLFloater(key)
+ ,mRegionSettingsRadioGroup(NULL)
+ ,mDayCycleSettingsRadioGroup(NULL)
+ ,mWaterPresetCombo(NULL)
+ ,mSkyPresetCombo(NULL)
+ ,mDayCyclePresetCombo(NULL)
+{
+}
+
+// virtual
+BOOL LLFloaterEnvironmentSettings::postBuild()
+{
+ mRegionSettingsRadioGroup = getChild<LLRadioGroup>("region_settings_radio_group");
+ mRegionSettingsRadioGroup->setCommitCallback(boost::bind(&LLFloaterEnvironmentSettings::onSwitchRegionSettings, this));
+
+ mDayCycleSettingsRadioGroup = getChild<LLRadioGroup>("sky_dayc_settings_radio_group");
+ mDayCycleSettingsRadioGroup->setCommitCallback(boost::bind(&LLFloaterEnvironmentSettings::onSwitchDayCycle, this));
+
+ mWaterPresetCombo = getChild<LLComboBox>("water_settings_preset_combo");
+ mWaterPresetCombo->setCommitCallback(boost::bind(&LLFloaterEnvironmentSettings::onSelectWaterPreset, this));
+
+ mSkyPresetCombo = getChild<LLComboBox>("sky_settings_preset_combo");
+ mSkyPresetCombo->setCommitCallback(boost::bind(&LLFloaterEnvironmentSettings::onSelectSkyPreset, this));
+
+ mDayCyclePresetCombo = getChild<LLComboBox>("dayc_settings_preset_combo");
+ mDayCyclePresetCombo->setCommitCallback(boost::bind(&LLFloaterEnvironmentSettings::onSelectDayCyclePreset, this));
+
+ childSetCommitCallback("ok_btn", boost::bind(&LLFloaterEnvironmentSettings::onBtnOK, this), NULL);
+ getChild<LLUICtrl>("ok_btn")->setRightMouseDownCallback(boost::bind(&LLEnvManagerNew::dumpUserPrefs, LLEnvManagerNew::getInstance()));
+ childSetCommitCallback("cancel_btn", boost::bind(&LLFloaterEnvironmentSettings::onBtnCancel, this), NULL);
+ getChild<LLUICtrl>("cancel_btn")->setRightMouseDownCallback(boost::bind(&LLEnvManagerNew::dumpPresets, LLEnvManagerNew::getInstance()));
+
+ setCloseCallback(boost::bind(&LLFloaterEnvironmentSettings::cancel, this));
+
+ LLEnvManagerNew::instance().setPreferencesChangeCallback(boost::bind(&LLFloaterEnvironmentSettings::refresh, this));
+ LLDayCycleManager::instance().setModifyCallback(boost::bind(&LLFloaterEnvironmentSettings::populateDayCyclePresetsList, this));
+ LLWLParamManager::instance().setPresetListChangeCallback(boost::bind(&LLFloaterEnvironmentSettings::populateSkyPresetsList, this));
+ LLWaterParamManager::instance().setPresetListChangeCallback(boost::bind(&LLFloaterEnvironmentSettings::populateWaterPresetsList, this));
+
+ return TRUE;
+}
+
+// virtual
+void LLFloaterEnvironmentSettings::onOpen(const LLSD& key)
+{
+ refresh();
+}
+
+void LLFloaterEnvironmentSettings::onSwitchRegionSettings()
+{
+ getChild<LLView>("user_environment_settings")->setEnabled(mRegionSettingsRadioGroup->getSelectedIndex() != 0);
+
+ apply();
+}
+
+void LLFloaterEnvironmentSettings::onSwitchDayCycle()
+{
+ bool is_fixed_sky = mDayCycleSettingsRadioGroup->getSelectedIndex() == 0;
+
+ mSkyPresetCombo->setEnabled(is_fixed_sky);
+ mDayCyclePresetCombo->setEnabled(!is_fixed_sky);
+
+ apply();
+}
+
+void LLFloaterEnvironmentSettings::onSelectWaterPreset()
+{
+ apply();
+}
+
+void LLFloaterEnvironmentSettings::onSelectSkyPreset()
+{
+ apply();
+}
+
+void LLFloaterEnvironmentSettings::onSelectDayCyclePreset()
+{
+ apply();
+}
+
+void LLFloaterEnvironmentSettings::onBtnOK()
+{
+ // Save and apply new user preferences.
+ bool use_region_settings = mRegionSettingsRadioGroup->getSelectedIndex() == 0;
+ bool use_fixed_sky = mDayCycleSettingsRadioGroup->getSelectedIndex() == 0;
+ std::string water_preset = mWaterPresetCombo->getValue().asString();
+ std::string sky_preset = mSkyPresetCombo->getValue().asString();
+ std::string day_cycle = mDayCyclePresetCombo->getValue().asString();
+
+ LLEnvManagerNew::instance().setUserPrefs(
+ water_preset,
+ sky_preset,
+ day_cycle,
+ use_fixed_sky,
+ use_region_settings);
+
+ // *TODO: This triggers applying user preferences again, which is suboptimal.
+ closeFloater();
+}
+
+void LLFloaterEnvironmentSettings::onBtnCancel()
+{
+ closeFloater();
+}
+
+void LLFloaterEnvironmentSettings::refresh()
+{
+ LLEnvManagerNew& env_mgr = LLEnvManagerNew::instance();
+
+ bool use_region_settings = env_mgr.getUseRegionSettings();
+ bool use_fixed_sky = env_mgr.getUseFixedSky();
+
+ // Set up radio buttons according to user preferences.
+ mRegionSettingsRadioGroup->setSelectedIndex(use_region_settings ? 0 : 1);
+ mDayCycleSettingsRadioGroup->setSelectedIndex(use_fixed_sky ? 0 : 1);
+
+ // Populate the combo boxes with appropriate lists of available presets.
+ populateWaterPresetsList();
+ populateSkyPresetsList();
+ populateDayCyclePresetsList();
+
+ // Enable/disable other controls based on user preferences.
+ getChild<LLView>("user_environment_settings")->setEnabled(!use_region_settings);
+ mSkyPresetCombo->setEnabled(use_fixed_sky);
+ mDayCyclePresetCombo->setEnabled(!use_fixed_sky);
+
+ // Select the current presets in combo boxes.
+ mWaterPresetCombo->selectByValue(env_mgr.getWaterPresetName());
+ mSkyPresetCombo->selectByValue(env_mgr.getSkyPresetName());
+ mDayCyclePresetCombo->selectByValue(env_mgr.getDayCycleName());
+}
+
+void LLFloaterEnvironmentSettings::apply()
+{
+ // Update environment with the user choice.
+ bool use_region_settings = mRegionSettingsRadioGroup->getSelectedIndex() == 0;
+ bool use_fixed_sky = mDayCycleSettingsRadioGroup->getSelectedIndex() == 0;
+ std::string water_preset = mWaterPresetCombo->getValue().asString();
+ std::string sky_preset = mSkyPresetCombo->getValue().asString();
+ std::string day_cycle = mDayCyclePresetCombo->getValue().asString();
+
+ LLEnvManagerNew& env_mgr = LLEnvManagerNew::instance();
+ if (use_region_settings)
+ {
+ env_mgr.useRegionSettings();
+ }
+ else
+ {
+ if (use_fixed_sky)
+ {
+ env_mgr.useSkyPreset(sky_preset);
+ }
+ else
+ {
+ env_mgr.useDayCycle(day_cycle, LLEnvKey::SCOPE_LOCAL);
+ }
+
+ env_mgr.useWaterPreset(water_preset);
+ }
+}
+
+void LLFloaterEnvironmentSettings::cancel()
+{
+ // Revert environment to user preferences.
+ LLEnvManagerNew::instance().usePrefs();
+}
+
+void LLFloaterEnvironmentSettings::populateWaterPresetsList()
+{
+ mWaterPresetCombo->removeall();
+
+ std::list<std::string> user_presets, system_presets;
+ LLWaterParamManager::instance().getPresetNames(user_presets, system_presets);
+
+ // Add user presets first.
+ for (std::list<std::string>::const_iterator it = user_presets.begin(); it != user_presets.end(); ++it)
+ {
+ mWaterPresetCombo->add(*it);
+ }
+
+ if (user_presets.size() > 0)
+ {
+ mWaterPresetCombo->addSeparator();
+ }
+
+ // Add system presets.
+ for (std::list<std::string>::const_iterator it = system_presets.begin(); it != system_presets.end(); ++it)
+ {
+ mWaterPresetCombo->add(*it);
+ }
+}
+
+void LLFloaterEnvironmentSettings::populateSkyPresetsList()
+{
+ mSkyPresetCombo->removeall();
+
+ LLWLParamManager::preset_name_list_t region_presets; // unused as we don't list region presets here
+ LLWLParamManager::preset_name_list_t user_presets, sys_presets;
+ LLWLParamManager::instance().getPresetNames(region_presets, user_presets, sys_presets);
+
+ // Add user presets.
+ for (LLWLParamManager::preset_name_list_t::const_iterator it = user_presets.begin(); it != user_presets.end(); ++it)
+ {
+ mSkyPresetCombo->add(*it);
+ }
+
+ if (!user_presets.empty())
+ {
+ mSkyPresetCombo->addSeparator();
+ }
+
+ // Add system presets.
+ for (LLWLParamManager::preset_name_list_t::const_iterator it = sys_presets.begin(); it != sys_presets.end(); ++it)
+ {
+ mSkyPresetCombo->add(*it);
+ }
+}
+
+void LLFloaterEnvironmentSettings::populateDayCyclePresetsList()
+{
+ mDayCyclePresetCombo->removeall();
+
+ LLDayCycleManager::preset_name_list_t user_days, sys_days;
+ LLDayCycleManager::instance().getPresetNames(user_days, sys_days);
+
+ // Add user days.
+ for (LLDayCycleManager::preset_name_list_t::const_iterator it = user_days.begin(); it != user_days.end(); ++it)
+ {
+ mDayCyclePresetCombo->add(*it);
+ }
+
+ if (user_days.size() > 0)
+ {
+ mDayCyclePresetCombo->addSeparator();
+ }
+
+ // Add system days.
+ for (LLDayCycleManager::preset_name_list_t::const_iterator it = sys_days.begin(); it != sys_days.end(); ++it)
+ {
+ mDayCyclePresetCombo->add(*it);
+ }
+}
diff --git a/indra/newview/llfloaterenvironmentsettings.h b/indra/newview/llfloaterenvironmentsettings.h
new file mode 100644
index 0000000000..0ab458a0f6
--- /dev/null
+++ b/indra/newview/llfloaterenvironmentsettings.h
@@ -0,0 +1,71 @@
+/**
+ * @file llfloaterenvironmentsettings.h
+ * @brief LLFloaterEnvironmentSettings 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$
+ */
+
+#ifndef LL_LLFLOATERENVIRONMENTSETTINGS_H
+#define LL_LLFLOATERENVIRONMENTSETTINGS_H
+
+#include "llfloater.h"
+
+class LLComboBox;
+class LLRadioGroup;
+
+class LLFloaterEnvironmentSettings : public LLFloater
+{
+ LOG_CLASS(LLFloaterEnvironmentSettings);
+
+public:
+ LLFloaterEnvironmentSettings(const LLSD &key);
+ /*virtual*/ BOOL postBuild();
+ /*virtual*/ void onOpen(const LLSD& key);
+
+private:
+ void onSwitchRegionSettings();
+ void onSwitchDayCycle();
+
+ void onSelectWaterPreset();
+ void onSelectSkyPreset();
+ void onSelectDayCyclePreset();
+
+ void onBtnOK();
+ void onBtnCancel();
+
+ void refresh(); /// update controls with user prefs
+ void apply();
+ void cancel();
+
+ void populateWaterPresetsList();
+ void populateSkyPresetsList();
+ void populateDayCyclePresetsList();
+
+ LLRadioGroup* mRegionSettingsRadioGroup;
+ LLRadioGroup* mDayCycleSettingsRadioGroup;
+
+ LLComboBox* mWaterPresetCombo;
+ LLComboBox* mSkyPresetCombo;
+ LLComboBox* mDayCyclePresetCombo;
+};
+
+#endif // LL_LLFLOATERENVIRONMENTSETTINGS_H
diff --git a/indra/newview/llfloaterenvsettings.cpp b/indra/newview/llfloaterenvsettings.cpp
deleted file mode 100644
index fcaef1f34b..0000000000
--- a/indra/newview/llfloaterenvsettings.cpp
+++ /dev/null
@@ -1,268 +0,0 @@
-/**
- * @file llfloaterenvsettings.cpp
- * @brief LLFloaterEnvSettings class definition
- *
- * $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 "llfloaterenvsettings.h"
-
-#include "llfloaterreg.h"
-#include "llfloaterwindlight.h"
-#include "llfloaterwater.h"
-#include "lluictrlfactory.h"
-#include "llsliderctrl.h"
-#include "llcombobox.h"
-#include "llcolorswatch.h"
-#include "llwlanimator.h"
-
-#include "llwlparamset.h"
-#include "llwlparammanager.h"
-#include "llwaterparammanager.h"
-#include "llmath.h"
-#include "llviewerwindow.h"
-
-#include "pipeline.h"
-
-#include <sstream>
-
-LLFloaterEnvSettings::LLFloaterEnvSettings(const LLSD& key)
- : LLFloater(key)
-{
-}
-// virtual
-LLFloaterEnvSettings::~LLFloaterEnvSettings()
-{
-}
-// virtual
-BOOL LLFloaterEnvSettings::postBuild()
-{
- // load it up
- initCallbacks();
- syncMenu();
- return TRUE;
-}
-
-void LLFloaterEnvSettings::initCallbacks(void)
-{
- // our three sliders
- getChild<LLUICtrl>("EnvTimeSlider")->setCommitCallback(boost::bind(&LLFloaterEnvSettings::onChangeDayTime, this, _1));
- getChild<LLUICtrl>("EnvCloudSlider")->setCommitCallback(boost::bind(&LLFloaterEnvSettings::onChangeCloudCoverage, this, _1));
- getChild<LLUICtrl>("EnvWaterFogSlider")->setCommitCallback(boost::bind(&LLFloaterEnvSettings::onChangeWaterFogDensity, this, _1, &LLWaterParamManager::instance()->mFogDensity));
-
- // color picker
- getChild<LLUICtrl>("EnvWaterColor")->setCommitCallback(boost::bind(&LLFloaterEnvSettings::onChangeWaterColor, this, _1, &LLWaterParamManager::instance()->mFogColor));
-
- // WL Top
- getChild<LLUICtrl>("EnvAdvancedSkyButton")->setCommitCallback(boost::bind(&LLFloaterEnvSettings::onOpenAdvancedSky, this));
- getChild<LLUICtrl>("EnvAdvancedWaterButton")->setCommitCallback(boost::bind(&LLFloaterEnvSettings::onOpenAdvancedWater, this));
- getChild<LLUICtrl>("EnvUseEstateTimeButton")->setCommitCallback(boost::bind(&LLFloaterEnvSettings::onUseEstateTime, this));
-}
-
-// menu maintenance functions
-
-void LLFloaterEnvSettings::syncMenu()
-{
- LLSliderCtrl* sldr;
- sldr = getChild<LLSliderCtrl>("EnvTimeSlider");
-
- // sync the clock
- F32 val = (F32)LLWLParamManager::instance()->mAnimator.getDayTime();
- std::string timeStr = timeToString(val);
-
- LLTextBox* textBox;
- textBox = getChild<LLTextBox>("EnvTimeText");
-
- textBox->setValue(timeStr);
-
- // sync time slider which starts at 6 AM
- val -= 0.25;
- if(val < 0)
- {
- val++;
- }
- sldr->setValue(val);
-
- // sync cloud coverage
- bool err;
- getChild<LLUICtrl>("EnvCloudSlider")->setValue(LLWLParamManager::instance()->mCurParams.getFloat("cloud_shadow", err));
-
- LLWaterParamManager * param_mgr = LLWaterParamManager::instance();
- // sync water params
- LLColor4 col = param_mgr->getFogColor();
- LLColorSwatchCtrl* colCtrl = getChild<LLColorSwatchCtrl>("EnvWaterColor");
- col.mV[3] = 1.0f;
- colCtrl->set(col);
-
- getChild<LLUICtrl>("EnvWaterFogSlider")->setValue(param_mgr->mFogDensity.mExp);
- param_mgr->setDensitySliderValue(param_mgr->mFogDensity.mExp);
-
- // turn off Use Estate Time button if it's already being used
- if(LLWLParamManager::instance()->mAnimator.mUseLindenTime)
- {
- getChildView("EnvUseEstateTimeButton")->setEnabled(FALSE);
- } else {
- getChildView("EnvUseEstateTimeButton")->setEnabled(TRUE);
- }
-
- if(!gPipeline.canUseVertexShaders())
- {
- getChildView("EnvWaterColor")->setEnabled(FALSE);
- getChildView("EnvWaterColorText")->setEnabled(FALSE);
- //getChildView("EnvAdvancedWaterButton")->setEnabled(FALSE);
- }
- else
- {
- getChildView("EnvWaterColor")->setEnabled(TRUE);
- getChildView("EnvWaterColorText")->setEnabled(TRUE);
- //getChildView("EnvAdvancedWaterButton")->setEnabled(TRUE);
- }
-
- // only allow access to these if they are using windlight
- if(!gPipeline.canUseWindLightShaders())
- {
-
- getChildView("EnvCloudSlider")->setEnabled(FALSE);
- getChildView("EnvCloudText")->setEnabled(FALSE);
- //getChildView("EnvAdvancedSkyButton")->setEnabled(FALSE);
- }
- else
- {
- getChildView("EnvCloudSlider")->setEnabled(TRUE);
- getChildView("EnvCloudText")->setEnabled(TRUE);
- //getChildView("EnvAdvancedSkyButton")->setEnabled(TRUE);
- }
-}
-
-void LLFloaterEnvSettings::onChangeDayTime(LLUICtrl* ctrl)
-{
- LLSliderCtrl* sldr = static_cast<LLSliderCtrl*>(ctrl);
-
- // deactivate animator
- LLWLParamManager::instance()->mAnimator.mIsRunning = false;
- LLWLParamManager::instance()->mAnimator.mUseLindenTime = false;
-
- F32 val = sldr->getValueF32() + 0.25f;
- if(val > 1.0)
- {
- val--;
- }
-
- LLWLParamManager::instance()->mAnimator.setDayTime((F64)val);
- LLWLParamManager::instance()->mAnimator.update(
- LLWLParamManager::instance()->mCurParams);
-}
-
-void LLFloaterEnvSettings::onChangeCloudCoverage(LLUICtrl* ctrl)
-{
- LLSliderCtrl* sldr = static_cast<LLSliderCtrl*>(ctrl);
-
- // deactivate animator
- //LLWLParamManager::instance()->mAnimator.mIsRunning = false;
- //LLWLParamManager::instance()->mAnimator.mUseLindenTime = false;
-
- F32 val = sldr->getValueF32();
- LLWLParamManager::instance()->mCurParams.set("cloud_shadow", val);
-}
-
-void LLFloaterEnvSettings::onChangeWaterFogDensity(LLUICtrl* ctrl, WaterExpFloatControl* expFloatControl)
-{
- LLSliderCtrl* sldr;
- sldr = getChild<LLSliderCtrl>("EnvWaterFogSlider");
-
- F32 val = sldr->getValueF32();
- expFloatControl->mExp = val;
- LLWaterParamManager::instance()->setDensitySliderValue(val);
-
- expFloatControl->update(LLWaterParamManager::instance()->mCurParams);
- LLWaterParamManager::instance()->propagateParameters();
-}
-
-void LLFloaterEnvSettings::onChangeWaterColor(LLUICtrl* ctrl, WaterColorControl* colorControl)
-{
- LLColorSwatchCtrl* swatch = static_cast<LLColorSwatchCtrl*>(ctrl);
- *colorControl = swatch->get();
-
- colorControl->update(LLWaterParamManager::instance()->mCurParams);
- LLWaterParamManager::instance()->propagateParameters();
-}
-
-
-void LLFloaterEnvSettings::onOpenAdvancedSky()
-{
- LLFloaterReg::showInstance("env_windlight");
-}
-
-void LLFloaterEnvSettings::onOpenAdvancedWater()
-{
- LLFloaterReg::showInstance("env_water");
-}
-
-
-void LLFloaterEnvSettings::onUseEstateTime()
-{
- LLFloaterWindLight* wl = LLFloaterReg::findTypedInstance<LLFloaterWindLight>("env_windlight");
- if(wl)
- {
- LLComboBox* box = wl->getChild<LLComboBox>("WLPresetsCombo");
- box->selectByValue("");
- }
-
- LLWLParamManager::instance()->mAnimator.mIsRunning = true;
- LLWLParamManager::instance()->mAnimator.mUseLindenTime = true;
-}
-
-std::string LLFloaterEnvSettings::timeToString(F32 curTime)
-{
- S32 hours;
- S32 min;
-
- // get hours and minutes
- hours = (S32) (24.0 * curTime);
- curTime -= ((F32) hours / 24.0f);
- min = llround(24.0f * 60.0f * curTime);
-
- // handle case where it's 60
- if(min == 60)
- {
- hours++;
- min = 0;
- }
-
- std::string newTime = getString("timeStr");
- struct tm * timeT;
- time_t secT = time(0);
- timeT = gmtime (&secT);
-
- timeT->tm_hour = hours;
- timeT->tm_min = min;
- secT = mktime (timeT);
- secT -= LLStringOps::getLocalTimeOffset ();
-
- LLSD substitution;
- substitution["datetime"] = (S32) secT;
-
- LLStringUtil::format (newTime, substitution);
- return newTime;
-}
diff --git a/indra/newview/llfloaterenvsettings.h b/indra/newview/llfloaterenvsettings.h
deleted file mode 100644
index a6280cfb97..0000000000
--- a/indra/newview/llfloaterenvsettings.h
+++ /dev/null
@@ -1,83 +0,0 @@
-/**
- * @file llfloaterskysettings.h
- * @brief LLFloaterEnvSettings class definition
- *
- * $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$
- */
-
-/*
- * Simple menu for adjusting the atmospheric settings of the world
- */
-
-#ifndef LL_LLFLOATERENVSETTINGS_H
-#define LL_LLFLOATERENVSETTINGS_H
-
-#include "llfloater.h"
-
-struct WaterColorControl;
-struct WaterExpFloatControl;
-
-/// Menuing system for all of windlight's functionality
-class LLFloaterEnvSettings : public LLFloater
-{
-public:
-
- LLFloaterEnvSettings(const LLSD& key);
- /*virtual*/ ~LLFloaterEnvSettings();
- /*virtual*/ BOOL postBuild();
- /// initialize all the callbacks for the menu
- void initCallbacks(void);
-
- /// handle if time of day is changed
- void onChangeDayTime(LLUICtrl* ctrl);
-
- /// handle if cloud coverage is changed
- void onChangeCloudCoverage(LLUICtrl* ctrl);
-
- /// handle change in water fog density
- void onChangeWaterFogDensity(LLUICtrl* ctrl, WaterExpFloatControl* expFloatControl);
-
- /// handle change in water fog color
- void onChangeWaterColor(LLUICtrl* ctrl, WaterColorControl* colorControl);
-
- /// open the advanced sky settings menu
- void onOpenAdvancedSky();
-
- /// open the advanced water settings menu
- void onOpenAdvancedWater();
-
- /// sync time with the server
- void onUseEstateTime();
-
- //// menu management
-
- /// sync up sliders with parameters
- void syncMenu();
-
- /// convert the present time to a digital clock time
- std::string timeToString(F32 curTime);
-
-private:
-};
-
-
-#endif
diff --git a/indra/newview/llfloaterhelpbrowser.cpp b/indra/newview/llfloaterhelpbrowser.cpp
index 627defd006..3012638d44 100644
--- a/indra/newview/llfloaterhelpbrowser.cpp
+++ b/indra/newview/llfloaterhelpbrowser.cpp
@@ -71,9 +71,18 @@ void LLFloaterHelpBrowser::buildURLHistory()
}
}
+void LLFloaterHelpBrowser::onOpen(const LLSD& key)
+{
+ gSavedSettings.setBOOL("HelpFloaterOpen", TRUE);
+}
+
//virtual
void LLFloaterHelpBrowser::onClose(bool app_quitting)
{
+ if (!app_quitting)
+ {
+ gSavedSettings.setBOOL("HelpFloaterOpen", FALSE);
+ }
// really really destroy the help browser when it's closed, it'll be recreated.
destroy(); // really destroy this dialog on closure, it's relatively heavyweight.
}
diff --git a/indra/newview/llfloaterhelpbrowser.h b/indra/newview/llfloaterhelpbrowser.h
index 2731c81b9c..afe0f4df69 100644
--- a/indra/newview/llfloaterhelpbrowser.h
+++ b/indra/newview/llfloaterhelpbrowser.h
@@ -42,6 +42,7 @@ class LLFloaterHelpBrowser :
/*virtual*/ BOOL postBuild();
/*virtual*/ void onClose(bool app_quitting);
+ /*virtual*/ void onOpen(const LLSD& key);
// inherited from LLViewerMediaObserver
/*virtual*/ void handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event);
diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp
index 0d0c1f594d..9b7593ce61 100644
--- a/indra/newview/llfloaterland.cpp
+++ b/indra/newview/llfloaterland.cpp
@@ -1818,6 +1818,7 @@ LLPanelLandOptions::LLPanelLandOptions(LLParcelSelectionHandle& parcel)
mClearBtn(NULL),
mMatureCtrl(NULL),
mPushRestrictionCtrl(NULL),
+ mSeeAvatarsCtrl(NULL),
mParcel(parcel)
{
}
@@ -1860,6 +1861,9 @@ BOOL LLPanelLandOptions::postBuild()
mPushRestrictionCtrl = getChild<LLCheckBoxCtrl>( "PushRestrictCheck");
childSetCommitCallback("PushRestrictCheck", onCommitAny, this);
+ mSeeAvatarsCtrl = getChild<LLCheckBoxCtrl>( "SeeAvatarsCheck");
+ childSetCommitCallback("SeeAvatarsCheck", onCommitAny, this);
+
mCheckShowDirectory = getChild<LLCheckBoxCtrl>( "ShowDirectoryCheck");
childSetCommitCallback("ShowDirectoryCheck", onCommitAny, this);
@@ -1952,7 +1956,7 @@ void LLPanelLandOptions::refresh()
mCheckEditLand ->set(FALSE);
mCheckEditLand ->setEnabled(FALSE);
-
+
mCheckSafe ->set(FALSE);
mCheckSafe ->setEnabled(FALSE);
@@ -1968,6 +1972,9 @@ void LLPanelLandOptions::refresh()
mPushRestrictionCtrl->set(FALSE);
mPushRestrictionCtrl->setEnabled(FALSE);
+ mSeeAvatarsCtrl->set(TRUE);
+ mSeeAvatarsCtrl->setEnabled(FALSE);
+
mLandingTypeCombo->setCurrentByIndex(0);
mLandingTypeCombo->setEnabled(FALSE);
@@ -2001,7 +2008,7 @@ void LLPanelLandOptions::refresh()
BOOL can_change_terraform = LLViewerParcelMgr::isParcelModifiableByAgent(parcel, GP_LAND_EDIT);
mCheckEditLand ->set( parcel->getAllowTerraform() );
mCheckEditLand ->setEnabled( can_change_terraform );
-
+
mCheckSafe ->set( !parcel->getAllowDamage() );
mCheckSafe ->setEnabled( can_change_options );
@@ -2027,6 +2034,10 @@ void LLPanelLandOptions::refresh()
mPushRestrictionCtrl->setEnabled(can_change_options);
}
+ mSeeAvatarsCtrl->set(parcel->getSeeAVs());
+ mSeeAvatarsCtrl->setLabel(getString("see_avs_text"));
+ mSeeAvatarsCtrl->setEnabled(can_change_options && parcel->getHaveNewParcelLimitData());
+
BOOL can_change_landing_point = LLViewerParcelMgr::isParcelModifiableByAgent(parcel,
GP_LAND_SET_LANDING_POINT);
mLandingTypeCombo->setCurrentByIndex((S32)parcel->getLandingType());
@@ -2231,6 +2242,7 @@ void LLPanelLandOptions::onCommitAny(LLUICtrl *ctrl, void *userdata)
BOOL allow_publish = FALSE;
BOOL mature_publish = self->mMatureCtrl->get();
BOOL push_restriction = self->mPushRestrictionCtrl->get();
+ BOOL see_avs = self->mSeeAvatarsCtrl->get();
BOOL show_directory = self->mCheckShowDirectory->get();
// we have to get the index from a lookup, not from the position in the dropdown!
S32 category_index = LLParcel::getCategoryFromString(self->mCategoryCombo->getSelectedValue());
@@ -2264,6 +2276,7 @@ void LLPanelLandOptions::onCommitAny(LLUICtrl *ctrl, void *userdata)
parcel->setCategory((LLParcel::ECategory)category_index);
parcel->setLandingType((LLParcel::ELandingType)landing_type_index);
parcel->setSnapshotID(snapshot_id);
+ parcel->setSeeAVs(see_avs);
// Send current parcel data upstream to server
LLViewerParcelMgr::getInstance()->sendParcelPropertiesUpdate( parcel );
diff --git a/indra/newview/llfloaterland.h b/indra/newview/llfloaterland.h
index 8a70fa24d8..6fceca1acd 100644
--- a/indra/newview/llfloaterland.h
+++ b/indra/newview/llfloaterland.h
@@ -348,6 +348,7 @@ private:
LLCheckBoxCtrl *mMatureCtrl;
LLCheckBoxCtrl *mPushRestrictionCtrl;
+ LLCheckBoxCtrl *mSeeAvatarsCtrl;
LLSafeHandle<LLParcelSelection>& mParcel;
};
diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp
index b7e9865228..62b8d03281 100644
--- a/indra/newview/llfloatermodelpreview.cpp
+++ b/indra/newview/llfloatermodelpreview.cpp
@@ -71,6 +71,7 @@
#include "llmatrix4a.h"
#include "llmenubutton.h"
#include "llmeshrepository.h"
+#include "llnotificationsutil.h"
#include "llsdutil_math.h"
#include "lltextbox.h"
#include "lltoolmgr.h"
@@ -98,8 +99,14 @@
#include "llvfile.h"
#include "llvfs.h"
#include "llcallbacklist.h"
-
+#include "llviewerobjectlist.h"
+#include "llanimationstates.h"
+#include "llviewernetwork.h"
#include "glod/glod.h"
+#include <boost/algorithm/string.hpp>
+
+
+const S32 SLM_SUPPORTED_VERSION = 2;
//static
S32 LLFloaterModelPreview::sUploadAmount = 10;
@@ -177,6 +184,80 @@ std::string lod_label_name[NUM_LOD+1] =
"I went off the end of the lod_label_name array. Me so smart."
};
+
+#define LL_DEGENERACY_TOLERANCE 1e-7f
+
+inline F32 dot3fpu(const LLVector4a& a, const LLVector4a& b)
+{
+ volatile F32 p0 = a[0] * b[0];
+ volatile F32 p1 = a[1] * b[1];
+ volatile F32 p2 = a[2] * b[2];
+ return p0 + p1 + p2;
+}
+
+bool ll_is_degenerate(const LLVector4a& a, const LLVector4a& b, const LLVector4a& c, F32 tolerance = LL_DEGENERACY_TOLERANCE)
+{
+ // small area check
+ {
+ LLVector4a edge1; edge1.setSub( a, b );
+ LLVector4a edge2; edge2.setSub( a, c );
+ //////////////////////////////////////////////////////////////////////////
+ /// Linden Modified
+ //////////////////////////////////////////////////////////////////////////
+
+ // If no one edge is more than 10x longer than any other edge, we weaken
+ // the tolerance by a factor of 1e-4f.
+
+ LLVector4a edge3; edge3.setSub( c, b );
+ const F32 len1sq = edge1.dot3(edge1).getF32();
+ const F32 len2sq = edge2.dot3(edge2).getF32();
+ const F32 len3sq = edge3.dot3(edge3).getF32();
+ bool abOK = (len1sq <= 100.f * len2sq) && (len1sq <= 100.f * len3sq);
+ bool acOK = (len2sq <= 100.f * len1sq) && (len1sq <= 100.f * len3sq);
+ bool cbOK = (len3sq <= 100.f * len1sq) && (len1sq <= 100.f * len2sq);
+ if ( abOK && acOK && cbOK )
+ {
+ tolerance *= 1e-4f;
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ /// End Modified
+ //////////////////////////////////////////////////////////////////////////
+
+ LLVector4a cross; cross.setCross3( edge1, edge2 );
+
+ LLVector4a edge1b; edge1b.setSub( b, a );
+ LLVector4a edge2b; edge2b.setSub( b, c );
+ LLVector4a crossb; crossb.setCross3( edge1b, edge2b );
+
+ if ( ( cross.dot3(cross).getF32() < tolerance ) || ( crossb.dot3(crossb).getF32() < tolerance ))
+ {
+ return true;
+ }
+ }
+
+ // point triangle distance check
+ {
+ LLVector4a Q; Q.setSub(a, b);
+ LLVector4a R; R.setSub(c, b);
+
+ const F32 QQ = dot3fpu(Q, Q);
+ const F32 RR = dot3fpu(R, R);
+ const F32 QR = dot3fpu(R, Q);
+
+ volatile F32 QQRR = QQ * RR;
+ volatile F32 QRQR = QR * QR;
+ F32 Det = (QQRR - QRQR);
+
+ if( Det == 0.0f )
+ {
+ return true;
+ }
+ }
+
+ return false;
+}
+
bool validate_face(const LLVolumeFace& face)
{
for (U32 i = 0; i < face.mNumIndices; ++i)
@@ -188,6 +269,31 @@ bool validate_face(const LLVolumeFace& face)
}
}
+ if (face.mNumIndices % 3 != 0 || face.mNumIndices == 0)
+ {
+ llwarns << "Face has invalid number of indices." << llendl;
+ return false;
+ }
+
+ /*const LLVector4a scale(0.5f);
+
+ for (U32 i = 0; i < face.mNumIndices; i+=3)
+ {
+ U16 idx1 = face.mIndices[i];
+ U16 idx2 = face.mIndices[i+1];
+ U16 idx3 = face.mIndices[i+2];
+
+ LLVector4a v1; v1.setMul(face.mPositions[idx1], scale);
+ LLVector4a v2; v2.setMul(face.mPositions[idx2], scale);
+ LLVector4a v3; v3.setMul(face.mPositions[idx3], scale);
+
+ if (ll_is_degenerate(v1,v2,v3))
+ {
+ llwarns << "Degenerate face found!" << llendl;
+ return false;
+ }
+ }*/
+
return true;
}
@@ -253,13 +359,16 @@ void LLMeshFilePicker::notify(const std::string& filename)
// LLFloaterModelPreview()
//-----------------------------------------------------------------------------
LLFloaterModelPreview::LLFloaterModelPreview(const LLSD& key) :
-LLFloater(key)
+LLFloaterModelUploadBase(key),
+mUploadBtn(NULL),
+mCalculateBtn(NULL)
{
sInstance = this;
mLastMouseX = 0;
mLastMouseY = 0;
mGLName = 0;
mStatusLock = new LLMutex(NULL);
+ mModelPreview = NULL;
mLODMode[LLModel::LOD_HIGH] = 0;
for (U32 i = 0; i < LLModel::LOD_HIGH; i++)
@@ -294,16 +403,17 @@ BOOL LLFloaterModelPreview::postBuild()
childSetCommitCallback("border_mode", onLODParamCommit, this);
childSetCommitCallback("share_tolerance", onLODParamCommit, this);
+ childSetCommitCallback("upload_skin", boost::bind(&LLFloaterModelPreview::toggleCalculateButton, this), NULL);
+ childSetCommitCallback("upload_joints", boost::bind(&LLFloaterModelPreview::toggleCalculateButton, this), NULL);
+ childSetCommitCallback("upload_textures", boost::bind(&LLFloaterModelPreview::toggleCalculateButton, this), NULL);
+
childSetTextArg("status", "[STATUS]", getString("status_idle"));
- //childSetLabelArg("ok_btn", "[AMOUNT]", llformat("%d",sUploadAmount));
childSetAction("ok_btn", onUpload, this);
childDisable("ok_btn");
childSetAction("reset_btn", onReset, this);
- childSetAction("clear_materials", onClearMaterials, this);
-
childSetCommitCallback("preview_lod_combo", onPreviewLODCommit, this);
childSetCommitCallback("upload_skin", onUploadSkinCommit, this);
@@ -313,13 +423,13 @@ BOOL LLFloaterModelPreview::postBuild()
childSetCommitCallback("pelvis_offset", onPelvisOffsetCommit, this);
childSetCommitCallback("lod_file_or_limit", refresh, this);
- childSetCommitCallback("physics_load_radio", refresh, this);
+ childSetCommitCallback("physics_load_radio", onPhysicsLoadRadioCommit, this);
//childSetCommitCallback("physics_optimize", refresh, this);
//childSetCommitCallback("physics_use_hull", refresh, this);
childDisable("upload_skin");
childDisable("upload_joints");
-
+
childDisable("ok_btn");
mViewOptionMenuButton = getChild<LLMenuButton>("options_gear_btn");
@@ -339,9 +449,7 @@ BOOL LLFloaterModelPreview::postBuild()
mPreviewRect = preview_panel->getRect();
- mModelPreview = new LLModelPreview(512, 512, this );
- mModelPreview->setPreviewTarget(16.f);
- mModelPreview->setDetailsCallback(boost::bind(&LLFloaterModelPreview::setDetails, this, _1, _2, _3, _4, _5));
+ initModelPreview();
//set callbacks for left click on line editor rows
for (U32 i = 0; i <= LLModel::LOD_HIGH; i++)
@@ -370,6 +478,25 @@ BOOL LLFloaterModelPreview::postBuild()
text->setMouseDownCallback(boost::bind(&LLModelPreview::setPreviewLOD, mModelPreview, i));
}
}
+ std::string current_grid = LLGridManager::getInstance()->getGridLabel();
+ std::transform(current_grid.begin(),current_grid.end(),current_grid.begin(),::tolower);
+ std::string validate_url;
+ if (current_grid == "agni")
+ {
+ validate_url = "http://secondlife.com/my/account/mesh.php";
+ }
+ else
+ {
+ validate_url = llformat("http://secondlife.%s.lindenlab.com/my/account/mesh.php",current_grid.c_str());
+ }
+ getChild<LLTextBox>("warning_message")->setTextArg("[VURL]", validate_url);
+
+ mUploadBtn = getChild<LLButton>("ok_btn");
+ mCalculateBtn = getChild<LLButton>("calculate_btn");
+
+ mCalculateBtn->setClickedCallback(boost::bind(&LLFloaterModelPreview::onClickCalculateBtn, this));
+
+ toggleCalculateButton(true);
return TRUE;
}
@@ -381,12 +508,6 @@ LLFloaterModelPreview::~LLFloaterModelPreview()
{
sInstance = NULL;
- if ( mModelPreview && mModelPreview->getResetJointFlag() )
- {
- gAgentAvatarp->resetJointPositions();
- }
-
-
if ( mModelPreview )
{
delete mModelPreview;
@@ -401,6 +522,19 @@ LLFloaterModelPreview::~LLFloaterModelPreview()
mStatusLock = NULL;
}
+void LLFloaterModelPreview::initModelPreview()
+{
+ if (mModelPreview)
+ {
+ delete mModelPreview;
+ }
+
+ mModelPreview = new LLModelPreview(512, 512, this );
+ mModelPreview->setPreviewTarget(16.f);
+ mModelPreview->setDetailsCallback(boost::bind(&LLFloaterModelPreview::setDetails, this, _1, _2, _3, _4, _5));
+ mModelPreview->setModelUpdatedCallback(boost::bind(&LLFloaterModelPreview::toggleCalculateButton, this, _1));
+}
+
void LLFloaterModelPreview::onViewOptionChecked(const LLSD& userdata)
{
if (mModelPreview)
@@ -448,6 +582,30 @@ void LLFloaterModelPreview::loadModel(S32 lod)
(new LLMeshFilePicker(mModelPreview, lod))->getFile();
}
+void LLFloaterModelPreview::loadModel(S32 lod, const std::string& file_name, bool force_disable_slm)
+{
+ mModelPreview->mLoading = true;
+
+ mModelPreview->loadModel(file_name, lod, force_disable_slm);
+}
+
+void LLFloaterModelPreview::onClickCalculateBtn()
+{
+ mModelPreview->rebuildUploadData();
+
+ bool upload_skinweights = childGetValue("upload_skin").asBoolean();
+ bool upload_joint_positions = childGetValue("upload_joints").asBoolean();
+
+ mUploadModelUrl.clear();
+
+ gMeshRepo.uploadModel(mModelPreview->mUploadData, mModelPreview->mPreviewScale,
+ childGetValue("upload_textures").asBoolean(), upload_skinweights, upload_joint_positions, mUploadModelUrl, false,
+ getWholeModelFeeObserverHandle());
+
+ toggleCalculateButton(false);
+ mUploadBtn->setEnabled(false);
+}
+
//static
void LLFloaterModelPreview::onImportScaleCommit(LLUICtrl*,void* userdata)
{
@@ -458,7 +616,10 @@ void LLFloaterModelPreview::onImportScaleCommit(LLUICtrl*,void* userdata)
return;
}
- fp->mModelPreview->calcResourceCost();
+ fp->mModelPreview->mDirty = true;
+
+ fp->toggleCalculateButton(true);
+
fp->mModelPreview->refresh();
}
//static
@@ -470,11 +631,38 @@ void LLFloaterModelPreview::onPelvisOffsetCommit( LLUICtrl*, void* userdata )
{
return;
}
- fp->mModelPreview->calcResourceCost();
+
+ fp->mModelPreview->mDirty = true;
+
+ fp->toggleCalculateButton(true);
+
fp->mModelPreview->refresh();
}
//static
+void LLFloaterModelPreview::onPhysicsLoadRadioCommit( LLUICtrl*, void *userdata)
+{
+ LLFloaterModelPreview* fmp = LLFloaterModelPreview::sInstance;
+ if (fmp)
+ {
+ if (fmp->childGetValue("physics_use_lod").asBoolean())
+ {
+ onPhysicsUseLOD(NULL,NULL);
+ }
+ if (fmp->childGetValue("physics_load_from_file").asBoolean())
+ {
+
+ }
+ LLModelPreview *model_preview = fmp->mModelPreview;
+ if (model_preview)
+ {
+ model_preview->refresh();
+ model_preview->updateStatusMessages();
+ }
+ }
+}
+
+//static
void LLFloaterModelPreview::onUploadJointsCommit(LLUICtrl*,void* userdata)
{
LLFloaterModelPreview *fp =(LLFloaterModelPreview *)userdata;
@@ -496,8 +684,6 @@ void LLFloaterModelPreview::onUploadSkinCommit(LLUICtrl*,void* userdata)
{
return;
}
-
- fp->mModelPreview->calcResourceCost();
fp->mModelPreview->refresh();
fp->mModelPreview->resetPreviewTarget();
fp->mModelPreview->clearBuffers();
@@ -550,6 +736,7 @@ void LLFloaterModelPreview::onAutoFillCommit(LLUICtrl* ctrl, void* userdata)
void LLFloaterModelPreview::onLODParamCommit(LLUICtrl* ctrl, void* userdata)
{
LLFloaterModelPreview* fp = (LLFloaterModelPreview*) userdata;
+
fp->mModelPreview->onLODParamCommit(false);
}
@@ -578,36 +765,21 @@ void LLFloaterModelPreview::draw()
childSetTextArg("status", "[STATUS]", getString(LLModel::getStatusString(mModelPreview->getLoadState() - LLModelLoader::ERROR_PARSING)));
}
else
+ if ( mModelPreview->getLoadState() == LLModelLoader::ERROR_PARSING )
+ {
+ childSetTextArg("status", "[STATUS]", getString("status_parse_error"));
+ }
+ else
{
childSetTextArg("status", "[STATUS]", getString("status_idle"));
}
}
+ childSetEnabled("ok_btn", mHasUploadPerm && !mUploadModelUrl.empty());
+
childSetTextArg("prim_cost", "[PRIM_COST]", llformat("%d", mModelPreview->mResourceCost));
childSetTextArg("description_label", "[TEXTURES]", llformat("%d", mModelPreview->mTextureSet.size()));
- if (!mCurRequest.empty())
- {
- LLMutexLock lock(mStatusLock);
- childSetTextArg("status", "[STATUS]", mStatusMessage);
- }
- else
- {
- childSetVisible("Simplify", true);
- childSetVisible("simplify_cancel", false);
- childSetVisible("Decompose", true);
- childSetVisible("decompose_cancel", false);
- }
-
- U32 resource_cost = mModelPreview->mResourceCost*10;
-
- if (childGetValue("upload_textures").asBoolean())
- {
- resource_cost += mModelPreview->mTextureSet.size()*10;
- }
-
- childSetLabelArg("ok_btn", "[AMOUNT]", llformat("%d", resource_cost));
-
if (mModelPreview)
{
gGL.color3f(1.f, 1.f, 1.f);
@@ -740,6 +912,12 @@ BOOL LLFloaterModelPreview::handleScrollWheel(S32 x, S32 y, S32 clicks)
return TRUE;
}
+/*virtual*/
+void LLFloaterModelPreview::onOpen(const LLSD& key)
+{
+ requestAgentUploadPermissions();
+}
+
//static
void LLFloaterModelPreview::onPhysicsParamCommit(LLUICtrl* ctrl, void* data)
{
@@ -801,12 +979,14 @@ void LLFloaterModelPreview::onPhysicsStageExecute(LLUICtrl* ctrl, void* data)
sInstance->setStatusMessage(sInstance->getString("decomposing"));
sInstance->childSetVisible("Decompose", false);
sInstance->childSetVisible("decompose_cancel", true);
+ sInstance->childDisable("Simplify");
}
else if (stage == "Simplify")
{
sInstance->setStatusMessage(sInstance->getString("simplifying"));
sInstance->childSetVisible("Simplify", false);
sInstance->childSetVisible("simplify_cancel", true);
+ sInstance->childDisable("Decompose");
}
}
}
@@ -852,6 +1032,11 @@ void LLFloaterModelPreview::onPhysicsStageCancel(LLUICtrl* ctrl, void*data)
}
sInstance->mCurRequest.clear();
+
+ if (sInstance->mModelPreview)
+ {
+ sInstance->mModelPreview->updateStatusMessages();
+ }
}
}
@@ -997,7 +1182,7 @@ LLModelLoader::LLModelLoader( std::string filename, S32 lod, LLModelPreview* pre
std::deque<std::string>& jointsFromNodes )
: mJointList( jointMap )
, mJointsFromNode( jointsFromNodes )
-, LLThread("Model Loader"), mFilename(filename), mLod(lod), mPreview(preview), mFirstTransform(TRUE)
+, LLThread("Model Loader"), mFilename(filename), mLod(lod), mPreview(preview), mFirstTransform(TRUE), mNumOfFetchingTextures(0)
{
mJointMap["mPelvis"] = "mPelvis";
mJointMap["mTorso"] = "mTorso";
@@ -1162,11 +1347,7 @@ void stretch_extents(LLModel* model, LLMatrix4& mat, LLVector3& min, LLVector3&
void LLModelLoader::run()
{
- if (!doLoadModel())
- {
- mPreview = NULL;
- }
-
+ doLoadModel();
doOnIdleOneTime(boost::bind(&LLModelLoader::loadModelCallback,this));
}
@@ -1209,6 +1390,8 @@ bool LLModelLoader::doLoadModel()
if (!dom)
{
+ llinfos<<" Error with dae - traditionally indicates a corrupt file."<<llendl;
+ setLoadState( ERROR_PARSING );
return false;
}
@@ -1230,6 +1413,23 @@ bool LLModelLoader::doLoadModel()
return false;
}
+ //Verify some basic properties of the dae
+ //1. Basic validity check on controller
+ U32 controllerCount = (int) db->getElementCount( NULL, "controller" );
+ bool result = false;
+ for ( int i=0; i<controllerCount; ++i )
+ {
+ domController* pController = NULL;
+ db->getElement( (daeElement**) &pController, i , NULL, "controller" );
+ result = mPreview->verifyController( pController );
+ if (!result)
+ {
+ setLoadState( ERROR_PARSING );
+ return true;
+ }
+ }
+
+
//get unit scale
mTransform.setIdentity();
@@ -1280,7 +1480,7 @@ bool LLModelLoader::doLoadModel()
if(model->getStatus() != LLModel::NO_ERRORS)
{
setLoadState(ERROR_PARSING + model->getStatus()) ;
- return true ; //abort
+ return false; //abort
}
if (model.notNull() && validate_model(model))
@@ -1343,8 +1543,7 @@ bool LLModelLoader::doLoadModel()
LLMatrix4 trans = normalized_transformation;
trans *= skin_info.mBindShapeMatrix;
- skin_info.mBindShapeMatrix = trans;
-
+ skin_info.mBindShapeMatrix = trans;
}
@@ -1547,15 +1746,15 @@ bool LLModelLoader::doLoadModel()
}
}
- model->mSkinInfo.mInvBindMatrix.push_back(mat);
+ model->mSkinInfo.mInvBindMatrix.push_back(mat);
}
}
}
}
}
- //Now that we've parsed the joint array, let's determine if we have a full rig
- //(which means we have all the joints that are required for an avatar versus
+ //Now that we've parsed the jointa werray, let's determine if we have a full rig
+ //(which means we have all the joint sthat are required for an avatar versus
//a skinned asset attached to a node in a file that contains an entire skeleton,
//but does not use the skeleton).
buildJointToNodeMappingFromScene( root );
@@ -1577,7 +1776,7 @@ bool LLModelLoader::doLoadModel()
{
//llinfos<<"joint "<<lookingForJoint.c_str()<<llendl;
LLMatrix4 jointTransform = mJointList[lookingForJoint];
- LLJoint* pJoint = gAgentAvatarp->getJoint( lookingForJoint );
+ LLJoint* pJoint = mPreview->getPreviewAvatar()->getJoint( lookingForJoint );
if ( pJoint )
{
pJoint->storeCurrentXform( jointTransform.getTranslation() );
@@ -1639,7 +1838,7 @@ bool LLModelLoader::doLoadModel()
{
if (pos.getCount() <= j+2)
{
- llerrs << "WTF?" << llendl;
+ llerrs << "Invalid position array size." << llendl;
}
LLVector3 v(pos[j], pos[j+1], pos[j+2]);
@@ -1746,8 +1945,11 @@ bool LLModelLoader::doLoadModel()
mesh_scale *= transformation;
transformation = mesh_scale;
- std::vector<LLImportMaterial> materials;
- materials.resize(model->getNumVolumeFaces());
+ std::map<std::string, LLImportMaterial> materials;
+ for (U32 i = 0; i < model->mMaterialList.size(); ++i)
+ {
+ materials[model->mMaterialList[i]] = LLImportMaterial();
+ }
mScene[transformation].push_back(LLModelInstance(model, model->mLabel, transformation, materials));
stretch_extents(model, transformation, mExtents[0], mExtents[1], mFirstTransform);
}
@@ -1764,11 +1966,19 @@ bool LLModelLoader::doLoadModel()
{
llwarns << "document has no visual_scene" << llendl;
setLoadState( ERROR_PARSING );
- return false;
+ return true;
}
+
setLoadState( DONE );
- processElement(scene);
+ bool badElement = false;
+
+ processElement( scene, badElement );
+
+ if ( badElement )
+ {
+ setLoadState( ERROR_PARSING );
+ }
return true;
}
@@ -1801,6 +2011,11 @@ bool LLModelLoader::loadFromSLM(const std::string& filename)
//build model list for each LoD
model_list model[LLModel::NUM_LODS];
+ if (data["version"].asInteger() != SLM_SUPPORTED_VERSION)
+ { //unsupported version
+ return false;
+ }
+
LLSD& mesh = data["mesh"];
LLVolumeParams volume_params;
@@ -1823,10 +2038,6 @@ bool LLModelLoader::loadFromSLM(const std::string& filename)
mPreview->critiqueRigForUploadApplicability( loaded_model->mSkinInfo.mJointNames );
}
}
- else
- {
- llassert(model[lod].empty());
- }
}
}
@@ -1947,15 +2158,29 @@ void LLModelLoader::processJointToNodeMapping( domNode* pNode )
mJointsFromNode.push_front( pNode->getName() );
}
//2. Handle the kiddo's
- daeTArray< daeSmartRef<daeElement> > childOfChild = pNode->getChildren();
- S32 childOfChildCount = childOfChild.getCount();
- for (S32 i = 0; i < childOfChildCount; ++i)
+ processChildJoints( pNode );
+ }
+ else
+ {
+ //Determine if the're any children wrt to this failed node.
+ //This occurs when an armature is exported and ends up being what essentially amounts to
+ //as the root for the visual_scene
+ processChildJoints( pNode );
+ }
+}
+//-----------------------------------------------------------------------------
+// processChildJoint()
+//-----------------------------------------------------------------------------
+void LLModelLoader::processChildJoints( domNode* pParentNode )
+{
+ daeTArray< daeSmartRef<daeElement> > childOfChild = pParentNode->getChildren();
+ S32 childOfChildCount = childOfChild.getCount();
+ for (S32 i = 0; i < childOfChildCount; ++i)
+ {
+ domNode* pChildNode = daeSafeCast<domNode>( childOfChild[i] );
+ if ( pChildNode )
{
- domNode* pChildNode = daeSafeCast<domNode>( childOfChild[i] );
- if ( pChildNode )
- {
- processJointToNodeMapping( pChildNode );
- }
+ processJointToNodeMapping( pChildNode );
}
}
}
@@ -1980,15 +2205,11 @@ void LLModelPreview::critiqueRigForUploadApplicability( const std::vector<std::s
setRigValidForJointPositionUpload( true );
}
- if ( isRigLegacyOK )
- {
+ if ( isRigLegacyOK)
+ {
setLegacyRigValid( true );
}
- if ( getRigWithSceneParity() && isJointPositionUploadOK )
- {
- setResetJointFlag( true );
- }
}
//-----------------------------------------------------------------------------
// critiqueJointToNodeMappingFromScene()
@@ -2028,12 +2249,7 @@ void LLModelPreview::critiqueJointToNodeMappingFromScene( void )
//2. Partial rig but w/o parity between the scene and joint array
if ( result )
{
- setResetJointFlag( true );
setRigWithSceneParity( true );
- }
- else
- {
- setResetJointFlag( false );
}
}
//-----------------------------------------------------------------------------
@@ -2122,14 +2338,18 @@ void LLModelLoader::loadTextures()
{
for(U32 i = 0 ; i < iter->second.size(); i++)
{
- for(U32 j = 0 ; j < iter->second[i].mMaterial.size() ; j++)
+ for(std::map<std::string, LLImportMaterial>::iterator j = iter->second[i].mMaterial.begin();
+ j != iter->second[i].mMaterial.end(); ++j)
{
- if(!iter->second[i].mMaterial[j].mDiffuseMapFilename.empty())
+ LLImportMaterial& material = j->second;
+
+ if(!material.mDiffuseMapFilename.empty())
{
- iter->second[i].mMaterial[j].mDiffuseMap =
- LLViewerTextureManager::getFetchedTextureFromUrl("file://" + iter->second[i].mMaterial[j].mDiffuseMapFilename, TRUE, LLViewerTexture::BOOST_PREVIEW);
- iter->second[i].mMaterial[j].mDiffuseMap->setLoadedCallback(LLModelPreview::textureLoadedCallback, 0, TRUE, FALSE, mPreview, NULL, FALSE);
- iter->second[i].mMaterial[j].mDiffuseMap->forceToSaveRawImage();
+ material.mDiffuseMap =
+ LLViewerTextureManager::getFetchedTextureFromUrl("file://" + material.mDiffuseMapFilename, TRUE, LLViewerTexture::BOOST_PREVIEW);
+ material.mDiffuseMap->setLoadedCallback(LLModelPreview::textureLoadedCallback, 0, TRUE, FALSE, mPreview, NULL, FALSE);
+ material.mDiffuseMap->forceToSaveRawImage(0, F32_MAX);
+ mNumOfFetchingTextures++ ;
}
}
}
@@ -2146,8 +2366,20 @@ void LLModelLoader::loadTextures()
//-----------------------------------------------------------------------------
bool LLModelLoader::isNodeAJoint( domNode* pNode )
{
- if ( !pNode || pNode->getName() == NULL)
+ if ( !pNode )
{
+ llinfos<<"Created node is NULL"<<llendl;
+ return false;
+ }
+
+ if ( pNode->getName() == NULL )
+ {
+ llinfos<<"Parsed node has no name "<<llendl;
+ //Attempt to write the node id, if possible (aids in debugging the visual scene)
+ if ( pNode->getId() )
+ {
+ llinfos<<"Parsed node ID: "<<pNode->getId()<<llendl;
+ }
return false;
}
@@ -2158,6 +2390,90 @@ bool LLModelLoader::isNodeAJoint( domNode* pNode )
return false;
}
+//-----------------------------------------------------------------------------
+// verifyCount
+//-----------------------------------------------------------------------------
+bool LLModelPreview::verifyCount( int expected, int result )
+{
+ if ( expected != result )
+ {
+ llinfos<< "Error: (expected/got)"<<expected<<"/"<<result<<"verts"<<llendl;
+ return false;
+ }
+ return true;
+}
+//-----------------------------------------------------------------------------
+// verifyController
+//-----------------------------------------------------------------------------
+bool LLModelPreview::verifyController( domController* pController )
+{
+
+ bool result = true;
+
+ domSkin* pSkin = pController->getSkin();
+
+ if ( pSkin )
+ {
+ xsAnyURI & uri = pSkin->getSource();
+ domElement* pElement = uri.getElement();
+
+ if ( !pElement )
+ {
+ llinfos<<"Can't resolve skin source"<<llendl;
+ return false;
+ }
+
+ daeString type_str = pElement->getTypeName();
+ if ( stricmp(type_str, "geometry") == 0 )
+ {
+ //Skin is reference directly by geometry and get the vertex count from skin
+ domSkin::domVertex_weights* pVertexWeights = pSkin->getVertex_weights();
+ U32 vertexWeightsCount = pVertexWeights->getCount();
+ domGeometry* pGeometry = (domGeometry*) (domElement*) uri.getElement();
+ domMesh* pMesh = pGeometry->getMesh();
+
+ if ( pMesh )
+ {
+ //Get vertex count from geometry
+ domVertices* pVertices = pMesh->getVertices();
+ if ( !pVertices )
+ {
+ llinfos<<"No vertices!"<<llendl;
+ return false;
+ }
+
+ if ( pVertices )
+ {
+ xsAnyURI src = pVertices->getInput_array()[0]->getSource();
+ domSource* pSource = (domSource*) (domElement*) src.getElement();
+ U32 verticesCount = pSource->getTechnique_common()->getAccessor()->getCount();
+ result = verifyCount( verticesCount, vertexWeightsCount );
+ if ( !result )
+ {
+ return result;
+ }
+ }
+ }
+
+ U32 vcountCount = (U32) pVertexWeights->getVcount()->getValue().getCount();
+ result = verifyCount( vcountCount, vertexWeightsCount );
+ if ( !result )
+ {
+ return result;
+ }
+
+ domInputLocalOffset_Array& inputs = pVertexWeights->getInput_array();
+ U32 sum = 0;
+ for (size_t i=0; i<vcountCount; i++)
+ {
+ sum += pVertexWeights->getVcount()->getValue()[i];
+ }
+ result = verifyCount( sum * inputs.getCount(), (domInt) pVertexWeights->getV()->getValue().getCount() );
+ }
+ }
+
+ return result;
+}
//-----------------------------------------------------------------------------
// extractTranslation()
@@ -2268,7 +2584,7 @@ daeElement* LLModelLoader::getChildFromElement( daeElement* pElement, std::strin
return NULL;
}
-void LLModelLoader::processElement(daeElement* element)
+void LLModelLoader::processElement( daeElement* element, bool& badElement )
{
LLMatrix4 saved_transform = mTransform;
@@ -2301,8 +2617,11 @@ void LLModelLoader::processElement(daeElement* element)
{
domFloat3 dom_value = scale->getValue();
+
+ LLVector3 scale_vector = LLVector3(dom_value[0], dom_value[1], dom_value[2]);
+ scale_vector.abs(); // Set all values positive, since we don't currently support mirrored meshes
LLMatrix4 scaling;
- scaling.initScale(LLVector3(dom_value[0], dom_value[1], dom_value[2]));
+ scaling.initScale(scale_vector);
scaling *= mTransform;
mTransform = scaling;
@@ -2341,7 +2660,7 @@ void LLModelLoader::processElement(daeElement* element)
{
LLMatrix4 transformation = mTransform;
- std::vector<LLImportMaterial> materials = getMaterials(model, instance_geo);
+ std::map<std::string, LLImportMaterial> materials = getMaterials(model, instance_geo);
// adjust the transformation to compensate for mesh normalization
LLVector3 mesh_scale_vector;
@@ -2365,6 +2684,12 @@ void LLModelLoader::processElement(daeElement* element)
}
}
}
+ else
+ {
+ llinfos<<"Unable to resolve geometry URL."<<llendl;
+ badElement = true;
+ }
+
}
domInstance_node* instance_node = daeSafeCast<domInstance_node>(element);
@@ -2373,7 +2698,7 @@ void LLModelLoader::processElement(daeElement* element)
daeElement* instance = instance_node->getUrl().getElement();
if (instance)
{
- processElement(instance);
+ processElement(instance,badElement);
}
}
@@ -2381,7 +2706,7 @@ void LLModelLoader::processElement(daeElement* element)
daeTArray< daeSmartRef<daeElement> > children = element->getChildren();
for (S32 i = 0; i < children.getCount(); i++)
{
- processElement(children[i]);
+ processElement(children[i],badElement);
}
domNode* node = daeSafeCast<domNode>(element);
@@ -2391,9 +2716,9 @@ void LLModelLoader::processElement(daeElement* element)
}
}
-std::vector<LLImportMaterial> LLModelLoader::getMaterials(LLModel* model, domInstance_geometry* instance_geo)
+std::map<std::string, LLImportMaterial> LLModelLoader::getMaterials(LLModel* model, domInstance_geometry* instance_geo)
{
- std::vector<LLImportMaterial> materials;
+ std::map<std::string, LLImportMaterial> materials;
for (int i = 0; i < model->mMaterialList.size(); i++)
{
LLImportMaterial import_material;
@@ -2440,7 +2765,8 @@ std::vector<LLImportMaterial> LLModelLoader::getMaterials(LLModel* model, domIns
}
}
- materials.push_back(import_material);
+ import_material.mBinding = model->mMaterialList[i];
+ materials[model->mMaterialList[i]] = import_material;
}
return materials;
@@ -2657,13 +2983,15 @@ LLModelPreview::LLModelPreview(S32 width, S32 height, LLFloater* fmp)
mMasterLegacyJointList.push_front("mHipLeft");
mMasterLegacyJointList.push_front("mKneeLeft");
mMasterLegacyJointList.push_front("mFootLeft");
+
+ createPreviewAvatar();
}
LLModelPreview::~LLModelPreview()
{
if (mModelLoader)
{
- delete mModelLoader;
+ mModelLoader->mPreview = NULL;
mModelLoader = NULL;
}
//*HACK : *TODO : turn this back on when we understand why this crashes
@@ -2678,7 +3006,7 @@ U32 LLModelPreview::calcResourceCost()
if (mFMP && mModelLoader)
{
- if ( getLoadState() < LLModelLoader::ERROR_PARSING )
+ if ( getLoadState() < LLModelLoader::ERROR_PARSING)
{
mFMP->childEnable("ok_btn");
}
@@ -2691,16 +3019,9 @@ U32 LLModelPreview::calcResourceCost()
if ( uploadingJointPositions && !isRigValidForJointPositionUpload() )
{
mFMP->childDisable("ok_btn");
- }
- else
- if ( !isLegacyRigValid() )
- {
- mFMP->childDisable("ok_btn");
- }
- //ok_btn should not have been changed unless something was wrong with joint list
+ }
}
- U32 cost = 0;
std::set<LLModel*> accounted;
U32 num_points = 0;
U32 num_hulls = 0;
@@ -2710,7 +3031,7 @@ U32 LLModelPreview::calcResourceCost()
if ( mFMP && mFMP->childGetValue("upload_joints").asBoolean() )
{
- gAgentAvatarp->setPelvisOffset( mPelvisZOffset );
+ getPreviewAvatar()->setPelvisOffset( mPelvisZOffset );
}
F32 streaming_cost = 0.f;
@@ -2748,8 +3069,7 @@ U32 LLModelPreview::calcResourceCost()
mFMP->childGetValue("upload_skin").asBoolean(),
mFMP->childGetValue("upload_joints").asBoolean(),
TRUE);
- cost += gMeshRepo.calcResourceCost(ret);
-
+
num_hulls += decomp.mHull.size();
for (U32 i = 0; i < decomp.mHull.size(); ++i)
{
@@ -2769,7 +3089,7 @@ U32 LLModelPreview::calcResourceCost()
F32 z_length = z_transformed.normalize();
LLVector3 scale = LLVector3(x_length, y_length, z_length);
- F32 radius = scale.length()*debug_scale;
+ F32 radius = scale.length()*0.5f*debug_scale;
streaming_cost += LLMeshRepository::getStreamingCost(ret, radius);
}
@@ -2781,7 +3101,7 @@ U32 LLModelPreview::calcResourceCost()
updateStatusMessages();
- return cost;
+ return (U32) streaming_cost;
}
void LLFloaterModelPreview::setDetails(F32 x, F32 y, F32 z, F32 streaming_cost, F32 physics_cost)
@@ -2789,8 +3109,6 @@ void LLFloaterModelPreview::setDetails(F32 x, F32 y, F32 z, F32 streaming_cost,
childSetTextArg("import_dimensions", "[X]", llformat("%.3f", x));
childSetTextArg("import_dimensions", "[Y]", llformat("%.3f", y));
childSetTextArg("import_dimensions", "[Z]", llformat("%.3f", z));
- childSetTextArg("streaming cost", "[COST]", llformat("%.3f", streaming_cost));
- childSetTextArg("physics cost", "[COST]", llformat("%.3f", physics_cost));
}
@@ -2820,11 +3138,24 @@ void LLModelPreview::rebuildUploadData()
F32 max_scale = 0.f;
- if ( mBaseScene.size() > 0 )
+ if ( mBaseScene.size() > 0)
{
mFMP->childEnable("ok_btn");
}
+ //reorder materials to match mBaseModel
+ for (U32 i = 0; i < LLModel::NUM_LODS; i++)
+ {
+ if (mBaseModel.size() == mModel[i].size())
+ {
+ for (U32 j = 0; j < mBaseModel.size(); ++j)
+ {
+ mModel[i][j]->matchMaterialOrder(mBaseModel[j]);
+ llassert(mModel[i][j]->mMaterialList == mBaseModel[j]->mMaterialList);
+ }
+ }
+ }
+
for (LLModelLoader::scene::iterator iter = mBaseScene.begin(); iter != mBaseScene.end(); ++iter)
{ //for each transform in scene
LLMatrix4 mat = iter->first;
@@ -2864,18 +3195,20 @@ void LLModelPreview::rebuildUploadData()
}
}
- for (U32 i = 0; i < LLModel::NUM_LODS; i++)
- { //fill LOD slots based on reference model index
- if (!mModel[i].empty())
- {
- instance.mLOD[i] = mModel[i][idx];
- }
- else
- {
- instance.mLOD[i] = NULL;
+ if(idx < mBaseModel.size())
+ {
+ for (U32 i = 0; i < LLModel::NUM_LODS; i++)
+ { //fill LOD slots based on reference model index
+ if (mModel[i].size() > idx)
+ {
+ instance.mLOD[i] = mModel[i][idx];
+ }
+ else
+ {
+ instance.mLOD[i] = NULL;
+ }
}
}
-
instance.mTransform = mat;
mUploadData.push_back(instance);
}
@@ -2921,6 +3254,8 @@ void LLModelPreview::saveUploadData(const std::string& filename, bool save_skinw
LLSD data;
+ data["version"] = SLM_SUPPORTED_VERSION;
+
S32 mesh_id = 0;
//build list of unique models and initialize local id
@@ -2947,7 +3282,7 @@ void LLModelPreview::saveUploadData(const std::string& filename, bool save_skinw
instance.mLOD[LLModel::LOD_LOW],
instance.mLOD[LLModel::LOD_IMPOSTOR],
decomp,
- save_skinweights, save_joint_positions);
+ save_skinweights, save_joint_positions, FALSE, TRUE);
data["mesh"][instance.mModel->mLocalID] = str.str();
@@ -2974,7 +3309,7 @@ void LLModelPreview::clearModel(S32 lod)
mScene[lod].clear();
}
-void LLModelPreview::loadModel(std::string filename, S32 lod)
+void LLModelPreview::loadModel(std::string filename, S32 lod, bool force_disable_slm)
{
assert_main_thread();
@@ -3011,6 +3346,11 @@ void LLModelPreview::loadModel(std::string filename, S32 lod)
mModelLoader = new LLModelLoader(filename, lod, this, mJointTransformMap, mJointsFromNode );
+ if (force_disable_slm)
+ {
+ mModelLoader->mTrySLM = false;
+ }
+
mModelLoader->start();
mFMP->childSetTextArg("status", "[STATUS]", mFMP->getString("status_reading_file"));
@@ -3020,6 +3360,7 @@ void LLModelPreview::loadModel(std::string filename, S32 lod)
if ( getLoadState() >= LLModelLoader::ERROR_PARSING )
{
mFMP->childDisable("ok_btn");
+ mFMP->childDisable( "calculate_btn" );
}
if (lod == mPreviewLOD)
@@ -3224,6 +3565,18 @@ void LLModelPreview::loadModelCallback(S32 lod)
}
mLoading = false;
+ if (mFMP)
+ {
+ mFMP->getChild<LLCheckBoxCtrl>("confirm_checkbox")->set(FALSE);
+ if (!mBaseModel.empty())
+ {
+ if (mFMP->getChild<LLUICtrl>("description_form")->getValue().asString().empty())
+ {
+ const std::string& model_name = mBaseModel[0]->getName();
+ mFMP->getChild<LLUICtrl>("description_form")->setValue(model_name);
+ }
+ }
+ }
refresh();
mModelLoadedSignal();
@@ -3237,7 +3590,7 @@ void LLModelPreview::resetPreviewTarget()
mPreviewScale = (mModelLoader->mExtents[1] - mModelLoader->mExtents[0]) * 0.5f;
}
- setPreviewTarget(mPreviewScale.magVec()*2.f);
+ setPreviewTarget(mPreviewScale.magVec()*10.f);
}
void LLModelPreview::generateNormals()
@@ -3279,43 +3632,6 @@ void LLModelPreview::generateNormals()
updateStatusMessages();
}
-void LLModelPreview::clearMaterials()
-{
- for (LLModelLoader::scene::iterator iter = mScene[mPreviewLOD].begin(); iter != mScene[mPreviewLOD].end(); ++iter)
- { //for each transform in current scene
- for (LLModelLoader::model_instance_list::iterator model_iter = iter->second.begin(); model_iter != iter->second.end(); ++model_iter)
- { //for each instance with that transform
- LLModelInstance& source_instance = *model_iter;
- LLModel* source = source_instance.mModel;
-
- for (S32 i = 0; i < source->getNumVolumeFaces(); ++i)
- { //for each face in instance
- LLImportMaterial& source_material = source_instance.mMaterial[i];
-
- //clear material info
- source_material.mDiffuseColor = LLColor4(1,1,1,1);
- source_material.mDiffuseMap = NULL;
- source_material.mDiffuseMapFilename.clear();
- source_material.mDiffuseMapLabel.clear();
- source_material.mFullbright = false;
- }
- }
- }
-
- mVertexBuffer[mPreviewLOD].clear();
-
- if (mPreviewLOD == LLModel::LOD_HIGH)
- {
- mBaseScene = mScene[mPreviewLOD];
- mBaseModel = mModel[mPreviewLOD];
- clearGLODGroup();
- mVertexBuffer[5].clear();
- }
-
- mResourceCost = calcResourceCost();
- refresh();
-}
-
void LLModelPreview::genLODs(S32 which_lod, U32 decimation, bool enforce_tri_limit)
{
if (mBaseModel.empty())
@@ -3489,7 +3805,9 @@ void LLModelPreview::genLODs(S32 which_lod, U32 decimation, bool enforce_tri_lim
U32 tri_count = 0;
for (U32 i = 0; i < mVertexBuffer[5][mdl].size(); ++i)
{
- mVertexBuffer[5][mdl][i]->setBuffer(type_mask);
+ LLVertexBuffer* buff = mVertexBuffer[5][mdl][i];
+ buff->setBuffer(type_mask & buff->getTypeMask());
+
U32 num_indices = mVertexBuffer[5][mdl][i]->getNumIndices();
if (num_indices > 2)
{
@@ -3611,6 +3929,8 @@ void LLModelPreview::genLODs(S32 which_lod, U32 decimation, bool enforce_tri_lim
for (GLint i = 0; i < patch_count; ++i)
{
+ type_mask = mVertexBuffer[5][base][i]->getTypeMask();
+
LLPointer<LLVertexBuffer> buff = new LLVertexBuffer(type_mask, 0);
if (sizes[i*2+1] > 0 && sizes[i*2] > 0)
@@ -3635,8 +3955,15 @@ void LLModelPreview::genLODs(S32 which_lod, U32 decimation, bool enforce_tri_lim
LLStrider<U16> index;
buff->getVertexStrider(pos);
- buff->getNormalStrider(norm);
- buff->getTexCoord0Strider(tc);
+ if (type_mask & LLVertexBuffer::MAP_NORMAL)
+ {
+ buff->getNormalStrider(norm);
+ }
+ if (type_mask & LLVertexBuffer::MAP_TEXCOORD0)
+ {
+ buff->getTexCoord0Strider(tc);
+ }
+
buff->getIndexStrider(index);
target_model->setVolumeFaceData(names[i], pos, norm, tc, index, buff->getNumVerts(), buff->getNumIndices());
@@ -3755,7 +4082,35 @@ void LLModelPreview::updateStatusMessages()
mMaxTriangleLimit = total_tris[LLModel::LOD_HIGH];
}
+ bool has_degenerate = false;
+
+ {//check for degenerate triangles in physics mesh
+ U32 lod = LLModel::LOD_PHYSICS;
+ const LLVector4a scale(0.5f);
+ for (U32 i = 0; i < mModel[lod].size() && !has_degenerate; ++i)
+ { //for each model in the lod
+ if (mModel[lod][i]->mPhysics.mHull.empty())
+ { //no decomp exists
+ S32 cur_submeshes = mModel[lod][i]->getNumVolumeFaces();
+ for (S32 j = 0; j < cur_submeshes && !has_degenerate; ++j)
+ { //for each submesh (face), add triangles and vertices to current total
+ const LLVolumeFace& face = mModel[lod][i]->getVolumeFace(j);
+ for (S32 k = 0; k < face.mNumIndices && !has_degenerate; )
+ {
+ LLVector4a v1; v1.setMul(face.mPositions[face.mIndices[k++]], scale);
+ LLVector4a v2; v2.setMul(face.mPositions[face.mIndices[k++]], scale);
+ LLVector4a v3; v3.setMul(face.mPositions[face.mIndices[k++]], scale);
+ if (ll_is_degenerate(v1,v2,v3))
+ {
+ has_degenerate = true;
+ }
+ }
+ }
+ }
+ }
+ }
+
mFMP->childSetTextArg("submeshes_info", "[SUBMESHES]", llformat("%d", total_submeshes[LLModel::LOD_HIGH]));
std::string mesh_status_na = mFMP->getString("mesh_status_na");
@@ -3814,18 +4169,20 @@ void LLModelPreview::updateStatusMessages()
}
else if (!verts[lod].empty())
{
+ S32 sum_verts_higher_lod = 0;
+ S32 sum_verts_this_lod = 0;
for (U32 i = 0; i < verts[lod].size(); ++i)
{
- S32 max_verts = i < verts[lod+1].size() ? verts[lod+1][i] : 0;
+ sum_verts_higher_lod += ((i < verts[lod+1].size()) ? verts[lod+1][i] : 0);
+ sum_verts_this_lod += verts[lod][i];
+ }
- if (max_verts > 0)
- {
- if (verts[lod][i] > max_verts)
- { //too many vertices in this lod
- message = "mesh_status_too_many_vertices";
- upload_status[lod] = 2;
- }
- }
+ if ((sum_verts_higher_lod > 0) &&
+ (sum_verts_this_lod > sum_verts_higher_lod))
+ {
+ //too many vertices in this lod
+ message = "mesh_status_too_many_vertices";
+ upload_status[lod] = 2;
}
}
}
@@ -3848,6 +4205,21 @@ void LLModelPreview::updateStatusMessages()
}
}
+
+ //make sure no hulls have more than 256 points in them
+ for (U32 i = 0; upload_ok && i < mModel[LLModel::LOD_PHYSICS].size(); ++i)
+ {
+ LLModel* mdl = mModel[LLModel::LOD_PHYSICS][i];
+
+ for (U32 j = 0; upload_ok && j < mdl->mPhysics.mHull.size(); ++j)
+ {
+ if (mdl->mPhysics.mHull[j].size() > 256)
+ {
+ upload_ok = false;
+ }
+ }
+ }
+
bool errorStateFromLoader = getLoadState() >= LLModelLoader::ERROR_PARSING ? true : false;
bool skinAndRigOk = true;
@@ -3859,18 +4231,25 @@ void LLModelPreview::updateStatusMessages()
if ( uploadingJointPositions && !isRigValidForJointPositionUpload() )
{
skinAndRigOk = false;
- }
- else
- if ( !isLegacyRigValid() )
+ }
+ }
+
+ if(upload_ok && mModelLoader)
+ {
+ if(!mModelLoader->areTexturesReady() && mFMP->childGetValue("upload_textures").asBoolean())
{
- skinAndRigOk = false;
+ upload_ok = false ;
}
}
-
- if ( upload_ok && !errorStateFromLoader && skinAndRigOk )
+
+ if ( upload_ok && !errorStateFromLoader && skinAndRigOk && !has_degenerate)
{
mFMP->childEnable("ok_btn");
}
+ else
+ {
+ mFMP->childDisable("ok_btn");
+ }
//add up physics triangles etc
S32 start = 0;
@@ -3947,7 +4326,7 @@ void LLModelPreview::updateStatusMessages()
//fmp->childSetEnabled("physics_optimize", !use_hull);
- bool enable = phys_tris > 0 || phys_hulls > 0;
+ bool enable = (phys_tris > 0 || phys_hulls > 0) && fmp->mCurRequest.empty();
//enable = enable && !use_hull && fmp->childGetValue("physics_optimize").asBoolean();
//enable/disable "analysis" UI
@@ -3959,7 +4338,7 @@ void LLModelPreview::updateStatusMessages()
child = panel->findNextSibling(child);
}
- enable = phys_hulls > 0;
+ enable = phys_hulls > 0 && fmp->mCurRequest.empty();
//enable/disable "simplification" UI
panel = fmp->getChild<LLPanel>("physics simplification");
child = panel->getFirstChild();
@@ -3968,6 +4347,29 @@ void LLModelPreview::updateStatusMessages()
child->setEnabled(enable);
child = panel->findNextSibling(child);
}
+
+ if (fmp->mCurRequest.empty())
+ {
+ fmp->childSetVisible("Simplify", true);
+ fmp->childSetVisible("simplify_cancel", false);
+ fmp->childSetVisible("Decompose", true);
+ fmp->childSetVisible("decompose_cancel", false);
+
+ if (phys_hulls > 0)
+ {
+ fmp->childEnable("Simplify");
+ }
+
+ if (phys_tris || phys_hulls > 0)
+ {
+ fmp->childEnable("Decompose");
+ }
+ }
+ else
+ {
+ fmp->childEnable("simplify_cancel");
+ fmp->childEnable("decompose_cancel");
+ }
}
const char* lod_controls[] =
@@ -4111,6 +4513,8 @@ void LLModelPreview::updateStatusMessages()
crease->forceSetValue(mRequestedCreaseAngle[mPreviewLOD]);
}
+ mModelUpdatedSignal(true);
+
}
void LLModelPreview::setPreviewTarget(F32 distance)
@@ -4184,7 +4588,7 @@ void LLModelPreview::genBuffers(S32 lod, bool include_skin_weights)
bool skinned = include_skin_weights && !mdl->mSkinWeights.empty();
- U32 mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_TEXCOORD0;
+ U32 mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_TEXCOORD0 ;
if (skinned)
{
@@ -4202,8 +4606,6 @@ void LLModelPreview::genBuffers(S32 lod, bool include_skin_weights)
LLStrider<LLVector4> weights_strider;
vb->getVertexStrider(vertex_strider);
- vb->getNormalStrider(normal_strider);
- vb->getTexCoord0Strider(tc_strider);
vb->getIndexStrider(index_strider);
if (skinned)
@@ -4212,8 +4614,18 @@ void LLModelPreview::genBuffers(S32 lod, bool include_skin_weights)
}
LLVector4a::memcpyNonAliased16((F32*) vertex_strider.get(), (F32*) vf.mPositions, num_vertices*4*sizeof(F32));
- LLVector4a::memcpyNonAliased16((F32*) tc_strider.get(), (F32*) vf.mTexCoords, num_vertices*2*sizeof(F32));
- LLVector4a::memcpyNonAliased16((F32*) normal_strider.get(), (F32*) vf.mNormals, num_vertices*4*sizeof(F32));
+
+ if (vf.mTexCoords)
+ {
+ vb->getTexCoord0Strider(tc_strider);
+ LLVector4a::memcpyNonAliased16((F32*) tc_strider.get(), (F32*) vf.mTexCoords, num_vertices*2*sizeof(F32));
+ }
+
+ if (vf.mNormals)
+ {
+ vb->getNormalStrider(normal_strider);
+ LLVector4a::memcpyNonAliased16((F32*) normal_strider.get(), (F32*) vf.mNormals, num_vertices*4*sizeof(F32));
+ }
if (skinned)
{
@@ -4225,11 +4637,7 @@ void LLModelPreview::genBuffers(S32 lod, bool include_skin_weights)
const LLModel::weight_list& weight_list = base_mdl->getJointInfluences(pos);
LLVector4 w(0,0,0,0);
- if (weight_list.size() > 4)
- {
- llerrs << "WTF?" << llendl;
- }
-
+
for (U32 i = 0; i < weight_list.size(); ++i)
{
F32 wght = llmin(weight_list[i].mWeight, 0.999999f);
@@ -4277,42 +4685,6 @@ void LLModelPreview::update()
}
//-----------------------------------------------------------------------------
-// changeAvatarsJointPositions()
-//-----------------------------------------------------------------------------
-void LLModelPreview::changeAvatarsJointPositions( LLModel* pModel )
-{
- if ( mMasterJointList.empty() )
- {
- return;
- }
-
- std::vector<std::string> :: const_iterator jointListItBegin = pModel->mSkinInfo.mJointNames.begin();
- std::vector<std::string> :: const_iterator jointListItEnd = pModel->mSkinInfo.mJointNames.end();
-
- S32 index = 0;
- for ( ; jointListItBegin!=jointListItEnd; ++jointListItBegin, ++index )
- {
- std::string elem = *jointListItBegin;
- //llinfos<<"joint "<<elem<<llendl;
-
- S32 matrixCnt = pModel->mSkinInfo.mAlternateBindMatrix.size();
- if ( matrixCnt < 1 )
- {
- llinfos<<"Total WTF moment :"<<matrixCnt<<llendl;
- }
- else
- {
- LLMatrix4 jointTransform = pModel->mSkinInfo.mAlternateBindMatrix[index];
-
- LLJoint* pJoint = gAgentAvatarp->getJoint( elem );
- if ( pJoint )
- {
- pJoint->storeCurrentXform( jointTransform.getTranslation() );
- }
- }
- }
-}
-//-----------------------------------------------------------------------------
// getTranslationForJointOffset()
//-----------------------------------------------------------------------------
LLVector3 LLModelPreview::getTranslationForJointOffset( std::string joint )
@@ -4326,6 +4698,30 @@ LLVector3 LLModelPreview::getTranslationForJointOffset( std::string joint )
return LLVector3(0.0f,0.0f,0.0f);
}
//-----------------------------------------------------------------------------
+// createPreviewAvatar
+//-----------------------------------------------------------------------------
+void LLModelPreview::createPreviewAvatar( void )
+{
+ mPreviewAvatar = (LLVOAvatar*)gObjectList.createObjectViewer( LL_PCODE_LEGACY_AVATAR, gAgent.getRegion() );
+ if ( mPreviewAvatar )
+ {
+ mPreviewAvatar->createDrawable( &gPipeline );
+ mPreviewAvatar->mIsDummy = TRUE;
+ mPreviewAvatar->mSpecialRenderMode = 1;
+ mPreviewAvatar->setPositionAgent( LLVector3::zero );
+ mPreviewAvatar->slamPosition();
+ mPreviewAvatar->updateJointLODs();
+ mPreviewAvatar->updateGeometry( mPreviewAvatar->mDrawable );
+ mPreviewAvatar->startMotion( ANIM_AGENT_STAND );
+ mPreviewAvatar->hideSkirt();
+ }
+ else
+ {
+ llinfos<<"Failed to create preview avatar for upload model window"<<llendl;
+ }
+}
+
+//-----------------------------------------------------------------------------
// render()
//-----------------------------------------------------------------------------
BOOL LLModelPreview::render()
@@ -4436,33 +4832,29 @@ BOOL LLModelPreview::render()
mFMP->childSetValue("upload_joints", false);
upload_joints = false;
}
-
- mFMP->childSetEnabled("upload_joints", upload_skin);
-
- //poke at avatar when we upload custom joints
- /*
- if ( upload_joints )
+
+ //Only enable joint offsets if it passed the earlier critiquing
+ if ( isRigValidForJointPositionUpload() )
{
- for (LLModelLoader::scene::iterator iter = mScene[mPreviewLOD].begin(); iter != mScene[mPreviewLOD].end(); ++iter)
- {
- for (LLModelLoader::model_instance_list::iterator model_iter = iter->second.begin(); model_iter != iter->second.end(); ++model_iter)
- {
- LLModelInstance& instance = *model_iter;
- LLModel* model = instance.mModel;
- if ( !model->mSkinWeights.empty() )
- {
- changeAvatarsJointPositions( model );
- }
- }
- }
+ mFMP->childSetEnabled("upload_joints", upload_skin);
}
- */
-
+
F32 explode = mFMP->childGetValue("physics_explode").asReal();
glClear(GL_DEPTH_BUFFER_BIT);
- LLRect preview_rect = mFMP->getChildView("preview_panel")->getRect();
+ LLRect preview_rect;
+
+ LLFloaterModelWizard* floater_wizard = dynamic_cast<LLFloaterModelWizard*>(mFMP);
+ if (floater_wizard)
+ {
+ preview_rect = floater_wizard->getPreviewRect();
+ }
+ else
+ {
+ preview_rect = mFMP->getChildView("preview_panel")->getRect();
+ }
+
F32 aspect = (F32) preview_rect.getWidth()/preview_rect.getHeight();
LLViewerCamera::getInstance()->setAspect(aspect);
@@ -4473,11 +4865,11 @@ BOOL LLModelPreview::render()
LLVector3 target_pos = mPreviewTarget+offset;
F32 z_near = 0.001f;
- F32 z_far = mCameraDistance+mPreviewScale.magVec()+mCameraOffset.magVec();
+ F32 z_far = mCameraDistance*10.0f+mPreviewScale.magVec()+mCameraOffset.magVec();
if (skin_weight)
{
- target_pos = gAgentAvatarp->getPositionAgent();
+ target_pos = getPreviewAvatar()->getPositionAgent();
z_near = 0.01f;
z_far = 1024.f;
mCameraDistance = 16.f;
@@ -4507,6 +4899,8 @@ BOOL LLModelPreview::render()
const F32 BRIGHTNESS = 0.9f;
gGL.color3f(BRIGHTNESS, BRIGHTNESS, BRIGHTNESS);
+ const U32 type_mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_TEXCOORD0;
+
LLGLEnable normalize(GL_NORMALIZE);
if (!mBaseModel.empty() && mVertexBuffer[5].empty())
@@ -4529,6 +4923,19 @@ BOOL LLModelPreview::render()
}
}
+ //make sure material lists all match
+ for (U32 i = 0; i < LLModel::NUM_LODS; i++)
+ {
+ if (mBaseModel.size() == mModel[i].size())
+ {
+ for (U32 j = 0; j < mBaseModel.size(); ++j)
+ {
+ mModel[i][j]->matchMaterialOrder(mBaseModel[j]);
+ llassert(mModel[i][j]->mMaterialList == mBaseModel[j]->mMaterialList);
+ }
+ }
+ }
+
if (regen)
{
genBuffers(mPreviewLOD, skin_weight);
@@ -4555,18 +4962,27 @@ BOOL LLModelPreview::render()
for (U32 i = 0; i < mVertexBuffer[mPreviewLOD][model].size(); ++i)
{
LLVertexBuffer* buffer = mVertexBuffer[mPreviewLOD][model][i];
-
- buffer->setBuffer(LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_TEXCOORD0);
+
+ buffer->setBuffer(type_mask & buffer->getTypeMask());
if (textures)
{
- glColor4fv(instance.mMaterial[i].mDiffuseColor.mV);
- if (i < instance.mMaterial.size() && instance.mMaterial[i].mDiffuseMap.notNull())
+ int materialCnt = instance.mModel->mMaterialList.size();
+ if ( i < materialCnt )
{
- if (instance.mMaterial[i].mDiffuseMap->getDiscardLevel() > -1)
+ const std::string& binding = instance.mModel->mMaterialList[i];
+ const LLImportMaterial& material = instance.mMaterial[binding];
+
+ llassert(binding == model->mMaterialList[i]);
+
+ glColor4fv(material.mDiffuseColor.mV);
+ if (material.mDiffuseMap.notNull())
{
- gGL.getTexUnit(0)->bind(instance.mMaterial[i].mDiffuseMap, true);
- mTextureSet.insert(instance.mMaterial[i].mDiffuseMap.get());
+ if (material.mDiffuseMap->getDiscardLevel() > -1)
+ {
+ gGL.getTexUnit(0)->bind(material.mDiffuseMap, true);
+ mTextureSet.insert(material.mDiffuseMap.get());
+ }
}
}
}
@@ -4623,39 +5039,43 @@ BOOL LLModelPreview::render()
LLModel::Decomposition& physics = model->mPhysics;
- if (physics.mMesh.empty())
- { //build vertex buffer for physics mesh
- gMeshRepo.buildPhysicsMesh(physics);
- }
-
- if (!physics.mMesh.empty())
- { //render hull instead of mesh
+ if (!physics.mHull.empty())
+ {
render_mesh = false;
- for (U32 i = 0; i < physics.mMesh.size(); ++i)
- {
- if (explode > 0.f)
+
+ if (physics.mMesh.empty())
+ { //build vertex buffer for physics mesh
+ gMeshRepo.buildPhysicsMesh(physics);
+ }
+
+ if (!physics.mMesh.empty())
+ { //render hull instead of mesh
+ for (U32 i = 0; i < physics.mMesh.size(); ++i)
{
- gGL.pushMatrix();
+ if (explode > 0.f)
+ {
+ gGL.pushMatrix();
- LLVector3 offset = model->mHullCenter[i]-model->mCenterOfHullCenters;
- offset *= explode;
+ LLVector3 offset = model->mHullCenter[i]-model->mCenterOfHullCenters;
+ offset *= explode;
- gGL.translatef(offset.mV[0], offset.mV[1], offset.mV[2]);
- }
+ gGL.translatef(offset.mV[0], offset.mV[1], offset.mV[2]);
+ }
- static std::vector<LLColor4U> hull_colors;
+ static std::vector<LLColor4U> hull_colors;
- if (i+1 >= hull_colors.size())
- {
- hull_colors.push_back(LLColor4U(rand()%128+127, rand()%128+127, rand()%128+127, 255));
- }
+ if (i+1 >= hull_colors.size())
+ {
+ hull_colors.push_back(LLColor4U(rand()%128+127, rand()%128+127, rand()%128+127, 255));
+ }
- glColor4ubv(hull_colors[i].mV);
- LLVertexBuffer::drawArrays(LLRender::TRIANGLES, physics.mMesh[i].mPositions, physics.mMesh[i].mNormals);
+ glColor4ubv(hull_colors[i].mV);
+ LLVertexBuffer::drawArrays(LLRender::TRIANGLES, physics.mMesh[i].mPositions, physics.mMesh[i].mNormals);
- if (explode > 0.f)
- {
- gGL.popMatrix();
+ if (explode > 0.f)
+ {
+ gGL.popMatrix();
+ }
}
}
}
@@ -4671,7 +5091,7 @@ BOOL LLModelPreview::render()
{
LLVertexBuffer* buffer = mVertexBuffer[LLModel::LOD_PHYSICS][model][i];
- buffer->setBuffer(LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_TEXCOORD0);
+ buffer->setBuffer(type_mask & buffer->getTypeMask());
buffer->drawRange(LLRender::TRIANGLES, 0, buffer->getNumVerts()-1, buffer->getNumIndices(), 0);
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
@@ -4681,9 +5101,10 @@ BOOL LLModelPreview::render()
glColor3f(1.f, 1.f, 0.f);
- glLineWidth(3.f);
+ glLineWidth(2.f);
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
buffer->drawRange(LLRender::TRIANGLES, 0, buffer->getNumVerts()-1, buffer->getNumIndices(), 0);
+
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
glLineWidth(1.f);
}
@@ -4692,13 +5113,86 @@ BOOL LLModelPreview::render()
gGL.popMatrix();
}
+ glLineWidth(3.f);
+ glPointSize(8.f);
+ gPipeline.enableLightsFullbright(LLColor4::white);
+ //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);
+ const LLVector4a scale(0.5f);
+
+ for (LLMeshUploadThread::instance_list::iterator iter = mUploadData.begin(); iter != mUploadData.end(); ++iter)
+ {
+ LLModelInstance& instance = *iter;
+
+ LLModel* model = instance.mLOD[LLModel::LOD_PHYSICS];
+
+ if (!model)
+ {
+ continue;
+ }
+
+ gGL.pushMatrix();
+ LLMatrix4 mat = instance.mTransform;
+
+ glMultMatrixf((GLfloat*) mat.mMatrix);
+
+
+ LLPhysicsDecomp* decomp = gMeshRepo.mDecompThread;
+ if (decomp)
+ {
+ LLMutexLock(decomp->mMutex);
+
+ LLModel::Decomposition& physics = model->mPhysics;
+
+ if (physics.mHull.empty())
+ {
+ if (mVertexBuffer[LLModel::LOD_PHYSICS].empty())
+ {
+ genBuffers(LLModel::LOD_PHYSICS, false);
+ }
+
+ for (U32 i = 0; i < mVertexBuffer[LLModel::LOD_PHYSICS][model].size(); ++i)
+ {
+ LLVertexBuffer* buffer = mVertexBuffer[LLModel::LOD_PHYSICS][model][i];
+
+ buffer->setBuffer(type_mask & buffer->getTypeMask());
+
+ LLStrider<LLVector3> pos_strider;
+ buffer->getVertexStrider(pos_strider, 0);
+ LLVector4a* pos = (LLVector4a*) pos_strider.get();
+
+ LLStrider<U16> idx;
+ buffer->getIndexStrider(idx, 0);
+
+ for (U32 i = 0; i < buffer->getNumIndices(); i += 3)
+ {
+ LLVector4a v1; v1.setMul(pos[*idx++], scale);
+ LLVector4a v2; v2.setMul(pos[*idx++], scale);
+ LLVector4a v3; v3.setMul(pos[*idx++], scale);
+
+ if (ll_is_degenerate(v1,v2,v3))
+ {
+ buffer->draw(LLRender::LINE_LOOP, 3, i);
+ buffer->draw(LLRender::POINTS, 3, i);
+ }
+ }
+ }
+ }
+ }
+
+ gGL.popMatrix();
+ }
+ glLineWidth(1.f);
+ glPointSize(1.f);
+ gPipeline.enableLightsPreview();
gGL.setSceneBlendType(LLRender::BT_ALPHA);
}
}
else
{
- LLVOAvatarSelf* avatar = gAgentAvatarp;
- target_pos = avatar->getPositionAgent();
+ target_pos = getPreviewAvatar()->getPositionAgent();
LLViewerCamera::getInstance()->setOriginAndLookAt(
target_pos + ((LLVector3(mCameraDistance, 0.f, 0.f) + offset) * av_rot), // camera
@@ -4707,7 +5201,7 @@ BOOL LLModelPreview::render()
if (joint_positions)
{
- avatar->renderCollisionVolumes();
+ getPreviewAvatar()->renderCollisionVolumes();
}
for (LLModelLoader::scene::iterator iter = mScene[mPreviewLOD].begin(); iter != mScene[mPreviewLOD].end(); ++iter)
@@ -4738,7 +5232,7 @@ BOOL LLModelPreview::render()
LLMatrix4 mat[64];
for (U32 j = 0; j < model->mSkinInfo.mJointNames.size(); ++j)
{
- LLJoint* joint = avatar->getJoint(model->mSkinInfo.mJointNames[j]);
+ LLJoint* joint = getPreviewAvatar()->getJoint(model->mSkinInfo.mJointNames[j]);
if (joint)
{
mat[j] = model->mSkinInfo.mInvBindMatrix[j];
@@ -4788,8 +5282,10 @@ BOOL LLModelPreview::render()
position[j] = v;
}
- buffer->setBuffer(LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_TEXCOORD0);
- glColor4fv(instance.mMaterial[i].mDiffuseColor.mV);
+ 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.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
buffer->draw(LLRender::TRIANGLES, buffer->getNumIndices(), 0);
glColor3f(0.4f, 0.4f, 0.4f);
@@ -4909,7 +5405,12 @@ void LLFloaterModelPreview::onReset(void* user_data)
LLFloaterModelPreview* fmp = (LLFloaterModelPreview*) user_data;
LLModelPreview* mp = fmp->mModelPreview;
std::string filename = mp->mLODFile[3];
- mp->loadModel(filename,3);
+
+ //reset model preview
+ fmp->initModelPreview();
+
+ mp = fmp->mModelPreview;
+ mp->loadModel(filename,3,true);
}
//static
@@ -4927,36 +5428,31 @@ void LLFloaterModelPreview::onUpload(void* user_data)
mp->mModelPreview->saveUploadData(upload_skinweights, upload_joint_positions);
gMeshRepo.uploadModel(mp->mModelPreview->mUploadData, mp->mModelPreview->mPreviewScale,
- mp->childGetValue("upload_textures").asBoolean(), upload_skinweights, upload_joint_positions);
-
- mp->closeFloater(false);
+ mp->childGetValue("upload_textures").asBoolean(), upload_skinweights, upload_joint_positions, mp->mUploadModelUrl,
+ true, LLHandle<LLWholeModelFeeObserver>(), mp->getWholeModelUploadObserverHandle());
}
//static
-void LLFloaterModelPreview::onClearMaterials(void* user_data)
-{
- LLFloaterModelPreview* mp = (LLFloaterModelPreview*) user_data;
- mp->mModelPreview->clearMaterials();
-}
-
-//static
void LLFloaterModelPreview::refresh(LLUICtrl* ctrl, void* user_data)
{
+ sInstance->toggleCalculateButton(true);
sInstance->mModelPreview->mDirty = true;
}
-void LLFloaterModelPreview::updateResourceCost()
-{
- U32 cost = mModelPreview->mResourceCost;
- childSetLabelArg("ok_btn", "[AMOUNT]", llformat("%d",cost));
-}
-
//static
void LLModelPreview::textureLoadedCallback( BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* src_aux, S32 discard_level, BOOL final, void* userdata )
{
LLModelPreview* preview = (LLModelPreview*) userdata;
preview->refresh();
+
+ if(final && preview->mModelLoader)
+ {
+ if(preview->mModelLoader->mNumOfFetchingTextures > 0)
+ {
+ preview->mModelLoader->mNumOfFetchingTextures-- ;
+ }
+ }
}
void LLModelPreview::onLODParamCommit(bool enforce_tri_limit)
@@ -4978,41 +5474,99 @@ LLFloaterModelPreview::DecompRequest::DecompRequest(const std::string& stage, LL
mParams = sInstance->mDecompParams;
//copy out positions and indices
- if (mdl)
- {
- U16 index_offset = 0;
-
- mPositions.clear();
- mIndices.clear();
+ assignData(mdl) ;
+}
- //queue up vertex positions and indices
- for (S32 i = 0; i < mdl->getNumVolumeFaces(); ++i)
- {
- const LLVolumeFace& face = mdl->getVolumeFace(i);
- if (mPositions.size() + face.mNumVertices > 65535)
- {
- continue;
- }
+void LLFloaterModelPreview::setStatusMessage(const std::string& msg)
+{
+ LLMutexLock lock(mStatusLock);
+ mStatusMessage = msg;
+}
- for (U32 j = 0; j < face.mNumVertices; ++j)
- {
- mPositions.push_back(LLVector3(face.mPositions[j].getF32ptr()));
- }
+void LLFloaterModelPreview::toggleCalculateButton()
+{
+ toggleCalculateButton(true);
+}
- for (U32 j = 0; j < face.mNumIndices; ++j)
- {
- mIndices.push_back(face.mIndices[j]+index_offset);
- }
+void LLFloaterModelPreview::toggleCalculateButton(bool visible)
+{
+ mCalculateBtn->setVisible(visible);
- index_offset += face.mNumVertices;
+ bool uploadingSkin = childGetValue("upload_skin").asBoolean();
+ bool uploadingJointPositions = childGetValue("upload_joints").asBoolean();
+ if ( uploadingSkin )
+ {
+ //Disable the calculate button *if* the rig is invalid - which is determined during the critiquing process
+ if ( uploadingJointPositions && !mModelPreview->isRigValidForJointPositionUpload() )
+ {
+ mCalculateBtn->setVisible( false );
}
}
+
+ mUploadBtn->setVisible(!visible);
+ mUploadBtn->setEnabled(mHasUploadPerm && !mUploadModelUrl.empty());
+
+ if (visible)
+ {
+ std::string tbd = getString("tbd");
+ childSetTextArg("weights", "[EQ]", tbd);
+ childSetTextArg("weights", "[ST]", tbd);
+ childSetTextArg("weights", "[SIM]", tbd);
+ childSetTextArg("weights", "[PH]", tbd);
+ childSetTextArg("upload_fee", "[FEE]", tbd);
+ childSetTextArg("price_breakdown", "[STREAMING]", tbd);
+ childSetTextArg("price_breakdown", "[PHYSICS]", tbd);
+ childSetTextArg("price_breakdown", "[INSTANCES]", tbd);
+ childSetTextArg("price_breakdown", "[TEXTURES]", tbd);
+ childSetTextArg("price_breakdown", "[MODEL]", tbd);
+ }
}
-void LLFloaterModelPreview::setStatusMessage(const std::string& msg)
+void LLFloaterModelPreview::onModelPhysicsFeeReceived(const LLSD& result, std::string upload_url)
{
- LLMutexLock lock(mStatusLock);
- mStatusMessage = msg;
+ mModelPhysicsFee = result;
+ mModelPhysicsFee["url"] = upload_url;
+
+ doOnIdleOneTime(boost::bind(&LLFloaterModelPreview::handleModelPhysicsFeeReceived,this));
+}
+
+void LLFloaterModelPreview::handleModelPhysicsFeeReceived()
+{
+ const LLSD& result = mModelPhysicsFee;
+ mUploadModelUrl = result["url"].asString();
+
+ childSetTextArg("weights", "[EQ]", llformat("%0.3f", result["resource_cost"].asReal()));
+ childSetTextArg("weights", "[ST]", llformat("%0.3f", result["model_streaming_cost"].asReal()));
+ childSetTextArg("weights", "[SIM]", llformat("%0.3f", result["simulation_cost"].asReal()));
+ childSetTextArg("weights", "[PH]", llformat("%0.3f", result["physics_cost"].asReal()));
+ childSetTextArg("upload_fee", "[FEE]", llformat("%d", result["upload_price"].asInteger()));
+ childSetTextArg("price_breakdown", "[STREAMING]", llformat("%d", result["upload_price_breakdown"]["mesh_streaming"].asInteger()));
+ childSetTextArg("price_breakdown", "[PHYSICS]", llformat("%d", result["upload_price_breakdown"]["mesh_physics"].asInteger()));
+ childSetTextArg("price_breakdown", "[INSTANCES]", llformat("%d", result["upload_price_breakdown"]["mesh_instance"].asInteger()));
+ childSetTextArg("price_breakdown", "[TEXTURES]", llformat("%d", result["upload_price_breakdown"]["texture"].asInteger()));
+ childSetTextArg("price_breakdown", "[MODEL]", llformat("%d", result["upload_price_breakdown"]["model"].asInteger()));
+ childSetVisible("weights", true);
+ childSetVisible("upload_fee", true);
+ childSetVisible("price_breakdown", true);
+ mUploadBtn->setEnabled(mHasUploadPerm && !mUploadModelUrl.empty());
+}
+
+void LLFloaterModelPreview::setModelPhysicsFeeErrorStatus(U32 status, const std::string& reason)
+{
+ toggleCalculateButton(true);
+ llwarns << "LLFloaterModelPreview::setModelPhysicsFeeErrorStatus(" << status << " : " << reason << ")" << llendl;
+}
+
+/*virtual*/
+void LLFloaterModelPreview::onModelUploadSuccess()
+{
+ closeFloater(false);
+}
+
+/*virtual*/
+void LLFloaterModelPreview::onModelUploadFailure()
+{
+ toggleCalculateButton(true);
}
S32 LLFloaterModelPreview::DecompRequest::statusCallback(const char* status, S32 p1, S32 p2)
@@ -5054,3 +5608,25 @@ void LLFloaterModelPreview::DecompRequest::completed()
llassert(sInstance->mCurRequest.find(this) == sInstance->mCurRequest.end());
}
}
+
+void dump_llsd_to_file(const LLSD& content, std::string filename);
+
+void LLFloaterModelPreview::onPermissionsReceived(const LLSD& result)
+{
+ dump_llsd_to_file(result,"perm_received.xml");
+ std::string upload_status = result["mesh_upload_status"].asString();
+ // BAP HACK: handle "" for case that MeshUploadFlag cap is broken.
+ mHasUploadPerm = (("" == upload_status) || ("valid" == upload_status));
+
+ //mUploadBtn->setEnabled(mHasUploadPerm);
+ mUploadBtn->setEnabled(mHasUploadPerm && !mUploadModelUrl.empty());
+ getChild<LLTextBox>("warning_title")->setVisible(!mHasUploadPerm);
+ getChild<LLTextBox>("warning_message")->setVisible(!mHasUploadPerm);
+}
+
+void LLFloaterModelPreview::setPermissonsErrorStatus(U32 status, const std::string& reason)
+{
+ llwarns << "LLFloaterModelPreview::setPermissonsErrorStatus(" << status << " : " << reason << ")" << llendl;
+
+ LLNotificationsUtil::add("MeshUploadPermError");
+}
diff --git a/indra/newview/llfloatermodelpreview.h b/indra/newview/llfloatermodelpreview.h
index b54a72e555..f383b3fe98 100644
--- a/indra/newview/llfloatermodelpreview.h
+++ b/indra/newview/llfloatermodelpreview.h
@@ -50,6 +50,7 @@ class domProfile_COMMON;
class domInstance_geometry;
class domNode;
class domTranslate;
+class domController;
class LLMenuButton;
class LLToggleableMenu;
@@ -107,8 +108,8 @@ public:
void loadModelCallback();
void loadTextures() ; //called in the main thread.
- void processElement(daeElement* element);
- std::vector<LLImportMaterial> getMaterials(LLModel* model, domInstance_geometry* instance_geo);
+ void processElement(daeElement* element, bool& badElement);
+ std::map<std::string, LLImportMaterial> getMaterials(LLModel* model, domInstance_geometry* instance_geo);
LLImportMaterial profileToMaterial(domProfile_COMMON* material);
std::string getElementLabel(daeElement *element);
LLColor4 getDaeColor(daeElement* element);
@@ -124,19 +125,22 @@ public:
void buildJointToNodeMappingFromScene( daeElement* pRoot );
void processJointToNodeMapping( domNode* pNode );
-
+ void processChildJoints( domNode* pParentNode );
//map of avatar joints as named in COLLADA assets to internal joint names
std::map<std::string, std::string> mJointMap;
JointTransformMap& mJointList;
std::deque<std::string>& mJointsFromNode;
+ S32 mNumOfFetchingTextures ; //updated in the main thread
+ bool areTexturesReady() { return !mNumOfFetchingTextures; } //called in the main thread.
+
private:
static std::list<LLModelLoader*> sActiveLoaderList;
static bool isAlive(LLModelLoader* loader) ;
};
-class LLFloaterModelPreview : public LLFloater
+class LLFloaterModelPreview : public LLFloaterModelUploadBase
{
public:
@@ -158,11 +162,15 @@ public:
virtual BOOL postBuild();
+ void initModelPreview();
+
BOOL handleMouseDown(S32 x, S32 y, MASK mask);
BOOL handleMouseUp(S32 x, S32 y, MASK mask);
BOOL handleHover(S32 x, S32 y, MASK mask);
BOOL handleScrollWheel(S32 x, S32 y, S32 clicks);
+ /*virtual*/ void onOpen(const LLSD& key);
+
static void onMouseCaptureLostModelPreview(LLMouseHandler*);
static void setUploadAmount(S32 amount) { sUploadAmount = amount; }
@@ -174,13 +182,10 @@ public:
static void onUpload(void* data);
- static void onClearMaterials(void* data);
-
static void refresh(LLUICtrl* ctrl, void* data);
- void updateResourceCost();
-
void loadModel(S32 lod);
+ void loadModel(S32 lod, const std::string& file_name, bool force_disable_slm = false);
void onViewOptionChecked(const LLSD& userdata);
bool isViewOptionChecked(const LLSD& userdata);
@@ -189,6 +194,20 @@ public:
void enableViewOption(const std::string& option);
void disableViewOption(const std::string& option);
+ // shows warning message if agent has no permissions to upload model
+ /*virtual*/ void onPermissionsReceived(const LLSD& result);
+
+ // called when error occurs during permissions request
+ /*virtual*/ void setPermissonsErrorStatus(U32 status, const std::string& reason);
+
+ /*virtual*/ void onModelPhysicsFeeReceived(const LLSD& result, std::string upload_url);
+ void handleModelPhysicsFeeReceived();
+ /*virtual*/ void setModelPhysicsFeeErrorStatus(U32 status, const std::string& reason);
+
+ /*virtual*/ void onModelUploadSuccess();
+
+ /*virtual*/ void onModelUploadFailure();
+
protected:
friend class LLModelPreview;
friend class LLMeshFilePicker;
@@ -199,6 +218,8 @@ protected:
static void onUploadJointsCommit(LLUICtrl*,void*);
static void onUploadSkinCommit(LLUICtrl*,void*);
+ static void onPhysicsLoadRadioCommit(LLUICtrl*,void *data);
+
static void onPreviewLODCommit(LLUICtrl*,void*);
static void onGenerateNormalsCommit(LLUICtrl*,void*);
@@ -252,6 +273,17 @@ protected:
LLToggleableMenu* mViewOptionMenu;
LLMutex* mStatusLock;
+ LLSD mModelPhysicsFee;
+
+private:
+ void onClickCalculateBtn();
+ void toggleCalculateButton();
+
+ // Toggles between "Calculate weights & fee" and "Upload" buttons.
+ void toggleCalculateButton(bool visible);
+
+ LLButton* mUploadBtn;
+ LLButton* mCalculateBtn;
};
class LLMeshFilePicker : public LLFilePickerThread
@@ -270,6 +302,7 @@ class LLModelPreview : public LLViewerDynamicTexture, public LLMutex
{
typedef boost::signals2::signal<void (F32 x, F32 y, F32 z, F32 streaming_cost, F32 physics_cost)> details_signal_t;
typedef boost::signals2::signal<void (void)> model_loaded_signal_t;
+ typedef boost::signals2::signal<void (bool)> model_updated_signal_t;
public:
LLModelPreview(S32 width, S32 height, LLFloater* fmp);
@@ -291,11 +324,10 @@ public:
virtual BOOL needsRender() { return mNeedsUpdate; }
void setPreviewLOD(S32 lod);
void clearModel(S32 lod);
- void loadModel(std::string filename, S32 lod);
+ void loadModel(std::string filename, S32 lod, bool force_disable_slm = false);
void loadModelCallback(S32 lod);
void genLODs(S32 which_lod = -1, U32 decimation = 3, bool enforce_tri_limit = false);
void generateNormals();
- void clearMaterials();
U32 calcResourceCost();
void rebuildUploadData();
void saveUploadData(bool save_skinweights, bool save_joint_poisitions);
@@ -309,9 +341,6 @@ public:
void setHasPivot( bool val ) { mHasPivot = val; }
void setModelPivot( const LLVector3& pivot ) { mModelPivot = pivot; }
- //Sets the current avatars joints to new positions
- //Makes in world go to shit, however
- void changeAvatarsJointPositions( LLModel* pModel );
//Determines the viability of an asset to be used as an avatar rig (w or w/o joint upload caps)
void critiqueRigForUploadApplicability( const std::vector<std::string> &jointListFromAsset );
void critiqueJointToNodeMappingFromScene( void );
@@ -325,22 +354,30 @@ public:
//Accessors for the legacy rigs
const bool isLegacyRigValid( void ) const { return mLegacyRigValid; }
void setLegacyRigValid( bool rigValid ) { mLegacyRigValid = rigValid; }
+ //Verify that a controller matches vertex counts
+ bool verifyController( domController* pController );
static void textureLoadedCallback( BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* src_aux, S32 discard_level, BOOL final, void* userdata );
boost::signals2::connection setDetailsCallback( const details_signal_t::slot_type& cb ){ return mDetailsSignal.connect(cb); }
boost::signals2::connection setModelLoadedCallback( const model_loaded_signal_t::slot_type& cb ){ return mModelLoadedSignal.connect(cb); }
+ boost::signals2::connection setModelUpdatedCallback( const model_updated_signal_t::slot_type& cb ){ return mModelUpdatedSignal.connect(cb); }
void setLoadState( U32 state ) { mLoadState = state; }
U32 getLoadState() { return mLoadState; }
- //setRestJointFlag: If an asset comes through that changes the joints, we want the reset to persist
- void setResetJointFlag( bool state ) { if ( !mResetJoints ) mResetJoints = state; }
- const bool getResetJointFlag( void ) const { return mResetJoints; }
void setRigWithSceneParity( bool state ) { mRigParityWithScene = state; }
const bool getRigWithSceneParity( void ) const { return mRigParityWithScene; }
LLVector3 getTranslationForJointOffset( std::string joint );
+private:
+ //Utility function for controller vertex compare
+ bool verifyCount( int expected, int result );
+ //Creates the dummy avatar for the preview window
+ void createPreviewAvatar( void );
+ //Accessor for the dummy avatar
+ LLVOAvatar* getPreviewAvatar( void ) { return mPreviewAvatar; }
+
protected:
friend class LLModelLoader;
friend class LLFloaterModelPreview;
@@ -407,6 +444,7 @@ public:
details_signal_t mDetailsSignal;
model_loaded_signal_t mModelLoadedSignal;
+ model_updated_signal_t mModelUpdatedSignal;
LLVector3 mModelPivot;
bool mHasPivot;
@@ -422,6 +460,7 @@ public:
std::deque<std::string> mMasterLegacyJointList;
std::deque<std::string> mJointsFromNode;
JointTransformMap mJointTransformMap;
+ LLPointer<LLVOAvatar> mPreviewAvatar;
};
#endif // LL_LLFLOATERMODELPREVIEW_H
diff --git a/indra/newview/llfloatermodeluploadbase.cpp b/indra/newview/llfloatermodeluploadbase.cpp
new file mode 100644
index 0000000000..6d3800bfa4
--- /dev/null
+++ b/indra/newview/llfloatermodeluploadbase.cpp
@@ -0,0 +1,58 @@
+/**
+ * @file llfloatermodeluploadbase.cpp
+ * @brief LLFloaterUploadModelBase 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 "llfloatermodeluploadbase.h"
+#include "llagent.h"
+#include "llviewerregion.h"
+#include "llnotificationsutil.h"
+
+LLFloaterModelUploadBase::LLFloaterModelUploadBase(const LLSD& key)
+:LLFloater(key),
+ mHasUploadPerm(false)
+{
+}
+
+void LLFloaterModelUploadBase::requestAgentUploadPermissions()
+{
+ std::string capability = "MeshUploadFlag";
+ std::string url = gAgent.getRegion()->getCapability(capability);
+
+ if (!url.empty())
+ {
+ llinfos<< typeid(*this).name() <<"::requestAgentUploadPermissions() requesting for upload model permissions from: "<< url <<llendl;
+ LLHTTPClient::get(url, new LLUploadModelPremissionsResponder(getPermObserverHandle()));
+ }
+ else
+ {
+ LLSD args;
+ args["CAPABILITY"] = capability;
+ LLNotificationsUtil::add("RegionCapabilityRequestError", args);
+ // BAP HACK avoid being blocked by broken server side stuff
+ mHasUploadPerm = true;
+ }
+}
diff --git a/indra/newview/llfloatermodeluploadbase.h b/indra/newview/llfloatermodeluploadbase.h
new file mode 100644
index 0000000000..a52bc28687
--- /dev/null
+++ b/indra/newview/llfloatermodeluploadbase.h
@@ -0,0 +1,61 @@
+/**
+ * @file llfloatermodeluploadbase.h
+ * @brief LLFloaterUploadModelBase class declaration
+ *
+ * $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_LLFLOATERMODELUPLOADBASE_H
+#define LL_LLFLOATERMODELUPLOADBASE_H
+
+#include "lluploadfloaterobservers.h"
+
+class LLFloaterModelUploadBase : public LLFloater, public LLUploadPermissionsObserver, public LLWholeModelFeeObserver, public LLWholeModelUploadObserver
+{
+public:
+
+ LLFloaterModelUploadBase(const LLSD& key);
+
+ virtual ~LLFloaterModelUploadBase(){};
+
+ virtual void setPermissonsErrorStatus(U32 status, const std::string& reason) = 0;
+
+ virtual void onPermissionsReceived(const LLSD& result) = 0;
+
+ virtual void onModelPhysicsFeeReceived(const LLSD& result, std::string upload_url) = 0;
+
+ virtual void setModelPhysicsFeeErrorStatus(U32 status, const std::string& reason) = 0;
+
+ virtual void onModelUploadSuccess() {};
+
+ virtual void onModelUploadFailure() {};
+
+protected:
+
+ // requests agent's permissions to upload model
+ void requestAgentUploadPermissions();
+
+ std::string mUploadModelUrl;
+ bool mHasUploadPerm;
+};
+
+#endif /* LL_LLFLOATERMODELUPLOADBASE_H */
diff --git a/indra/newview/llfloatermodelwizard.cpp b/indra/newview/llfloatermodelwizard.cpp
index faf81dbc5c..b517b78e5a 100644
--- a/indra/newview/llfloatermodelwizard.cpp
+++ b/indra/newview/llfloatermodelwizard.cpp
@@ -46,12 +46,21 @@ static const std::string stateNames[]={
"choose_file",
"optimize",
"physics",
- "physics2",
"review",
"upload"};
+static void swap_controls(LLUICtrl* first_ctrl, LLUICtrl* second_ctrl, bool first_ctr_visible);
+
LLFloaterModelWizard::LLFloaterModelWizard(const LLSD& key)
- : LLFloater(key)
+ : LLFloaterModelUploadBase(key)
+ ,mRecalculateGeometryBtn(NULL)
+ ,mRecalculatePhysicsBtn(NULL)
+ ,mRecalculatingPhysicsBtn(NULL)
+ ,mCalculateWeightsBtn(NULL)
+ ,mCalculatingWeightsBtn(NULL)
+ ,mChooseFilePreviewPanel(NULL)
+ ,mOptimizePreviewPanel(NULL)
+ ,mPhysicsPreviewPanel(NULL)
{
mLastEnabledState = CHOOSE_FILE;
sInstance = this;
@@ -59,7 +68,6 @@ LLFloaterModelWizard::LLFloaterModelWizard(const LLSD& key)
mCommitCallbackRegistrar.add("Wizard.Choose", boost::bind(&LLFloaterModelWizard::setState, this, CHOOSE_FILE));
mCommitCallbackRegistrar.add("Wizard.Optimize", boost::bind(&LLFloaterModelWizard::setState, this, OPTIMIZE));
mCommitCallbackRegistrar.add("Wizard.Physics", boost::bind(&LLFloaterModelWizard::setState, this, PHYSICS));
- mCommitCallbackRegistrar.add("Wizard.Physics2", boost::bind(&LLFloaterModelWizard::setState, this, PHYSICS2));
mCommitCallbackRegistrar.add("Wizard.Review", boost::bind(&LLFloaterModelWizard::setState, this, REVIEW));
mCommitCallbackRegistrar.add("Wizard.Upload", boost::bind(&LLFloaterModelWizard::setState, this, UPLOAD));
}
@@ -81,16 +89,22 @@ void LLFloaterModelWizard::setState(int state)
}
}
+ LLView* current_preview_panel = NULL;
+
if (state == CHOOSE_FILE)
{
mModelPreview->mViewOption["show_physics"] = false;
+ current_preview_panel = mChooseFilePreviewPanel;
+
getChildView("close")->setVisible(false);
getChildView("back")->setVisible(true);
getChildView("back")->setEnabled(false);
getChildView("next")->setVisible(true);
getChildView("upload")->setVisible(false);
getChildView("cancel")->setVisible(true);
+ mCalculateWeightsBtn->setVisible(false);
+ mCalculatingWeightsBtn->setVisible(false);
}
if (state == OPTIMIZE)
@@ -102,12 +116,16 @@ void LLFloaterModelWizard::setState(int state)
mModelPreview->mViewOption["show_physics"] = false;
+ current_preview_panel = mOptimizePreviewPanel;
+
getChildView("back")->setVisible(true);
getChildView("back")->setEnabled(true);
getChildView("close")->setVisible(false);
getChildView("next")->setVisible(true);
getChildView("upload")->setVisible(false);
getChildView("cancel")->setVisible(true);
+ mCalculateWeightsBtn->setVisible(false);
+ mCalculatingWeightsBtn->setVisible(false);
}
if (state == PHYSICS)
@@ -115,34 +133,24 @@ void LLFloaterModelWizard::setState(int state)
if (mLastEnabledState < state)
{
mModelPreview->setPhysicsFromLOD(1);
- }
- mModelPreview->mViewOption["show_physics"] = true;
-
- getChildView("next")->setVisible(true);
- getChildView("upload")->setVisible(false);
- getChildView("close")->setVisible(false);
- getChildView("back")->setVisible(true);
- getChildView("back")->setEnabled(true);
- getChildView("cancel")->setVisible(true);
- }
-
- if (state == PHYSICS2)
- {
- if (mLastEnabledState < state)
- {
- executePhysicsStage("Decompose");
+ // Trigger the recalculate physics when first entering
+ // the Physics step.
+ onClickRecalculatePhysics();
}
mModelPreview->mViewOption["show_physics"] = true;
- getChildView("next")->setVisible(true);
- getChildView("next")->setEnabled(true);
+ current_preview_panel = mPhysicsPreviewPanel;
+
+ getChildView("next")->setVisible(false);
getChildView("upload")->setVisible(false);
getChildView("close")->setVisible(false);
getChildView("back")->setVisible(true);
getChildView("back")->setEnabled(true);
getChildView("cancel")->setVisible(true);
+ mCalculateWeightsBtn->setVisible(true);
+ mCalculatingWeightsBtn->setVisible(false);
}
if (state == REVIEW)
@@ -156,6 +164,8 @@ void LLFloaterModelWizard::setState(int state)
getChildView("back")->setEnabled(true);
getChildView("upload")->setVisible(true);
getChildView("cancel")->setVisible(true);
+ mCalculateWeightsBtn->setVisible(false);
+ mCalculatingWeightsBtn->setVisible(false);
}
if (state == UPLOAD)
@@ -165,8 +175,24 @@ void LLFloaterModelWizard::setState(int state)
getChildView("back")->setVisible(false);
getChildView("upload")->setVisible(false);
getChildView("cancel")->setVisible(false);
+ mCalculateWeightsBtn->setVisible(false);
+ mCalculatingWeightsBtn->setVisible(false);
}
+ if (current_preview_panel)
+ {
+ LLRect rect;
+ current_preview_panel->localRectToOtherView(current_preview_panel->getLocalRect(), &rect, this);
+
+ // Reduce the preview rect by 1 px to fit the borders
+ rect.stretch(-1);
+
+ if (rect != mPreviewRect)
+ {
+ mPreviewRect = rect;
+ mModelPreview->refresh();
+ }
+ }
updateButtons();
}
@@ -198,18 +224,60 @@ void LLFloaterModelWizard::updateButtons()
button->setEnabled(FALSE);
}
}
+}
- LLButton *physics_button = getChild<LLButton>(stateNames[PHYSICS]+"_btn");
-
- if (mState == PHYSICS2)
+void LLFloaterModelWizard::onClickSwitchToAdvanced()
+{
+ LLFloaterModelPreview* floater_preview = LLFloaterReg::getTypedInstance<LLFloaterModelPreview>("upload_model");
+ if (!floater_preview)
{
- physics_button->setVisible(false);
+ llwarns << "FLoater model preview not found." << llendl;
+ return;
}
- else
+
+ // Open floater model preview
+ floater_preview->openFloater();
+
+ // Close the wizard
+ closeFloater();
+
+ std::string filename = getChild<LLUICtrl>("lod_file")->getValue().asString();
+ if (!filename.empty())
{
- physics_button->setVisible(true);
+ // Re-load the model to the floater model preview if it has been loaded
+ // into the wizard.
+ floater_preview->loadModel(3, filename);
}
+}
+
+void LLFloaterModelWizard::onClickRecalculateGeometry()
+{
+ S32 val = getChild<LLUICtrl>("accuracy_slider")->getValue().asInteger();
+
+ mModelPreview->genLODs(-1, NUM_LOD - val);
+
+ mModelPreview->refresh();
+}
+
+void LLFloaterModelWizard::onClickRecalculatePhysics()
+{
+ // Hide the "Recalculate physics" button and show the "Recalculating..."
+ // button instead.
+ swap_controls(mRecalculatePhysicsBtn, mRecalculatingPhysicsBtn, false);
+ executePhysicsStage("Decompose");
+}
+
+void LLFloaterModelWizard::onClickCalculateUploadFee()
+{
+ swap_controls(mCalculateWeightsBtn, mCalculatingWeightsBtn, false);
+
+ mModelPreview->rebuildUploadData();
+
+ mUploadModelUrl.clear();
+
+ gMeshRepo.uploadModel(mModelPreview->mUploadData, mModelPreview->mPreviewScale,
+ true, false, false, mUploadModelUrl, false, getWholeModelFeeObserverHandle());
}
void LLFloaterModelWizard::loadModel()
@@ -344,6 +412,7 @@ BOOL LLFloaterModelWizard::handleScrollWheel(S32 x, S32 y, S32 clicks)
return TRUE;
}
+
void LLFloaterModelWizard::initDecompControls()
{
LLSD key;
@@ -401,12 +470,83 @@ void LLFloaterModelWizard::initDecompControls()
mDecompParams["Simplify Method"] = 0; // set it to retain %
}
+/*virtual*/
+void LLFloaterModelWizard::onPermissionsReceived(const LLSD& result)
+{
+ std::string upload_status = result["mesh_upload_status"].asString();
+ // BAP HACK: handle "" for case that MeshUploadFlag cap is broken.
+ mHasUploadPerm = (("" == upload_status) || ("valid" == upload_status));
+
+ getChildView("warning_label")->setVisible(!mHasUploadPerm);
+ getChildView("warning_text")->setVisible(!mHasUploadPerm);
+}
+
+/*virtual*/
+void LLFloaterModelWizard::setPermissonsErrorStatus(U32 status, const std::string& reason)
+{
+ llwarns << "LLFloaterModelWizard::setPermissonsErrorStatus(" << status << " : " << reason << ")" << llendl;
+}
+
+/*virtual*/
+void LLFloaterModelWizard::onModelPhysicsFeeReceived(const LLSD& result, std::string upload_url)
+{
+ swap_controls(mCalculateWeightsBtn, mCalculatingWeightsBtn, true);
+
+ // Enable the "Upload" buton if we have calculated the upload fee
+ // and have the permission to upload.
+ getChildView("upload")->setEnabled(mHasUploadPerm);
+
+ mUploadModelUrl = upload_url;
+
+ S32 fee = result["upload_price"].asInteger();
+ childSetTextArg("review_fee", "[FEE]", llformat("%d", fee));
+ childSetTextArg("charged_fee", "[FEE]", llformat("%d", fee));
+
+ setState(REVIEW);
+}
+
+/*virtual*/
+void LLFloaterModelWizard::setModelPhysicsFeeErrorStatus(U32 status, const std::string& reason)
+{
+ swap_controls(mCalculateWeightsBtn, mCalculatingWeightsBtn, true);
+
+ // Disable the "Review" step if it has been previously enabled.
+ modelChangedCallback();
+
+ llwarns << "LLFloaterModelWizard::setModelPhysicsFeeErrorStatus(" << status << " : " << reason << ")" << llendl;
+
+ setState(PHYSICS);
+}
+
+/*virtual*/
+void LLFloaterModelWizard::onModelUploadSuccess()
+{
+ // success!
+ setState(UPLOAD);
+}
+
+/*virtual*/
+void LLFloaterModelWizard::onModelUploadFailure()
+{
+ // Failure. Make the user recalculate fees
+ setState(PHYSICS);
+ // Disable the "Review" step if it has been previously enabled.
+ if (mLastEnabledState > PHYSICS)
+ {
+ mLastEnabledState = PHYSICS;
+ }
+
+ updateButtons();
+}
+
//static
void LLFloaterModelWizard::executePhysicsStage(std::string stage_name)
{
if (sInstance)
{
- F64 physics_accuracy = sInstance->getChild<LLSliderCtrl>("physics_slider")->getValue().asReal();
+ // Invert the slider value so that "performance" end is giving the least detailed physics,
+ // and the "accuracy" end is giving the most detailed physics
+ F64 physics_accuracy = 1 - sInstance->getChild<LLSliderCtrl>("physics_slider")->getValue().asReal();
sInstance->mDecompParams["Retain%"] = physics_accuracy;
@@ -422,8 +562,11 @@ void LLFloaterModelWizard::executePhysicsStage(std::string stage_name)
{
LLModel* mdl = sInstance->mModelPreview->mModel[LLModel::LOD_PHYSICS][i];
DecompRequest* request = new DecompRequest(stage_name, mdl);
- sInstance->mCurRequest.insert(request);
- gMeshRepo.mDecompThread->submitRequest(request);
+ if(request->isValid())
+ {
+ sInstance->mCurRequest.insert(request);
+ gMeshRepo.mDecompThread->submitRequest(request);
+ }
}
}
}
@@ -438,35 +581,7 @@ LLFloaterModelWizard::DecompRequest::DecompRequest(const std::string& stage, LLM
mParams = sInstance->mDecompParams;
//copy out positions and indices
- if (mdl)
- {
- U16 index_offset = 0;
-
- mPositions.clear();
- mIndices.clear();
-
- //queue up vertex positions and indices
- for (S32 i = 0; i < mdl->getNumVolumeFaces(); ++i)
- {
- const LLVolumeFace& face = mdl->getVolumeFace(i);
- if (mPositions.size() + face.mNumVertices > 65535)
- {
- continue;
- }
-
- for (U32 j = 0; j < face.mNumVertices; ++j)
- {
- mPositions.push_back(LLVector3(face.mPositions[j].getF32ptr()));
- }
-
- for (U32 j = 0; j < face.mNumIndices; ++j)
- {
- mIndices.push_back(face.mIndices[j]+index_offset);
- }
-
- index_offset += face.mNumVertices;
- }
- }
+ assignData(mdl) ;
}
@@ -496,13 +611,16 @@ void LLFloaterModelWizard::DecompRequest::completed()
{
executePhysicsStage("Simplify");
}
+ else
+ {
+ // Decomp request is complete so we can enable the "Recalculate physics" button again.
+ swap_controls(sInstance->mRecalculatePhysicsBtn, sInstance->mRecalculatingPhysicsBtn, true);
+ }
}
BOOL LLFloaterModelWizard::postBuild()
{
- LLView* preview_panel = getChildView("preview_panel");
-
childSetValue("import_scale", (F32) 0.67335826);
getChild<LLUICtrl>("browse")->setCommitCallback(boost::bind(&LLFloaterModelWizard::loadModel, this));
@@ -513,23 +631,36 @@ BOOL LLFloaterModelWizard::postBuild()
getChild<LLUICtrl>("next")->setCommitCallback(boost::bind(&LLFloaterModelWizard::onClickNext, this));
getChild<LLUICtrl>("preview_lod_combo")->setCommitCallback(boost::bind(&LLFloaterModelWizard::onPreviewLODCommit, this, _1));
getChild<LLUICtrl>("preview_lod_combo2")->setCommitCallback(boost::bind(&LLFloaterModelWizard::onPreviewLODCommit, this, _1));
- getChild<LLUICtrl>("preview_lod_combo3")->setCommitCallback(boost::bind(&LLFloaterModelWizard::onPreviewLODCommit, this, _1));
- getChild<LLUICtrl>("accuracy_slider")->setCommitCallback(boost::bind(&LLFloaterModelWizard::onAccuracyPerformance, this, _2));
getChild<LLUICtrl>("upload")->setCommitCallback(boost::bind(&LLFloaterModelWizard::onUpload, this));
- getChild<LLUICtrl>("physics_slider")->setCommitCallback(boost::bind(&LLFloaterModelWizard::onPhysicsChanged, this));
+ getChild<LLUICtrl>("switch_to_advanced")->setCommitCallback(boost::bind(&LLFloaterModelWizard::onClickSwitchToAdvanced, this));
+
+ mRecalculateGeometryBtn = getChild<LLButton>("recalculate_geometry_btn");
+ mRecalculateGeometryBtn->setCommitCallback(boost::bind(&LLFloaterModelWizard::onClickRecalculateGeometry, this));
+
+ mRecalculatePhysicsBtn = getChild<LLButton>("recalculate_physics_btn");
+ mRecalculatePhysicsBtn->setCommitCallback(boost::bind(&LLFloaterModelWizard::onClickRecalculatePhysics, this));
+
+ mRecalculatingPhysicsBtn = getChild<LLButton>("recalculating_physics_btn");
+
+ mCalculateWeightsBtn = getChild<LLButton>("calculate");
+ mCalculateWeightsBtn->setCommitCallback(boost::bind(&LLFloaterModelWizard::onClickCalculateUploadFee, this));
+
+ mCalculatingWeightsBtn = getChild<LLButton>("calculating");
+
+ mChooseFilePreviewPanel = getChild<LLView>("choose_file_preview_panel");
+ mOptimizePreviewPanel = getChild<LLView>("optimize_preview_panel");
+ mPhysicsPreviewPanel = getChild<LLView>("physics_preview_panel");
LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar;
enable_registrar.add("Next.OnEnable", boost::bind(&LLFloaterModelWizard::onEnableNext, this));
enable_registrar.add("Back.OnEnable", boost::bind(&LLFloaterModelWizard::onEnableBack, this));
-
-
- mPreviewRect = preview_panel->getRect();
mModelPreview = new LLModelPreview(512, 512, this);
mModelPreview->setPreviewTarget(16.f);
mModelPreview->setDetailsCallback(boost::bind(&LLFloaterModelWizard::setDetails, this, _1, _2, _3, _4, _5));
mModelPreview->setModelLoadedCallback(boost::bind(&LLFloaterModelWizard::modelLoadedCallback, this));
+ mModelPreview->setModelUpdatedCallback(boost::bind(&LLFloaterModelWizard::modelChangedCallback, this));
mModelPreview->mViewOption["show_textures"] = true;
center();
@@ -542,6 +673,8 @@ BOOL LLFloaterModelWizard::postBuild()
initDecompControls();
+ requestAgentUploadPermissions();
+
return TRUE;
}
@@ -557,22 +690,29 @@ void LLFloaterModelWizard::setDetails(F32 x, F32 y, F32 z, F32 streaming_cost, F
panel->childSetText("dimension_x", llformat("%.1f", x));
panel->childSetText("dimension_y", llformat("%.1f", y));
panel->childSetText("dimension_z", llformat("%.1f", z));
- panel->childSetTextArg("streaming cost", "[COST]", llformat("%.3f", streaming_cost));
- panel->childSetTextArg("physics cost", "[COST]", llformat("%.3f", physics_cost));
}
}
+
+ childSetTextArg("review_prim_equiv", "[EQUIV]", llformat("%d", mModelPreview->mResourceCost));
}
void LLFloaterModelWizard::modelLoadedCallback()
{
mLastEnabledState = CHOOSE_FILE;
- getChild<LLCheckBoxCtrl>("confirm_checkbox")->set(FALSE);
updateButtons();
}
-void LLFloaterModelWizard::onPhysicsChanged()
+void LLFloaterModelWizard::modelChangedCallback()
{
- mLastEnabledState = PHYSICS;
+ // Don't allow to proceed to the "Review" step if the model has changed
+ // but the new upload fee hasn't been calculated yet.
+ if (mLastEnabledState > PHYSICS)
+ {
+ mLastEnabledState = PHYSICS;
+ }
+
+ getChildView("upload")->setEnabled(false);
+
updateButtons();
}
@@ -581,22 +721,10 @@ void LLFloaterModelWizard::onUpload()
mModelPreview->rebuildUploadData();
gMeshRepo.uploadModel(mModelPreview->mUploadData, mModelPreview->mPreviewScale,
- true, false, false);
-
- setState(UPLOAD);
-
-}
-
-void LLFloaterModelWizard::onAccuracyPerformance(const LLSD& data)
-{
- int val = (int) data.asInteger();
-
- mModelPreview->genLODs(-1, NUM_LOD-val);
-
- mModelPreview->refresh();
+ true, false, false, mUploadModelUrl, true,
+ LLHandle<LLWholeModelFeeObserver>(), getWholeModelUploadObserverHandle());
}
-
void LLFloaterModelWizard::onPreviewLODCommit(LLUICtrl* ctrl)
{
if (!mModelPreview)
@@ -626,11 +754,6 @@ void LLFloaterModelWizard::refresh()
getChildView("next")->setEnabled(model_loaded);
}
- if (mState == REVIEW)
- {
- getChildView("upload")->setEnabled(getChild<LLCheckBoxCtrl>("confirm_checkbox")->getValue().asBoolean());
- }
-
}
void LLFloaterModelWizard::draw()
@@ -638,42 +761,35 @@ void LLFloaterModelWizard::draw()
refresh();
LLFloater::draw();
- LLRect r = getRect();
-
- mModelPreview->update();
- if (mModelPreview)
+ if (mModelPreview && mState < REVIEW)
{
+ mModelPreview->update();
+
gGL.color3f(1.f, 1.f, 1.f);
gGL.getTexUnit(0)->bind(mModelPreview);
- LLView *view = getChildView(stateNames[mState]+"_panel");
- LLView* preview_panel = view->getChildView("preview_panel");
-
- LLRect rect = preview_panel->getRect();
- if (rect != mPreviewRect)
- {
- mModelPreview->refresh();
- mPreviewRect = preview_panel->getRect();
- }
-
- LLRect item_rect;
- preview_panel->localRectToOtherView(preview_panel->getLocalRect(), &item_rect, this);
-
gGL.begin( LLRender::QUADS );
{
gGL.texCoord2f(0.f, 1.f);
- gGL.vertex2i(item_rect.mLeft, item_rect.mTop-1);
+ gGL.vertex2i(mPreviewRect.mLeft, mPreviewRect.mTop);
gGL.texCoord2f(0.f, 0.f);
- gGL.vertex2i(item_rect.mLeft, item_rect.mBottom);
+ gGL.vertex2i(mPreviewRect.mLeft, mPreviewRect.mBottom);
gGL.texCoord2f(1.f, 0.f);
- gGL.vertex2i(item_rect.mRight-1, item_rect.mBottom);
+ gGL.vertex2i(mPreviewRect.mRight, mPreviewRect.mBottom);
gGL.texCoord2f(1.f, 1.f);
- gGL.vertex2i(item_rect.mRight-1, item_rect.mTop-1);
+ gGL.vertex2i(mPreviewRect.mRight, mPreviewRect.mTop);
}
gGL.end();
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
}
}
+
+// static
+void swap_controls(LLUICtrl* first_ctrl, LLUICtrl* second_ctrl, bool first_ctr_visible)
+{
+ first_ctrl->setVisible(first_ctr_visible);
+ second_ctrl->setVisible(!first_ctr_visible);
+}
diff --git a/indra/newview/llfloatermodelwizard.h b/indra/newview/llfloatermodelwizard.h
index b166d26295..db9b605777 100644
--- a/indra/newview/llfloatermodelwizard.h
+++ b/indra/newview/llfloatermodelwizard.h
@@ -30,12 +30,13 @@
#include "llmeshrepository.h"
#include "llmodel.h"
#include "llthread.h"
+#include "llfloatermodeluploadbase.h"
class LLModelPreview;
-class LLFloaterModelWizard : public LLFloater
+class LLFloaterModelWizard : public LLFloaterModelUploadBase
{
public:
@@ -62,13 +63,29 @@ public:
BOOL handleMouseDown(S32 x, S32 y, MASK mask);
BOOL handleMouseUp(S32 x, S32 y, MASK mask);
BOOL handleHover(S32 x, S32 y, MASK mask);
- BOOL handleScrollWheel(S32 x, S32 y, S32 clicks);
+ BOOL handleScrollWheel(S32 x, S32 y, S32 clicks);
void setDetails(F32 x, F32 y, F32 z, F32 streaming_cost, F32 physics_cost);
void modelLoadedCallback();
- void onPhysicsChanged();
+ void modelChangedCallback();
void initDecompControls();
+ // shows warning message if agent has no permissions to upload model
+ /*virtual*/ void onPermissionsReceived(const LLSD& result);
+
+ // called when error occurs during permissions request
+ /*virtual*/ void setPermissonsErrorStatus(U32 status, const std::string& reason);
+
+ /*virtual*/ void onModelPhysicsFeeReceived(const LLSD& result, std::string upload_url);
+
+ /*virtual*/ void setModelPhysicsFeeErrorStatus(U32 status, const std::string& reason);
+
+ /*virtual*/ void onModelUploadSuccess();
+
+ /*virtual*/ void onModelUploadFailure();
+
+ const LLRect& getPreviewRect() const { return mPreviewRect; }
+
LLPhysicsDecomp::decomp_params mDecompParams;
std::set<LLPointer<DecompRequest> > mCurRequest;
std::string mStatusMessage;
@@ -80,13 +97,16 @@ private:
CHOOSE_FILE = 0,
OPTIMIZE,
PHYSICS,
- PHYSICS2,
REVIEW,
UPLOAD
};
void setState(int state);
void updateButtons();
+ void onClickSwitchToAdvanced();
+ void onClickRecalculateGeometry();
+ void onClickRecalculatePhysics();
+ void onClickCalculateUploadFee();
void onClickCancel();
void onClickBack();
void onClickNext();
@@ -94,7 +114,6 @@ private:
bool onEnableBack();
void loadModel();
void onPreviewLODCommit(LLUICtrl*);
- void onAccuracyPerformance(const LLSD& data);
void onUpload();
LLModelPreview* mModelPreview;
@@ -106,7 +125,15 @@ private:
U32 mLastEnabledState;
+ LLButton* mRecalculateGeometryBtn;
+ LLButton* mRecalculatePhysicsBtn;
+ LLButton* mRecalculatingPhysicsBtn;
+ LLButton* mCalculateWeightsBtn;
+ LLButton* mCalculatingWeightsBtn;
+ LLView* mChooseFilePreviewPanel;
+ LLView* mOptimizePreviewPanel;
+ LLView* mPhysicsPreviewPanel;
};
diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp
index 4b15695cbf..5fd262a720 100644..100755
--- a/indra/newview/llfloaterpreference.cpp
+++ b/indra/newview/llfloaterpreference.cpp
@@ -187,12 +187,26 @@ void LLVoiceSetKeyDialog::onCancel(void* user_data)
void handleNameTagOptionChanged(const LLSD& newvalue);
void handleDisplayNamesOptionChanged(const LLSD& newvalue);
bool callback_clear_browser_cache(const LLSD& notification, const LLSD& response);
+bool callback_clear_cache(const LLSD& notification, const LLSD& response);
//bool callback_skip_dialogs(const LLSD& notification, const LLSD& response, LLFloaterPreference* floater);
//bool callback_reset_dialogs(const LLSD& notification, const LLSD& response, LLFloaterPreference* floater);
void fractionFromDecimal(F32 decimal_val, S32& numerator, S32& denominator);
+bool callback_clear_cache(const LLSD& notification, const LLSD& response)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ if ( option == 0 ) // YES
+ {
+ // flag client texture cache for clearing next time the client runs
+ gSavedSettings.setBOOL("PurgeCacheOnNextStartup", TRUE);
+ LLNotificationsUtil::add("CacheWillClear");
+ }
+
+ return false;
+}
+
bool callback_clear_browser_cache(const LLSD& notification, const LLSD& response)
{
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
@@ -305,7 +319,7 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key)
mCommitCallbackRegistrar.add("Pref.Cancel", boost::bind(&LLFloaterPreference::onBtnCancel, this));
mCommitCallbackRegistrar.add("Pref.OK", boost::bind(&LLFloaterPreference::onBtnOK, this));
-// mCommitCallbackRegistrar.add("Pref.ClearCache", boost::bind(&LLFloaterPreference::onClickClearCache, this));
+ mCommitCallbackRegistrar.add("Pref.ClearCache", boost::bind(&LLFloaterPreference::onClickClearCache, this));
mCommitCallbackRegistrar.add("Pref.WebClearCache", boost::bind(&LLFloaterPreference::onClickBrowserClearCache, this));
mCommitCallbackRegistrar.add("Pref.SetCache", boost::bind(&LLFloaterPreference::onClickSetCache, this));
mCommitCallbackRegistrar.add("Pref.ResetCache", boost::bind(&LLFloaterPreference::onClickResetCache, this));
@@ -313,6 +327,7 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key)
mCommitCallbackRegistrar.add("Pref.SelectSkin", boost::bind(&LLFloaterPreference::onSelectSkin, this));
mCommitCallbackRegistrar.add("Pref.VoiceSetKey", boost::bind(&LLFloaterPreference::onClickSetKey, this));
mCommitCallbackRegistrar.add("Pref.VoiceSetMiddleMouse", boost::bind(&LLFloaterPreference::onClickSetMiddleMouse, this));
+ mCommitCallbackRegistrar.add("Pref.SetSounds", boost::bind(&LLFloaterPreference::onClickSetSounds, this));
// mCommitCallbackRegistrar.add("Pref.ClickSkipDialogs", boost::bind(&LLFloaterPreference::onClickSkipDialogs, this));
// mCommitCallbackRegistrar.add("Pref.ClickResetDialogs", boost::bind(&LLFloaterPreference::onClickResetDialogs, this));
mCommitCallbackRegistrar.add("Pref.ClickEnablePopup", boost::bind(&LLFloaterPreference::onClickEnablePopup, this));
@@ -736,10 +751,7 @@ void LLFloaterPreference::onBtnOK()
closeFloater(false);
LLUIColorTable::instance().saveUserSettings();
- gSavedSettings.saveToFile( gSavedSettings.getString("ClientSettingsFile"), TRUE );
- std::string crash_settings_filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, CRASH_SETTINGS_FILE);
- // save all settings, even if equals defaults
- gCrashSettings.saveToFile(crash_settings_filename, FALSE);
+ gSavedSettings.saveToFile(gSavedSettings.getString("ClientSettingsFile"), TRUE);
}
else
{
@@ -809,6 +821,11 @@ void LLFloaterPreference::refreshEnabledGraphics()
}
}
+void LLFloaterPreference::onClickClearCache()
+{
+ LLNotificationsUtil::add("ConfirmClearCache", LLSD(), LLSD(), callback_clear_cache);
+}
+
void LLFloaterPreference::onClickBrowserClearCache()
{
LLNotificationsUtil::add("ConfirmClearBrowserCache", LLSD(), LLSD(), callback_clear_browser_cache);
@@ -868,14 +885,15 @@ void LLFloaterPreference::onClickSetCache()
void LLFloaterPreference::onClickResetCache()
{
- if (!gSavedSettings.getString("CacheLocation").empty())
+ if (gDirUtilp->getCacheDir(false) == gDirUtilp->getCacheDir(true))
{
- gSavedSettings.setString("NewCacheLocation", "");
- gSavedSettings.setString("NewCacheLocationTopFolder", "");
+ // The cache location was already the default.
+ return;
}
-
+ gSavedSettings.setString("NewCacheLocation", "");
+ gSavedSettings.setString("NewCacheLocationTopFolder", "");
LLNotificationsUtil::add("CacheWillBeMoved");
- std::string cache_location = gDirUtilp->getCacheDir(true);
+ std::string cache_location = gDirUtilp->getCacheDir(false);
gSavedSettings.setString("CacheLocation", cache_location);
std::string top_folder(gDirUtilp->getBaseFileName(cache_location));
gSavedSettings.setString("CacheLocationTopFolder", top_folder);
@@ -1266,6 +1284,14 @@ void LLFloaterPreference::onClickSetMiddleMouse()
p2t_line_editor->setValue(advanced_preferences->getString("middle_mouse"));
}
}
+
+void LLFloaterPreference::onClickSetSounds()
+{
+ // Disable Enable gesture sounds checkbox if the master sound is disabled
+ // or if sound effects are disabled.
+ getChild<LLCheckBoxCtrl>("gesture_audio_play_btn")->setEnabled(!gSavedSettings.getBOOL("MuteSounds"));
+}
+
/*
void LLFloaterPreference::onClickSkipDialogs()
{
diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h
index 5fe509fb37..61f2c78640 100644
--- a/indra/newview/llfloaterpreference.h
+++ b/indra/newview/llfloaterpreference.h
@@ -88,7 +88,8 @@ protected:
void onBtnCancel();
void onBtnApply();
- void onClickBrowserClearCache();
+ void onClickClearCache(); // Clear viewer texture cache, vfs, and VO cache on next startup
+ void onClickBrowserClearCache(); // Clear web history and caches as well as viewer caches above
void onLanguageChange();
void onNameTagOpacityChange(const LLSD& newvalue);
@@ -99,7 +100,7 @@ protected:
void onChangeCustom();
void updateMeterText(LLUICtrl* ctrl);
void onOpenHardwareSettings();
- /// callback for defaults
+ // callback for defaults
void setHardwareDefaults();
// callback for when client turns on shaders
void onVertexShaderEnable();
@@ -128,6 +129,7 @@ public:
void onClickSetKey();
void setKey(KEY key);
void onClickSetMiddleMouse();
+ void onClickSetSounds();
// void onClickSkipDialogs();
// void onClickResetDialogs();
void onClickEnablePopup();
diff --git a/indra/newview/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp
index 34fda49375..538c5e3b88 100644
--- a/indra/newview/llfloaterregioninfo.cpp
+++ b/indra/newview/llfloaterregioninfo.cpp
@@ -40,6 +40,10 @@
#include "llxfermanager.h"
#include "indra_constants.h"
#include "message.h"
+#include "llloadingindicator.h"
+#include "llradiogroup.h"
+#include "llsd.h"
+#include "llsdserialize.h"
#include "llagent.h"
#include "llappviewer.h"
@@ -48,6 +52,9 @@
#include "llbutton.h"
#include "llcheckboxctrl.h"
#include "llcombobox.h"
+#include "lldaycyclemanager.h"
+#include "llenvmanager.h"
+#include "llestateinfomodel.h"
#include "llfilepicker.h"
#include "llfloatergodtools.h" // for send_sim_wide_deletes()
#include "llfloatertopobjects.h" // added to fix SL-32336
@@ -55,12 +62,12 @@
#include "llfloaterreg.h"
#include "llfloaterregiondebugconsole.h"
#include "llfloatertelehub.h"
-#include "llfloaterwindlight.h"
#include "llinventorymodel.h"
#include "lllineeditor.h"
#include "llnamelistctrl.h"
#include "llnotifications.h"
#include "llnotificationsutil.h"
+#include "llregioninfomodel.h"
#include "llscrolllistitem.h"
#include "llsliderctrl.h"
#include "llslurl.h"
@@ -80,12 +87,16 @@
#include "llviewertexteditor.h"
#include "llviewerwindow.h"
#include "llvlcomposition.h"
+#include "llwaterparammanager.h"
#include "lltrans.h"
#include "llagentui.h"
+#include "llmeshrepository.h"
const S32 TERRAIN_TEXTURE_COUNT = 4;
const S32 CORNER_COUNT = 4;
+#define TMP_DISABLE_WLES // STORM-1180
+
///----------------------------------------------------------------------------
/// Local class declaration
///----------------------------------------------------------------------------
@@ -189,24 +200,24 @@ LLFloaterRegionInfo::LLFloaterRegionInfo(const LLSD& seed)
BOOL LLFloaterRegionInfo::postBuild()
{
mTab = getChild<LLTabContainer>("region_panels");
+ mTab->setCommitCallback(boost::bind(&LLFloaterRegionInfo::onTabSelected, this, _2));
// contruct the panels
LLPanelRegionInfo* panel;
- panel = new LLPanelRegionGeneralInfo;
+ panel = new LLPanelEstateInfo;
mInfoPanels.push_back(panel);
- panel->getCommitCallbackRegistrar().add("RegionInfo.ManageTelehub", boost::bind(&LLPanelRegionInfo::onClickManageTelehub, panel));
-
- panel->buildFromFile("panel_region_general.xml");
+ panel->buildFromFile("panel_region_estate.xml");
mTab->addTabPanel(LLTabContainer::TabPanelParams().panel(panel).select_tab(true));
- panel = new LLPanelRegionDebugInfo;
+ panel = new LLPanelEstateCovenant;
mInfoPanels.push_back(panel);
- panel->buildFromFile("panel_region_debug.xml");
+ panel->buildFromFile("panel_region_covenant.xml");
mTab->addTabPanel(panel);
- panel = new LLPanelRegionTextureInfo;
+ panel = new LLPanelRegionGeneralInfo;
mInfoPanels.push_back(panel);
- panel->buildFromFile("panel_region_texture.xml");
+ panel->getCommitCallbackRegistrar().add("RegionInfo.ManageTelehub", boost::bind(&LLPanelRegionInfo::onClickManageTelehub, panel));
+ panel->buildFromFile("panel_region_general.xml");
mTab->addTabPanel(panel);
panel = new LLPanelRegionTerrainInfo;
@@ -214,20 +225,23 @@ BOOL LLFloaterRegionInfo::postBuild()
panel->buildFromFile("panel_region_terrain.xml");
mTab->addTabPanel(panel);
- panel = new LLPanelEstateInfo;
+ panel = new LLPanelEnvironmentInfo;
mInfoPanels.push_back(panel);
- panel->buildFromFile("panel_region_estate.xml");
+ panel->buildFromFile("panel_region_environment.xml");
mTab->addTabPanel(panel);
- panel = new LLPanelEstateCovenant;
+ panel = new LLPanelRegionDebugInfo;
mInfoPanels.push_back(panel);
- panel->buildFromFile("panel_region_covenant.xml");
+ panel->buildFromFile("panel_region_debug.xml");
mTab->addTabPanel(panel);
gMessageSystem->setHandlerFunc(
"EstateOwnerMessage",
&processEstateOwnerRequest);
+ // Request region info when agent region changes.
+ LLEnvManagerNew::instance().setRegionChangeCallback(boost::bind(&LLFloaterRegionInfo::requestRegionInfo, this));
+
return TRUE;
}
@@ -306,17 +320,25 @@ void LLFloaterRegionInfo::processRegionInfo(LLMessageSystem* msg)
{
LLPanel* panel;
LLFloaterRegionInfo* floater = LLFloaterReg::getTypedInstance<LLFloaterRegionInfo>("region_info");
- llinfos << "LLFloaterRegionInfo::processRegionInfo" << llendl;
if(!floater)
{
return;
}
+
+ // We need to re-request environment setting here,
+ // otherwise after we apply (send) updated region settings we won't get them back,
+ // so our environment won't be updated.
+ // This is also the way to know about externally changed region environment.
+ LLEnvManagerNew::instance().requestRegionSettings();
LLTabContainer* tab = floater->getChild<LLTabContainer>("region_panels");
LLViewerRegion* region = gAgent.getRegion();
BOOL allow_modify = gAgent.isGodlike() || (region && region->canManageEstate());
+ // *TODO: Replace parcing msg with accessing the region info model.
+ LLRegionInfoModel& region_info = LLRegionInfoModel::instance();
+
// extract message
std::string sim_name;
std::string sim_type = LLTrans::getString("land_type_unknown");
@@ -388,15 +410,10 @@ void LLFloaterRegionInfo::processRegionInfo(LLMessageSystem* msg)
panel = tab->getChild<LLPanel>("Terrain");
panel->getChild<LLUICtrl>("region_text")->setValue(LLSD(sim_name));
- panel->getChild<LLUICtrl>("water_height_spin")->setValue(LLSD(water_height));
- panel->getChild<LLUICtrl>("terrain_raise_spin")->setValue(LLSD(terrain_raise_limit));
- panel->getChild<LLUICtrl>("terrain_lower_spin")->setValue(LLSD(terrain_lower_limit));
- panel->getChild<LLUICtrl>("use_estate_sun_check")->setValue(LLSD(use_estate_sun));
-
- panel->getChild<LLUICtrl>("fixed_sun_check")->setValue(LLSD((BOOL)(region_flags & REGION_FLAGS_SUN_FIXED)));
- panel->getChildView("fixed_sun_check")->setEnabled(allow_modify && !use_estate_sun);
- panel->getChild<LLUICtrl>("sun_hour_slider")->setValue(LLSD(sun_hour));
- panel->getChildView("sun_hour_slider")->setEnabled(allow_modify && !use_estate_sun);
+ panel->getChild<LLUICtrl>("water_height_spin")->setValue(region_info.mWaterHeight);
+ panel->getChild<LLUICtrl>("terrain_raise_spin")->setValue(region_info.mTerrainRaiseLimit);
+ panel->getChild<LLUICtrl>("terrain_lower_spin")->setValue(region_info.mTerrainLowerLimit);
+
panel->setCtrlsEnabled(allow_modify);
floater->refreshFromRegion( gAgent.getRegion() );
@@ -422,6 +439,29 @@ LLPanelEstateCovenant* LLFloaterRegionInfo::getPanelCovenant()
return panel;
}
+// static
+LLPanelRegionTerrainInfo* LLFloaterRegionInfo::getPanelRegionTerrain()
+{
+ LLFloaterRegionInfo* floater = LLFloaterReg::getTypedInstance<LLFloaterRegionInfo>("region_info");
+ if (!floater)
+ {
+ llassert(floater);
+ return NULL;
+ }
+
+ LLTabContainer* tab_container = floater->getChild<LLTabContainer>("region_panels");
+ LLPanelRegionTerrainInfo* panel =
+ dynamic_cast<LLPanelRegionTerrainInfo*>(tab_container->getChild<LLPanel>("Terrain"));
+ llassert(panel);
+ return panel;
+}
+
+void LLFloaterRegionInfo::onTabSelected(const LLSD& param)
+{
+ LLPanel* active_panel = getChild<LLPanel>(param.asString());
+ active_panel->onOpen(LLSD());
+}
+
void LLFloaterRegionInfo::refreshFromRegion(LLViewerRegion* region)
{
if (!region)
@@ -502,8 +542,13 @@ void LLPanelRegionInfo::onChangeText(LLLineEditor* caller, void* user_data)
// virtual
BOOL LLPanelRegionInfo::postBuild()
{
- getChild<LLUICtrl>("apply_btn")->setCommitCallback(boost::bind(&LLPanelRegionInfo::onBtnSet, this));
- getChildView("apply_btn")->setEnabled(FALSE);
+ // If the panel has an Apply button, set a callback for it.
+ LLUICtrl* apply_btn = findChild<LLUICtrl>("apply_btn");
+ if (apply_btn)
+ {
+ apply_btn->setCommitCallback(boost::bind(&LLPanelRegionInfo::onBtnSet, this));
+ }
+
refresh();
return TRUE;
}
@@ -555,12 +600,14 @@ void LLPanelRegionInfo::sendEstateOwnerMessage(
void LLPanelRegionInfo::enableButton(const std::string& btn_name, BOOL enable)
{
- getChildView(btn_name)->setEnabled(enable);
+ LLView* button = findChildView(btn_name);
+ if (button) button->setEnabled(enable);
}
void LLPanelRegionInfo::disableButton(const std::string& btn_name)
{
- getChildView(btn_name)->setEnabled(FALSE);
+ LLView* button = findChildView(btn_name);
+ if (button) button->setEnabled(FALSE);
}
void LLPanelRegionInfo::initCtrl(const std::string& name)
@@ -590,6 +637,9 @@ bool LLPanelRegionGeneralInfo::refreshFromRegion(LLViewerRegion* region)
getChildView("im_btn")->setEnabled(allow_modify);
getChildView("manage_telehub_btn")->setEnabled(allow_modify);
+ const bool enable_mesh = gMeshRepo.meshRezEnabled();
+ getChildView("mesh_rez_enabled_check")->setVisible(enable_mesh);
+ getChildView("mesh_rez_enabled_check")->setEnabled(getChildView("mesh_rez_enabled_check")->getEnabled() && enable_mesh);
// Data gets filled in by processRegionInfo
return LLPanelRegionInfo::refreshFromRegion(region);
@@ -1048,131 +1098,7 @@ void LLPanelRegionDebugInfo::onClickCancelRestart(void* data)
}
-/////////////////////////////////////////////////////////////////////////////
-// LLPanelRegionTextureInfo
-//
-LLPanelRegionTextureInfo::LLPanelRegionTextureInfo() : LLPanelRegionInfo()
-{
- // nothing.
-}
-
-bool LLPanelRegionTextureInfo::refreshFromRegion(LLViewerRegion* region)
-{
- BOOL allow_modify = gAgent.isGodlike() || (region && region->canManageEstate());
- setCtrlsEnabled(allow_modify);
- getChildView("apply_btn")->setEnabled(FALSE);
-
- if (region)
- {
- getChild<LLUICtrl>("region_text")->setValue(LLSD(region->getName()));
- }
- else
- {
- getChild<LLUICtrl>("region_text")->setValue(LLSD(""));
- }
-
- if (!region) return LLPanelRegionInfo::refreshFromRegion(region);
-
- LLVLComposition* compp = region->getComposition();
- LLTextureCtrl* texture_ctrl;
- std::string buffer;
- for(S32 i = 0; i < TERRAIN_TEXTURE_COUNT; ++i)
- {
- buffer = llformat("texture_detail_%d", i);
- texture_ctrl = getChild<LLTextureCtrl>(buffer);
- if(texture_ctrl)
- {
- lldebugs << "Detail Texture " << i << ": "
- << compp->getDetailTextureID(i) << llendl;
- LLUUID tmp_id(compp->getDetailTextureID(i));
- texture_ctrl->setImageAssetID(tmp_id);
- }
- }
-
- for(S32 i = 0; i < CORNER_COUNT; ++i)
- {
- buffer = llformat("height_start_spin_%d", i);
- getChild<LLUICtrl>(buffer)->setValue(LLSD(compp->getStartHeight(i)));
- buffer = llformat("height_range_spin_%d", i);
- getChild<LLUICtrl>(buffer)->setValue(LLSD(compp->getHeightRange(i)));
- }
-
- // Call the parent for common book-keeping
- return LLPanelRegionInfo::refreshFromRegion(region);
-}
-
-
-BOOL LLPanelRegionTextureInfo::postBuild()
-{
- LLPanelRegionInfo::postBuild();
- std::string buffer;
- for(S32 i = 0; i < TERRAIN_TEXTURE_COUNT; ++i)
- {
- buffer = llformat("texture_detail_%d", i);
- initCtrl(buffer);
- }
-
- for(S32 i = 0; i < CORNER_COUNT; ++i)
- {
- buffer = llformat("height_start_spin_%d", i);
- initCtrl(buffer);
- buffer = llformat("height_range_spin_%d", i);
- initCtrl(buffer);
- }
-
-// LLButton* btn = ("dump", LLRect(0, 20, 100, 0), "", onClickDump, this);
-// btn->setFollows(FOLLOWS_TOP|FOLLOWS_LEFT);
-// addChild(btn);
-
- return LLPanelRegionInfo::postBuild();
-}
-
-BOOL LLPanelRegionTextureInfo::sendUpdate()
-{
- llinfos << "LLPanelRegionTextureInfo::sendUpdate()" << llendl;
-
- // Make sure user hasn't chosen wacky textures.
- if (!validateTextureSizes())
- {
- return FALSE;
- }
-
- LLTextureCtrl* texture_ctrl;
- std::string buffer;
- std::string id_str;
- LLMessageSystem* msg = gMessageSystem;
- strings_t strings;
-
- LLUUID invoice(LLFloaterRegionInfo::getLastInvoice());
-
- for(S32 i = 0; i < TERRAIN_TEXTURE_COUNT; ++i)
- {
- buffer = llformat("texture_detail_%d", i);
- texture_ctrl = getChild<LLTextureCtrl>(buffer);
- if(texture_ctrl)
- {
- LLUUID tmp_id(texture_ctrl->getImageAssetID());
- tmp_id.toString(id_str);
- buffer = llformat("%d %s", i, id_str.c_str());
- strings.push_back(buffer);
- }
- }
- sendEstateOwnerMessage(msg, "texturedetail", invoice, strings);
- strings.clear();
- for(S32 i = 0; i < CORNER_COUNT; ++i)
- {
- buffer = llformat("height_start_spin_%d", i);
- std::string buffer2 = llformat("height_range_spin_%d", i);
- std::string buffer3 = llformat("%d %f %f", i, (F32)getChild<LLUICtrl>(buffer)->getValue().asReal(), (F32)getChild<LLUICtrl>(buffer2)->getValue().asReal());
- strings.push_back(buffer3);
- }
- sendEstateOwnerMessage(msg, "textureheights", invoice, strings);
- strings.clear();
- sendEstateOwnerMessage(msg, "texturecommit", invoice, strings);
- return TRUE;
-}
-
-BOOL LLPanelRegionTextureInfo::validateTextureSizes()
+BOOL LLPanelRegionTerrainInfo::validateTextureSizes()
{
for(S32 i = 0; i < TERRAIN_TEXTURE_COUNT; ++i)
{
@@ -1215,49 +1141,86 @@ BOOL LLPanelRegionTextureInfo::validateTextureSizes()
return TRUE;
}
-
-// static
-void LLPanelRegionTextureInfo::onClickDump(void* data)
-{
- llinfos << "LLPanelRegionTextureInfo::onClickDump()" << llendl;
-}
-
-
/////////////////////////////////////////////////////////////////////////////
// LLPanelRegionTerrainInfo
/////////////////////////////////////////////////////////////////////////////
+// Initialize statics
+
BOOL LLPanelRegionTerrainInfo::postBuild()
{
LLPanelRegionInfo::postBuild();
-
+
initCtrl("water_height_spin");
initCtrl("terrain_raise_spin");
initCtrl("terrain_lower_spin");
- initCtrl("fixed_sun_check");
- getChild<LLUICtrl>("fixed_sun_check")->setCommitCallback(boost::bind(&LLPanelRegionTerrainInfo::onChangeFixedSun, this));
- getChild<LLUICtrl>("use_estate_sun_check")->setCommitCallback(boost::bind(&LLPanelRegionTerrainInfo::onChangeUseEstateTime, this));
- getChild<LLUICtrl>("sun_hour_slider")->setCommitCallback(boost::bind(&LLPanelRegionTerrainInfo::onChangeSunHour, this));
+ std::string buffer;
+ for(S32 i = 0; i < TERRAIN_TEXTURE_COUNT; ++i)
+ {
+ buffer = llformat("texture_detail_%d", i);
+ initCtrl(buffer);
+ }
+
+ for(S32 i = 0; i < CORNER_COUNT; ++i)
+ {
+ buffer = llformat("height_start_spin_%d", i);
+ initCtrl(buffer);
+ buffer = llformat("height_range_spin_%d", i);
+ initCtrl(buffer);
+ }
childSetAction("download_raw_btn", onClickDownloadRaw, this);
childSetAction("upload_raw_btn", onClickUploadRaw, this);
childSetAction("bake_terrain_btn", onClickBakeTerrain, this);
- return TRUE;
+ return LLPanelRegionInfo::postBuild();
}
// virtual
bool LLPanelRegionTerrainInfo::refreshFromRegion(LLViewerRegion* region)
{
- llinfos << "LLPanelRegionTerrainInfo::refreshFromRegion" << llendl;
-
BOOL owner_or_god = gAgent.isGodlike()
|| (region && (region->getOwner() == gAgent.getID()));
BOOL owner_or_god_or_manager = owner_or_god
|| (region && region->isEstateManager());
setCtrlsEnabled(owner_or_god_or_manager);
+
getChildView("apply_btn")->setEnabled(FALSE);
+ if (region)
+ {
+ getChild<LLUICtrl>("region_text")->setValue(LLSD(region->getName()));
+
+ LLVLComposition* compp = region->getComposition();
+ LLTextureCtrl* texture_ctrl;
+ std::string buffer;
+ for(S32 i = 0; i < TERRAIN_TEXTURE_COUNT; ++i)
+ {
+ buffer = llformat("texture_detail_%d", i);
+ texture_ctrl = getChild<LLTextureCtrl>(buffer);
+ if(texture_ctrl)
+ {
+ lldebugs << "Detail Texture " << i << ": "
+ << compp->getDetailTextureID(i) << llendl;
+ LLUUID tmp_id(compp->getDetailTextureID(i));
+ texture_ctrl->setImageAssetID(tmp_id);
+ }
+ }
+
+ for(S32 i = 0; i < CORNER_COUNT; ++i)
+ {
+ buffer = llformat("height_start_spin_%d", i);
+ getChild<LLUICtrl>(buffer)->setValue(LLSD(compp->getStartHeight(i)));
+ buffer = llformat("height_range_spin_%d", i);
+ getChild<LLUICtrl>(buffer)->setValue(LLSD(compp->getHeightRange(i)));
+ }
+ }
+ else
+ {
+ lldebugs << "no region set" << llendl;
+ getChild<LLUICtrl>("region_text")->setValue(LLSD(""));
+ }
+
getChildView("download_raw_btn")->setEnabled(owner_or_god);
getChildView("upload_raw_btn")->setEnabled(owner_or_god);
getChildView("bake_terrain_btn")->setEnabled(owner_or_god);
@@ -1265,6 +1228,7 @@ bool LLPanelRegionTerrainInfo::refreshFromRegion(LLViewerRegion* region)
return LLPanelRegionInfo::refreshFromRegion(region);
}
+
// virtual
BOOL LLPanelRegionTerrainInfo::sendUpdate()
{
@@ -1273,76 +1237,62 @@ BOOL LLPanelRegionTerrainInfo::sendUpdate()
strings_t strings;
LLUUID invoice(LLFloaterRegionInfo::getLastInvoice());
- buffer = llformat("%f", (F32)getChild<LLUICtrl>("water_height_spin")->getValue().asReal());
- strings.push_back(buffer);
- buffer = llformat("%f", (F32)getChild<LLUICtrl>("terrain_raise_spin")->getValue().asReal());
- strings.push_back(buffer);
- buffer = llformat("%f", (F32)getChild<LLUICtrl>("terrain_lower_spin")->getValue().asReal());
- strings.push_back(buffer);
- buffer = llformat("%s", (getChild<LLUICtrl>("use_estate_sun_check")->getValue().asBoolean() ? "Y" : "N"));
- strings.push_back(buffer);
- buffer = llformat("%s", (getChild<LLUICtrl>("fixed_sun_check")->getValue().asBoolean() ? "Y" : "N"));
- strings.push_back(buffer);
- buffer = llformat("%f", (F32)getChild<LLUICtrl>("sun_hour_slider")->getValue().asReal() );
- strings.push_back(buffer);
+ // update the model
+ LLRegionInfoModel& region_info = LLRegionInfoModel::instance();
+ region_info.mWaterHeight = (F32) getChild<LLUICtrl>("water_height_spin")->getValue().asReal();
+ region_info.mTerrainRaiseLimit = (F32) getChild<LLUICtrl>("terrain_raise_spin")->getValue().asReal();
+ region_info.mTerrainLowerLimit = (F32) getChild<LLUICtrl>("terrain_lower_spin")->getValue().asReal();
- // Grab estate information in case the user decided to set the
- // region back to estate time. JC
- LLFloaterRegionInfo* floater = LLFloaterReg::getTypedInstance<LLFloaterRegionInfo>("region_info");
- if (!floater) return true;
-
- LLTabContainer* tab = floater->getChild<LLTabContainer>("region_panels");
- if (!tab) return true;
-
- LLPanelEstateInfo* panel = (LLPanelEstateInfo*)tab->getChild<LLPanel>("Estate");
- if (!panel) return true;
+ // and sync the region with it
+ region_info.sendRegionTerrain(invoice);
+
+ // =======================================
+ // Assemble and send texturedetail message
- BOOL estate_global_time = panel->getGlobalTime();
- BOOL estate_fixed_sun = panel->getFixedSun();
- F32 estate_sun_hour;
- if (estate_global_time)
+ // Make sure user hasn't chosen wacky textures.
+ if (!validateTextureSizes())
{
- estate_sun_hour = 0.f;
+ return FALSE;
}
- else
+
+ LLTextureCtrl* texture_ctrl;
+ std::string id_str;
+ LLMessageSystem* msg = gMessageSystem;
+
+ for(S32 i = 0; i < TERRAIN_TEXTURE_COUNT; ++i)
{
- estate_sun_hour = panel->getSunHour();
+ buffer = llformat("texture_detail_%d", i);
+ texture_ctrl = getChild<LLTextureCtrl>(buffer);
+ if(texture_ctrl)
+ {
+ LLUUID tmp_id(texture_ctrl->getImageAssetID());
+ tmp_id.toString(id_str);
+ buffer = llformat("%d %s", i, id_str.c_str());
+ strings.push_back(buffer);
+ }
}
+ sendEstateOwnerMessage(msg, "texturedetail", invoice, strings);
+ strings.clear();
- buffer = llformat("%s", (estate_global_time ? "Y" : "N") );
- strings.push_back(buffer);
- buffer = llformat("%s", (estate_fixed_sun ? "Y" : "N") );
- strings.push_back(buffer);
- buffer = llformat("%f", estate_sun_hour);
- strings.push_back(buffer);
-
- sendEstateOwnerMessage(gMessageSystem, "setregionterrain", invoice, strings);
- return TRUE;
-}
+ // ========================================
+ // Assemble and send textureheights message
-void LLPanelRegionTerrainInfo::onChangeUseEstateTime()
-{
- BOOL use_estate_sun = getChild<LLUICtrl>("use_estate_sun_check")->getValue().asBoolean();
- getChildView("fixed_sun_check")->setEnabled(!use_estate_sun);
- getChildView("sun_hour_slider")->setEnabled(!use_estate_sun);
- if (use_estate_sun)
+ for(S32 i = 0; i < CORNER_COUNT; ++i)
{
- getChild<LLUICtrl>("fixed_sun_check")->setValue(LLSD(FALSE));
- getChild<LLUICtrl>("sun_hour_slider")->setValue(LLSD(0.f));
+ buffer = llformat("height_start_spin_%d", i);
+ std::string buffer2 = llformat("height_range_spin_%d", i);
+ std::string buffer3 = llformat("%d %f %f", i, (F32)getChild<LLUICtrl>(buffer)->getValue().asReal(), (F32)getChild<LLUICtrl>(buffer2)->getValue().asReal());
+ strings.push_back(buffer3);
}
- getChildView("apply_btn")->setEnabled(TRUE);
-}
+ sendEstateOwnerMessage(msg, "textureheights", invoice, strings);
+ strings.clear();
-void LLPanelRegionTerrainInfo::onChangeFixedSun()
-{
- // Just enable the apply button. We let the sun-hour slider be enabled
- // for both fixed-sun and non-fixed-sun. JC
- getChildView("apply_btn")->setEnabled(TRUE);
-}
+ // ========================================
+ // Send texturecommit message
-void LLPanelRegionTerrainInfo::onChangeSunHour()
-{
- getChildView("apply_btn")->setEnabled(TRUE);
+ sendEstateOwnerMessage(msg, "texturecommit", invoice, strings);
+
+ return TRUE;
}
// static
@@ -1402,6 +1352,7 @@ bool LLPanelRegionTerrainInfo::callbackBakeTerrain(const LLSD& notification, con
strings.push_back("bake");
LLUUID invoice(LLFloaterRegionInfo::getLastInvoice());
sendEstateOwnerMessage(gMessageSystem, "terrain", invoice, strings);
+
return false;
}
@@ -1413,6 +1364,9 @@ LLPanelEstateInfo::LLPanelEstateInfo()
: LLPanelRegionInfo(),
mEstateID(0) // invalid
{
+ LLEstateInfoModel& estate_info = LLEstateInfoModel::instance();
+ estate_info.setCommitCallback(boost::bind(&LLPanelEstateInfo::refreshFromEstate, this));
+ estate_info.setUpdateCallback(boost::bind(&LLPanelEstateInfo::refreshFromEstate, this));
}
// static
@@ -1435,41 +1389,9 @@ void LLPanelEstateInfo::initDispatch(LLDispatcher& dispatch)
estate_dispatch_initialized = true;
}
-// Disables the sun-hour slider and the use fixed time check if the use global time is check
-void LLPanelEstateInfo::onChangeUseGlobalTime()
-{
- bool enabled = !getChild<LLUICtrl>("use_global_time_check")->getValue().asBoolean();
- getChildView("sun_hour_slider")->setEnabled(enabled);
- getChildView("fixed_sun_check")->setEnabled(enabled);
- getChild<LLUICtrl>("fixed_sun_check")->setValue(LLSD(FALSE));
- enableButton("apply_btn");
-}
-
-// Enables the sun-hour slider if the fixed-sun checkbox is set
-void LLPanelEstateInfo::onChangeFixedSun()
-{
- bool enabled = !getChild<LLUICtrl>("fixed_sun_check")->getValue().asBoolean();
- getChildView("use_global_time_check")->setEnabled(enabled);
- getChild<LLUICtrl>("use_global_time_check")->setValue(LLSD(FALSE));
- enableButton("apply_btn");
-}
-
-
-
-
//---------------------------------------------------------------------------
// Add/Remove estate access button callbacks
//---------------------------------------------------------------------------
-void LLPanelEstateInfo::onClickEditSky()
-{
- LLFloaterReg::showInstance("env_windlight");
-}
-
-void LLPanelEstateInfo::onClickEditDayCycle()
-{
- LLFloaterReg::showInstance("env_day_cycle");
-}
-
void LLPanelEstateInfo::onClickAddAllowedAgent()
{
LLCtrlListInterface *list = childGetListInterface("allowed_avatar_name_list");
@@ -1669,10 +1591,7 @@ std::string all_estates_text()
// static
bool LLPanelEstateInfo::isLindenEstate()
{
- LLPanelEstateInfo* panel = LLFloaterRegionInfo::getPanelEstate();
- if (!panel) return false;
-
- U32 estate_id = panel->getEstateID();
+ U32 estate_id = LLEstateInfoModel::instance().getID();
return (estate_id <= ESTATE_LAST_LINDEN);
}
@@ -2026,7 +1945,6 @@ void LLPanelEstateInfo::updateControls(LLViewerRegion* region)
BOOL manager = (region && region->isEstateManager());
setCtrlsEnabled(god || owner || manager);
- getChildView("apply_btn")->setEnabled(FALSE);
getChildView("add_allowed_avatar_btn")->setEnabled(god || owner || manager);
getChildView("remove_allowed_avatar_btn")->setEnabled(god || owner || manager);
getChildView("add_allowed_group_btn")->setEnabled(god || owner || manager);
@@ -2035,7 +1953,7 @@ void LLPanelEstateInfo::updateControls(LLViewerRegion* region)
// Can't ban people from mainland, orientation islands, etc. because this
// creates much network traffic and server load.
// Disable their accounts in CSR tool instead.
- bool linden_estate = (getEstateID() <= ESTATE_LAST_LINDEN);
+ bool linden_estate = isLindenEstate();
bool enable_ban = (god || owner || manager) && !linden_estate;
getChildView("add_banned_avatar_btn")->setEnabled(enable_ban);
getChildView("remove_banned_avatar_btn")->setEnabled(enable_ban);
@@ -2047,6 +1965,8 @@ void LLPanelEstateInfo::updateControls(LLViewerRegion* region)
getChildView("add_estate_manager_btn")->setEnabled(god || owner);
getChildView("remove_estate_manager_btn")->setEnabled(god || owner);
getChildView("estate_manager_name_list")->setEnabled(god || owner);
+
+ refresh();
}
bool LLPanelEstateInfo::refreshFromRegion(LLViewerRegion* region)
@@ -2084,10 +2004,6 @@ void LLPanelEstateInfo::updateChild(LLUICtrl* child_ctrl)
{
// do nothing
}
- else if (checkSunHourSlider(child_ctrl))
- {
- // do nothing
- }
}
bool LLPanelEstateInfo::estateUpdate(LLMessageSystem* msg)
@@ -2101,18 +2017,11 @@ BOOL LLPanelEstateInfo::postBuild()
{
// set up the callbacks for the generic controls
initCtrl("externally_visible_check");
- initCtrl("use_global_time_check");
- initCtrl("fixed_sun_check");
initCtrl("allow_direct_teleport");
initCtrl("limit_payment");
initCtrl("limit_age_verified");
initCtrl("voice_chat_check");
- // set up the use global time checkbox
- getChild<LLUICtrl>("use_global_time_check")->setCommitCallback(boost::bind(&LLPanelEstateInfo::onChangeUseGlobalTime, this));
- getChild<LLUICtrl>("fixed_sun_check")->setCommitCallback(boost::bind(&LLPanelEstateInfo::onChangeFixedSun, this));
- getChild<LLUICtrl>("sun_hour_slider")->setCommitCallback(boost::bind(&LLPanelEstateInfo::onChangeChildCtrl, this, _1));
-
getChild<LLUICtrl>("allowed_avatar_name_list")->setCommitCallback(boost::bind(&LLPanelEstateInfo::onChangeChildCtrl, this, _1));
LLNameListCtrl *avatar_name_list = getChild<LLNameListCtrl>("allowed_avatar_name_list");
if (avatar_name_list)
@@ -2159,18 +2068,18 @@ BOOL LLPanelEstateInfo::postBuild()
childSetAction("message_estate_btn", boost::bind(&LLPanelEstateInfo::onClickMessageEstate, this));
childSetAction("kick_user_from_estate_btn", boost::bind(&LLPanelEstateInfo::onClickKickUser, this));
- childSetAction("WLEditSky", boost::bind(&LLPanelEstateInfo::onClickEditSky, this));
- childSetAction("WLEditDayCycle", boost::bind(&LLPanelEstateInfo::onClickEditDayCycle, this));
-
return LLPanelRegionInfo::postBuild();
}
void LLPanelEstateInfo::refresh()
{
+ // Disable access restriction controls if they make no sense.
bool public_access = getChild<LLUICtrl>("externally_visible_check")->getValue().asBoolean();
+
getChildView("Only Allow")->setEnabled(public_access);
getChildView("limit_payment")->setEnabled(public_access);
getChildView("limit_age_verified")->setEnabled(public_access);
+
// if this is set to false, then the limit fields are meaningless and should be turned off
if (public_access == false)
{
@@ -2179,6 +2088,39 @@ void LLPanelEstateInfo::refresh()
}
}
+void LLPanelEstateInfo::refreshFromEstate()
+{
+ const LLEstateInfoModel& estate_info = LLEstateInfoModel::instance();
+
+ getChild<LLUICtrl>("estate_name")->setValue(estate_info.getName());
+ setOwnerName(LLSLURL("agent", estate_info.getOwnerID(), "inspect").getSLURLString());
+
+ getChild<LLUICtrl>("externally_visible_check")->setValue(estate_info.getIsExternallyVisible());
+ getChild<LLUICtrl>("voice_chat_check")->setValue(estate_info.getAllowVoiceChat());
+ getChild<LLUICtrl>("allow_direct_teleport")->setValue(estate_info.getAllowDirectTeleport());
+ getChild<LLUICtrl>("limit_payment")->setValue(estate_info.getDenyAnonymous());
+ getChild<LLUICtrl>("limit_age_verified")->setValue(estate_info.getDenyAgeUnverified());
+
+ // If visible from mainland, disable the access allowed
+ // UI, as anyone can teleport there.
+ // However, gods need to be able to edit the access list for
+ // linden estates, regardless of visibility, to allow object
+ // and L$ transfers.
+ {
+ bool visible_from_mainland = estate_info.getIsExternallyVisible();
+ bool god = gAgent.isGodlike();
+ bool linden_estate = isLindenEstate();
+
+ bool enable_agent = (!visible_from_mainland || (god && linden_estate));
+ bool enable_group = enable_agent;
+ bool enable_ban = !linden_estate;
+
+ setAccessAllowedEnabled(enable_agent, enable_group, enable_ban);
+ }
+
+ refresh();
+}
+
BOOL LLPanelEstateInfo::sendUpdate()
{
llinfos << "LLPanelEsateInfo::sendUpdate()" << llendl;
@@ -2186,7 +2128,7 @@ BOOL LLPanelEstateInfo::sendUpdate()
LLNotification::Params params("ChangeLindenEstate");
params.functor.function(boost::bind(&LLPanelEstateInfo::callbackChangeLindenEstate, this, _1, _2));
- if (getEstateID() <= ESTATE_LAST_LINDEN)
+ if (isLindenEstate())
{
// trying to change reserved estate, warn
LLNotifications::instance().add(params);
@@ -2205,13 +2147,21 @@ bool LLPanelEstateInfo::callbackChangeLindenEstate(const LLSD& notification, con
switch(option)
{
case 0:
- // send the update
- if (!commitEstateInfoCaps())
{
- // the caps method failed, try the old way
- LLFloaterRegionInfo::nextInvoice();
- commitEstateInfoDataserver();
+ LLEstateInfoModel& estate_info = LLEstateInfoModel::instance();
+
+ // update model
+ estate_info.setUseFixedSun(false); // we don't support fixed sun estates anymore
+ estate_info.setIsExternallyVisible(getChild<LLUICtrl>("externally_visible_check")->getValue().asBoolean());
+ estate_info.setAllowDirectTeleport(getChild<LLUICtrl>("allow_direct_teleport")->getValue().asBoolean());
+ estate_info.setDenyAnonymous(getChild<LLUICtrl>("limit_payment")->getValue().asBoolean());
+ estate_info.setDenyAgeUnverified(getChild<LLUICtrl>("limit_age_verified")->getValue().asBoolean());
+ estate_info.setAllowVoiceChat(getChild<LLUICtrl>("voice_chat_check")->getValue().asBoolean());
+
+ // send the update to sim
+ estate_info.sendEstateInfo();
}
+
// we don't want to do this because we'll get it automatically from the sim
// after the spaceserver processes it
// else
@@ -2268,6 +2218,8 @@ public:
// if we get a normal response, handle it here
virtual void result(const LLSD& content)
{
+ LL_INFOS("Windlight") << "Successfully committed estate info" << llendl;
+
// refresh the panel from the database
LLPanelEstateInfo* panel = dynamic_cast<LLPanelEstateInfo*>(mpPanel.get());
if (panel)
@@ -2284,185 +2236,6 @@ private:
LLHandle<LLPanel> mpPanel;
};
-// tries to send estate info using a cap; returns true if it succeeded
-bool LLPanelEstateInfo::commitEstateInfoCaps()
-{
- std::string url = gAgent.getRegion()->getCapability("EstateChangeInfo");
-
- if (url.empty())
- {
- // whoops, couldn't find the cap, so bail out
- return false;
- }
-
- LLSD body;
- body["estate_name"] = getEstateName();
-
- body["is_externally_visible"] = getChild<LLUICtrl>("externally_visible_check")->getValue().asBoolean();
- body["allow_direct_teleport"] = getChild<LLUICtrl>("allow_direct_teleport")->getValue().asBoolean();
- body["is_sun_fixed" ] = getChild<LLUICtrl>("fixed_sun_check")->getValue().asBoolean();
- body["deny_anonymous" ] = getChild<LLUICtrl>("limit_payment")->getValue().asBoolean();
- body["deny_age_unverified" ] = getChild<LLUICtrl>("limit_age_verified")->getValue().asBoolean();
- body["allow_voice_chat" ] = getChild<LLUICtrl>("voice_chat_check")->getValue().asBoolean();
- body["invoice" ] = LLFloaterRegionInfo::getLastInvoice();
-
- // block fly is in estate database but not in estate UI, so we're not supporting it
- //body["block_fly" ] = getChild<LLUICtrl>("")->getValue().asBoolean();
-
- F32 sun_hour = getSunHour();
- if (getChild<LLUICtrl>("use_global_time_check")->getValue().asBoolean())
- {
- sun_hour = 0.f; // 0 = global time
- }
- body["sun_hour"] = sun_hour;
-
- // we use a responder so that we can re-get the data after committing to the database
- LLHTTPClient::post(url, body, new LLEstateChangeInfoResponder(this));
- return true;
-}
-
-/* This is the old way of doing things, is deprecated, and should be
- deleted when the dataserver model can be removed */
-// key = "estatechangeinfo"
-// strings[0] = str(estate_id) (added by simulator before relay - not here)
-// strings[1] = estate_name
-// strings[2] = str(estate_flags)
-// strings[3] = str((S32)(sun_hour * 1024.f))
-void LLPanelEstateInfo::commitEstateInfoDataserver()
-{
- LLMessageSystem* msg = gMessageSystem;
- msg->newMessage("EstateOwnerMessage");
- msg->nextBlockFast(_PREHASH_AgentData);
- msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
- msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
- msg->addUUIDFast(_PREHASH_TransactionID, LLUUID::null); //not used
-
- msg->nextBlock("MethodData");
- msg->addString("Method", "estatechangeinfo");
- msg->addUUID("Invoice", LLFloaterRegionInfo::getLastInvoice());
-
- msg->nextBlock("ParamList");
- msg->addString("Parameter", getEstateName());
-
- std::string buffer;
- buffer = llformat("%u", computeEstateFlags());
- msg->nextBlock("ParamList");
- msg->addString("Parameter", buffer);
-
- F32 sun_hour = getSunHour();
- if (getChild<LLUICtrl>("use_global_time_check")->getValue().asBoolean())
- {
- sun_hour = 0.f; // 0 = global time
- }
-
- buffer = llformat("%d", (S32)(sun_hour*1024.0f));
- msg->nextBlock("ParamList");
- msg->addString("Parameter", buffer);
-
- gAgent.sendMessage();
-}
-
-void LLPanelEstateInfo::setEstateFlags(U32 flags)
-{
- getChild<LLUICtrl>("externally_visible_check")->setValue(LLSD(flags & REGION_FLAGS_EXTERNALLY_VISIBLE ? TRUE : FALSE) );
- getChild<LLUICtrl>("fixed_sun_check")->setValue(LLSD(flags & REGION_FLAGS_SUN_FIXED ? TRUE : FALSE) );
- getChild<LLUICtrl>("voice_chat_check")->setValue(
- LLSD(flags & REGION_FLAGS_ALLOW_VOICE ? TRUE : FALSE));
- getChild<LLUICtrl>("allow_direct_teleport")->setValue(LLSD(flags & REGION_FLAGS_ALLOW_DIRECT_TELEPORT ? TRUE : FALSE) );
- getChild<LLUICtrl>("limit_payment")->setValue(LLSD(flags & REGION_FLAGS_DENY_ANONYMOUS ? TRUE : FALSE) );
- getChild<LLUICtrl>("limit_age_verified")->setValue(LLSD(flags & REGION_FLAGS_DENY_AGEUNVERIFIED ? TRUE : FALSE) );
-
- refresh();
-}
-
-U32 LLPanelEstateInfo::computeEstateFlags()
-{
- U32 flags = 0;
-
- if (getChild<LLUICtrl>("externally_visible_check")->getValue().asBoolean())
- {
- flags |= REGION_FLAGS_EXTERNALLY_VISIBLE;
- }
-
- if ( getChild<LLUICtrl>("voice_chat_check")->getValue().asBoolean() )
- {
- flags |= REGION_FLAGS_ALLOW_VOICE;
- }
-
- if (getChild<LLUICtrl>("allow_direct_teleport")->getValue().asBoolean())
- {
- flags |= REGION_FLAGS_ALLOW_DIRECT_TELEPORT;
- }
-
- if (getChild<LLUICtrl>("fixed_sun_check")->getValue().asBoolean())
- {
- flags |= REGION_FLAGS_SUN_FIXED;
- }
-
- if (getChild<LLUICtrl>("limit_payment")->getValue().asBoolean())
- {
- flags |= REGION_FLAGS_DENY_ANONYMOUS;
- }
-
- if (getChild<LLUICtrl>("limit_age_verified")->getValue().asBoolean())
- {
- flags |= REGION_FLAGS_DENY_AGEUNVERIFIED;
- }
-
-
- return flags;
-}
-
-BOOL LLPanelEstateInfo::getGlobalTime()
-{
- return getChild<LLUICtrl>("use_global_time_check")->getValue().asBoolean();
-}
-
-void LLPanelEstateInfo::setGlobalTime(bool b)
-{
- getChild<LLUICtrl>("use_global_time_check")->setValue(LLSD(b));
- getChildView("fixed_sun_check")->setEnabled(LLSD(!b));
- getChildView("sun_hour_slider")->setEnabled(LLSD(!b));
- if (b)
- {
- getChild<LLUICtrl>("sun_hour_slider")->setValue(LLSD(0.f));
- }
-}
-
-
-BOOL LLPanelEstateInfo::getFixedSun()
-{
- return getChild<LLUICtrl>("fixed_sun_check")->getValue().asBoolean();
-}
-
-void LLPanelEstateInfo::setSunHour(F32 sun_hour)
-{
- if(sun_hour < 6.0f)
- {
- sun_hour = 24.0f + sun_hour;
- }
- getChild<LLUICtrl>("sun_hour_slider")->setValue(LLSD(sun_hour));
-}
-
-F32 LLPanelEstateInfo::getSunHour()
-{
- if (getChildView("sun_hour_slider")->getEnabled())
- {
- return (F32)getChild<LLUICtrl>("sun_hour_slider")->getValue().asReal();
- }
- return 0.f;
-}
-
-const std::string LLPanelEstateInfo::getEstateName() const
-{
- return getChild<LLUICtrl>("estate_name")->getValue().asString();
-}
-
-void LLPanelEstateInfo::setEstateName(const std::string& name)
-{
- getChild<LLUICtrl>("estate_name")->setValue(LLSD(name));
-}
-
const std::string LLPanelEstateInfo::getOwnerName() const
{
return getChild<LLUICtrl>("estate_owner")->getValue().asString();
@@ -2562,17 +2335,6 @@ BOOL LLPanelEstateInfo::checkRemovalButton(std::string name)
return (btn_name != "");
}
-BOOL LLPanelEstateInfo::checkSunHourSlider(LLUICtrl* child_ctrl)
-{
- BOOL found_child_ctrl = FALSE;
- if (child_ctrl->getName() == "sun_hour_slider")
- {
- enableButton("apply_btn");
- found_child_ctrl = TRUE;
- }
- return found_child_ctrl;
-}
-
// static
void LLPanelEstateInfo::onClickMessageEstate(void* userdata)
{
@@ -2974,53 +2736,12 @@ bool LLDispatchEstateUpdateInfo::operator()(
const LLUUID& invoice,
const sparam_t& strings)
{
- LLPanelEstateInfo* panel = LLFloaterRegionInfo::getPanelEstate();
- if (!panel) return true;
-
- // NOTE: LLDispatcher extracts strings with an extra \0 at the
- // end. If we pass the std::string direct to the UI/renderer
- // it draws with a weird character at the end of the string.
- std::string estate_name = strings[0].c_str(); // preserve c_str() call!
- panel->setEstateName(estate_name);
-
- LLViewerRegion* regionp = gAgent.getRegion();
-
- LLUUID owner_id(strings[1]);
- regionp->setOwner(owner_id);
- // Update estate owner name in UI
- std::string owner_name = LLSLURL("agent", owner_id, "inspect").getSLURLString();
- panel->setOwnerName(owner_name);
-
- U32 estate_id = strtoul(strings[2].c_str(), NULL, 10);
- panel->setEstateID(estate_id);
-
- U32 flags = strtoul(strings[3].c_str(), NULL, 10);
- panel->setEstateFlags(flags);
-
- F32 sun_hour = ((F32)(strtod(strings[4].c_str(), NULL)))/1024.0f;
- if(sun_hour == 0 && (flags & REGION_FLAGS_SUN_FIXED ? FALSE : TRUE))
- {
- panel->setGlobalTime(TRUE);
- }
- else
- {
- panel->setGlobalTime(FALSE);
- panel->setSunHour(sun_hour);
- }
+ lldebugs << "Received estate update" << llendl;
- bool visible_from_mainland = (bool)(flags & REGION_FLAGS_EXTERNALLY_VISIBLE);
- bool god = gAgent.isGodlike();
- bool linden_estate = (estate_id <= ESTATE_LAST_LINDEN);
-
- // If visible from mainland, disable the access allowed
- // UI, as anyone can teleport there.
- // However, gods need to be able to edit the access list for
- // linden estates, regardless of visibility, to allow object
- // and L$ transfers.
- bool enable_agent = (!visible_from_mainland || (god && linden_estate));
- bool enable_group = enable_agent;
- bool enable_ban = !linden_estate;
- panel->setAccessAllowedEnabled(enable_agent, enable_group, enable_ban);
+ // Update estate info model.
+ // This will call LLPanelEstateInfo::refreshFromEstate().
+ // *TODO: Move estate message handling stuff to llestateinfomodel.cpp.
+ LLEstateInfoModel::instance().update(strings);
return true;
}
@@ -3194,3 +2915,595 @@ bool LLDispatchSetEstateAccess::operator()(
return true;
}
+
+LLPanelEnvironmentInfo::LLPanelEnvironmentInfo()
+: mEnableEditing(false),
+ mRegionSettingsRadioGroup(NULL),
+ mDayCycleSettingsRadioGroup(NULL),
+ mWaterPresetCombo(NULL),
+ mSkyPresetCombo(NULL),
+ mDayCyclePresetCombo(NULL)
+{
+}
+
+// virtual
+BOOL LLPanelEnvironmentInfo::postBuild()
+{
+ mRegionSettingsRadioGroup = getChild<LLRadioGroup>("region_settings_radio_group");
+ mRegionSettingsRadioGroup->setCommitCallback(boost::bind(&LLPanelEnvironmentInfo::onSwitchRegionSettings, this));
+
+ mDayCycleSettingsRadioGroup = getChild<LLRadioGroup>("sky_dayc_settings_radio_group");
+ mDayCycleSettingsRadioGroup->setCommitCallback(boost::bind(&LLPanelEnvironmentInfo::onSwitchDayCycle, this));
+
+ mWaterPresetCombo = getChild<LLComboBox>("water_settings_preset_combo");
+ mWaterPresetCombo->setCommitCallback(boost::bind(&LLPanelEnvironmentInfo::onSelectWaterPreset, this));
+
+ mSkyPresetCombo = getChild<LLComboBox>("sky_settings_preset_combo");
+ mSkyPresetCombo->setCommitCallback(boost::bind(&LLPanelEnvironmentInfo::onSelectSkyPreset, this));
+
+ mDayCyclePresetCombo = getChild<LLComboBox>("dayc_settings_preset_combo");
+ mDayCyclePresetCombo->setCommitCallback(boost::bind(&LLPanelEnvironmentInfo::onSelectDayCycle, this));
+
+ childSetCommitCallback("apply_btn", boost::bind(&LLPanelEnvironmentInfo::onBtnApply, this), NULL);
+ getChild<LLButton>("apply_btn")->setRightMouseDownCallback(boost::bind(&LLEnvManagerNew::dumpUserPrefs, LLEnvManagerNew::getInstance()));
+ childSetCommitCallback("cancel_btn", boost::bind(&LLPanelEnvironmentInfo::onBtnCancel, this), NULL);
+ getChild<LLButton>("cancel_btn")->setRightMouseDownCallback(boost::bind(&LLEnvManagerNew::dumpPresets, LLEnvManagerNew::getInstance()));
+
+ LLEnvManagerNew::instance().setRegionSettingsChangeCallback(boost::bind(&LLPanelEnvironmentInfo::onRegionSettingschange, this));
+ LLEnvManagerNew::instance().setRegionSettingsAppliedCallback(boost::bind(&LLPanelEnvironmentInfo::onRegionSettingsApplied, this, _1));
+
+ LLDayCycleManager::instance().setModifyCallback(boost::bind(&LLPanelEnvironmentInfo::populateDayCyclesList, this));
+ LLWLParamManager::instance().setPresetListChangeCallback(boost::bind(&LLPanelEnvironmentInfo::populateSkyPresetsList, this));
+ LLWaterParamManager::instance().setPresetListChangeCallback(boost::bind(&LLPanelEnvironmentInfo::populateWaterPresetsList, this));
+
+ return TRUE;
+}
+
+// virtual
+void LLPanelEnvironmentInfo::onOpen(const LLSD& key)
+{
+ LL_DEBUGS("Windlight") << "Panel opened, refreshing" << LL_ENDL;
+ refresh();
+}
+
+// virtual
+void LLPanelEnvironmentInfo::handleVisibilityChange(BOOL new_visibility)
+{
+ // If hiding (user switched to another tab or closed the floater),
+ // display user's preferred environment.
+ if (!new_visibility)
+ {
+ LLEnvManagerNew::instance().usePrefs();
+ }
+}
+
+// virtual
+bool LLPanelEnvironmentInfo::refreshFromRegion(LLViewerRegion* region)
+{
+ LL_DEBUGS("Windlight") << "Region updated, enabling/disabling controls" << LL_ENDL;
+ BOOL owner_or_god = gAgent.isGodlike() || (region && (region->getOwner() == gAgent.getID()));
+ BOOL owner_or_god_or_manager = owner_or_god || (region && region->isEstateManager());
+
+ // Don't refresh from region settings to avoid flicker after applying new region settings.
+ mEnableEditing = owner_or_god_or_manager;
+ setControlsEnabled(mEnableEditing);
+
+ return LLPanelRegionInfo::refreshFromRegion(region);
+}
+
+void LLPanelEnvironmentInfo::refresh()
+{
+ populateWaterPresetsList();
+ populateSkyPresetsList();
+ populateDayCyclesList();
+
+ // Init radio groups.
+ const LLEnvironmentSettings& settings = LLEnvManagerNew::instance().getRegionSettings();
+ const LLSD& dc = settings.getWLDayCycle();
+ LLSD::Real first_frame_time = dc.size() > 0 ? dc[0][0].asReal() : 0.0f;
+ const bool use_fixed_sky = dc.size() == 1 && first_frame_time < 0;
+ mRegionSettingsRadioGroup->setSelectedIndex(settings.getSkyMap().size() == 0 ? 0 : 1);
+ mDayCycleSettingsRadioGroup->setSelectedIndex(use_fixed_sky ? 0 : 1);
+
+ setControlsEnabled(mEnableEditing);
+
+ setDirty(false);
+}
+
+void LLPanelEnvironmentInfo::setControlsEnabled(bool enabled)
+{
+ mRegionSettingsRadioGroup->setEnabled(enabled);
+ mDayCycleSettingsRadioGroup->setEnabled(enabled);
+
+ mWaterPresetCombo->setEnabled(enabled);
+ mSkyPresetCombo->setEnabled(enabled);
+ mDayCyclePresetCombo->setEnabled(enabled);
+
+ getChildView("apply_btn")->setEnabled(enabled);
+ getChildView("cancel_btn")->setEnabled(enabled);
+
+ if (enabled)
+ {
+ // Enable/disable some controls based on currently selected radio buttons.
+ bool use_defaults = mRegionSettingsRadioGroup->getSelectedIndex() == 0;
+ getChild<LLView>("user_environment_settings")->setEnabled(!use_defaults);
+
+ bool is_fixed_sky = mDayCycleSettingsRadioGroup->getSelectedIndex() == 0;
+ mSkyPresetCombo->setEnabled(is_fixed_sky);
+ mDayCyclePresetCombo->setEnabled(!is_fixed_sky);
+ }
+}
+
+void LLPanelEnvironmentInfo::setApplyProgress(bool started)
+{
+ LLLoadingIndicator* indicator = getChild<LLLoadingIndicator>("progress_indicator");
+
+ indicator->setVisible(started);
+
+ if (started)
+ {
+ indicator->start();
+ }
+ else
+ {
+ indicator->stop();
+ }
+}
+
+void LLPanelEnvironmentInfo::setDirty(bool dirty)
+{
+ getChildView("apply_btn")->setEnabled(dirty);
+ getChildView("cancel_btn")->setEnabled(dirty);
+}
+
+void LLPanelEnvironmentInfo::sendRegionSunUpdate()
+{
+ LLRegionInfoModel& region_info = LLRegionInfoModel::instance();
+
+ // If the region is being switched to fixed sky,
+ // change the region's sun hour according to the (fixed) sun position.
+ // This is needed for llGetSunDirection() LSL function to work properly (STORM-1330).
+ const LLSD& sky_map = mNewRegionSettings.getSkyMap();
+ bool region_use_fixed_sky = sky_map.size() == 1;
+ if (region_use_fixed_sky)
+ {
+ LLWLParamSet param_set;
+ llassert(sky_map.isMap());
+ param_set.setAll(sky_map.beginMap()->second);
+ F32 sun_angle = param_set.getSunAngle();
+
+ LL_DEBUGS("Windlight Sync") << "Old sun hour: " << region_info.mSunHour << LL_ENDL;
+ // convert value range from 0..2pi to 6..30
+ region_info.mSunHour = fmodf((sun_angle / F_TWO_PI) * 24.f, 24.f) + 6.f;
+ }
+
+ region_info.setUseFixedSun(region_use_fixed_sky);
+ region_info.mUseEstateSun = !region_use_fixed_sky;
+ LL_DEBUGS("Windlight Sync") << "Sun hour: " << region_info.mSunHour << LL_ENDL;
+
+ region_info.sendRegionTerrain(LLFloaterRegionInfo::getLastInvoice());
+}
+
+void LLPanelEnvironmentInfo::fixEstateSun()
+{
+ // We don't support fixed sun estates anymore and need to fix
+ // such estates for region day cycle to take effect.
+ // *NOTE: Assuming that current estate settings have arrived already.
+ LLEstateInfoModel& estate_info = LLEstateInfoModel::instance();
+ if (estate_info.getUseFixedSun())
+ {
+ llinfos << "Switching estate to global sun" << llendl;
+ estate_info.setUseFixedSun(false);
+ estate_info.sendEstateInfo();
+ }
+}
+
+void LLPanelEnvironmentInfo::populateWaterPresetsList()
+{
+ mWaterPresetCombo->removeall();
+
+ // If the region already has water params, add them to the list.
+ const LLEnvironmentSettings& region_settings = LLEnvManagerNew::instance().getRegionSettings();
+ if (region_settings.getWaterParams().size() != 0)
+ {
+ const std::string& region_name = gAgent.getRegion()->getName();
+ mWaterPresetCombo->add(region_name, LLWLParamKey(region_name, LLEnvKey::SCOPE_REGION).toLLSD());
+ mWaterPresetCombo->addSeparator();
+ }
+
+ std::list<std::string> user_presets, system_presets;
+ LLWaterParamManager::instance().getPresetNames(user_presets, system_presets);
+
+ // Add local user presets first.
+ for (std::list<std::string>::const_iterator it = user_presets.begin(); it != user_presets.end(); ++it)
+ {
+ mWaterPresetCombo->add(*it, LLWLParamKey(*it, LLEnvKey::SCOPE_LOCAL).toLLSD());
+ }
+
+ if (user_presets.size() > 0)
+ {
+ mWaterPresetCombo->addSeparator();
+ }
+
+ // Add local system presets.
+ for (std::list<std::string>::const_iterator it = system_presets.begin(); it != system_presets.end(); ++it)
+ {
+ mWaterPresetCombo->add(*it, LLWLParamKey(*it, LLEnvKey::SCOPE_LOCAL).toLLSD());
+ }
+
+ // There's no way to select current preset because its name is not stored on server.
+}
+
+void LLPanelEnvironmentInfo::populateSkyPresetsList()
+{
+ mSkyPresetCombo->removeall();
+
+ LLWLParamManager::preset_name_list_t region_presets;
+ LLWLParamManager::preset_name_list_t user_presets, sys_presets;
+ LLWLParamManager::instance().getPresetNames(region_presets, user_presets, sys_presets);
+
+ // Add region presets.
+ std::string region_name = gAgent.getRegion() ? gAgent.getRegion()->getName() : LLTrans::getString("Unknown");
+ for (LLWLParamManager::preset_name_list_t::const_iterator it = region_presets.begin(); it != region_presets.end(); ++it)
+ {
+ std::string preset_name = *it;
+ std::string item_title = preset_name + " (" + region_name + ")";
+ mSkyPresetCombo->add(item_title, LLWLParamKey(preset_name, LLEnvKey::SCOPE_REGION).toStringVal());
+ }
+
+ if (!region_presets.empty())
+ {
+ mSkyPresetCombo->addSeparator();
+ }
+
+ // Add user presets.
+ for (LLWLParamManager::preset_name_list_t::const_iterator it = user_presets.begin(); it != user_presets.end(); ++it)
+ {
+ mSkyPresetCombo->add(*it, LLWLParamKey(*it, LLEnvKey::SCOPE_LOCAL).toStringVal());
+ }
+
+ if (!user_presets.empty())
+ {
+ mSkyPresetCombo->addSeparator();
+ }
+
+ // Add system presets.
+ for (LLWLParamManager::preset_name_list_t::const_iterator it = sys_presets.begin(); it != sys_presets.end(); ++it)
+ {
+ mSkyPresetCombo->add(*it, LLWLParamKey(*it, LLEnvKey::SCOPE_LOCAL).toStringVal());
+ }
+
+ // Select current preset.
+ LLSD sky_map = LLEnvManagerNew::instance().getRegionSettings().getSkyMap();
+ if (sky_map.size() == 1) // if the region is set to fixed sky
+ {
+ std::string preset_name = sky_map.beginMap()->first;
+ mSkyPresetCombo->selectByValue(LLWLParamKey(preset_name, LLEnvKey::SCOPE_REGION).toStringVal());
+ }
+}
+
+void LLPanelEnvironmentInfo::populateDayCyclesList()
+{
+ mDayCyclePresetCombo->removeall();
+
+ // If the region already has env. settings, add its day cycle to the list.
+ const LLSD& cur_region_dc = LLEnvManagerNew::instance().getRegionSettings().getWLDayCycle();
+ if (cur_region_dc.size() != 0)
+ {
+ LLViewerRegion* region = gAgent.getRegion();
+ llassert(region != NULL);
+
+ LLWLParamKey key(region->getName(), LLEnvKey::SCOPE_REGION);
+ mDayCyclePresetCombo->add(region->getName(), key.toStringVal());
+ mDayCyclePresetCombo->addSeparator();
+ }
+
+ // Add local user day cycles.
+ LLDayCycleManager::preset_name_list_t user_days, sys_days;
+ LLDayCycleManager::instance().getPresetNames(user_days, sys_days);
+ for (LLDayCycleManager::preset_name_list_t::const_iterator it = user_days.begin(); it != user_days.end(); ++it)
+ {
+ mDayCyclePresetCombo->add(*it, LLWLParamKey(*it, LLEnvKey::SCOPE_LOCAL).toStringVal());
+ }
+
+ if (user_days.size() > 0)
+ {
+ mDayCyclePresetCombo->addSeparator();
+ }
+
+ // Add local system day cycles.
+ for (LLDayCycleManager::preset_name_list_t::const_iterator it = sys_days.begin(); it != sys_days.end(); ++it)
+ {
+ mDayCyclePresetCombo->add(*it, LLWLParamKey(*it, LLEnvKey::SCOPE_LOCAL).toStringVal());
+ }
+
+ // Current day cycle is already selected.
+}
+
+bool LLPanelEnvironmentInfo::getSelectedWaterParams(LLSD& water_params)
+{
+ LLWLParamKey water_key(mWaterPresetCombo->getSelectedValue());
+
+ if (water_key.scope == LLEnvKey::SCOPE_REGION)
+ {
+ water_params = LLEnvManagerNew::instance().getRegionSettings().getWaterParams();
+ }
+ else
+ {
+ LLWaterParamSet param_set;
+ if (!LLWaterParamManager::instance().getParamSet(water_key.name, param_set))
+ {
+ llwarns << "Error getting water preset: " << water_key.name << llendl;
+ return false;
+ }
+
+ water_params = param_set.getAll();
+ }
+
+ return true;
+}
+
+bool LLPanelEnvironmentInfo::getSelectedSkyParams(LLSD& sky_params, std::string& preset_name)
+{
+ std::string preset_key(mSkyPresetCombo->getValue().asString());
+ LLWLParamKey preset(preset_key);
+
+ // Get the preset sky params.
+ LLWLParamSet param_set;
+ if (!LLWLParamManager::instance().getParamSet(preset, param_set))
+ {
+ llwarns << "Error getting sky params: " << preset.toLLSD() << llendl;
+ return false;
+ }
+
+ sky_params = param_set.getAll();
+ preset_name = preset.name;
+ return true;
+}
+
+bool LLPanelEnvironmentInfo::getSelectedDayCycleParams(LLSD& day_cycle, LLSD& sky_map, short& scope)
+{
+ std::string preset_key(mDayCyclePresetCombo->getValue().asString());
+ LLWLParamKey dc(preset_key);
+ LL_DEBUGS("Windlight") << "Use day cycle: " << dc.toLLSD() << LL_ENDL;
+
+ if (dc.scope == LLEnvKey::SCOPE_REGION) // current region day cycle
+ {
+ const LLEnvironmentSettings& cur_region_settings = LLEnvManagerNew::instance().getRegionSettings();
+ day_cycle = cur_region_settings.getWLDayCycle();
+ sky_map = cur_region_settings.getSkyMap();
+ }
+ else // a local day cycle
+ {
+ if (!LLDayCycleManager::instance().getPreset(dc.name, day_cycle))
+ {
+ llwarns << "Error getting day cycle " << dc.name << llendl;
+ return false;
+ }
+
+ // Create sky map from the day cycle.
+ {
+ LLWLDayCycle tmp_day;
+ tmp_day.loadDayCycle(day_cycle, dc.scope);
+ tmp_day.getSkyMap(sky_map);
+ }
+ }
+
+ scope = dc.scope;
+
+ return true;
+}
+void LLPanelEnvironmentInfo::onSwitchRegionSettings()
+{
+ bool use_defaults = mRegionSettingsRadioGroup->getSelectedIndex() == 0;
+ getChild<LLView>("user_environment_settings")->setEnabled(!use_defaults);
+
+ if (use_defaults)
+ {
+ LLEnvManagerNew::instance().useDefaults();
+ }
+ else
+ {
+ onSelectWaterPreset();
+ onSwitchDayCycle();
+ }
+
+ setDirty(true);
+}
+
+void LLPanelEnvironmentInfo::onSwitchDayCycle()
+{
+ bool is_fixed_sky = mDayCycleSettingsRadioGroup->getSelectedIndex() == 0;
+
+ mSkyPresetCombo->setEnabled(is_fixed_sky);
+ mDayCyclePresetCombo->setEnabled(!is_fixed_sky);
+
+ if (is_fixed_sky)
+ {
+ onSelectSkyPreset();
+ }
+ else
+ {
+ onSelectDayCycle();
+ }
+
+ setDirty(true);
+}
+
+void LLPanelEnvironmentInfo::onSelectWaterPreset()
+{
+ LLSD water_params;
+
+ if (getSelectedWaterParams(water_params))
+ {
+ LLEnvManagerNew::instance().useWaterParams(water_params);
+ }
+
+ setDirty(true);
+}
+
+void LLPanelEnvironmentInfo::onSelectSkyPreset()
+{
+ LLSD params;
+ std::string dummy;
+
+ if (getSelectedSkyParams(params, dummy))
+ {
+ LLEnvManagerNew::instance().useSkyParams(params);
+ }
+
+ setDirty(true);
+}
+
+void LLPanelEnvironmentInfo::onSelectDayCycle()
+{
+ LLSD day_cycle;
+ LLSD sky_map; // unused
+ short scope;
+
+ if (getSelectedDayCycleParams(day_cycle, sky_map, scope))
+ {
+ LLEnvManagerNew::instance().useDayCycleParams(day_cycle, (LLEnvKey::EScope) scope);
+ }
+
+ setDirty(true);
+}
+
+void LLPanelEnvironmentInfo::onBtnApply()
+{
+ const bool use_defaults = mRegionSettingsRadioGroup->getSelectedIndex() == 0;
+ const bool use_fixed_sky = mDayCycleSettingsRadioGroup->getSelectedIndex() == 0;
+
+ LLSD day_cycle;
+ LLSD sky_map;
+ LLSD water_params;
+
+ if (use_defaults)
+ {
+ // settings will be empty
+ LL_DEBUGS("Windlight") << "Defaults" << LL_ENDL;
+ }
+ else // use custom region settings
+ {
+ if (use_fixed_sky)
+ {
+ LL_DEBUGS("Windlight") << "Use fixed sky" << LL_ENDL;
+
+ // Get selected sky params.
+ LLSD params;
+ std::string preset_name;
+ if (!getSelectedSkyParams(params, preset_name))
+ {
+ return;
+ }
+
+ // Create a day cycle consisting of a single sky preset.
+ LLSD key(LLSD::emptyArray());
+ key.append(-1.0f); // indicate that user preference is actually fixed sky, not a day cycle
+ key.append(preset_name);
+ day_cycle.append(key);
+
+ // Create a sky map consisting of only the sky preset.
+ std::map<LLWLParamKey, LLWLParamSet> refs;
+ LLWLParamSet param_set;
+ param_set.setAll(params);
+ refs[LLWLParamKey(preset_name, LLEnvKey::SCOPE_LOCAL)] = param_set; // scope doesn't matter here
+ sky_map = LLWLParamManager::createSkyMap(refs);
+ }
+ else // use day cycle
+ {
+ LL_DEBUGS("Windlight") << "Use day cycle" << LL_ENDL;
+
+ short scope; // unused
+ if (!getSelectedDayCycleParams(day_cycle, sky_map, scope))
+ {
+ return;
+ }
+
+ // If it's a special single-preset day cycle meaning using a fixed sky,
+ // reset the frame time to a non-negative value,
+ // so that the region setting is displayed in the floater as
+ // a day cycle, not a preset. (STORM-1289)
+ if (day_cycle.size() == 1 && day_cycle[0][0].asReal() < 0.0f)
+ {
+ LL_DEBUGS("Windlight") << "Fixing negative time" << LL_ENDL;
+ day_cycle[0][0] = 0.0f;
+ }
+ }
+
+ // Get water params.
+ if (!getSelectedWaterParams(water_params))
+ {
+ // *TODO: show a notification?
+ return;
+ }
+ }
+
+ // Send settings apply request.
+ LLEnvironmentSettings new_region_settings;
+ new_region_settings.saveParams(day_cycle, sky_map, water_params, 0.0f);
+ if (!LLEnvManagerNew::instance().sendRegionSettings(new_region_settings))
+ {
+ llwarns << "Error applying region environment settings" << llendl;
+ return;
+ }
+
+ // When the settings get applied, we'll also send the region sun position update.
+ // To determine the sun angle we're going to need the new settings.
+ mNewRegionSettings = new_region_settings;
+
+ // Start spinning the progress indicator.
+ setApplyProgress(true);
+}
+
+void LLPanelEnvironmentInfo::onBtnCancel()
+{
+ // Reload last saved region settings.
+ refresh();
+
+ // Apply them.
+ LLEnvManagerNew& env_mgr = LLEnvManagerNew::instance();
+ const LLEnvironmentSettings& cur_settings = env_mgr.getRegionSettings();
+ const LLSD& region_day_cycle = cur_settings.getWLDayCycle();
+ const LLSD& region_water = cur_settings.getWaterParams();
+ env_mgr.useWaterParams(region_water);
+ env_mgr.useDayCycleParams(region_day_cycle, LLEnvKey::SCOPE_REGION);
+}
+
+void LLPanelEnvironmentInfo::onRegionSettingschange()
+{
+ LL_DEBUGS("Windlight") << "Region settings changed, refreshing" << LL_ENDL;
+ refresh();
+
+ // Stop applying progress indicator (it may be running if it's us who initiated settings update).
+ setApplyProgress(false);
+}
+
+void LLPanelEnvironmentInfo::onRegionSettingsApplied(bool ok)
+{
+ // If applying new settings has failed, stop the indicator right away.
+ // Otherwise it will be stopped when we receive the updated settings from server.
+ if (ok)
+ {
+ // Set the region sun phase/flags according to the chosen new preferences.
+ //
+ // If we do this earlier we may get jerky transition from fixed sky to a day cycle (STORM-1481).
+ // That is caused by the simulator re-sending the region info, which in turn makes us
+ // re-request and display old region environment settings while the new ones haven't been applied yet.
+ sendRegionSunUpdate();
+
+ // Switch estate to not using fixed sun for the region day cycle to work properly (STORM-1506).
+ fixEstateSun();
+ }
+ else
+ {
+ setApplyProgress(false);
+
+ // We need to re-request environment setting here,
+ // otherwise our subsequent attempts to change region settings will fail with the following error:
+ // "Unable to update environment settings because the last update your viewer saw was not the same
+ // as the last update sent from the simulator. Try sending your update again, and if this
+ // does not work, try leaving and returning to the region."
+ LLEnvManagerNew::instance().requestRegionSettings();
+ }
+}
diff --git a/indra/newview/llfloaterregioninfo.h b/indra/newview/llfloaterregioninfo.h
index 2b87c27fcf..c1fef57ac9 100644
--- a/indra/newview/llfloaterregioninfo.h
+++ b/indra/newview/llfloaterregioninfo.h
@@ -34,6 +34,8 @@
#include "llhost.h"
#include "llpanel.h"
+#include "llenvmanager.h" // for LLEnvironmentSettings
+
class LLAvatarName;
class LLDispatcher;
class LLLineEditor;
@@ -46,6 +48,7 @@ class LLInventoryItem;
class LLCheckBoxCtrl;
class LLComboBox;
class LLNameListCtrl;
+class LLRadioGroup;
class LLSliderCtrl;
class LLSpinCtrl;
class LLTextBox;
@@ -53,11 +56,17 @@ class LLVFS;
class LLPanelRegionGeneralInfo;
class LLPanelRegionDebugInfo;
-class LLPanelRegionTextureInfo;
class LLPanelRegionTerrainInfo;
class LLPanelEstateInfo;
class LLPanelEstateCovenant;
+class LLEventTimer;
+class LLEnvironmentSettings;
+class LLWLParamManager;
+class LLWaterParamManager;
+class LLWLParamSet;
+class LLWaterParamSet;
+
class LLFloaterRegionInfo : public LLFloater
{
friend class LLFloaterReg;
@@ -79,6 +88,7 @@ public:
static LLPanelEstateInfo* getPanelEstate();
static LLPanelEstateCovenant* getPanelCovenant();
+ static LLPanelRegionTerrainInfo* getPanelRegionTerrain();
// from LLPanel
virtual void refresh();
@@ -96,6 +106,7 @@ private:
boost::signals2::connection mConsoleReplySignalConnection;;
protected:
+ void onTabSelected(const LLSD& param);
void refreshFromRegion(LLViewerRegion* region);
// member data
@@ -208,44 +219,25 @@ private:
/////////////////////////////////////////////////////////////////////////////
-class LLPanelRegionTextureInfo : public LLPanelRegionInfo
+class LLPanelRegionTerrainInfo : public LLPanelRegionInfo
{
+ LOG_CLASS(LLPanelRegionTerrainInfo);
+
public:
- LLPanelRegionTextureInfo();
- ~LLPanelRegionTextureInfo() {}
-
- virtual bool refreshFromRegion(LLViewerRegion* region);
-
- // LLPanel && LLView
- virtual BOOL postBuild();
+ LLPanelRegionTerrainInfo() : LLPanelRegionInfo() {}
+ ~LLPanelRegionTerrainInfo() {}
-protected:
- virtual BOOL sendUpdate();
+ virtual BOOL postBuild(); // LLPanel
- static void onClickDump(void* data);
- BOOL validateTextureSizes();
-};
+ virtual bool refreshFromRegion(LLViewerRegion* region); // refresh local settings from region update from simulator
+ void setEnvControls(bool available); // Whether environment settings are available for this region
-/////////////////////////////////////////////////////////////////////////////
+ BOOL validateTextureSizes();
-class LLPanelRegionTerrainInfo : public LLPanelRegionInfo
-{
-public:
- LLPanelRegionTerrainInfo()
- : LLPanelRegionInfo() {}
- ~LLPanelRegionTerrainInfo() {}
- // LLPanel
- virtual BOOL postBuild();
-
- virtual bool refreshFromRegion(LLViewerRegion* region);
+ //static void onChangeAnything(LLUICtrl* ctrl, void* userData); // callback for any change, to enable commit button
-protected:
virtual BOOL sendUpdate();
- void onChangeUseEstateTime();
- void onChangeFixedSun();
- void onChangeSunHour();
-
static void onClickDownloadRaw(void*);
static void onClickUploadRaw(void*);
static void onClickBakeTerrain(void*);
@@ -312,23 +304,9 @@ public:
virtual BOOL postBuild();
virtual void updateChild(LLUICtrl* child_ctrl);
virtual void refresh();
-
- U32 computeEstateFlags();
- void setEstateFlags(U32 flags);
-
- BOOL getGlobalTime();
- void setGlobalTime(bool b);
-
- BOOL getFixedSun();
- F32 getSunHour();
- void setSunHour(F32 sun_hour);
+ void refreshFromEstate();
- const std::string getEstateName() const;
- void setEstateName(const std::string& name);
-
- U32 getEstateID() const { return mEstateID; }
- void setEstateID(U32 estate_id) { mEstateID = estate_id; }
static bool isLindenEstate();
const std::string getOwnerName() const;
@@ -337,14 +315,11 @@ public:
// If visible from mainland, allowed agent and allowed groups
// are ignored, so must disable UI.
void setAccessAllowedEnabled(bool enable_agent, bool enable_group, bool enable_ban);
-
protected:
virtual BOOL sendUpdate();
// confirmation dialog callback
bool callbackChangeLindenEstate(const LLSD& notification, const LLSD& response);
- void commitEstateInfoDataserver();
- bool commitEstateInfoCaps();
void commitEstateAccess();
void commitEstateManagers();
@@ -417,4 +392,66 @@ protected:
EAssetStatus mAssetStatus;
};
+/////////////////////////////////////////////////////////////////////////////
+
+class LLPanelEnvironmentInfo : public LLPanelRegionInfo
+{
+ LOG_CLASS(LLPanelEnvironmentInfo);
+
+public:
+ LLPanelEnvironmentInfo();
+
+ // LLPanel
+ /*virtual*/ BOOL postBuild();
+ /*virtual*/ void onOpen(const LLSD& key);
+
+ // LLView
+ /*virtual*/ void handleVisibilityChange(BOOL new_visibility);
+
+ // LLPanelRegionInfo
+ /*virtual*/ bool refreshFromRegion(LLViewerRegion* region);
+
+private:
+ void refresh();
+ void setControlsEnabled(bool enabled);
+ void setApplyProgress(bool started);
+ void setDirty(bool dirty);
+
+ void sendRegionSunUpdate();
+ void fixEstateSun();
+
+ void populateWaterPresetsList();
+ void populateSkyPresetsList();
+ void populateDayCyclesList();
+
+ bool getSelectedWaterParams(LLSD& water_params);
+ bool getSelectedSkyParams(LLSD& sky_params, std::string& preset_name);
+ bool getSelectedDayCycleParams(LLSD& day_cycle, LLSD& sky_map, short& scope);
+
+ void onSwitchRegionSettings();
+ void onSwitchDayCycle();
+
+ void onSelectWaterPreset();
+ void onSelectSkyPreset();
+ void onSelectDayCycle();
+
+ void onBtnApply();
+ void onBtnCancel();
+
+ void onRegionSettingschange();
+ void onRegionSettingsApplied(bool ok);
+
+ /// New environment settings that are being applied to the region.
+ LLEnvironmentSettings mNewRegionSettings;
+
+ bool mEnableEditing;
+
+ LLRadioGroup* mRegionSettingsRadioGroup;
+ LLRadioGroup* mDayCycleSettingsRadioGroup;
+
+ LLComboBox* mWaterPresetCombo;
+ LLComboBox* mSkyPresetCombo;
+ LLComboBox* mDayCyclePresetCombo;
+};
+
#endif
diff --git a/indra/newview/llfloatersearch.cpp b/indra/newview/llfloatersearch.cpp
index c8fe380710..d5806e375c 100644
--- a/indra/newview/llfloatersearch.cpp
+++ b/indra/newview/llfloatersearch.cpp
@@ -38,7 +38,6 @@
#include "llui.h"
#include "llviewercontrol.h"
#include "llweb.h"
-#include "llversioninfo.h"
// support secondlife:///app/search/{CATEGORY}/{QUERY} SLapps
class LLSearchHandler : public LLCommandHandler
@@ -204,15 +203,7 @@ void LLFloaterSearch::search(const LLSD &key)
// get the search URL and expand all of the substitutions
// (also adds things like [LANGUAGE], [VERSION], [OS], etc.)
- std::string url;
- if (LLVersionInfo::getChannel().find("Beta") != std::string::npos)
- {
- url = gSavedSettings.getString("SearchURLBeta");
- }
- else
- {
- url = gSavedSettings.getString("SearchURL");
- }
+ std::string url = gSavedSettings.getString("SearchURL");
url = LLWeb::expandURLSubstitutions(url, subs);
// and load the URL in the web view
diff --git a/indra/newview/llfloatersellland.cpp b/indra/newview/llfloatersellland.cpp
index 8558a1277c..3434841d09 100644
--- a/indra/newview/llfloatersellland.cpp
+++ b/indra/newview/llfloatersellland.cpp
@@ -41,6 +41,7 @@
#include "llviewerparcelmgr.h"
#include "lluictrlfactory.h"
#include "llviewerwindow.h"
+#include "lltrans.h"
class LLAvatarName;
@@ -451,7 +452,7 @@ void LLFloaterSellLandUI::doSellLand(void *userdata)
// Do a confirmation
S32 sale_price = self->getChild<LLUICtrl>("price")->getValue();
S32 area = parcel->getArea();
- std::string authorizedBuyerName = "Anyone";
+ std::string authorizedBuyerName = LLTrans::getString("Anyone");
bool sell_to_anyone = true;
if ("user" == self->getChild<LLUICtrl>("sell_to")->getValue().asString())
{
diff --git a/indra/newview/llfloatersounddevices.cpp b/indra/newview/llfloatersounddevices.cpp
index 9fe7c7f9dd..e692f1735a 100644
--- a/indra/newview/llfloatersounddevices.cpp
+++ b/indra/newview/llfloatersounddevices.cpp
@@ -68,6 +68,9 @@ BOOL LLFloaterSoundDevices::postBuild()
if (panel)
{
panel->setUseTuningMode(false);
+ getChild<LLUICtrl>("voice_input_device")->setCommitCallback(boost::bind(&LLPanelVoiceDeviceSettings::apply, panel));
+ getChild<LLUICtrl>("voice_output_device")->setCommitCallback(boost::bind(&LLPanelVoiceDeviceSettings::apply, panel));
+ getChild<LLUICtrl>("mic_volume_slider")->setCommitCallback(boost::bind(&LLPanelVoiceDeviceSettings::apply, panel));
}
return TRUE;
}
diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp
index 891641b159..2cca9528c9 100644
--- a/indra/newview/llfloatertools.cpp
+++ b/indra/newview/llfloatertools.cpp
@@ -36,7 +36,6 @@
#include "llagentcamera.h"
#include "llbutton.h"
#include "llcheckboxctrl.h"
-#include "llcombobox.h"
#include "lldraghandle.h"
#include "llerror.h"
#include "llfloaterbuildoptions.h"
@@ -85,6 +84,8 @@
#include "llviewerwindow.h"
#include "llvovolume.h"
#include "lluictrlfactory.h"
+#include "llaccountingquotamanager.h"
+#include "llmeshrepository.h"
// Globals
LLFloaterTools *gFloaterTools = NULL;
@@ -99,6 +100,7 @@ const std::string PANEL_NAMES[LLFloaterTools::PANEL_COUNT] =
std::string("Content"), // PANEL_CONTENTS,
};
+
// Local prototypes
void commit_select_component(void *data);
void click_show_more(void*);
@@ -114,7 +116,6 @@ void commit_radio_group_focus(LLUICtrl* ctrl);
void commit_radio_group_move(LLUICtrl* ctrl);
void commit_radio_group_edit(LLUICtrl* ctrl);
void commit_radio_group_land(LLUICtrl* ctrl);
-void commit_grid_mode(LLUICtrl *);
void commit_slider_zoom(LLUICtrl *ctrl);
@@ -232,7 +233,6 @@ BOOL LLFloaterTools::postBuild()
getChild<LLUICtrl>("checkbox uniform")->setValue((BOOL)gSavedSettings.getBOOL("ScaleUniform"));
mCheckStretchTexture = getChild<LLCheckBoxCtrl>("checkbox stretch textures");
getChild<LLUICtrl>("checkbox stretch textures")->setValue((BOOL)gSavedSettings.getBOOL("ScaleStretchTextures"));
- mComboGridMode = getChild<LLComboBox>("combobox grid mode");
mCheckStretchUniformLabel = getChild<LLTextBox>("checkbox uniform label");
//
@@ -267,6 +267,8 @@ BOOL LLFloaterTools::postBuild()
// the setting stores the actual force multiplier, but the slider is logarithmic, so we convert here
getChild<LLUICtrl>("slider force")->setValue(log10(gSavedSettings.getF32("LandBrushForce")));
+ mCostTextBorder = getChild<LLViewBorder>("cost_text_border");
+
mTab = getChild<LLTabContainer>("Object Info Tabs");
if(mTab)
{
@@ -309,7 +311,6 @@ LLFloaterTools::LLFloaterTools(const LLSD& key)
mCheckSnapToGrid(NULL),
mBtnGridOptions(NULL),
mTitleMedia(NULL),
- mComboGridMode(NULL),
mCheckStretchUniform(NULL),
mCheckStretchTexture(NULL),
mCheckStretchUniformLabel(NULL),
@@ -342,6 +343,7 @@ LLFloaterTools::LLFloaterTools(const LLSD& key)
mPanelFace(NULL),
mPanelLandInfo(NULL),
+ mCostTextBorder(NULL),
mTabLand(NULL),
mDirty(TRUE),
mNeedMediaTitle(TRUE)
@@ -365,7 +367,6 @@ LLFloaterTools::LLFloaterTools(const LLSD& key)
mCommitCallbackRegistrar.add("BuildTool.selectComponent", boost::bind(&commit_select_component, this));
mCommitCallbackRegistrar.add("BuildTool.gridOptions", boost::bind(&LLFloaterTools::onClickGridOptions,this));
mCommitCallbackRegistrar.add("BuildTool.applyToSelection", boost::bind(&click_apply_to_selection, this));
- mCommitCallbackRegistrar.add("BuildTool.gridMode", boost::bind(&commit_grid_mode,_1));
mCommitCallbackRegistrar.add("BuildTool.commitRadioLand", boost::bind(&commit_radio_group_land,_1));
mCommitCallbackRegistrar.add("BuildTool.LandBrushForce", boost::bind(&commit_slider_dozer_force,_1));
mCommitCallbackRegistrar.add("BuildTool.AddMedia", boost::bind(&LLFloaterTools::onClickBtnAddMedia,this));
@@ -421,15 +422,15 @@ void LLFloaterTools::refresh()
// Refresh object and prim count labels
LLLocale locale(LLLocale::USER_LOCALE);
-
- if ((gAgent.getRegion() && gAgent.getRegion()->getCapability("GetMesh").empty()) || !gSavedSettings.getBOOL("MeshEnabled"))
+#if 0
+ if (!gMeshRepo.meshRezEnabled())
{
std::string obj_count_string;
LLResMgr::getInstance()->getIntegerString(obj_count_string, LLSelectMgr::getInstance()->getSelection()->getRootObjectCount());
- getChild<LLUICtrl>("obj_count")->setTextArg("[COUNT]", obj_count_string);
+ getChild<LLUICtrl>("selection_count")->setTextArg("[OBJ_COUNT]", obj_count_string);
std::string prim_count_string;
LLResMgr::getInstance()->getIntegerString(prim_count_string, LLSelectMgr::getInstance()->getSelection()->getObjectCount());
- getChild<LLUICtrl>("prim_count")->setTextArg("[COUNT]", prim_count_string);
+ getChild<LLUICtrl>("selection_count")->setTextArg("[PRIM_COUNT]", prim_count_string);
// calculate selection rendering cost
if (sShowObjectCost)
@@ -447,57 +448,52 @@ void LLFloaterTools::refresh()
getChildView("RenderingCost")->setEnabled(have_selection && sShowObjectCost);
}
else
+#endif
{
- // Get the number of objects selected
- std::string root_object_count_string;
- std::string object_count_string;
-
- LLResMgr::getInstance()->getIntegerString(
- root_object_count_string,
- LLSelectMgr::getInstance()->getSelection()->getRootObjectCount());
- LLResMgr::getInstance()->getIntegerString(
- object_count_string,
- LLSelectMgr::getInstance()->getSelection()->getObjectCount());
-
- F32 obj_cost =
- LLSelectMgr::getInstance()->getSelection()->getSelectedObjectCost();
- F32 link_cost =
- LLSelectMgr::getInstance()->getSelection()->getSelectedLinksetCost();
- F32 obj_physics_cost =
- LLSelectMgr::getInstance()->getSelection()->getSelectedPhysicsCost();
- F32 link_physics_cost =
- LLSelectMgr::getInstance()->getSelection()->getSelectedLinksetPhysicsCost();
-
- // Update the text for the counts
- childSetTextArg(
- "linked_set_count",
- "[COUNT]",
- root_object_count_string);
- childSetTextArg("object_count", "[COUNT]", object_count_string);
-
- // Update the text for the resource costs
- childSetTextArg("linked_set_cost","[COST]",llformat("%.1f", link_cost));
- childSetTextArg("object_cost", "[COST]", llformat("%.1f", obj_cost));
- childSetTextArg("linked_set_cost","[PHYSICS]",llformat("%.1f", link_physics_cost));
- childSetTextArg("object_cost", "[PHYSICS]", llformat("%.1f", obj_physics_cost));
-
- // Display rendering cost if needed
- if (sShowObjectCost)
+ F32 link_phys_cost = LLSelectMgr::getInstance()->getSelection()->getSelectedLinksetPhysicsCost();
+ F32 link_cost = LLSelectMgr::getInstance()->getSelection()->getSelectedLinksetCost();
+ S32 prim_count = LLSelectMgr::getInstance()->getSelection()->getObjectCount();
+ S32 link_count = LLSelectMgr::getInstance()->getSelection()->getRootObjectCount();
+
+ LLStringUtil::format_map_t selection_args;
+ selection_args["OBJ_COUNT"] = llformat("%.1d", link_count);
+ selection_args["PRIM_COUNT"] = llformat("%.1d", prim_count);
+
+ std::ostringstream selection_info;
+
+ bool show_adv_weight = gSavedSettings.getBOOL("ShowAdvancedBuilderOptions");
+ bool show_mesh_cost = gMeshRepo.meshRezEnabled();
+
+ if (show_mesh_cost)
{
- std::string prim_cost_string;
- S32 cost = LLSelectMgr::getInstance()->getSelection()->getSelectedObjectRenderCost();
- LLResMgr::getInstance()->getIntegerString(prim_cost_string, cost);
- getChild<LLUICtrl>("RenderingCost")->setTextArg("[COUNT]", prim_cost_string);
+ LLStringUtil::format_map_t prim_equiv_args;
+ prim_equiv_args["SEL_WEIGHT"] = llformat("%.1d", (S32)link_cost);
+ selection_args["PE_STRING"] = getString("status_selectprimequiv", prim_equiv_args);
+ }
+ else
+ {
+ selection_args["PE_STRING"] = "";
}
+ selection_info << getString("status_selectcount", selection_args);
- // disable the object and prim counts if nothing selected
- bool have_selection = ! LLSelectMgr::getInstance()->getSelection()->isEmpty();
- childSetEnabled("linked_set_count", have_selection);
- childSetEnabled("object_count", have_selection);
- childSetEnabled("linked_set_cost", have_selection);
- childSetEnabled("object_cost", have_selection);
- getChildView("RenderingCost")->setEnabled(have_selection && sShowObjectCost);
+ if (show_adv_weight)
+ {
+ selection_info << ",";
+
+ childSetTextArg("selection_weight", "[PHYS_WEIGHT]", llformat("%.1f", link_phys_cost));
+ childSetTextArg("selection_weight", "[DISP_WEIGHT]", llformat("%.1d", calcRenderCost()));
+ }
+ else
+ {
+ selection_info<<".";
+ }
+ getChild<LLTextBox>("selection_count")->setText(selection_info.str());
+
+ bool have_selection = !LLSelectMgr::getInstance()->getSelection()->isEmpty();
+ childSetVisible("selection_count", have_selection);
+ childSetVisible("selection_weight", have_selection && show_adv_weight);
+ childSetVisible("selection_empty", !have_selection);
}
@@ -662,33 +658,6 @@ void LLFloaterTools::updatePopup(LLCoordGL center, MASK mask)
mRadioGroupEdit->setValue("radio select face");
}
- if (mComboGridMode)
- {
- mComboGridMode->setVisible( edit_visible );
- S32 index = mComboGridMode->getCurrentIndex();
- mComboGridMode->removeall();
-
- switch (mObjectSelection->getSelectType())
- {
- case SELECT_TYPE_HUD:
- mComboGridMode->add(getString("grid_screen_text"));
- mComboGridMode->add(getString("grid_local_text"));
- //mComboGridMode->add(getString("grid_reference_text"));
- break;
- case SELECT_TYPE_WORLD:
- mComboGridMode->add(getString("grid_world_text"));
- mComboGridMode->add(getString("grid_local_text"));
- mComboGridMode->add(getString("grid_reference_text"));
- break;
- case SELECT_TYPE_ATTACHMENT:
- mComboGridMode->add(getString("grid_attachment_text"));
- mComboGridMode->add(getString("grid_local_text"));
- mComboGridMode->add(getString("grid_reference_text"));
- break;
- }
-
- mComboGridMode->setCurrentByIndex(index);
- }
// Snap to grid disabled for grab tool - very confusing
if (mCheckSnapToGrid) mCheckSnapToGrid->setVisible( edit_visible /* || tool == LLToolGrab::getInstance() */ );
if (mBtnGridOptions) mBtnGridOptions->setVisible( edit_visible /* || tool == LLToolGrab::getInstance() */ );
@@ -737,6 +706,8 @@ void LLFloaterTools::updatePopup(LLCoordGL center, MASK mask)
// Land buttons
BOOL land_visible = (tool == LLToolBrushLand::getInstance() || tool == LLToolSelectLand::getInstance() );
+ mCostTextBorder->setVisible(!land_visible);
+
if (mBtnLand) mBtnLand ->setToggleState( land_visible );
mRadioGroupLand->setVisible( land_visible );
@@ -789,17 +760,11 @@ void LLFloaterTools::updatePopup(LLCoordGL center, MASK mask)
getChildView("Strength:")->setVisible( land_visible);
}
- bool show_mesh_cost = gAgent.getRegion() &&
- !gAgent.getRegion()->getCapability("GetMesh").empty() &&
- gSavedSettings.getBOOL("MeshEnabled");
-
- getChildView("obj_count")->setVisible( !land_visible && !show_mesh_cost);
- getChildView("prim_count")->setVisible( !land_visible && !show_mesh_cost);
- getChildView("linked_set_count")->setVisible( !land_visible && show_mesh_cost);
- getChildView("linked_set_cost")->setVisible( !land_visible && show_mesh_cost);
- getChildView("object_count")->setVisible( !land_visible && show_mesh_cost);
- getChildView("object_cost")->setVisible( !land_visible && show_mesh_cost);
- getChildView("RenderingCost")->setVisible( !land_visible && sShowObjectCost);
+ bool have_selection = !LLSelectMgr::getInstance()->getSelection()->isEmpty();
+
+ getChildView("selection_count")->setVisible(!land_visible && have_selection);
+ getChildView("selection_weight")->setVisible(!land_visible && have_selection && gSavedSettings.getBOOL("ShowAdvancedBuilderOptions"));
+ getChildView("selection_empty")->setVisible(!land_visible && !have_selection);
mTab->setVisible(!land_visible);
mPanelLandInfo->setVisible(land_visible);
@@ -1032,13 +997,6 @@ void commit_select_component(void *data)
}
}
-void commit_grid_mode(LLUICtrl *ctrl)
-{
- LLComboBox* combo = (LLComboBox*)ctrl;
-
- LLSelectMgr::getInstance()->setGridMode((EGridMode)combo->getCurrentIndex());
-}
-
// static
void LLFloaterTools::setObjectType( LLPCode pcode )
{
diff --git a/indra/newview/llfloatertools.h b/indra/newview/llfloatertools.h
index 32922a1c09..8c4cb721d3 100644
--- a/indra/newview/llfloatertools.h
+++ b/indra/newview/llfloatertools.h
@@ -32,7 +32,6 @@
#include "llparcelselection.h"
class LLButton;
-class LLComboBox;
class LLCheckBoxCtrl;
class LLPanelPermissions;
class LLPanelObject;
@@ -139,7 +138,6 @@ public:
LLCheckBoxCtrl* mCheckSnapToGrid;
LLButton* mBtnGridOptions;
- LLComboBox* mComboGridMode;
LLCheckBoxCtrl* mCheckStretchUniform;
LLCheckBoxCtrl* mCheckStretchTexture;
@@ -178,6 +176,8 @@ public:
LLPanelFace *mPanelFace;
LLPanelLandInfo *mPanelLandInfo;
+ LLViewBorder* mCostTextBorder;
+
LLTabContainer* mTabLand;
LLParcelSelectionHandle mParcelSelection;
diff --git a/indra/newview/llfloaterwater.cpp b/indra/newview/llfloaterwater.cpp
deleted file mode 100644
index be4b144f41..0000000000
--- a/indra/newview/llfloaterwater.cpp
+++ /dev/null
@@ -1,625 +0,0 @@
-/**
- * @file llfloaterwater.cpp
- * @brief LLFloaterWater class definition
- *
- * $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 "llfloaterwater.h"
-
-#include "pipeline.h"
-#include "llsky.h"
-
-#include "llfloaterreg.h"
-#include "llsliderctrl.h"
-#include "llspinctrl.h"
-#include "llcolorswatch.h"
-#include "llcheckboxctrl.h"
-#include "lltexturectrl.h"
-#include "lluictrlfactory.h"
-#include "llviewercamera.h"
-#include "llcombobox.h"
-#include "lllineeditor.h"
-#include "llnotificationsutil.h"
-#include "llfloaterdaycycle.h"
-#include "llboost.h"
-#include "llmultisliderctrl.h"
-
-#include "v4math.h"
-#include "llviewerdisplay.h"
-#include "llviewercontrol.h"
-#include "llviewerwindow.h"
-#include "llsavedsettingsglue.h"
-
-#include "llwaterparamset.h"
-#include "llwaterparammanager.h"
-#include "llpostprocess.h"
-
-#undef max
-
-std::set<std::string> LLFloaterWater::sDefaultPresets;
-
-LLFloaterWater::LLFloaterWater(const LLSD& key)
- : LLFloater(key)
-{
-}
-
-LLFloaterWater::~LLFloaterWater()
-{
-}
-BOOL LLFloaterWater::postBuild()
-{
-
- std::string def_water = getString("WLDefaultWaterNames");
-
- // no editing or deleting of the blank string
- sDefaultPresets.insert("");
- boost_tokenizer tokens(def_water, boost::char_separator<char>(":"));
- for (boost_tokenizer::iterator token_iter = tokens.begin(); token_iter != tokens.end(); ++token_iter)
- {
- std::string tok(*token_iter);
- sDefaultPresets.insert(tok);
- }
-
- // add the combo boxes
- LLComboBox* comboBox = getChild<LLComboBox>("WaterPresetsCombo");
-
- if(comboBox != NULL) {
-
- std::map<std::string, LLWaterParamSet>::iterator mIt =
- LLWaterParamManager::instance()->mParamList.begin();
- for(; mIt != LLWaterParamManager::instance()->mParamList.end(); mIt++)
- {
- comboBox->add(mIt->first);
- }
-
- // set defaults on combo boxes
- comboBox->selectByValue(LLSD("Default"));
- }
- // load it up
- initCallbacks();
- syncMenu();
- return TRUE;
-}
-void LLFloaterWater::initCallbacks(void) {
-
- LLWaterParamManager * param_mgr = LLWaterParamManager::instance();
-
- getChild<LLUICtrl>("WaterFogColor")->setCommitCallback(boost::bind(&LLFloaterWater::onWaterFogColorMoved, this, _1, &param_mgr->mFogColor));
-
- //
- getChild<LLUICtrl>("WaterGlow")->setCommitCallback(boost::bind(&LLFloaterWater::onColorControlAMoved, this, _1, &param_mgr->mFogColor));
-
- // fog density
- getChild<LLUICtrl>("WaterFogDensity")->setCommitCallback(boost::bind(&LLFloaterWater::onExpFloatControlMoved, this, _1, &param_mgr->mFogDensity));
- getChild<LLUICtrl>("WaterUnderWaterFogMod")->setCommitCallback(boost::bind(&LLFloaterWater::onFloatControlMoved, this, _1, &param_mgr->mUnderWaterFogMod));
-
- // blue density
- getChild<LLUICtrl>("WaterNormalScaleX")->setCommitCallback(boost::bind(&LLFloaterWater::onVector3ControlXMoved, this, _1, &param_mgr->mNormalScale));
- getChild<LLUICtrl>("WaterNormalScaleY")->setCommitCallback(boost::bind(&LLFloaterWater::onVector3ControlYMoved, this, _1, &param_mgr->mNormalScale));
- getChild<LLUICtrl>("WaterNormalScaleZ")->setCommitCallback(boost::bind(&LLFloaterWater::onVector3ControlZMoved, this, _1, &param_mgr->mNormalScale));
-
- // fresnel
- getChild<LLUICtrl>("WaterFresnelScale")->setCommitCallback(boost::bind(&LLFloaterWater::onFloatControlMoved, this, _1, &param_mgr->mFresnelScale));
- getChild<LLUICtrl>("WaterFresnelOffset")->setCommitCallback(boost::bind(&LLFloaterWater::onFloatControlMoved, this, _1, &param_mgr->mFresnelOffset));
-
- // scale above/below
- getChild<LLUICtrl>("WaterScaleAbove")->setCommitCallback(boost::bind(&LLFloaterWater::onFloatControlMoved, this, _1, &param_mgr->mScaleAbove));
- getChild<LLUICtrl>("WaterScaleBelow")->setCommitCallback(boost::bind(&LLFloaterWater::onFloatControlMoved, this, _1, &param_mgr->mScaleBelow));
-
- // blur mult
- getChild<LLUICtrl>("WaterBlurMult")->setCommitCallback(boost::bind(&LLFloaterWater::onFloatControlMoved, this, _1, &param_mgr->mBlurMultiplier));
-
- // Load/save
-// getChild<LLUICtrl>("WaterLoadPreset")->setCommitCallback(boost::bind(&LLFloaterWater::onLoadPreset, this));
- getChild<LLUICtrl>("WaterNewPreset")->setCommitCallback(boost::bind(&LLFloaterWater::onNewPreset, this));
- getChild<LLUICtrl>("WaterSavePreset")->setCommitCallback(boost::bind(&LLFloaterWater::onSavePreset, this));
- getChild<LLUICtrl>("WaterDeletePreset")->setCommitCallback(boost::bind(&LLFloaterWater::onDeletePreset, this));
-
- // wave direction
- getChild<LLUICtrl>("WaterWave1DirX")->setCommitCallback(boost::bind(&LLFloaterWater::onVector2ControlXMoved, this, _1, &param_mgr->mWave1Dir));
- getChild<LLUICtrl>("WaterWave1DirY")->setCommitCallback(boost::bind(&LLFloaterWater::onVector2ControlYMoved, this, _1, &param_mgr->mWave1Dir));
- getChild<LLUICtrl>("WaterWave2DirX")->setCommitCallback(boost::bind(&LLFloaterWater::onVector2ControlXMoved, this, _1, &param_mgr->mWave2Dir));
- getChild<LLUICtrl>("WaterWave2DirY")->setCommitCallback(boost::bind(&LLFloaterWater::onVector2ControlYMoved, this, _1, &param_mgr->mWave2Dir));
-
- getChild<LLUICtrl>("WaterPresetsCombo")->setCommitCallback(boost::bind(&LLFloaterWater::onChangePresetName, this, _1));
-
- LLTextureCtrl* textCtrl = getChild<LLTextureCtrl>("WaterNormalMap");
- textCtrl->setDefaultImageAssetID(DEFAULT_WATER_NORMAL);
- getChild<LLUICtrl>("WaterNormalMap")->setCommitCallback(boost::bind(&LLFloaterWater::onNormalMapPicked, this, _1));
-}
-
-bool LLFloaterWater::newPromptCallback(const LLSD& notification, const LLSD& response)
-{
- std::string text = response["message"].asString();
- S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
-
- if(text == "")
- {
- return false;
- }
-
- if(option == 0) {
- LLComboBox* comboBox = getChild<LLComboBox>( "WaterPresetsCombo");
-
- LLWaterParamManager * param_mgr = LLWaterParamManager::instance();
-
- // add the current parameters to the list
- // see if it's there first
- std::map<std::string, LLWaterParamSet>::iterator mIt =
- param_mgr->mParamList.find(text);
-
- // if not there, add a new one
- if(mIt == param_mgr->mParamList.end())
- {
- param_mgr->addParamSet(text, param_mgr->mCurParams);
- comboBox->add(text);
- comboBox->sortByName();
-
- comboBox->setSelectedByValue(text, true);
-
- param_mgr->savePreset(text);
-
- // otherwise, send a message to the user
- }
- else
- {
- LLNotificationsUtil::add("ExistsWaterPresetAlert");
- }
- }
- return false;
-}
-
-void LLFloaterWater::syncMenu()
-{
- bool err;
-
- LLWaterParamManager * param_mgr = LLWaterParamManager::instance();
-
- LLWaterParamSet & current_params = param_mgr->mCurParams;
-
- // blue horizon
- param_mgr->mFogColor = current_params.getVector4(param_mgr->mFogColor.mName, err);
-
- LLColor4 col = param_mgr->getFogColor();
- getChild<LLUICtrl>("WaterGlow")->setValue(col.mV[3]);
- col.mV[3] = 1.0f;
- LLColorSwatchCtrl* colCtrl = getChild<LLColorSwatchCtrl>("WaterFogColor");
-
- colCtrl->set(col);
-
- // fog and wavelets
- param_mgr->mFogDensity.mExp =
- log(current_params.getFloat(param_mgr->mFogDensity.mName, err)) /
- log(param_mgr->mFogDensity.mBase);
- param_mgr->setDensitySliderValue(param_mgr->mFogDensity.mExp);
- getChild<LLUICtrl>("WaterFogDensity")->setValue(param_mgr->mFogDensity.mExp);
-
- param_mgr->mUnderWaterFogMod.mX =
- current_params.getFloat(param_mgr->mUnderWaterFogMod.mName, err);
- getChild<LLUICtrl>("WaterUnderWaterFogMod")->setValue(param_mgr->mUnderWaterFogMod.mX);
-
- param_mgr->mNormalScale = current_params.getVector3(param_mgr->mNormalScale.mName, err);
- getChild<LLUICtrl>("WaterNormalScaleX")->setValue(param_mgr->mNormalScale.mX);
- getChild<LLUICtrl>("WaterNormalScaleY")->setValue(param_mgr->mNormalScale.mY);
- getChild<LLUICtrl>("WaterNormalScaleZ")->setValue(param_mgr->mNormalScale.mZ);
-
- // Fresnel
- param_mgr->mFresnelScale.mX = current_params.getFloat(param_mgr->mFresnelScale.mName, err);
- getChild<LLUICtrl>("WaterFresnelScale")->setValue(param_mgr->mFresnelScale.mX);
- param_mgr->mFresnelOffset.mX = current_params.getFloat(param_mgr->mFresnelOffset.mName, err);
- getChild<LLUICtrl>("WaterFresnelOffset")->setValue(param_mgr->mFresnelOffset.mX);
-
- // Scale Above/Below
- param_mgr->mScaleAbove.mX = current_params.getFloat(param_mgr->mScaleAbove.mName, err);
- getChild<LLUICtrl>("WaterScaleAbove")->setValue(param_mgr->mScaleAbove.mX);
- param_mgr->mScaleBelow.mX = current_params.getFloat(param_mgr->mScaleBelow.mName, err);
- getChild<LLUICtrl>("WaterScaleBelow")->setValue(param_mgr->mScaleBelow.mX);
-
- // blur mult
- param_mgr->mBlurMultiplier.mX = current_params.getFloat(param_mgr->mBlurMultiplier.mName, err);
- getChild<LLUICtrl>("WaterBlurMult")->setValue(param_mgr->mBlurMultiplier.mX);
-
- // wave directions
- param_mgr->mWave1Dir = current_params.getVector2(param_mgr->mWave1Dir.mName, err);
- getChild<LLUICtrl>("WaterWave1DirX")->setValue(param_mgr->mWave1Dir.mX);
- getChild<LLUICtrl>("WaterWave1DirY")->setValue(param_mgr->mWave1Dir.mY);
-
- param_mgr->mWave2Dir = current_params.getVector2(param_mgr->mWave2Dir.mName, err);
- getChild<LLUICtrl>("WaterWave2DirX")->setValue(param_mgr->mWave2Dir.mX);
- getChild<LLUICtrl>("WaterWave2DirY")->setValue(param_mgr->mWave2Dir.mY);
-
- LLTextureCtrl* textCtrl = getChild<LLTextureCtrl>("WaterNormalMap");
- textCtrl->setImageAssetID(param_mgr->getNormalMapID());
-}
-
-
-// vector control callbacks
-void LLFloaterWater::onVector3ControlXMoved(LLUICtrl* ctrl, WaterVector3Control* vectorControl)
-{
- LLSliderCtrl* sldrCtrl = static_cast<LLSliderCtrl*>(ctrl);
-
- vectorControl->mX = sldrCtrl->getValueF32();
-
- vectorControl->update(LLWaterParamManager::instance()->mCurParams);
-
- LLWaterParamManager::instance()->propagateParameters();
-}
-
-// vector control callbacks
-void LLFloaterWater::onVector3ControlYMoved(LLUICtrl* ctrl, WaterVector3Control* vectorControl)
-{
- LLSliderCtrl* sldrCtrl = static_cast<LLSliderCtrl*>(ctrl);
-
- vectorControl->mY = sldrCtrl->getValueF32();
-
- vectorControl->update(LLWaterParamManager::instance()->mCurParams);
-
- LLWaterParamManager::instance()->propagateParameters();
-}
-
-// vector control callbacks
-void LLFloaterWater::onVector3ControlZMoved(LLUICtrl* ctrl, WaterVector3Control* vectorControl)
-{
- LLSliderCtrl* sldrCtrl = static_cast<LLSliderCtrl*>(ctrl);
-
- vectorControl->mZ = sldrCtrl->getValueF32();
-
- vectorControl->update(LLWaterParamManager::instance()->mCurParams);
-
- LLWaterParamManager::instance()->propagateParameters();
-}
-
-
-// vector control callbacks
-void LLFloaterWater::onVector2ControlXMoved(LLUICtrl* ctrl, WaterVector2Control* vectorControl)
-{
- LLSliderCtrl* sldrCtrl = static_cast<LLSliderCtrl*>(ctrl);
-
- vectorControl->mX = sldrCtrl->getValueF32();
-
- vectorControl->update(LLWaterParamManager::instance()->mCurParams);
-
- LLWaterParamManager::instance()->propagateParameters();
-}
-
-// vector control callbacks
-void LLFloaterWater::onVector2ControlYMoved(LLUICtrl* ctrl, WaterVector2Control* vectorControl)
-{
- LLSliderCtrl* sldrCtrl = static_cast<LLSliderCtrl*>(ctrl);
-
- vectorControl->mY = sldrCtrl->getValueF32();
-
- vectorControl->update(LLWaterParamManager::instance()->mCurParams);
-
- LLWaterParamManager::instance()->propagateParameters();
-}
-
-// color control callbacks
-void LLFloaterWater::onColorControlRMoved(LLUICtrl* ctrl, WaterColorControl* colorControl)
-{
- LLSliderCtrl* sldrCtrl = static_cast<LLSliderCtrl*>(ctrl);
-
- colorControl->mR = sldrCtrl->getValueF32();
-
- // move i if it's the max
- if(colorControl->mR >= colorControl->mG
- && colorControl->mR >= colorControl->mB
- && colorControl->mHasSliderName)
- {
- colorControl->mI = colorControl->mR;
- std::string name = colorControl->mSliderName;
- name.append("I");
-
- getChild<LLUICtrl>(name)->setValue(colorControl->mR);
- }
-
- colorControl->update(LLWaterParamManager::instance()->mCurParams);
-
- LLWaterParamManager::instance()->propagateParameters();
-}
-
-void LLFloaterWater::onColorControlGMoved(LLUICtrl* ctrl, WaterColorControl* colorControl)
-{
- LLSliderCtrl* sldrCtrl = static_cast<LLSliderCtrl*>(ctrl);
-
- colorControl->mG = sldrCtrl->getValueF32();
-
- // move i if it's the max
- if(colorControl->mG >= colorControl->mR
- && colorControl->mG >= colorControl->mB
- && colorControl->mHasSliderName)
- {
- colorControl->mI = colorControl->mG;
- std::string name = colorControl->mSliderName;
- name.append("I");
-
- getChild<LLUICtrl>(name)->setValue(colorControl->mG);
-
- }
-
- colorControl->update(LLWaterParamManager::instance()->mCurParams);
-
- LLWaterParamManager::instance()->propagateParameters();
-}
-
-void LLFloaterWater::onColorControlBMoved(LLUICtrl* ctrl, WaterColorControl* colorControl)
-{
- LLSliderCtrl* sldrCtrl = static_cast<LLSliderCtrl*>(ctrl);
-
- colorControl->mB = sldrCtrl->getValueF32();
-
- // move i if it's the max
- if(colorControl->mB >= colorControl->mR
- && colorControl->mB >= colorControl->mG
- && colorControl->mHasSliderName)
- {
- colorControl->mI = colorControl->mB;
- std::string name = colorControl->mSliderName;
- name.append("I");
-
- getChild<LLUICtrl>(name)->setValue(colorControl->mB);
- }
-
- colorControl->update(LLWaterParamManager::instance()->mCurParams);
-
- LLWaterParamManager::instance()->propagateParameters();
-}
-
-void LLFloaterWater::onColorControlAMoved(LLUICtrl* ctrl, WaterColorControl* colorControl)
-{
- LLSliderCtrl* sldrCtrl = static_cast<LLSliderCtrl*>(ctrl);
-
- colorControl->mA = sldrCtrl->getValueF32();
-
- colorControl->update(LLWaterParamManager::instance()->mCurParams);
-
- LLWaterParamManager::instance()->propagateParameters();
-}
-
-
-void LLFloaterWater::onColorControlIMoved(LLUICtrl* ctrl, WaterColorControl* colorControl)
-{
- LLSliderCtrl* sldrCtrl = static_cast<LLSliderCtrl*>(ctrl);
-
- colorControl->mI = sldrCtrl->getValueF32();
-
- // only for sliders where we pass a name
- if(colorControl->mHasSliderName)
- {
- // set it to the top
- F32 maxVal = std::max(std::max(colorControl->mR, colorControl->mG), colorControl->mB);
- F32 iVal;
-
- iVal = colorControl->mI;
-
- // get the names of the other sliders
- std::string rName = colorControl->mSliderName;
- rName.append("R");
- std::string gName = colorControl->mSliderName;
- gName.append("G");
- std::string bName = colorControl->mSliderName;
- bName.append("B");
-
- // handle if at 0
- if(iVal == 0)
- {
- colorControl->mR = 0;
- colorControl->mG = 0;
- colorControl->mB = 0;
-
- // if all at the start
- // set them all to the intensity
- }
- else if (maxVal == 0)
- {
- colorControl->mR = iVal;
- colorControl->mG = iVal;
- colorControl->mB = iVal;
- }
- else
- {
- // add delta amounts to each
- F32 delta = (iVal - maxVal) / maxVal;
- colorControl->mR *= (1.0f + delta);
- colorControl->mG *= (1.0f + delta);
- colorControl->mB *= (1.0f + delta);
- }
-
- // set the sliders to the new vals
- getChild<LLUICtrl>(rName)->setValue(colorControl->mR);
- getChild<LLUICtrl>(gName)->setValue(colorControl->mG);
- getChild<LLUICtrl>(bName)->setValue(colorControl->mB);
- }
-
- // now update the current parameters and send them to shaders
- colorControl->update(LLWaterParamManager::instance()->mCurParams);
- LLWaterParamManager::instance()->propagateParameters();
-}
-
-void LLFloaterWater::onExpFloatControlMoved(LLUICtrl* ctrl, WaterExpFloatControl* expFloatControl)
-{
- LLSliderCtrl* sldrCtrl = static_cast<LLSliderCtrl*>(ctrl);
-
- F32 val = sldrCtrl->getValueF32();
- expFloatControl->mExp = val;
- LLWaterParamManager::instance()->setDensitySliderValue(val);
-
- expFloatControl->update(LLWaterParamManager::instance()->mCurParams);
- LLWaterParamManager::instance()->propagateParameters();
-}
-
-void LLFloaterWater::onFloatControlMoved(LLUICtrl* ctrl, WaterFloatControl* floatControl)
-{
- LLSliderCtrl* sldrCtrl = static_cast<LLSliderCtrl*>(ctrl);
-
- floatControl->mX = sldrCtrl->getValueF32() / floatControl->mMult;
-
- floatControl->update(LLWaterParamManager::instance()->mCurParams);
- LLWaterParamManager::instance()->propagateParameters();
-}
-void LLFloaterWater::onWaterFogColorMoved(LLUICtrl* ctrl, WaterColorControl* colorControl)
-{
- LLColorSwatchCtrl* swatch = static_cast<LLColorSwatchCtrl*>(ctrl);
- *colorControl = swatch->get();
-
- colorControl->update(LLWaterParamManager::instance()->mCurParams);
- LLWaterParamManager::instance()->propagateParameters();
-}
-
-void LLFloaterWater::onNormalMapPicked(LLUICtrl* ctrl)
-{
- LLTextureCtrl* textCtrl = static_cast<LLTextureCtrl*>(ctrl);
- LLUUID textID = textCtrl->getImageAssetID();
- LLWaterParamManager::instance()->setNormalMapID(textID);
-}
-
-void LLFloaterWater::onNewPreset()
-{
- LLNotificationsUtil::add("NewWaterPreset", LLSD(), LLSD(), boost::bind(&LLFloaterWater::newPromptCallback, this, _1, _2));
-}
-
-void LLFloaterWater::onSavePreset()
-{
- // get the name
- LLComboBox* comboBox = getChild<LLComboBox>("WaterPresetsCombo");
-
- // don't save the empty name
- if(comboBox->getSelectedItemLabel() == "")
- {
- return;
- }
-
- LLWaterParamManager::instance()->mCurParams.mName =
- comboBox->getSelectedItemLabel();
-
- // check to see if it's a default and shouldn't be overwritten
- std::set<std::string>::iterator sIt = sDefaultPresets.find(
- comboBox->getSelectedItemLabel());
- if(sIt != sDefaultPresets.end() && !gSavedSettings.getBOOL("WaterEditPresets"))
- {
- LLNotificationsUtil::add("WLNoEditDefault");
- return;
- }
-
- LLNotificationsUtil::add("WLSavePresetAlert", LLSD(), LLSD(), boost::bind(&LLFloaterWater::saveAlertCallback, this, _1, _2));
-}
-
-bool LLFloaterWater::saveAlertCallback(const LLSD& notification, const LLSD& response)
-{
- S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
- // if they choose save, do it. Otherwise, don't do anything
- if(option == 0)
- {
- LLWaterParamManager * param_mgr = LLWaterParamManager::instance();
-
- param_mgr->setParamSet(
- param_mgr->mCurParams.mName,
- param_mgr->mCurParams);
-
- // comment this back in to save to file
- param_mgr->savePreset(param_mgr->mCurParams.mName);
- }
- return false;
-}
-
-void LLFloaterWater::onDeletePreset()
-{
- LLComboBox* combo_box = getChild<LLComboBox>("WaterPresetsCombo");
-
- if(combo_box->getSelectedValue().asString() == "")
- {
- return;
- }
-
- LLSD args;
- args["SKY"] = combo_box->getSelectedValue().asString();
- LLNotificationsUtil::add("WLDeletePresetAlert", args, LLSD(), boost::bind(&LLFloaterWater::deleteAlertCallback, this, _1, _2));
-}
-
-bool LLFloaterWater::deleteAlertCallback(const LLSD& notification, const LLSD& response)
-{
- S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
- // if they choose delete, do it. Otherwise, don't do anything
- if(option == 0)
- {
- LLComboBox* combo_box = getChild<LLComboBox>("WaterPresetsCombo");
- LLFloaterDayCycle* day_cycle = LLFloaterReg::findTypedInstance<LLFloaterDayCycle>("env_day_cycle");
- LLComboBox* key_combo = NULL;
-
- if (day_cycle)
- {
- key_combo = day_cycle->getChild<LLComboBox>("WaterKeyPresets");
- }
-
- std::string name = combo_box->getSelectedValue().asString();
-
- // check to see if it's a default and shouldn't be deleted
- std::set<std::string>::iterator sIt = sDefaultPresets.find(name);
- if(sIt != sDefaultPresets.end())
- {
- LLNotificationsUtil::add("WaterNoEditDefault");
- return false;
- }
-
- LLWaterParamManager::instance()->removeParamSet(name, true);
-
- // remove and choose another
- S32 new_index = combo_box->getCurrentIndex();
-
- combo_box->remove(name);
-
- if(key_combo != NULL)
- {
- key_combo->remove(name);
-
- // remove from slider, as well
- day_cycle->deletePreset(name);
- }
-
- // pick the previously selected index after delete
- if(new_index > 0)
- {
- new_index--;
- }
-
- if(combo_box->getItemCount() > 0)
- {
- combo_box->setCurrentByIndex(new_index);
- }
- }
- return false;
-}
-
-
-void LLFloaterWater::onChangePresetName(LLUICtrl* ctrl)
-{
- std::string data = ctrl->getValue().asString();
- if(!data.empty())
- {
- LLWaterParamManager::instance()->loadPreset(data);
- syncMenu();
- }
-}
-
diff --git a/indra/newview/llfloaterwebcontent.cpp b/indra/newview/llfloaterwebcontent.cpp
index 058567492b..43eecbf048 100644
--- a/indra/newview/llfloaterwebcontent.cpp
+++ b/indra/newview/llfloaterwebcontent.cpp
@@ -99,7 +99,7 @@ void LLFloaterWebContent::initializeURLHistory()
}
//static
-void LLFloaterWebContent::create( const std::string &url, const std::string& target, const std::string& uuid )
+void LLFloaterWebContent::create( const std::string &url, const std::string& target, const std::string& uuid, bool show_chrome, const LLRect& preferred_media_size)
{
lldebugs << "url = " << url << ", target = " << target << ", uuid = " << uuid << llendl;
@@ -155,6 +155,20 @@ void LLFloaterWebContent::create( const std::string &url, const std::string& tar
// tell the browser instance to load the specified URL
browser->open_media(url, target);
LLViewerMedia::proxyWindowOpened(target, uuid);
+
+ browser->getChild<LLLayoutPanel>("status_bar")->setVisible(show_chrome);
+ browser->getChild<LLLayoutPanel>("nav_controls")->setVisible(show_chrome);
+
+ if (!show_chrome)
+ {
+ browser->setResizeLimits(100, 100);
+ }
+
+ if (!preferred_media_size.isEmpty())
+ {
+ //ignore x, y for now
+ browser->geometryChanged(browser->getRect().mLeft, browser->getRect().mBottom, preferred_media_size.getWidth(), preferred_media_size.getHeight());
+ }
}
}
@@ -210,7 +224,7 @@ void LLFloaterWebContent::geometryChanged(S32 x, S32 y, S32 width, S32 height)
lldebugs << "geometry change: " << geom << llendl;
- handleReshape(geom,false);
+ setShape(geom);
}
void LLFloaterWebContent::open_media(const std::string& web_url, const std::string& target)
diff --git a/indra/newview/llfloaterwebcontent.h b/indra/newview/llfloaterwebcontent.h
index ecc7e970d8..56b6ef12c8 100644
--- a/indra/newview/llfloaterwebcontent.h
+++ b/indra/newview/llfloaterwebcontent.h
@@ -46,7 +46,7 @@ public:
void initializeURLHistory();
- static void create(const std::string &url, const std::string& target, const std::string& uuid = LLStringUtil::null);
+ static void create(const std::string &url, const std::string& target, const std::string& uuid = LLStringUtil::null, bool show_chrome = true, const LLRect& preferred_media_size = LLRect() );
static void closeRequest(const std::string &uuid);
static void geometryChanged(const std::string &uuid, S32 x, S32 y, S32 width, S32 height);
diff --git a/indra/newview/llfloaterwindlight.cpp b/indra/newview/llfloaterwindlight.cpp
deleted file mode 100644
index ae98b2cf99..0000000000
--- a/indra/newview/llfloaterwindlight.cpp
+++ /dev/null
@@ -1,875 +0,0 @@
-/**
- * @file llfloaterwindlight.cpp
- * @brief LLFloaterWindLight class definition
- *
- * $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 "llfloaterwindlight.h"
-
-#include "pipeline.h"
-#include "llsky.h"
-
-#include "llfloaterreg.h"
-#include "llsliderctrl.h"
-#include "llmultislider.h"
-#include "llmultisliderctrl.h"
-#include "llnotificationsutil.h"
-#include "llspinctrl.h"
-#include "llcheckboxctrl.h"
-#include "lluictrlfactory.h"
-#include "llviewercamera.h"
-#include "llcombobox.h"
-#include "lllineeditor.h"
-#include "llfloaterdaycycle.h"
-#include "llboost.h"
-
-#include "v4math.h"
-#include "llviewerdisplay.h"
-#include "llviewercontrol.h"
-#include "llviewerwindow.h"
-#include "llsavedsettingsglue.h"
-
-#include "llwlparamset.h"
-#include "llwlparammanager.h"
-#include "llpostprocess.h"
-#include "lltabcontainer.h"
-
-
-#undef max
-
-std::set<std::string> LLFloaterWindLight::sDefaultPresets;
-
-static const F32 WL_SUN_AMBIENT_SLIDER_SCALE = 3.0f;
-
-LLFloaterWindLight::LLFloaterWindLight(const LLSD& key)
- : LLFloater(key)
-{
-}
-
-LLFloaterWindLight::~LLFloaterWindLight()
-{
-}
-
-BOOL LLFloaterWindLight::postBuild()
-{
- // add the list of presets
- std::string def_days = getString("WLDefaultSkyNames");
-
- // no editing or deleting of the blank string
- sDefaultPresets.insert("");
- boost_tokenizer tokens(def_days, boost::char_separator<char>(":"));
- for (boost_tokenizer::iterator token_iter = tokens.begin(); token_iter != tokens.end(); ++token_iter)
- {
- std::string tok(*token_iter);
- sDefaultPresets.insert(tok);
- }
-
- // add the combo boxes
- LLComboBox* comboBox = getChild<LLComboBox>("WLPresetsCombo");
-
- if(comboBox != NULL) {
-
- std::map<std::string, LLWLParamSet>::iterator mIt =
- LLWLParamManager::instance()->mParamList.begin();
- for(; mIt != LLWLParamManager::instance()->mParamList.end(); mIt++)
- {
- comboBox->add(mIt->first);
- }
-
- // entry for when we're in estate time
- comboBox->add(LLStringUtil::null);
-
- // set defaults on combo boxes
- comboBox->selectByValue(LLSD("Default"));
- }
- // load it up
- initCallbacks();
-
- syncMenu();
-
- return TRUE;
-}
-void LLFloaterWindLight::initCallbacks(void) {
-
- LLWLParamManager * param_mgr = LLWLParamManager::instance();
-
- // blue horizon
- getChild<LLUICtrl>("WLBlueHorizonR")->setCommitCallback(boost::bind(&LLFloaterWindLight::onColorControlRMoved, this, _1, &param_mgr->mBlueHorizon));
- getChild<LLUICtrl>("WLBlueHorizonG")->setCommitCallback(boost::bind(&LLFloaterWindLight::onColorControlGMoved, this, _1, &param_mgr->mBlueHorizon));
- getChild<LLUICtrl>("WLBlueHorizonB")->setCommitCallback(boost::bind(&LLFloaterWindLight::onColorControlBMoved, this, _1, &param_mgr->mBlueHorizon));
- getChild<LLUICtrl>("WLBlueHorizonI")->setCommitCallback(boost::bind(&LLFloaterWindLight::onColorControlIMoved, this, _1, &param_mgr->mBlueHorizon));
-
- // haze density, horizon, mult, and altitude
- getChild<LLUICtrl>("WLHazeDensity")->setCommitCallback(boost::bind(&LLFloaterWindLight::onColorControlRMoved, this, _1, &param_mgr->mHazeDensity));
- getChild<LLUICtrl>("WLHazeHorizon")->setCommitCallback(boost::bind(&LLFloaterWindLight::onColorControlRMoved, this, _1, &param_mgr->mHazeHorizon));
- getChild<LLUICtrl>("WLDensityMult")->setCommitCallback(boost::bind(&LLFloaterWindLight::onFloatControlMoved, this, _1, &param_mgr->mDensityMult));
- getChild<LLUICtrl>("WLMaxAltitude")->setCommitCallback(boost::bind(&LLFloaterWindLight::onFloatControlMoved, this, _1, &param_mgr->mMaxAlt));
-
- // blue density
- getChild<LLUICtrl>("WLBlueDensityR")->setCommitCallback(boost::bind(&LLFloaterWindLight::onColorControlRMoved, this, _1, &param_mgr->mBlueDensity));
- getChild<LLUICtrl>("WLBlueDensityG")->setCommitCallback(boost::bind(&LLFloaterWindLight::onColorControlGMoved, this, _1, &param_mgr->mBlueDensity));
- getChild<LLUICtrl>("WLBlueDensityB")->setCommitCallback(boost::bind(&LLFloaterWindLight::onColorControlBMoved, this, _1, &param_mgr->mBlueDensity));
- getChild<LLUICtrl>("WLBlueDensityI")->setCommitCallback(boost::bind(&LLFloaterWindLight::onColorControlIMoved, this, _1, &param_mgr->mBlueDensity));
-
- // Lighting
-
- // sunlight
- getChild<LLUICtrl>("WLSunlightR")->setCommitCallback(boost::bind(&LLFloaterWindLight::onColorControlRMoved, this, _1, &param_mgr->mSunlight));
- getChild<LLUICtrl>("WLSunlightG")->setCommitCallback(boost::bind(&LLFloaterWindLight::onColorControlGMoved, this, _1, &param_mgr->mSunlight));
- getChild<LLUICtrl>("WLSunlightB")->setCommitCallback(boost::bind(&LLFloaterWindLight::onColorControlBMoved, this, _1, &param_mgr->mSunlight));
- getChild<LLUICtrl>("WLSunlightI")->setCommitCallback(boost::bind(&LLFloaterWindLight::onColorControlIMoved, this, _1, &param_mgr->mSunlight));
-
- // glow
- getChild<LLUICtrl>("WLGlowR")->setCommitCallback(boost::bind(&LLFloaterWindLight::onGlowRMoved, this, _1, &param_mgr->mGlow));
- getChild<LLUICtrl>("WLGlowB")->setCommitCallback(boost::bind(&LLFloaterWindLight::onGlowBMoved, this, _1, &param_mgr->mGlow));
-
- // ambient
- getChild<LLUICtrl>("WLAmbientR")->setCommitCallback(boost::bind(&LLFloaterWindLight::onColorControlRMoved, this, _1, &param_mgr->mAmbient));
- getChild<LLUICtrl>("WLAmbientG")->setCommitCallback(boost::bind(&LLFloaterWindLight::onColorControlGMoved, this, _1, &param_mgr->mAmbient));
- getChild<LLUICtrl>("WLAmbientB")->setCommitCallback(boost::bind(&LLFloaterWindLight::onColorControlBMoved, this, _1, &param_mgr->mAmbient));
- getChild<LLUICtrl>("WLAmbientI")->setCommitCallback(boost::bind(&LLFloaterWindLight::onColorControlIMoved, this, _1, &param_mgr->mAmbient));
-
- // time of day
- getChild<LLUICtrl>("WLSunAngle")->setCommitCallback(boost::bind(&LLFloaterWindLight::onSunMoved, this, _1, &param_mgr->mLightnorm));
- getChild<LLUICtrl>("WLEastAngle")->setCommitCallback(boost::bind(&LLFloaterWindLight::onSunMoved, this, _1, &param_mgr->mLightnorm));
-
- // Clouds
-
- // Cloud Color
- getChild<LLUICtrl>("WLCloudColorR")->setCommitCallback(boost::bind(&LLFloaterWindLight::onColorControlRMoved, this, _1, &param_mgr->mCloudColor));
- getChild<LLUICtrl>("WLCloudColorG")->setCommitCallback(boost::bind(&LLFloaterWindLight::onColorControlGMoved, this, _1, &param_mgr->mCloudColor));
- getChild<LLUICtrl>("WLCloudColorB")->setCommitCallback(boost::bind(&LLFloaterWindLight::onColorControlBMoved, this, _1, &param_mgr->mCloudColor));
- getChild<LLUICtrl>("WLCloudColorI")->setCommitCallback(boost::bind(&LLFloaterWindLight::onColorControlIMoved, this, _1, &param_mgr->mCloudColor));
-
- // Cloud
- getChild<LLUICtrl>("WLCloudX")->setCommitCallback(boost::bind(&LLFloaterWindLight::onColorControlRMoved, this, _1, &param_mgr->mCloudMain));
- getChild<LLUICtrl>("WLCloudY")->setCommitCallback(boost::bind(&LLFloaterWindLight::onColorControlGMoved, this, _1, &param_mgr->mCloudMain));
- getChild<LLUICtrl>("WLCloudDensity")->setCommitCallback(boost::bind(&LLFloaterWindLight::onColorControlBMoved, this, _1, &param_mgr->mCloudMain));
-
- // Cloud Detail
- getChild<LLUICtrl>("WLCloudDetailX")->setCommitCallback(boost::bind(&LLFloaterWindLight::onColorControlRMoved, this, _1, &param_mgr->mCloudDetail));
- getChild<LLUICtrl>("WLCloudDetailY")->setCommitCallback(boost::bind(&LLFloaterWindLight::onColorControlGMoved, this, _1, &param_mgr->mCloudDetail));
- getChild<LLUICtrl>("WLCloudDetailDensity")->setCommitCallback(boost::bind(&LLFloaterWindLight::onColorControlBMoved, this, _1, &param_mgr->mCloudDetail));
-
- // Cloud extras
- getChild<LLUICtrl>("WLCloudCoverage")->setCommitCallback(boost::bind(&LLFloaterWindLight::onFloatControlMoved, this, _1, &param_mgr->mCloudCoverage));
- getChild<LLUICtrl>("WLCloudScale")->setCommitCallback(boost::bind(&LLFloaterWindLight::onFloatControlMoved, this, _1, &param_mgr->mCloudScale));
- getChild<LLUICtrl>("WLCloudLockX")->setCommitCallback(boost::bind(&LLFloaterWindLight::onCloudScrollXToggled, this, _1));
- getChild<LLUICtrl>("WLCloudLockY")->setCommitCallback(boost::bind(&LLFloaterWindLight::onCloudScrollYToggled, this, _1));
- getChild<LLUICtrl>("WLCloudScrollX")->setCommitCallback(boost::bind(&LLFloaterWindLight::onCloudScrollXMoved, this, _1));
- getChild<LLUICtrl>("WLCloudScrollY")->setCommitCallback(boost::bind(&LLFloaterWindLight::onCloudScrollYMoved, this, _1));
- getChild<LLUICtrl>("WLDistanceMult")->setCommitCallback(boost::bind(&LLFloaterWindLight::onFloatControlMoved, this, _1, &param_mgr->mDistanceMult));
- getChild<LLUICtrl>("DrawClassicClouds")->setCommitCallback(boost::bind(LLSavedSettingsGlue::setBOOL, _1, "SkyUseClassicClouds"));
-
- // WL Top
- getChild<LLUICtrl>("WLDayCycleMenuButton")->setCommitCallback(boost::bind(&LLFloaterWindLight::onOpenDayCycle, this));
- // Load/save
- LLComboBox* comboBox = getChild<LLComboBox>("WLPresetsCombo");
-
- //childSetAction("WLLoadPreset", onLoadPreset, comboBox);
- getChild<LLUICtrl>("WLNewPreset")->setCommitCallback(boost::bind(&LLFloaterWindLight::onNewPreset, this));
- getChild<LLUICtrl>("WLSavePreset")->setCommitCallback(boost::bind(&LLFloaterWindLight::onSavePreset, this));
- getChild<LLUICtrl>("WLDeletePreset")->setCommitCallback(boost::bind(&LLFloaterWindLight::onDeletePreset, this));
-
- comboBox->setCommitCallback(boost::bind(&LLFloaterWindLight::onChangePresetName, this, _1));
-
-
- // Dome
- getChild<LLUICtrl>("WLGamma")->setCommitCallback(boost::bind(&LLFloaterWindLight::onFloatControlMoved, this, _1, &param_mgr->mWLGamma));
- getChild<LLUICtrl>("WLStarAlpha")->setCommitCallback(boost::bind(&LLFloaterWindLight::onStarAlphaMoved, this, _1));
-}
-
-bool LLFloaterWindLight::newPromptCallback(const LLSD& notification, const LLSD& response)
-{
- std::string text = response["message"].asString();
- S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
-
- if(text == "")
- {
- return false;
- }
-
- if(option == 0) {
- LLComboBox* comboBox = getChild<LLComboBox>("WLPresetsCombo");
-
- LLFloaterDayCycle* day_cycle = LLFloaterReg::findTypedInstance<LLFloaterDayCycle>("env_day_cycle");
- LLComboBox* keyCombo = NULL;
- if(day_cycle)
- {
- keyCombo = day_cycle->getChild<LLComboBox>("WLKeyPresets");
- }
-
- // add the current parameters to the list
- // see if it's there first
- std::map<std::string, LLWLParamSet>::iterator mIt =
- LLWLParamManager::instance()->mParamList.find(text);
-
- // if not there, add a new one
- if(mIt == LLWLParamManager::instance()->mParamList.end())
- {
- LLWLParamManager::instance()->addParamSet(text,
- LLWLParamManager::instance()->mCurParams);
- comboBox->add(text);
- comboBox->sortByName();
-
- // add a blank to the bottom
- comboBox->selectFirstItem();
- if(comboBox->getSimple() == "")
- {
- comboBox->remove(0);
- }
- comboBox->add(LLStringUtil::null);
-
- comboBox->setSelectedByValue(text, true);
- if(keyCombo)
- {
- keyCombo->add(text);
- keyCombo->sortByName();
- }
- LLWLParamManager::instance()->savePreset(text);
-
- // otherwise, send a message to the user
- }
- else
- {
- LLNotificationsUtil::add("ExistsSkyPresetAlert");
- }
- }
- return false;
-}
-
-void LLFloaterWindLight::syncMenu()
-{
- bool err;
-
- LLWLParamManager * param_mgr = LLWLParamManager::instance();
-
- LLWLParamSet& currentParams = param_mgr->mCurParams;
- //std::map<std::string, LLVector4> & currentParams = param_mgr->mCurParams.mParamValues;
-
- // blue horizon
- param_mgr->mBlueHorizon = currentParams.getVector(param_mgr->mBlueHorizon.mName, err);
- getChild<LLUICtrl>("WLBlueHorizonR")->setValue(param_mgr->mBlueHorizon.r / 2.0);
- getChild<LLUICtrl>("WLBlueHorizonG")->setValue(param_mgr->mBlueHorizon.g / 2.0);
- getChild<LLUICtrl>("WLBlueHorizonB")->setValue(param_mgr->mBlueHorizon.b / 2.0);
- getChild<LLUICtrl>("WLBlueHorizonI")->setValue(
- std::max(param_mgr->mBlueHorizon.r / 2.0,
- std::max(param_mgr->mBlueHorizon.g / 2.0,
- param_mgr->mBlueHorizon.b / 2.0)));
-
- // haze density, horizon, mult, and altitude
- param_mgr->mHazeDensity = currentParams.getVector(param_mgr->mHazeDensity.mName, err);
- getChild<LLUICtrl>("WLHazeDensity")->setValue(param_mgr->mHazeDensity.r);
- param_mgr->mHazeHorizon = currentParams.getVector(param_mgr->mHazeHorizon.mName, err);
- getChild<LLUICtrl>("WLHazeHorizon")->setValue(param_mgr->mHazeHorizon.r);
- param_mgr->mDensityMult = currentParams.getVector(param_mgr->mDensityMult.mName, err);
- getChild<LLUICtrl>("WLDensityMult")->setValue(param_mgr->mDensityMult.x *
- param_mgr->mDensityMult.mult);
- param_mgr->mMaxAlt = currentParams.getVector(param_mgr->mMaxAlt.mName, err);
- getChild<LLUICtrl>("WLMaxAltitude")->setValue(param_mgr->mMaxAlt.x);
-
- // blue density
- param_mgr->mBlueDensity = currentParams.getVector(param_mgr->mBlueDensity.mName, err);
- getChild<LLUICtrl>("WLBlueDensityR")->setValue(param_mgr->mBlueDensity.r / 2.0);
- getChild<LLUICtrl>("WLBlueDensityG")->setValue(param_mgr->mBlueDensity.g / 2.0);
- getChild<LLUICtrl>("WLBlueDensityB")->setValue(param_mgr->mBlueDensity.b / 2.0);
- getChild<LLUICtrl>("WLBlueDensityI")->setValue(
- std::max(param_mgr->mBlueDensity.r / 2.0,
- std::max(param_mgr->mBlueDensity.g / 2.0, param_mgr->mBlueDensity.b / 2.0)));
-
- // Lighting
-
- // sunlight
- param_mgr->mSunlight = currentParams.getVector(param_mgr->mSunlight.mName, err);
- getChild<LLUICtrl>("WLSunlightR")->setValue(param_mgr->mSunlight.r / WL_SUN_AMBIENT_SLIDER_SCALE);
- getChild<LLUICtrl>("WLSunlightG")->setValue(param_mgr->mSunlight.g / WL_SUN_AMBIENT_SLIDER_SCALE);
- getChild<LLUICtrl>("WLSunlightB")->setValue(param_mgr->mSunlight.b / WL_SUN_AMBIENT_SLIDER_SCALE);
- getChild<LLUICtrl>("WLSunlightI")->setValue(
- std::max(param_mgr->mSunlight.r / WL_SUN_AMBIENT_SLIDER_SCALE,
- std::max(param_mgr->mSunlight.g / WL_SUN_AMBIENT_SLIDER_SCALE, param_mgr->mSunlight.b / WL_SUN_AMBIENT_SLIDER_SCALE)));
-
- // glow
- param_mgr->mGlow = currentParams.getVector(param_mgr->mGlow.mName, err);
- getChild<LLUICtrl>("WLGlowR")->setValue(2 - param_mgr->mGlow.r / 20.0f);
- getChild<LLUICtrl>("WLGlowB")->setValue(-param_mgr->mGlow.b / 5.0f);
-
- // ambient
- param_mgr->mAmbient = currentParams.getVector(param_mgr->mAmbient.mName, err);
- getChild<LLUICtrl>("WLAmbientR")->setValue(param_mgr->mAmbient.r / WL_SUN_AMBIENT_SLIDER_SCALE);
- getChild<LLUICtrl>("WLAmbientG")->setValue(param_mgr->mAmbient.g / WL_SUN_AMBIENT_SLIDER_SCALE);
- getChild<LLUICtrl>("WLAmbientB")->setValue(param_mgr->mAmbient.b / WL_SUN_AMBIENT_SLIDER_SCALE);
- getChild<LLUICtrl>("WLAmbientI")->setValue(
- std::max(param_mgr->mAmbient.r / WL_SUN_AMBIENT_SLIDER_SCALE,
- std::max(param_mgr->mAmbient.g / WL_SUN_AMBIENT_SLIDER_SCALE, param_mgr->mAmbient.b / WL_SUN_AMBIENT_SLIDER_SCALE)));
-
- getChild<LLUICtrl>("WLSunAngle")->setValue(param_mgr->mCurParams.getFloat("sun_angle",err) / F_TWO_PI);
- getChild<LLUICtrl>("WLEastAngle")->setValue(param_mgr->mCurParams.getFloat("east_angle",err) / F_TWO_PI);
-
- // Clouds
-
- // Cloud Color
- param_mgr->mCloudColor = currentParams.getVector(param_mgr->mCloudColor.mName, err);
- getChild<LLUICtrl>("WLCloudColorR")->setValue(param_mgr->mCloudColor.r);
- getChild<LLUICtrl>("WLCloudColorG")->setValue(param_mgr->mCloudColor.g);
- getChild<LLUICtrl>("WLCloudColorB")->setValue(param_mgr->mCloudColor.b);
- getChild<LLUICtrl>("WLCloudColorI")->setValue(
- std::max(param_mgr->mCloudColor.r,
- std::max(param_mgr->mCloudColor.g, param_mgr->mCloudColor.b)));
-
- // Cloud
- param_mgr->mCloudMain = currentParams.getVector(param_mgr->mCloudMain.mName, err);
- getChild<LLUICtrl>("WLCloudX")->setValue(param_mgr->mCloudMain.r);
- getChild<LLUICtrl>("WLCloudY")->setValue(param_mgr->mCloudMain.g);
- getChild<LLUICtrl>("WLCloudDensity")->setValue(param_mgr->mCloudMain.b);
-
- // Cloud Detail
- param_mgr->mCloudDetail = currentParams.getVector(param_mgr->mCloudDetail.mName, err);
- getChild<LLUICtrl>("WLCloudDetailX")->setValue(param_mgr->mCloudDetail.r);
- getChild<LLUICtrl>("WLCloudDetailY")->setValue(param_mgr->mCloudDetail.g);
- getChild<LLUICtrl>("WLCloudDetailDensity")->setValue(param_mgr->mCloudDetail.b);
-
- // Cloud extras
- param_mgr->mCloudCoverage = currentParams.getVector(param_mgr->mCloudCoverage.mName, err);
- param_mgr->mCloudScale = currentParams.getVector(param_mgr->mCloudScale.mName, err);
- getChild<LLUICtrl>("WLCloudCoverage")->setValue(param_mgr->mCloudCoverage.x);
- getChild<LLUICtrl>("WLCloudScale")->setValue(param_mgr->mCloudScale.x);
-
- // cloud scrolling
- bool lockX = !param_mgr->mCurParams.getEnableCloudScrollX();
- bool lockY = !param_mgr->mCurParams.getEnableCloudScrollY();
- getChild<LLUICtrl>("WLCloudLockX")->setValue(lockX);
- getChild<LLUICtrl>("WLCloudLockY")->setValue(lockY);
- getChild<LLUICtrl>("DrawClassicClouds")->setValue(gSavedSettings.getBOOL("SkyUseClassicClouds"));
-
- // disable if locked, enable if not
- if(lockX)
- {
- getChildView("WLCloudScrollX")->setEnabled(FALSE);
- } else {
- getChildView("WLCloudScrollX")->setEnabled(TRUE);
- }
- if(lockY)
- {
- getChildView("WLCloudScrollY")->setEnabled(FALSE);
- } else {
- getChildView("WLCloudScrollY")->setEnabled(TRUE);
- }
-
- // *HACK cloud scrolling is off my an additive of 10
- getChild<LLUICtrl>("WLCloudScrollX")->setValue(param_mgr->mCurParams.getCloudScrollX() - 10.0f);
- getChild<LLUICtrl>("WLCloudScrollY")->setValue(param_mgr->mCurParams.getCloudScrollY() - 10.0f);
-
- param_mgr->mDistanceMult = currentParams.getVector(param_mgr->mDistanceMult.mName, err);
- getChild<LLUICtrl>("WLDistanceMult")->setValue(param_mgr->mDistanceMult.x);
-
- // Tweak extras
-
- param_mgr->mWLGamma = currentParams.getVector(param_mgr->mWLGamma.mName, err);
- getChild<LLUICtrl>("WLGamma")->setValue(param_mgr->mWLGamma.x);
-
- getChild<LLUICtrl>("WLStarAlpha")->setValue(param_mgr->mCurParams.getStarBrightness());
-
- LLTabContainer* tab = getChild<LLTabContainer>("WindLight Tabs");
- LLPanel* panel = getChild<LLPanel>("Scattering");
-
- tab->enableTabButton(tab->getIndexForPanel(panel), gSavedSettings.getBOOL("RenderDeferredGI"));
-}
-
-
-// color control callbacks
-void LLFloaterWindLight::onColorControlRMoved(LLUICtrl* ctrl, WLColorControl* colorControl)
-{
- deactivateAnimator();
-
- LLSliderCtrl* sldrCtrl = static_cast<LLSliderCtrl*>(ctrl);
-
- colorControl->r = sldrCtrl->getValueF32();
- if(colorControl->isSunOrAmbientColor) {
- colorControl->r *= 3;
- }
- if(colorControl->isBlueHorizonOrDensity) {
- colorControl->r *= 2;
- }
-
- // move i if it's the max
- if(colorControl->r >= colorControl->g && colorControl->r >= colorControl->b
- && colorControl->hasSliderName) {
- colorControl->i = colorControl->r;
- std::string name = colorControl->mSliderName;
- name.append("I");
-
- if(colorControl->isSunOrAmbientColor) {
- getChild<LLUICtrl>(name)->setValue(colorControl->r / 3);
- } else if(colorControl->isBlueHorizonOrDensity) {
- getChild<LLUICtrl>(name)->setValue(colorControl->r / 2);
- } else {
- getChild<LLUICtrl>(name)->setValue(colorControl->r);
- }
- }
-
- colorControl->update(LLWLParamManager::instance()->mCurParams);
-
- LLWLParamManager::instance()->propagateParameters();
-}
-
-void LLFloaterWindLight::onColorControlGMoved(LLUICtrl* ctrl, WLColorControl* colorControl)
-{
- deactivateAnimator();
-
- LLSliderCtrl* sldrCtrl = static_cast<LLSliderCtrl*>(ctrl);
-
- colorControl->g = sldrCtrl->getValueF32();
- if(colorControl->isSunOrAmbientColor) {
- colorControl->g *= 3;
- }
- if(colorControl->isBlueHorizonOrDensity) {
- colorControl->g *= 2;
- }
-
- // move i if it's the max
- if(colorControl->g >= colorControl->r && colorControl->g >= colorControl->b
- && colorControl->hasSliderName) {
- colorControl->i = colorControl->g;
- std::string name = colorControl->mSliderName;
- name.append("I");
-
- if(colorControl->isSunOrAmbientColor) {
- getChild<LLUICtrl>(name)->setValue(colorControl->g / 3);
- } else if(colorControl->isBlueHorizonOrDensity) {
- getChild<LLUICtrl>(name)->setValue(colorControl->g / 2);
- } else {
- getChild<LLUICtrl>(name)->setValue(colorControl->g);
- }
- }
-
- colorControl->update(LLWLParamManager::instance()->mCurParams);
-
- LLWLParamManager::instance()->propagateParameters();
-}
-
-void LLFloaterWindLight::onColorControlBMoved(LLUICtrl* ctrl, WLColorControl* colorControl)
-{
- deactivateAnimator();
-
- LLSliderCtrl* sldrCtrl = static_cast<LLSliderCtrl*>(ctrl);
-
- colorControl->b = sldrCtrl->getValueF32();
- if(colorControl->isSunOrAmbientColor) {
- colorControl->b *= 3;
- }
- if(colorControl->isBlueHorizonOrDensity) {
- colorControl->b *= 2;
- }
-
- // move i if it's the max
- if(colorControl->b >= colorControl->r && colorControl->b >= colorControl->g
- && colorControl->hasSliderName) {
- colorControl->i = colorControl->b;
- std::string name = colorControl->mSliderName;
- name.append("I");
-
- if(colorControl->isSunOrAmbientColor) {
- getChild<LLUICtrl>(name)->setValue(colorControl->b / 3);
- } else if(colorControl->isBlueHorizonOrDensity) {
- getChild<LLUICtrl>(name)->setValue(colorControl->b / 2);
- } else {
- getChild<LLUICtrl>(name)->setValue(colorControl->b);
- }
- }
-
- colorControl->update(LLWLParamManager::instance()->mCurParams);
-
- LLWLParamManager::instance()->propagateParameters();
-}
-
-void LLFloaterWindLight::onColorControlIMoved(LLUICtrl* ctrl, WLColorControl* colorControl)
-{
- deactivateAnimator();
-
- LLSliderCtrl* sldrCtrl = static_cast<LLSliderCtrl*>(ctrl);
-
- colorControl->i = sldrCtrl->getValueF32();
-
- // only for sliders where we pass a name
- if(colorControl->hasSliderName) {
-
- // set it to the top
- F32 maxVal = std::max(std::max(colorControl->r, colorControl->g), colorControl->b);
- F32 iVal;
-
- if(colorControl->isSunOrAmbientColor)
- {
- iVal = colorControl->i * 3;
- }
- else if(colorControl->isBlueHorizonOrDensity)
- {
- iVal = colorControl->i * 2;
- }
- else
- {
- iVal = colorControl->i;
- }
-
- // get the names of the other sliders
- std::string rName = colorControl->mSliderName;
- rName.append("R");
- std::string gName = colorControl->mSliderName;
- gName.append("G");
- std::string bName = colorControl->mSliderName;
- bName.append("B");
-
- // handle if at 0
- if(iVal == 0) {
- colorControl->r = 0;
- colorControl->g = 0;
- colorControl->b = 0;
-
- // if all at the start
- // set them all to the intensity
- } else if (maxVal == 0) {
- colorControl->r = iVal;
- colorControl->g = iVal;
- colorControl->b = iVal;
-
- } else {
-
- // add delta amounts to each
- F32 delta = (iVal - maxVal) / maxVal;
- colorControl->r *= (1.0f + delta);
- colorControl->g *= (1.0f + delta);
- colorControl->b *= (1.0f + delta);
- }
-
- // divide sun color vals by three
- if(colorControl->isSunOrAmbientColor)
- {
- getChild<LLUICtrl>(rName)->setValue(colorControl->r/3);
- getChild<LLUICtrl>(gName)->setValue(colorControl->g/3);
- getChild<LLUICtrl>(bName)->setValue(colorControl->b/3);
-
- }
- else if(colorControl->isBlueHorizonOrDensity)
- {
- getChild<LLUICtrl>(rName)->setValue(colorControl->r/2);
- getChild<LLUICtrl>(gName)->setValue(colorControl->g/2);
- getChild<LLUICtrl>(bName)->setValue(colorControl->b/2);
-
- }
- else
- {
- // set the sliders to the new vals
- getChild<LLUICtrl>(rName)->setValue(colorControl->r);
- getChild<LLUICtrl>(gName)->setValue(colorControl->g);
- getChild<LLUICtrl>(bName)->setValue(colorControl->b);
- }
- }
-
- // now update the current parameters and send them to shaders
- colorControl->update(LLWLParamManager::instance()->mCurParams);
- LLWLParamManager::instance()->propagateParameters();
-}
-
-/// GLOW SPECIFIC CODE
-void LLFloaterWindLight::onGlowRMoved(LLUICtrl* ctrl, WLColorControl* colorControl)
-{
- deactivateAnimator();
-
- LLSliderCtrl* sldrCtrl = static_cast<LLSliderCtrl*>(ctrl);
-
- // scaled by 20
- colorControl->r = (2 - sldrCtrl->getValueF32()) * 20;
-
- colorControl->update(LLWLParamManager::instance()->mCurParams);
- LLWLParamManager::instance()->propagateParameters();
-}
-
-/// \NOTE that we want NEGATIVE (-) B
-void LLFloaterWindLight::onGlowBMoved(LLUICtrl* ctrl, WLColorControl* colorControl)
-{
- deactivateAnimator();
-
- LLSliderCtrl* sldrCtrl = static_cast<LLSliderCtrl*>(ctrl);
-
- /// \NOTE that we want NEGATIVE (-) B and NOT by 20 as 20 is too big
- colorControl->b = -sldrCtrl->getValueF32() * 5;
-
- colorControl->update(LLWLParamManager::instance()->mCurParams);
- LLWLParamManager::instance()->propagateParameters();
-}
-
-void LLFloaterWindLight::onFloatControlMoved(LLUICtrl* ctrl, WLFloatControl* floatControl)
-{
- deactivateAnimator();
-
- LLSliderCtrl* sldrCtrl = static_cast<LLSliderCtrl*>(ctrl);
-
- floatControl->x = sldrCtrl->getValueF32() / floatControl->mult;
-
- floatControl->update(LLWLParamManager::instance()->mCurParams);
- LLWLParamManager::instance()->propagateParameters();
-}
-
-// Lighting callbacks
-
-// time of day
-void LLFloaterWindLight::onSunMoved(LLUICtrl* ctrl, WLColorControl* colorControl)
-{
- deactivateAnimator();
-
- LLSliderCtrl* sunSldr = getChild<LLSliderCtrl>("WLSunAngle");
- LLSliderCtrl* eastSldr = getChild<LLSliderCtrl>("WLEastAngle");
-
- // get the two angles
- LLWLParamManager * param_mgr = LLWLParamManager::instance();
-
- param_mgr->mCurParams.setSunAngle(F_TWO_PI * sunSldr->getValueF32());
- param_mgr->mCurParams.setEastAngle(F_TWO_PI * eastSldr->getValueF32());
-
- // set the sun vector
- colorControl->r = -sin(param_mgr->mCurParams.getEastAngle()) *
- cos(param_mgr->mCurParams.getSunAngle());
- colorControl->g = sin(param_mgr->mCurParams.getSunAngle());
- colorControl->b = cos(param_mgr->mCurParams.getEastAngle()) *
- cos(param_mgr->mCurParams.getSunAngle());
- colorControl->i = 1.f;
-
- colorControl->update(param_mgr->mCurParams);
- param_mgr->propagateParameters();
-}
-
-void LLFloaterWindLight::onStarAlphaMoved(LLUICtrl* ctrl)
-{
- deactivateAnimator();
-
- LLSliderCtrl* sldrCtrl = static_cast<LLSliderCtrl*>(ctrl);
-
- LLWLParamManager::instance()->mCurParams.setStarBrightness(sldrCtrl->getValueF32());
-}
-
-void LLFloaterWindLight::onNewPreset()
-{
- LLNotificationsUtil::add("NewSkyPreset", LLSD(), LLSD(), boost::bind(&LLFloaterWindLight::newPromptCallback, this, _1, _2));
-}
-
-void LLFloaterWindLight::onSavePreset()
-{
- // get the name
- LLComboBox* comboBox = getChild<LLComboBox>(
- "WLPresetsCombo");
-
- // don't save the empty name
- if(comboBox->getSelectedItemLabel() == "")
- {
- return;
- }
-
- // check to see if it's a default and shouldn't be overwritten
- std::set<std::string>::iterator sIt = sDefaultPresets.find(
- comboBox->getSelectedItemLabel());
- if(sIt != sDefaultPresets.end() && !gSavedSettings.getBOOL("SkyEditPresets"))
- {
- LLNotificationsUtil::add("WLNoEditDefault");
- return;
- }
-
- LLWLParamManager::instance()->mCurParams.mName =
- comboBox->getSelectedItemLabel();
-
- LLNotificationsUtil::add("WLSavePresetAlert", LLSD(), LLSD(), boost::bind(&LLFloaterWindLight::saveAlertCallback, this, _1, _2));
-}
-
-bool LLFloaterWindLight::saveAlertCallback(const LLSD& notification, const LLSD& response)
-{
- S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
- // if they choose save, do it. Otherwise, don't do anything
- if(option == 0)
- {
- LLWLParamManager * param_mgr = LLWLParamManager::instance();
-
- param_mgr->setParamSet(param_mgr->mCurParams.mName, param_mgr->mCurParams);
-
- // comment this back in to save to file
- param_mgr->savePreset(param_mgr->mCurParams.mName);
- }
- return false;
-}
-
-void LLFloaterWindLight::onDeletePreset()
-{
- LLComboBox* combo_box = getChild<LLComboBox>(
- "WLPresetsCombo");
-
- if(combo_box->getSelectedValue().asString() == "")
- {
- return;
- }
-
- LLSD args;
- args["SKY"] = combo_box->getSelectedValue().asString();
- LLNotificationsUtil::add("WLDeletePresetAlert", args, LLSD(),
- boost::bind(&LLFloaterWindLight::deleteAlertCallback, this, _1, _2));
-}
-
-bool LLFloaterWindLight::deleteAlertCallback(const LLSD& notification, const LLSD& response)
-{
- S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
-
- // if they choose delete, do it. Otherwise, don't do anything
- if(option == 0)
- {
- LLComboBox* combo_box = getChild<LLComboBox>("WLPresetsCombo");
- LLFloaterDayCycle* day_cycle = LLFloaterReg::findTypedInstance<LLFloaterDayCycle>("env_day_cycle");
- LLComboBox* key_combo = NULL;
-
- if (day_cycle)
- {
- key_combo = day_cycle->getChild<LLComboBox>("WLKeyPresets");
- }
-
- std::string name(combo_box->getSelectedValue().asString());
-
- // check to see if it's a default and shouldn't be deleted
- std::set<std::string>::iterator sIt = sDefaultPresets.find(name);
- if(sIt != sDefaultPresets.end())
- {
- LLNotificationsUtil::add("WLNoEditDefault");
- return false;
- }
-
- LLWLParamManager::instance()->removeParamSet(name, true);
-
- // remove and choose another
- S32 new_index = combo_box->getCurrentIndex();
-
- combo_box->remove(name);
- if(key_combo != NULL)
- {
- key_combo->remove(name);
-
- // remove from slider, as well
- day_cycle->deletePreset(name);
- }
-
- // pick the previously selected index after delete
- if(new_index > 0)
- {
- new_index--;
- }
-
- if(combo_box->getItemCount() > 0)
- {
- combo_box->setCurrentByIndex(new_index);
- }
- }
- return false;
-}
-
-
-void LLFloaterWindLight::onChangePresetName(LLUICtrl* ctrl)
-{
- deactivateAnimator();
-
- std::string data = ctrl->getValue().asString();
- if(!data.empty())
- {
- LLWLParamManager::instance()->loadPreset( data);
- syncMenu();
- }
-}
-
-void LLFloaterWindLight::onOpenDayCycle()
-{
- LLFloaterReg::showInstance("env_day_cycle");
-}
-
-// Clouds
-void LLFloaterWindLight::onCloudScrollXMoved(LLUICtrl* ctrl)
-{
- deactivateAnimator();
-
- LLSliderCtrl* sldrCtrl = static_cast<LLSliderCtrl*>(ctrl);
- // *HACK all cloud scrolling is off by an additive of 10.
- LLWLParamManager::instance()->mCurParams.setCloudScrollX(sldrCtrl->getValueF32() + 10.0f);
-}
-
-void LLFloaterWindLight::onCloudScrollYMoved(LLUICtrl* ctrl)
-{
- deactivateAnimator();
-
- LLSliderCtrl* sldrCtrl = static_cast<LLSliderCtrl*>(ctrl);
-
- // *HACK all cloud scrolling is off by an additive of 10.
- LLWLParamManager::instance()->mCurParams.setCloudScrollY(sldrCtrl->getValueF32() + 10.0f);
-}
-
-void LLFloaterWindLight::onCloudScrollXToggled(LLUICtrl* ctrl)
-{
- deactivateAnimator();
-
- LLCheckBoxCtrl* cbCtrl = static_cast<LLCheckBoxCtrl*>(ctrl);
-
- bool lock = cbCtrl->get();
- LLWLParamManager::instance()->mCurParams.setEnableCloudScrollX(!lock);
-
- LLSliderCtrl* sldr = getChild<LLSliderCtrl>(
- "WLCloudScrollX");
-
- if(cbCtrl->get())
- {
- sldr->setEnabled(false);
- }
- else
- {
- sldr->setEnabled(true);
- }
-
-}
-
-void LLFloaterWindLight::onCloudScrollYToggled(LLUICtrl* ctrl)
-{
- deactivateAnimator();
-
- LLCheckBoxCtrl* cbCtrl = static_cast<LLCheckBoxCtrl*>(ctrl);
- bool lock = cbCtrl->get();
- LLWLParamManager::instance()->mCurParams.setEnableCloudScrollY(!lock);
-
- LLSliderCtrl* sldr = getChild<LLSliderCtrl>(
- "WLCloudScrollY");
-
- if(cbCtrl->get())
- {
- sldr->setEnabled(false);
- }
- else
- {
- sldr->setEnabled(true);
- }
-}
-
-void LLFloaterWindLight::deactivateAnimator()
-{
- LLWLParamManager::instance()->mAnimator.mIsRunning = false;
- LLWLParamManager::instance()->mAnimator.mUseLindenTime = false;
-}
diff --git a/indra/newview/llfloaterwindlight.h b/indra/newview/llfloaterwindlight.h
deleted file mode 100644
index b43edc2c11..0000000000
--- a/indra/newview/llfloaterwindlight.h
+++ /dev/null
@@ -1,112 +0,0 @@
-/**
- * @file llfloaterwindlight.h
- * @brief LLFloaterWindLight class definition
- *
- * $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$
- */
-
-/*
- * Menu for adjusting the atmospheric settings of the world
- */
-
-#ifndef LL_LLFLOATERWINDLIGHT_H
-#define LL_LLFLOATERWINDLIGHT_H
-
-#include "llfloater.h"
-
-#include <vector>
-#include "llwlparamset.h"
-
-struct WLColorControl;
-struct WLFloatControl;
-
-
-/// Menuing system for all of windlight's functionality
-class LLFloaterWindLight : public LLFloater
-{
-public:
-
- LLFloaterWindLight(const LLSD& key);
- virtual ~LLFloaterWindLight();
- /*virtual*/ BOOL postBuild();
- /// initialize all
- void initCallbacks(void);
-
- bool newPromptCallback(const LLSD& notification, const LLSD& response);
-
- /// general purpose callbacks for dealing with color controllers
- void onColorControlRMoved(LLUICtrl* ctrl, WLColorControl* userData);
- void onColorControlGMoved(LLUICtrl* ctrl, WLColorControl* userData);
- void onColorControlBMoved(LLUICtrl* ctrl, WLColorControl* userData);
- void onColorControlIMoved(LLUICtrl* ctrl, WLColorControl* userData);
- void onFloatControlMoved(LLUICtrl* ctrl, WLFloatControl* userData);
-
- /// lighting callbacks for glow
- void onGlowRMoved(LLUICtrl* ctrl, WLColorControl* userData);
- //static void onGlowGMoved(LLUICtrl* ctrl, void* userData);
- void onGlowBMoved(LLUICtrl* ctrl, WLColorControl* userData);
-
- /// lighting callbacks for sun
- void onSunMoved(LLUICtrl* ctrl, WLColorControl* userData);
-
- /// for handling when the star slider is moved to adjust the alpha
- void onStarAlphaMoved(LLUICtrl* ctrl);
-
- /// when user hits the load preset button
- void onNewPreset();
-
- /// when user hits the save preset button
- void onSavePreset();
-
- /// prompts a user when overwriting a preset
- bool saveAlertCallback(const LLSD& notification, const LLSD& response);
-
- /// when user hits the save preset button
- void onDeletePreset();
-
- /// prompts a user when overwriting a preset
- bool deleteAlertCallback(const LLSD& notification, const LLSD& response);
-
- /// what to do when you change the preset name
- void onChangePresetName(LLUICtrl* ctrl);
-
- /// when user hits the save preset button
- void onOpenDayCycle();
-
- /// handle cloud scrolling
- void onCloudScrollXMoved(LLUICtrl* ctrl);
- void onCloudScrollYMoved(LLUICtrl* ctrl);
- void onCloudScrollXToggled(LLUICtrl* ctrl);
- void onCloudScrollYToggled(LLUICtrl* ctrl);
-
- /// sync up sliders with parameters
- void syncMenu();
-
- /// turn off animated skies
- static void deactivateAnimator();
-
-private:
- static std::set<std::string> sDefaultPresets;
-};
-
-
-#endif
diff --git a/indra/newview/llfloaterworldmap.cpp b/indra/newview/llfloaterworldmap.cpp
index f8a4ce7ad0..eb3c7ee469 100644..100755
--- a/indra/newview/llfloaterworldmap.cpp
+++ b/indra/newview/llfloaterworldmap.cpp
@@ -1070,7 +1070,7 @@ void LLFloaterWorldMap::onComboTextEntry()
// Reset the tracking whenever we start typing into any of the search fields,
// so that hitting <enter> does an auto-complete versus teleporting us to the
// previously selected landmark/friend.
- LLTracker::clearFocus();
+ LLTracker::stopTracking(NULL);
}
void LLFloaterWorldMap::onSearchTextEntry( )
@@ -1527,17 +1527,24 @@ void LLFloaterWorldMap::updateSims(bool found_null_sim)
mCompletingRegionName = "";
}
- // if match found, highlight it and go
- if (!match.isUndefined())
+ if (num_results > 0)
{
- list->selectByValue(match);
+ // if match found, highlight it and go
+ if (!match.isUndefined())
+ {
+ list->selectByValue(match);
+ }
+ // else select first found item
+ else
+ {
+ list->selectFirstItem();
+ }
getChild<LLUICtrl>("search_results")->setFocus(TRUE);
onCommitSearchResult();
}
-
- // if we found nothing, say "none"
- if (num_results == 0)
+ else
{
+ // if we found nothing, say "none"
list->setCommentText(LLTrans::getString("worldmap_results_none_found"));
list->operateOnAll(LLCtrlListInterface::OP_DESELECT);
}
diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp
index 3884b94b60..e90b6c1c3d 100644
--- a/indra/newview/llfolderview.cpp
+++ b/indra/newview/llfolderview.cpp
@@ -167,13 +167,23 @@ void LLCloseAllFoldersFunctor::doItem(LLFolderViewItem* item)
///----------------------------------------------------------------------------
/// Class LLFolderView
///----------------------------------------------------------------------------
+LLFolderView::Params::Params()
+: task_id("task_id"),
+ title("title"),
+ use_label_suffix("use_label_suffix"),
+ allow_multiselect("allow_multiselect", true),
+ show_load_status("show_load_status", true),
+ use_ellipses("use_ellipses", false)
+{
+}
+
// Default constructor
LLFolderView::LLFolderView(const Params& p)
: LLFolderViewFolder(p),
mScrollContainer( NULL ),
mPopupMenuHandle(),
- mAllowMultiSelect(TRUE),
+ mAllowMultiSelect(p.allow_multiselect),
mShowFolderHierarchy(FALSE),
mSourceID(p.task_id),
mRenameItem( NULL ),
@@ -194,10 +204,14 @@ LLFolderView::LLFolderView(const Params& p)
mDragAndDropThisFrame(FALSE),
mCallbackRegistrar(NULL),
mParentPanel(p.parent_panel),
- mUseEllipses(false),
+ mUseEllipses(p.use_ellipses),
mDraggingOverItem(NULL),
mStatusTextBox(NULL)
{
+ mRoot = this;
+
+ mShowLoadStatus = p.show_load_status();
+
LLRect rect = p.rect;
LLRect new_rect(rect.mLeft, rect.mBottom + getRect().getHeight(), rect.mLeft + getRect().getWidth(), rect.mBottom);
setRect( rect );
@@ -263,6 +277,7 @@ LLFolderView::LLFolderView(const Params& p)
menu->setBackgroundColor(LLUIColorTable::instance().getColor("MenuPopupBgColor"));
mPopupMenuHandle = menu->getHandle();
+ mListener->openItem();
}
// Destroys the object
@@ -308,15 +323,10 @@ void LLFolderView::setSortOrder(U32 order)
if (order != mSortOrder)
{
LLFastTimer t(FTM_SORT);
+
mSortOrder = order;
- for (folders_t::iterator iter = mFolders.begin();
- iter != mFolders.end();)
- {
- folders_t::iterator fit = iter++;
- (*fit)->sortBy(order);
- }
-
+ sortBy(order);
arrangeAll();
}
}
@@ -342,7 +352,7 @@ BOOL LLFolderView::addFolder( LLFolderViewFolder* folder)
{
recursiveIncrementNumDescendantsSelected(folder->numSelected());
}
- folder->setShowLoadStatus(true);
+ folder->setShowLoadStatus(mShowLoadStatus);
folder->setOrigin(0, 0);
folder->reshape(getRect().getWidth(), 0);
folder->setVisible(FALSE);
@@ -424,11 +434,7 @@ S32 LLFolderView::arrange( S32* unused_width, S32* unused_height, S32 filter_gen
(folderp->getFiltered(filter_generation) || folderp->hasFilteredDescendants(filter_generation))); // passed filter or has descendants that passed filter
}
- // Need to call arrange regardless of visibility, since children's visibility
- // might need to be changed too (e.g. even though a folder is invisible, its
- // children also need to be set invisible for state-tracking purposes, e.g.
- // llfolderviewitem::filter).
- // if (folderp->getVisible())
+ if (folderp->getVisible())
{
S32 child_height = 0;
S32 child_width = 0;
@@ -764,7 +770,7 @@ void LLFolderView::sanitizeSelection()
}
// Don't allow invisible items (such as root folders) to be selected.
- if (item->getHidden())
+ if (item == getRoot())
{
items_to_remove.push_back(item);
}
@@ -787,7 +793,7 @@ void LLFolderView::sanitizeSelection()
parent_folder;
parent_folder = parent_folder->getParentFolder())
{
- if (parent_folder->potentiallyVisible() && !parent_folder->getHidden())
+ if (parent_folder->potentiallyVisible())
{
// give initial selection to first ancestor folder that potentially passes the filter
if (!new_selection)
@@ -806,13 +812,7 @@ void LLFolderView::sanitizeSelection()
}
else
{
- // nothing selected to start with, so pick "My Inventory" as best guess
- new_selection = getItemByID(gInventory.getRootFolderID());
- // ... except if it's hidden from the UI.
- if (new_selection && new_selection->getHidden())
- {
- new_selection = NULL;
- }
+ new_selection = NULL;
}
if (new_selection)
@@ -931,14 +931,15 @@ void LLFolderView::draw()
if (LLInventoryModelBackgroundFetch::instance().backgroundFetchActive() || mCompletedFilterGeneration < mFilter->getMinRequiredGeneration())
{
mStatusText = LLTrans::getString("Searching");
- //font->renderUTF8(mStatusText, 0, 2, 1, sSearchStatusColor, LLFontGL::LEFT, LLFontGL::TOP, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE );
}
else
{
- LLStringUtil::format_map_t args;
- args["[SEARCH_TERM]"] = LLURI::escape(getFilter()->getFilterSubStringOrig());
- mStatusText = LLTrans::getString(getFilter()->getEmptyLookupMessage(), args);
- //font->renderUTF8(mStatusText, 0, 2, 1, sSearchStatusColor, LLFontGL::LEFT, LLFontGL::TOP, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE );
+ if (getFilter())
+ {
+ LLStringUtil::format_map_t args;
+ args["[SEARCH_TERM]"] = LLURI::escape(getFilter()->getFilterSubStringOrig());
+ mStatusText = LLTrans::getString(getFilter()->getEmptyLookupMessage(), args);
+ }
}
mStatusTextBox->setValue(mStatusText);
mStatusTextBox->setVisible( TRUE );
@@ -962,7 +963,9 @@ void LLFolderView::draw()
}
- LLFolderViewFolder::draw();
+ // skip over LLFolderViewFolder::draw since we don't want the folder icon, label,
+ // and arrow for the root folder
+ LLView::draw();
mDragAndDropThisFrame = FALSE;
}
@@ -1642,11 +1645,7 @@ BOOL LLFolderView::handleKeyHere( KEY key, MASK mask )
LLFolderViewItem* parent_folder = last_selected->getParentFolder();
if (!last_selected->isOpen() && parent_folder && parent_folder->getParentFolder())
{
- // Don't change selectin to hidden folder. See EXT-5328.
- if (!parent_folder->getHidden())
- {
- setSelection(parent_folder, FALSE, TRUE);
- }
+ setSelection(parent_folder, FALSE, TRUE);
}
else
{
@@ -1911,7 +1910,14 @@ BOOL LLFolderView::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
// by the folder which is the hierarchy root.
if (!handled && !hasVisibleChildren())
{
- handled = mFolders.front()->handleDragAndDropFromChild(mask,drop,cargo_type,cargo_data,accept,tooltip_msg);
+ if (mFolders.empty())
+ {
+ handled = handleDragAndDropFromChild(mask,drop,cargo_type,cargo_data,accept,tooltip_msg);
+ }
+ else
+ {
+ handled = mFolders.front()->handleDragAndDropFromChild(mask,drop,cargo_type,cargo_data,accept,tooltip_msg);
+ }
}
if (handled)
@@ -1927,8 +1933,11 @@ void LLFolderView::deleteAllChildren()
closeRenamer();
LLView::deleteViewByHandle(mPopupMenuHandle);
mPopupMenuHandle = LLHandle<LLView>();
- mRenamer = NULL;
+ mScrollContainer = NULL;
mRenameItem = NULL;
+ mRenamer = NULL;
+ mStatusTextBox = NULL;
+
clearSelection();
LLView::deleteAllChildren();
}
@@ -2031,7 +2040,7 @@ void LLFolderView::removeItemID(const LLUUID& id)
LLFolderViewItem* LLFolderView::getItemByID(const LLUUID& id)
{
- if (id.isNull())
+ if (id == getListener()->getUUID())
{
return this;
}
@@ -2048,7 +2057,7 @@ LLFolderViewItem* LLFolderView::getItemByID(const LLUUID& id)
LLFolderViewFolder* LLFolderView::getFolderByID(const LLUUID& id)
{
- if (id.isNull())
+ if (id == getListener()->getUUID())
{
return this;
}
@@ -2173,7 +2182,7 @@ void LLFolderView::doIdle()
// filter to determine visiblity before arranging
filterFromRoot();
- // automatically show matching items, and select first one
+ // automatically show matching items, and select first one if we had a selection
// do this every frame until user puts keyboard focus into the inventory window
// signaling the end of the automatic update
// only do this when mNeedsFilter is set, meaning filtered items have
@@ -2183,7 +2192,7 @@ void LLFolderView::doIdle()
LLFastTimer t3(FTM_AUTO_SELECT);
// select new item only if a filtered item not currently selected
LLFolderViewItem* selected_itemp = mSelectedItems.empty() ? NULL : mSelectedItems.back();
- if ((!selected_itemp || !selected_itemp->getFiltered()) && !mAutoSelectOverride)
+ if ((selected_itemp && !selected_itemp->getFiltered()) && !mAutoSelectOverride)
{
// select first filtered item
LLSelectFirstFilteredItem filter;
@@ -2496,11 +2505,6 @@ BOOL LLFolderView::isFilterModified()
return mFilter->isNotDefault();
}
-BOOL LLFolderView::getAllowMultiSelect()
-{
- return mAllowMultiSelect;
-}
-
void delete_selected_item(void* user_data)
{
if(user_data)
diff --git a/indra/newview/llfolderview.h b/indra/newview/llfolderview.h
index 1464a058d8..0b92548fd0 100644
--- a/indra/newview/llfolderview.h
+++ b/indra/newview/llfolderview.h
@@ -59,22 +59,6 @@ class LLUICtrl;
class LLTextBox;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Class LLFolderViewFunctor
-//
-// Simple abstract base class for applying a functor to folders and
-// items in a folder view hierarchy. This is suboptimal for algorithms
-// that only work folders or only work on items, but I'll worry about
-// that later when it's determined to be too slow.
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-class LLFolderViewFunctor
-{
-public:
- virtual ~LLFolderViewFunctor() {}
- virtual void doFolder(LLFolderViewFolder* folder) = 0;
- virtual void doItem(LLFolderViewItem* item) = 0;
-};
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Class LLFolderView
//
// Th LLFolderView represents the root level folder view object. It
@@ -89,7 +73,12 @@ public:
Mandatory<LLPanel*> parent_panel;
Optional<LLUUID> task_id;
Optional<std::string> title;
- Optional<bool> use_label_suffix;
+ Optional<bool> use_label_suffix,
+ allow_multiselect,
+ show_load_status,
+ use_ellipses;
+
+ Params();
};
LLFolderView(const Params&);
virtual ~LLFolderView( void );
@@ -102,7 +91,6 @@ public:
// and resort the items if necessary.
void setSortOrder(U32 order);
void setFilterPermMask(PermissionMask filter_perm_mask);
- void setAllowMultiSelect(BOOL allow) { mAllowMultiSelect = allow; }
typedef boost::signals2::signal<void (const std::deque<LLFolderViewItem*>& items, BOOL user_action)> signal_t;
void setSelectCallback(const signal_t::slot_type& cb) { mSelectSignal.connect(cb); }
@@ -117,7 +105,6 @@ public:
//LLInventoryFilter::EFolderShow getShowFolderState();
U32 getSortOrder() const;
BOOL isFilterModified();
- BOOL getAllowMultiSelect();
// Close all folders in the view
void closeAllFolders();
@@ -238,7 +225,6 @@ public:
void setShowSingleSelection(BOOL show);
BOOL getShowSingleSelection() { return mShowSingleSelection; }
F32 getSelectionFadeElapsedTime() { return mMultiSelectionFadeTimer.getElapsedTimeF32(); }
- void setUseEllipses(bool use_ellipses) { mUseEllipses = use_ellipses; }
bool getUseEllipses() { return mUseEllipses; }
void addItemID(const LLUUID& id, LLFolderViewItem* itemp);
diff --git a/indra/newview/llfolderviewitem.cpp b/indra/newview/llfolderviewitem.cpp
index e9d1ad3a9e..6e4f55fb2f 100644
--- a/indra/newview/llfolderviewitem.cpp
+++ b/indra/newview/llfolderviewitem.cpp
@@ -30,8 +30,10 @@
// viewer includes
#include "llfolderview.h" // Items depend extensively on LLFolderViews
#include "llfoldervieweventlistener.h"
+#include "llviewerfoldertype.h"
#include "llinventorybridge.h" // for LLItemBridge in LLInventorySort::operator()
#include "llinventoryfilter.h"
+#include "llinventoryfunctions.h"
#include "llinventorymodelbackgroundfetch.h"
#include "llpanel.h"
#include "llviewercontrol.h" // gSavedSettings
@@ -130,10 +132,14 @@ LLFolderViewItem::LLFolderViewItem(const LLFolderViewItem::Params& p)
mIconOpen(p.icon_open),
mIconOverlay(p.icon_overlay),
mListener(p.listener),
- mHidden(false),
mShowLoadStatus(false)
{
+}
+
+BOOL LLFolderViewItem::postBuild()
+{
refresh();
+ return TRUE;
}
// Destroys the object
@@ -195,7 +201,7 @@ LLFolderViewItem* LLFolderViewItem::getPreviousOpenNode(BOOL include_children)
LLFolderViewItem* itemp = mParentFolder->getPreviousFromChild( this, include_children );
// Skip over items that are invisible or are hidden from the UI.
- while(itemp && (!itemp->getVisible() || itemp->getHidden()))
+ while(itemp && !itemp->getVisible())
{
LLFolderViewItem* next_itemp = itemp->mParentFolder->getPreviousFromChild( itemp, include_children );
if (itemp == next_itemp)
@@ -351,7 +357,10 @@ void LLFolderViewItem::arrangeAndSet(BOOL set_selection,
BOOL take_keyboard_focus)
{
LLFolderView* root = getRoot();
+ if (getParentFolder())
+ {
getParentFolder()->requestArrange();
+ }
if(set_selection)
{
setSelectionFromRoot(this, TRUE, take_keyboard_focus);
@@ -442,23 +451,20 @@ S32 LLFolderViewItem::arrange( S32* width, S32* height, S32 filter_generation)
S32 LLFolderViewItem::getItemHeight()
{
- if (getHidden()) return 0;
-
return mItemHeight;
}
void LLFolderViewItem::filter( LLInventoryFilter& filter)
{
const BOOL previous_passed_filter = mPassedFilter;
- const BOOL passed_filter = mListener && filter.check(this);
+ const BOOL passed_filter = filter.check(this);
// If our visibility will change as a result of this filter, then
// we need to be rearranged in our parent folder
if (mParentFolder)
{
- if (getVisible() != passed_filter)
- mParentFolder->requestArrange();
- if (passed_filter != previous_passed_filter)
+ if (getVisible() != passed_filter
+ || previous_passed_filter != passed_filter )
mParentFolder->requestArrange();
}
@@ -863,11 +869,6 @@ BOOL LLFolderViewItem::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
void LLFolderViewItem::draw()
{
- if (getHidden())
- {
- return;
- }
-
static LLUIColor sFgColor = LLUIColorTable::instance().getColor("MenuItemEnabledColor", DEFAULT_WHITE);
static LLUIColor sHighlightBgColor = LLUIColorTable::instance().getColor("MenuItemHighlightBgColor", DEFAULT_WHITE);
static LLUIColor sHighlightFgColor = LLUIColorTable::instance().getColor("MenuItemHighlightFgColor", DEFAULT_WHITE);
@@ -891,8 +892,8 @@ void LLFolderViewItem::draw()
// Draw open folder arrow
//
const bool up_to_date = mListener && mListener->isUpToDate();
- const bool possibly_has_children = ((up_to_date && hasVisibleChildren()) || // we fetched our children and some of them have passed the filter...
- (!up_to_date && mListener && mListener->hasChildren())); // ...or we know we have children but haven't fetched them (doesn't obey filter)
+ const bool possibly_has_children = ((up_to_date && hasVisibleChildren()) // we fetched our children and some of them have passed the filter...
+ || (!up_to_date && mListener && mListener->hasChildren())); // ...or we know we have children but haven't fetched them (doesn't obey filter)
if (possibly_has_children)
{
LLUIImage* arrow_image = default_params.folder_arrow_image;
@@ -1054,8 +1055,11 @@ void LLFolderViewItem::draw()
{
root_is_loading = LLInventoryModelBackgroundFetch::instance().libraryFetchInProgress();
}
- if ((mIsLoading && mTimeSinceRequestStart.getElapsedTimeF32() >= gSavedSettings.getF32("FolderLoadingMessageWaitTime")) ||
- (LLInventoryModelBackgroundFetch::instance().backgroundFetchActive() && root_is_loading && (mShowLoadStatus || mHidden)))
+ if ((mIsLoading
+ && mTimeSinceRequestStart.getElapsedTimeF32() >= gSavedSettings.getF32("FolderLoadingMessageWaitTime"))
+ || (LLInventoryModelBackgroundFetch::instance().backgroundFetchActive()
+ && root_is_loading
+ && mShowLoadStatus))
{
std::string load_string = " ( " + LLTrans::getString("LoadingData") + " ) ";
font->renderUTF8(load_string, 0, right_x, y, sSearchStatusColor,
@@ -1119,7 +1123,8 @@ LLFolderViewFolder::LLFolderViewFolder( const LLFolderViewItem::Params& p ):
mLastCalculatedWidth(0),
mCompletedFilterGeneration(-1),
mMostFilteredDescendantGeneration(-1),
- mNeedsSort(false)
+ mNeedsSort(false),
+ mPassedFolderFilter(FALSE)
{
}
@@ -1131,6 +1136,17 @@ LLFolderViewFolder::~LLFolderViewFolder( void )
gFocusMgr.releaseFocusIfNeeded( this ); // calls onCommit()
}
+void LLFolderViewFolder::setFilteredFolder(bool filtered, S32 filter_generation)
+{
+ mPassedFolderFilter = filtered;
+ mLastFilterGeneration = filter_generation;
+}
+
+bool LLFolderViewFolder::getFilteredFolder(S32 filter_generation)
+{
+ return mPassedFolderFilter && mLastFilterGeneration >= getRoot()->getFilter()->getMinRequiredGeneration();
+}
+
// addToFolder() returns TRUE if it succeeds. FALSE otherwise
BOOL LLFolderViewFolder::addToFolder(LLFolderViewFolder* folder, LLFolderView* root)
{
@@ -1157,8 +1173,6 @@ S32 LLFolderViewFolder::arrange( S32* width, S32* height, S32 filter_generation)
mHasVisibleChildren = hasFilteredDescendants(filter_generation);
- LLInventoryFilter::EFolderShow show_folder_state = getRoot()->getFilter()->getShowFolderState();
-
// calculate height as a single item (without any children), and reshapes rectangle to match
LLFolderViewItem::arrange( width, height, filter_generation );
@@ -1190,8 +1204,10 @@ S32 LLFolderViewFolder::arrange( S32* width, S32* height, S32 filter_generation)
}
else
{
- folderp->setVisible(show_folder_state == LLInventoryFilter::SHOW_ALL_FOLDERS || // always show folders?
- (folderp->getFiltered(filter_generation) || folderp->hasFilteredDescendants(filter_generation))); // passed filter or has descendants that passed filter
+ folderp->setVisible( folderp->getListener()
+ && (folderp->getFiltered(filter_generation)
+ || (folderp->getFilteredFolder(filter_generation)
+ && folderp->hasFilteredDescendants(filter_generation)))); // passed filter or has descendants that passed filter
}
if (folderp->getVisible())
@@ -1311,7 +1327,9 @@ void LLFolderViewFolder::setCompletedFilterGeneration(S32 generation, BOOL recur
mMostFilteredDescendantGeneration = llmin(mMostFilteredDescendantGeneration, generation);
mCompletedFilterGeneration = generation;
// only aggregate up if we are a lower (older) value
- if (recurse_up && mParentFolder && generation < mParentFolder->getCompletedFilterGeneration())
+ if (recurse_up
+ && mParentFolder
+ && generation < mParentFolder->getCompletedFilterGeneration())
{
mParentFolder->setCompletedFilterGeneration(generation, TRUE);
}
@@ -1336,21 +1354,19 @@ void LLFolderViewFolder::filter( LLInventoryFilter& filter)
// filter folder itself
if (getLastFilterGeneration() < filter_generation)
{
- if (getLastFilterGeneration() >= must_pass_generation && // folder has been compared to a valid precursor filter
- !mPassedFilter) // and did not pass the filter
+ if (getLastFilterGeneration() >= must_pass_generation // folder has been compared to a valid precursor filter
+ && !mPassedFilter) // and did not pass the filter
{
// go ahead and flag this folder as done
mLastFilterGeneration = filter_generation;
}
- else
+ else // filter self only on first pass through
{
- // filter self only on first pass through
+ // filter against folder rules
+ filterFolder(filter);
+ // and then item rules
LLFolderViewItem::filter( filter );
}
- if (mHidden)
- {
- setOpen();
- }
}
if (getRoot()->getDebugFilters())
@@ -1377,7 +1393,10 @@ void LLFolderViewFolder::filter( LLInventoryFilter& filter)
}
// when applying a filter, matching folders get their contents downloaded first
- if (filter.isNotDefault() && getFiltered(filter.getMinRequiredGeneration()) && (mListener && !gInventory.isCategoryComplete(mListener->getUUID())))
+ if (filter.isNotDefault()
+ && getFiltered(filter.getMinRequiredGeneration())
+ && (mListener
+ && !gInventory.isCategoryComplete(mListener->getUUID())))
{
LLInventoryModelBackgroundFetch::instance().start(mListener->getUUID());
}
@@ -1403,6 +1422,7 @@ void LLFolderViewFolder::filter( LLInventoryFilter& filter)
if (folder->getFiltered() || folder->hasFilteredDescendants(filter.getMinRequiredGeneration()))
{
mMostFilteredDescendantGeneration = filter_generation;
+ requestArrange();
}
// just skip it, it has already been filtered
continue;
@@ -1415,6 +1435,7 @@ void LLFolderViewFolder::filter( LLInventoryFilter& filter)
if (folder->getFiltered() || folder->hasFilteredDescendants(filter_generation))
{
mMostFilteredDescendantGeneration = filter_generation;
+ requestArrange();
if (getRoot()->needsAutoSelect() && autoopen_folders)
{
folder->setOpenArrangeRecursively(TRUE);
@@ -1436,6 +1457,7 @@ void LLFolderViewFolder::filter( LLInventoryFilter& filter)
if (item->getFiltered())
{
mMostFilteredDescendantGeneration = filter_generation;
+ requestArrange();
}
continue;
}
@@ -1454,6 +1476,7 @@ void LLFolderViewFolder::filter( LLInventoryFilter& filter)
if (item->getFiltered(filter.getMinRequiredGeneration()))
{
mMostFilteredDescendantGeneration = filter_generation;
+ requestArrange();
}
}
@@ -1467,6 +1490,31 @@ void LLFolderViewFolder::filter( LLInventoryFilter& filter)
}
}
+void LLFolderViewFolder::filterFolder(LLInventoryFilter& filter)
+{
+ const BOOL previous_passed_filter = mPassedFolderFilter;
+ const BOOL passed_filter = filter.checkFolder(this);
+
+ // If our visibility will change as a result of this filter, then
+ // we need to be rearranged in our parent folder
+ if (mParentFolder)
+ {
+ if (getVisible() != passed_filter
+ || previous_passed_filter != passed_filter )
+ {
+ mParentFolder->requestArrange();
+ }
+ }
+
+ setFilteredFolder(passed_filter, filter.getCurrentGeneration());
+ filter.decrementFilterCount();
+
+ if (getRoot()->getDebugFilters())
+ {
+ mStatusText = llformat("%d", mLastFilterGeneration);
+ }
+}
+
void LLFolderViewFolder::setFiltered(BOOL filtered, S32 filter_generation)
{
// if this folder is now filtered, but wasn't before
@@ -1488,6 +1536,23 @@ void LLFolderViewFolder::dirtyFilter()
LLFolderViewItem::dirtyFilter();
}
+BOOL LLFolderViewFolder::getFiltered()
+{
+ return getFilteredFolder(getRoot()->getFilter()->getMinRequiredGeneration())
+ && LLFolderViewItem::getFiltered();
+}
+
+BOOL LLFolderViewFolder::getFiltered(S32 filter_generation)
+{
+ return getFilteredFolder(filter_generation) && LLFolderViewItem::getFiltered(filter_generation);
+}
+
+BOOL LLFolderViewFolder::hasFilteredDescendants(S32 filter_generation)
+{
+ return mMostFilteredDescendantGeneration >= filter_generation;
+}
+
+
BOOL LLFolderViewFolder::hasFilteredDescendants()
{
return mMostFilteredDescendantGeneration >= getRoot()->getFilter()->getCurrentGeneration();
@@ -1743,7 +1808,7 @@ void LLFolderViewFolder::destroyView()
folderp->destroyView(); // removes entry from mFolders
}
- deleteAllChildren();
+ //deleteAllChildren();
if (mParentFolder)
{
@@ -1843,8 +1908,12 @@ void LLFolderViewFolder::sortBy(U32 order)
(*fit)->sortBy(order);
}
- mFolders.sort(mSortFunction);
- mItems.sort(mSortFunction);
+ // Don't sort the topmost folders (My Inventory and Library)
+ if (mListener->getUUID().notNull())
+ {
+ mFolders.sort(mSortFunction);
+ mItems.sort(mSortFunction);
+ }
if (order & LLInventoryFilter::SO_DATE)
{
@@ -1981,6 +2050,13 @@ BOOL LLFolderViewFolder::addItem(LLFolderViewItem* item)
item->dirtyFilter();
requestArrange();
requestSort();
+ LLFolderViewFolder* parentp = getParentFolder();
+ while (parentp && parentp->mSortFunction.isByDate())
+ {
+ // parent folder doesn't have a time stamp yet, so get it from us
+ parentp->requestSort();
+ parentp = parentp->getParentFolder();
+ }
return TRUE;
}
@@ -2000,6 +2076,13 @@ BOOL LLFolderViewFolder::addFolder(LLFolderViewFolder* folder)
// rearrange all descendants too, as our indentation level might have changed
folder->requestArrange(TRUE);
requestSort();
+ LLFolderViewFolder* parentp = getParentFolder();
+ while (parentp && !parentp->mSortFunction.isByDate())
+ {
+ // parent folder doesn't have a time stamp yet, so get it from us
+ parentp->requestSort();
+ parentp = parentp->getParentFolder();
+ }
return TRUE;
}
@@ -2059,7 +2142,9 @@ void LLFolderViewFolder::setOpenArrangeRecursively(BOOL openitem, ERecurseType r
(*fit)->setOpenArrangeRecursively(openitem, RECURSE_DOWN); /* Flawfinder: ignore */
}
}
- if (mParentFolder && (recurse == RECURSE_UP || recurse == RECURSE_UP_DOWN))
+ if (mParentFolder
+ && (recurse == RECURSE_UP
+ || recurse == RECURSE_UP_DOWN))
{
mParentFolder->setOpenArrangeRecursively(openitem, RECURSE_UP);
}
@@ -2301,13 +2386,16 @@ void LLFolderViewFolder::draw()
bool possibly_has_children = false;
bool up_to_date = mListener && mListener->isUpToDate();
- if(!up_to_date && mListener && mListener->hasChildren()) // we know we have children but haven't fetched them (doesn't obey filter)
+ if(!up_to_date
+ && mListener->hasChildren()) // we know we have children but haven't fetched them (doesn't obey filter)
{
possibly_has_children = true;
}
- BOOL loading = ( mIsOpen && possibly_has_children && !up_to_date );
+ BOOL loading = (mIsOpen
+ && possibly_has_children
+ && !up_to_date );
if ( loading && !mIsLoading )
{
@@ -2330,6 +2418,41 @@ void LLFolderViewFolder::draw()
time_t LLFolderViewFolder::getCreationDate() const
{
+ // folders have no creation date try to create one from an item somewhere in our folder hierarchy
+ if (!mCreationDate)
+ {
+ for (items_t::const_iterator iit = mItems.begin();
+ iit != mItems.end(); ++iit)
+ {
+ LLFolderViewItem* itemp = (*iit);
+
+ const time_t item_creation_date = itemp->getCreationDate();
+
+ if (item_creation_date)
+ {
+ mCreationDate = item_creation_date;
+ break;
+ }
+ }
+
+ if (!mCreationDate)
+ {
+ for (folders_t::const_iterator fit = mFolders.begin();
+ fit != mFolders.end(); ++fit)
+ {
+ LLFolderViewFolder* folderp = (*fit);
+
+ const time_t folder_creation_date = folderp->getCreationDate();
+
+ if (folder_creation_date)
+ {
+ mCreationDate = folder_creation_date;
+ break;
+ }
+ }
+ }
+ }
+
return llmax<time_t>(mCreationDate, mSubtreeCreationDate);
}
@@ -2573,7 +2696,8 @@ bool LLInventorySort::operator()(const LLFolderViewItem* const& a, const LLFolde
{
// ignore sort order for landmarks in the Favorites folder.
// they should be always sorted as in Favorites bar. See EXT-719
- if (a->getSortGroup() == SG_ITEM && b->getSortGroup() == SG_ITEM
+ if (a->getSortGroup() == SG_ITEM
+ && b->getSortGroup() == SG_ITEM
&& a->getListener()->getInventoryType() == LLInventoryType::IT_LANDMARK
&& b->getListener()->getInventoryType() == LLInventoryType::IT_LANDMARK)
{
diff --git a/indra/newview/llfolderviewitem.h b/indra/newview/llfolderviewitem.h
index fc941510ab..e2f94a2b63 100644
--- a/indra/newview/llfolderviewitem.h
+++ b/indra/newview/llfolderviewitem.h
@@ -66,6 +66,7 @@ public:
// Returns true if order has changed
bool updateSort(U32 order);
U32 getSort() { return mSortOrder; }
+ bool isByDate() { return mByDate; }
bool operator()(const LLFolderViewItem* const& a, const LLFolderViewItem* const& b);
private:
@@ -94,7 +95,7 @@ public:
Optional<LLUIImage*> icon_open; // used for folders
Optional<LLUIImage*> icon_overlay; // for links
Optional<LLFolderView*> root;
- Optional<LLFolderViewEventListener*> listener;
+ Mandatory<LLFolderViewEventListener*> listener;
Optional<LLUIImage*> folder_arrow_image;
Optional<S32> folder_indentation; // pixels
@@ -135,7 +136,7 @@ protected:
std::string mSearchableLabel;
S32 mLabelWidth;
bool mLabelWidthDirty;
- time_t mCreationDate;
+ mutable time_t mCreationDate;
LLFolderViewFolder* mParentFolder;
LLFolderViewEventListener* mListener;
BOOL mIsCurSelection;
@@ -157,7 +158,6 @@ protected:
BOOL mDragAndDropTarget;
BOOL mIsLoading;
LLTimer mTimeSinceRequestStart;
- bool mHidden;
bool mShowLoadStatus;
// helper function to change the selection from the root.
@@ -167,13 +167,15 @@ protected:
void extendSelectionFromRoot(LLFolderViewItem* selection);
// this is an internal method used for adding items to folders. A
- // no-op at this leve, but reimplemented in derived classes.
+ // no-op at this level, but reimplemented in derived classes.
virtual BOOL addItem(LLFolderViewItem*) { return FALSE; }
virtual BOOL addFolder(LLFolderViewFolder*) { return FALSE; }
static LLFontGL* getLabelFontForStyle(U8 style);
public:
+ BOOL postBuild();
+
// This function clears the currently selected item, and records
// the specified selected item appropriately for display and use
// in the UI. If open is TRUE, then folders are opened up along
@@ -202,11 +204,6 @@ public:
virtual S32 arrange( S32* width, S32* height, S32 filter_generation );
virtual S32 getItemHeight();
- // Hide the folder from the UI, such as if you want to hide the root
- // folder in an inventory panel.
- void setHidden(bool hidden) { mHidden = hidden; }
- bool getHidden() const { return mHidden; }
-
// applies filters to control visibility of inventory items
virtual void filter( LLInventoryFilter& filter);
@@ -366,6 +363,9 @@ public:
UNKNOWN, TRASH, NOT_TRASH
} ETrash;
+ typedef std::list<LLFolderViewItem*> items_t;
+ typedef std::list<LLFolderViewFolder*> folders_t;
+
private:
S32 mNumDescendantsSelected;
@@ -374,8 +374,6 @@ public: // Accessed needed by LLFolderViewItem
S32 numSelected(void) const { return mNumDescendantsSelected + (isSelected() ? 1 : 0); }
protected:
- typedef std::list<LLFolderViewItem*> items_t;
- typedef std::list<LLFolderViewFolder*> folders_t;
items_t mItems;
folders_t mFolders;
LLInventorySort mSortFunction;
@@ -392,6 +390,8 @@ protected:
S32 mCompletedFilterGeneration;
S32 mMostFilteredDescendantGeneration;
bool mNeedsSort;
+ bool mPassedFolderFilter;
+
public:
typedef enum e_recurse_type
{
@@ -425,13 +425,21 @@ public:
virtual void setCompletedFilterGeneration(S32 generation, BOOL recurse_up);
virtual S32 getCompletedFilterGeneration() { return mCompletedFilterGeneration; }
- BOOL hasFilteredDescendants(S32 filter_generation) { return mMostFilteredDescendantGeneration >= filter_generation; }
+ BOOL hasFilteredDescendants(S32 filter_generation);
BOOL hasFilteredDescendants();
// applies filters to control visibility of inventory items
virtual void filter( LLInventoryFilter& filter);
virtual void setFiltered(BOOL filtered, S32 filter_generation);
+ virtual BOOL getFiltered();
+ virtual BOOL getFiltered(S32 filter_generation);
+
virtual void dirtyFilter();
+
+ // folder-specific filtering (filter status propagates top down instead of bottom up)
+ void filterFolder(LLInventoryFilter& filter);
+ void setFilteredFolder(bool filtered, S32 filter_generation);
+ bool getFilteredFolder(S32 filter_generation);
// Passes selection information on to children and record
// selection information if necessary.
@@ -537,6 +545,10 @@ public:
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(); }
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/indra/newview/llgesturelistener.cpp b/indra/newview/llgesturelistener.cpp
new file mode 100644
index 0000000000..2fff506681
--- /dev/null
+++ b/indra/newview/llgesturelistener.cpp
@@ -0,0 +1,159 @@
+/**
+ * @file llgesturelistener.cpp
+ * @author Dave Simmons
+ * @date 2011-03-28
+ * @brief Implementation for LLGestureListener.
+ *
+ * $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 "llgesturelistener.h"
+#include "llgesturemgr.h"
+#include "llmultigesture.h"
+
+
+LLGestureListener::LLGestureListener()
+ : LLEventAPI("LLGesture",
+ "LLGesture listener interface to control gestures")
+{
+ add("getActiveGestures",
+ "Return information about the agent's available gestures [\"reply\"]:\n"
+ "[\"gestures\"]: a dictionary with UUID strings as keys\n"
+ " and the following dict values for each entry:\n"
+ " [\"name\"]: name of the gesture, may be empty\n"
+ " [\"trigger\"]: trigger string used to invoke via user chat, may be empty\n"
+ " [\"playing\"]: true or false indicating the playing state",
+ &LLGestureListener::getActiveGestures,
+ LLSDMap("reply", LLSD()));
+ add("isGesturePlaying",
+ "[\"id\"]: UUID of the gesture to query. Returns True or False in [\"playing\"] value of the result",
+ &LLGestureListener::isGesturePlaying);
+ add("startGesture",
+ "[\"id\"]: UUID of the gesture to start playing",
+ &LLGestureListener::startGesture);
+ add("stopGesture",
+ "[\"id\"]: UUID of the gesture to stop",
+ &LLGestureListener::stopGesture);
+}
+
+
+// "getActiveGestures" command
+void LLGestureListener::getActiveGestures(const LLSD& event_data) const
+{
+ LLSD reply = LLSD::emptyMap();
+ LLSD gesture_map = LLSD::emptyMap();
+
+ const LLGestureMgr::item_map_t& active_gestures = LLGestureMgr::instance().getActiveGestures();
+
+ // Scan active gesture map and get all the names
+ LLGestureMgr::item_map_t::const_iterator it;
+ for (it = active_gestures.begin(); it != active_gestures.end(); ++it)
+ {
+ LLMultiGesture* gesture = (*it).second;
+ if (gesture)
+ { // Add an entry to the result map with the LLUUID as key with a map containing data
+ LLSD info = LLSD::emptyMap();
+ info["name"] = (LLSD::String) gesture->mName;
+ info["trigger"] = (LLSD::String) gesture->mTrigger;
+ info["playing"] = (LLSD::Boolean) gesture->mPlaying;
+
+ gesture_map[(*it).first.asString()] = info;
+ }
+ }
+
+ reply["gestures"] = gesture_map;
+ sendReply(reply, event_data);
+}
+
+
+
+// "isGesturePlaying" command
+void LLGestureListener::isGesturePlaying(const LLSD& event_data) const
+{
+ bool is_playing = false;
+ if (event_data.has("id"))
+ {
+ LLUUID gesture_id = event_data["id"].asUUID();
+ if (gesture_id.notNull())
+ {
+ is_playing = LLGestureMgr::instance().isGesturePlaying(gesture_id);
+ }
+ else
+ {
+ llwarns << "isGesturePlaying did not find a gesture object for " << gesture_id << llendl;
+ }
+ }
+ else
+ {
+ llwarns << "isGesturePlaying didn't have 'id' value passed in" << llendl;
+ }
+
+ LLSD reply = LLSD::emptyMap();
+ reply["playing"] = (LLSD::Boolean) is_playing;
+ sendReply(reply, event_data);
+}
+
+
+// "startGesture" command
+void LLGestureListener::startGesture(LLSD const & event_data) const
+{
+ startOrStopGesture(event_data, true);
+}
+
+
+// "stopGesture" command
+void LLGestureListener::stopGesture(LLSD const & event_data) const
+{
+ startOrStopGesture(event_data, false);
+}
+
+
+// Real code for "startGesture" or "stopGesture"
+void LLGestureListener::startOrStopGesture(LLSD const & event_data, bool start) const
+{
+ if (event_data.has("id"))
+ {
+ LLUUID gesture_id = event_data["id"].asUUID();
+ if (gesture_id.notNull())
+ {
+ if (start)
+ {
+ LLGestureMgr::instance().playGesture(gesture_id);
+ }
+ else
+ {
+ LLGestureMgr::instance().stopGesture(gesture_id);
+ }
+ }
+ else
+ {
+ llwarns << "startOrStopGesture did not find a gesture object for " << gesture_id << llendl;
+ }
+ }
+ else
+ {
+ llwarns << "startOrStopGesture didn't have 'id' value passed in" << llendl;
+ }
+}
+
diff --git a/indra/newview/llgesturelistener.h b/indra/newview/llgesturelistener.h
new file mode 100644
index 0000000000..6f59698ed1
--- /dev/null
+++ b/indra/newview/llgesturelistener.h
@@ -0,0 +1,52 @@
+/**
+ * @file llgesturelistener.h
+ * @author Dave Simmons
+ * @date 2011-03-15
+ * @brief Class definition for LLGestureListener.
+ *
+ * $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_LLGESTURELISTENER_H
+#define LL_LLGESTURELISTENER_H
+
+#include "lleventapi.h"
+
+class LLSD;
+
+class LLGestureListener : public LLEventAPI
+{
+public:
+ LLGestureListener();
+
+private:
+ void getActiveGestures(LLSD const & gesture_data) const;
+ void isGesturePlaying(LLSD const & gesture_data) const;
+ void startGesture(LLSD const & gesture_data) const;
+ void stopGesture(LLSD const & gesture_data) const;
+
+ void startOrStopGesture(LLSD const & event_data, bool start) const;
+};
+
+#endif // LL_LLGESTURELISTENER_H
+
diff --git a/indra/newview/llgesturemgr.cpp b/indra/newview/llgesturemgr.cpp
index 2f9856c650..66ca76bfb0 100644
--- a/indra/newview/llgesturemgr.cpp
+++ b/indra/newview/llgesturemgr.cpp
@@ -53,6 +53,7 @@
#include "llviewerstats.h"
#include "llnearbychatbar.h"
#include "llappearancemgr.h"
+#include "llgesturelistener.h"
// Longest time, in seconds, to wait for all animations to stop playing
const F32 MAX_WAIT_ANIM_SECS = 30.f;
@@ -70,6 +71,7 @@ LLGestureMgr::LLGestureMgr()
mLoadingCount(0)
{
gInventory.addObserver(this);
+ mListener.reset(new LLGestureListener());
}
diff --git a/indra/newview/llgesturemgr.h b/indra/newview/llgesturemgr.h
index 5930841cbc..26a5924ec3 100644
--- a/indra/newview/llgesturemgr.h
+++ b/indra/newview/llgesturemgr.h
@@ -37,6 +37,7 @@
#include "llviewerinventory.h"
class LLMultiGesture;
+class LLGestureListener;
class LLGestureStep;
class LLUUID;
class LLVFS;
@@ -154,9 +155,9 @@ protected:
// Used by loadGesture
static void onLoadComplete(LLVFS *vfs,
- const LLUUID& asset_uuid,
- LLAssetType::EType type,
- void* user_data, S32 status, LLExtStat ext_status);
+ const LLUUID& asset_uuid,
+ LLAssetType::EType type,
+ void* user_data, S32 status, LLExtStat ext_status);
// Used by playGesture to load an asset file
// required to play a gesture step
@@ -185,6 +186,9 @@ private:
BOOL mValid;
std::set<LLUUID> mLoadingAssets;
+
+ // LLEventHost interface
+ boost::shared_ptr<LLGestureListener> mListener;
};
#endif
diff --git a/indra/newview/llgiveinventory.cpp b/indra/newview/llgiveinventory.cpp
index f990b9294d..30858871ec 100644
--- a/indra/newview/llgiveinventory.cpp
+++ b/indra/newview/llgiveinventory.cpp
@@ -311,6 +311,9 @@ void LLGiveInventory::logInventoryOffer(const LLUUID& to_agent, const LLUUID &im
std::string full_name;
if (gCacheName->getFullName(to_agent, full_name))
{
+ // Build a new format username or firstname_lastname for legacy names
+ // to use it for a history log filename.
+ full_name = LLCacheName::buildUsername(full_name);
LLIMModel::instance().logToFile(full_name, LLTrans::getString("SECOND_LIFE"), im_session_id, LLTrans::getString("inventory_item_offered-im"));
}
}
diff --git a/indra/newview/llgroupactions.cpp b/indra/newview/llgroupactions.cpp
index 7c56e610ce..97fa551441 100644
--- a/indra/newview/llgroupactions.cpp
+++ b/indra/newview/llgroupactions.cpp
@@ -40,10 +40,12 @@
#include "llsidetray.h"
#include "llstatusbar.h" // can_afford_transaction()
#include "llimfloater.h"
+#include "groupchatlistener.h"
//
// Globals
//
+static GroupChatListener sGroupChatListener;
class LLGroupHandler : public LLCommandHandler
{
@@ -320,10 +322,9 @@ void LLGroupActions::closeGroup(const LLUUID& group_id)
// static
-void LLGroupActions::startIM(const LLUUID& group_id)
+LLUUID LLGroupActions::startIM(const LLUUID& group_id)
{
- if (group_id.isNull())
- return;
+ if (group_id.isNull()) return LLUUID::null;
LLGroupData group_data;
if (gAgent.getGroupData(group_id, group_data))
@@ -337,12 +338,14 @@ void LLGroupActions::startIM(const LLUUID& group_id)
LLIMFloater::show(session_id);
}
make_ui_sound("UISndStartIM");
+ return session_id;
}
else
{
// this should never happen, as starting a group IM session
// relies on you belonging to the group and hence having the group data
make_ui_sound("UISndInvalidOp");
+ return LLUUID::null;
}
}
diff --git a/indra/newview/llgroupactions.h b/indra/newview/llgroupactions.h
index c52a25818b..3f9852f194 100644
--- a/indra/newview/llgroupactions.h
+++ b/indra/newview/llgroupactions.h
@@ -87,7 +87,7 @@ public:
/**
* Start group instant messaging session.
*/
- static void startIM(const LLUUID& group_id);
+ static LLUUID startIM(const LLUUID& group_id);
/**
* End group instant messaging session.
diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index 38c5ba71bd..4de6976534 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -195,7 +195,7 @@ LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string&
// set P2P type by default
mSessionType = P2P_SESSION;
- if (IM_NOTHING_SPECIAL == type || IM_SESSION_P2P_INVITE == type)
+ if (IM_NOTHING_SPECIAL == mType || IM_SESSION_P2P_INVITE == mType)
{
mVoiceChannel = new LLVoiceChannelP2P(session_id, name, other_participant_id);
mOtherParticipantIsAvatar = LLVoiceClient::getInstance()->isParticipantAvatar(mSessionID);
@@ -249,7 +249,7 @@ LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string&
new LLSessionTimeoutTimer(mSessionID, SESSION_INITIALIZATION_TIMEOUT);
}
- if (IM_NOTHING_SPECIAL == type)
+ if (IM_NOTHING_SPECIAL == mType)
{
mCallBackEnabled = LLVoiceClient::getInstance()->isSessionCallBackPossible(mSessionID);
mTextIMPossible = LLVoiceClient::getInstance()->isSessionTextIMPossible(mSessionID);
@@ -269,10 +269,10 @@ LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string&
// Localizing name of ad-hoc session. STORM-153
// Changing name should happen here- after the history file was created, so that
// history files have consistent (English) names in different locales.
- if (isAdHocSessionType() && IM_SESSION_INVITE == type)
+ if (isAdHocSessionType() && IM_SESSION_INVITE == mType)
{
- LLAvatarNameCache::get(mOtherParticipantID,
- boost::bind(&LLIMModel::LLIMSession::onAdHocNameCache,
+ LLAvatarNameCache::get(mOtherParticipantID,
+ boost::bind(&LLIMModel::LLIMSession::onAdHocNameCache,
this, _2));
}
}
@@ -553,23 +553,10 @@ bool LLIMModel::LLIMSession::isOtherParticipantAvaline()
return !mOtherParticipantIsAvatar;
}
-void LLIMModel::LLIMSession::onAvatarNameCache(const LLUUID& avatar_id, const LLAvatarName& av_name)
-{
- if (av_name.mUsername.empty())
- {
- // display names is off, use mDisplayName which will be the legacy name
- mHistoryFileName = LLCacheName::buildUsername(av_name.mDisplayName);
- }
- else
- {
- mHistoryFileName = av_name.mUsername;
- }
-}
-
void LLIMModel::LLIMSession::buildHistoryFileName()
{
mHistoryFileName = mName;
-
+
//ad-hoc requires sophisticated chat history saving schemes
if (isAdHoc())
{
@@ -583,17 +570,35 @@ void LLIMModel::LLIMSession::buildHistoryFileName()
{
std::set<LLUUID> sorted_uuids(mInitialTargetIDs.begin(), mInitialTargetIDs.end());
mHistoryFileName = mName + " hash" + generateHash(sorted_uuids);
- return;
}
-
- //in case of incoming ad-hoc sessions
- mHistoryFileName = mName + " " + LLLogChat::timestamp(true) + " " + mSessionID.asString().substr(0, 4);
+ else
+ {
+ //in case of incoming ad-hoc sessions
+ mHistoryFileName = mName + " " + LLLogChat::timestamp(true) + " " + mSessionID.asString().substr(0, 4);
+ }
}
-
- // look up username to use as the log name
- if (isP2P())
+ else if (isP2P()) // look up username to use as the log name
{
- LLAvatarNameCache::get(mOtherParticipantID, boost::bind(&LLIMModel::LLIMSession::onAvatarNameCache, this, _1, _2));
+ LLAvatarName av_name;
+ // For outgoing sessions we already have a cached name
+ // so no need for a callback in LLAvatarNameCache::get()
+ if (LLAvatarNameCache::get(mOtherParticipantID, &av_name))
+ {
+ if (av_name.mUsername.empty())
+ {
+ // Display names are off, use mDisplayName which will be the legacy name
+ mHistoryFileName = LLCacheName::buildUsername(av_name.mDisplayName);
+ }
+ else
+ {
+ mHistoryFileName = av_name.mUsername;
+ }
+ }
+ else
+ {
+ // Incoming P2P sessions include a name that we can use to build a history file name
+ mHistoryFileName = LLCacheName::buildUsername(mName);
+ }
}
}
@@ -615,7 +620,6 @@ std::string LLIMModel::LLIMSession::generateHash(const std::set<LLUUID>& sorted_
return participants_md5_hash.asString();
}
-
void LLIMModel::processSessionInitializedReply(const LLUUID& old_session_id, const LLUUID& new_session_id)
{
LLIMSession* session = findIMSession(old_session_id);
@@ -798,11 +802,6 @@ bool LLIMModel::logToFile(const std::string& file_name, const std::string& from,
}
}
-bool LLIMModel::logToFile(const LLUUID& session_id, const std::string& from, const LLUUID& from_id, const std::string& utf8_text)
-{
- return logToFile(LLIMModel::getInstance()->getHistoryFileName(session_id), from, from_id, utf8_text);
-}
-
bool LLIMModel::proccessOnlineOfflineNotification(
const LLUUID& session_id,
const std::string& utf8_text)
@@ -856,8 +855,11 @@ LLIMModel::LLIMSession* LLIMModel::addMessageSilently(const LLUUID& session_id,
}
addToHistory(session_id, from_name, from_id, utf8_text);
- if (log2file) logToFile(session_id, from_name, from_id, utf8_text);
-
+ if (log2file)
+ {
+ logToFile(getHistoryFileName(session_id), from_name, from_id, utf8_text);
+ }
+
session->mNumUnread++;
//update count of unread messages from real participant
@@ -2468,6 +2470,7 @@ void LLIMMgr::addSystemMessage(const LLUUID& session_id, const std::string& mess
std::string session_name;
// since we select user to share item with - his name is already in cache
gCacheName->getFullName(args["user_id"], session_name);
+ session_name = LLCacheName::buildUsername(session_name);
LLIMModel::instance().logToFile(session_name, SYSTEM_FROM, LLUUID::null, message.getString());
}
}
diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h
index a15776c207..0ee56c8070 100644
--- a/indra/newview/llimview.h
+++ b/indra/newview/llimview.h
@@ -98,13 +98,6 @@ public:
/** ad-hoc sessions involve sophisticated chat history file naming schemes */
void buildHistoryFileName();
- void onAvatarNameCache(const LLUUID& avatar_id, const LLAvatarName& av_name);
-
- void onAdHocNameCache(const LLAvatarName& av_name);
-
- //*TODO make private
- static std::string generateHash(const std::set<LLUUID>& sorted_uuids);
-
LLUUID mSessionID;
std::string mName;
EInstantMessage mType;
@@ -139,6 +132,11 @@ public:
//if IM session is created for a voice call
bool mStartedAsIMCall;
+
+ private:
+ void onAdHocNameCache(const LLAvatarName& av_name);
+
+ static std::string generateHash(const std::set<LLUUID>& sorted_uuids);
};
@@ -293,12 +291,7 @@ private:
/**
* Add message to a list of message associated with session specified by session_id
*/
- bool addToHistory(const LLUUID& session_id, const std::string& from, const LLUUID& from_id, const std::string& utf8_text);
-
- /**
- * Save an IM message into a file
- */
- bool logToFile(const LLUUID& session_id, const std::string& from, const LLUUID& from_id, const std::string& utf8_text);
+ bool addToHistory(const LLUUID& session_id, const std::string& from, const LLUUID& from_id, const std::string& utf8_text);
};
class LLIMSessionObserver
diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index 86c8a1a9b5..75d4c4e80d 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -40,6 +40,7 @@
#include "llfloateropenobject.h"
#include "llfloaterreg.h"
#include "llfloaterworldmap.h"
+#include "llfolderview.h"
#include "llfriendcard.h"
#include "llgesturemgr.h"
#include "llgiveinventory.h"
@@ -571,8 +572,8 @@ void LLInvFVBridge::getClipboardEntries(bool show_asset_id,
}
}
- // Don't allow items to be pasted directly into the COF.
- if (!isCOFFolder())
+ // Don't allow items to be pasted directly into the COF or the inbox
+ if (!isCOFFolder() && !isInboxFolder())
{
items.push_back(std::string("Paste"));
}
@@ -781,6 +782,18 @@ BOOL LLInvFVBridge::isCOFFolder() const
return LLAppearanceMgr::instance().getIsInCOF(mUUID);
}
+BOOL LLInvFVBridge::isInboxFolder() const
+{
+ const LLUUID inbox_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_INBOX, false, false);
+
+ if (inbox_id.isNull())
+ {
+ return FALSE;
+ }
+
+ return gInventory.isObjectDescendentOf(mUUID, inbox_id);
+}
+
BOOL LLInvFVBridge::isItemPermissive() const
{
return FALSE;
@@ -1786,6 +1799,10 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,
}
else
{
+ if (gInventory.isObjectDescendentOf(inv_cat->getUUID(), gInventory.findCategoryUUIDForType(LLFolderType::FT_INBOX, false, false)))
+ {
+ set_dad_inbox_object(inv_cat->getUUID());
+ }
// Reparent the folder and restamp children if it's moving
// into trash.
@@ -2525,6 +2542,7 @@ void LLFolderBridge::folderOptionsMenu()
{
mItems.push_back(std::string("Add To Outfit"));
}
+
mItems.push_back(std::string("Replace Outfit"));
}
if (is_ensemble)
@@ -2614,15 +2632,17 @@ void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
// Not sure what the right thing is to do here.
if (!isCOFFolder() && cat && (cat->getPreferredType() != LLFolderType::FT_OUTFIT))
{
- // 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"));
- mItems.push_back(std::string("New Clothes"));
- mItems.push_back(std::string("New Body Parts"));
-
+ if (!isInboxFolder()) // don't allow creation in inbox
+ {
+ // 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"));
+ mItems.push_back(std::string("New Clothes"));
+ mItems.push_back(std::string("New Body Parts"));
+ }
#if SUPPORT_ENSEMBLES
// Changing folder types is an unfinished unsupported feature
// and can lead to unexpected behavior if enabled.
@@ -3161,6 +3181,12 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
// (move the item, restamp if into trash)
else
{
+ // set up observer to select item once drag and drop from inbox is complete
+ if (gInventory.isObjectDescendentOf(inv_item->getUUID(), gInventory.findCategoryUUIDForType(LLFolderType::FT_INBOX, false, false)))
+ {
+ set_dad_inbox_object(inv_item->getUUID());
+ }
+
LLInvFVBridge::changeItemParent(
model,
(LLViewerInventoryItem*)inv_item,
diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h
index 1e849c8812..15629c0c75 100644
--- a/indra/newview/llinventorybridge.h
+++ b/indra/newview/llinventorybridge.h
@@ -139,6 +139,7 @@ protected:
BOOL isAgentInventory() const; // false if lost or in the inventory library
BOOL isCOFFolder() const; // true if COF or descendent of
+ BOOL isInboxFolder() const; // true if COF or descendent of marketplace inbox
virtual BOOL isItemPermissive() const;
static void changeItemParent(LLInventoryModel* model,
LLViewerInventoryItem* item,
@@ -584,6 +585,9 @@ protected:
};
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Recent Inventory Panel related classes
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Overridden version of the Inventory-Folder-View-Bridge for Folders
class LLRecentItemsFolderBridge : public LLFolderBridge
diff --git a/indra/newview/llinventoryfilter.cpp b/indra/newview/llinventoryfilter.cpp
index dee15a1efd..d6278a5fda 100644
--- a/indra/newview/llinventoryfilter.cpp
+++ b/indra/newview/llinventoryfilter.cpp
@@ -107,6 +107,32 @@ BOOL LLInventoryFilter::check(const LLFolderViewItem* item)
return passed;
}
+bool LLInventoryFilter::checkFolder(const LLFolderViewFolder* folder)
+{
+ // we're showing all folders, overriding filter
+ if (mFilterOps.mShowFolderState == LLInventoryFilter::SHOW_ALL_FOLDERS)
+ {
+ return true;
+ }
+
+ 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
+ // (e.g. versus in-world object contents).
+ const LLViewerInventoryCategory *cat = gInventory.getCategory(folder_id);
+ if (!cat)
+ return false;
+ LLFolderType::EType cat_type = cat->getPreferredType();
+ if (cat_type != LLFolderType::FT_NONE && (1LL << cat_type & mFilterOps.mFilterCategoryTypes) == U64(0))
+ return false;
+ }
+
+ return true;
+}
+
BOOL LLInventoryFilter::checkAgainstFilterType(const LLFolderViewItem* item) const
{
const LLFolderViewEventListener* listener = item->getListener();
@@ -137,30 +163,6 @@ BOOL LLInventoryFilter::checkAgainstFilterType(const LLFolderViewItem* item) con
}
}
-
- ////////////////////////////////////////////////////////////////////////////////
- // FILTERTYPE_CATEGORY
- // Pass if this item is a category of the filter type, or
- // if its parent is a category of the filter type.
- if (filterTypes & FILTERTYPE_CATEGORY)
- {
- // Can only filter categories for items in your inventory
- // (e.g. versus in-world object contents).
- if (!object) return FALSE;
-
- LLUUID cat_id = object_id;
- if (listener->getInventoryType() != LLInventoryType::IT_CATEGORY)
- {
- cat_id = object->getParentUUID();
- }
- const LLViewerInventoryCategory *cat = gInventory.getCategory(cat_id);
- if (!cat)
- return FALSE;
- if ((1LL << cat->getPreferredType() & mFilterOps.mFilterCategoryTypes) == U64(0))
- return FALSE;
- }
-
-
////////////////////////////////////////////////////////////////////////////////
// FILTERTYPE_UUID
// Pass if this item is the target UUID or if it links to the target UUID
@@ -172,7 +174,6 @@ BOOL LLInventoryFilter::checkAgainstFilterType(const LLFolderViewItem* item) con
return FALSE;
}
-
////////////////////////////////////////////////////////////////////////////////
// FILTERTYPE_DATE
// Pass if this item is within the date range.
@@ -293,15 +294,15 @@ BOOL LLInventoryFilter::isModifiedAndClear()
return ret;
}
-void LLInventoryFilter::setFilterObjectTypes(U64 types)
+void LLInventoryFilter::updateFilterTypes(U64 types, U64& current_types)
{
- if (mFilterOps.mFilterObjectTypes != types)
+ if (current_types != types)
{
// keep current items only if no type bits getting turned off
- BOOL fewer_bits_set = (mFilterOps.mFilterObjectTypes & ~types);
- BOOL more_bits_set = (~mFilterOps.mFilterObjectTypes & types);
+ bool fewer_bits_set = (current_types & ~types) != 0;
+ bool more_bits_set = (~current_types & types) != 0;
- mFilterOps.mFilterObjectTypes = types;
+ current_types = types;
if (more_bits_set && fewer_bits_set)
{
// neither less or more restrive, both simultaneously
@@ -318,62 +319,23 @@ void LLInventoryFilter::setFilterObjectTypes(U64 types)
setModified(FILTER_MORE_RESTRICTIVE);
}
}
+}
+
+void LLInventoryFilter::setFilterObjectTypes(U64 types)
+{
+ updateFilterTypes(types, mFilterOps.mFilterObjectTypes);
mFilterOps.mFilterTypes |= FILTERTYPE_OBJECT;
}
void LLInventoryFilter::setFilterCategoryTypes(U64 types)
{
- if (mFilterOps.mFilterCategoryTypes != types)
- {
- // keep current items only if no type bits getting turned off
- BOOL fewer_bits_set = (mFilterOps.mFilterCategoryTypes & ~types);
- BOOL more_bits_set = (~mFilterOps.mFilterCategoryTypes & types);
-
- mFilterOps.mFilterCategoryTypes = types;
- if (more_bits_set && fewer_bits_set)
- {
- // neither less or more restrive, both simultaneously
- // so we need to filter from scratch
- setModified(FILTER_RESTART);
- }
- else if (more_bits_set)
- {
- // target is only one of all requested types so more type bits == less restrictive
- setModified(FILTER_LESS_RESTRICTIVE);
- }
- else if (fewer_bits_set)
- {
- setModified(FILTER_MORE_RESTRICTIVE);
- }
- }
- mFilterOps.mFilterTypes |= FILTERTYPE_OBJECT;
+ updateFilterTypes(types, mFilterOps.mFilterCategoryTypes);
+ mFilterOps.mFilterTypes |= FILTERTYPE_CATEGORY;
}
void LLInventoryFilter::setFilterWearableTypes(U64 types)
{
- if (mFilterOps.mFilterWearableTypes != types)
- {
- // keep current items only if no type bits getting turned off
- BOOL fewer_bits_set = (mFilterOps.mFilterWearableTypes & ~types);
- BOOL more_bits_set = (~mFilterOps.mFilterWearableTypes & types);
-
- mFilterOps.mFilterWearableTypes = types;
- if (more_bits_set && fewer_bits_set)
- {
- // neither less or more restrive, both simultaneously
- // so we need to filter from scratch
- setModified(FILTER_RESTART);
- }
- else if (more_bits_set)
- {
- // target is only one of all requested types so more type bits == less restrictive
- setModified(FILTER_LESS_RESTRICTIVE);
- }
- else if (fewer_bits_set)
- {
- setModified(FILTER_MORE_RESTRICTIVE);
- }
- }
+ updateFilterTypes(types, mFilterOps.mFilterWearableTypes);
mFilterOps.mFilterTypes |= FILTERTYPE_WEARABLE;
}
@@ -898,11 +860,16 @@ void LLInventoryFilter::fromLLSD(LLSD& data)
}
}
-U32 LLInventoryFilter::getFilterObjectTypes() const
+U64 LLInventoryFilter::getFilterObjectTypes() const
{
return mFilterOps.mFilterObjectTypes;
}
+U64 LLInventoryFilter::getFilterCategoryTypes() const
+{
+ return mFilterOps.mFilterCategoryTypes;
+}
+
BOOL LLInventoryFilter::hasFilterString() const
{
return mFilterSubString.size() > 0;
diff --git a/indra/newview/llinventoryfilter.h b/indra/newview/llinventoryfilter.h
index 39e6f797a2..f9460822f7 100644
--- a/indra/newview/llinventoryfilter.h
+++ b/indra/newview/llinventoryfilter.h
@@ -31,6 +31,7 @@
#include "llpermissionsflags.h"
class LLFolderViewItem;
+class LLFolderViewFolder;
class LLInventoryFilter
{
@@ -81,11 +82,13 @@ public:
// + Parameters
// +-------------------------------------------------------------------+
void setFilterObjectTypes(U64 types);
- U32 getFilterObjectTypes() const;
+ U64 getFilterObjectTypes() const;
+ U64 getFilterCategoryTypes() const;
BOOL isFilterObjectTypesWith(LLInventoryType::EType t) const;
void setFilterCategoryTypes(U64 types);
void setFilterUUID(const LLUUID &object_id);
void setFilterWearableTypes(U64 types);
+ void updateFilterTypes(U64 types, U64& current_types);
void setFilterSubString(const std::string& string);
const std::string& getFilterSubString(BOOL trim = FALSE) const;
@@ -110,6 +113,7 @@ public:
// + Execution And Results
// +-------------------------------------------------------------------+
BOOL check(const LLFolderViewItem* item);
+ bool checkFolder(const LLFolderViewFolder* folder);
BOOL checkAgainstFilterType(const LLFolderViewItem* item) const;
BOOL checkAgainstPermissions(const LLFolderViewItem* item) const;
BOOL checkAgainstFilterLinks(const LLFolderViewItem* item) const;
diff --git a/indra/newview/llinventoryfunctions.h b/indra/newview/llinventoryfunctions.h
index cfe1747fd4..2016b92666 100644
--- a/indra/newview/llinventoryfunctions.h
+++ b/indra/newview/llinventoryfunctions.h
@@ -28,9 +28,9 @@
#ifndef LL_LLINVENTORYFUNCTIONS_H
#define LL_LLINVENTORYFUNCTIONS_H
-#include "llinventorytype.h"
-#include "llfolderview.h"
-#include "llfolderviewitem.h"
+#include "llinventorymodel.h"
+#include "llinventory.h"
+#include "llwearabletype.h"
/********************************************************************************
** **
@@ -417,6 +417,24 @@ public:
/** Inventory Collector Functions
** **
*******************************************************************************/
+class LLFolderViewItem;
+class LLFolderViewFolder;
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLFolderViewFunctor
+//
+// Simple abstract base class for applying a functor to folders and
+// items in a folder view hierarchy. This is suboptimal for algorithms
+// that only work folders or only work on items, but I'll worry about
+// that later when it's determined to be too slow.
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+class LLFolderViewFunctor
+{
+public:
+ virtual ~LLFolderViewFunctor() {}
+ virtual void doFolder(LLFolderViewFolder* folder) = 0;
+ virtual void doItem(LLFolderViewItem* item) = 0;
+};
class LLInventoryState
{
diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp
index b5180854ef..21d5de9a5b 100644
--- a/indra/newview/llinventorymodel.cpp
+++ b/indra/newview/llinventorymodel.cpp
@@ -632,10 +632,12 @@ U32 LLInventoryModel::updateItem(const LLViewerInventoryItem* item)
}
// We're hiding mesh types
+#if 0
if (item->getType() == LLAssetType::AT_MESH)
{
return mask;
}
+#endif
LLViewerInventoryItem* old_item = getItem(item->getUUID());
LLPointer<LLViewerInventoryItem> new_item;
@@ -2587,7 +2589,7 @@ void LLInventoryModel::processBulkUpdateInventory(LLMessageSystem* msg, void**)
LLInventoryState::sWearNewClothing = FALSE;
}
- if (tid == LLInventoryState::sWearNewClothingTransactionID)
+ if (tid.notNull() && tid == LLInventoryState::sWearNewClothingTransactionID)
{
count = wearable_ids.size();
for (i = 0; i < count; ++i)
diff --git a/indra/newview/llinventorymodelbackgroundfetch.cpp b/indra/newview/llinventorymodelbackgroundfetch.cpp
index 7b1ff102e7..afaf660cb7 100644
--- a/indra/newview/llinventorymodelbackgroundfetch.cpp
+++ b/indra/newview/llinventorymodelbackgroundfetch.cpp
@@ -31,7 +31,9 @@
#include "llappviewer.h"
#include "llcallbacklist.h"
#include "llinventorypanel.h"
+#include "llinventorymodel.h"
#include "llviewercontrol.h"
+#include "llviewerinventory.h"
#include "llviewermessage.h"
#include "llviewerregion.h"
#include "llviewerwindow.h"
diff --git a/indra/newview/llinventoryobserver.cpp b/indra/newview/llinventoryobserver.cpp
index 6bf19e346d..ceba4a0191 100644
--- a/indra/newview/llinventoryobserver.cpp
+++ b/indra/newview/llinventoryobserver.cpp
@@ -601,6 +601,34 @@ void LLInventoryAddedObserver::changed(U32 mask)
}
}
+void LLInventoryCategoryAddedObserver::changed(U32 mask)
+{
+ if (!(mask & LLInventoryObserver::ADD))
+ {
+ return;
+ }
+
+ const LLInventoryModel::changed_items_t& changed_ids = gInventory.getChangedIDs();
+
+ for (LLInventoryModel::changed_items_t::const_iterator cit = changed_ids.begin(); cit != changed_ids.end(); ++cit)
+ {
+ LLViewerInventoryCategory* cat = gInventory.getCategory(*cit);
+
+ if (cat)
+ {
+ mAddedCategories.push_back(cat);
+ }
+ }
+
+ if (!mAddedCategories.empty())
+ {
+ done();
+
+ mAddedCategories.clear();
+ }
+}
+
+
LLInventoryTransactionObserver::LLInventoryTransactionObserver(const LLTransactionID& transaction_id) :
mTransactionID(transaction_id)
{
diff --git a/indra/newview/llinventoryobserver.h b/indra/newview/llinventoryobserver.h
index 2d9021961e..aa1eae84d7 100644
--- a/indra/newview/llinventoryobserver.h
+++ b/indra/newview/llinventoryobserver.h
@@ -219,6 +219,28 @@ protected:
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLInventoryCategoryAddedObserver
+//
+// Base class for doing something when a new category is created in the
+// inventory.
+// It does not watch for a certain UUID, rather it acts when anything is added
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+class LLInventoryCategoryAddedObserver : public LLInventoryObserver
+{
+public:
+
+ typedef std::vector<LLViewerInventoryCategory*> cat_vec_t;
+
+ LLInventoryCategoryAddedObserver() : mAddedCategories() {}
+ /*virtual*/ void changed(U32 mask);
+
+protected:
+ virtual void done() = 0;
+
+ cat_vec_t mAddedCategories;
+};
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Class LLInventoryTransactionObserver
//
// Base class for doing something when an inventory transaction completes.
diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp
index 1dcb91ad4d..702e8d5a1f 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 "llfolderview.h"
#include "llimfloater.h"
#include "llimview.h"
#include "llinventorybridge.h"
@@ -42,7 +43,6 @@
#include "llinventorymodelbackgroundfetch.h"
#include "llsidepanelinventory.h"
#include "llsidetray.h"
-#include "llscrollcontainer.h"
#include "llviewerattachmenu.h"
#include "llviewerfoldertype.h"
#include "llvoavatarself.h"
@@ -131,9 +131,8 @@ LLInventoryPanel::LLInventoryPanel(const LLInventoryPanel::Params& p) :
mInventory(p.inventory),
mAllowMultiSelect(p.allow_multi_select),
mShowItemLinkOverlays(p.show_item_link_overlays),
+ mShowLoadStatus(p.show_load_status),
mViewsInitialized(false),
- mStartFolderString(p.start_folder),
- mBuildDefaultHierarchy(true),
mInvFVBridgeBuilder(NULL)
{
mInvFVBridgeBuilder = &INVENTORY_BRIDGE_BUILDER;
@@ -146,11 +145,88 @@ LLInventoryPanel::LLInventoryPanel(const LLInventoryPanel::Params& p) :
mCommitCallbackRegistrar.add("Inventory.AttachObject", boost::bind(&LLInventoryPanel::attachObject, this, _2));
mCommitCallbackRegistrar.add("Inventory.BeginIMSession", boost::bind(&LLInventoryPanel::beginIMSession, this));
mCommitCallbackRegistrar.add("Inventory.Share", boost::bind(&LLAvatarActions::shareWithAvatars));
+
+}
+
+void LLInventoryPanel::buildFolderView(const LLInventoryPanel::Params& params)
+{
+ // Determine the root folder in case specified, and
+ // build the views starting with that folder.
+
+ std::string start_folder_name(params.start_folder());
+
+ const LLFolderType::EType preferred_type = LLViewerFolderType::lookupTypeFromNewCategoryName(start_folder_name);
+
+ LLUUID root_id;
+
+ if ("LIBRARY" == params.start_folder())
+ {
+ root_id = gInventory.getLibraryRootFolderID();
+ }
+ // leslie -- temporary HACK to work around sim not creating inbox and outbox with proper system folder type
+ else if (preferred_type == LLFolderType::FT_INBOX)
+ {
+ 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() == "Received Items")
+ {
+ root_id = cat->getUUID();
+ }
+ }
+ }
+ }
+ // leslie -- temporary HACK to work around sim not creating inbox and outbox with proper system folder type
+ else if (preferred_type == LLFolderType::FT_OUTBOX)
+ {
+ 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() == "Merchant Outbox")
+ {
+ root_id = cat->getUUID();
+ }
+ }
+ }
+ }
+ // leslie -- end temporary HACK
+ else
+ {
+ root_id = (preferred_type != LLFolderType::FT_NONE)
+ ? gInventory.findCategoryUUIDForType(preferred_type, false, false)
+ : LLUUID::null;
+ }
- if (mStartFolderString != "")
+ if ((root_id == LLUUID::null) && !start_folder_name.empty())
{
- mBuildDefaultHierarchy = false;
+ llwarns << "No category found that matches start_folder: " << start_folder_name << llendl;
+ root_id = LLUUID::generateNewID();
}
+
+ LLInvFVBridge* new_listener = mInvFVBridgeBuilder->createBridge(LLAssetType::AT_CATEGORY,
+ LLAssetType::AT_CATEGORY,
+ LLInventoryType::IT_CATEGORY,
+ this,
+ NULL,
+ root_id);
+
+ mFolderRoot = createFolderView(new_listener, params.use_label_suffix());
}
void LLInventoryPanel::initFromParams(const LLInventoryPanel::Params& params)
@@ -159,22 +235,7 @@ void LLInventoryPanel::initFromParams(const LLInventoryPanel::Params& params)
mCommitCallbackRegistrar.pushScope(); // registered as a widget; need to push callback scope ourselves
- // Create root folder
- {
- LLRect folder_rect(0,
- 0,
- getRect().getWidth(),
- 0);
- LLFolderView::Params p;
- p.name = getName();
- p.title = getLabel();
- p.rect = folder_rect;
- p.parent_panel = this;
- p.tool_tip = p.name;
- p.use_label_suffix = params.use_label_suffix;
- mFolderRoot = LLUICtrlFactory::create<LLFolderView>(p);
- mFolderRoot->setAllowMultiSelect(mAllowMultiSelect);
- }
+ buildFolderView(params);
mCommitCallbackRegistrar.popScope();
@@ -184,13 +245,9 @@ void LLInventoryPanel::initFromParams(const LLInventoryPanel::Params& params)
{
LLRect scroller_view_rect = getRect();
scroller_view_rect.translate(-scroller_view_rect.mLeft, -scroller_view_rect.mBottom);
- LLScrollContainer::Params p;
- p.name("Inventory Scroller");
- p.rect(scroller_view_rect);
- p.follows.flags(FOLLOWS_ALL);
- p.reserve_scroll_corner(true);
- p.tab_stop(true);
- mScroller = LLUICtrlFactory::create<LLScrollContainer>(p);
+ LLScrollContainer::Params scroller_params(params.scroll());
+ scroller_params.rect(scroller_view_rect);
+ mScroller = LLUICtrlFactory::create<LLScrollContainer>(scroller_params);
addChild(mScroller);
mScroller->addChild(mFolderRoot);
mFolderRoot->setScrollContainer(mScroller);
@@ -206,7 +263,7 @@ void LLInventoryPanel::initFromParams(const LLInventoryPanel::Params& params)
// Build view of inventory if we need default full hierarchy and inventory ready,
// otherwise wait for idle callback.
- if (mBuildDefaultHierarchy && mInventory->isInventoryUsable() && !mViewsInitialized)
+ if (mInventory->isInventoryUsable() && !mViewsInitialized)
{
initializeViews();
}
@@ -222,6 +279,9 @@ void LLInventoryPanel::initFromParams(const LLInventoryPanel::Params& params)
}
mFolderRoot->setSortOrder(getFilter()->getSortOrder());
+ // hide inbox
+ getFilter()->setFilterCategoryTypes(getFilter()->getFilterCategoryTypes() & ~(1ULL << LLFolderType::FT_INBOX));
+
// Initialize base class params.
LLPanel::initFromParams(params);
}
@@ -264,6 +324,15 @@ LLInventoryFilter* LLInventoryPanel::getFilter()
return NULL;
}
+const LLInventoryFilter* LLInventoryPanel::getFilter() const
+{
+ if (mFolderRoot)
+ {
+ return mFolderRoot->getFilter();
+ }
+ return NULL;
+}
+
void LLInventoryPanel::setFilterTypes(U64 types, LLInventoryFilter::EFilterType filter_type)
{
if (filter_type == LLInventoryFilter::FILTERTYPE_OBJECT)
@@ -272,6 +341,17 @@ void LLInventoryPanel::setFilterTypes(U64 types, LLInventoryFilter::EFilterType
getFilter()->setFilterCategoryTypes(types);
}
+U32 LLInventoryPanel::getFilterObjectTypes() const
+{
+ return mFolderRoot->getFilterObjectTypes();
+}
+
+U32 LLInventoryPanel::getFilterPermMask() const
+{
+ return mFolderRoot->getFilterPermissions();
+}
+
+
void LLInventoryPanel::setFilterPermMask(PermissionMask filter_perm_mask)
{
getFilter()->setFilterPermissions(filter_perm_mask);
@@ -287,6 +367,12 @@ void LLInventoryPanel::setFilterSubString(const std::string& string)
getFilter()->setFilterSubString(string);
}
+const std::string LLInventoryPanel::getFilterSubString()
+{
+ return mFolderRoot->getFilterSubString();
+}
+
+
void LLInventoryPanel::setSortOrder(U32 order)
{
getFilter()->setSortOrder(order);
@@ -298,6 +384,12 @@ void LLInventoryPanel::setSortOrder(U32 order)
}
}
+U32 LLInventoryPanel::getSortOrder() const
+{
+ return mFolderRoot->getSortOrder();
+}
+
+
void LLInventoryPanel::setSinceLogoff(BOOL sl)
{
getFilter()->setDateRangeLastLogoff(sl);
@@ -379,7 +471,8 @@ void LLInventoryPanel::modelChanged(U32 mask)
{
view_item->destroyView();
}
- buildNewViews(item_id);
+ view_item = buildNewViews(item_id);
+ view_folder = dynamic_cast<LLFolderViewFolder *>(view_item);
}
//////////////////////////////
@@ -432,11 +525,10 @@ void LLInventoryPanel::modelChanged(U32 mask)
//////////////////////////////
// STRUCTURE Operation
// This item already exists in both memory and UI. It was probably reparented.
- if (model_item && view_item)
+ else if (model_item && view_item)
{
- // Don't process the item if it's hanging from the root, since its
- // model_item's parent will be NULL.
- if (view_item->getRoot() != view_item->getParent())
+ // Don't process the item if it is the root
+ if (view_item->getRoot() != view_item)
{
LLFolderViewFolder* new_parent = (LLFolderViewFolder*)mFolderRoot->getItemByID(model_item->getParentUUID());
// Item has been moved.
@@ -461,7 +553,7 @@ void LLInventoryPanel::modelChanged(U32 mask)
//////////////////////////////
// REMOVE Operation
// This item has been removed from memory, but its associated UI element still exists.
- if (!model_item && view_item)
+ else if (!model_item && view_item)
{
// Remove the item's UI.
view_item->destroyView();
@@ -470,6 +562,12 @@ void LLInventoryPanel::modelChanged(U32 mask)
}
}
+LLFolderView* LLInventoryPanel::getRootFolder()
+{
+ return mFolderRoot;
+}
+
+
// static
void LLInventoryPanel::onIdle(void *userdata)
{
@@ -488,23 +586,16 @@ void LLInventoryPanel::onIdle(void *userdata)
}
}
+const LLUUID& LLInventoryPanel::getRootFolderID() const
+{
+ return mFolderRoot->getListener()->getUUID();
+}
+
void LLInventoryPanel::initializeViews()
{
if (!gInventory.isInventoryUsable()) return;
- // Determine the root folder in case specified, and
- // build the views starting with that folder.
- const LLFolderType::EType preferred_type = LLViewerFolderType::lookupTypeFromNewCategoryName(mStartFolderString);
-
- if ("LIBRARY" == mStartFolderString)
- {
- mStartFolderID = gInventory.getLibraryRootFolderID();
- }
- else
- {
- mStartFolderID = (preferred_type != LLFolderType::FT_NONE ? gInventory.findCategoryUUIDForType(preferred_type) : LLUUID::null);
- }
- rebuildViewsFor(mStartFolderID);
+ rebuildViewsFor(getRootFolderID());
mViewsInitialized = true;
@@ -529,132 +620,155 @@ void LLInventoryPanel::initializeViews()
}
}
-void LLInventoryPanel::rebuildViewsFor(const LLUUID& id)
+LLFolderViewItem* LLInventoryPanel::rebuildViewsFor(const LLUUID& id)
{
// Destroy the old view for this ID so we can rebuild it.
LLFolderViewItem* old_view = mFolderRoot->getItemByID(id);
- if (old_view && id.notNull())
+ if (old_view)
{
old_view->destroyView();
}
- buildNewViews(id);
+ return buildNewViews(id);
}
-void LLInventoryPanel::buildNewViews(const LLUUID& id)
+LLFolderView * LLInventoryPanel::createFolderView(LLInvFVBridge * bridge, bool useLabelSuffix)
{
- LLMemType mt(LLMemType::MTYPE_INVENTORY_BUILD_NEW_VIEWS);
- LLFolderViewItem* itemp = NULL;
- LLInventoryObject* objectp = gInventory.getObject(id);
- if (objectp)
+ LLRect folder_rect(0,
+ 0,
+ getRect().getWidth(),
+ 0);
+
+ LLFolderView::Params p;
+
+ p.name = getName();
+ p.title = getLabel();
+ p.rect = folder_rect;
+ p.parent_panel = this;
+ p.tool_tip = p.name;
+ p.listener = bridge;
+ p.use_label_suffix = useLabelSuffix;
+ p.allow_multiselect = mAllowMultiSelect;
+ p.show_load_status = mShowLoadStatus;
+
+ return LLUICtrlFactory::create<LLFolderView>(p);
+}
+
+LLFolderViewFolder * LLInventoryPanel::createFolderViewFolder(LLInvFVBridge * bridge)
+{
+ LLFolderViewFolder::Params params;
+
+ params.name = bridge->getDisplayName();
+ params.icon = bridge->getIcon();
+ params.icon_open = bridge->getOpenIcon();
+
+ if (mShowItemLinkOverlays) // if false, then links show up just like normal items
{
- const LLUUID &parent_id = objectp->getParentUUID();
- LLFolderViewFolder* parent_folder = (LLFolderViewFolder*)mFolderRoot->getItemByID(parent_id);
- if (id == mStartFolderID)
- {
- parent_folder = mFolderRoot;
- }
- else if ((mStartFolderID != LLUUID::null) && (!gInventory.isObjectDescendentOf(id, mStartFolderID)))
- {
- // This item exists outside the inventory's hierarchy, so don't add it.
- return;
- }
-
- if (objectp->getType() <= LLAssetType::AT_NONE ||
- objectp->getType() >= LLAssetType::AT_COUNT)
- {
- llwarns << "LLInventoryPanel::buildNewViews called with invalid objectp->mType : "
- << ((S32) objectp->getType()) << " name " << objectp->getName() << " UUID " << objectp->getUUID()
- << llendl;
- return;
- }
-
- if ((objectp->getType() == LLAssetType::AT_CATEGORY) &&
- (objectp->getActualType() != LLAssetType::AT_LINK_FOLDER))
- {
- LLInvFVBridge* new_listener = mInvFVBridgeBuilder->createBridge(objectp->getType(),
- objectp->getType(),
- LLInventoryType::IT_CATEGORY,
- this,
- mFolderRoot,
- objectp->getUUID());
- if (new_listener)
- {
- LLFolderViewFolder::Params params;
- params.name = new_listener->getDisplayName();
- params.icon = new_listener->getIcon();
- params.icon_open = new_listener->getOpenIcon();
- if (mShowItemLinkOverlays) // if false, then links show up just like normal items
- {
- params.icon_overlay = LLUI::getUIImage("Inv_Link");
- }
- params.root = mFolderRoot;
- params.listener = new_listener;
- params.tool_tip = params.name;
- LLFolderViewFolder* folderp = LLUICtrlFactory::create<LLFolderViewFolder>(params);
- folderp->setItemSortOrder(mFolderRoot->getSortOrder());
- itemp = folderp;
-
- // Hide the root folder, so we can show the contents of a folder flat
- // but still have the parent folder present for listener-related operations.
- if (id == mStartFolderID)
- {
- folderp->setHidden(TRUE);
- }
- const LLViewerInventoryCategory *cat = dynamic_cast<LLViewerInventoryCategory *>(objectp);
- if (cat && getIsHiddenFolderType(cat->getPreferredType()))
- {
- folderp->setHidden(TRUE);
- }
- }
- }
- else
- {
- // Build new view for item.
- LLInventoryItem* item = (LLInventoryItem*)objectp;
- LLInvFVBridge* new_listener = mInvFVBridgeBuilder->createBridge(item->getType(),
- item->getActualType(),
- item->getInventoryType(),
- this,
- mFolderRoot,
- item->getUUID(),
- item->getFlags());
-
- if (new_listener)
- {
- LLFolderViewItem::Params params;
- params.name = new_listener->getDisplayName();
- params.icon = new_listener->getIcon();
- params.icon_open = new_listener->getOpenIcon();
- if (mShowItemLinkOverlays) // if false, then links show up just like normal items
- {
- params.icon_overlay = LLUI::getUIImage("Inv_Link");
- }
- params.creation_date = new_listener->getCreationDate();
- params.root = mFolderRoot;
- params.listener = new_listener;
- params.rect = LLRect (0, 0, 0, 0);
- params.tool_tip = params.name;
- itemp = LLUICtrlFactory::create<LLFolderViewItem> (params);
- }
- }
+ params.icon_overlay = LLUI::getUIImage("Inv_Link");
+ }
+
+ params.root = mFolderRoot;
+ params.listener = bridge;
+ params.tool_tip = params.name;
- if (itemp)
- {
- itemp->addToFolder(parent_folder, mFolderRoot);
+ return LLUICtrlFactory::create<LLFolderViewFolder>(params);
+}
- // Don't add children of hidden folders unless this is the panel's root folder.
- if (itemp->getHidden() && (id != mStartFolderID))
- {
- return;
- }
+LLFolderViewItem * LLInventoryPanel::createFolderViewItem(LLInvFVBridge * bridge)
+{
+ LLFolderViewItem::Params params;
+
+ params.name = bridge->getDisplayName();
+ params.icon = bridge->getIcon();
+ params.icon_open = bridge->getOpenIcon();
+
+ if (mShowItemLinkOverlays) // if false, then links show up just like normal items
+ {
+ params.icon_overlay = LLUI::getUIImage("Inv_Link");
+ }
+
+ params.creation_date = bridge->getCreationDate();
+ params.root = mFolderRoot;
+ params.listener = bridge;
+ params.rect = LLRect (0, 0, 0, 0);
+ params.tool_tip = params.name;
+
+ return LLUICtrlFactory::create<LLFolderViewItem>(params);
+}
+
+LLFolderViewItem* LLInventoryPanel::buildNewViews(const LLUUID& id)
+{
+ LLInventoryObject const* objectp = gInventory.getObject(id);
+ LLUUID root_id = mFolderRoot->getListener()->getUUID();
+ LLFolderViewFolder* parent_folder = NULL;
+ LLFolderViewItem* itemp = NULL;
+
+ if (id == root_id)
+ {
+ parent_folder = mFolderRoot;
+ }
+ else if (objectp)
+ {
+ const LLUUID &parent_id = objectp->getParentUUID();
+ parent_folder = (LLFolderViewFolder*)mFolderRoot->getItemByID(parent_id);
+
+ if (parent_folder)
+ {
+ if (objectp->getType() <= LLAssetType::AT_NONE ||
+ objectp->getType() >= LLAssetType::AT_COUNT)
+ {
+ llwarns << "LLInventoryPanel::buildNewViews called with invalid objectp->mType : "
+ << ((S32) objectp->getType()) << " name " << objectp->getName() << " UUID " << objectp->getUUID()
+ << llendl;
+ return NULL;
+ }
+
+ if ((objectp->getType() == LLAssetType::AT_CATEGORY) &&
+ (objectp->getActualType() != LLAssetType::AT_LINK_FOLDER))
+ {
+ LLInvFVBridge* new_listener = mInvFVBridgeBuilder->createBridge(objectp->getType(),
+ objectp->getType(),
+ LLInventoryType::IT_CATEGORY,
+ this,
+ mFolderRoot,
+ objectp->getUUID());
+ if (new_listener)
+ {
+ LLFolderViewFolder* folderp = createFolderViewFolder(new_listener);
+ folderp->setItemSortOrder(mFolderRoot->getSortOrder());
+ itemp = folderp;
+ }
+ }
+ else
+ {
+ // Build new view for item.
+ LLInventoryItem* item = (LLInventoryItem*)objectp;
+ LLInvFVBridge* new_listener = mInvFVBridgeBuilder->createBridge(item->getType(),
+ item->getActualType(),
+ item->getInventoryType(),
+ this,
+ mFolderRoot,
+ item->getUUID(),
+ item->getFlags());
+
+ if (new_listener)
+ {
+ itemp = createFolderViewItem(new_listener);
+ }
+ }
+
+ if (itemp)
+ {
+ itemp->addToFolder(parent_folder, mFolderRoot);
+ }
}
}
// If this is a folder, add the children of the folder and recursively add any
// child folders.
- if ((id == mStartFolderID) ||
- (objectp && objectp->getType() == LLAssetType::AT_CATEGORY))
+ if (id.isNull()
+ || (objectp
+ && objectp->getType() == LLAssetType::AT_CATEGORY))
{
LLViewerInventoryCategory::cat_array_t* categories;
LLViewerInventoryItem::item_array_t* items;
@@ -671,7 +785,7 @@ void LLInventoryPanel::buildNewViews(const LLUUID& id)
}
}
- if(items)
+ if(items && parent_folder)
{
for (LLViewerInventoryItem::item_array_t::const_iterator item_iter = items->begin();
item_iter != items->end();
@@ -683,28 +797,25 @@ void LLInventoryPanel::buildNewViews(const LLUUID& id)
}
mInventory->unlockDirectDescendentArrays(id);
}
+
+ return itemp;
}
// bit of a hack to make sure the inventory is open.
void LLInventoryPanel::openStartFolderOrMyInventory()
{
- if (mStartFolderString != "")
+ // Find My Inventory folder and open it up by name
+ for (LLView *child = mFolderRoot->getFirstChild(); child; child = mFolderRoot->findNextSibling(child))
{
- mFolderRoot->openFolder(mStartFolderString);
- }
- else
- {
- // Find My Inventory folder and open it up by name
- for (LLView *child = mFolderRoot->getFirstChild(); child; child = mFolderRoot->findNextSibling(child))
+ LLFolderViewFolder *fchild = dynamic_cast<LLFolderViewFolder*>(child);
+ if (fchild
+ && fchild->getListener()
+ && fchild->getListener()->getUUID() == gInventory.getRootFolderID())
{
- LLFolderViewFolder *fchild = dynamic_cast<LLFolderViewFolder*>(child);
- if (fchild && fchild->getListener() &&
- (fchild->getListener()->getUUID() == gInventory.getRootFolderID()))
- {
- const std::string& child_name = child->getName();
- mFolderRoot->openFolder(child_name);
- break;
- }
+ const std::string& child_name = child->getName();
+ mFolderRoot->openFolder(child_name);
+ mFolderRoot->clearSelection(); // No need to keep it selected though!
+ break;
}
}
}
@@ -723,6 +834,12 @@ void LLInventoryPanel::openSelected()
bridge->openItem();
}
+void LLInventoryPanel::unSelectAll()
+{
+ mFolderRoot->setSelection(NULL, FALSE, FALSE);
+}
+
+
BOOL LLInventoryPanel::handleHover(S32 x, S32 y, MASK mask)
{
BOOL handled = LLView::handleHover(x, y, mask);
@@ -802,7 +919,7 @@ void LLInventoryPanel::setSelection(const LLUUID& obj_id, BOOL take_keyboard_foc
mFolderRoot->setSelectionByID(obj_id, take_keyboard_focus);
}
-void LLInventoryPanel::setSelectCallback(const LLFolderView::signal_t::slot_type& cb)
+void LLInventoryPanel::setSelectCallback(const boost::function<void (const std::deque<LLFolderViewItem*>& items, BOOL user_action)>& cb)
{
if (mFolderRoot)
{
@@ -1067,15 +1184,12 @@ LLInventoryPanel* LLInventoryPanel::getActiveInventoryPanel(BOOL auto_open)
void LLInventoryPanel::addHideFolderType(LLFolderType::EType folder_type)
{
- if (!getIsHiddenFolderType(folder_type))
- {
- mHiddenFolderTypes.push_back(folder_type);
- }
+ getFilter()->setFilterCategoryTypes(getFilter()->getFilterCategoryTypes() & ~(1ULL << folder_type));
}
BOOL LLInventoryPanel::getIsHiddenFolderType(LLFolderType::EType folder_type) const
{
- return (std::find(mHiddenFolderTypes.begin(), mHiddenFolderTypes.end(), folder_type) != mHiddenFolderTypes.end());
+ return !(getFilter()->getFilterCategoryTypes() & (1ULL << folder_type));
}
@@ -1092,6 +1206,13 @@ public:
struct Params : public LLInitParam::Block<Params, LLInventoryPanel::Params>
{};
+ void initFromParams(const Params& p)
+ {
+ LLInventoryPanel::initFromParams(p);
+ // turn on inbox for recent items
+ getFilter()->setFilterCategoryTypes(getFilter()->getFilterCategoryTypes() | (1ULL << LLFolderType::FT_INBOX));
+ }
+
protected:
LLInventoryRecentItemsPanel (const Params&);
friend class LLUICtrlFactory;
diff --git a/indra/newview/llinventorypanel.h b/indra/newview/llinventorypanel.h
index 9da9f7d8ba..a4287a438e 100644
--- a/indra/newview/llinventorypanel.h
+++ b/indra/newview/llinventorypanel.h
@@ -33,11 +33,13 @@
#include "llfloater.h"
#include "llinventory.h"
#include "llinventoryfilter.h"
-#include "llfolderview.h"
#include "llinventorymodel.h"
+#include "llscrollcontainer.h"
#include "lluictrlfactory.h"
#include <set>
+class LLFolderView;
+class LLFolderViewFolder;
class LLFolderViewItem;
class LLInventoryFilter;
class LLInventoryModel;
@@ -46,7 +48,6 @@ class LLInventoryFVBridgeBuilder;
class LLMenuBarGL;
class LLCheckBoxCtrl;
class LLSpinCtrl;
-class LLScrollContainer;
class LLTextBox;
class LLIconCtrl;
class LLSaveFolderState;
@@ -83,6 +84,8 @@ public:
Optional<Filter> filter;
Optional<std::string> start_folder;
Optional<bool> use_label_suffix;
+ Optional<bool> show_load_status;
+ Optional<LLScrollContainer::Params> scroll;
Params()
: sort_order_setting("sort_order_setting"),
@@ -91,7 +94,9 @@ public:
show_item_link_overlays("show_item_link_overlays", false),
filter("filter"),
start_folder("start_folder"),
- use_label_suffix("use_label_suffix", true)
+ use_label_suffix("use_label_suffix", true),
+ show_load_status("show_load_status"),
+ scroll("scroll")
{}
};
@@ -123,16 +128,17 @@ public:
// Call this method to set the selection.
void openAllFolders();
void setSelection(const LLUUID& obj_id, BOOL take_keyboard_focus);
- void setSelectCallback(const LLFolderView::signal_t::slot_type& cb);
+ void setSelectCallback(const boost::function<void (const std::deque<LLFolderViewItem*>& items, BOOL user_action)>& cb);
void clearSelection();
LLInventoryFilter* getFilter();
+ const LLInventoryFilter* getFilter() const;
void setFilterTypes(U64 filter, LLInventoryFilter::EFilterType = LLInventoryFilter::FILTERTYPE_OBJECT);
- U32 getFilterObjectTypes() const { return mFolderRoot->getFilterObjectTypes(); }
+ U32 getFilterObjectTypes() const;
void setFilterPermMask(PermissionMask filter_perm_mask);
- U32 getFilterPermMask() const { return mFolderRoot->getFilterPermissions(); }
+ U32 getFilterPermMask() const;
void setFilterWearableTypes(U64 filter);
void setFilterSubString(const std::string& string);
- const std::string getFilterSubString() { return mFolderRoot->getFilterSubString(); }
+ const std::string getFilterSubString();
void setSinceLogoff(BOOL sl);
void setHoursAgo(U32 hours);
BOOL getSinceLogoff();
@@ -140,10 +146,9 @@ public:
void setShowFolderState(LLInventoryFilter::EFolderShow show);
LLInventoryFilter::EFolderShow getShowFolderState();
- void setAllowMultiSelect(BOOL allow) { mFolderRoot->setAllowMultiSelect(allow); }
// This method is called when something has changed about the inventory.
void modelChanged(U32 mask);
- LLFolderView* getRootFolder() { return mFolderRoot; }
+ LLFolderView* getRootFolder();
LLScrollContainer* getScrollableContainer() { return mScroller; }
void onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action);
@@ -158,7 +163,7 @@ public:
static void dumpSelectionInformation(void* user_data);
void openSelected();
- void unSelectAll() { mFolderRoot->setSelection(NULL, FALSE, FALSE); }
+ void unSelectAll();
static void onIdle(void* user_data);
@@ -175,6 +180,7 @@ protected:
LLInvPanelComplObserver* mCompletionObserver;
BOOL mAllowMultiSelect;
BOOL mShowItemLinkOverlays; // Shows link graphic over inventory item icons
+ BOOL mShowLoadStatus;
LLFolderView* mFolderRoot;
LLScrollContainer* mScroller;
@@ -198,7 +204,7 @@ public:
static const std::string INHERIT_SORT_ORDER;
void setSortOrder(U32 order);
- U32 getSortOrder() const { return mFolderRoot->getSortOrder(); }
+ U32 getSortOrder() const;
private:
std::string mSortOrderSetting;
@@ -207,29 +213,27 @@ private:
//--------------------------------------------------------------------
public:
void addHideFolderType(LLFolderType::EType folder_type);
-protected:
- BOOL getIsHiddenFolderType(LLFolderType::EType folder_type) const;
-private:
- std::vector<LLFolderType::EType> mHiddenFolderTypes;
- //--------------------------------------------------------------------
- // Initialization routines for building up the UI ("views")
- //--------------------------------------------------------------------
public:
BOOL getIsViewsInitialized() const { return mViewsInitialized; }
- const LLUUID& getStartFolderID() const { return mStartFolderID; }
- const std::string& getStartFolderString() { return mStartFolderString; }
+ const LLUUID& getRootFolderID() const;
protected:
// Builds the UI. Call this once the inventory is usable.
void initializeViews();
- void rebuildViewsFor(const LLUUID& id); // Given the id and the parent, build all of the folder views.
- virtual void buildNewViews(const LLUUID& id);
+ LLFolderViewItem* rebuildViewsFor(const LLUUID& id); // Given the id and the parent, build all of the folder views.
+
+ virtual void buildFolderView(const LLInventoryPanel::Params& params);
+ LLFolderViewItem* buildNewViews(const LLUUID& id);
+ BOOL getIsHiddenFolderType(LLFolderType::EType folder_type) const;
+
+ virtual LLFolderView* createFolderView(LLInvFVBridge * bridge, bool useLabelSuffix);
+ virtual LLFolderViewFolder* createFolderViewFolder(LLInvFVBridge * bridge);
+ virtual LLFolderViewItem* createFolderViewItem(LLInvFVBridge * bridge);
private:
BOOL mBuildDefaultHierarchy; // default inventory hierarchy should be created in postBuild()
BOOL mViewsInitialized; // Views have been generated
// UUID of category from which hierarchy should be built. Set with the
// "start_folder" xml property. Default is LLUUID::null that means total Inventory hierarchy.
- std::string mStartFolderString;
LLUUID mStartFolderID;
};
diff --git a/indra/newview/lllocationinputctrl.cpp b/indra/newview/lllocationinputctrl.cpp
index 5c65dcec34..1c8f6b6c98 100644
--- a/indra/newview/lllocationinputctrl.cpp
+++ b/indra/newview/lllocationinputctrl.cpp
@@ -190,6 +190,7 @@ LLLocationInputCtrl::Params::Params()
scripts_icon("scripts_icon"),
damage_icon("damage_icon"),
damage_text("damage_text"),
+ see_avatars_icon("see_avatars_icon"),
maturity_help_topic("maturity_help_topic")
{
}
@@ -342,6 +343,13 @@ LLLocationInputCtrl::LLLocationInputCtrl(const LLLocationInputCtrl::Params& p)
mDamageText = LLUICtrlFactory::create<LLTextBox>(damage_text);
addChild(mDamageText);
+ LLIconCtrl::Params see_avatars_icon = p.see_avatars_icon;
+ see_avatars_icon.tool_tip = LLTrans::getString("LocationCtrlSeeAVsTooltip");
+ see_avatars_icon.mouse_opaque = true;
+ mParcelIcon[SEE_AVATARS_ICON] = LLUICtrlFactory::create<LLIconCtrl>(see_avatars_icon);
+ mParcelIcon[SEE_AVATARS_ICON]->setMouseDownCallback(boost::bind(&LLLocationInputCtrl::onParcelIconClick, this, SEE_AVATARS_ICON));
+ addChild(mParcelIcon[SEE_AVATARS_ICON]);
+
// Register callbacks and load the location field context menu (NB: the order matters).
LLUICtrl::CommitCallbackRegistry::currentRegistrar().add("Navbar.Action", boost::bind(&LLLocationInputCtrl::onLocationContextMenuItemClicked, this, _2));
LLUICtrl::EnableCallbackRegistry::currentRegistrar().add("Navbar.EnableMenuItem", boost::bind(&LLLocationInputCtrl::onLocationContextMenuItemEnabled, this, _2));
@@ -810,6 +818,7 @@ void LLLocationInputCtrl::refreshParcelIcons()
bool allow_build = vpm->allowAgentBuild(current_parcel); // true when anyone is allowed to build. See EXT-4610.
bool allow_scripts = vpm->allowAgentScripts(agent_region, current_parcel);
bool allow_damage = vpm->allowAgentDamage(agent_region, current_parcel);
+ bool see_avs = current_parcel->getSeeAVs();
// Most icons are "block this ability"
mParcelIcon[VOICE_ICON]->setVisible( !allow_voice );
@@ -819,6 +828,7 @@ void LLLocationInputCtrl::refreshParcelIcons()
mParcelIcon[SCRIPTS_ICON]->setVisible( !allow_scripts );
mParcelIcon[DAMAGE_ICON]->setVisible( allow_damage );
mDamageText->setVisible(allow_damage);
+ mParcelIcon[SEE_AVATARS_ICON]->setVisible( !see_avs );
// Padding goes to left of both landmark star and for sale btn
x -= mAddLandmarkHPad;
@@ -1175,6 +1185,9 @@ void LLLocationInputCtrl::onParcelIconClick(EParcelIcon icon)
case DAMAGE_ICON:
LLNotificationsUtil::add("NotSafe");
break;
+ case SEE_AVATARS_ICON:
+ LLNotificationsUtil::add("SeeAvatars");
+ break;
case ICON_COUNT:
break;
// no default to get compiler warning when a new icon gets added
diff --git a/indra/newview/lllocationinputctrl.h b/indra/newview/lllocationinputctrl.h
index 6368bf5cf2..ed47ba73e3 100644
--- a/indra/newview/lllocationinputctrl.h
+++ b/indra/newview/lllocationinputctrl.h
@@ -77,7 +77,8 @@ public:
push_icon,
build_icon,
scripts_icon,
- damage_icon;
+ damage_icon,
+ see_avatars_icon;
Optional<LLTextBox::Params> damage_text;
Params();
};
@@ -109,12 +110,13 @@ private:
enum EParcelIcon
{
VOICE_ICON = 0,
- FLY_ICON,
- PUSH_ICON,
- BUILD_ICON,
- SCRIPTS_ICON,
- DAMAGE_ICON,
- ICON_COUNT
+ FLY_ICON, // 1
+ PUSH_ICON, // 2
+ BUILD_ICON, // 3
+ SCRIPTS_ICON, // 4
+ DAMAGE_ICON, // 5
+ SEE_AVATARS_ICON, // 6
+ ICON_COUNT // 7 total
};
friend class LLUICtrlFactory;
diff --git a/indra/newview/lllogchat.cpp b/indra/newview/lllogchat.cpp
index efc4e23838..ebb5912ace 100644
--- a/indra/newview/lllogchat.cpp
+++ b/indra/newview/lllogchat.cpp
@@ -230,7 +230,7 @@ std::string LLLogChat::makeLogFileName(std::string filename)
std::string LLLogChat::cleanFileName(std::string filename)
{
- std::string invalidChars = "\"\'\\/?*:.<>|";
+ std::string invalidChars = "\"\'\\/?*:.<>|[]{}~"; // Cannot match glob or illegal filename chars
std::string::size_type position = filename.find_first_of(invalidChars);
while (position != filename.npos)
{
diff --git a/indra/newview/lllogininstance.cpp b/indra/newview/lllogininstance.cpp
index 36c5d12897..00de6a86e1 100644
--- a/indra/newview/lllogininstance.cpp
+++ b/indra/newview/lllogininstance.cpp
@@ -608,6 +608,7 @@ void LLLoginInstance::constructAuthParams(LLPointer<LLCredential> user_credentia
request_params["channel"] = LLVersionInfo::getChannel();
request_params["id0"] = mSerialNumber;
request_params["host_id"] = gSavedSettings.getString("HostID");
+ request_params["extended_errors"] = true; // request message_id and message_args
mRequestData.clear();
mRequestData["method"] = "login_to_simulator";
diff --git a/indra/newview/llmanipscale.cpp b/indra/newview/llmanipscale.cpp
index 738d82e732..4eb94dfb8e 100644
--- a/indra/newview/llmanipscale.cpp
+++ b/indra/newview/llmanipscale.cpp
@@ -58,6 +58,7 @@
#include "llworld.h"
#include "v2math.h"
#include "llvoavatar.h"
+#include "llmeshrepository.h"
const F32 MAX_MANIP_SELECT_DISTANCE_SQUARED = 11.f * 11.f;
@@ -90,9 +91,7 @@ F32 get_default_max_prim_scale(bool is_flora)
{
// a bit of a hack, but if it's foilage, we don't want to use the
// new larger scale which would result in giant trees and grass
- if (gSavedSettings.getBOOL("MeshEnabled") &&
- gAgent.getRegion() &&
- !gAgent.getRegion()->getCapability("GetMesh").empty() &&
+ if (gMeshRepo.meshRezEnabled() &&
!is_flora)
{
return DEFAULT_MAX_PRIM_SCALE;
diff --git a/indra/newview/llmediactrl.cpp b/indra/newview/llmediactrl.cpp
index b3ad9efeb2..03ccabc994 100644
--- a/indra/newview/llmediactrl.cpp
+++ b/indra/newview/llmediactrl.cpp
@@ -38,6 +38,7 @@
#include "llviewermedia.h"
#include "llviewertexture.h"
#include "llviewerwindow.h"
+#include "lldebugmessagebox.h"
#include "llweb.h"
#include "llrender.h"
#include "llpluginclassmedia.h"
@@ -708,6 +709,8 @@ LLPluginClassMedia* LLMediaCtrl::getMediaPlugin()
//
void LLMediaCtrl::draw()
{
+ F32 alpha = getDrawContext().mAlpha;
+
if ( gRestoreGL == 1 )
{
LLRect r = getRect();
@@ -746,21 +749,11 @@ void LLMediaCtrl::draw()
}
}
-// if(mHidingInitialLoad)
-// {
-// // If we're hiding loading, don't draw at all.
-// draw_media = false;
-// }
-
bool background_visible = isBackgroundVisible();
bool background_opaque = isBackgroundOpaque();
if(draw_media)
{
- // alpha off for this
- LLGLSUIDefault gls_ui;
- LLGLDisable gls_alphaTest( GL_ALPHA_TEST );
-
gGL.pushUIMatrix();
{
if (mIgnoreUIScale)
@@ -775,7 +768,8 @@ void LLMediaCtrl::draw()
// scale texture to fit the space using texture coords
gGL.getTexUnit(0)->bind(media_texture);
- gGL.color4fv( LLColor4::white.mV );
+ LLColor4 media_color = LLColor4::white % alpha;
+ gGL.color4fv( media_color.mV );
F32 max_u = ( F32 )media_plugin->getWidth() / ( F32 )media_plugin->getTextureWidth();
F32 max_v = ( F32 )media_plugin->getHeight() / ( F32 )media_plugin->getTextureHeight();
@@ -827,7 +821,6 @@ void LLMediaCtrl::draw()
}
// draw the browser
- gGL.setSceneBlendType(LLRender::BT_REPLACE);
gGL.begin( LLRender::QUADS );
if (! media_plugin->getTextureCoordsOpenGL())
{
@@ -860,7 +853,6 @@ void LLMediaCtrl::draw()
gGL.vertex2i( x_offset + width, y_offset );
}
gGL.end();
- gGL.setSceneBlendType(LLRender::BT_ALPHA);
}
gGL.popUIMatrix();
diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp
index 0a1eadf4d0..7ddc0db20d 100644
--- a/indra/newview/llmeshrepository.cpp
+++ b/indra/newview/llmeshrepository.cpp
@@ -34,9 +34,9 @@
#include "llagent.h"
#include "llappviewer.h"
#include "llbufferstream.h"
+#include "llcallbacklist.h"
#include "llcurl.h"
#include "lldatapacker.h"
-#include "llfasttimer.h"
#include "llfloatermodelpreview.h"
#include "llfloaterperms.h"
#include "lleconomy.h"
@@ -49,6 +49,7 @@
#include "llthread.h"
#include "llvfile.h"
#include "llviewercontrol.h"
+#include "llviewerinventory.h"
#include "llviewermenufile.h"
#include "llviewerobjectlist.h"
#include "llviewerregion.h"
@@ -61,6 +62,10 @@
#include "pipeline.h"
#include "llinventorymodel.h"
#include "llfoldertype.h"
+#include "llviewerparcelmgr.h"
+#include "lluploadfloaterobservers.h"
+
+#include "boost/lexical_cast.hpp"
#ifndef LL_WINDOWS
#include "netdb.h"
@@ -68,13 +73,18 @@
#include <queue>
-LLFastTimer::DeclareTimer FTM_MESH_UPDATE("Mesh Update");
-LLFastTimer::DeclareTimer FTM_LOAD_MESH("Load Mesh");
-
LLMeshRepository gMeshRepo;
const U32 MAX_MESH_REQUESTS_PER_SECOND = 100;
+// Maximum mesh version to support. Three least significant digits are reserved for the minor version,
+// with major version changes indicating a format change that is not backwards compatible and should not
+// be parsed by viewers that don't specifically support that version. For example, if the integer "1" is
+// present, the version is 0.001. A viewer that can parse version 0.001 can also parse versions up to 0.999,
+// but not 1.0 (integer 1000).
+// See wiki at https://wiki.secondlife.com/wiki/Mesh/Mesh_Asset_Format
+const S32 MAX_MESH_VERSION = 999;
+
U32 LLMeshRepository::sBytesReceived = 0;
U32 LLMeshRepository::sHTTPRequestCount = 0;
U32 LLMeshRepository::sHTTPRetryCount = 0;
@@ -85,6 +95,15 @@ U32 LLMeshRepository::sPeakKbps = 0;
const U32 MAX_TEXTURE_UPLOAD_RETRIES = 5;
+static S32 dump_num = 0;
+std::string make_dump_name(std::string prefix, S32 num)
+{
+ return prefix + boost::lexical_cast<std::string>(num) + std::string(".xml");
+
+}
+void dump_llsd_to_file(const LLSD& content, std::string filename);
+LLSD llsd_from_file(std::string filename);
+
std::string header_lod[] =
{
"lowest_lod",
@@ -178,196 +197,6 @@ S32 LLMeshRepoThread::sActiveHeaderRequests = 0;
S32 LLMeshRepoThread::sActiveLODRequests = 0;
U32 LLMeshRepoThread::sMaxConcurrentRequests = 1;
-
-class LLTextureCostResponder : public LLCurl::Responder
-{
-public:
- LLTextureUploadData mData;
- LLMeshUploadThread* mThread;
-
- LLTextureCostResponder(LLTextureUploadData data, LLMeshUploadThread* thread)
- : mData(data), mThread(thread)
- {
-
- }
-
- virtual void completed(U32 status, const std::string& reason, const LLSD& content)
- {
- mThread->mPendingConfirmations--;
- if (isGoodStatus(status))
- {
- mThread->priceResult(mData, content);
- }
- else
- {
- llwarns << status << ": " << reason << llendl;
-
- if (mData.mRetries < MAX_TEXTURE_UPLOAD_RETRIES)
- {
- llwarns << "Retrying. (" << ++mData.mRetries << ")" << llendl;
-
- if (status == 499 || status == 500)
- {
- mThread->uploadTexture(mData);
- }
- else
- {
- llerrs << "Unhandled status " << status << llendl;
- }
- }
- else
- {
- llwarns << "Giving up after " << mData.mRetries << " retries." << llendl;
- }
- }
- }
-};
-
-class LLTextureUploadResponder : public LLCurl::Responder
-{
-public:
- LLTextureUploadData mData;
- LLMeshUploadThread* mThread;
-
- LLTextureUploadResponder(LLTextureUploadData data, LLMeshUploadThread* thread)
- : mData(data), mThread(thread)
- {
- }
-
- virtual void completed(U32 status, const std::string& reason, const LLSD& content)
- {
- mThread->mPendingUploads--;
- if (isGoodStatus(status))
- {
- mData.mUUID = content["new_asset"].asUUID();
- gMeshRepo.updateInventory(LLMeshRepository::inventory_data(mData.mPostData, content));
- mThread->onTextureUploaded(mData);
- }
- else
- {
- llwarns << status << ": " << reason << llendl;
- llwarns << "Retrying. (" << ++mData.mRetries << ")" << llendl;
-
- if (status == 404)
- {
- mThread->uploadTexture(mData);
- }
- else if (status == 499)
- {
- mThread->mConfirmedTextureQ.push(mData);
- }
- else
- {
- llerrs << "Unhandled status " << status << llendl;
- }
- }
- }
-};
-
-class LLMeshCostResponder : public LLCurl::Responder
-{
-public:
- LLMeshUploadData mData;
- LLMeshUploadThread* mThread;
-
- LLMeshCostResponder(LLMeshUploadData data, LLMeshUploadThread* thread)
- : mData(data), mThread(thread)
- {
-
- }
-
- virtual void completed(U32 status, const std::string& reason, const LLSD& content)
- {
- mThread->mPendingConfirmations--;
-
- if (isGoodStatus(status))
- {
- mThread->priceResult(mData, content);
- }
- else
- {
- llwarns << status << ": " << reason << llendl;
-
- if (status == HTTP_INTERNAL_ERROR)
- {
- llwarns << "Retrying. (" << ++mData.mRetries << ")" << llendl;
- mThread->uploadModel(mData);
- }
- else if (status == HTTP_BAD_REQUEST)
- {
- llwarns << "Status 400 received from server, giving up." << llendl;
- }
- else if (status == HTTP_NOT_FOUND)
- {
- llwarns <<"Status 404 received, server is disconnected, giving up." << llendl ;
- }
- else
- {
- llerrs << "Unhandled status " << status << llendl;
- }
- }
- }
-};
-
-class LLMeshUploadResponder : public LLCurl::Responder
-{
-public:
- LLMeshUploadData mData;
- LLMeshUploadThread* mThread;
-
- LLMeshUploadResponder(LLMeshUploadData data, LLMeshUploadThread* thread)
- : mData(data), mThread(thread)
- {
- }
-
- virtual void completed(U32 status, const std::string& reason, const LLSD& content)
- {
- mThread->mPendingUploads--;
- if (isGoodStatus(status))
- {
- mData.mUUID = content["new_asset"].asUUID();
- if (mData.mUUID.isNull())
- {
- LLSD args;
- std::string message = content["error"]["message"];
- std::string identifier = content["error"]["identifier"];
- std::string invalidity_identifier = content["error"]["invalidity_identifier"];
-
- args["MESSAGE"] = message;
- args["IDENTIFIER"] = identifier;
- args["INVALIDITY_IDENTIFIER"] = invalidity_identifier;
- args["LABEL"] = mData.mBaseModel->mLabel;
-
- gMeshRepo.uploadError(args);
- }
- else
- {
- gMeshRepo.updateInventory(LLMeshRepository::inventory_data(mData.mPostData, content));
- mThread->onModelUploaded(mData);
- }
- }
- else
- {
- llwarns << status << ": " << reason << llendl;
- llwarns << "Retrying. (" << ++mData.mRetries << ")" << llendl;
-
- if (status == 404)
- {
- mThread->uploadModel(mData);
- }
- else if (status == 499)
- {
- mThread->mConfirmedQ.push(mData);
- }
- else if (status != 500)
- { //drop internal server errors on the floor, otherwise grab
- llerrs << "Unhandled status " << status << llendl;
- }
- }
- }
-};
-
-
class LLMeshHeaderResponder : public LLCurl::Responder
{
public:
@@ -457,47 +286,162 @@ public:
};
-class LLModelObjectUploadResponder: public LLCurl::Responder
+void log_upload_error(S32 status, const LLSD& content, std::string stage, std::string model_name)
+{
+ // Add notification popup.
+ LLSD args;
+ std::string message = content["error"]["message"];
+ std::string identifier = content["error"]["identifier"];
+ args["MESSAGE"] = message;
+ args["IDENTIFIER"] = identifier;
+ args["LABEL"] = model_name;
+ gMeshRepo.uploadError(args);
+
+ // Log details.
+ llwarns << "stage: " << stage << " http status: " << status << llendl;
+ if (content.has("error"))
+ {
+ const LLSD& err = content["error"];
+ llwarns << "err: " << err << llendl;
+ llwarns << "mesh upload failed, stage '" << stage
+ << "' error '" << err["error"].asString()
+ << "', message '" << err["message"].asString()
+ << "', id '" << err["identifier"].asString()
+ << "'" << llendl;
+ if (err.has("errors"))
+ {
+ S32 error_num = 0;
+ const LLSD& err_list = err["errors"];
+ for (LLSD::array_const_iterator it = err_list.beginArray();
+ it != err_list.endArray();
+ ++it)
+ {
+ const LLSD& err_entry = *it;
+ llwarns << "error[" << error_num << "]:" << llendl;
+ for (LLSD::map_const_iterator map_it = err_entry.beginMap();
+ map_it != err_entry.endMap();
+ ++map_it)
+ {
+ llwarns << "\t" << map_it->first << ": "
+ << map_it->second << llendl;
+ }
+ error_num++;
+ }
+ }
+ }
+ else
+ {
+ llwarns << "bad mesh, no error information available" << llendl;
+ }
+}
+
+class LLWholeModelFeeResponder: public LLCurl::Responder
{
- LLSD mObjectAsset;
LLMeshUploadThread* mThread;
-
+ LLSD mModelData;
+ LLHandle<LLWholeModelFeeObserver> mObserverHandle;
public:
- LLModelObjectUploadResponder(LLMeshUploadThread* thread, const LLSD& object_asset):
+ LLWholeModelFeeResponder(LLMeshUploadThread* thread, LLSD& model_data, LLHandle<LLWholeModelFeeObserver> observer_handle):
mThread(thread),
- mObjectAsset(object_asset)
+ mModelData(model_data),
+ mObserverHandle(observer_handle)
{
}
-
- virtual void completedRaw(U32 status, const std::string& reason,
- const LLChannelDescriptors& channels,
- const LLIOPipe::buffer_ptr_t& buffer)
+ virtual void completed(U32 status,
+ const std::string& reason,
+ const LLSD& content)
{
- assert_main_thread();
-
- llinfos << "completed" << llendl;
+ LLSD cc = content;
+ if (gSavedSettings.getS32("MeshUploadFakeErrors")&1)
+ {
+ cc = llsd_from_file("fake_upload_error.xml");
+ }
+
mThread->mPendingUploads--;
- mThread->mFinished = true;
+ dump_llsd_to_file(cc,make_dump_name("whole_model_fee_response_",dump_num));
+
+ LLWholeModelFeeObserver* observer = mObserverHandle.get();
+
+ if (isGoodStatus(status) &&
+ cc["state"].asString() == "upload")
+ {
+ mThread->mWholeModelUploadURL = cc["uploader"].asString();
+
+ if (observer)
+ {
+ cc["data"]["upload_price"] = cc["upload_price"];
+ observer->onModelPhysicsFeeReceived(cc["data"], mThread->mWholeModelUploadURL);
+ }
+ }
+ else
+ {
+ llwarns << "fee request failed" << llendl;
+ log_upload_error(status,cc,"fee",mModelData["name"]);
+ mThread->mWholeModelUploadURL = "";
+
+ if (observer)
+ {
+ observer->setModelPhysicsFeeErrorStatus(status, reason);
+ }
+ }
}
+
};
-class LLWholeModelFeeResponder: public LLCurl::Responder
+class LLWholeModelUploadResponder: public LLCurl::Responder
{
LLMeshUploadThread* mThread;
+ LLSD mModelData;
+ LLHandle<LLWholeModelUploadObserver> mObserverHandle;
+
public:
- LLWholeModelFeeResponder(LLMeshUploadThread* thread):
- mThread(thread)
+ LLWholeModelUploadResponder(LLMeshUploadThread* thread, LLSD& model_data, LLHandle<LLWholeModelUploadObserver> observer_handle):
+ mThread(thread),
+ mModelData(model_data),
+ mObserverHandle(observer_handle)
{
}
- virtual void completedRaw(U32 status, const std::string& reason,
- const LLChannelDescriptors& channels,
- const LLIOPipe::buffer_ptr_t& buffer)
+ virtual void completed(U32 status,
+ const std::string& reason,
+ const LLSD& content)
{
- assert_main_thread();
- llinfos << "completed" << llendl;
+ LLSD cc = content;
+ if (gSavedSettings.getS32("MeshUploadFakeErrors")&2)
+ {
+ cc = llsd_from_file("fake_upload_error.xml");
+ }
+
+ //assert_main_thread();
mThread->mPendingUploads--;
+ dump_llsd_to_file(cc,make_dump_name("whole_model_upload_response_",dump_num));
+
+ LLWholeModelUploadObserver* observer = mObserverHandle.get();
+
+ // requested "mesh" asset type isn't actually the type
+ // of the resultant object, fix it up here.
+ if (isGoodStatus(status) &&
+ cc["state"].asString() == "complete")
+ {
+ mModelData["asset_type"] = "object";
+ gMeshRepo.updateInventory(LLMeshRepository::inventory_data(mModelData,cc));
+
+ if (observer)
+ {
+ doOnIdleOneTime(boost::bind(&LLWholeModelUploadObserver::onModelUploadSuccess, observer));
+ }
+ }
+ else
+ {
+ llwarns << "upload failed" << llendl;
+ std::string model_name = mModelData["name"].asString();
+ log_upload_error(status,cc,"upload",model_name);
+
+ if (observer)
+ {
+ doOnIdleOneTime(boost::bind(&LLWholeModelUploadObserver::onModelUploadFailure, observer));
+ }
+ }
}
-
};
LLMeshRepoThread::LLMeshRepoThread()
@@ -671,10 +615,7 @@ void LLMeshRepoThread::loadMeshLOD(const LLVolumeParams& mesh_params, S32 lod)
if (pending != mPendingLOD.end())
{ //append this lod request to existing header request
pending->second.push_back(lod);
- if (pending->second.size() > 4)
- {
- llerrs << "WTF?" << llendl;
- }
+ llassert(pending->second.size() <= LLModel::NUM_LODS)
}
else
{ //if no header request is pending, fetch header
@@ -719,15 +660,16 @@ bool LLMeshRepoThread::fetchMeshSkinInfo(const LLUUID& mesh_id)
}
U32 header_size = mMeshHeaderSize[mesh_id];
-
+
if (header_size > 0)
{
+ S32 version = mMeshHeader[mesh_id]["version"].asInteger();
S32 offset = header_size + mMeshHeader[mesh_id]["skin"]["offset"].asInteger();
S32 size = mMeshHeader[mesh_id]["skin"]["size"].asInteger();
mHeaderMutex->unlock();
- if (offset >= 0 && size > 0)
+ if (version <= MAX_MESH_VERSION && offset >= 0 && size > 0)
{
//check VFS for mesh skin info
LLVFile file(gVFS, mesh_id, LLAssetType::AT_MESH);
@@ -738,7 +680,7 @@ bool LLMeshRepoThread::fetchMeshSkinInfo(const LLUUID& mesh_id)
U8* buffer = new U8[size];
file.read(buffer, size);
- //make sure buffer isn't all 0's (reserved block but not written)
+ //make sure buffer isn't all 0's by checking the first 1KB (reserved block but not written)
bool zero = true;
for (S32 i = 0; i < llmin(size, 1024) && zero; ++i)
{
@@ -794,12 +736,13 @@ bool LLMeshRepoThread::fetchMeshDecomposition(const LLUUID& mesh_id)
if (header_size > 0)
{
- S32 offset = header_size + mMeshHeader[mesh_id]["decomposition"]["offset"].asInteger();
- S32 size = mMeshHeader[mesh_id]["decomposition"]["size"].asInteger();
+ S32 version = mMeshHeader[mesh_id]["version"].asInteger();
+ S32 offset = header_size + mMeshHeader[mesh_id]["physics_convex"]["offset"].asInteger();
+ S32 size = mMeshHeader[mesh_id]["physics_convex"]["size"].asInteger();
mHeaderMutex->unlock();
- if (offset >= 0 && size > 0)
+ if (version <= MAX_MESH_VERSION && offset >= 0 && size > 0)
{
//check VFS for mesh skin info
LLVFile file(gVFS, mesh_id, LLAssetType::AT_MESH);
@@ -810,7 +753,7 @@ bool LLMeshRepoThread::fetchMeshDecomposition(const LLUUID& mesh_id)
U8* buffer = new U8[size];
file.read(buffer, size);
- //make sure buffer isn't all 0's (reserved block but not written)
+ //make sure buffer isn't all 0's by checking the first 1KB (reserved block but not written)
bool zero = true;
for (S32 i = 0; i < llmin(size, 1024) && zero; ++i)
{
@@ -866,12 +809,13 @@ bool LLMeshRepoThread::fetchMeshPhysicsShape(const LLUUID& mesh_id)
if (header_size > 0)
{
- S32 offset = header_size + mMeshHeader[mesh_id]["physics_shape"]["offset"].asInteger();
- S32 size = mMeshHeader[mesh_id]["physics_shape"]["size"].asInteger();
+ S32 version = mMeshHeader[mesh_id]["version"].asInteger();
+ S32 offset = header_size + mMeshHeader[mesh_id]["physics_mesh"]["offset"].asInteger();
+ S32 size = mMeshHeader[mesh_id]["physics_mesh"]["size"].asInteger();
mHeaderMutex->unlock();
- if (offset >= 0 && size > 0)
+ if (version <= MAX_MESH_VERSION && offset >= 0 && size > 0)
{
//check VFS for mesh physics shape info
LLVFile file(gVFS, mesh_id, LLAssetType::AT_MESH);
@@ -882,7 +826,7 @@ bool LLMeshRepoThread::fetchMeshPhysicsShape(const LLUUID& mesh_id)
U8* buffer = new U8[size];
file.read(buffer, size);
- //make sure buffer isn't all 0's (reserved block but not written)
+ //make sure buffer isn't all 0's by checking the first 1KB (reserved block but not written)
bool zero = true;
for (S32 i = 0; i < llmin(size, 1024) && zero; ++i)
{
@@ -939,9 +883,9 @@ bool LLMeshRepoThread::fetchMeshHeader(const LLVolumeParams& mesh_params)
S32 size = file.getSize();
if (size > 0)
- {
- U8 buffer[1024];
- S32 bytes = llmin(size, 1024);
+ { //NOTE -- if the header size is ever more than 4KB, this will break
+ U8 buffer[4096];
+ S32 bytes = llmin(size, 4096);
LLMeshRepository::sCacheBytesRead += bytes;
file.read(buffer, bytes);
if (headerReceived(mesh_params, buffer, bytes))
@@ -963,6 +907,7 @@ bool LLMeshRepoThread::fetchMeshHeader(const LLVolumeParams& mesh_params)
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));
}
@@ -982,10 +927,12 @@ bool LLMeshRepoThread::fetchMeshLOD(const LLVolumeParams& mesh_params, S32 lod)
if (header_size > 0)
{
+ S32 version = mMeshHeader[mesh_id]["version"].asInteger();
S32 offset = header_size + mMeshHeader[mesh_id][header_lod[lod]]["offset"].asInteger();
S32 size = mMeshHeader[mesh_id][header_lod[lod]]["size"].asInteger();
mHeaderMutex->unlock();
- if (offset >= 0 && size > 0)
+
+ if (version <= MAX_MESH_VERSION && offset >= 0 && size > 0)
{
//check VFS for mesh asset
@@ -997,7 +944,7 @@ bool LLMeshRepoThread::fetchMeshLOD(const LLVolumeParams& mesh_params, S32 lod)
U8* buffer = new U8[size];
file.read(buffer, size);
- //make sure buffer isn't all 0's (reserved block but not written)
+ //make sure buffer isn't all 0's by checking the first 1KB (reserved block but not written)
bool zero = true;
for (S32 i = 0; i < llmin(size, 1024) && zero; ++i)
{
@@ -1083,14 +1030,11 @@ bool LLMeshRepoThread::headerReceived(const LLVolumeParams& mesh_params, U8* dat
}
{
- U32 cost = gMeshRepo.calcResourceCost(header);
-
LLUUID mesh_id = mesh_params.getSculptID();
mHeaderMutex->lock();
mMeshHeaderSize[mesh_id] = header_size;
mMeshHeader[mesh_id] = header;
- mMeshResourceCost[mesh_id] = cost;
mHeaderMutex->unlock();
//check for pending requests
@@ -1242,9 +1186,14 @@ bool LLMeshRepoThread::physicsShapeReceived(const LLUUID& mesh_id, U8* data, S32
}
LLMeshUploadThread::LLMeshUploadThread(LLMeshUploadThread::instance_list& data, LLVector3& scale, bool upload_textures,
- bool upload_skin, bool upload_joints)
+ bool upload_skin, bool upload_joints, std::string upload_url, bool do_upload,
+ LLHandle<LLWholeModelFeeObserver> fee_observer, LLHandle<LLWholeModelUploadObserver> upload_observer)
: LLThread("mesh upload"),
- mDiscarded(FALSE)
+ mDiscarded(FALSE),
+ mDoUpload(do_upload),
+ mWholeModelUploadURL(upload_url),
+ mFeeObserverHandle(fee_observer),
+ mUploadObserverHandle(upload_observer)
{
mInstanceList = data;
mUploadTextures = upload_textures;
@@ -1252,18 +1201,16 @@ LLMeshUploadThread::LLMeshUploadThread(LLMeshUploadThread::instance_list& data,
mUploadJoints = upload_joints;
mMutex = new LLMutex(NULL);
mCurlRequest = NULL;
- mPendingConfirmations = 0;
mPendingUploads = 0;
- mPendingCost = 0;
mFinished = false;
mOrigin = gAgent.getPositionAgent();
mHost = gAgent.getRegionHost();
- mUploadObjectAssetCapability = gAgent.getRegion()->getCapability("UploadObjectAsset");
- mNewInventoryCapability = gAgent.getRegion()->getCapability("NewFileAgentInventoryVariablePrice");
- mWholeModelUploadCapability = gAgent.getRegion()->getCapability("NewFileAgentInventory");
+ mWholeModelFeeCapability = gAgent.getRegion()->getCapability("NewFileAgentInventory");
mOrigin += gAgent.getAtAxis() * scale.magVec();
+
+ mMeshUploadTimeOut = gSavedSettings.getS32("MeshUploadTimeOut") ;
}
LLMeshUploadThread::~LLMeshUploadThread()
@@ -1280,35 +1227,7 @@ LLMeshUploadThread::DecompRequest::DecompRequest(LLModel* mdl, LLModel* base_mod
mThread = thread;
//copy out positions and indices
- if (mdl)
- {
- U16 index_offset = 0;
-
- mPositions.clear();
- mIndices.clear();
-
- //queue up vertex positions and indices
- for (S32 i = 0; i < mdl->getNumVolumeFaces(); ++i)
- {
- const LLVolumeFace& face = mdl->getVolumeFace(i);
- if (mPositions.size() + face.mNumVertices > 65535)
- {
- continue;
- }
-
- for (U32 j = 0; j < face.mNumVertices; ++j)
- {
- mPositions.push_back(LLVector3(face.mPositions[j].getF32ptr()));
- }
-
- for (U32 j = 0; j < face.mNumIndices; ++j)
- {
- mIndices.push_back(face.mIndices[j]+index_offset);
- }
-
- index_offset += face.mNumVertices;
- }
- }
+ assignData(mdl) ;
mThread->mFinalDecomp = this;
mThread->mPhysicsComplete = false;
@@ -1321,11 +1240,8 @@ void LLMeshUploadThread::DecompRequest::completed()
mThread->mPhysicsComplete = true;
}
- if (mHull.size() != 1)
- {
- llerrs << "WTF?" << llendl;
- }
-
+ llassert(mHull.size() == 1);
+
mThread->mHullMap[mBaseModel] = mHull[0];
}
@@ -1353,369 +1269,308 @@ BOOL LLMeshUploadThread::isDiscarded()
void LLMeshUploadThread::run()
{
- if (gSavedSettings.getBOOL("MeshUseWholeModelUpload"))
+ if (mDoUpload)
{
doWholeModelUpload();
}
else
{
- doIterativeUpload();
+ requestWholeModelFee();
}
}
-#if 0
-void dumpLLSDToFile(LLSD& content, std::string& filename)
+void dump_llsd_to_file(const LLSD& content, std::string filename)
{
- std::ofstream of(filename);
- LLSDSerialize::toPrettyXML(content,of);
+ if (gSavedSettings.getBOOL("MeshUploadLogXML"))
+ {
+ std::ofstream of(filename.c_str());
+ LLSDSerialize::toPrettyXML(content,of);
+ }
+}
+
+LLSD llsd_from_file(std::string filename)
+{
+ std::ifstream ifs(filename.c_str());
+ LLSD result;
+ LLSDSerialize::fromXML(result,ifs);
+ return result;
}
-#endif
void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, bool include_textures)
{
- // TODO where do textures go?
-
LLSD result;
+ LLSD res;
result["folder_id"] = gInventory.findCategoryUUIDForType(LLFolderType::FT_OBJECT);
+ result["texture_folder_id"] = gInventory.findCategoryUUIDForType(LLFolderType::FT_TEXTURE);
result["asset_type"] = "mesh";
result["inventory_type"] = "object";
- result["name"] = "your name here";
- result["description"] = "your description here";
+ result["description"] = "(No Description)";
+ result["next_owner_mask"] = LLSD::Integer(LLFloaterPerms::getNextOwnerPerms());
+ result["group_mask"] = LLSD::Integer(LLFloaterPerms::getGroupPerms());
+ result["everyone_mask"] = LLSD::Integer(LLFloaterPerms::getEveryonePerms());
- // TODO "optional" fields from the spec
-
- LLSD res;
res["mesh_list"] = LLSD::emptyArray();
res["texture_list"] = LLSD::emptyArray();
+ res["instance_list"] = LLSD::emptyArray();
S32 mesh_num = 0;
S32 texture_num = 0;
std::set<LLViewerTexture* > textures;
+ std::map<LLViewerTexture*,S32> texture_index;
+
+ std::map<LLModel*,S32> mesh_index;
+ std::string model_name;
+ S32 instance_num = 0;
+
for (instance_map::iterator iter = mInstance.begin(); iter != mInstance.end(); ++iter)
{
LLMeshUploadData data;
data.mBaseModel = iter->first;
-
- LLModelInstance& instance = *(iter->second.begin());
-
+ LLModelInstance& first_instance = *(iter->second.begin());
for (S32 i = 0; i < 5; i++)
{
- data.mModel[i] = instance.mLOD[i];
+ data.mModel[i] = first_instance.mLOD[i];
}
- std::stringstream ostr;
+ if (mesh_index.find(data.mBaseModel) == mesh_index.end())
+ {
+ // Have not seen this model before - create a new mesh_list entry for it.
+ if (model_name.empty())
+ {
+ model_name = data.mBaseModel->getName();
+ }
- LLModel::Decomposition& decomp =
- data.mModel[LLModel::LOD_PHYSICS].notNull() ?
- data.mModel[LLModel::LOD_PHYSICS]->mPhysics :
- data.mBaseModel->mPhysics;
+ std::stringstream ostr;
+
+ LLModel::Decomposition& decomp =
+ data.mModel[LLModel::LOD_PHYSICS].notNull() ?
+ data.mModel[LLModel::LOD_PHYSICS]->mPhysics :
+ data.mBaseModel->mPhysics;
- decomp.mBaseHull = mHullMap[data.mBaseModel];
+ decomp.mBaseHull = mHullMap[data.mBaseModel];
- LLSD mesh_header = LLModel::writeModel(
- ostr,
- data.mModel[LLModel::LOD_PHYSICS],
- data.mModel[LLModel::LOD_HIGH],
- data.mModel[LLModel::LOD_MEDIUM],
- data.mModel[LLModel::LOD_LOW],
- data.mModel[LLModel::LOD_IMPOSTOR],
- decomp,
- mUploadSkin,
- mUploadJoints);
+ LLSD mesh_header = LLModel::writeModel(
+ ostr,
+ data.mModel[LLModel::LOD_PHYSICS],
+ data.mModel[LLModel::LOD_HIGH],
+ data.mModel[LLModel::LOD_MEDIUM],
+ data.mModel[LLModel::LOD_LOW],
+ data.mModel[LLModel::LOD_IMPOSTOR],
+ decomp,
+ mUploadSkin,
+ mUploadJoints);
- data.mAssetData = ostr.str();
+ data.mAssetData = ostr.str();
+ std::string str = ostr.str();
- LLSD mesh_entry;
+ res["mesh_list"][mesh_num] = LLSD::Binary(str.begin(),str.end());
+ mesh_index[data.mBaseModel] = mesh_num;
+ mesh_num++;
+ }
- LLVector3 pos, scale;
- LLQuaternion rot;
- LLMatrix4 transformation = instance.mTransform;
- decomposeMeshMatrix(transformation,pos,rot,scale);
-
- mesh_entry["childpos"] = ll_sd_from_vector3(pos);
- mesh_entry["childrot"] = ll_sd_from_quaternion(rot);
- mesh_entry["scale"] = ll_sd_from_vector3(scale);
+ // For all instances that use this model
+ for (instance_list::iterator instance_iter = iter->second.begin();
+ instance_iter != iter->second.end();
+ ++instance_iter)
+ {
- // TODO should be binary.
- std::string str = ostr.str();
- mesh_entry["mesh_data"] = LLSD::Binary(str.begin(),str.end());
+ LLModelInstance& instance = *instance_iter;
+
+ LLSD instance_entry;
+
+ for (S32 i = 0; i < 5; i++)
+ {
+ data.mModel[i] = instance.mLOD[i];
+ }
+
+ LLVector3 pos, scale;
+ LLQuaternion rot;
+ LLMatrix4 transformation = instance.mTransform;
+ decomposeMeshMatrix(transformation,pos,rot,scale);
+ instance_entry["position"] = ll_sd_from_vector3(pos);
+ instance_entry["rotation"] = ll_sd_from_quaternion(rot);
+ instance_entry["scale"] = ll_sd_from_vector3(scale);
+
+ instance_entry["material"] = LL_MCODE_WOOD;
+ instance_entry["physics_shape_type"] = (U8)(LLViewerObject::PHYSICS_SHAPE_CONVEX_HULL);
+ instance_entry["mesh"] = mesh_index[data.mBaseModel];
- res["mesh_list"][mesh_num] = mesh_entry;
+ instance_entry["face_list"] = LLSD::emptyArray();
- // TODO how do textures in the list map to textures in the meshes?
- if (mUploadTextures)
- {
- for (std::vector<LLImportMaterial>::iterator material_iter = instance.mMaterial.begin();
- material_iter != instance.mMaterial.end(); ++material_iter)
+ S32 end = llmin((S32)data.mBaseModel->mMaterialList.size(), data.mBaseModel->getNumVolumeFaces()) ;
+ for (S32 face_num = 0; face_num < end; face_num++)
{
-
- if (textures.find(material_iter->mDiffuseMap.get()) == textures.end())
+ LLImportMaterial& material = instance.mMaterial[data.mBaseModel->mMaterialList[face_num]];
+ LLSD face_entry = LLSD::emptyMap();
+ LLViewerFetchedTexture *texture = material.mDiffuseMap.get();
+
+ if ((texture != NULL) &&
+ (textures.find(texture) == textures.end()))
{
- textures.insert(material_iter->mDiffuseMap.get());
+ textures.insert(texture);
+ }
- std::stringstream ostr;
- if (include_textures) // otherwise data is blank.
- {
- LLTextureUploadData data(material_iter->mDiffuseMap.get(), material_iter->mDiffuseMapLabel);
- if (!data.mTexture->isRawImageValid())
- {
- data.mTexture->reloadRawImage(data.mTexture->getDiscardLevel());
- }
-
+ std::stringstream texture_str;
+ if (texture != NULL && include_textures && mUploadTextures)
+ {
+ if(texture->hasSavedRawImage())
+ {
LLPointer<LLImageJ2C> upload_file =
- LLViewerTextureList::convertToUploadFile(data.mTexture->getRawImage());
- ostr.write((const char*) upload_file->getData(), upload_file->getDataSize());
+ LLViewerTextureList::convertToUploadFile(texture->getSavedRawImage());
+ texture_str.write((const char*) upload_file->getData(), upload_file->getDataSize());
}
- LLSD texture_entry;
- texture_entry["texture_data"] = ostr.str();
- res["texture_list"][texture_num] = texture_entry;
+ }
+
+ if (texture != NULL &&
+ mUploadTextures &&
+ texture_index.find(texture) == texture_index.end())
+ {
+ texture_index[texture] = texture_num;
+ std::string str = texture_str.str();
+ res["texture_list"][texture_num] = LLSD::Binary(str.begin(),str.end());
texture_num++;
}
- }
- }
- mesh_num++;
+ // Subset of TextureEntry fields.
+ if (texture != NULL && mUploadTextures)
+ {
+ face_entry["image"] = texture_index[texture];
+ face_entry["scales"] = 1.0;
+ face_entry["scalet"] = 1.0;
+ face_entry["offsets"] = 0.0;
+ face_entry["offsett"] = 0.0;
+ face_entry["imagerot"] = 0.0;
+ }
+ face_entry["diffuse_color"] = ll_sd_from_color4(material.mDiffuseColor);
+ face_entry["fullbright"] = material.mFullbright;
+ instance_entry["face_list"][face_num] = face_entry;
+ }
+
+ res["instance_list"][instance_num] = instance_entry;
+ instance_num++;
+ }
}
+ if (model_name.empty()) model_name = "mesh model";
+ result["name"] = model_name;
result["asset_resources"] = res;
-#if 0
- std::string name("whole_model.xml");
- dumpLLSDToFile(result,name);
-#endif
+ dump_llsd_to_file(result,make_dump_name("whole_model_",dump_num));
dest = result;
}
-void LLMeshUploadThread::doWholeModelUpload()
+void LLMeshUploadThread::generateHulls()
{
- mCurlRequest = new LLCurlRequest();
-
- // Queue up models for hull generation (viewer-side)
for (instance_map::iterator iter = mInstance.begin(); iter != mInstance.end(); ++iter)
- {
- LLMeshUploadData data;
- data.mBaseModel = iter->first;
+ {
+ LLMeshUploadData data;
+ data.mBaseModel = iter->first;
- LLModelInstance& instance = *(iter->second.begin());
+ LLModelInstance& instance = *(iter->second.begin());
- for (S32 i = 0; i < 5; i++)
- {
- data.mModel[i] = instance.mLOD[i];
- }
+ for (S32 i = 0; i < 5; i++)
+ {
+ data.mModel[i] = instance.mLOD[i];
+ }
- //queue up models for hull generation
- LLModel* physics = NULL;
+ //queue up models for hull generation
+ LLModel* physics = NULL;
- if (data.mModel[LLModel::LOD_PHYSICS].notNull())
- {
- physics = data.mModel[LLModel::LOD_PHYSICS];
- }
- else if (data.mModel[LLModel::LOD_MEDIUM].notNull())
- {
- physics = data.mModel[LLModel::LOD_MEDIUM];
- }
- else
- {
- physics = data.mModel[LLModel::LOD_HIGH];
+ if (data.mModel[LLModel::LOD_PHYSICS].notNull())
+ {
+ physics = data.mModel[LLModel::LOD_PHYSICS];
+ }
+ else if (data.mModel[LLModel::LOD_MEDIUM].notNull())
+ {
+ physics = data.mModel[LLModel::LOD_MEDIUM];
+ }
+ else
+ {
+ physics = data.mModel[LLModel::LOD_HIGH];
+ }
+
+ llassert(physics != NULL);
+
+ DecompRequest* request = new DecompRequest(physics, data.mBaseModel, this);
+ if(request->isValid())
+ {
+ gMeshRepo.mDecompThread->submitRequest(request);
+ }
}
- if (!physics)
+ while (!mPhysicsComplete)
{
- llerrs << "WTF?" << llendl;
+ apr_sleep(100);
}
+}
- DecompRequest* request = new DecompRequest(physics, data.mBaseModel, this);
- gMeshRepo.mDecompThread->submitRequest(request);
- }
+void LLMeshUploadThread::doWholeModelUpload()
+{
+ mCurlRequest = new LLCurlRequest();
- while (!mPhysicsComplete)
+ if (mWholeModelUploadURL.empty())
{
- apr_sleep(100);
+ llinfos << "unable to upload, fee request failed" << llendl;
}
+ else
+ {
+ generateHulls();
- bool do_include_textures = false; // not needed for initial cost/validation check.
- LLSD model_data;
- wholeModelToLLSD(model_data, do_include_textures);
+ LLSD full_model_data;
+ wholeModelToLLSD(full_model_data, true);
+ 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);
+ do
+ {
+ mCurlRequest->process();
+ //sleep for 10ms to prevent eating a whole core
+ apr_sleep(10000);
+ } while (mCurlRequest->getQueued() > 0);
+ }
- mPendingUploads++;
- LLCurlRequest::headers_t headers;
- mCurlRequest->post(mWholeModelUploadCapability, headers, model_data.asString(),
- new LLWholeModelFeeResponder(this));
+ delete mCurlRequest;
+ mCurlRequest = NULL;
// Currently a no-op.
mFinished = true;
}
-void LLMeshUploadThread::doIterativeUpload()
+void LLMeshUploadThread::requestWholeModelFee()
{
- if(isDiscarded())
- {
- mFinished = true;
- return ;
- }
-
- mCurlRequest = new LLCurlRequest();
-
- std::set<LLViewerTexture* > textures;
-
- //populate upload queue with relevant models
- for (instance_map::iterator iter = mInstance.begin(); iter != mInstance.end(); ++iter)
- {
- LLMeshUploadData data;
- data.mBaseModel = iter->first;
-
- LLModelInstance& instance = *(iter->second.begin());
+ dump_num++;
- for (S32 i = 0; i < 5; i++)
- {
- data.mModel[i] = instance.mLOD[i];
- }
-
- uploadModel(data);
-
- if (mUploadTextures)
- {
- for (std::vector<LLImportMaterial>::iterator material_iter = instance.mMaterial.begin();
- material_iter != instance.mMaterial.end(); ++material_iter)
- {
+ mCurlRequest = new LLCurlRequest();
- if (textures.find(material_iter->mDiffuseMap.get()) == textures.end())
- {
- textures.insert(material_iter->mDiffuseMap.get());
-
- LLTextureUploadData data(material_iter->mDiffuseMap.get(), material_iter->mDiffuseMapLabel);
- uploadTexture(data);
- }
- }
- }
+ generateHulls();
- //queue up models for hull generation
- DecompRequest* request = new DecompRequest(data.mModel[LLModel::LOD_HIGH], data.mBaseModel, this);
- gMeshRepo.mDecompThread->submitRequest(request);
- }
+ LLSD model_data;
+ wholeModelToLLSD(model_data,false);
+ dump_llsd_to_file(model_data,make_dump_name("whole_model_fee_request_",dump_num));
- while (!mPhysicsComplete)
- {
- apr_sleep(100);
- }
+ mPendingUploads++;
+ LLCurlRequest::headers_t headers;
+ mCurlRequest->post(mWholeModelFeeCapability, headers, model_data,
+ new LLWholeModelFeeResponder(this,model_data, mFeeObserverHandle), mMeshUploadTimeOut);
- //upload textures
- bool done = false;
do
{
- if (!mTextureQ.empty())
- {
- sendCostRequest(mTextureQ.front());
- mTextureQ.pop();
- }
-
- if (!mConfirmedTextureQ.empty())
- {
- doUploadTexture(mConfirmedTextureQ.front());
- mConfirmedTextureQ.pop();
- }
-
- mCurlRequest->process();
-
- done = mTextureQ.empty() && mConfirmedTextureQ.empty();
- }
- while (!done || mCurlRequest->getQueued() > 0);
-
- LLSD object_asset;
- object_asset["objects"] = LLSD::emptyArray();
-
- done = false;
- do
- {
- static S32 count = 0;
- static F32 last_hundred = gFrameTimeSeconds;
- if (gFrameTimeSeconds - last_hundred > 1.f)
- {
- last_hundred = gFrameTimeSeconds;
- count = 0;
- }
-
- //how many requests to push before calling process
- const S32 PUSH_PER_PROCESS = 32;
-
- S32 tcount = llmin(count+PUSH_PER_PROCESS, 100);
-
- while (!mUploadQ.empty() && count < tcount)
- { //send any pending upload requests
- mMutex->lock();
- LLMeshUploadData data = mUploadQ.front();
- mUploadQ.pop();
- mMutex->unlock();
- sendCostRequest(data);
- count++;
- }
-
- tcount = llmin(count+PUSH_PER_PROCESS, 100);
-
- while (!mConfirmedQ.empty() && count < tcount)
- { //process any meshes that have been confirmed for upload
- LLMeshUploadData& data = mConfirmedQ.front();
- doUploadModel(data);
- mConfirmedQ.pop();
- count++;
- }
-
- tcount = llmin(count+PUSH_PER_PROCESS, 100);
-
- while (!mInstanceQ.empty() && count < tcount && !isDiscarded())
- { //create any objects waiting for upload
- count++;
- object_asset["objects"].append(createObject(mInstanceQ.front()));
- mInstanceQ.pop();
- }
-
mCurlRequest->process();
-
- done = isDiscarded() || (mInstanceQ.empty() && mConfirmedQ.empty() && mUploadQ.empty());
- }
- while (!done || mCurlRequest->getQueued() > 0);
+ //sleep for 10ms to prevent eating a whole core
+ apr_sleep(10000);
+ } while (mCurlRequest->getQueued() > 0);
delete mCurlRequest;
mCurlRequest = NULL;
- // now upload the object asset
- std::string url = mUploadObjectAssetCapability;
-
- if (object_asset["objects"][0].has("permissions"))
- { //copy permissions from first available object to be used for coalesced object
- object_asset["permissions"] = object_asset["objects"][0]["permissions"];
- }
-
- if(!isDiscarded())
- {
- mPendingUploads++;
- LLHTTPClient::post(url, object_asset, new LLModelObjectUploadResponder(this,object_asset));
- }
- else
- {
- mFinished = true;
- }
-}
-
-void LLMeshUploadThread::uploadModel(LLMeshUploadData& data)
-{ //called from arbitrary thread
- {
- LLMutexLock lock(mMutex);
- mUploadQ.push(data);
- }
-}
-
-void LLMeshUploadThread::uploadTexture(LLTextureUploadData& data)
-{ //called from mesh upload thread
- mTextureQ.push(data);
+ // Currently a no-op.
+ mFinished = true;
}
-
-static LLFastTimer::DeclareTimer FTM_NOTIFY_MESH_LOADED("Notify Loaded");
-static LLFastTimer::DeclareTimer FTM_NOTIFY_MESH_UNAVAILABLE("Notify Unavailable");
-
void LLMeshRepoThread::notifyLoadedMeshes()
{
while (!mLoadedQ.empty())
@@ -1779,7 +1634,9 @@ S32 LLMeshRepository::getActualMeshLOD(LLSD& header, S32 lod)
{
lod = llclamp(lod, 0, 3);
- if (header.has("404"))
+ S32 version = header["version"];
+
+ if (header.has("404") || version > MAX_MESH_VERSION)
{
return -1;
}
@@ -1812,19 +1669,6 @@ S32 LLMeshRepository::getActualMeshLOD(LLSD& header, S32 lod)
return -1;
}
-U32 LLMeshRepoThread::getResourceCost(const LLUUID& mesh_id)
-{
- LLMutexLock lock(mHeaderMutex);
-
- std::map<LLUUID, U32>::iterator iter = mMeshResourceCost.find(mesh_id);
- if (iter != mMeshResourceCost.end())
- {
- return iter->second;
- }
-
- return 0;
-}
-
void LLMeshRepository::cacheOutgoingMesh(LLMeshUploadData& data, LLSD& header)
{
mThread->mMeshHeader[data.mUUID] = header;
@@ -2115,54 +1959,54 @@ void LLMeshHeaderResponder::completedRaw(U32 status, const std::string& reason,
LLUUID mesh_id = mMeshParams.getSculptID();
LLSD header = gMeshRepo.mThread->mMeshHeader[mesh_id];
- std::stringstream str;
+ S32 version = header["version"].asInteger();
- S32 lod_bytes = 0;
+ if (version <= MAX_MESH_VERSION)
+ {
+ std::stringstream str;
- for (U32 i = 0; i < LLModel::LOD_PHYSICS; ++i)
- { //figure out how many bytes we'll need to reserve in the file
- std::string lod_name = header_lod[i];
- lod_bytes = llmax(lod_bytes, header[lod_name]["offset"].asInteger()+header[lod_name]["size"].asInteger());
- }
+ S32 lod_bytes = 0;
+
+ for (U32 i = 0; i < LLModel::LOD_PHYSICS; ++i)
+ { //figure out how many bytes we'll need to reserve in the file
+ std::string lod_name = header_lod[i];
+ lod_bytes = llmax(lod_bytes, header[lod_name]["offset"].asInteger()+header[lod_name]["size"].asInteger());
+ }
- //just in case skin info or decomposition is at the end of the file (which it shouldn't be)
- lod_bytes = llmax(lod_bytes, header["skin"]["offset"].asInteger() + header["skin"]["size"].asInteger());
- lod_bytes = llmax(lod_bytes, header["decomposition"]["offset"].asInteger() + header["decomposition"]["size"].asInteger());
+ //just in case skin info or decomposition is at the end of the file (which it shouldn't be)
+ lod_bytes = llmax(lod_bytes, header["skin"]["offset"].asInteger() + header["skin"]["size"].asInteger());
+ lod_bytes = llmax(lod_bytes, header["physics_convex"]["offset"].asInteger() + header["physics_convex"]["size"].asInteger());
- S32 header_bytes = (S32) gMeshRepo.mThread->mMeshHeaderSize[mesh_id];
- S32 bytes = lod_bytes + header_bytes;
+ S32 header_bytes = (S32) gMeshRepo.mThread->mMeshHeaderSize[mesh_id];
+ S32 bytes = lod_bytes + header_bytes;
- //it's possible for the remote asset to have more data than is needed for the local cache
- //only allocate as much space in the VFS as is needed for the local cache
- data_size = llmin(data_size, bytes);
+ //it's possible for the remote asset to have more data than is needed for the local cache
+ //only allocate as much space in the VFS as is needed for the local cache
+ data_size = llmin(data_size, bytes);
- LLVFile file(gVFS, mesh_id, LLAssetType::AT_MESH, LLVFile::WRITE);
- if (file.getMaxSize() >= bytes || file.setMaxSize(bytes))
- {
- LLMeshRepository::sCacheBytesWritten += data_size;
+ LLVFile file(gVFS, mesh_id, LLAssetType::AT_MESH, LLVFile::WRITE);
+ if (file.getMaxSize() >= bytes || file.setMaxSize(bytes))
+ {
+ LLMeshRepository::sCacheBytesWritten += data_size;
- file.write((const U8*) data, data_size);
+ file.write((const U8*) data, data_size);
- //zero out the rest of the file
- U8 block[4096];
- memset(block, 0, 4096);
+ //zero out the rest of the file
+ U8 block[4096];
+ memset(block, 0, 4096);
- while (bytes-file.tell() > 4096)
- {
- file.write(block, 4096);
- }
-
- S32 remaining = bytes-file.tell();
+ while (bytes-file.tell() > 4096)
+ {
+ file.write(block, 4096);
+ }
- if (remaining < 0 || remaining > 4096)
- {
- llerrs << "Bad padding of mesh asset cache entry." << llendl;
- }
+ S32 remaining = bytes-file.tell();
- if (remaining > 0)
- {
- file.write(block, remaining);
+ if (remaining > 0)
+ {
+ file.write(block, remaining);
+ }
}
}
}
@@ -2272,8 +2116,6 @@ S32 LLMeshRepository::loadMesh(LLVOVolume* vobj, const LLVolumeParams& mesh_para
return detail;
}
- LLFastTimer t(FTM_LOAD_MESH);
-
{
LLMutexLock lock(mMeshMutex);
//add volume to list of loading meshes
@@ -2344,20 +2186,11 @@ S32 LLMeshRepository::loadMesh(LLVOVolume* vobj, const LLVolumeParams& mesh_para
group->derefLOD(lod);
}
}
- else
- {
- llerrs << "WTF?" << llendl;
- }
}
return detail;
}
-static LLFastTimer::DeclareTimer FTM_START_MESH_THREAD("Start Thread");
-static LLFastTimer::DeclareTimer FTM_LOAD_MESH_LOD("Load LOD");
-static LLFastTimer::DeclareTimer FTM_MESH_LOCK1("Lock 1");
-static LLFastTimer::DeclareTimer FTM_MESH_LOCK2("Lock 2");
-
void LLMeshRepository::notifyLoadedMeshes()
{ //called from main thread
@@ -2390,6 +2223,38 @@ void LLMeshRepository::notifyLoadedMeshes()
LLAssetType::EType asset_type = LLAssetType::lookup(data.mPostData["asset_type"].asString());
LLInventoryType::EType inventory_type = LLInventoryType::lookup(data.mPostData["inventory_type"].asString());
+ // Handle addition of texture, if any.
+ if ( data.mResponse.has("new_texture_folder_id") )
+ {
+ const LLUUID& folder_id = data.mResponse["new_texture_folder_id"].asUUID();
+
+ if ( folder_id.notNull() )
+ {
+ LLUUID parent_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TEXTURE);
+
+ std::string name;
+ // Check if the server built a different name for the texture folder
+ if ( data.mResponse.has("new_texture_folder_name") )
+ {
+ name = data.mResponse["new_texture_folder_name"].asString();
+ }
+ else
+ {
+ name = data.mPostData["name"].asString();
+ }
+
+ // Add the category to the internal representation
+ LLPointer<LLViewerInventoryCategory> cat =
+ new LLViewerInventoryCategory(folder_id, parent_id,
+ LLFolderType::FT_NONE, name, gAgent.getID());
+ cat->setVersion(LLViewerInventoryCategory::VERSION_UNKNOWN);
+
+ LLInventoryModel::LLCategoryUpdate update(cat->getParentUUID(), 1);
+ gInventory.accountForUpdate(update);
+ gInventory.updateCategory(cat);
+ }
+ }
+
on_new_single_inventory_upload_complete(
asset_type,
inventory_type,
@@ -2398,7 +2263,8 @@ void LLMeshRepository::notifyLoadedMeshes()
data.mPostData["name"],
data.mPostData["description"],
data.mResponse,
- 0);
+ data.mResponse["upload_price"]);
+ //}
mInventoryQ.pop();
}
@@ -2419,23 +2285,13 @@ void LLMeshRepository::notifyLoadedMeshes()
if (gAgent.getRegion()->getName() != region_name && gAgent.getRegion()->capabilitiesReceived())
{
region_name = gAgent.getRegion()->getName();
-
mGetMeshCapability = gAgent.getRegion()->getCapability("GetMesh");
}
}
- LLFastTimer t(FTM_MESH_UPDATE);
-
- {
- LLFastTimer t(FTM_MESH_LOCK1);
- mMeshMutex->lock();
- }
-
- {
- LLFastTimer t(FTM_MESH_LOCK2);
- mThread->mMutex->lock();
- }
-
+ mMeshMutex->lock();
+ mThread->mMutex->lock();
+
//popup queued error messages from background threads
while (!mUploadErrorQ.empty())
{
@@ -2487,7 +2343,6 @@ void LLMeshRepository::notifyLoadedMeshes()
while (!mPendingRequests.empty() && push_count > 0)
{
- LLFastTimer t(FTM_LOAD_MESH_LOD);
LLMeshRepoThread::LODRequest& request = mPendingRequests.front();
mThread->loadMeshLOD(request.mMeshParams, request.mLOD);
mPendingRequests.erase(mPendingRequests.begin());
@@ -2527,6 +2382,20 @@ void LLMeshRepository::notifyLoadedMeshes()
void LLMeshRepository::notifySkinInfoReceived(LLMeshSkinInfo& info)
{
mSkinMap[info.mMeshID] = info;
+
+ skin_load_map::iterator iter = mLoadingSkins.find(info.mMeshID);
+ if (iter != mLoadingSkins.end())
+ {
+ for (std::set<LLUUID>::iterator obj_id = iter->second.begin(); obj_id != iter->second.end(); ++obj_id)
+ {
+ LLVOVolume* vobj = (LLVOVolume*) gObjectList.findObject(*obj_id);
+ if (vobj)
+ {
+ vobj->notifyMeshLoaded();
+ }
+ }
+ }
+
mLoadingSkins.erase(info.mMeshID);
}
@@ -2623,26 +2492,7 @@ S32 LLMeshRepository::getActualMeshLOD(const LLVolumeParams& mesh_params, S32 lo
return mThread->getActualMeshLOD(mesh_params, lod);
}
-U32 LLMeshRepository::calcResourceCost(LLSD& header)
-{
- U32 bytes = 0;
-
- for (U32 i = 0; i < 4; i++)
- {
- bytes += header[header_lod[i]]["size"].asInteger();
- }
-
- bytes += header["skin"]["size"].asInteger();
-
- return bytes/4096 + 1;
-}
-
-U32 LLMeshRepository::getResourceCost(const LLUUID& mesh_id)
-{
- return mThread->getResourceCost(mesh_id);
-}
-
-const LLMeshSkinInfo* LLMeshRepository::getSkinInfo(const LLUUID& mesh_id)
+const LLMeshSkinInfo* LLMeshRepository::getSkinInfo(const LLUUID& mesh_id, LLVOVolume* requesting_obj)
{
if (mesh_id.notNull())
{
@@ -2656,12 +2506,12 @@ const LLMeshSkinInfo* LLMeshRepository::getSkinInfo(const LLUUID& mesh_id)
{
LLMutexLock lock(mMeshMutex);
//add volume to list of loading meshes
- std::set<LLUUID>::iterator iter = mLoadingSkins.find(mesh_id);
+ skin_load_map::iterator iter = mLoadingSkins.find(mesh_id);
if (iter == mLoadingSkins.end())
{ //no request pending for this skin info
- mLoadingSkins.insert(mesh_id);
mPendingSkinRequests.push(mesh_id);
}
+ mLoadingSkins[mesh_id].insert(requesting_obj->getID());
}
}
@@ -2743,7 +2593,18 @@ void LLMeshRepository::buildHull(const LLVolumeParams& params, S32 detail)
bool LLMeshRepository::hasPhysicsShape(const LLUUID& mesh_id)
{
LLSD mesh = mThread->getMeshHeader(mesh_id);
- return mesh.has("physics_shape") && mesh["physics_shape"].has("size") && (mesh["physics_shape"]["size"].asInteger() > 0);
+ if (mesh.has("physics_mesh") && mesh["physics_mesh"].has("size") && (mesh["physics_mesh"]["size"].asInteger() > 0))
+ {
+ return true;
+ }
+
+ LLModel::Decomposition* decomp = getDecomposition(mesh_id);
+ if (decomp && !decomp->mHull.empty())
+ {
+ return true;
+ }
+
+ return false;
}
LLSD& LLMeshRepository::getMeshHeader(const LLUUID& mesh_id)
@@ -2769,9 +2630,11 @@ LLSD& LLMeshRepoThread::getMeshHeader(const LLUUID& mesh_id)
void LLMeshRepository::uploadModel(std::vector<LLModelInstance>& data, LLVector3& scale, bool upload_textures,
- bool upload_skin, bool upload_joints)
+ bool upload_skin, bool upload_joints, std::string upload_url, bool do_upload,
+ LLHandle<LLWholeModelFeeObserver> fee_observer, LLHandle<LLWholeModelUploadObserver> upload_observer)
{
- LLMeshUploadThread* thread = new LLMeshUploadThread(data, scale, upload_textures, upload_skin, upload_joints);
+ LLMeshUploadThread* thread = new LLMeshUploadThread(data, scale, upload_textures, upload_skin, upload_joints, upload_url,
+ do_upload, fee_observer, upload_observer);
mUploadWaitList.push_back(thread);
}
@@ -2799,194 +2662,6 @@ S32 LLMeshRepository::getMeshSize(const LLUUID& mesh_id, S32 lod)
}
-void LLMeshUploadThread::sendCostRequest(LLMeshUploadData& data)
-{
- if(isDiscarded())
- {
- return ;
- }
-
- //write model file to memory buffer
- std::stringstream ostr;
-
- LLModel::Decomposition& decomp =
- data.mModel[LLModel::LOD_PHYSICS].notNull() ?
- data.mModel[LLModel::LOD_PHYSICS]->mPhysics :
- data.mBaseModel->mPhysics;
-
- LLSD header = LLModel::writeModel(
- ostr,
- data.mModel[LLModel::LOD_PHYSICS],
- data.mModel[LLModel::LOD_HIGH],
- data.mModel[LLModel::LOD_MEDIUM],
- data.mModel[LLModel::LOD_LOW],
- data.mModel[LLModel::LOD_IMPOSTOR],
- decomp,
- mUploadSkin,
- mUploadJoints,
- true);
-
- std::string desc = data.mBaseModel->mLabel;
-
- // Grab the total vertex count of the model
- // along with other information for the "asset_resources" map
- // to send to the server.
- LLSD asset_resources = LLSD::emptyMap();
-
-
- std::string url = mNewInventoryCapability;
-
- if (!url.empty())
- {
- LLSD body = generate_new_resource_upload_capability_body(
- LLAssetType::AT_MESH,
- desc,
- desc,
- LLFolderType::FT_MESH,
- LLInventoryType::IT_MESH,
- LLFloaterPerms::getNextOwnerPerms(),
- LLFloaterPerms::getGroupPerms(),
- LLFloaterPerms::getEveryonePerms());
-
- body["asset_resources"] = asset_resources;
-
- mPendingConfirmations++;
- LLCurlRequest::headers_t headers;
-
- data.mPostData = body;
-
- mCurlRequest->post(url, headers, body, new LLMeshCostResponder(data, this));
- }
-}
-
-void LLMeshUploadThread::sendCostRequest(LLTextureUploadData& data)
-{
- if(isDiscarded())
- {
- return ;
- }
-
- if (data.mTexture && data.mTexture->getDiscardLevel() >= 0)
- {
- LLSD asset_resources = LLSD::emptyMap();
-
- std::string url = mNewInventoryCapability;
-
- if (!url.empty())
- {
- LLSD body = generate_new_resource_upload_capability_body(
- LLAssetType::AT_TEXTURE,
- data.mLabel,
- data.mLabel,
- LLFolderType::FT_TEXTURE,
- LLInventoryType::IT_TEXTURE,
- LLFloaterPerms::getNextOwnerPerms(),
- LLFloaterPerms::getGroupPerms(),
- LLFloaterPerms::getEveryonePerms());
-
- body["asset_resources"] = asset_resources;
-
- mPendingConfirmations++;
- LLCurlRequest::headers_t headers;
-
- data.mPostData = body;
- mCurlRequest->post(url, headers, body, new LLTextureCostResponder(data, this));
- }
- }
-}
-
-
-void LLMeshUploadThread::doUploadModel(LLMeshUploadData& data)
-{
- if(isDiscarded())
- {
- return ;
- }
-
- if (!data.mRSVP.empty())
- {
- std::stringstream ostr;
-
- LLModel::Decomposition& decomp =
- data.mModel[LLModel::LOD_PHYSICS].notNull() ?
- data.mModel[LLModel::LOD_PHYSICS]->mPhysics :
- data.mBaseModel->mPhysics;
-
- decomp.mBaseHull = mHullMap[data.mBaseModel];
-
- LLModel::writeModel(
- ostr,
- data.mModel[LLModel::LOD_PHYSICS],
- data.mModel[LLModel::LOD_HIGH],
- data.mModel[LLModel::LOD_MEDIUM],
- data.mModel[LLModel::LOD_LOW],
- data.mModel[LLModel::LOD_IMPOSTOR],
- decomp,
- mUploadSkin,
- mUploadJoints);
-
- data.mAssetData = ostr.str();
-
- LLCurlRequest::headers_t headers;
- mPendingUploads++;
-
- mCurlRequest->post(data.mRSVP, headers, data.mAssetData, new LLMeshUploadResponder(data, this));
- }
-}
-
-void LLMeshUploadThread::doUploadTexture(LLTextureUploadData& data)
-{
- if(isDiscarded())
- {
- return ;
- }
-
- if (!data.mRSVP.empty())
- {
- std::stringstream ostr;
-
- if (!data.mTexture->isRawImageValid())
- {
- data.mTexture->reloadRawImage(data.mTexture->getDiscardLevel());
- }
-
- LLPointer<LLImageJ2C> upload_file = LLViewerTextureList::convertToUploadFile(data.mTexture->getRawImage());
-
- ostr.write((const char*) upload_file->getData(), upload_file->getDataSize());
-
- data.mAssetData = ostr.str();
-
- LLCurlRequest::headers_t headers;
- mPendingUploads++;
-
- mCurlRequest->post(data.mRSVP, headers, data.mAssetData, new LLTextureUploadResponder(data, this));
- }
-}
-
-
-void LLMeshUploadThread::onModelUploaded(LLMeshUploadData& data)
-{
- createObjects(data);
-}
-
-void LLMeshUploadThread::onTextureUploaded(LLTextureUploadData& data)
-{
- mTextureMap[data.mTexture] = data;
-}
-
-
-void LLMeshUploadThread::createObjects(LLMeshUploadData& data)
-{
- instance_list& instances = mInstance[data.mBaseModel];
-
- for (instance_list::iterator iter = instances.begin(); iter != instances.end(); ++iter)
- { //create prims that reference given mesh
- LLModelInstance& instance = *iter;
- instance.mMeshID = data.mUUID;
- mInstanceQ.push(instance);
- }
-}
-
void LLMeshUploadThread::decomposeMeshMatrix(LLMatrix4& transformation,
LLVector3& result_pos,
LLQuaternion& result_rot,
@@ -3027,150 +2702,6 @@ void LLMeshUploadThread::decomposeMeshMatrix(LLMatrix4& transformation,
result_rot = quat_rotation;
}
-
-LLSD LLMeshUploadThread::createObject(LLModelInstance& instance)
-{
- LLMatrix4 transformation = instance.mTransform;
-
- if (instance.mMeshID.isNull())
- {
- llerrs << "WTF?" << llendl;
- }
-
- // check for reflection
- BOOL reflected = (transformation.determinant() < 0);
-
- // compute position
- LLVector3 position = LLVector3(0, 0, 0) * transformation;
-
- // compute scale
- LLVector3 x_transformed = LLVector3(1, 0, 0) * transformation - position;
- LLVector3 y_transformed = LLVector3(0, 1, 0) * transformation - position;
- LLVector3 z_transformed = LLVector3(0, 0, 1) * transformation - position;
- F32 x_length = x_transformed.normalize();
- F32 y_length = y_transformed.normalize();
- F32 z_length = z_transformed.normalize();
- LLVector3 scale = LLVector3(x_length, y_length, z_length);
-
- // adjust for "reflected" geometry
- LLVector3 x_transformed_reflected = x_transformed;
- if (reflected)
- {
- x_transformed_reflected *= -1.0;
- }
-
- // compute rotation
- LLMatrix3 rotation_matrix;
- rotation_matrix.setRows(x_transformed_reflected, y_transformed, z_transformed);
- LLQuaternion quat_rotation = rotation_matrix.quaternion();
- quat_rotation.normalize(); // the rotation_matrix might not have been orthoginal. make it so here.
- LLVector3 euler_rotation;
- quat_rotation.getEulerAngles(&euler_rotation.mV[VX], &euler_rotation.mV[VY], &euler_rotation.mV[VZ]);
-
- //
- // build parameter block to construct this prim
- //
-
- LLSD object_params;
-
- // create prim
-
- // set volume params
- U8 sculpt_type = LL_SCULPT_TYPE_MESH;
- if (reflected)
- {
- sculpt_type |= LL_SCULPT_FLAG_MIRROR;
- }
- LLVolumeParams volume_params;
- volume_params.setType( LL_PCODE_PROFILE_SQUARE, LL_PCODE_PATH_LINE );
- volume_params.setBeginAndEndS( 0.f, 1.f );
- volume_params.setBeginAndEndT( 0.f, 1.f );
- volume_params.setRatio ( 1, 1 );
- volume_params.setShear ( 0, 0 );
- volume_params.setSculptID(instance.mMeshID, sculpt_type);
- object_params["shape"] = volume_params.asLLSD();
-
- object_params["material"] = LL_MCODE_WOOD;
-
- object_params["group-id"] = gAgent.getGroupID();
- object_params["pos"] = ll_sd_from_vector3(position + mOrigin);
- object_params["rotation"] = ll_sd_from_quaternion(quat_rotation);
- object_params["scale"] = ll_sd_from_vector3(scale);
- object_params["name"] = instance.mLabel;
-
- // load material from dae file
- object_params["facelist"] = LLSD::emptyArray();
- for (S32 i = 0; i < instance.mMaterial.size(); i++)
- {
- LLTextureEntry te;
- LLImportMaterial& mat = instance.mMaterial[i];
-
- te.setColor(mat.mDiffuseColor);
-
- LLUUID diffuse_id = mTextureMap[mat.mDiffuseMap].mUUID;
-
- if (diffuse_id.notNull())
- {
- te.setID(diffuse_id);
- }
- else
- {
- te.setID(LLUUID("5748decc-f629-461c-9a36-a35a221fe21f")); // blank texture
- }
-
- te.setFullbright(mat.mFullbright);
-
- object_params["facelist"][i] = te.asLLSD();
- }
-
- // set extra parameters
- LLSculptParams sculpt_params;
- sculpt_params.setSculptTexture(instance.mMeshID);
- sculpt_params.setSculptType(sculpt_type);
- U8 buffer[MAX_OBJECT_PARAMS_SIZE+1];
- LLDataPackerBinaryBuffer dp(buffer, MAX_OBJECT_PARAMS_SIZE);
- sculpt_params.pack(dp);
- std::vector<U8> v(dp.getCurrentSize());
- memcpy(&v[0], buffer, dp.getCurrentSize());
- LLSD extra_parameter;
- extra_parameter["extra_parameter"] = sculpt_params.mType;
- extra_parameter["param_data"] = v;
- object_params["extra_parameters"].append(extra_parameter);
-
- LLPermissions perm;
- perm.setOwnerAndGroup(gAgent.getID(), gAgent.getID(), LLUUID::null, false);
- perm.setCreator(gAgent.getID());
-
- perm.initMasks(PERM_ITEM_UNRESTRICTED | PERM_MOVE, //base
- PERM_ITEM_UNRESTRICTED | PERM_MOVE, //owner
- LLFloaterPerms::getEveryonePerms(),
- LLFloaterPerms::getGroupPerms(),
- LLFloaterPerms::getNextOwnerPerms());
-
- object_params["permissions"] = ll_create_sd_from_permissions(perm);
-
- object_params["physics_shape_type"] = (U8)(LLViewerObject::PHYSICS_SHAPE_CONVEX_HULL);
-
- return object_params;
-}
-
-void LLMeshUploadThread::priceResult(LLMeshUploadData& data, const LLSD& content)
-{
- mPendingCost += content["upload_price"].asInteger();
- data.mRSVP = content["rsvp"].asString();
-
- mConfirmedQ.push(data);
-}
-
-void LLMeshUploadThread::priceResult(LLTextureUploadData& data, const LLSD& content)
-{
- mPendingCost += content["upload_price"].asInteger();
- data.mRSVP = content["rsvp"].asString();
-
- mConfirmedTextureQ.push(data);
-}
-
-
bool LLImportMaterial::operator<(const LLImportMaterial &rhs) const
{
if (mDiffuseMap != rhs.mDiffuseMap)
@@ -3193,6 +2724,11 @@ bool LLImportMaterial::operator<(const LLImportMaterial &rhs) const
return mDiffuseColor < rhs.mDiffuseColor;
}
+ if (mBinding != rhs.mBinding)
+ {
+ return mBinding < rhs.mBinding;
+ }
+
return mFullbright < rhs.mFullbright;
}
@@ -3200,6 +2736,8 @@ bool LLImportMaterial::operator<(const LLImportMaterial &rhs) const
void LLMeshRepository::updateInventory(inventory_data data)
{
LLMutexLock lock(mMeshMutex);
+ dump_llsd_to_file(data.mPostData,make_dump_name("update_inventory_post_data_",dump_num));
+ dump_llsd_to_file(data.mResponse,make_dump_name("update_inventory_response_",dump_num));
mInventoryQ.push(data);
}
@@ -3212,55 +2750,66 @@ void LLMeshRepository::uploadError(LLSD& args)
//static
F32 LLMeshRepository::getStreamingCost(LLSD& header, F32 radius, S32* bytes, S32* bytes_visible, S32 lod)
{
- F32 dlowest = llmin(radius/0.03f, 256.f);
- F32 dlow = llmin(radius/0.06f, 256.f);
- F32 dmid = llmin(radius/0.24f, 256.f);
-
- F32 bytes_lowest = header["lowest_lod"]["size"].asReal()/1024.f;
- F32 bytes_low = header["low_lod"]["size"].asReal()/1024.f;
- F32 bytes_mid = header["medium_lod"]["size"].asReal()/1024.f;
- F32 bytes_high = header["high_lod"]["size"].asReal()/1024.f;
+ F32 max_distance = 512.f;
- if (bytes)
- {
- *bytes = 0;
- *bytes += header["lowest_lod"]["size"].asInteger();
- *bytes += header["low_lod"]["size"].asInteger();
- *bytes += header["medium_lod"]["size"].asInteger();
- *bytes += header["high_lod"]["size"].asInteger();
- }
+ F32 dlowest = llmin(radius/0.03f, max_distance);
+ F32 dlow = llmin(radius/0.06f, max_distance);
+ F32 dmid = llmin(radius/0.24f, max_distance);
+
+ F32 METADATA_DISCOUNT = (F32) gSavedSettings.getU32("MeshMetaDataDiscount"); //discount 128 bytes to cover the cost of LLSD tags and compression domain overhead
+ F32 MINIMUM_SIZE = (F32) gSavedSettings.getU32("MeshMinimumByteSize"); //make sure nothing is "free"
+ F32 bytes_per_triangle = (F32) gSavedSettings.getU32("MeshBytesPerTriangle");
- if (bytes_visible)
- {
- lod = LLMeshRepository::getActualMeshLOD(header, lod);
- if (lod >= 0 && lod <= 3)
- {
- *bytes_visible = header[header_lod[lod]]["size"].asInteger();
- }
- }
+ S32 bytes_lowest = header["lowest_lod"]["size"].asInteger();
+ S32 bytes_low = header["low_lod"]["size"].asInteger();
+ S32 bytes_mid = header["medium_lod"]["size"].asInteger();
+ S32 bytes_high = header["high_lod"]["size"].asInteger();
- if (bytes_high == 0.f)
+ if (bytes_high == 0)
{
return 0.f;
}
- if (bytes_mid == 0.f)
+ if (bytes_mid == 0)
{
bytes_mid = bytes_high;
}
- if (bytes_low == 0.f)
+ if (bytes_low == 0)
{
bytes_low = bytes_mid;
}
- if (bytes_lowest == 0.f)
+ if (bytes_lowest == 0)
{
bytes_lowest = bytes_low;
}
- F32 max_area = 65536.f;
+ F32 triangles_lowest = llmax((F32) bytes_lowest-METADATA_DISCOUNT, MINIMUM_SIZE)/bytes_per_triangle;
+ F32 triangles_low = llmax((F32) bytes_low-METADATA_DISCOUNT, MINIMUM_SIZE)/bytes_per_triangle;
+ F32 triangles_mid = llmax((F32) bytes_mid-METADATA_DISCOUNT, MINIMUM_SIZE)/bytes_per_triangle;
+ F32 triangles_high = llmax((F32) bytes_high-METADATA_DISCOUNT, MINIMUM_SIZE)/bytes_per_triangle;
+
+ if (bytes)
+ {
+ *bytes = 0;
+ *bytes += header["lowest_lod"]["size"].asInteger();
+ *bytes += header["low_lod"]["size"].asInteger();
+ *bytes += header["medium_lod"]["size"].asInteger();
+ *bytes += header["high_lod"]["size"].asInteger();
+ }
+
+ if (bytes_visible)
+ {
+ lod = LLMeshRepository::getActualMeshLOD(header, lod);
+ if (lod >= 0 && lod <= 3)
+ {
+ *bytes_visible = header[header_lod[lod]]["size"].asInteger();
+ }
+ }
+
+ F32 max_area = 102932.f; //area of circle that encompasses region
F32 min_area = 1.f;
F32 high_area = llmin(F_PI*dmid*dmid, max_area);
@@ -3283,12 +2832,12 @@ F32 LLMeshRepository::getStreamingCost(LLSD& header, F32 radius, S32* bytes, S32
low_area /= total_area;
lowest_area /= total_area;
- F32 weighted_avg = bytes_high*high_area +
- bytes_mid*mid_area +
- bytes_low*low_area +
- bytes_lowest*lowest_area;
+ F32 weighted_avg = triangles_high*high_area +
+ triangles_mid*mid_area +
+ triangles_low*low_area +
+ triangles_lowest*lowest_area;
- return weighted_avg * gSavedSettings.getF32("MeshStreamingCostScaler");
+ return weighted_avg/gSavedSettings.getU32("MeshTriangleBudget")*15000.f;
}
@@ -3345,27 +2894,33 @@ S32 LLPhysicsDecomp::llcdCallback(const char* status, S32 p1, S32 p2)
return 1;
}
-void LLPhysicsDecomp::setMeshData(LLCDMeshData& mesh)
+void LLPhysicsDecomp::setMeshData(LLCDMeshData& mesh, bool vertex_based)
{
mesh.mVertexBase = mCurRequest->mPositions[0].mV;
mesh.mVertexStrideBytes = 12;
mesh.mNumVertices = mCurRequest->mPositions.size();
- mesh.mIndexType = LLCDMeshData::INT_16;
- mesh.mIndexBase = &(mCurRequest->mIndices[0]);
- mesh.mIndexStrideBytes = 6;
-
- mesh.mNumTriangles = mCurRequest->mIndices.size()/3;
-
- LLCDResult ret = LLCD_OK;
- if (LLConvexDecomposition::getInstance() != NULL)
+ if(!vertex_based)
{
- ret = LLConvexDecomposition::getInstance()->setMeshData(&mesh);
+ mesh.mIndexType = LLCDMeshData::INT_16;
+ mesh.mIndexBase = &(mCurRequest->mIndices[0]);
+ mesh.mIndexStrideBytes = 6;
+
+ mesh.mNumTriangles = mCurRequest->mIndices.size()/3;
}
- if (ret)
+ if ((vertex_based || mesh.mNumTriangles > 0) && mesh.mNumVertices > 2)
{
- llerrs << "Convex Decomposition thread valid but could not set mesh data" << llendl;
+ LLCDResult ret = LLCD_OK;
+ if (LLConvexDecomposition::getInstance() != NULL)
+ {
+ ret = LLConvexDecomposition::getInstance()->setMeshData(&mesh, vertex_based);
+ }
+
+ if (ret)
+ {
+ llerrs << "Convex Decomposition thread valid but could not set mesh data" << llendl;
+ }
}
}
@@ -3374,10 +2929,16 @@ void LLPhysicsDecomp::doDecomposition()
LLCDMeshData mesh;
S32 stage = mStageID[mCurRequest->mStage];
+ if (LLConvexDecomposition::getInstance() == NULL)
+ {
+ // stub library. do nothing.
+ return;
+ }
+
//load data intoLLCD
if (stage == 0)
{
- setMeshData(mesh);
+ setMeshData(mesh, false);
}
//build parameter map
@@ -3423,11 +2984,6 @@ void LLPhysicsDecomp::doDecomposition()
{
ret = LLConvexDecomposition::getInstance()->setParam(param->mName, value.asBoolean());
}
-
- if (ret)
- {
- llerrs << "WTF?" << llendl;
- }
}
mCurRequest->setStatusMessage("Executing.");
@@ -3556,11 +3112,54 @@ void make_box(LLPhysicsDecomp::Request * request)
void LLPhysicsDecomp::doDecompositionSingleHull()
{
- LLCDMeshData mesh;
+ LLConvexDecomposition* decomp = LLConvexDecomposition::getInstance();
+
+ if (decomp == NULL)
+ {
+ //stub. do nothing.
+ return;
+ }
- setMeshData(mesh);
+ LLCDMeshData mesh;
+
+#if 1
+ setMeshData(mesh, true);
+
+ LLCDResult ret = decomp->buildSingleHull() ;
+ if(ret)
+ {
+ llwarns << "Could not execute decomposition stage when attempting to create single hull." << llendl;
+ make_box(mCurRequest);
+ }
+
+ mMutex->lock();
+ mCurRequest->mHull.clear();
+ mCurRequest->mHull.resize(1);
+ mCurRequest->mHullMesh.clear();
+ mMutex->unlock();
+
+ std::vector<LLVector3> p;
+ LLCDHull hull;
+
+ // if LLConvexDecomposition is a stub, num_hulls should have been set to 0 above, and we should not reach this code
+ decomp->getSingleHull(&hull);
+
+ const F32* v = hull.mVertexBase;
+
+ for (S32 j = 0; j < hull.mNumVertices; ++j)
+ {
+ LLVector3 vert(v[0], v[1], v[2]);
+ p.push_back(vert);
+ v = (F32*) (((U8*) v) + hull.mVertexStrideBytes);
+ }
+
+ mMutex->lock();
+ mCurRequest->mHull[0] = p;
+ mMutex->unlock();
-
+#else
+ setMeshData(mesh, false);
+
//set all parameters to default
std::map<std::string, const LLCDParam*> param_map;
@@ -3569,17 +3168,15 @@ void LLPhysicsDecomp::doDecompositionSingleHull()
if (!params)
{
- param_count = LLConvexDecomposition::getInstance()->getParameters(&params);
+ param_count = decomp->getParameters(&params);
}
- LLConvexDecomposition* decomp = LLConvexDecomposition::getInstance();
-
for (S32 i = 0; i < param_count; ++i)
{
decomp->setParam(params[i].mName, params[i].mDefault.mIntOrEnumValue);
}
- const S32 STAGE_DECOMPOSE = mStageID["Decompose"];
+ const S32 STAGE_DECOMPOSE = mStageID["Decompose"];
const S32 STAGE_SIMPLIFY = mStageID["Simplify"];
const S32 DECOMP_PREVIEW = 0;
const S32 SIMPLIFY_RETAIN = 0;
@@ -3641,7 +3238,7 @@ void LLPhysicsDecomp::doDecompositionSingleHull()
}
}
}
-
+#endif
{
completeCurrent();
@@ -3653,6 +3250,14 @@ void LLPhysicsDecomp::doDecompositionSingleHull()
void LLPhysicsDecomp::run()
{
LLConvexDecomposition* decomp = LLConvexDecomposition::getInstance();
+ if (decomp == NULL)
+ {
+ // stub library. Set init to true so the main thread
+ // doesn't wait for this to finish.
+ mInited = true;
+ return;
+ }
+
decomp->initThread();
mInited = true;
@@ -3708,6 +3313,81 @@ void LLPhysicsDecomp::run()
mDone = true;
}
+void LLPhysicsDecomp::Request::assignData(LLModel* mdl)
+{
+ if (!mdl)
+ {
+ return ;
+ }
+
+ U16 index_offset = 0;
+ U16 tri[3] ;
+
+ mPositions.clear();
+ mIndices.clear();
+ mBBox[1] = LLVector3(F32_MIN, F32_MIN, F32_MIN) ;
+ mBBox[0] = LLVector3(F32_MAX, F32_MAX, F32_MAX) ;
+
+ //queue up vertex positions and indices
+ for (S32 i = 0; i < mdl->getNumVolumeFaces(); ++i)
+ {
+ const LLVolumeFace& face = mdl->getVolumeFace(i);
+ if (mPositions.size() + face.mNumVertices > 65535)
+ {
+ continue;
+ }
+
+ for (U32 j = 0; j < face.mNumVertices; ++j)
+ {
+ mPositions.push_back(LLVector3(face.mPositions[j].getF32ptr()));
+ for(U32 k = 0 ; k < 3 ; k++)
+ {
+ mBBox[0].mV[k] = llmin(mBBox[0].mV[k], mPositions[j].mV[k]) ;
+ mBBox[1].mV[k] = llmax(mBBox[1].mV[k], mPositions[j].mV[k]) ;
+ }
+ }
+
+ updateTriangleAreaThreshold() ;
+
+ for (U32 j = 0; j+2 < face.mNumIndices; j += 3)
+ {
+ tri[0] = face.mIndices[j] + index_offset ;
+ tri[1] = face.mIndices[j + 1] + index_offset ;
+ tri[2] = face.mIndices[j + 2] + index_offset ;
+
+ if(isValidTriangle(tri[0], tri[1], tri[2]))
+ {
+ mIndices.push_back(tri[0]);
+ mIndices.push_back(tri[1]);
+ mIndices.push_back(tri[2]);
+ }
+ }
+
+ index_offset += face.mNumVertices;
+ }
+
+ return ;
+}
+
+void LLPhysicsDecomp::Request::updateTriangleAreaThreshold()
+{
+ F32 range = mBBox[1].mV[0] - mBBox[0].mV[0] ;
+ range = llmin(range, mBBox[1].mV[1] - mBBox[0].mV[1]) ;
+ range = llmin(range, mBBox[1].mV[2] - mBBox[0].mV[2]) ;
+
+ mTriangleAreaThreshold = llmin(0.0002f, range * 0.000002f) ;
+}
+
+//check if the triangle area is large enough to qualify for a valid triangle
+bool LLPhysicsDecomp::Request::isValidTriangle(U16 idx1, U16 idx2, U16 idx3)
+{
+ LLVector3 a = mPositions[idx2] - mPositions[idx1] ;
+ LLVector3 b = mPositions[idx3] - mPositions[idx1] ;
+ F32 c = a * b ;
+
+ return ((a*a) * (b*b) - c * c) > mTriangleAreaThreshold ;
+}
+
void LLPhysicsDecomp::Request::setStatusMessage(const std::string& msg)
{
mStatusMessage = msg;
@@ -3721,7 +3401,8 @@ LLModelInstance::LLModelInstance(LLSD& data)
for (U32 i = 0; i < data["material"].size(); ++i)
{
- mMaterial.push_back(LLImportMaterial(data["material"][i]));
+ LLImportMaterial mat(data["material"][i]);
+ mMaterial[mat.mBinding] = mat;
}
}
@@ -3734,9 +3415,10 @@ LLSD LLModelInstance::asLLSD()
ret["label"] = mLabel;
ret["transform"] = mTransform.getValue();
- for (U32 i = 0; i < mMaterial.size(); ++i)
+ U32 i = 0;
+ for (std::map<std::string, LLImportMaterial>::iterator iter = mMaterial.begin(); iter != mMaterial.end(); ++iter)
{
- ret["material"][i] = mMaterial[i].asLLSD();
+ ret["material"][i++] = iter->second.asLLSD();
}
return ret;
@@ -3748,6 +3430,7 @@ LLImportMaterial::LLImportMaterial(LLSD& data)
mDiffuseMapLabel = data["diffuse"]["label"].asString();
mDiffuseColor.setValue(data["diffuse"]["color"]);
mFullbright = data["fullbright"].asBoolean();
+ mBinding = data["binding"].asString();
}
@@ -3759,7 +3442,8 @@ LLSD LLImportMaterial::asLLSD()
ret["diffuse"]["label"] = mDiffuseMapLabel;
ret["diffuse"]["color"] = mDiffuseColor.getValue();
ret["fullbright"] = mFullbright;
-
+ ret["binding"] = mBinding;
+
return ret;
}
@@ -3805,3 +3489,27 @@ void LLMeshRepository::buildPhysicsMesh(LLModel::Decomposition& decomp)
}
}
}
+
+
+bool LLMeshRepository::meshUploadEnabled()
+{
+ LLViewerRegion *region = gAgent.getRegion();
+ if(gSavedSettings.getBOOL("MeshEnabled") &&
+ LLViewerParcelMgr::getInstance()->allowAgentBuild() &&
+ region)
+ {
+ return region->meshUploadEnabled();
+ }
+ return false;
+}
+
+bool LLMeshRepository::meshRezEnabled()
+{
+ LLViewerRegion *region = gAgent.getRegion();
+ if(gSavedSettings.getBOOL("MeshEnabled") &&
+ region)
+ {
+ return region->meshRezEnabled();
+ }
+ return false;
+}
diff --git a/indra/newview/llmeshrepository.h b/indra/newview/llmeshrepository.h
index 802e3e1aba..35a7314cd5 100644
--- a/indra/newview/llmeshrepository.h
+++ b/indra/newview/llmeshrepository.h
@@ -36,6 +36,7 @@
#define LLCONVEXDECOMPINTER_STATIC 1
#include "llconvexdecomposition.h"
+#include "lluploadfloaterobservers.h"
class LLVOVolume;
class LLMeshResponder;
@@ -91,6 +92,7 @@ public:
LLPointer<LLViewerFetchedTexture> mDiffuseMap;
std::string mDiffuseMapFilename;
std::string mDiffuseMapLabel;
+ std::string mBinding;
LLColor4 mDiffuseColor;
bool mFullbright;
@@ -119,9 +121,9 @@ public:
S32 mLocalMeshID;
LLMatrix4 mTransform;
- std::vector<LLImportMaterial> mMaterial;
+ std::map<std::string, LLImportMaterial> mMaterial;
- LLModelInstance(LLModel* model, const std::string& label, LLMatrix4& transform, std::vector<LLImportMaterial>& materials)
+ LLModelInstance(LLModel* model, const std::string& label, LLMatrix4& transform, std::map<std::string, LLImportMaterial>& materials)
: mModel(model), mLabel(label), mTransform(transform), mMaterial(materials)
{
mLocalMeshID = -1;
@@ -152,7 +154,7 @@ public:
std::string mStatusMessage;
std::vector<LLModel::PhysicsMesh> mHullMesh;
LLModel::convex_hull_decomposition mHull;
-
+
//status message callback, called from decomposition thread
virtual S32 statusCallback(const char* status, S32 p1, S32 p2) = 0;
@@ -160,6 +162,17 @@ public:
virtual void completed() = 0;
virtual void setStatusMessage(const std::string& msg);
+
+ bool isValid() const {return mPositions.size() > 2 && mIndices.size() > 2 ;}
+
+ protected:
+ //internal use
+ LLVector3 mBBox[2] ;
+ F32 mTriangleAreaThreshold ;
+
+ void assignData(LLModel* mdl) ;
+ void updateTriangleAreaThreshold() ;
+ bool isValidTriangle(U16 idx1, U16 idx2, U16 idx3) ;
};
LLCondition* mSignal;
@@ -178,7 +191,7 @@ public:
static S32 llcdCallback(const char*, S32, S32);
void cancel();
- void setMeshData(LLCDMeshData& mesh);
+ void setMeshData(LLCDMeshData& mesh, bool vertex_based);
void doDecomposition();
void doDecompositionSingleHull();
@@ -218,8 +231,7 @@ public:
mesh_header_map mMeshHeader;
std::map<LLUUID, U32> mMeshHeaderSize;
- std::map<LLUUID, U32> mMeshResourceCost;
-
+
class HeaderRequest
{
public:
@@ -322,8 +334,7 @@ public:
void notifyLoadedMeshes();
S32 getActualMeshLOD(const LLVolumeParams& mesh_params, S32 lod);
- U32 getResourceCost(const LLUUID& mesh_params);
-
+
void loadMeshSkinInfo(const LLUUID& mesh_id);
void loadMeshDecomposition(const LLUUID& mesh_id);
void loadMeshPhysicsShape(const LLUUID& mesh_id);
@@ -345,6 +356,9 @@ public:
class LLMeshUploadThread : public LLThread
{
+private:
+ S32 mMeshUploadTimeOut ; //maximum time in seconds to execute an uploading request.
+
public:
class DecompRequest : public LLPhysicsDecomp::Request
{
@@ -374,9 +388,7 @@ public:
LLMutex* mMutex;
LLCurlRequest* mCurlRequest;
- S32 mPendingConfirmations;
S32 mPendingUploads;
- S32 mPendingCost;
LLVector3 mOrigin;
bool mFinished;
bool mUploadTextures;
@@ -385,45 +397,24 @@ public:
BOOL mDiscarded ;
LLHost mHost;
- std::string mUploadObjectAssetCapability;
- std::string mNewInventoryCapability;
- std::string mWholeModelUploadCapability;
-
- std::queue<LLMeshUploadData> mUploadQ;
- std::queue<LLMeshUploadData> mConfirmedQ;
- std::queue<LLModelInstance> mInstanceQ;
-
- std::queue<LLTextureUploadData> mTextureQ;
- std::queue<LLTextureUploadData> mConfirmedTextureQ;
-
- std::map<LLViewerFetchedTexture*, LLTextureUploadData> mTextureMap;
+ std::string mWholeModelFeeCapability;
+ std::string mWholeModelUploadURL;
LLMeshUploadThread(instance_list& data, LLVector3& scale, bool upload_textures,
- bool upload_skin, bool upload_joints);
+ bool upload_skin, bool upload_joints, std::string upload_url, bool do_upload = true,
+ LLHandle<LLWholeModelFeeObserver> fee_observer= (LLHandle<LLWholeModelFeeObserver>()), LLHandle<LLWholeModelUploadObserver> upload_observer = (LLHandle<LLWholeModelUploadObserver>()));
~LLMeshUploadThread();
- void uploadTexture(LLTextureUploadData& data);
- void doUploadTexture(LLTextureUploadData& data);
- void sendCostRequest(LLTextureUploadData& data);
- void priceResult(LLTextureUploadData& data, const LLSD& content);
- void onTextureUploaded(LLTextureUploadData& data);
-
- void uploadModel(LLMeshUploadData& data);
- void sendCostRequest(LLMeshUploadData& data);
- void doUploadModel(LLMeshUploadData& data);
- void onModelUploaded(LLMeshUploadData& data);
- void createObjects(LLMeshUploadData& data);
- LLSD createObject(LLModelInstance& instance);
- void priceResult(LLMeshUploadData& data, const LLSD& content);
-
bool finished() { return mFinished; }
virtual void run();
void preStart();
void discard() ;
BOOL isDiscarded();
+ void generateHulls();
+
void doWholeModelUpload();
- void doIterativeUpload();
+ void requestWholeModelFee();
void wholeModelToLLSD(LLSD& dest, bool include_textures);
@@ -431,6 +422,15 @@ public:
LLVector3& result_pos,
LLQuaternion& result_rot,
LLVector3& result_scale);
+
+ void setFeeObserverHandle(LLHandle<LLWholeModelFeeObserver> observer_handle) { mFeeObserverHandle = observer_handle; }
+ void setUploadObserverHandle(LLHandle<LLWholeModelUploadObserver> observer_handle) { mUploadObserverHandle = observer_handle; }
+
+private:
+ LLHandle<LLWholeModelFeeObserver> mFeeObserverHandle;
+ LLHandle<LLWholeModelUploadObserver> mUploadObserverHandle;
+
+ bool mDoUpload; // if FALSE only model data will be requested, otherwise the model will be uploaded
};
class LLMeshRepository
@@ -464,20 +464,23 @@ public:
S32 getActualMeshLOD(const LLVolumeParams& mesh_params, S32 lod);
static S32 getActualMeshLOD(LLSD& header, S32 lod);
- U32 calcResourceCost(LLSD& header);
- U32 getResourceCost(const LLUUID& mesh_params);
- const LLMeshSkinInfo* getSkinInfo(const LLUUID& mesh_id);
+ const LLMeshSkinInfo* getSkinInfo(const LLUUID& mesh_id, LLVOVolume* requesting_obj);
LLModel::Decomposition* getDecomposition(const LLUUID& mesh_id);
void fetchPhysicsShape(const LLUUID& mesh_id);
bool hasPhysicsShape(const LLUUID& mesh_id);
void buildHull(const LLVolumeParams& params, S32 detail);
void buildPhysicsMesh(LLModel::Decomposition& decomp);
+
+ bool meshUploadEnabled();
+ bool meshRezEnabled();
+
LLSD& getMeshHeader(const LLUUID& mesh_id);
void uploadModel(std::vector<LLModelInstance>& data, LLVector3& scale, bool upload_textures,
- bool upload_skin, bool upload_joints);
+ bool upload_skin, bool upload_joints, std::string upload_url, bool do_upload = true,
+ LLHandle<LLWholeModelFeeObserver> fee_observer= (LLHandle<LLWholeModelFeeObserver>()), LLHandle<LLWholeModelUploadObserver> upload_observer = (LLHandle<LLWholeModelUploadObserver>()));
S32 getMeshSize(const LLUUID& mesh_id, S32 lod);
@@ -495,7 +498,8 @@ public:
std::vector<LLMeshRepoThread::LODRequest> mPendingRequests;
//list of mesh ids awaiting skin info
- std::set<LLUUID> mLoadingSkins;
+ typedef std::map<LLUUID, std::set<LLUUID> > skin_load_map;
+ skin_load_map mLoadingSkins;
//list of mesh ids that need to send skin info fetch requests
std::queue<LLUUID> mPendingSkinRequests;
diff --git a/indra/newview/llnearbychatbar.cpp b/indra/newview/llnearbychatbar.cpp
index d3fd959152..4b961db5f9 100644
--- a/indra/newview/llnearbychatbar.cpp
+++ b/indra/newview/llnearbychatbar.cpp
@@ -889,11 +889,11 @@ void send_chat_from_viewer(const std::string& utf8_out_text, EChatType type, S32
LLViewerStats::getInstance()->incStat(LLViewerStats::ST_CHAT_COUNT);
}
-class LLChatHandler : public LLCommandHandler
+class LLChatCommandHandler : public LLCommandHandler
{
public:
// not allowed from outside the app
- LLChatHandler() : LLCommandHandler("chat", UNTRUSTED_BLOCK) { }
+ LLChatCommandHandler() : LLCommandHandler("chat", UNTRUSTED_BLOCK) { }
// Your code here
bool handle(const LLSD& tokens, const LLSD& query_map,
@@ -909,7 +909,7 @@ public:
{
S32 channel = tokens[0].asInteger();
// VWR-19499 Restrict function to chat channels greater than 0.
- if ((channel > 0) && (channel < 2147483647))
+ if ((channel > 0) && (channel < CHAT_CHANNEL_DEBUG))
{
retval = true;
// Send unescaped message, see EXT-6353.
@@ -927,6 +927,6 @@ public:
};
// Creating the object registers with the dispatcher.
-LLChatHandler gChatHandler;
+LLChatCommandHandler gChatHandler;
diff --git a/indra/newview/llnearbychatbarlistener.cpp b/indra/newview/llnearbychatbarlistener.cpp
new file mode 100644
index 0000000000..a63e1fb76e
--- /dev/null
+++ b/indra/newview/llnearbychatbarlistener.cpp
@@ -0,0 +1,100 @@
+/**
+ * @file llnearbychatbarlistener.cpp
+ * @author Dave Simmons
+ * @date 2011-03-15
+ * @brief Implementation for LLNearbyChatBarListener.
+ *
+ * $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 "llnearbychatbarlistener.h"
+#include "llnearbychatbar.h"
+
+#include "llagent.h"
+#include "llchat.h"
+
+
+
+LLNearbyChatBarListener::LLNearbyChatBarListener(LLNearbyChatBar & chatbar)
+ : LLEventAPI("LLChatBar",
+ "LLChatBar listener to (e.g.) sendChat, etc."),
+ mChatbar(chatbar)
+{
+ add("sendChat",
+ "Send chat to the simulator:\n"
+ "[\"message\"] chat message text [required]\n"
+ "[\"channel\"] chat channel number [default = 0]\n"
+ "[\"type\"] chat type \"whisper\", \"normal\", \"shout\" [default = \"normal\"]",
+ &LLNearbyChatBarListener::sendChat);
+}
+
+
+// "sendChat" command
+void LLNearbyChatBarListener::sendChat(LLSD const & chat_data) const
+{
+ // Extract the data
+ std::string chat_text = chat_data["message"].asString();
+
+ S32 channel = 0;
+ if (chat_data.has("channel"))
+ {
+ channel = chat_data["channel"].asInteger();
+ if (channel < 0 || channel >= CHAT_CHANNEL_DEBUG)
+ { // Use 0 up to (but not including) CHAT_CHANNEL_DEBUG
+ channel = 0;
+ }
+ }
+
+ EChatType type_o_chat = CHAT_TYPE_NORMAL;
+ if (chat_data.has("type"))
+ {
+ std::string type_string = chat_data["type"].asString();
+ if (type_string == "whisper")
+ {
+ type_o_chat = CHAT_TYPE_WHISPER;
+ }
+ else if (type_string == "shout")
+ {
+ type_o_chat = CHAT_TYPE_SHOUT;
+ }
+ }
+
+ // Have to prepend /42 style channel numbers
+ std::string chat_to_send;
+ if (channel == 0)
+ {
+ chat_to_send = chat_text;
+ }
+ else
+ {
+ chat_to_send += "/";
+ chat_to_send += chat_data["channel"].asString();
+ chat_to_send += " ";
+ chat_to_send += chat_text;
+ }
+
+ // Send it as if it was typed in
+ mChatbar.sendChatFromViewer(chat_to_send, type_o_chat, (BOOL)(channel == 0));
+}
+
diff --git a/indra/newview/llnearbychatbarlistener.h b/indra/newview/llnearbychatbarlistener.h
new file mode 100644
index 0000000000..9af9bc1f7b
--- /dev/null
+++ b/indra/newview/llnearbychatbarlistener.h
@@ -0,0 +1,50 @@
+/**
+ * @file llnearbychatbarlistener.h
+ * @author Dave Simmons
+ * @date 2011-03-15
+ * @brief Class definition for LLNearbyChatBarListener.
+ *
+ * $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_LLNEARBYCHATBARLISTENER_H
+#define LL_LLNEARBYCHATBARLISTENER_H
+
+#include "lleventapi.h"
+
+class LLSD;
+class LLNearbyChatBar;
+
+class LLNearbyChatBarListener : public LLEventAPI
+{
+public:
+ LLNearbyChatBarListener(LLNearbyChatBar & chatbar);
+
+private:
+ void sendChat(LLSD const & chat_data) const;
+
+ LLNearbyChatBar & mChatbar;
+};
+
+#endif // LL_LLNEARBYCHATBARLISTENER_H
+
diff --git a/indra/newview/llnearbychathandler.cpp b/indra/newview/llnearbychathandler.cpp
index b56fb65a4c..957b6d5f94 100644
--- a/indra/newview/llnearbychathandler.cpp
+++ b/indra/newview/llnearbychathandler.cpp
@@ -268,6 +268,9 @@ bool LLNearbyChatScreenChannel::createPoolToast()
toast->setOnFadeCallback(boost::bind(&LLNearbyChatScreenChannel::onToastFade, this, _1));
+ // If the toast gets somehow prematurely destroyed, deactivate it to prevent crash (STORM-1352).
+ toast->setOnToastDestroyedCallback(boost::bind(&LLNearbyChatScreenChannel::onToastDestroyed, this, _1, false));
+
LL_DEBUGS("NearbyChat") << "Creating and pooling toast" << llendl;
m_toast_pool.push_back(toast->getHandle());
return true;
@@ -369,8 +372,10 @@ void LLNearbyChatScreenChannel::arrangeToasts()
}
}
-int sort_toasts_predicate(LLHandle<LLToast> first, LLHandle<LLToast> second)
+static bool sort_toasts_predicate(LLHandle<LLToast> first, LLHandle<LLToast> second)
{
+ if (!first.get() || !second.get()) return false; // STORM-1352
+
F32 v1 = first.get()->getTimeLeftToLive();
F32 v2 = second.get()->getTimeLeftToLive();
return v1 > v2;
@@ -396,7 +401,11 @@ void LLNearbyChatScreenChannel::showToastsBottom()
for(toast_vec_t::iterator it = m_active_toasts.begin(); it != m_active_toasts.end(); ++it)
{
LLToast* toast = it->get();
- if (!toast) continue;
+ if (!toast)
+ {
+ llwarns << "NULL found in the active chat toasts list!" << llendl;
+ continue;
+ }
S32 toast_top = bottom + toast->getRect().getHeight() + margin;
@@ -441,6 +450,8 @@ void LLNearbyChatScreenChannel::reshape (S32 width, S32 height, BOOL called_fr
//-----------------------------------------------------------------------------------------------
//LLNearbyChatHandler
//-----------------------------------------------------------------------------------------------
+boost::scoped_ptr<LLEventPump> LLNearbyChatHandler::sChatWatcher(new LLEventStream("LLChat"));
+
LLNearbyChatHandler::LLNearbyChatHandler(e_notification_type type, const LLSD& id)
{
mType = type;
@@ -470,7 +481,8 @@ void LLNearbyChatHandler::initChannel()
-void LLNearbyChatHandler::processChat(const LLChat& chat_msg, const LLSD &args)
+void LLNearbyChatHandler::processChat(const LLChat& chat_msg, // WARNING - not really const, see hack below changing chat_msg.mText
+ const LLSD &args)
{
if(chat_msg.mMuted == TRUE)
return;
@@ -478,7 +490,17 @@ void LLNearbyChatHandler::processChat(const LLChat& chat_msg, const LLSD &args)
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);
+ }
LLNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<LLNearbyChat>("nearby_chat", LLSD());
{
@@ -487,6 +509,27 @@ void LLNearbyChatHandler::processChat(const LLChat& chat_msg, const LLSD &args)
// tmp_chat.mFromName = tmp_chat.mFromID.asString();
}
+ // Build notification data
+ LLSD notification;
+ notification["message"] = chat_msg.mText;
+ notification["from"] = chat_msg.mFromName;
+ notification["from_id"] = chat_msg.mFromID;
+ notification["time"] = chat_msg.mTime;
+ notification["source"] = (S32)chat_msg.mSourceType;
+ notification["chat_type"] = (S32)chat_msg.mChatType;
+ notification["chat_style"] = (S32)chat_msg.mChatStyle;
+ // Pass sender info so that it can be rendered properly (STORM-1021).
+ notification["sender_slurl"] = LLViewerChat::getSenderSLURL(chat_msg, args);
+
+ if (chat_msg.mChatType == CHAT_TYPE_DIRECT &&
+ chat_msg.mText.length() > 0 &&
+ chat_msg.mText[0] == '@')
+ {
+ // Send event on to LLEventStream and exit
+ sChatWatcher->post(notification);
+ return;
+ }
+
// don't show toast and add message to chat history on receive debug message
// with disabled setting showing script errors or enabled setting to show script
// errors in separate window.
@@ -508,7 +551,7 @@ void LLNearbyChatHandler::processChat(const LLChat& chat_msg, const LLSD &args)
LLViewerChat::getChatColor(chat_msg,txt_color);
- LLFloaterScriptDebug::addScriptLine(chat_msg.mText,
+ LLFloaterScriptDebug::addScriptLine(original_message, // Send full message with "/me" style prefix
chat_msg.mFromName,
txt_color,
chat_msg.mFromID);
@@ -529,21 +572,16 @@ void LLNearbyChatHandler::processChat(const LLChat& chat_msg, const LLSD &args)
}
+ // Send event on to LLEventStream
+ sChatWatcher->post(notification);
+
+
if( nearby_chat->getVisible()
|| ( chat_msg.mSourceType == CHAT_SOURCE_AGENT
&& gSavedSettings.getBOOL("UseChatBubbles") )
|| !mChannel->getShowToasts() ) // to prevent toasts in Busy mode
return;//no need in toast if chat is visible or if bubble chat is enabled
- // Handle irc styled messages for toast panel
- if (tmp_chat.mChatStyle == CHAT_STYLE_IRC)
- {
- 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);
- }
-
// arrange a channel on a screen
if(!mChannel->getVisible())
{
@@ -562,25 +600,14 @@ void LLNearbyChatHandler::processChat(const LLChat& chat_msg, const LLSD &args)
}
*/
- // Add a nearby chat toast.
- LLUUID id;
- id.generate();
-
LLNearbyChatScreenChannel* channel = dynamic_cast<LLNearbyChatScreenChannel*>(mChannel);
-
if(channel)
{
- LLSD notification;
+ // Add a nearby chat toast.
+ LLUUID id;
+ id.generate();
notification["id"] = id;
- notification["message"] = chat_msg.mText;
- notification["from"] = chat_msg.mFromName;
- notification["from_id"] = chat_msg.mFromID;
- notification["time"] = chat_msg.mTime;
- notification["source"] = (S32)chat_msg.mSourceType;
- notification["chat_type"] = (S32)chat_msg.mChatType;
- notification["chat_style"] = (S32)chat_msg.mChatStyle;
-
std::string r_color_name = "White";
F32 r_color_alpha = 1.0f;
LLViewerChat::getChatColor( chat_msg, r_color_name, r_color_alpha);
@@ -588,13 +615,8 @@ void LLNearbyChatHandler::processChat(const LLChat& chat_msg, const LLSD &args)
notification["text_color"] = r_color_name;
notification["color_alpha"] = r_color_alpha;
notification["font_size"] = (S32)LLViewerChat::getChatFontSize() ;
-
- // Pass sender info so that it can be rendered properly (STORM-1021).
- notification["sender_slurl"] = LLViewerChat::getSenderSLURL(chat_msg, args);
-
channel->addNotification(notification);
}
-
}
void LLNearbyChatHandler::onDeleteToast(LLToast* toast)
diff --git a/indra/newview/llnearbychathandler.h b/indra/newview/llnearbychathandler.h
index ec1f29cdfc..b0e4f62d51 100644
--- a/indra/newview/llnearbychathandler.h
+++ b/indra/newview/llnearbychathandler.h
@@ -29,6 +29,8 @@
#include "llnotificationhandler.h"
+class LLEventPump;
+
//add LLNearbyChatHandler to LLNotificationsUI namespace
namespace LLNotificationsUI{
@@ -44,6 +46,8 @@ public:
protected:
virtual void onDeleteToast(LLToast* toast);
virtual void initChannel();
+
+ static boost::scoped_ptr<LLEventPump> sChatWatcher;
};
}
diff --git a/indra/newview/llnotificationhandlerutil.cpp b/indra/newview/llnotificationhandlerutil.cpp
index 70d588db52..de90023f3b 100644
--- a/indra/newview/llnotificationhandlerutil.cpp
+++ b/indra/newview/llnotificationhandlerutil.cpp
@@ -27,13 +27,17 @@
#include "llviewerprecompiledheaders.h" // must be first include
-#include "llnotificationhandler.h"
+#include "llavatarnamecache.h"
+
+#include "llfloaterreg.h"
#include "llnotifications.h"
-#include "llimview.h"
+#include "llurlaction.h"
+
#include "llagent.h"
-#include "llfloaterreg.h"
-#include "llnearbychat.h"
#include "llimfloater.h"
+#include "llimview.h"
+#include "llnearbychat.h"
+#include "llnotificationhandler.h"
using namespace LLNotificationsUI;
@@ -275,7 +279,11 @@ void LLHandlerUtil::logToIM(const EInstantMessage& session_type,
{
from = SYSTEM_FROM;
}
- LLIMModel::instance().logToFile(session_name, from, from_id, message);
+
+ // Build a new format username or firstname_lastname for legacy names
+ // to use it for a history log filename.
+ std::string user_name = LLCacheName::buildUsername(session_name);
+ LLIMModel::instance().logToFile(user_name, from, from_id, message);
}
else
{
diff --git a/indra/newview/llnotificationmanager.h b/indra/newview/llnotificationmanager.h
index 72fa394621..16e82e4cce 100644
--- a/indra/newview/llnotificationmanager.h
+++ b/indra/newview/llnotificationmanager.h
@@ -69,7 +69,7 @@ public:
private:
//TODO (*)
std::map<std::string, boost::shared_ptr<LLEventHandler> > mNotifyHandlers;
- std::map<std::string, LLChatHandler*> mChatHandlers;
+ // cruft std::map<std::string, LLChatHandler*> mChatHandlers;
};
}
diff --git a/indra/newview/lloutfitslist.cpp b/indra/newview/lloutfitslist.cpp
index 6435126fc0..10887aa53a 100644
--- a/indra/newview/lloutfitslist.cpp
+++ b/indra/newview/lloutfitslist.cpp
@@ -364,8 +364,8 @@ LLOutfitsList::~LLOutfitsList()
if (gInventory.containsObserver(mCategoriesObserver))
{
gInventory.removeObserver(mCategoriesObserver);
- delete mCategoriesObserver;
}
+ delete mCategoriesObserver;
}
BOOL LLOutfitsList::postBuild()
diff --git a/indra/newview/llpanelappearancetab.cpp b/indra/newview/llpanelappearancetab.cpp
index 9910a3a2ac..8fa8867c69 100644
--- a/indra/newview/llpanelappearancetab.cpp
+++ b/indra/newview/llpanelappearancetab.cpp
@@ -31,6 +31,7 @@
#include "llinventoryfunctions.h"
#include "llinventorymodel.h"
+#include "llviewerinventory.h"
//virtual
bool LLPanelAppearanceTab::canTakeOffSelected()
diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp
index 07c7f35989..a4f6921f98 100644
--- a/indra/newview/llpanelface.cpp
+++ b/indra/newview/llpanelface.cpp
@@ -30,6 +30,7 @@
#include "llpanelface.h"
// library includes
+#include "llcalc.h"
#include "llerror.h"
#include "llfocusmgr.h"
#include "llrect.h"
@@ -926,6 +927,16 @@ void LLPanelFace::getState()
getChildView("button apply")->setEnabled(enabled);
}
}
+
+ // Set variable values for numeric expressions
+ LLCalc* calcp = LLCalc::getInstance();
+ calcp->setVar(LLCalc::TEX_U_SCALE, childGetValue("TexScaleU").asReal());
+ calcp->setVar(LLCalc::TEX_V_SCALE, childGetValue("TexScaleV").asReal());
+ calcp->setVar(LLCalc::TEX_U_OFFSET, childGetValue("TexOffsetU").asReal());
+ calcp->setVar(LLCalc::TEX_V_OFFSET, childGetValue("TexOffsetV").asReal());
+ calcp->setVar(LLCalc::TEX_ROTATION, childGetValue("TexRot").asReal());
+ calcp->setVar(LLCalc::TEX_TRANSPARENCY, childGetValue("ColorTrans").asReal());
+ calcp->setVar(LLCalc::TEX_GLOW, childGetValue("glow").asReal());
}
else
{
@@ -961,6 +972,16 @@ void LLPanelFace::getState()
//getChildView("has media")->setEnabled(FALSE);
//getChildView("media info set")->setEnabled(FALSE);
+
+ // Set variable values for numeric expressions
+ LLCalc* calcp = LLCalc::getInstance();
+ calcp->clearVar(LLCalc::TEX_U_SCALE);
+ calcp->clearVar(LLCalc::TEX_V_SCALE);
+ calcp->clearVar(LLCalc::TEX_U_OFFSET);
+ calcp->clearVar(LLCalc::TEX_V_OFFSET);
+ calcp->clearVar(LLCalc::TEX_ROTATION);
+ calcp->clearVar(LLCalc::TEX_TRANSPARENCY);
+ calcp->clearVar(LLCalc::TEX_GLOW);
}
}
diff --git a/indra/newview/llpanelimcontrolpanel.cpp b/indra/newview/llpanelimcontrolpanel.cpp
index 0cc5dcda82..e370f2f622 100644
--- a/indra/newview/llpanelimcontrolpanel.cpp
+++ b/indra/newview/llpanelimcontrolpanel.cpp
@@ -71,7 +71,7 @@ void LLPanelChatControlPanel::onChange(EStatusType status, const std::string &ch
void LLPanelChatControlPanel::onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state)
{
- updateButtons(new_state >= LLVoiceChannel::STATE_CALL_STARTED);
+ updateButtons(new_state);
}
void LLPanelChatControlPanel::updateCallButton()
@@ -96,11 +96,15 @@ void LLPanelChatControlPanel::updateCallButton()
getChildView("call_btn")->setEnabled(enable_connect);
}
-void LLPanelChatControlPanel::updateButtons(bool is_call_started)
+void LLPanelChatControlPanel::updateButtons(LLVoiceChannel::EState state)
{
+ bool is_call_started = state >= LLVoiceChannel::STATE_CALL_STARTED;
getChildView("end_call_btn_panel")->setVisible( is_call_started);
- getChildView("voice_ctrls_btn_panel")->setVisible( is_call_started);
+ getChildView("voice_ctrls_btn_panel")->setVisible( is_call_started && findChild<LLView>("voice_ctrls_btn_panel"));
getChildView("call_btn_panel")->setVisible( ! is_call_started);
+
+ getChildView("volume_ctrl_panel")->setVisible(state == LLVoiceChannel::STATE_CONNECTED);
+
updateCallButton();
}
@@ -135,7 +139,7 @@ void LLPanelChatControlPanel::setSessionId(const LLUUID& session_id)
mVoiceChannelStateChangeConnection = voice_channel->setStateChangedCallback(boost::bind(&LLPanelChatControlPanel::onVoiceChannelStateChanged, this, _1, _2));
//call (either p2p, group or ad-hoc) can be already in started state
- updateButtons(voice_channel->getState() >= LLVoiceChannel::STATE_CALL_STARTED);
+ updateButtons(voice_channel->getState());
}
}
@@ -156,6 +160,13 @@ BOOL LLPanelIMControlPanel::postBuild()
childSetAction("share_btn", boost::bind(&LLPanelIMControlPanel::onShareButtonClicked, this));
childSetAction("teleport_btn", boost::bind(&LLPanelIMControlPanel::onTeleportButtonClicked, this));
childSetAction("pay_btn", boost::bind(&LLPanelIMControlPanel::onPayButtonClicked, this));
+
+ childSetAction("mute_btn", boost::bind(&LLPanelIMControlPanel::onClickMuteVolume, this));
+ childSetAction("block_btn", boost::bind(&LLPanelIMControlPanel::onClickBlock, this));
+ childSetAction("unblock_btn", boost::bind(&LLPanelIMControlPanel::onClickUnblock, this));
+
+ getChild<LLUICtrl>("volume_slider")->setCommitCallback(boost::bind(&LLPanelIMControlPanel::onVolumeChange, this, _2));
+
getChildView("add_friend_btn")->setEnabled(!LLAvatarActions::isFriend(getChild<LLAvatarIconCtrl>("avatar_icon")->getAvatarId()));
setFocusReceivedCallback(boost::bind(&LLPanelIMControlPanel::onFocusReceived, this));
@@ -163,6 +174,79 @@ BOOL LLPanelIMControlPanel::postBuild()
return LLPanelChatControlPanel::postBuild();
}
+void LLPanelIMControlPanel::draw()
+{
+ bool is_muted = LLMuteList::getInstance()->isMuted(mAvatarID);
+
+ getChild<LLUICtrl>("block_btn_panel")->setVisible(!is_muted);
+ getChild<LLUICtrl>("unblock_btn_panel")->setVisible(is_muted);
+
+ if (getChildView("volume_ctrl_panel")->getVisible())
+ {
+
+ bool is_muted_voice = LLMuteList::getInstance()->isMuted(mAvatarID, LLMute::flagVoiceChat);
+
+ LLUICtrl* mute_btn = getChild<LLUICtrl>("mute_btn");
+ mute_btn->setValue( is_muted_voice );
+
+ LLUICtrl* volume_slider = getChild<LLUICtrl>("volume_slider");
+ volume_slider->setEnabled( !is_muted_voice );
+
+ F32 volume;
+
+ if (is_muted_voice)
+ {
+ // it's clearer to display their volume as zero
+ volume = 0.f;
+ }
+ else
+ {
+ // actual volume
+ volume = LLVoiceClient::getInstance()->getUserVolume(mAvatarID);
+ }
+ volume_slider->setValue( (F64)volume );
+ }
+
+ LLPanelChatControlPanel::draw();
+}
+
+void LLPanelIMControlPanel::onClickMuteVolume()
+{
+ // By convention, we only display and toggle voice mutes, not all mutes
+ LLMuteList* mute_list = LLMuteList::getInstance();
+ bool is_muted = mute_list->isMuted(mAvatarID, LLMute::flagVoiceChat);
+
+ LLMute mute(mAvatarID, getChild<LLTextBox>("avatar_name")->getText(), LLMute::AGENT);
+ if (!is_muted)
+ {
+ mute_list->add(mute, LLMute::flagVoiceChat);
+ }
+ else
+ {
+ mute_list->remove(mute, LLMute::flagVoiceChat);
+ }
+}
+
+void LLPanelIMControlPanel::onClickBlock()
+{
+ LLMute mute(mAvatarID, getChild<LLTextBox>("avatar_name")->getText(), LLMute::AGENT);
+
+ LLMuteList::getInstance()->add(mute);
+}
+
+void LLPanelIMControlPanel::onClickUnblock()
+{
+ LLMute mute(mAvatarID, getChild<LLTextBox>("avatar_name")->getText(), LLMute::AGENT);
+
+ LLMuteList::getInstance()->remove(mute);
+}
+
+void LLPanelIMControlPanel::onVolumeChange(const LLSD& data)
+{
+ F32 volume = (F32)data.asReal();
+ LLVoiceClient::getInstance()->setUserVolume(mAvatarID, volume);
+}
+
void LLPanelIMControlPanel::onTeleportButtonClicked()
{
LLAvatarActions::offerTeleport(mAvatarID);
@@ -262,6 +346,9 @@ void LLPanelIMControlPanel::onNameCache(const LLUUID& id, const std::string& ful
std::string avatar_name = full_name;
getChild<LLTextBox>("avatar_name")->setValue(avatar_name);
getChild<LLTextBox>("avatar_name")->setToolTip(avatar_name);
+
+ bool is_linden = LLStringUtil::endsWith(full_name, " Linden");
+ getChild<LLUICtrl>("mute_btn")->setEnabled( !is_linden);
}
}
diff --git a/indra/newview/llpanelimcontrolpanel.h b/indra/newview/llpanelimcontrolpanel.h
index 3bbe24ecb9..bba847b5d4 100644
--- a/indra/newview/llpanelimcontrolpanel.h
+++ b/indra/newview/llpanelimcontrolpanel.h
@@ -54,7 +54,7 @@ public:
virtual void onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state);
- void updateButtons(bool is_call_started);
+ void updateButtons(LLVoiceChannel::EState state);
// Enables/disables call button depending on voice availability
void updateCallButton();
@@ -94,6 +94,12 @@ private:
void onPayButtonClicked();
void onFocusReceived();
+ void onClickMuteVolume();
+ void onClickBlock();
+ void onClickUnblock();
+ /*virtual*/ void draw();
+ void onVolumeChange(const LLSD& data);
+
LLUUID mAvatarID;
};
diff --git a/indra/newview/llpanellandaudio.cpp b/indra/newview/llpanellandaudio.cpp
index f9730d9b71..e7bdc51b4a 100644
--- a/indra/newview/llpanellandaudio.cpp
+++ b/indra/newview/llpanellandaudio.cpp
@@ -91,6 +91,12 @@ BOOL LLPanelLandAudio::postBuild()
mMusicURLEdit = getChild<LLLineEditor>("music_url");
childSetCommitCallback("music_url", onCommitAny, this);
+ mCheckAVSoundAny = getChild<LLCheckBoxCtrl>("all av sound check");
+ childSetCommitCallback("all av sound check", onCommitAny, this);
+
+ mCheckAVSoundGroup = getChild<LLCheckBoxCtrl>("group av sound check");
+ childSetCommitCallback("group av sound check", onCommitAny, this);
+
return TRUE;
}
@@ -144,6 +150,13 @@ void LLPanelLandAudio::refresh()
mMusicURLEdit->setText(parcel->getMusicURL());
mMusicURLEdit->setEnabled( can_change_media );
+
+ BOOL can_change_av_sounds = LLViewerParcelMgr::isParcelModifiableByAgent(parcel, GP_LAND_OPTIONS) && parcel->getHaveNewParcelLimitData();
+ mCheckAVSoundAny->set(parcel->getAllowAnyAVSounds());
+ mCheckAVSoundAny->setEnabled(can_change_av_sounds);
+
+ mCheckAVSoundGroup->set(parcel->getAllowGroupAVSounds() || parcel->getAllowAnyAVSounds()); // On if "Everyone" is on
+ mCheckAVSoundGroup->setEnabled(can_change_av_sounds && !parcel->getAllowAnyAVSounds()); // Enabled if "Everyone" is off
}
}
// static
@@ -164,6 +177,13 @@ void LLPanelLandAudio::onCommitAny(LLUICtrl*, void *userdata)
BOOL voice_enabled = self->mCheckParcelEnableVoice->get();
BOOL voice_estate_chan = !self->mCheckParcelVoiceLocal->get();
+ BOOL any_av_sound = self->mCheckAVSoundAny->get();
+ BOOL group_av_sound = TRUE; // If set to "Everyone" then group is checked as well
+ if (!any_av_sound)
+ { // If "Everyone" is off, use the value from the checkbox
+ group_av_sound = self->mCheckAVSoundGroup->get();
+ }
+
// Remove leading/trailing whitespace (common when copying/pasting)
LLStringUtil::trim(music_url);
@@ -172,6 +192,8 @@ void LLPanelLandAudio::onCommitAny(LLUICtrl*, void *userdata)
parcel->setParcelFlag(PF_USE_ESTATE_VOICE_CHAN, voice_estate_chan);
parcel->setParcelFlag(PF_SOUND_LOCAL, sound_local);
parcel->setMusicURL(music_url);
+ parcel->setAllowAnyAVSounds(any_av_sound);
+ parcel->setAllowGroupAVSounds(group_av_sound);
// Send current parcel data upstream to server
LLViewerParcelMgr::getInstance()->sendParcelPropertiesUpdate( parcel );
diff --git a/indra/newview/llpanellandaudio.h b/indra/newview/llpanellandaudio.h
index 4b0953bdc1..32a45100f4 100644
--- a/indra/newview/llpanellandaudio.h
+++ b/indra/newview/llpanellandaudio.h
@@ -52,6 +52,8 @@ private:
LLCheckBoxCtrl* mCheckParcelVoiceLocal;
LLLineEditor* mMusicURLEdit;
LLCheckBoxCtrl* mMusicUrlCheck;
+ LLCheckBoxCtrl* mCheckAVSoundAny;
+ LLCheckBoxCtrl* mCheckAVSoundGroup;
LLSafeHandle<LLParcelSelection>& mParcel;
};
diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp
index 80f6862169..a9cc247d1b 100644
--- a/indra/newview/llpanellandmarks.cpp
+++ b/indra/newview/llpanellandmarks.cpp
@@ -46,6 +46,7 @@
#include "llfolderviewitem.h"
#include "llinventorymodelbackgroundfetch.h"
#include "llinventorypanel.h"
+#include "llinventoryfunctions.h"
#include "lllandmarkactions.h"
#include "llmenubutton.h"
#include "llplacesinventorybridge.h"
@@ -299,7 +300,7 @@ void LLLandmarksPanel::onTeleport()
}
LLFolderViewEventListener* listenerp = current_item->getListener();
- if (listenerp->getInventoryType() == LLInventoryType::IT_LANDMARK)
+ if (listenerp && listenerp->getInventoryType() == LLInventoryType::IT_LANDMARK)
{
listenerp->openItem();
}
@@ -529,7 +530,7 @@ void LLLandmarksPanel::setParcelID(const LLUUID& parcel_id)
// virtual
void LLLandmarksPanel::setErrorStatus(U32 status, const std::string& reason)
{
- llerrs<< "Can't handle remote parcel request."<< " Http Status: "<< status << ". Reason : "<< reason<<llendl;
+ llwarns << "Can't handle remote parcel request."<< " Http Status: "<< status << ". Reason : "<< reason<<llendl;
}
@@ -645,7 +646,7 @@ void LLLandmarksPanel::onAccordionExpandedCollapsed(const LLSD& param, LLPlacesI
// Start background fetch, mostly for My Inventory and Library
if (expanded)
{
- const LLUUID &cat_id = inventory_list->getStartFolderID();
+ const LLUUID &cat_id = inventory_list->getRootFolderID();
// Just because the category itself has been fetched, doesn't mean its child folders have.
/*
if (!gInventory.isCategoryComplete(cat_id))
@@ -1414,7 +1415,7 @@ static void filter_list(LLPlacesInventoryPanel* inventory_list, const std::strin
static bool category_has_descendents(LLPlacesInventoryPanel* inventory_list)
{
- LLViewerInventoryCategory* category = gInventory.getCategory(inventory_list->getStartFolderID());
+ LLViewerInventoryCategory* category = gInventory.getCategory(inventory_list->getRootFolderID());
if (category)
{
return category->getDescendentCount() > 0;
diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp
index d0810d0772..27f341b4f6 100644
--- a/indra/newview/llpanellogin.cpp
+++ b/indra/newview/llpanellogin.cpp
@@ -34,7 +34,6 @@
#include "llmd5.h"
#include "llsecondlifeurls.h"
#include "v4color.h"
-#include "llversionviewer.h"
#include "llappviewer.h"
#include "llbutton.h"
@@ -748,20 +747,12 @@ void LLPanelLogin::loadLoginPage()
LLVersionInfo::getShortVersion().c_str(),
LLVersionInfo::getBuild());
- char* curl_channel ;
+ char* curl_channel = curl_escape(LLVersionInfo::getChannel().c_str(), 0);
char* curl_version = curl_escape(version.c_str(), 0);
- if(strcmp(LLVersionInfo::getChannel().c_str(), LL_CHANNEL))
- {
- curl_channel = curl_escape(LLVersionInfo::getChannel().c_str(), 0);
- }
- else //if LL_CHANNEL, direct it to "Second Life Beta Viewer".
- {
- curl_channel = curl_escape("Second Life Beta Viewer", 0);
- }
oStr << "&channel=" << curl_channel;
oStr << "&version=" << curl_version;
-
+
curl_free(curl_channel);
curl_free(curl_version);
diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp
index bc4998dd0c..1920cc2940 100644
--- a/indra/newview/llpanelmaininventory.cpp
+++ b/indra/newview/llpanelmaininventory.cpp
@@ -1,6 +1,6 @@
/**
- * @file llsidepanelmaininventory.cpp
- * @brief Implementation of llsidepanelmaininventory.
+ * @file llpanelmaininventory.cpp
+ * @brief Implementation of llpanelmaininventory.
*
* $LicenseInfo:firstyear=2001&license=viewerlgpl$
* Second Life Viewer Source Code
@@ -95,8 +95,8 @@ private:
/// LLPanelMainInventory
///----------------------------------------------------------------------------
-LLPanelMainInventory::LLPanelMainInventory()
- : LLPanel(),
+LLPanelMainInventory::LLPanelMainInventory(const LLPanel::Params& p)
+ : LLPanel(p),
mActivePanel(NULL),
mSavedFolderState(NULL),
mFilterText(""),
@@ -193,6 +193,9 @@ BOOL LLPanelMainInventory::postBuild()
mMenuAdd->getChild<LLMenuItemGL>("Upload Animation")->setLabelArg("[COST]", upload_cost);
mMenuAdd->getChild<LLMenuItemGL>("Bulk Upload")->setLabelArg("[COST]", upload_cost);
+ // Trigger callback for focus received so we can deselect items in inbox/outbox
+ LLFocusableElement::setFocusReceivedCallback(boost::bind(&LLPanelMainInventory::onFocusReceived, this));
+
return TRUE;
}
@@ -572,6 +575,27 @@ void LLPanelMainInventory::updateItemcountText()
getChild<LLUICtrl>("ItemcountText")->setValue(text);
}
+void LLPanelMainInventory::onFocusReceived()
+{
+ LLSidepanelInventory * sidepanel_inventory = LLSideTray::getInstance()->getPanel<LLSidepanelInventory>("sidepanel_inventory");
+
+ LLInventoryPanel * inbox_panel = sidepanel_inventory->findChild<LLInventoryPanel>("inventory_inbox");
+
+ if (inbox_panel)
+ {
+ inbox_panel->clearSelection();
+ }
+
+ LLInventoryPanel * outbox_panel = sidepanel_inventory->findChild<LLInventoryPanel>("inventory_outbox");
+
+ if (outbox_panel)
+ {
+ outbox_panel->clearSelection();
+ }
+
+ sidepanel_inventory->updateVerbs();
+}
+
void LLPanelMainInventory::setFilterTextFromFilter()
{
mFilterText = mActivePanel->getFilter()->getFilterText();
diff --git a/indra/newview/llpanelmaininventory.h b/indra/newview/llpanelmaininventory.h
index 2b2ee1c0c9..899931aa89 100644
--- a/indra/newview/llpanelmaininventory.h
+++ b/indra/newview/llpanelmaininventory.h
@@ -57,7 +57,7 @@ class LLPanelMainInventory : public LLPanel, LLInventoryObserver
public:
friend class LLFloaterInventoryFinder;
- LLPanelMainInventory();
+ LLPanelMainInventory(const LLPanel::Params& p = getDefaultParams());
~LLPanelMainInventory();
BOOL postBuild();
@@ -114,6 +114,8 @@ protected:
bool isSaveTextureEnabled(const LLSD& userdata);
void updateItemcountText();
+ void onFocusReceived();
+
private:
LLFloaterInventoryFinder* getFinder();
diff --git a/indra/newview/llpanelmarketplaceinbox.cpp b/indra/newview/llpanelmarketplaceinbox.cpp
new file mode 100644
index 0000000000..af74f8f261
--- /dev/null
+++ b/indra/newview/llpanelmarketplaceinbox.cpp
@@ -0,0 +1,248 @@
+/**
+ * @file llpanelmarketplaceinbox.cpp
+ * @brief Panel for marketplace inbox
+ *
+* $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 "llpanelmarketplaceinbox.h"
+
+#include "llappviewer.h"
+#include "llbutton.h"
+#include "llinventorypanel.h"
+#include "llfolderview.h"
+#include "llsidepanelinventory.h"
+
+
+#define SUPPORTING_FRESH_ITEM_COUNT 0
+
+
+static LLRegisterPanelClassWrapper<LLPanelMarketplaceInbox> t_panel_marketplace_inbox("panel_marketplace_inbox");
+
+const LLPanelMarketplaceInbox::Params& LLPanelMarketplaceInbox::getDefaultParams()
+{
+ return LLUICtrlFactory::getDefaultParams<LLPanelMarketplaceInbox>();
+}
+
+// protected
+LLPanelMarketplaceInbox::LLPanelMarketplaceInbox(const Params& p)
+ : LLPanel(p)
+ , mInventoryPanel(NULL)
+{
+}
+
+LLPanelMarketplaceInbox::~LLPanelMarketplaceInbox()
+{
+}
+
+// virtual
+BOOL LLPanelMarketplaceInbox::postBuild()
+{
+ LLAppViewer::instance()->setOnLoginCompletedCallback(boost::bind(&LLPanelMarketplaceInbox::handleLoginComplete, this));
+
+ LLFocusableElement::setFocusReceivedCallback(boost::bind(&LLPanelMarketplaceInbox::onFocusReceived, this));
+
+ return TRUE;
+}
+
+void LLPanelMarketplaceInbox::onSelectionChange()
+{
+ LLSidepanelInventory* sidepanel_inventory = dynamic_cast<LLSidepanelInventory*>(LLSideTray::getInstance()->getPanel("sidepanel_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);
+}
+
+void LLPanelMarketplaceInbox::setupInventoryPanel()
+{
+ LLView * inbox_inventory_placeholder = getChild<LLView>("inbox_inventory_placeholder");
+ LLView * inbox_inventory_parent = inbox_inventory_placeholder->getParent();
+
+ mInventoryPanel =
+ LLUICtrlFactory::createFromFile<LLInventoryPanel>("panel_inbox_inventory.xml",
+ inbox_inventory_parent,
+ LLInventoryPanel::child_registry_t::instance());
+
+ // Reshape the inventory to the proper size
+ LLRect inventory_placeholder_rect = inbox_inventory_placeholder->getRect();
+ mInventoryPanel->setShape(inventory_placeholder_rect);
+
+ // Set the sort order newest to oldest, and a selection change callback
+ mInventoryPanel->setSortOrder(LLInventoryFilter::SO_DATE);
+ mInventoryPanel->setSelectCallback(boost::bind(&LLPanelMarketplaceInbox::onSelectionChange, this));
+
+ // Set up the note to display when the inbox is empty
+ mInventoryPanel->getFilter()->setEmptyLookupMessage("InventoryInboxNoItems");
+
+ // Hide the placeholder text
+ inbox_inventory_placeholder->setVisible(FALSE);
+}
+
+void LLPanelMarketplaceInbox::onFocusReceived()
+{
+ LLSidepanelInventory * sidepanel_inventory = LLSideTray::getInstance()->getPanel<LLSidepanelInventory>("sidepanel_inventory");
+
+ if (sidepanel_inventory)
+ {
+ LLInventoryPanel * inv_panel = sidepanel_inventory->getActivePanel();
+
+ if (inv_panel)
+ {
+ inv_panel->clearSelection();
+ }
+
+ LLInventoryPanel * outbox_panel = sidepanel_inventory->findChild<LLInventoryPanel>("inventory_outbox");
+
+ if (outbox_panel)
+ {
+ outbox_panel->clearSelection();
+ }
+
+ sidepanel_inventory->updateVerbs();
+ }
+}
+
+BOOL LLPanelMarketplaceInbox::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, EDragAndDropType cargo_type, void *cargo_data, EAcceptance *accept, std::string& tooltip_msg)
+{
+ *accept = ACCEPT_NO;
+ return TRUE;
+}
+
+U32 LLPanelMarketplaceInbox::getFreshItemCount() const
+{
+#if SUPPORTING_FRESH_ITEM_COUNT
+
+ //
+ // NOTE: When turning this on, be sure to test the no inbox/outbox case because this code probably
+ // will return "2" for the Inventory and LIBRARY top-levels when that happens.
+ //
+
+ U32 fresh_item_count = 0;
+
+ if (mInventoryPanel)
+ {
+ const LLFolderViewFolder * inbox_folder = mInventoryPanel->getRootFolder();
+
+ if (inbox_folder)
+ {
+ LLFolderViewFolder::folders_t::const_iterator folders_it = inbox_folder->getFoldersBegin();
+ LLFolderViewFolder::folders_t::const_iterator folders_end = inbox_folder->getFoldersEnd();
+
+ for (; folders_it != folders_end; ++folders_it)
+ {
+ const LLFolderViewFolder * folder = *folders_it;
+
+ // TODO: Replace this check with new "fresh" flag
+ if (folder->getCreationDate() > 1500)
+ {
+ fresh_item_count++;
+ }
+ }
+ }
+ }
+
+ return fresh_item_count;
+#else
+ return getTotalItemCount();
+#endif
+}
+
+U32 LLPanelMarketplaceInbox::getTotalItemCount() const
+{
+ U32 item_count = 0;
+
+ if (mInventoryPanel)
+ {
+ const LLFolderViewFolder * inbox_folder = mInventoryPanel->getRootFolder();
+
+ if (inbox_folder)
+ {
+ item_count += inbox_folder->getFoldersCount();
+ }
+ }
+
+ return item_count;
+}
+
+std::string LLPanelMarketplaceInbox::getBadgeString() const
+{
+ std::string item_count_str("");
+
+ // 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")))
+ {
+ U32 item_count = getFreshItemCount();
+
+ if (item_count)
+ {
+ item_count_str = llformat("%d", item_count);
+ }
+ }
+
+ return item_count_str;
+}
+
+void LLPanelMarketplaceInbox::draw()
+{
+ U32 item_count = getTotalItemCount();
+
+ LLView * fresh_new_count_view = getChildView("inbox_fresh_new_count");
+
+ if (item_count > 0)
+ {
+ std::string item_count_str = llformat("%d", item_count);
+
+ LLStringUtil::format_map_t args;
+ args["[NUM]"] = item_count_str;
+ getChild<LLButton>("inbox_btn")->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));
+
+ if (fresh_item_count > 0)
+ {
+ getChild<LLUICtrl>("inbox_fresh_new_count")->setTextArg("[NUM]", llformat("%d", fresh_item_count));
+ }
+#else
+ fresh_new_count_view->setVisible(FALSE);
+#endif
+ }
+ else
+ {
+ getChild<LLButton>("inbox_btn")->setLabel(getString("InboxLabelNoArg"));
+
+ fresh_new_count_view->setVisible(FALSE);
+ }
+
+ LLPanel::draw();
+}
diff --git a/indra/newview/llpanelmarketplaceinbox.h b/indra/newview/llpanelmarketplaceinbox.h
new file mode 100644
index 0000000000..4ecea29304
--- /dev/null
+++ b/indra/newview/llpanelmarketplaceinbox.h
@@ -0,0 +1,78 @@
+/**
+ * @file llpanelmarketplaceinbox.h
+ * @brief Panel for marketplace inbox
+ *
+* $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_LLPANELMARKETPLACEINBOX_H
+#define LL_LLPANELMARKETPLACEINBOX_H
+
+#include "llpanel.h"
+#include "llsidetray.h"
+
+class LLInventoryPanel;
+
+class LLPanelMarketplaceInbox : public LLPanel, public LLSideTrayTabBadgeDriver
+{
+public:
+
+ struct Params : public LLInitParam::Block<Params, LLPanel::Params>
+ {
+ Params() {}
+ };
+
+ LOG_CLASS(LLPanelMarketplaceInbox);
+
+ // RN: for some reason you can't just use LLUICtrlFactory::getDefaultParams as a default argument in VC8
+ static const LLPanelMarketplaceInbox::Params& getDefaultParams();
+
+ LLPanelMarketplaceInbox(const Params& p = getDefaultParams());
+ ~LLPanelMarketplaceInbox();
+
+ /*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 draw();
+
+ void setupInventoryPanel();
+
+ U32 getFreshItemCount() const;
+ U32 getTotalItemCount() const;
+
+ std::string getBadgeString() const;
+
+private:
+ void handleLoginComplete();
+
+ void onSelectionChange();
+
+ void onFocusReceived();
+
+private:
+ LLInventoryPanel* mInventoryPanel;
+};
+
+
+#endif //LL_LLPANELMARKETPLACEINBOX_H
+
diff --git a/indra/newview/llpanelmarketplaceinboxinventory.cpp b/indra/newview/llpanelmarketplaceinboxinventory.cpp
new file mode 100644
index 0000000000..b644f0e5cb
--- /dev/null
+++ b/indra/newview/llpanelmarketplaceinboxinventory.cpp
@@ -0,0 +1,167 @@
+/**
+ * @file llpanelmarketplaceinboxinventory.cpp
+ * @brief LLInboxInventoryPanel class definition
+ *
+ * $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 "llpanelmarketplaceinboxinventory.h"
+
+#include "llfolderview.h"
+#include "llfoldervieweventlistener.h"
+#include "llinventorybridge.h"
+#include "llinventoryfunctions.h"
+#include "llpanellandmarks.h"
+#include "llplacesinventorybridge.h"
+#include "llviewerfoldertype.h"
+
+
+//
+// statics
+//
+
+static LLDefaultChildRegistry::Register<LLInboxInventoryPanel> r1("inbox_inventory_panel");
+static LLDefaultChildRegistry::Register<LLInboxFolderViewFolder> r2("inbox_folder_view_folder");
+
+
+//
+// LLInboxInventoryPanel Implementation
+//
+
+LLInboxInventoryPanel::LLInboxInventoryPanel(const LLInboxInventoryPanel::Params& p)
+ : LLInventoryPanel(p)
+{
+}
+
+LLInboxInventoryPanel::~LLInboxInventoryPanel()
+{
+}
+
+// virtual
+void LLInboxInventoryPanel::buildFolderView(const LLInventoryPanel::Params& params)
+{
+ // Determine the root folder in case specified, and
+ // build the views starting with that folder.
+
+ LLUUID root_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_INBOX, false, false);
+
+ // leslie -- temporary HACK to work around sim not creating inbox and 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 inbox inventory panel start_folder: " << start_folder_name << llendl;
+ }
+ }
+ // leslie -- end temporary HACK
+
+ if (root_id == LLUUID::null)
+ {
+ llwarns << "Inbox inventory panel has no root folder!" << llendl;
+ root_id = LLUUID::generateNewID();
+ }
+
+ LLInvFVBridge* new_listener = mInvFVBridgeBuilder->createBridge(LLAssetType::AT_CATEGORY,
+ LLAssetType::AT_CATEGORY,
+ LLInventoryType::IT_CATEGORY,
+ this,
+ NULL,
+ root_id);
+
+ mFolderRoot = createFolderView(new_listener, params.use_label_suffix());
+}
+
+LLFolderViewFolder * LLInboxInventoryPanel::createFolderViewFolder(LLInvFVBridge * bridge)
+{
+ LLInboxFolderViewFolder::Params params;
+
+ params.name = bridge->getDisplayName();
+ params.icon = bridge->getIcon();
+ params.icon_open = bridge->getOpenIcon();
+
+ if (mShowItemLinkOverlays) // if false, then links show up just like normal items
+ {
+ params.icon_overlay = LLUI::getUIImage("Inv_Link");
+ }
+
+ params.root = mFolderRoot;
+ params.listener = bridge;
+ params.tool_tip = params.name;
+
+ return LLUICtrlFactory::create<LLInboxFolderViewFolder>(params);
+}
+
+
+//
+// LLInboxFolderViewFolder Implementation
+//
+
+LLInboxFolderViewFolder::LLInboxFolderViewFolder(const Params& p)
+ : LLFolderViewFolder(p)
+ , LLBadgeOwner(getHandle())
+ , mFresh(false)
+{
+ initBadgeParams(p.new_badge());
+}
+
+LLInboxFolderViewFolder::~LLInboxFolderViewFolder()
+{
+}
+
+// virtual
+void LLInboxFolderViewFolder::draw()
+{
+ if (!badgeHasParent())
+ {
+ addBadgeToParentPanel();
+ }
+
+ setBadgeVisibility(mFresh);
+
+ LLFolderViewFolder::draw();
+}
+
+
+// eof
diff --git a/indra/newview/llpanelmarketplaceinboxinventory.h b/indra/newview/llpanelmarketplaceinboxinventory.h
new file mode 100644
index 0000000000..8f198c41c1
--- /dev/null
+++ b/indra/newview/llpanelmarketplaceinboxinventory.h
@@ -0,0 +1,77 @@
+/**
+ * @file llpanelmarketplaceinboxinventory.h
+ * @brief LLInboxInventoryPanel class declaration
+ *
+ * $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_INBOXINVENTORYPANEL_H
+#define LL_INBOXINVENTORYPANEL_H
+
+
+#include "llbadgeowner.h"
+#include "llinventorypanel.h"
+#include "llfolderviewitem.h"
+
+class LLInboxInventoryPanel : public LLInventoryPanel
+{
+public:
+ struct Params : public LLInitParam::Block<Params, LLInventoryPanel::Params>
+ {
+ Params() {}
+ };
+
+ LLInboxInventoryPanel(const Params& p);
+ ~LLInboxInventoryPanel();
+
+ // virtual
+ void buildFolderView(const LLInventoryPanel::Params& params);
+
+ // virtual
+ class LLFolderViewFolder* createFolderViewFolder(LLInvFVBridge * bridge);
+};
+
+
+class LLInboxFolderViewFolder : public LLFolderViewFolder, public LLBadgeOwner
+{
+public:
+ struct Params : public LLInitParam::Block<Params, LLFolderViewFolder::Params>
+ {
+ Optional<LLBadge::Params> new_badge;
+
+ Params()
+ : new_badge("new_badge")
+ {
+ }
+ };
+
+ LLInboxFolderViewFolder(const Params& p);
+ ~LLInboxFolderViewFolder();
+
+ void draw();
+
+protected:
+ bool mFresh;
+};
+
+
+#endif //LL_INBOXINVENTORYPANEL_H
diff --git a/indra/newview/llpanelmarketplaceoutbox.cpp b/indra/newview/llpanelmarketplaceoutbox.cpp
new file mode 100644
index 0000000000..74d0de3b30
--- /dev/null
+++ b/indra/newview/llpanelmarketplaceoutbox.cpp
@@ -0,0 +1,209 @@
+/**
+ * @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 "llappviewer.h"
+#include "llbutton.h"
+#include "llcoros.h"
+#include "lleventcoro.h"
+#include "llinventorypanel.h"
+#include "llloadingindicator.h"
+#include "llpanelmarketplaceinbox.h"
+#include "llsidepanelinventory.h"
+#include "llsidetray.h"
+#include "lltimer.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");
+
+ if (sidepanel_inventory)
+ {
+ LLInventoryPanel * inv_panel = sidepanel_inventory->getActivePanel();
+
+ if (inv_panel)
+ {
+ inv_panel->clearSelection();
+ }
+
+ LLInventoryPanel * inbox_panel = sidepanel_inventory->findChild<LLInventoryPanel>("inventory_inbox");
+
+ if (inbox_panel)
+ {
+ inbox_panel->clearSelection();
+ }
+
+ sidepanel_inventory->updateVerbs();
+ }
+}
+
+void LLPanelMarketplaceOutbox::onSelectionChange()
+{
+ LLSidepanelInventory* sidepanel_inventory = dynamic_cast<LLSidepanelInventory*>(LLSideTray::getInstance()->getPanel("sidepanel_inventory"));
+
+ sidepanel_inventory->updateVerbs();
+}
+
+void LLPanelMarketplaceOutbox::setupInventoryPanel()
+{
+ LLView * outbox_inventory_placeholder = getChild<LLView>("outbox_inventory_placeholder");
+ LLView * outbox_inventory_parent = outbox_inventory_placeholder->getParent();
+
+ mInventoryPanel =
+ LLUICtrlFactory::createFromFile<LLInventoryPanel>("panel_outbox_inventory.xml",
+ outbox_inventory_parent,
+ LLInventoryPanel::child_registry_t::instance());
+
+ // 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, and a selection change callback
+ mInventoryPanel->setSortOrder(LLInventoryFilter::SO_DATE);
+ 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);
+}
+
+bool LLPanelMarketplaceOutbox::isOutboxEmpty() const
+{
+ // TODO: Check for contents of outbox
+
+ return false;
+}
+
+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();
+
+ gTimeDelayDebugFunc = "";
+}
+
+void LLPanelMarketplaceOutbox::onSyncButtonClicked()
+{
+ // TODO: Actually trigger sync to marketplace
+
+ mSyncInProgress = true;
+ updateSyncButtonStatus();
+
+ // Set a timer (for testing only)
+
+ gTimeDelayDebugFunc = LLCoros::instance().launch("LLPanelMarketplaceOutbox timeDelay", boost::bind(&timeDelay, _1, this));
+}
+
+void LLPanelMarketplaceOutbox::onSyncComplete()
+{
+ mSyncInProgress = false;
+
+ updateSyncButtonStatus();
+}
+
+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());
+ }
+}
diff --git a/indra/newview/llpanelmarketplaceoutbox.h b/indra/newview/llpanelmarketplaceoutbox.h
new file mode 100644
index 0000000000..1b502127ef
--- /dev/null
+++ b/indra/newview/llpanelmarketplaceoutbox.h
@@ -0,0 +1,82 @@
+/**
+ * @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>
+ {
+ 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();
+
+ void setupInventoryPanel();
+
+ bool isOutboxEmpty() const;
+ bool isSyncInProgress() const;
+
+ void onSyncComplete();
+
+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/llpanelobject.cpp b/indra/newview/llpanelobject.cpp
index 64af6c2157..c222bbb191 100644
--- a/indra/newview/llpanelobject.cpp
+++ b/indra/newview/llpanelobject.cpp
@@ -33,16 +33,15 @@
#include "lleconomy.h"
#include "llerror.h"
#include "llfontgl.h"
-#include "llmaterialtable.h"
#include "llpermissionsflags.h"
#include "llstring.h"
#include "llvolume.h"
-#include "material_codes.h"
#include "m3math.h"
// project includes
#include "llagent.h"
#include "llbutton.h"
+#include "llcalc.h"
#include "llcheckboxctrl.h"
#include "llcolorswatch.h"
#include "llcombobox.h"
@@ -57,7 +56,6 @@
#include "lltool.h"
#include "lltoolcomp.h"
#include "lltoolmgr.h"
-#include "lltrans.h"
#include "llui.h"
#include "llviewerobject.h"
#include "llviewerregion.h"
@@ -101,17 +99,6 @@ BOOL LLPanelObject::postBuild()
{
setMouseOpaque(FALSE);
- std::map<std::string, std::string> material_name_map;
- material_name_map["Stone"]= LLTrans::getString("Stone");
- material_name_map["Metal"]= LLTrans::getString("Metal");
- material_name_map["Glass"]= LLTrans::getString("Glass");
- material_name_map["Wood"]= LLTrans::getString("Wood");
- material_name_map["Flesh"]= LLTrans::getString("Flesh");
- material_name_map["Plastic"]= LLTrans::getString("Plastic");
- material_name_map["Rubber"]= LLTrans::getString("Rubber");
- material_name_map["Light"]= LLTrans::getString("Light");
-
- LLMaterialTable::basic.initTableTransNames(material_name_map);
//--------------------------------------------------------
// Top
//--------------------------------------------------------
@@ -166,22 +153,6 @@ BOOL LLPanelObject::postBuild()
//--------------------------------------------------------
- // material type popup
- mComboMaterial = getChild<LLComboBox>("material");
- childSetCommitCallback("material",onCommitMaterial,this);
- mComboMaterial->removeall();
-
- for (LLMaterialTable::info_list_t::iterator iter = LLMaterialTable::basic.mMaterialInfoList.begin();
- iter != LLMaterialTable::basic.mMaterialInfoList.end(); ++iter)
- {
- LLMaterialInfo* minfop = *iter;
- if (minfop->mMCode != LL_MCODE_LIGHT)
- {
- mComboMaterial->add(minfop->mName);
- }
- }
- mComboMaterialItemCount = mComboMaterial->getItemCount();
-
// Base Type
mComboBaseType = getChild<LLComboBox>("comboBaseType");
childSetCommitCallback("comboBaseType",onCommitParametric,this);
@@ -309,7 +280,6 @@ BOOL LLPanelObject::postBuild()
LLPanelObject::LLPanelObject()
: LLPanel(),
- mComboMaterialItemCount(0),
mIsPhysical(FALSE),
mIsTemporary(FALSE),
mIsPhantom(FALSE),
@@ -349,6 +319,8 @@ void LLPanelObject::getState( )
}
}
+ LLCalc* calcp = LLCalc::getInstance();
+
LLVOVolume *volobjp = NULL;
if ( objectp && (objectp->getPCode() == LL_PCODE_VOLUME))
{
@@ -365,6 +337,7 @@ void LLPanelObject::getState( )
// Disable all text input fields
clearCtrls();
+ calcp->clearAllVariables();
return;
}
@@ -391,12 +364,18 @@ void LLPanelObject::getState( )
mCtrlPosX->set( vec.mV[VX] );
mCtrlPosY->set( vec.mV[VY] );
mCtrlPosZ->set( vec.mV[VZ] );
+ calcp->setVar(LLCalc::X_POS, vec.mV[VX]);
+ calcp->setVar(LLCalc::Y_POS, vec.mV[VY]);
+ calcp->setVar(LLCalc::Z_POS, vec.mV[VZ]);
}
else
{
mCtrlPosX->clear();
mCtrlPosY->clear();
mCtrlPosZ->clear();
+ calcp->clearVar(LLCalc::X_POS);
+ calcp->clearVar(LLCalc::Y_POS);
+ calcp->clearVar(LLCalc::Z_POS);
}
@@ -411,12 +390,18 @@ void LLPanelObject::getState( )
mCtrlScaleX->set( vec.mV[VX] );
mCtrlScaleY->set( vec.mV[VY] );
mCtrlScaleZ->set( vec.mV[VZ] );
+ calcp->setVar(LLCalc::X_SCALE, vec.mV[VX]);
+ calcp->setVar(LLCalc::Y_SCALE, vec.mV[VY]);
+ calcp->setVar(LLCalc::Z_SCALE, vec.mV[VZ]);
}
else
{
mCtrlScaleX->clear();
mCtrlScaleY->clear();
mCtrlScaleZ->clear();
+ calcp->setVar(LLCalc::X_SCALE, 0.f);
+ calcp->setVar(LLCalc::Y_SCALE, 0.f);
+ calcp->setVar(LLCalc::Z_SCALE, 0.f);
}
mLabelSize->setEnabled( enable_scale );
@@ -436,12 +421,18 @@ void LLPanelObject::getState( )
mCtrlRotX->set( mCurEulerDegrees.mV[VX] );
mCtrlRotY->set( mCurEulerDegrees.mV[VY] );
mCtrlRotZ->set( mCurEulerDegrees.mV[VZ] );
+ calcp->setVar(LLCalc::X_ROT, mCurEulerDegrees.mV[VX]);
+ calcp->setVar(LLCalc::Y_ROT, mCurEulerDegrees.mV[VY]);
+ calcp->setVar(LLCalc::Z_ROT, mCurEulerDegrees.mV[VZ]);
}
else
{
mCtrlRotX->clear();
mCtrlRotY->clear();
mCtrlRotZ->clear();
+ calcp->clearVar(LLCalc::X_ROT);
+ calcp->clearVar(LLCalc::Y_ROT);
+ calcp->clearVar(LLCalc::Z_ROT);
}
mLabelRotation->setEnabled( enable_rotate );
@@ -527,43 +518,6 @@ void LLPanelObject::getState( )
mCheckCastShadows->setEnabled( roots_selected==1 && editable );
#endif
- // Update material part
- // slightly inefficient - materials are unique per object, not per TE
- U8 material_code = 0;
- struct f : public LLSelectedTEGetFunctor<U8>
- {
- U8 get(LLViewerObject* object, S32 te)
- {
- return object->getMaterial();
- }
- } func;
- bool material_same = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &func, material_code );
- std::string LEGACY_FULLBRIGHT_DESC = LLTrans::getString("Fullbright");
- if (editable && single_volume && material_same)
- {
- mComboMaterial->setEnabled( TRUE );
- if (material_code == LL_MCODE_LIGHT)
- {
- if (mComboMaterial->getItemCount() == mComboMaterialItemCount)
- {
- mComboMaterial->add(LEGACY_FULLBRIGHT_DESC);
- }
- mComboMaterial->setSimple(LEGACY_FULLBRIGHT_DESC);
- }
- else
- {
- if (mComboMaterial->getItemCount() != mComboMaterialItemCount)
- {
- mComboMaterial->remove(LEGACY_FULLBRIGHT_DESC);
- }
-
- mComboMaterial->setSimple(std::string(LLMaterialTable::basic.getName(material_code)));
- }
- }
- else
- {
- mComboMaterial->setEnabled( FALSE );
- }
//----------------------------------------------------------------------------
S32 selected_item = MI_BOX;
@@ -693,9 +647,9 @@ void LLPanelObject::getState( )
F32 end_t = volume_params.getEndT();
// Hollowness
- F32 hollow = volume_params.getHollow();
- mSpinHollow->set( 100.f * hollow );
-
+ F32 hollow = 100.f * volume_params.getHollow();
+ mSpinHollow->set( hollow );
+ calcp->setVar(LLCalc::HOLLOW, hollow);
// All hollow objects allow a shape to be selected.
if (hollow > 0.f)
{
@@ -747,6 +701,10 @@ void LLPanelObject::getState( )
mSpinCutEnd ->set( cut_end );
mCtrlPathBegin ->set( adv_cut_begin );
mCtrlPathEnd ->set( adv_cut_end );
+ calcp->setVar(LLCalc::CUT_BEGIN, cut_begin);
+ calcp->setVar(LLCalc::CUT_END, cut_end);
+ calcp->setVar(LLCalc::PATH_BEGIN, adv_cut_begin);
+ calcp->setVar(LLCalc::PATH_END, adv_cut_end);
// Twist
F32 twist = volume_params.getTwist();
@@ -765,18 +723,24 @@ void LLPanelObject::getState( )
mSpinTwist ->set( twist );
mSpinTwistBegin ->set( twist_begin );
+ calcp->setVar(LLCalc::TWIST_END, twist);
+ calcp->setVar(LLCalc::TWIST_BEGIN, twist_begin);
// Shear
F32 shear_x = volume_params.getShearX();
F32 shear_y = volume_params.getShearY();
mSpinShearX->set( shear_x );
mSpinShearY->set( shear_y );
+ calcp->setVar(LLCalc::X_SHEAR, shear_x);
+ calcp->setVar(LLCalc::Y_SHEAR, shear_y);
// Taper
F32 taper_x = volume_params.getTaperX();
F32 taper_y = volume_params.getTaperY();
mSpinTaperX->set( taper_x );
mSpinTaperY->set( taper_y );
+ calcp->setVar(LLCalc::X_TAPER, taper_x);
+ calcp->setVar(LLCalc::Y_TAPER, taper_y);
// Radius offset.
F32 radius_offset = volume_params.getRadiusOffset();
@@ -806,10 +770,12 @@ void LLPanelObject::getState( )
}
}
mSpinRadiusOffset->set( radius_offset);
+ calcp->setVar(LLCalc::RADIUS_OFFSET, radius_offset);
// Revolutions
F32 revolutions = volume_params.getRevolutions();
mSpinRevolutions->set( revolutions );
+ calcp->setVar(LLCalc::REVOLUTIONS, revolutions);
// Skew
F32 skew = volume_params.getSkew();
@@ -834,6 +800,7 @@ void LLPanelObject::getState( )
}
}
mSpinSkew->set( skew );
+ calcp->setVar(LLCalc::SKEW, skew);
}
// Compute control visibility, label names, and twist range.
@@ -937,6 +904,8 @@ void LLPanelObject::getState( )
case MI_RING:
mSpinScaleX->set( scale_x );
mSpinScaleY->set( scale_y );
+ calcp->setVar(LLCalc::X_HOLE, scale_x);
+ calcp->setVar(LLCalc::Y_HOLE, scale_y);
mSpinScaleX->setMinValue(OBJECT_MIN_HOLE_SIZE);
mSpinScaleX->setMaxValue(OBJECT_MAX_HOLE_SIZE_X);
mSpinScaleY->setMinValue(OBJECT_MIN_HOLE_SIZE);
@@ -951,6 +920,14 @@ void LLPanelObject::getState( )
mSpinScaleX->setMaxValue(1.f);
mSpinScaleY->setMinValue(-1.f);
mSpinScaleY->setMaxValue(1.f);
+
+ // Torus' Hole Size is Box/Cyl/Prism's Taper
+ calcp->setVar(LLCalc::X_TAPER, 1.f - scale_x);
+ calcp->setVar(LLCalc::Y_TAPER, 1.f - scale_y);
+
+ // Box/Cyl/Prism have no hole size
+ calcp->setVar(LLCalc::X_HOLE, 0.f);
+ calcp->setVar(LLCalc::Y_HOLE, 0.f);
}
break;
}
@@ -1095,12 +1072,9 @@ void LLPanelObject::getState( )
mCtrlSculptTexture->setVisible(sculpt_texture_visible);
mLabelSculptType->setVisible(sculpt_texture_visible);
mCtrlSculptType->setVisible(sculpt_texture_visible);
- mCtrlSculptMirror->setVisible(sculpt_texture_visible);
- mCtrlSculptInvert->setVisible(sculpt_texture_visible);
// sculpt texture
-
if (selected_item == MI_SCULPT)
{
@@ -1145,7 +1119,7 @@ void LLPanelObject::getState( )
if (mCtrlSculptMirror)
{
mCtrlSculptMirror->set(sculpt_mirror);
- mCtrlSculptMirror->setEnabled(editable);
+ mCtrlSculptMirror->setEnabled(editable && !isMesh);
}
if (mCtrlSculptInvert)
@@ -1166,6 +1140,9 @@ void LLPanelObject::getState( )
mSculptTextureRevert = LLUUID::null;
}
+ mCtrlSculptMirror->setVisible(sculpt_texture_visible && !isMesh);
+ mCtrlSculptInvert->setVisible(sculpt_texture_visible && !isMesh);
+
//----------------------------------------------------------------------------
mObject = objectp;
@@ -1245,25 +1222,6 @@ void LLPanelObject::sendCastShadows()
}
// static
-void LLPanelObject::onCommitMaterial( LLUICtrl* ctrl, void* userdata )
-{
- //LLPanelObject* self = (LLPanelObject*) userdata;
- LLComboBox* box = (LLComboBox*) ctrl;
-
- if (box)
- {
- // apply the currently selected material to the object
- const std::string& material_name = box->getSimple();
- std::string LEGACY_FULLBRIGHT_DESC = LLTrans::getString("Fullbright");
- if (material_name != LEGACY_FULLBRIGHT_DESC)
- {
- U8 material_code = LLMaterialTable::basic.getMCode(material_name);
- LLSelectMgr::getInstance()->selectionSetMaterial(material_code);
- }
- }
-}
-
-// static
void LLPanelObject::onCommitParametric( LLUICtrl* ctrl, void* userdata )
{
LLPanelObject* self = (LLPanelObject*) userdata;
@@ -1827,25 +1785,11 @@ void LLPanelObject::refresh()
mRootObject = NULL;
}
- bool enable_mesh = gSavedSettings.getBOOL("MeshEnabled") &&
- gAgent.getRegion() &&
- !gAgent.getRegion()->getCapability("GetMesh").empty();
-
F32 max_scale = get_default_max_prim_scale(LLPickInfo::isFlora(mObject));
getChild<LLSpinCtrl>("Scale X")->setMaxValue(max_scale);
getChild<LLSpinCtrl>("Scale Y")->setMaxValue(max_scale);
getChild<LLSpinCtrl>("Scale Z")->setMaxValue(max_scale);
-
- BOOL found = mCtrlSculptType->itemExists("Mesh");
- if (enable_mesh && !found)
- {
- mCtrlSculptType->add("Mesh");
- }
- else if (!enable_mesh && found)
- {
- mCtrlSculptType->remove("Mesh");
- }
}
@@ -1937,7 +1881,6 @@ void LLPanelObject::clearCtrls()
mCheckCastShadows->set(FALSE);
mCheckCastShadows->setEnabled( FALSE );
#endif
- mComboMaterial ->setEnabled( FALSE );
// Disable text labels
mLabelPosition ->setEnabled( FALSE );
mLabelSize ->setEnabled( FALSE );
diff --git a/indra/newview/llpanelobject.h b/indra/newview/llpanelobject.h
index e2f2a4400d..475dfdaedb 100644
--- a/indra/newview/llpanelobject.h
+++ b/indra/newview/llpanelobject.h
@@ -66,7 +66,6 @@ public:
static void onCommitPhantom( LLUICtrl* ctrl, void* userdata);
static void onCommitCastShadows( LLUICtrl* ctrl, void* userdata);
static void onCommitPhysics( LLUICtrl* ctrl, void* userdata);
- static void onCommitMaterial( LLUICtrl* ctrl, void* userdata);
static void onCommitParametric(LLUICtrl* ctrl, void* userdata);
@@ -94,10 +93,6 @@ protected:
void getVolumeParams(LLVolumeParams& volume_params);
protected:
- S32 mComboMaterialItemCount;
-
- LLComboBox* mComboMaterial;
-
// Per-object options
LLComboBox* mComboBaseType;
diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp
index bfe6cab52f..e3b61f695a 100644
--- a/indra/newview/llpanelobjectinventory.cpp
+++ b/indra/newview/llpanelobjectinventory.cpp
@@ -44,6 +44,7 @@
#include "llcallbacklist.h"
#include "llbuycurrencyhtml.h"
#include "llfloaterreg.h"
+#include "llfolderview.h"
#include "llinventorybridge.h"
#include "llinventorydefines.h"
#include "llinventoryfilter.h"
@@ -58,8 +59,10 @@
#include "llselectmgr.h"
#include "llsidetray.h"
#include "llstatusbar.h"
+#include "lltooldraganddrop.h"
#include "lltrans.h"
#include "llviewerassettype.h"
+#include "llviewerinventory.h"
#include "llviewerregion.h"
#include "llviewerobjectlist.h"
#include "llviewermessage.h"
@@ -761,7 +764,7 @@ void LLTaskCategoryBridge::openItem()
BOOL LLTaskCategoryBridge::startDrag(EDragAndDropType* type, LLUUID* id) const
{
//llinfos << "LLTaskInvFVBridge::startDrag()" << llendl;
- if(mPanel)
+ if(mPanel && mUUID.notNull())
{
LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID());
if(object)
@@ -1349,79 +1352,81 @@ LLTaskInvFVBridge* LLTaskInvFVBridge::createObjectBridge(LLPanelObjectInventory*
LLTaskInvFVBridge* new_bridge = NULL;
const LLInventoryItem* item = dynamic_cast<LLInventoryItem*>(object);
const U32 itemflags = ( NULL == item ? 0 : item->getFlags() );
- LLAssetType::EType type = object->getType();
+ LLAssetType::EType type = object ? object->getType() : LLAssetType::AT_CATEGORY;
+ LLUUID object_id = object ? object->getUUID() : LLUUID::null;
+ std::string object_name = object ? object->getName() : std::string();
switch(type)
{
case LLAssetType::AT_TEXTURE:
new_bridge = new LLTaskTextureBridge(panel,
- object->getUUID(),
- object->getName());
+ object_id,
+ object_name);
break;
case LLAssetType::AT_SOUND:
new_bridge = new LLTaskSoundBridge(panel,
- object->getUUID(),
- object->getName());
+ object_id,
+ object_name);
break;
case LLAssetType::AT_LANDMARK:
new_bridge = new LLTaskLandmarkBridge(panel,
- object->getUUID(),
- object->getName());
+ object_id,
+ object_name);
break;
case LLAssetType::AT_CALLINGCARD:
new_bridge = new LLTaskCallingCardBridge(panel,
- object->getUUID(),
- object->getName());
+ object_id,
+ object_name);
break;
case LLAssetType::AT_SCRIPT:
// OLD SCRIPTS DEPRECATED - JC
llwarns << "Old script" << llendl;
//new_bridge = new LLTaskOldScriptBridge(panel,
- // object->getUUID(),
- // object->getName());
+ // object_id,
+ // object_name);
break;
case LLAssetType::AT_OBJECT:
new_bridge = new LLTaskObjectBridge(panel,
- object->getUUID(),
- object->getName(),
+ object_id,
+ object_name,
itemflags);
break;
case LLAssetType::AT_NOTECARD:
new_bridge = new LLTaskNotecardBridge(panel,
- object->getUUID(),
- object->getName());
+ object_id,
+ object_name);
break;
case LLAssetType::AT_ANIMATION:
new_bridge = new LLTaskAnimationBridge(panel,
- object->getUUID(),
- object->getName());
+ object_id,
+ object_name);
break;
case LLAssetType::AT_GESTURE:
new_bridge = new LLTaskGestureBridge(panel,
- object->getUUID(),
- object->getName());
+ object_id,
+ object_name);
break;
case LLAssetType::AT_CLOTHING:
case LLAssetType::AT_BODYPART:
new_bridge = new LLTaskWearableBridge(panel,
- object->getUUID(),
- object->getName(),
+ object_id,
+ object_name,
itemflags);
break;
case LLAssetType::AT_CATEGORY:
new_bridge = new LLTaskCategoryBridge(panel,
- object->getUUID(),
- object->getName());
+ object_id,
+ object_name);
break;
case LLAssetType::AT_LSL_TEXT:
new_bridge = new LLTaskLSLBridge(panel,
- object->getUUID(),
- object->getName());
+ object_id,
+ object_name);
break;
case LLAssetType::AT_MESH:
new_bridge = new LLTaskMeshBridge(panel,
- object->getUUID(),
- object->getName());
+ object_id,
+ object_name);
break;
default:
llinfos << "Unhandled inventory type (llassetstorage.h): "
@@ -1521,6 +1526,7 @@ void LLPanelObjectInventory::reset()
p.task_id = getTaskUUID();
p.parent_panel = this;
p.tool_tip= LLTrans::getString("PanelContentsTooltip");
+ p.listener = LLTaskInvFVBridge::createObjectBridge(this, NULL);
mFolders = LLUICtrlFactory::create<LLFolderView>(p);
// this ensures that we never say "searching..." or "no items found"
mFolders->getFilter()->setShowFolderState(LLInventoryFilter::SHOW_ALL_FOLDERS);
diff --git a/indra/newview/llpaneloutfitedit.cpp b/indra/newview/llpaneloutfitedit.cpp
index 62f582c343..35e2e96bab 100644
--- a/indra/newview/llpaneloutfitedit.cpp
+++ b/indra/newview/llpaneloutfitedit.cpp
@@ -36,7 +36,7 @@
#include "lloutfitobserver.h"
#include "llcofwearables.h"
#include "llfilteredwearablelist.h"
-#include "llfolderviewitem.h"
+#include "llfolderview.h"
#include "llinventory.h"
#include "llinventoryitemslist.h"
#include "llviewercontrol.h"
diff --git a/indra/newview/llpanelpicks.cpp b/indra/newview/llpanelpicks.cpp
index ddce83c616..ddce83c616 100644..100755
--- a/indra/newview/llpanelpicks.cpp
+++ b/indra/newview/llpanelpicks.cpp
diff --git a/indra/newview/llpanelpicks.h b/indra/newview/llpanelpicks.h
index 29db110523..29db110523 100644..100755
--- a/indra/newview/llpanelpicks.h
+++ b/indra/newview/llpanelpicks.h
diff --git a/indra/newview/llpanelplaceprofile.cpp b/indra/newview/llpanelplaceprofile.cpp
index 68ecb0165c..1e9ce58237 100644
--- a/indra/newview/llpanelplaceprofile.cpp
+++ b/indra/newview/llpanelplaceprofile.cpp
@@ -70,6 +70,8 @@ static std::string icon_scripts;
static std::string icon_scripts_no;
static std::string icon_damage;
static std::string icon_damage_no;
+static std::string icon_see_avs_on;
+static std::string icon_see_avs_off;
LLPanelPlaceProfile::LLPanelPlaceProfile()
: LLPanelPlaceInfo(),
@@ -114,6 +116,8 @@ BOOL LLPanelPlaceProfile::postBuild()
mScriptsText = getChild<LLTextBox>("scripts_value");
mDamageIcon = getChild<LLIconCtrl>("damage_icon");
mDamageText = getChild<LLTextBox>("damage_value");
+ mSeeAVsIcon = getChild<LLIconCtrl>("see_avatars_icon");
+ mSeeAVsText = getChild<LLTextBox>("see_avatars_value");
mRegionNameText = getChild<LLTextBox>("region_name");
mRegionTypeText = getChild<LLTextBox>("region_type");
@@ -153,6 +157,8 @@ BOOL LLPanelPlaceProfile::postBuild()
icon_scripts_no = getString("icon_ScriptsNo");
icon_damage = getString("icon_Damage");
icon_damage_no = getString("icon_DamageNo");
+ icon_see_avs_on = getString("icon_SeeAVs_On");
+ icon_see_avs_off = getString("icon_SeeAVs_Off");
return TRUE;
}
@@ -182,6 +188,8 @@ void LLPanelPlaceProfile::resetLocation()
mScriptsText->setText(loading);
mDamageIcon->setValue(loading);
mDamageText->setText(loading);
+ mSeeAVsIcon->setValue(loading);
+ mSeeAVsText->setText(loading);
mRegionNameText->setValue(loading);
mRegionTypeText->setValue(loading);
@@ -414,6 +422,17 @@ void LLPanelPlaceProfile::displaySelectedParcelInfo(LLParcel* parcel,
mDamageText->setText(off);
}
+ if (parcel->getSeeAVs())
+ {
+ mSeeAVsIcon->setValue(icon_see_avs_on);
+ mSeeAVsText->setText(on);
+ }
+ else
+ {
+ mSeeAVsIcon->setValue(icon_see_avs_off);
+ mSeeAVsText->setText(off);
+ }
+
mRegionNameText->setText(region->getName());
mRegionTypeText->setText(region->getSimProductName());
diff --git a/indra/newview/llpanelplaceprofile.h b/indra/newview/llpanelplaceprofile.h
index f28b3b3832..a33fc12ce4 100644
--- a/indra/newview/llpanelplaceprofile.h
+++ b/indra/newview/llpanelplaceprofile.h
@@ -91,6 +91,8 @@ private:
LLTextBox* mScriptsText;
LLIconCtrl* mDamageIcon;
LLTextBox* mDamageText;
+ LLIconCtrl* mSeeAVsIcon;
+ LLTextBox* mSeeAVsText;
LLTextBox* mRegionNameText;
LLTextBox* mRegionTypeText;
diff --git a/indra/newview/llpanelplaces.cpp b/indra/newview/llpanelplaces.cpp
index 46262832dc..1e510a2d7b 100644
--- a/indra/newview/llpanelplaces.cpp
+++ b/indra/newview/llpanelplaces.cpp
@@ -584,6 +584,13 @@ void LLPanelPlaces::onTeleportButtonClicked()
{
if (mPlaceInfoType == LANDMARK_INFO_TYPE)
{
+ if (mItem.isNull())
+ {
+ llwarns << "NULL landmark item" << llendl;
+ llassert(mItem.notNull());
+ return;
+ }
+
LLSD payload;
payload["asset_id"] = mItem->getAssetUUID();
LLSD args;
diff --git a/indra/newview/llpanelprofile.cpp b/indra/newview/llpanelprofile.cpp
index fd5c3362bb..fd5c3362bb 100644..100755
--- a/indra/newview/llpanelprofile.cpp
+++ b/indra/newview/llpanelprofile.cpp
diff --git a/indra/newview/llpanelprofile.h b/indra/newview/llpanelprofile.h
index fca359f51e..fca359f51e 100644..100755
--- a/indra/newview/llpanelprofile.h
+++ b/indra/newview/llpanelprofile.h
diff --git a/indra/newview/llpaneltopinfobar.cpp b/indra/newview/llpaneltopinfobar.cpp
index 30949f8f02..7087541fc8 100644
--- a/indra/newview/llpaneltopinfobar.cpp
+++ b/indra/newview/llpaneltopinfobar.cpp
@@ -102,6 +102,7 @@ void LLPanelTopInfoBar::initParcelIcons()
mParcelIcon[BUILD_ICON] = getChild<LLIconCtrl>("build_icon");
mParcelIcon[SCRIPTS_ICON] = getChild<LLIconCtrl>("scripts_icon");
mParcelIcon[DAMAGE_ICON] = getChild<LLIconCtrl>("damage_icon");
+ mParcelIcon[SEE_AVATARS_ICON] = getChild<LLIconCtrl>("see_avatars_icon");
mParcelIcon[VOICE_ICON]->setToolTip(LLTrans::getString("LocationCtrlVoiceTooltip"));
mParcelIcon[FLY_ICON]->setToolTip(LLTrans::getString("LocationCtrlFlyTooltip"));
@@ -109,6 +110,7 @@ void LLPanelTopInfoBar::initParcelIcons()
mParcelIcon[BUILD_ICON]->setToolTip(LLTrans::getString("LocationCtrlBuildTooltip"));
mParcelIcon[SCRIPTS_ICON]->setToolTip(LLTrans::getString("LocationCtrlScriptsTooltip"));
mParcelIcon[DAMAGE_ICON]->setToolTip(LLTrans::getString("LocationCtrlDamageTooltip"));
+ mParcelIcon[SEE_AVATARS_ICON]->setToolTip(LLTrans::getString("LocationCtrlSeeAVsTooltip"));
mParcelIcon[VOICE_ICON]->setMouseDownCallback(boost::bind(&LLPanelTopInfoBar::onParcelIconClick, this, VOICE_ICON));
mParcelIcon[FLY_ICON]->setMouseDownCallback(boost::bind(&LLPanelTopInfoBar::onParcelIconClick, this, FLY_ICON));
@@ -116,6 +118,7 @@ void LLPanelTopInfoBar::initParcelIcons()
mParcelIcon[BUILD_ICON]->setMouseDownCallback(boost::bind(&LLPanelTopInfoBar::onParcelIconClick, this, BUILD_ICON));
mParcelIcon[SCRIPTS_ICON]->setMouseDownCallback(boost::bind(&LLPanelTopInfoBar::onParcelIconClick, this, SCRIPTS_ICON));
mParcelIcon[DAMAGE_ICON]->setMouseDownCallback(boost::bind(&LLPanelTopInfoBar::onParcelIconClick, this, DAMAGE_ICON));
+ mParcelIcon[SEE_AVATARS_ICON]->setMouseDownCallback(boost::bind(&LLPanelTopInfoBar::onParcelIconClick, this, SEE_AVATARS_ICON));
mDamageText->setText(LLStringExplicit("100%"));
}
@@ -295,6 +298,7 @@ void LLPanelTopInfoBar::updateParcelIcons()
bool allow_build = vpm->allowAgentBuild(current_parcel); // true when anyone is allowed to build. See EXT-4610.
bool allow_scripts = vpm->allowAgentScripts(agent_region, current_parcel);
bool allow_damage = vpm->allowAgentDamage(agent_region, current_parcel);
+ bool see_avs = current_parcel->getSeeAVs();
// Most icons are "block this ability"
mParcelIcon[VOICE_ICON]->setVisible( !allow_voice );
@@ -304,6 +308,7 @@ void LLPanelTopInfoBar::updateParcelIcons()
mParcelIcon[SCRIPTS_ICON]->setVisible( !allow_scripts );
mParcelIcon[DAMAGE_ICON]->setVisible( allow_damage );
mDamageText->setVisible(allow_damage);
+ mParcelIcon[SEE_AVATARS_ICON]->setVisible( !see_avs );
layoutParcelIcons();
}
@@ -409,6 +414,9 @@ void LLPanelTopInfoBar::onParcelIconClick(EParcelIcon icon)
case DAMAGE_ICON:
LLNotificationsUtil::add("NotSafe");
break;
+ case SEE_AVATARS_ICON:
+ LLNotificationsUtil::add("SeeAvatars");
+ break;
case ICON_COUNT:
break;
// no default to get compiler warning when a new icon gets added
diff --git a/indra/newview/llpaneltopinfobar.h b/indra/newview/llpaneltopinfobar.h
index db922ef424..583e91d15e 100644
--- a/indra/newview/llpaneltopinfobar.h
+++ b/indra/newview/llpaneltopinfobar.h
@@ -65,12 +65,13 @@ private:
enum EParcelIcon
{
VOICE_ICON = 0,
- FLY_ICON,
- PUSH_ICON,
- BUILD_ICON,
- SCRIPTS_ICON,
- DAMAGE_ICON,
- ICON_COUNT
+ FLY_ICON, // 1
+ PUSH_ICON, // 2
+ BUILD_ICON, // 3
+ SCRIPTS_ICON, // 4
+ DAMAGE_ICON, // 5
+ SEE_AVATARS_ICON, // 6
+ ICON_COUNT // 7 total
};
/**
diff --git a/indra/newview/llpanelvoicedevicesettings.cpp b/indra/newview/llpanelvoicedevicesettings.cpp
index dc87bd0077..4a80bbbe5e 100644
--- a/indra/newview/llpanelvoicedevicesettings.cpp
+++ b/indra/newview/llpanelvoicedevicesettings.cpp
@@ -191,7 +191,21 @@ void LLPanelVoiceDeviceSettings::refresh()
mCtrlInputDevices = getChild<LLComboBox>("voice_input_device");
mCtrlOutputDevices = getChild<LLComboBox>("voice_output_device");
- if(!LLVoiceClient::getInstance()->deviceSettingsAvailable())
+ bool device_settings_available = LLVoiceClient::getInstance()->deviceSettingsAvailable();
+
+ if (mCtrlInputDevices)
+ {
+ mCtrlInputDevices->setEnabled(device_settings_available);
+ }
+
+ if (mCtrlOutputDevices)
+ {
+ mCtrlOutputDevices->setEnabled(device_settings_available);
+ }
+
+ getChild<LLSlider>("mic_volume_slider")->setEnabled(device_settings_available);
+
+ if(!device_settings_available)
{
// The combo boxes are disabled, since we can't get the device settings from the daemon just now.
// Put the currently set default (ONLY) in the box, and select it.
@@ -207,6 +221,7 @@ void LLPanelVoiceDeviceSettings::refresh()
mCtrlOutputDevices->add( mOutputDevice, ADD_BOTTOM );
mCtrlOutputDevices->setSimple(mOutputDevice);
}
+ mDevicesUpdated = FALSE;
}
else if (!mDevicesUpdated)
{
diff --git a/indra/newview/llpanelvolume.cpp b/indra/newview/llpanelvolume.cpp
index c443814c89..12eea7844d 100644
--- a/indra/newview/llpanelvolume.cpp
+++ b/indra/newview/llpanelvolume.cpp
@@ -59,6 +59,7 @@
#include "lltool.h"
#include "lltoolcomp.h"
#include "lltoolmgr.h"
+#include "lltrans.h"
#include "llui.h"
#include "llviewerobject.h"
#include "llviewerregion.h"
@@ -156,6 +157,34 @@ BOOL LLPanelVolume::postBuild()
mSpinPhysicsRestitution = getChild<LLSpinCtrl>("Physics Restitution");
mSpinPhysicsRestitution->setCommitCallback(boost::bind(&LLPanelVolume::sendPhysicsRestitution, this, _1, mSpinPhysicsRestitution));
}
+
+ std::map<std::string, std::string> material_name_map;
+ material_name_map["Stone"]= LLTrans::getString("Stone");
+ material_name_map["Metal"]= LLTrans::getString("Metal");
+ material_name_map["Glass"]= LLTrans::getString("Glass");
+ material_name_map["Wood"]= LLTrans::getString("Wood");
+ material_name_map["Flesh"]= LLTrans::getString("Flesh");
+ material_name_map["Plastic"]= LLTrans::getString("Plastic");
+ material_name_map["Rubber"]= LLTrans::getString("Rubber");
+ material_name_map["Light"]= LLTrans::getString("Light");
+
+ LLMaterialTable::basic.initTableTransNames(material_name_map);
+
+ // material type popup
+ mComboMaterial = getChild<LLComboBox>("material");
+ childSetCommitCallback("material",onCommitMaterial,this);
+ mComboMaterial->removeall();
+
+ for (LLMaterialTable::info_list_t::iterator iter = LLMaterialTable::basic.mMaterialInfoList.begin();
+ iter != LLMaterialTable::basic.mMaterialInfoList.end(); ++iter)
+ {
+ LLMaterialInfo* minfop = *iter;
+ if (minfop->mMCode != LL_MCODE_LIGHT)
+ {
+ mComboMaterial->add(minfop->mName);
+ }
+ }
+ mComboMaterialItemCount = mComboMaterial->getItemCount();
// Start with everyone disabled
clearCtrls();
@@ -164,7 +193,8 @@ BOOL LLPanelVolume::postBuild()
}
LLPanelVolume::LLPanelVolume()
- : LLPanel()
+ : LLPanel(),
+ mComboMaterialItemCount(0)
{
setMouseOpaque(FALSE);
@@ -321,7 +351,7 @@ void LLPanelVolume::getState( )
getChild<LLUICtrl>("Flexible1D Checkbox Ctrl")->setValue(is_flexible);
if (is_flexible || (volobjp && volobjp->canBeFlexible()))
{
- getChildView("Flexible1D Checkbox Ctrl")->setEnabled(editable && single_volume && volobjp);
+ getChildView("Flexible1D Checkbox Ctrl")->setEnabled(editable && single_volume && volobjp && !volobjp->isMesh());
}
else
{
@@ -379,6 +409,46 @@ void LLPanelVolume::getState( )
getChildView("FlexForceZ")->setEnabled(false);
}
+ // Material properties
+
+ // Update material part
+ // slightly inefficient - materials are unique per object, not per TE
+ U8 material_code = 0;
+ struct f : public LLSelectedTEGetFunctor<U8>
+ {
+ U8 get(LLViewerObject* object, S32 te)
+ {
+ return object->getMaterial();
+ }
+ } func;
+ bool material_same = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &func, material_code );
+ std::string LEGACY_FULLBRIGHT_DESC = LLTrans::getString("Fullbright");
+ if (editable && single_volume && material_same)
+ {
+ mComboMaterial->setEnabled( TRUE );
+ if (material_code == LL_MCODE_LIGHT)
+ {
+ if (mComboMaterial->getItemCount() == mComboMaterialItemCount)
+ {
+ mComboMaterial->add(LEGACY_FULLBRIGHT_DESC);
+ }
+ mComboMaterial->setSimple(LEGACY_FULLBRIGHT_DESC);
+ }
+ else
+ {
+ if (mComboMaterial->getItemCount() != mComboMaterialItemCount)
+ {
+ mComboMaterial->remove(LEGACY_FULLBRIGHT_DESC);
+ }
+
+ mComboMaterial->setSimple(std::string(LLMaterialTable::basic.getName(material_code)));
+ }
+ }
+ else
+ {
+ mComboMaterial->setEnabled( FALSE );
+ }
+
// Physics properties
mSpinPhysicsGravity->set(objectp->getPhysicsGravity());
@@ -460,17 +530,24 @@ void LLPanelVolume::refresh()
getChildView("Light Ambiance")->setVisible( visible);
getChildView("light texture control")->setVisible( visible);
- bool enable_mesh = gSavedSettings.getBOOL("MeshEnabled") &&
- gAgent.getRegion() &&
- !gAgent.getRegion()->getCapability("GetMesh").empty();
+ bool enable_mesh = false;
+ LLSD sim_features;
+ LLViewerRegion *region = gAgent.getRegion();
+ if(region)
+ {
+ LLSD sim_features;
+ region->getSimulatorFeatures(sim_features);
+ enable_mesh = sim_features.has("PhysicsShapeTypes");
+ }
getChildView("label physicsshapetype")->setVisible(enable_mesh);
getChildView("Physics Shape Type Combo Ctrl")->setVisible(enable_mesh);
getChildView("Physics Gravity")->setVisible(enable_mesh);
- getChildView("Physics Material Override")->setVisible(enable_mesh);
getChildView("Physics Friction")->setVisible(enable_mesh);
getChildView("Physics Density")->setVisible(enable_mesh);
getChildView("Physics Restitution")->setVisible(enable_mesh);
+
+ /* TODO: add/remove individual physics shape types as per the PhysicsShapeTypes simulator features */
}
@@ -522,6 +599,8 @@ void LLPanelVolume::clearCtrls()
mSpinPhysicsFriction->setEnabled(FALSE);
mSpinPhysicsDensity->setEnabled(FALSE);
mSpinPhysicsRestitution->setEnabled(FALSE);
+
+ mComboMaterial->setEnabled( FALSE );
}
//
@@ -674,6 +753,25 @@ void LLPanelVolume::onLightSelectTexture(const LLSD& data)
}
// static
+void LLPanelVolume::onCommitMaterial( LLUICtrl* ctrl, void* userdata )
+{
+ //LLPanelObject* self = (LLPanelObject*) userdata;
+ LLComboBox* box = (LLComboBox*) ctrl;
+
+ if (box)
+ {
+ // apply the currently selected material to the object
+ const std::string& material_name = box->getSimple();
+ std::string LEGACY_FULLBRIGHT_DESC = LLTrans::getString("Fullbright");
+ if (material_name != LEGACY_FULLBRIGHT_DESC)
+ {
+ U8 material_code = LLMaterialTable::basic.getMCode(material_name);
+ LLSelectMgr::getInstance()->selectionSetMaterial(material_code);
+ }
+ }
+}
+
+// static
void LLPanelVolume::onCommitLight( LLUICtrl* ctrl, void* userdata )
{
LLPanelVolume* self = (LLPanelVolume*) userdata;
diff --git a/indra/newview/llpanelvolume.h b/indra/newview/llpanelvolume.h
index 776a2c1f4a..0ef47db0d9 100644
--- a/indra/newview/llpanelvolume.h
+++ b/indra/newview/llpanelvolume.h
@@ -63,8 +63,8 @@ public:
static void onCommitLight( LLUICtrl* ctrl, void* userdata);
static void onCommitIsFlexible( LLUICtrl* ctrl, void* userdata);
static void onCommitFlexible( LLUICtrl* ctrl, void* userdata);
-
static void onCommitPhysicsParam( LLUICtrl* ctrl, void* userdata);
+ static void onCommitMaterial( LLUICtrl* ctrl, void* userdata);
void onLightCancelColor(const LLSD& data);
void onLightSelectColor(const LLSD& data);
@@ -104,6 +104,10 @@ protected:
LLSpinCtrl* mSpinForce[3];
*/
+ S32 mComboMaterialItemCount;
+ LLComboBox* mComboMaterial;
+
+
LLColor4 mLightSavedColor;
LLUUID mLightSavedTexture;
LLPointer<LLViewerObject> mObject;
diff --git a/indra/newview/llpanelwearing.cpp b/indra/newview/llpanelwearing.cpp
index 911a9e5dda..f19b54c1d4 100644
--- a/indra/newview/llpanelwearing.cpp
+++ b/indra/newview/llpanelwearing.cpp
@@ -38,6 +38,8 @@
#include "llsidetray.h"
#include "llviewermenu.h"
#include "llwearableitemslist.h"
+#include "llsdserialize.h"
+#include "llclipboard.h"
// Context menu and Gear menu helper.
static void edit_outfit()
@@ -58,6 +60,7 @@ public:
registrar.add("Gear.Edit", boost::bind(&edit_outfit));
registrar.add("Gear.TakeOff", boost::bind(&LLWearingGearMenu::onTakeOff, this));
+ registrar.add("Gear.Copy", boost::bind(&LLPanelWearing::copyToClipboard, mPanelWearing));
enable_registrar.add("Gear.OnEnable", boost::bind(&LLPanelWearing::isActionEnabled, mPanelWearing, _2));
@@ -174,8 +177,8 @@ LLPanelWearing::~LLPanelWearing()
if (gInventory.containsObserver(mCategoriesObserver))
{
gInventory.removeObserver(mCategoriesObserver);
- delete mCategoriesObserver;
}
+ delete mCategoriesObserver;
}
BOOL LLPanelWearing::postBuild()
@@ -280,4 +283,25 @@ void LLPanelWearing::getSelectedItemsUUIDs(uuid_vec_t& selected_uuids) const
mCOFItemsList->getSelectedUUIDs(selected_uuids);
}
+void LLPanelWearing::copyToClipboard()
+{
+ std::string text;
+ std::vector<LLSD> data;
+ mCOFItemsList->getValues(data);
+
+ for(std::vector<LLSD>::const_iterator iter = data.begin(); iter != data.end();)
+ {
+ LLSD uuid = (*iter);
+ LLViewerInventoryItem* item = gInventory.getItem(uuid);
+
+ iter++;
+ if (item != NULL)
+ {
+ // Append a newline to all but the last line
+ text += iter != data.end() ? item->getName() + "\n" : item->getName();
+ }
+ }
+
+ gClipboard.copyFromString(utf8str_to_wstring(text));
+}
// EOF
diff --git a/indra/newview/llpanelwearing.h b/indra/newview/llpanelwearing.h
index 157b2c4c5f..9a212b3cca 100644
--- a/indra/newview/llpanelwearing.h
+++ b/indra/newview/llpanelwearing.h
@@ -60,6 +60,8 @@ public:
/*virtual*/ void getSelectedItemsUUIDs(uuid_vec_t& selected_uuids) const;
+ /*virtual*/ void copyToClipboard();
+
boost::signals2::connection setSelectionChangeCallback(commit_callback_t cb);
bool hasItemSelected();
diff --git a/indra/newview/llplacesinventorypanel.cpp b/indra/newview/llplacesinventorypanel.cpp
index 29e262199e..f7823f4fe8 100644
--- a/indra/newview/llplacesinventorypanel.cpp
+++ b/indra/newview/llplacesinventorypanel.cpp
@@ -35,6 +35,7 @@
#include "llinventoryfunctions.h"
#include "llpanellandmarks.h"
#include "llplacesinventorybridge.h"
+#include "llviewerfoldertype.h"
static LLDefaultChildRegistry::Register<LLPlacesInventoryPanel> r("places_inventory_panel");
@@ -56,72 +57,44 @@ LLPlacesInventoryPanel::~LLPlacesInventoryPanel()
delete mSavedFolderState;
}
-BOOL LLPlacesInventoryPanel::postBuild()
+void LLPlacesInventoryPanel::buildFolderView(const LLInventoryPanel::Params& params)
{
- LLInventoryPanel::postBuild();
+ // Determine the root folder in case specified, and
+ // build the views starting with that folder.
+ const LLFolderType::EType preferred_type = LLViewerFolderType::lookupTypeFromNewCategoryName(params.start_folder);
- // clear Contents();
- {
- mFolderRoot->destroyView();
- mFolderRoot->getParent()->removeChild(mFolderRoot);
- mFolderRoot->die();
-
- if( mScroller )
- {
- removeChild( mScroller );
- mScroller->die();
- mScroller = NULL;
- }
- mFolderRoot = NULL;
- }
-
-
- mCommitCallbackRegistrar.pushScope(); // registered as a widget; need to push callback scope ourselves
+ LLUUID root_id;
- // create root folder
+ if ("LIBRARY" == params.start_folder())
{
- LLRect folder_rect(0,
- 0,
- getRect().getWidth(),
- 0);
- LLPlacesFolderView::Params p;
- p.name = getName();
- p.title = getLabel();
- p.rect = folder_rect;
- p.parent_panel = this;
- mFolderRoot = (LLFolderView*)LLUICtrlFactory::create<LLPlacesFolderView>(p);
- mFolderRoot->setAllowMultiSelect(mAllowMultiSelect);
+ root_id = gInventory.getLibraryRootFolderID();
}
-
- mCommitCallbackRegistrar.popScope();
-
- mFolderRoot->setCallbackRegistrar(&mCommitCallbackRegistrar);
-
- // scroller
+ else
{
- LLRect scroller_view_rect = getRect();
- scroller_view_rect.translate(-scroller_view_rect.mLeft, -scroller_view_rect.mBottom);
- LLScrollContainer::Params p;
- p.name("Inventory Scroller");
- p.rect(scroller_view_rect);
- p.follows.flags(FOLLOWS_ALL);
- p.reserve_scroll_corner(true);
- p.tab_stop(true);
- mScroller = LLUICtrlFactory::create<LLScrollContainer>(p);
+ root_id = (preferred_type != LLFolderType::FT_NONE ? gInventory.findCategoryUUIDForType(preferred_type) : LLUUID::null);
}
- addChild(mScroller);
- mScroller->addChild(mFolderRoot);
-
- mFolderRoot->setScrollContainer(mScroller);
- mFolderRoot->addChild(mFolderRoot->mStatusTextBox);
-
- // cut subitems
- mFolderRoot->setUseEllipses(true);
-
- return TRUE;
+ LLRect folder_rect(0,
+ 0,
+ getRect().getWidth(),
+ 0);
+ LLPlacesFolderView::Params p;
+ p.name = getName();
+ p.title = getLabel();
+ p.rect = folder_rect;
+ p.listener = mInvFVBridgeBuilder->createBridge(LLAssetType::AT_CATEGORY,
+ LLAssetType::AT_CATEGORY,
+ LLInventoryType::IT_CATEGORY,
+ this,
+ NULL,
+ root_id);
+ p.parent_panel = this;
+ p.allow_multiselect = mAllowMultiSelect;
+ p.use_ellipses = true; // truncate inventory item text so remove horizontal scroller
+ mFolderRoot = (LLFolderView*)LLUICtrlFactory::create<LLPlacesFolderView>(p);
}
+
// save current folder open state
void LLPlacesInventoryPanel::saveFolderState()
{
diff --git a/indra/newview/llplacesinventorypanel.h b/indra/newview/llplacesinventorypanel.h
index 6641871a0b..f647e7f970 100644
--- a/indra/newview/llplacesinventorypanel.h
+++ b/indra/newview/llplacesinventorypanel.h
@@ -46,7 +46,7 @@ public:
LLPlacesInventoryPanel(const Params& p);
~LLPlacesInventoryPanel();
- /*virtual*/ BOOL postBuild();
+ /*virtual*/ void buildFolderView(const LLInventoryPanel::Params& params);
void saveFolderState();
void restoreFolderState();
diff --git a/indra/newview/llpreviewgesture.cpp b/indra/newview/llpreviewgesture.cpp
index 9f5c55bad1..f47928b131 100644
--- a/indra/newview/llpreviewgesture.cpp
+++ b/indra/newview/llpreviewgesture.cpp
@@ -42,6 +42,7 @@
#include "llinventoryfunctions.h"
#include "llinventorymodel.h"
#include "llinventorymodelbackgroundfetch.h"
+#include "llkeyboard.h"
#include "llmultigesture.h"
#include "llnotificationsutil.h"
#include "llradiogroup.h"
diff --git a/indra/newview/llpreviewnotecard.cpp b/indra/newview/llpreviewnotecard.cpp
index 9f3ee6ac5d..4974dde282 100644
--- a/indra/newview/llpreviewnotecard.cpp
+++ b/indra/newview/llpreviewnotecard.cpp
@@ -401,15 +401,14 @@ struct LLSaveNotecardInfo
bool LLPreviewNotecard::saveIfNeeded(LLInventoryItem* copyitem)
{
- if(!gAssetStorage)
+ LLViewerTextEditor* editor = getChild<LLViewerTextEditor>("Notecard Editor");
+
+ if(!editor)
{
- llwarns << "Not connected to an asset storage system." << llendl;
+ llwarns << "Cannot get handle to the notecard editor." << llendl;
return false;
}
-
- LLViewerTextEditor* editor = getChild<LLViewerTextEditor>("Notecard Editor");
-
if(!editor->isPristine())
{
// We need to update the asset information
@@ -436,8 +435,15 @@ bool LLPreviewNotecard::saveIfNeeded(LLInventoryItem* copyitem)
// save it out to database
if (item)
{
- std::string agent_url = gAgent.getRegion()->getCapability("UpdateNotecardAgentInventory");
- std::string task_url = gAgent.getRegion()->getCapability("UpdateNotecardTaskInventory");
+ const LLViewerRegion* region = gAgent.getRegion();
+ if (!region)
+ {
+ llwarns << "Not connected to a region, cannot save notecard." << llendl;
+ return false;
+ }
+ std::string agent_url = region->getCapability("UpdateNotecardAgentInventory");
+ std::string task_url = region->getCapability("UpdateNotecardTaskInventory");
+
if (mObjectUUID.isNull() && !agent_url.empty())
{
// Saving into agent inventory
@@ -472,6 +478,11 @@ bool LLPreviewNotecard::saveIfNeeded(LLInventoryItem* copyitem)
(void*)info,
FALSE);
}
+ else // !gAssetStorage
+ {
+ llwarns << "Not connected to an asset storage system." << llendl;
+ return false;
+ }
}
}
return true;
diff --git a/indra/newview/llprogressview.cpp b/indra/newview/llprogressview.cpp
index 31fde5d58a..028891a90e 100644
--- a/indra/newview/llprogressview.cpp
+++ b/indra/newview/llprogressview.cpp
@@ -55,23 +55,18 @@ LLProgressView* LLProgressView::sInstance = NULL;
S32 gStartImageWidth = 1;
S32 gStartImageHeight = 1;
-const F32 FADE_IN_TIME = 1.f;
-
-const std::string ANIMATION_FILENAME = "Login Sequence ";
-const std::string ANIMATION_SUFFIX = ".jpg";
-const F32 TOTAL_LOGIN_TIME = 10.f; // seconds, wild guess at time from GL context to actual world view
-S32 gLastStartAnimationFrame = 0; // human-style indexing, first image = 1
-const S32 ANIMATION_FRAMES = 1; //13;
+const F32 FADE_TO_WORLD_TIME = 1.0f;
static LLRegisterPanelClassWrapper<LLProgressView> r("progress_view");
-
// XUI: Translate
LLProgressView::LLProgressView()
: LLPanel(),
mPercentDone( 0.f ),
+ mMediaCtrl( NULL ),
mMouseDownInActiveArea( false ),
- mUpdateEvents("LLProgressView")
+ mUpdateEvents("LLProgressView"),
+ mFadeToWorldTimer()
{
mUpdateEvents.listen("self", boost::bind(&LLProgressView::handleUpdate, this, _1));
}
@@ -80,9 +75,14 @@ BOOL LLProgressView::postBuild()
{
mProgressBar = getChild<LLProgressBar>("login_progress_bar");
+ // media control that is used to play intro video
+ mMediaCtrl = getChild<LLMediaCtrl>("login_media_panel");
+ mMediaCtrl->setVisible( false ); // hidden initially
+ mMediaCtrl->addObserver( this ); // watch events
+
mCancelBtn = getChild<LLButton>("cancel_btn");
mCancelBtn->setClickedCallback( LLProgressView::onCancelButtonClicked, NULL );
- mFadeTimer.stop();
+ mFadeToWorldTimer.stop();
getChild<LLTextBox>("title_text")->setText(LLStringExplicit(LLAppViewer::instance()->getSecondLifeTitle()));
@@ -125,24 +125,43 @@ BOOL LLProgressView::handleKeyHere(KEY key, MASK mask)
return TRUE;
}
+void LLProgressView::revealIntroPanel()
+{
+ // if user hasn't yet seen intro video
+ std::string intro_url = gSavedSettings.getString("PostFirstLoginIntroURL");
+ if ( intro_url.length() > 0 &&
+ gSavedSettings.getBOOL("PostFirstLoginIntroViewed" ) == FALSE )
+ {
+ // navigate to intro URL and reveal widget
+ mMediaCtrl->navigateTo( intro_url );
+ mMediaCtrl->setVisible( TRUE );
+
+ // flag as having seen the new user post login intro
+ gSavedSettings.setBOOL("PostFirstLoginIntroViewed", TRUE );
+ }
+ else
+ {
+ // start the timer that will control the fade through to the world view
+ mFadeToWorldTimer.start();
+ }
+}
+
void LLProgressView::setVisible(BOOL visible)
{
// hiding progress view
if (getVisible() && !visible)
{
- mFadeTimer.start();
+ LLPanel::setVisible(FALSE);
}
// showing progress view
- else if (visible && (!getVisible() || mFadeTimer.getStarted()))
+ else if (visible && (!getVisible() || mFadeToWorldTimer.getStarted()))
{
setFocus(TRUE);
- mFadeTimer.stop();
- mProgressTimer.start();
+ mFadeToWorldTimer.stop();
LLPanel::setVisible(TRUE);
}
}
-
void LLProgressView::draw()
{
static LLTimer timer;
@@ -153,7 +172,7 @@ void LLProgressView::draw()
{
LLGLSUIDefault gls_ui;
gGL.getTexUnit(0)->bind(gStartTexture.get());
- gGL.color4f(1.f, 1.f, 1.f, mFadeTimer.getStarted() ? clamp_rescale(mFadeTimer.getElapsedTimeF32(), 0.f, FADE_IN_TIME, 1.f, 0.f) : 1.f);
+ gGL.color4f(1.f, 1.f, 1.f, 1.f);
F32 image_aspect = (F32)gStartImageWidth / (F32)gStartImageHeight;
S32 width = getRect().getWidth();
S32 height = getRect().getHeight();
@@ -180,16 +199,36 @@ void LLProgressView::draw()
}
glPopMatrix();
- // Handle fade-in animation
- if (mFadeTimer.getStarted())
+ // handle fade out to world view when we're asked to
+ if (mFadeToWorldTimer.getStarted())
{
+ // draw fading panel
+ F32 alpha = clamp_rescale(mFadeToWorldTimer.getElapsedTimeF32(), 0.f, FADE_TO_WORLD_TIME, 1.f, 0.f);
+ LLViewDrawContext context(alpha);
LLPanel::draw();
- if (mFadeTimer.getElapsedTimeF32() > FADE_IN_TIME)
+
+ // faded out completely - remove panel and reveal world
+ if (mFadeToWorldTimer.getElapsedTimeF32() > FADE_TO_WORLD_TIME )
{
+ mFadeToWorldTimer.stop();
+
// Fade is complete, release focus
gFocusMgr.releaseFocusIfNeeded( this );
+
+ // turn off panel that hosts intro so we see the world
LLPanel::setVisible(FALSE);
- mFadeTimer.stop();
+
+ // stop observing events since we no longer care
+ mMediaCtrl->remObserver( this );
+
+ // hide the intro
+ mMediaCtrl->setVisible( false );
+
+ // navigate away from intro page to something innocuous since 'unload' is broken right now
+ //mMediaCtrl->navigateTo( "about:blank" );
+
+ // FIXME: this causes a crash that i haven't been able to fix
+ mMediaCtrl->unloadMediaSource();
gStartTexture = NULL;
}
@@ -307,3 +346,12 @@ bool LLProgressView::onAlertModal(const LLSD& notify)
}
return false;
}
+
+void LLProgressView::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event)
+{
+ if( event == MEDIA_EVENT_CLOSE_REQUEST )
+ {
+ // the intro web content calls javascript::window.close() when it's done
+ mFadeToWorldTimer.start();
+ }
+}
diff --git a/indra/newview/llprogressview.h b/indra/newview/llprogressview.h
index be1744f08a..73dd478e98 100644
--- a/indra/newview/llprogressview.h
+++ b/indra/newview/llprogressview.h
@@ -28,6 +28,7 @@
#define LL_LLPROGRESSVIEW_H
#include "llpanel.h"
+#include "llmediactrl.h"
#include "llframetimer.h"
#include "llevents.h"
@@ -35,7 +36,10 @@ class LLImageRaw;
class LLButton;
class LLProgressBar;
-class LLProgressView : public LLPanel
+class LLProgressView :
+ public LLPanel,
+ public LLViewerMediaObserver
+
{
public:
LLProgressView();
@@ -49,25 +53,35 @@ public:
/*virtual*/ BOOL handleKeyHere(KEY key, MASK mask);
/*virtual*/ void setVisible(BOOL visible);
+ // inherited from LLViewerMediaObserver
+ /*virtual*/ void handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event);
+
void setText(const std::string& text);
void setPercent(const F32 percent);
// Set it to NULL when you want to eliminate the message.
void setMessage(const std::string& msg);
+ // turns on (under certain circumstances) the into video after login
+ void revealIntroPanel();
+
void setCancelButtonVisible(BOOL b, const std::string& label);
static void onCancelButtonClicked( void* );
static void onClickMessage(void*);
bool onAlertModal(const LLSD& sd);
+ // note - this is not just hiding the intro panel - it also hides the parent panel
+ // and is used when the intro is finished and we want to show the world
+ void removeIntroPanel();
+
protected:
LLProgressBar* mProgressBar;
+ LLMediaCtrl* mMediaCtrl;
F32 mPercentDone;
std::string mMessage;
LLButton* mCancelBtn;
- LLFrameTimer mFadeTimer;
- LLFrameTimer mProgressTimer;
+ LLFrameTimer mFadeToWorldTimer;
LLRect mOutlineRect;
bool mMouseDownInActiveArea;
diff --git a/indra/newview/llregioninfomodel.cpp b/indra/newview/llregioninfomodel.cpp
new file mode 100644
index 0000000000..698c4f9bb9
--- /dev/null
+++ b/indra/newview/llregioninfomodel.cpp
@@ -0,0 +1,217 @@
+/**
+ * @file llregioninfomodel.cpp
+ * @brief Region info model
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llregioninfomodel.h"
+
+// libs
+#include "message.h"
+#include "llregionflags.h"
+
+// viewer
+#include "llagent.h"
+#include "llviewerregion.h"
+
+void LLRegionInfoModel::reset()
+{
+ mSimAccess = 0;
+ mAgentLimit = 0;
+
+ mRegionFlags = 0;
+ mEstateID = 0;
+ mParentEstateID = 0;
+
+ mPricePerMeter = 0;
+ mRedirectGridX = 0;
+ mRedirectGridY = 0;
+
+ mBillableFactor = 0.0f;
+ mObjectBonusFactor = 0.0f;
+ mWaterHeight = 0.0f;
+ mTerrainRaiseLimit = 0.0f;
+ mTerrainLowerLimit = 0.0f;
+ mSunHour = 0.0f;
+
+ mUseEstateSun = false;
+
+ mSimType.clear();
+ mSimName.clear();
+}
+
+LLRegionInfoModel::LLRegionInfoModel()
+{
+ reset();
+}
+
+boost::signals2::connection LLRegionInfoModel::setUpdateCallback(const update_signal_t::slot_type& cb)
+{
+ return mUpdateSignal.connect(cb);
+}
+
+void LLRegionInfoModel::sendRegionTerrain(const LLUUID& invoice) const
+{
+ std::string buffer;
+ std::vector<std::string> strings;
+
+ // ==========================================
+ // Assemble and send setregionterrain message
+ // "setregionterrain"
+ // strings[0] = float water height
+ // strings[1] = float terrain raise
+ // strings[2] = float terrain lower
+ // strings[3] = 'Y' use estate time
+ // strings[4] = 'Y' fixed sun
+ // strings[5] = float sun_hour
+ // strings[6] = from estate, 'Y' use global time
+ // strings[7] = from estate, 'Y' fixed sun
+ // strings[8] = from estate, float sun_hour
+
+ // *NOTE: this resets estate sun info.
+ BOOL estate_global_time = true;
+ BOOL estate_fixed_sun = false;
+ F32 estate_sun_hour = 0.f;
+
+ buffer = llformat("%f", mWaterHeight);
+ strings.push_back(buffer);
+ buffer = llformat("%f", mTerrainRaiseLimit);
+ strings.push_back(buffer);
+ buffer = llformat("%f", mTerrainLowerLimit);
+ strings.push_back(buffer);
+ buffer = llformat("%s", (mUseEstateSun ? "Y" : "N"));
+ strings.push_back(buffer);
+ buffer = llformat("%s", (getUseFixedSun() ? "Y" : "N"));
+ strings.push_back(buffer);
+ buffer = llformat("%f", mSunHour);
+ strings.push_back(buffer);
+ buffer = llformat("%s", (estate_global_time ? "Y" : "N") );
+ strings.push_back(buffer);
+ buffer = llformat("%s", (estate_fixed_sun ? "Y" : "N") );
+ strings.push_back(buffer);
+ buffer = llformat("%f", estate_sun_hour);
+ strings.push_back(buffer);
+
+ sendEstateOwnerMessage(gMessageSystem, "setregionterrain", invoice, strings);
+}
+
+bool LLRegionInfoModel::getUseFixedSun() const
+{
+ return mRegionFlags & REGION_FLAGS_SUN_FIXED;
+}
+
+void LLRegionInfoModel::setUseFixedSun(bool fixed)
+{
+ if (fixed)
+ {
+ mRegionFlags |= REGION_FLAGS_SUN_FIXED;
+ }
+ else
+ {
+ mRegionFlags &= ~REGION_FLAGS_SUN_FIXED;
+ }
+}
+
+void LLRegionInfoModel::update(LLMessageSystem* msg)
+{
+ reset();
+
+ msg->getStringFast(_PREHASH_RegionInfo, _PREHASH_SimName, mSimName);
+ msg->getU32Fast(_PREHASH_RegionInfo, _PREHASH_EstateID, mEstateID);
+ msg->getU32Fast(_PREHASH_RegionInfo, _PREHASH_ParentEstateID, mParentEstateID);
+ msg->getU32Fast(_PREHASH_RegionInfo, _PREHASH_RegionFlags, mRegionFlags);
+ msg->getU8Fast(_PREHASH_RegionInfo, _PREHASH_SimAccess, mSimAccess);
+ msg->getU8Fast(_PREHASH_RegionInfo, _PREHASH_MaxAgents, mAgentLimit);
+ msg->getF32Fast(_PREHASH_RegionInfo, _PREHASH_ObjectBonusFactor, mObjectBonusFactor);
+ msg->getF32Fast(_PREHASH_RegionInfo, _PREHASH_BillableFactor, mBillableFactor);
+ msg->getF32Fast(_PREHASH_RegionInfo, _PREHASH_WaterHeight, mWaterHeight);
+ msg->getF32Fast(_PREHASH_RegionInfo, _PREHASH_TerrainRaiseLimit, mTerrainRaiseLimit);
+ msg->getF32Fast(_PREHASH_RegionInfo, _PREHASH_TerrainLowerLimit, mTerrainLowerLimit);
+ msg->getS32Fast(_PREHASH_RegionInfo, _PREHASH_PricePerMeter, mPricePerMeter);
+ msg->getS32Fast(_PREHASH_RegionInfo, _PREHASH_RedirectGridX, mRedirectGridX);
+ msg->getS32Fast(_PREHASH_RegionInfo, _PREHASH_RedirectGridY, mRedirectGridY);
+
+ msg->getBOOL(_PREHASH_RegionInfo, _PREHASH_UseEstateSun, mUseEstateSun);
+
+ // actually the "last set" sun hour, not the current sun hour. JC
+ msg->getF32(_PREHASH_RegionInfo, _PREHASH_SunHour, mSunHour);
+ LL_DEBUGS("Windlight Sync") << "Got region sun hour: " << mSunHour << LL_ENDL;
+
+ // the only reasonable way to decide if we actually have any data is to
+ // check to see if any of these fields have nonzero sizes
+ if (msg->getSize(_PREHASH_RegionInfo2, _PREHASH_ProductSKU) > 0 ||
+ msg->getSize(_PREHASH_RegionInfo2, "ProductName") > 0)
+ {
+ msg->getString(_PREHASH_RegionInfo2, "ProductName", mSimType);
+ }
+
+ // Let interested parties know that region info has been updated.
+ mUpdateSignal();
+}
+
+// static
+void LLRegionInfoModel::sendEstateOwnerMessage(
+ LLMessageSystem* msg,
+ const std::string& request,
+ const LLUUID& invoice,
+ const std::vector<std::string>& strings)
+{
+ LLViewerRegion* cur_region = gAgent.getRegion();
+
+ if (!cur_region)
+ {
+ llwarns << "Agent region not set" << llendl;
+ return;
+ }
+
+ llinfos << "Sending estate request '" << request << "'" << llendl;
+ msg->newMessage("EstateOwnerMessage");
+ msg->nextBlockFast(_PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+ msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+ msg->addUUIDFast(_PREHASH_TransactionID, LLUUID::null); //not used
+ msg->nextBlock("MethodData");
+ msg->addString("Method", request);
+ msg->addUUID("Invoice", invoice);
+
+ if (strings.empty())
+ {
+ msg->nextBlock("ParamList");
+ msg->addString("Parameter", NULL);
+ }
+ else
+ {
+ std::vector<std::string>::const_iterator it = strings.begin();
+ std::vector<std::string>::const_iterator end = strings.end();
+ for (unsigned i = 0; it != end; ++it, ++i)
+ {
+ lldebugs << "- [" << i << "] " << (*it) << llendl;
+ msg->nextBlock("ParamList");
+ msg->addString("Parameter", *it);
+ }
+ }
+
+ msg->sendReliable(cur_region->getHost());
+}
diff --git a/indra/newview/llregioninfomodel.h b/indra/newview/llregioninfomodel.h
new file mode 100644
index 0000000000..89efd82767
--- /dev/null
+++ b/indra/newview/llregioninfomodel.h
@@ -0,0 +1,99 @@
+/**
+ * @file llregioninfomodel.h
+ * @brief Region info model
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLREGIONINFOMODEL_H
+#define LL_LLREGIONINFOMODEL_H
+
+class LLMessageSystem;
+
+#include "llsingleton.h"
+
+/**
+ * Contains region info, notifies interested parties of its changes.
+ */
+class LLRegionInfoModel : public LLSingleton<LLRegionInfoModel>
+{
+ LOG_CLASS(LLRegionInfoModel);
+
+public:
+ typedef boost::signals2::signal<void()> update_signal_t;
+ boost::signals2::connection setUpdateCallback(const update_signal_t::slot_type& cb);
+
+ void sendRegionTerrain(const LLUUID& invoice) const; /// upload region terrain data
+
+ bool getUseFixedSun() const;
+
+ void setUseFixedSun(bool fixed);
+
+ // *TODO: Add getters and make the data private.
+ U8 mSimAccess;
+ U8 mAgentLimit;
+
+ U32 mRegionFlags;
+ U32 mEstateID;
+ U32 mParentEstateID;
+
+ S32 mPricePerMeter;
+ S32 mRedirectGridX;
+ S32 mRedirectGridY;
+
+ F32 mBillableFactor;
+ F32 mObjectBonusFactor;
+ F32 mWaterHeight;
+ F32 mTerrainRaiseLimit;
+ F32 mTerrainLowerLimit;
+ F32 mSunHour; // 6..30
+
+ BOOL mUseEstateSun;
+
+ std::string mSimName;
+ std::string mSimType;
+
+protected:
+ friend class LLSingleton<LLRegionInfoModel>;
+ friend class LLViewerRegion;
+
+ LLRegionInfoModel();
+
+ /**
+ * Refresh model with data from the incoming server message.
+ */
+ void update(LLMessageSystem* msg);
+
+private:
+ void reset();
+
+ // *FIXME: Duplicated code from LLPanelRegionInfo
+ static void sendEstateOwnerMessage(
+ LLMessageSystem* msg,
+ const std::string& request,
+ const LLUUID& invoice,
+ const std::vector<std::string>& strings);
+
+ update_signal_t mUpdateSignal;
+};
+
+#endif // LL_LLREGIONINFOMODEL_H
diff --git a/indra/newview/llsceneview.cpp b/indra/newview/llsceneview.cpp
index 8e8fc9dd25..09e799e4f7 100644
--- a/indra/newview/llsceneview.cpp
+++ b/indra/newview/llsceneview.cpp
@@ -83,6 +83,9 @@ void LLSceneView::draw()
S32 total_visible_triangles[] = {0, 0};
S32 total_triangles[] = {0, 0};
+ S32 total_visible_bytes[] = {0, 0};
+ S32 total_bytes[] = {0, 0};
+
//streaming cost
std::vector<F32> streaming_cost[2];
F32 total_streaming[] = { 0.f, 0.f };
@@ -122,13 +125,19 @@ void LLSceneView::draw()
visible_triangles[idx].push_back(visible);
triangles[idx].push_back(high_triangles);
- F32 streaming = object->getStreamingCost();
+ S32 bytes = 0;
+ S32 visible_bytes = 0;
+
+ F32 streaming = object->getStreamingCost(&bytes, &visible_bytes);
total_streaming[idx] += streaming;
streaming_cost[idx].push_back(streaming);
F32 physics = object->getPhysicsCost();
total_physics[idx] += physics;
physics_cost[idx].push_back(physics);
+
+ total_bytes[idx] += bytes;
+ total_visible_bytes[idx] += visible_bytes;
}
}
}
@@ -279,8 +288,8 @@ void LLSceneView::draw()
total_visible += tri_count;
}
- std::string label = llformat("%s Object Triangle Counts (Ktris) -- [%.2f, %.2f] Mean: %.2f Median: %.2f Visible: %.2f/%.2f",
- category[idx], tri_domain[0]/1024.f, tri_domain[1]/1024.f, (total/count)/1024.f, triangles[idx][count/2]/1024.f, total_visible_triangles[idx]/1024.f, total_triangles[idx]/1024.f);
+ std::string label = llformat("%s Object Triangle Counts (Ktris) -- Visible: %.2f/%.2f (%.2f KB Visible)",
+ category[idx], total_visible_triangles[idx]/1024.f, total_triangles[idx]/1024.f, total_visible_bytes[idx]/1024.f);
LLFontGL::getFontMonospace()->renderUTF8(label,
0 , tri_rect.mLeft, tri_rect.mTop+margin, LLColor4::white, LLFontGL::LEFT, LLFontGL::TOP);
diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp
index d411557af0..9c85817a28 100644
--- a/indra/newview/llselectmgr.cpp
+++ b/indra/newview/llselectmgr.cpp
@@ -1997,7 +1997,7 @@ void LLSelectMgr::selectionSetPhysicsType(U8 type)
if (object->permModify())
{
object->setPhysicsShapeType(mType);
- object->updateFlags();
+ object->updateFlags(TRUE);
}
return true;
}
@@ -2016,7 +2016,7 @@ void LLSelectMgr::selectionSetFriction(F32 friction)
if (object->permModify())
{
object->setPhysicsFriction(mFriction);
- object->updateFlags();
+ object->updateFlags(TRUE);
}
return true;
}
@@ -2035,7 +2035,7 @@ void LLSelectMgr::selectionSetGravity(F32 gravity )
if (object->permModify())
{
object->setPhysicsGravity(mGravity);
- object->updateFlags();
+ object->updateFlags(TRUE);
}
return true;
}
@@ -2054,7 +2054,7 @@ void LLSelectMgr::selectionSetDensity(F32 density )
if (object->permModify())
{
object->setPhysicsDensity(mDensity);
- object->updateFlags();
+ object->updateFlags(TRUE);
}
return true;
}
@@ -2073,7 +2073,7 @@ void LLSelectMgr::selectionSetRestitution(F32 restitution)
if (object->permModify())
{
object->setPhysicsRestitution(mRestitution);
- object->updateFlags();
+ object->updateFlags(TRUE);
}
return true;
}
diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp
index 16729f045a..28ec11d1c7 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 "llfolderview.h"
#include "llinventorypanel.h"
#include "llfiltereditor.h"
#include "llfloaterreg.h"
diff --git a/indra/newview/llsidepanelinventory.cpp b/indra/newview/llsidepanelinventory.cpp
index 31ea542743..65655f82cd 100644
--- a/indra/newview/llsidepanelinventory.cpp
+++ b/indra/newview/llsidepanelinventory.cpp
@@ -29,33 +29,147 @@
#include "llagent.h"
#include "llappearancemgr.h"
+#include "llappviewer.h"
#include "llavataractions.h"
#include "llbutton.h"
+#include "lldate.h"
#include "llfirstuse.h"
+#include "llfoldertype.h"
+#include "llhttpclient.h"
#include "llinventorybridge.h"
#include "llinventoryfunctions.h"
+#include "llinventorymodel.h"
+#include "llinventorymodelbackgroundfetch.h"
+#include "llinventoryobserver.h"
#include "llinventorypanel.h"
+#include "lllayoutstack.h"
#include "lloutfitobserver.h"
#include "llpanelmaininventory.h"
+#include "llpanelmarketplaceinbox.h"
+#include "llpanelmarketplaceoutbox.h"
+#include "llselectmgr.h"
#include "llsidepaneliteminfo.h"
#include "llsidepaneltaskinfo.h"
+#include "llstring.h"
#include "lltabcontainer.h"
-#include "llselectmgr.h"
+#include "llviewermedia.h"
#include "llweb.h"
static LLRegisterPanelClassWrapper<LLSidepanelInventory> t_inventory("sidepanel_inventory");
-LLSidepanelInventory::LLSidepanelInventory()
- : LLPanel(),
- mItemPanel(NULL),
- mPanelMainInventory(NULL)
+//
+// Constants
+//
+
+static const char * const INBOX_EXPAND_TIME_SETTING = "LastInventoryInboxExpand";
+
+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 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 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
{
+public:
+ LLInboxOutboxAddedObserver(LLSidepanelInventory * sidepanelInventory)
+ : LLInventoryCategoryAddedObserver()
+ , mSidepanelInventory(sidepanelInventory)
+ {
+ }
+
+ 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();
+
+ switch (added_category_type)
+ {
+ case LLFolderType::FT_INBOX:
+ 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;
+ }
+ }
+ }
+
+private:
+ LLSidepanelInventory * mSidepanelInventory;
+};
+//
+// Implementation
+//
+
+LLSidepanelInventory::LLSidepanelInventory()
+ : LLPanel()
+ , mItemPanel(NULL)
+ , mPanelMainInventory(NULL)
+ , mInboxEnabled(false)
+ , mOutboxEnabled(false)
+ , mCategoriesObserver(NULL)
+ , mInboxOutboxAddedObserver(NULL)
+{
//buildFromFile( "panel_inventory.xml"); // Called from LLRegisterPanelClass::defaultPanelClassBuilder()
}
LLSidepanelInventory::~LLSidepanelInventory()
{
+ if (mCategoriesObserver && gInventory.containsObserver(mCategoriesObserver))
+ {
+ gInventory.removeObserver(mCategoriesObserver);
+ }
+ delete mCategoriesObserver;
+
+ if (mInboxOutboxAddedObserver && gInventory.containsObserver(mInboxOutboxAddedObserver))
+ {
+ gInventory.removeObserver(mInboxOutboxAddedObserver);
+ }
+ delete mInboxOutboxAddedObserver;
+}
+
+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"));
}
BOOL LLSidepanelInventory::postBuild()
@@ -85,7 +199,7 @@ BOOL LLSidepanelInventory::postBuild()
mOverflowBtn = mInventoryPanel->getChild<LLButton>("overflow_btn");
mOverflowBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onOverflowButtonClicked, this));
- mPanelMainInventory = mInventoryPanel->findChild<LLPanelMainInventory>("panel_main_inventory");
+ mPanelMainInventory = mInventoryPanel->getChild<LLPanelMainInventory>("panel_main_inventory");
mPanelMainInventory->setSelectCallback(boost::bind(&LLSidepanelInventory::onSelectionChange, this, _1, _2));
LLTabContainer* tabs = mPanelMainInventory->getChild<LLTabContainer>("inventory filter tabs");
tabs->setCommitCallback(boost::bind(&LLSidepanelInventory::updateVerbs, this));
@@ -103,7 +217,7 @@ BOOL LLSidepanelInventory::postBuild()
// UI elements from item panel
{
- mItemPanel = findChild<LLSidepanelItemInfo>("sidepanel__item_panel");
+ mItemPanel = getChild<LLSidepanelItemInfo>("sidepanel__item_panel");
LLButton* back_btn = mItemPanel->getChild<LLButton>("back_btn");
back_btn->setClickedCallback(boost::bind(&LLSidepanelInventory::onBackButtonClicked, this));
@@ -119,13 +233,263 @@ BOOL LLSidepanelInventory::postBuild()
}
}
+ // Marketplace inbox/outbox setup
+ {
+ LLLayoutStack* stack = getChild<LLLayoutStack>(INVENTORY_LAYOUT_STACK_NAME);
+
+ // Disable user_resize on main inventory panel by default
+ stack->setPanelUserResize(MAIN_INVENTORY_LAYOUT_PANEL_NAME, false);
+ stack->setPanelUserResize(INBOX_LAYOUT_PANEL_NAME, false);
+ stack->setPanelUserResize(OUTBOX_LAYOUT_PANEL_NAME, false);
+
+ // Collapse both inbox and outbox panels
+ stack->collapsePanel(getChild<LLLayoutPanel>(INBOX_LAYOUT_PANEL_NAME), true);
+ stack->collapsePanel(getChild<LLLayoutPanel>(OUTBOX_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)
+ 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));
+ }
+
+ gSavedSettings.getControl("InventoryDisplayInbox")->getCommitSignal()->connect(boost::bind(&handleInventoryDisplayInboxChanged));
+ gSavedSettings.getControl("InventoryDisplayOutbox")->getCommitSignal()->connect(boost::bind(&handleInventoryDisplayOutboxChanged));
+
return TRUE;
}
+void LLSidepanelInventory::handleLoginComplete()
+{
+ //
+ // Track inbox and outbox 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())
+ {
+ observeInboxOutboxCreation();
+ }
+
+ // Set up observer for inbox changes, if we have an inbox already
+ if (!inbox_id.isNull())
+ {
+ observeInboxModifications(inbox_id);
+
+ // Enable the display of the inbox if it exists
+ enableInbox(true);
+ }
+
+ // 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);
+ // leslie NOTE: Disabling outbox until we support it officially.
+ }
+}
+
+void LLSidepanelInventory::observeInboxOutboxCreation()
+{
+ //
+ // Set up observer to track inbox and outbox folder creation
+ //
+
+ if (mInboxOutboxAddedObserver == NULL)
+ {
+ mInboxOutboxAddedObserver = new LLInboxOutboxAddedObserver(this);
+
+ gInventory.addObserver(mInboxOutboxAddedObserver);
+ }
+}
+
+void LLSidepanelInventory::observeInboxModifications(const LLUUID& inboxID)
+{
+ //
+ // Track inbox and outbox folder changes
+ //
+
+ if (inboxID.isNull())
+ {
+ llwarns << "Attempting to track modifications to non-existant 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);
+ 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);
+ outbox->setupInventoryPanel();
+}
+
+void LLSidepanelInventory::enableInbox(bool enabled)
+{
+ mInboxEnabled = enabled;
+ getChild<LLLayoutPanel>(INBOX_LAYOUT_PANEL_NAME)->setVisible(enabled);
+}
+
+void LLSidepanelInventory::enableOutbox(bool enabled)
+{
+ mOutboxEnabled = enabled;
+ getChild<LLLayoutPanel>(OUTBOX_LAYOUT_PANEL_NAME)->setVisible(enabled);
+}
+
+void LLSidepanelInventory::onInboxChanged(const LLUUID& inbox_id)
+{
+ // Trigger a load of the entire inbox so we always know the contents and their creation dates for sorting
+ LLInventoryModelBackgroundFetch::instance().start(inbox_id);
+
+ // Expand the inbox since we have fresh items
+ LLPanelMarketplaceInbox * inbox = findChild<LLPanelMarketplaceInbox>(MARKETPLACE_INBOX_PANEL);
+ if (inbox && (inbox->getFreshItemCount() > 0))
+ {
+ getChild<LLButton>(INBOX_BUTTON_NAME)->setToggleState(true);
+ onToggleInboxBtn();
+ }
+}
+
+void LLSidepanelInventory::onOutboxChanged(const LLUUID& outbox_id)
+{
+ // Perhaps use this to track outbox changes?
+}
+
+bool manageInboxOutboxPanels(LLLayoutStack * stack,
+ LLButton * pressedButton, LLLayoutPanel * pressedPanel,
+ LLButton * otherButton, LLLayoutPanel * otherPanel)
+{
+ bool expand = pressedButton->getToggleState();
+ bool otherExpanded = otherButton->getToggleState();
+
+ //
+ // NOTE: Ideally we could have two panel sizes stored for a collapsed and expanded minimum size.
+ // For now, leave this code disabled because it creates some bad artifacts when expanding
+ // and collapsing the inbox/outbox.
+ //
+ //S32 smallMinSize = (expand ? pressedPanel->getMinDim() : otherPanel->getMinDim());
+ //S32 pressedMinSize = (expand ? 2 * smallMinSize : smallMinSize);
+ //otherPanel->setMinDim(smallMinSize);
+ //pressedPanel->setMinDim(pressedMinSize);
+
+ 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());
+
+ stack->collapsePanel(otherPanel, true);
+ otherButton->setToggleState(false);
+ }
+
+ stack->collapsePanel(pressedPanel, !expand);
+
+ // Enable user_resize on main inventory panel only when a marketplace box is expanded
+ stack->setPanelUserResize(MAIN_INVENTORY_LAYOUT_PANEL_NAME, expand);
+
+ return expand;
+}
+
+void LLSidepanelInventory::onToggleInboxBtn()
+{
+ LLLayoutStack* stack = getChild<LLLayoutStack>(INVENTORY_LAYOUT_STACK_NAME);
+ LLButton* pressedButton = getChild<LLButton>(INBOX_BUTTON_NAME);
+ LLLayoutPanel* pressedPanel = getChild<LLLayoutPanel>(INBOX_LAYOUT_PANEL_NAME);
+ LLButton* otherButton = getChild<LLButton>(OUTBOX_BUTTON_NAME);
+ LLLayoutPanel* otherPanel = getChild<LLLayoutPanel>(OUTBOX_LAYOUT_PANEL_NAME);
+
+ bool inboxExpanded = manageInboxOutboxPanels(stack, pressedButton, pressedPanel, otherButton, otherPanel);
+
+ if (inboxExpanded)
+ {
+ // Save current time as a setting for future new-ness tests
+ gSavedSettings.setString(INBOX_EXPAND_TIME_SETTING, LLDate::now().asString());
+ }
+}
+
+void LLSidepanelInventory::onToggleOutboxBtn()
+{
+ LLLayoutStack* stack = getChild<LLLayoutStack>(INVENTORY_LAYOUT_STACK_NAME);
+ LLButton* pressedButton = getChild<LLButton>(OUTBOX_BUTTON_NAME);
+ LLLayoutPanel* pressedPanel = getChild<LLLayoutPanel>(OUTBOX_LAYOUT_PANEL_NAME);
+ LLButton* otherButton = getChild<LLButton>(INBOX_BUTTON_NAME);
+ LLLayoutPanel* otherPanel = getChild<LLLayoutPanel>(INBOX_LAYOUT_PANEL_NAME);
+
+ manageInboxOutboxPanels(stack, pressedButton, pressedPanel, otherButton, otherPanel);
+}
+
void LLSidepanelInventory::onOpen(const LLSD& key)
{
LLFirstUse::newInventory(false);
+ // Expand the inbox if we have fresh items
+ LLPanelMarketplaceInbox * inbox = findChild<LLPanelMarketplaceInbox>(MARKETPLACE_INBOX_PANEL);
+ if (inbox && (inbox->getFreshItemCount() > 0))
+ {
+ getChild<LLButton>(INBOX_BUTTON_NAME)->setToggleState(true);
+ onToggleInboxBtn();
+ }
+
if(key.size() == 0)
return;
@@ -171,26 +535,29 @@ void LLSidepanelInventory::onShopButtonClicked()
void LLSidepanelInventory::performActionOnSelection(const std::string &action)
{
- LLPanelMainInventory *panel_main_inventory = mInventoryPanel->findChild<LLPanelMainInventory>("panel_main_inventory");
+ LLPanelMainInventory *panel_main_inventory = mInventoryPanel->getChild<LLPanelMainInventory>("panel_main_inventory");
LLFolderViewItem* current_item = panel_main_inventory->getActivePanel()->getRootFolder()->getCurSelectedItem();
if (!current_item)
{
- return;
+ LLInventoryPanel* inbox = findChild<LLInventoryPanel>("inventory_inbox");
+ if (inbox)
+ {
+ current_item = inbox->getRootFolder()->getCurSelectedItem();
+ }
+
+ if (!current_item)
+ {
+ return;
+ }
}
+
current_item->getListener()->performAction(panel_main_inventory->getActivePanel()->getModel(), action);
}
void LLSidepanelInventory::onWearButtonClicked()
{
- LLPanelMainInventory *panel_main_inventory = mInventoryPanel->findChild<LLPanelMainInventory>("panel_main_inventory");
- if (!panel_main_inventory)
- {
- llassert(panel_main_inventory != NULL);
- return;
- }
-
// Get selected items set.
- const std::set<LLUUID> selected_uuids_set = panel_main_inventory->getActivePanel()->getRootFolder()->getSelectionList();
+ const std::set<LLUUID> selected_uuids_set = LLAvatarActions::getInventorySelectedUUIDs();
if (selected_uuids_set.empty()) return; // nothing selected
// Convert the set to a vector.
@@ -329,31 +696,28 @@ bool LLSidepanelInventory::canShare()
LLPanelMainInventory* panel_main_inventory =
mInventoryPanel->findChild<LLPanelMainInventory>("panel_main_inventory");
- if (!panel_main_inventory)
+ LLInventoryPanel* inbox = findChild<LLInventoryPanel>("inventory_inbox");
+
+ // Avoid flicker in the Recent tab while inventory is being loaded.
+ if ( (!inbox || inbox->getRootFolder()->getSelectionList().empty())
+ && (panel_main_inventory && !panel_main_inventory->getActivePanel()->getRootFolder()->hasVisibleChildren()) )
{
- llwarns << "Failed to get the main inventory panel" << llendl;
return false;
}
- LLInventoryPanel* active_panel = panel_main_inventory->getActivePanel();
- // Avoid flicker in the Recent tab while inventory is being loaded.
- if (!active_panel->getRootFolder()->hasVisibleChildren()) return false;
-
- return LLAvatarActions::canShareSelectedItems(active_panel);
+ return ( (panel_main_inventory ? LLAvatarActions::canShareSelectedItems(panel_main_inventory->getActivePanel()) : false)
+ || (inbox ? LLAvatarActions::canShareSelectedItems(inbox) : false) );
}
+
bool LLSidepanelInventory::canWearSelected()
{
- LLPanelMainInventory* panel_main_inventory =
- mInventoryPanel->findChild<LLPanelMainInventory>("panel_main_inventory");
- if (!panel_main_inventory)
- {
- llassert(panel_main_inventory != NULL);
+ std::set<LLUUID> selected_uuids = LLAvatarActions::getInventorySelectedUUIDs();
+
+ if (selected_uuids.empty())
return false;
- }
- std::set<LLUUID> selected_uuids = panel_main_inventory->getActivePanel()->getRootFolder()->getSelectionList();
for (std::set<LLUUID>::const_iterator it = selected_uuids.begin();
it != selected_uuids.end();
++it)
@@ -366,11 +730,20 @@ bool LLSidepanelInventory::canWearSelected()
LLInventoryItem *LLSidepanelInventory::getSelectedItem()
{
- LLPanelMainInventory *panel_main_inventory = mInventoryPanel->findChild<LLPanelMainInventory>("panel_main_inventory");
+ LLPanelMainInventory *panel_main_inventory = mInventoryPanel->getChild<LLPanelMainInventory>("panel_main_inventory");
LLFolderViewItem* current_item = panel_main_inventory->getActivePanel()->getRootFolder()->getCurSelectedItem();
if (!current_item)
{
- return NULL;
+ LLInventoryPanel* inbox = findChild<LLInventoryPanel>("inventory_inbox");
+ if (inbox)
+ {
+ current_item = inbox->getRootFolder()->getCurSelectedItem();
+ }
+
+ if (!current_item)
+ {
+ return NULL;
+ }
}
const LLUUID &item_id = current_item->getListener()->getUUID();
LLInventoryItem *item = gInventory.getItem(item_id);
@@ -379,9 +752,20 @@ LLInventoryItem *LLSidepanelInventory::getSelectedItem()
U32 LLSidepanelInventory::getSelectedCount()
{
- LLPanelMainInventory *panel_main_inventory = mInventoryPanel->findChild<LLPanelMainInventory>("panel_main_inventory");
+ int count = 0;
+
+ LLPanelMainInventory *panel_main_inventory = mInventoryPanel->getChild<LLPanelMainInventory>("panel_main_inventory");
std::set<LLUUID> selection_list = panel_main_inventory->getActivePanel()->getRootFolder()->getSelectionList();
- return selection_list.size();
+ count += selection_list.size();
+
+ LLInventoryPanel* inbox = findChild<LLInventoryPanel>("inventory_inbox");
+ if (inbox)
+ {
+ selection_list = inbox->getRootFolder()->getSelectionList();
+ count += selection_list.size();
+ }
+
+ return count;
}
LLInventoryPanel *LLSidepanelInventory::getActivePanel()
diff --git a/indra/newview/llsidepanelinventory.h b/indra/newview/llsidepanelinventory.h
index 32c98bc034..9117e3bf27 100644
--- a/indra/newview/llsidepanelinventory.h
+++ b/indra/newview/llsidepanelinventory.h
@@ -30,6 +30,8 @@
#include "llpanel.h"
class LLFolderViewItem;
+class LLInboxOutboxAddedObserver;
+class LLInventoryCategoriesObserver;
class LLInventoryItem;
class LLInventoryPanel;
class LLPanelMainInventory;
@@ -42,6 +44,14 @@ public:
LLSidepanelInventory();
virtual ~LLSidepanelInventory();
+private:
+ void handleLoginComplete();
+
+public:
+ void observeInboxOutboxCreation();
+ void observeInboxModifications(const LLUUID& inboxID);
+ void observeOutboxModifications(const LLUUID& outboxID);
+
/*virtual*/ BOOL postBuild();
/*virtual*/ void onOpen(const LLSD& key);
@@ -56,6 +66,17 @@ public:
// checks can share selected item(s)
bool canShare();
+ void onToggleInboxBtn();
+ void onToggleOutboxBtn();
+
+ void enableInbox(bool enabled);
+ void enableOutbox(bool enabled);
+
+ bool isInboxEnabled() const { return mInboxEnabled; }
+ bool isOutboxEnabled() const { return mOutboxEnabled; }
+
+ void updateVerbs();
+
protected:
// Tracks highlighted (selected) item in inventory panel.
LLInventoryItem *getSelectedItem();
@@ -63,10 +84,12 @@ protected:
void onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action);
// "wear", "teleport", etc.
void performActionOnSelection(const std::string &action);
- void updateVerbs();
bool canWearSelected(); // check whether selected items can be worn
+ void onInboxChanged(const LLUUID& inbox_id);
+ void onOutboxChanged(const LLUUID& outbox_id);
+
//
// UI Elements
//
@@ -85,6 +108,7 @@ protected:
void onTeleportButtonClicked();
void onOverflowButtonClicked();
void onBackButtonClicked();
+
private:
LLButton* mInfoBtn;
LLButton* mShareBtn;
@@ -94,6 +118,11 @@ private:
LLButton* mOverflowBtn;
LLButton* mShopBtn;
+ bool mInboxEnabled;
+ bool mOutboxEnabled;
+
+ LLInventoryCategoriesObserver* mCategoriesObserver;
+ LLInboxOutboxAddedObserver* mInboxOutboxAddedObserver;
};
#endif //LL_LLSIDEPANELINVENTORY_H
diff --git a/indra/newview/llsidepanelinventorysubpanel.cpp b/indra/newview/llsidepanelinventorysubpanel.cpp
index 37b10b592f..2918bb388a 100644
--- a/indra/newview/llsidepanelinventorysubpanel.cpp
+++ b/indra/newview/llsidepanelinventorysubpanel.cpp
@@ -46,8 +46,8 @@
///----------------------------------------------------------------------------
// Default constructor
-LLSidepanelInventorySubpanel::LLSidepanelInventorySubpanel()
- : LLPanel(),
+LLSidepanelInventorySubpanel::LLSidepanelInventorySubpanel(const LLPanel::Params& p)
+ : LLPanel(p),
mIsDirty(TRUE),
mIsEditing(FALSE),
mCancelBtn(NULL),
diff --git a/indra/newview/llsidepanelinventorysubpanel.h b/indra/newview/llsidepanelinventorysubpanel.h
index b2de7d3b0b..b5cf3aaf17 100644
--- a/indra/newview/llsidepanelinventorysubpanel.h
+++ b/indra/newview/llsidepanelinventorysubpanel.h
@@ -40,7 +40,7 @@ class LLInventoryItem;
class LLSidepanelInventorySubpanel : public LLPanel
{
public:
- LLSidepanelInventorySubpanel();
+ LLSidepanelInventorySubpanel(const LLPanel::Params& p = getDefaultParams());
virtual ~LLSidepanelInventorySubpanel();
/*virtual*/ void setVisible(BOOL visible);
diff --git a/indra/newview/llsidepaneliteminfo.cpp b/indra/newview/llsidepaneliteminfo.cpp
index fbd2f7ca83..1ce05da849 100644
--- a/indra/newview/llsidepaneliteminfo.cpp
+++ b/indra/newview/llsidepaneliteminfo.cpp
@@ -130,9 +130,10 @@ void LLObjectInventoryObserver::inventoryChanged(LLViewerObject* object,
static LLRegisterPanelClassWrapper<LLSidepanelItemInfo> t_item_info("sidepanel_item_info");
// Default constructor
-LLSidepanelItemInfo::LLSidepanelItemInfo()
- : mItemID(LLUUID::null)
- , mObjectInventoryObserver(NULL)
+LLSidepanelItemInfo::LLSidepanelItemInfo(const LLPanel::Params& p)
+ : LLSidepanelInventorySubpanel(p)
+ , mItemID(LLUUID::null)
+ , mObjectInventoryObserver(NULL)
{
mPropertiesObserver = new LLItemPropertiesObserver(this);
}
diff --git a/indra/newview/llsidepaneliteminfo.h b/indra/newview/llsidepaneliteminfo.h
index 25be145f64..12aaca923e 100644
--- a/indra/newview/llsidepaneliteminfo.h
+++ b/indra/newview/llsidepaneliteminfo.h
@@ -44,7 +44,7 @@ class LLPermissions;
class LLSidepanelItemInfo : public LLSidepanelInventorySubpanel
{
public:
- LLSidepanelItemInfo();
+ LLSidepanelItemInfo(const LLPanel::Params& p = getDefaultParams());
virtual ~LLSidepanelItemInfo();
/*virtual*/ BOOL postBuild();
diff --git a/indra/newview/llsidetray.cpp b/indra/newview/llsidetray.cpp
index 631b244785..651897a217 100644
--- a/indra/newview/llsidetray.cpp
+++ b/indra/newview/llsidetray.cpp
@@ -30,6 +30,7 @@
#include "llagentcamera.h"
#include "llappviewer.h"
+#include "llbadge.h"
#include "llbottomtray.h"
#include "llfloaterreg.h"
#include "llfirstuse.h"
@@ -40,6 +41,7 @@
#include "llfocusmgr.h"
#include "llrootview.h"
#include "llnavigationbar.h"
+#include "llpanelmarketplaceinbox.h"
#include "llaccordionctrltab.h"
@@ -113,11 +115,14 @@ public:
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")
+ description("description","no description"),
+ badge("badge")
{};
};
protected:
@@ -140,7 +145,6 @@ public:
static LLSideTrayTab* createInstance ();
const std::string& getDescription () const { return mDescription;}
- const std::string& getTabTitle() const { return mTabTitle;}
void onOpen (const LLSD& key);
@@ -150,7 +154,10 @@ public:
BOOL handleScrollWheel(S32 x, S32 y, S32 clicks);
- LLPanel *getPanel();
+ LLPanel* getPanel();
+
+ LLButton* createButton(bool allowTearOff, LLUICtrl::commit_callback_t callback);
+
private:
std::string mTabTitle;
std::string mImage;
@@ -158,6 +165,9 @@ private:
std::string mDescription;
LLView* mMainPanel;
+
+ bool mHasBadge;
+ LLBadge::Params mBadgeParams;
};
LLSideTrayTab::LLSideTrayTab(const Params& p)
@@ -166,8 +176,10 @@ LLSideTrayTab::LLSideTrayTab(const Params& p)
mImage(p.image),
mImageSelected(p.image_selected),
mDescription(p.description),
- mMainPanel(NULL)
+ mMainPanel(NULL),
+ mBadgeParams(p.badge)
{
+ mHasBadge = p.badge.isProvided();
}
LLSideTrayTab::~LLSideTrayTab()
@@ -182,8 +194,6 @@ bool LLSideTrayTab::addChild(LLView* view, S32 tab_group)
//return res;
}
-
-
//virtual
BOOL LLSideTrayTab::postBuild()
{
@@ -196,7 +206,7 @@ BOOL LLSideTrayTab::postBuild()
getChild<LLButton>("undock")->setCommitCallback(boost::bind(&LLSideTrayTab::setDocked, this, false));
getChild<LLButton>("dock")->setCommitCallback(boost::bind(&LLSideTrayTab::setDocked, this, true));
- return true;
+ return LLPanel::postBuild();
}
static const S32 splitter_margin = 1;
@@ -523,18 +533,36 @@ public:
return FALSE;
}
+ void setBadgeDriver(LLSideTrayTabBadgeDriver* driver)
+ {
+ mBadgeDriver = driver;
+ }
+
protected:
LLSideTrayButton(const LLButton::Params& p)
- : LLButton(p)
- , mDragLastScreenX(0)
- , mDragLastScreenY(0)
+ : LLButton(p)
+ , mDragLastScreenX(0)
+ , mDragLastScreenY(0)
+ , mBadgeDriver(NULL)
{}
friend class LLUICtrlFactory;
+ void draw()
+ {
+ if (mBadgeDriver)
+ {
+ setBadgeLabel(mBadgeDriver->getBadgeString());
+ }
+
+ LLButton::draw();
+ }
+
private:
S32 mDragLastScreenX;
S32 mDragLastScreenY;
+
+ LLSideTrayTabBadgeDriver* mBadgeDriver;
};
//////////////////////////////////////////////////////////////////////////////
@@ -615,11 +643,31 @@ BOOL LLSideTray::postBuild()
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();
}
@@ -766,51 +814,6 @@ bool LLSideTray::selectTabByName(const std::string& name, bool keep_prev_visible
return true;
}
-LLButton* LLSideTray::createButton (const std::string& name,const std::string& image,const std::string& tooltip,
- LLUICtrl::commit_callback_t callback)
-{
- static LLSideTray::Params sidetray_params(LLUICtrlFactory::getDefaultParams<LLSideTray>());
-
- LLButton::Params bparams;
-
- LLRect rect;
- rect.setOriginAndSize(0, 0, sidetray_params.default_button_width, sidetray_params.default_button_height);
-
- bparams.name(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);
-
- LLButton* button;
- if (name == "sidebar_openclose")
- {
- // "Open/Close" button shouldn't allow "tear off"
- // hence it is created as LLButton instance.
- button = LLUICtrlFactory::create<LLButton>(bparams);
- }
- else
- {
- button = LLUICtrlFactory::create<LLSideTrayButton>(bparams);
- }
-
- button->setClickedCallback(callback);
-
- button->setToolTip(tooltip);
-
- if(image.length())
- {
- button->setImageOverlay(image);
- }
-
- mButtonsPanel->addChildInBack(button);
-
- return button;
-}
-
bool LLSideTray::addChild(LLView* view, S32 tab_group)
{
LLSideTrayTab* tab_panel = dynamic_cast<LLSideTrayTab*>(view);
@@ -938,7 +941,56 @@ bool LLSideTray::addTab(LLSideTrayTab* tab)
return true;
}
-void LLSideTray::createButtons ()
+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)
+ {
+ button = LLUICtrlFactory::create<LLSideTrayButton>(bparams);
+ }
+ 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();
@@ -951,17 +1003,22 @@ void LLSideTray::createButtons ()
// The "OpenClose" button will open/close the whole panel
if (name == "sidebar_openclose")
{
- mCollapseButton = createButton(name,sidebar_tab->mImage,sidebar_tab->getTabTitle(),
- boost::bind(&LLSideTray::onToggleCollapse, this));
+ mCollapseButton = sidebar_tab->createButton(false, boost::bind(&LLSideTray::onToggleCollapse, this));
+
+ mButtonsPanel->addChildInBack(mCollapseButton);
+
LLHints::registerHintTarget("side_panel_btn", mCollapseButton->getHandle());
}
else
{
- LLButton* button = createButton(name,sidebar_tab->mImage,sidebar_tab->getTabTitle(),
- boost::bind(&LLSideTray::onTabButtonClick, this, name));
+ 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());
}
diff --git a/indra/newview/llsidetray.h b/indra/newview/llsidetray.h
index 24882411f4..17158329dc 100644
--- a/indra/newview/llsidetray.h
+++ b/indra/newview/llsidetray.h
@@ -33,6 +33,13 @@
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; }
@@ -166,6 +173,8 @@ public:
bool getCollapsed() { return mCollapsed; }
+ void setTabButtonBadgeDriver(std::string tabName, LLSideTrayTabBadgeDriver* driver);
+
public:
virtual ~LLSideTray(){};
@@ -204,8 +213,6 @@ protected:
void createButtons ();
- LLButton* createButton (const std::string& name,const std::string& image,const std::string& tooltip,
- LLUICtrl::commit_callback_t callback);
void arrange ();
void detachTabs ();
void reflectCollapseChange();
@@ -234,6 +241,8 @@ private:
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;
diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp
index e521177f8e..8eca632a70 100644
--- a/indra/newview/llspatialpartition.cpp
+++ b/indra/newview/llspatialpartition.cpp
@@ -35,6 +35,7 @@
#include "llvolumeoctree.h"
#include "llviewercamera.h"
#include "llface.h"
+#include "llfloatertools.h"
#include "llviewercontrol.h"
#include "llviewerregion.h"
#include "llcamera.h"
@@ -69,6 +70,7 @@ U32 LLSpatialGroup::sNodeCount = 0;
std::set<GLuint> LLSpatialGroup::sPendingQueries;
+U32 gOctreeMaxCapacity;
BOOL LLSpatialGroup::sNoDelete = FALSE;
@@ -630,7 +632,7 @@ BOOL LLSpatialGroup::updateInGroup(LLDrawable *drawablep, BOOL immediate)
if (mOctreeNode->isInside(drawablep->getPositionGroup()) &&
(mOctreeNode->contains(drawablep) ||
(drawablep->getBinRadius() > mOctreeNode->getSize()[0] &&
- parent && parent->getElementCount() >= LL_OCTREE_MAX_CAPACITY)))
+ parent && parent->getElementCount() >= gOctreeMaxCapacity)))
{
unbound();
setState(OBJECT_DIRTY);
@@ -689,17 +691,8 @@ static LLFastTimer::DeclareTimer FTM_REBUILD_VBO("VBO Rebuilt");
void LLSpatialPartition::rebuildGeom(LLSpatialGroup* group)
{
- /*if (!gPipeline.hasRenderType(mDrawableType))
- {
- return;
- }*/
-
if (group->isDead() || !group->isState(LLSpatialGroup::GEOM_DIRTY))
{
- /*if (!group->isState(LLSpatialGroup::GEOM_DIRTY) && mRenderByGroup)
- {
- llerrs << "WTF?" << llendl;
- }*/
return;
}
@@ -961,21 +954,15 @@ void LLSpatialGroup::setState(U32 state)
{
mState |= state;
- if (state > LLSpatialGroup::STATE_MASK)
- {
- llerrs << "WTF?" << llendl;
- }
+ llassert(state <= LLSpatialGroup::STATE_MASK);
}
void LLSpatialGroup::setState(U32 state, S32 mode)
{
LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
- if (state > LLSpatialGroup::STATE_MASK)
- {
- llerrs << "WTF?" << llendl;
- }
-
+ llassert(state <= LLSpatialGroup::STATE_MASK);
+
if (mode > STATE_MODE_SINGLE)
{
if (mode == STATE_MODE_DIFF)
@@ -1021,20 +1008,14 @@ public:
void LLSpatialGroup::clearState(U32 state)
{
- if (state > LLSpatialGroup::STATE_MASK)
- {
- llerrs << "WTF?" << llendl;
- }
+ llassert(state <= LLSpatialGroup::STATE_MASK);
mState &= ~state;
}
void LLSpatialGroup::clearState(U32 state, S32 mode)
{
- if (state > LLSpatialGroup::STATE_MASK)
- {
- llerrs << "WTF?" << llendl;
- }
+ llassert(state <= LLSpatialGroup::STATE_MASK);
LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
@@ -1059,10 +1040,7 @@ void LLSpatialGroup::clearState(U32 state, S32 mode)
BOOL LLSpatialGroup::isState(U32 state) const
{
- if (state > LLSpatialGroup::STATE_MASK)
- {
- llerrs << "WTF?" << llendl;
- }
+ llassert(state <= LLSpatialGroup::STATE_MASK);
return mState & state ? TRUE : FALSE;
}
@@ -1250,7 +1228,8 @@ void LLSpatialGroup::updateDistance(LLCamera &camera)
{
if (LLViewerCamera::sCurCameraID != LLViewerCamera::CAMERA_WORLD)
{
- llerrs << "WTF?" << llendl;
+ llwarns << "Attempted to update distance for camera other than world camera!" << llendl;
+ return;
}
#if !LL_RELEASE_FOR_DOWNLOAD
@@ -2064,11 +2043,8 @@ public:
virtual void processGroup(LLSpatialGroup* group)
{
- if (group->isState(LLSpatialGroup::DIRTY) || group->getData().empty())
- {
- llerrs << "WTF?" << llendl;
- }
-
+ llassert(!group->isState(LLSpatialGroup::DIRTY) && !group->getData().empty())
+
if (mRes < 2)
{
if (mCamera->AABBInFrustum(group->mObjectBounds[0], group->mObjectBounds[1]) > 0)
@@ -2541,7 +2517,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)
@@ -2610,7 +2586,7 @@ void renderOctree(LLSpatialGroup* group)
gGL.color4f(1,1,1,1);
}
}
- else
+ else*/
{
if (group->mBufferUsage == GL_STATIC_DRAW_ARB && !group->getData().empty()
&& group->mSpatialPartition->mRenderByGroup)
@@ -2630,33 +2606,24 @@ void renderOctree(LLSpatialGroup* group)
size.mul(1.01f);
size.add(fudge);
- {
- LLGLDepthTest depth(GL_TRUE, GL_FALSE);
- drawBox(group->mObjectBounds[0], fudge);
- }
+ //{
+ // LLGLDepthTest depth(GL_TRUE, GL_FALSE);
+ // drawBox(group->mObjectBounds[0], fudge);
+ //}
gGL.setSceneBlendType(LLRender::BT_ALPHA);
- if (group->mBuilt <= 0.f)
+ //if (group->mBuilt <= 0.f)
{
//draw opaque outline
- gGL.color4f(col.mV[0], col.mV[1], col.mV[2], 1.f);
- drawBoxOutline(group->mObjectBounds[0], group->mObjectBounds[1]);
+ //gGL.color4f(col.mV[0], col.mV[1], col.mV[2], 1.f);
+ //drawBoxOutline(group->mObjectBounds[0], group->mObjectBounds[1]);
- if (group->mOctreeNode->isLeaf())
- {
- gGL.color4f(1,1,1,1);
- }
- else
- {
- gGL.color4f(0,1,1,1);
- }
-
+ gGL.color4f(0,1,1,1);
drawBoxOutline(group->mBounds[0],group->mBounds[1]);
-
-
+
//draw bounding box for draw info
- if (group->mSpatialPartition->mRenderByGroup)
+ /*if (group->mSpatialPartition->mRenderByGroup)
{
gGL.color4f(1.0f, 0.75f, 0.25f, 0.6f);
for (LLSpatialGroup::draw_map_t::iterator i = group->mDrawMap.begin(); i != group->mDrawMap.end(); ++i)
@@ -2673,7 +2640,7 @@ void renderOctree(LLSpatialGroup* group)
drawBoxOutline(center, size);
}
}
- }
+ }*/
}
// LLSpatialGroup::OctreeNode* node = group->mOctreeNode;
@@ -2716,7 +2683,7 @@ void renderVisibility(LLSpatialGroup* group, LLCamera* camera)
gGL.color4f(0.f, 0.75f, 0.f, 0.5f);
pushBufferVerts(group, LLVertexBuffer::MAP_VERTEX);
}
- else if (camera && group->mOcclusionVerts.notNull())
+ /*else if (camera && group->mOcclusionVerts.notNull())
{
LLVertexBuffer::unbind();
group->mOcclusionVerts->setBuffer(LLVertexBuffer::MAP_VERTEX);
@@ -2728,7 +2695,7 @@ void renderVisibility(LLSpatialGroup* group, LLCamera* camera)
glColor4f(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);
- }
+ }*/
}
}
@@ -2927,7 +2894,7 @@ void renderBoundingBox(LLDrawable* drawable, BOOL set_color = TRUE)
gGL.color4f(0,1,1,1);
break;
case LLViewerObject::LL_VO_CLOUDS:
- gGL.color4f(0.5f,0.5f,0.5f,1.0f);
+ // no longer used
break;
case LLViewerObject::LL_VO_PART_GROUP:
case LLViewerObject::LL_VO_HUD_PART_GROUP:
@@ -3111,13 +3078,6 @@ void render_hull(LLModel::PhysicsMesh& mesh, const LLColor4& color, const LLColo
void renderPhysicsShape(LLDrawable* drawable, LLVOVolume* volume)
{
- if (volume->isSelected())
- {
- LLVector3 construct_me(5,5,5);
- construct_me.normalize();
- }
-
-
U8 physics_type = volume->getPhysicsShapeType();
if (physics_type == LLViewerObject::PHYSICS_SHAPE_NONE || volume->isFlexible())
@@ -3582,6 +3542,8 @@ void renderTextureAnim(LLDrawInfo* params)
void renderBatchSize(LLDrawInfo* params)
{
+ LLGLEnable offset(GL_POLYGON_OFFSET_FILL);
+ glPolygonOffset(-1.f, 1.f);
glColor3ubv((GLubyte*) &(params->mDebugColor));
pushVerts(params, LLVertexBuffer::MAP_VERTEX);
}
@@ -4023,6 +3985,28 @@ public:
renderAgentTarget(avatar);
}
+ if (gDebugGL)
+ {
+ for (U32 i = 0; i < drawable->getNumFaces(); ++i)
+ {
+ LLFace* facep = drawable->getFace(i);
+ U8 index = facep->getTextureIndex();
+ if (facep->mDrawInfo)
+ {
+ if (index < 255)
+ {
+ if (facep->mDrawInfo->mTextureList.size() <= index)
+ {
+ llerrs << "Face texture index out of bounds." << llendl;
+ }
+ else if (facep->mDrawInfo->mTextureList[index] != facep->getTexture())
+ {
+ llerrs << "Face texture index incorrect." << llendl;
+ }
+ }
+ }
+ }
+ }
}
for (LLSpatialGroup::draw_map_t::iterator i = group->mDrawMap.begin(); i != group->mDrawMap.end(); ++i)
@@ -4396,7 +4380,29 @@ public:
if (vobj)
{
LLVector3 intersection;
- if (vobj->lineSegmentIntersect(mStart, mEnd, -1, mPickTransparent, mFaceHit, &intersection, mTexCoord, mNormal, mBinormal))
+ bool skip_check = false;
+ if (vobj->isAvatar())
+ {
+ LLVOAvatar* avatar = (LLVOAvatar*) vobj;
+ if (avatar->isSelf() && LLFloater::isVisible(gFloaterTools))
+ {
+ LLViewerObject* hit = avatar->lineSegmentIntersectRiggedAttachments(mStart, mEnd, -1, mPickTransparent, mFaceHit, &intersection, mTexCoord, mNormal, mBinormal);
+ if (hit)
+ {
+ mEnd = intersection;
+ if (mIntersection)
+ {
+ *mIntersection = intersection;
+ }
+
+ mHit = hit->mDrawable;
+ skip_check = true;
+ }
+
+ }
+ }
+
+ if (!skip_check && vobj->lineSegmentIntersect(mStart, mEnd, -1, mPickTransparent, mFaceHit, &intersection, mTexCoord, mNormal, mBinormal))
{
mEnd = intersection; // shorten ray so we only find CLOSER hits
if (mIntersection)
diff --git a/indra/newview/llspatialpartition.h b/indra/newview/llspatialpartition.h
index 0d9cad914a..54d5d36f6e 100644
--- a/indra/newview/llspatialpartition.h
+++ b/indra/newview/llspatialpartition.h
@@ -91,6 +91,8 @@ public:
LLPointer<LLVertexBuffer> mVertexBuffer;
LLPointer<LLViewerTexture> mTexture;
+ std::vector<LLPointer<LLViewerTexture> > mTextureList;
+
LLColor4U mGlowColor;
S32 mDebugColor;
const LLMatrix4* mTextureMatrix;
@@ -207,7 +209,7 @@ public:
typedef std::vector<LLPointer<LLDrawInfo> > drawmap_elem_t;
typedef std::map<U32, drawmap_elem_t > draw_map_t;
typedef std::vector<LLPointer<LLVertexBuffer> > buffer_list_t;
- typedef std::map<LLPointer<LLViewerTexture>, buffer_list_t> buffer_texture_map_t;
+ typedef std::map<LLFace*, buffer_list_t> buffer_texture_map_t;
typedef std::map<U32, buffer_texture_map_t> buffer_map_t;
typedef LLOctreeListener<LLDrawable> BaseType;
@@ -399,7 +401,7 @@ protected:
public:
bridge_list_t mBridgeList;
- buffer_map_t mBufferMap; //used by volume buffers to store unique buffers per texture
+ buffer_map_t mBufferMap; //used by volume buffers to attempt to reuse vertex buffers
F32 mBuilt;
OctreeNode* mOctreeNode;
@@ -662,13 +664,6 @@ public:
LLGrassPartition();
};
-//spatial partition for clouds (implemented in LLVOClouds.cpp)
-class LLCloudPartition : public LLParticlePartition
-{
-public:
- LLCloudPartition();
-};
-
//class for wrangling geometry out of volumes (implemented in LLVOVolume.cpp)
class LLVolumeGeometryManager: public LLGeometryManager
{
@@ -684,7 +679,7 @@ class LLVolumeGeometryManager: public LLGeometryManager
virtual void rebuildGeom(LLSpatialGroup* group);
virtual void rebuildMesh(LLSpatialGroup* group);
virtual void getGeometry(LLSpatialGroup* group);
- void genDrawInfo(LLSpatialGroup* group, U32 mask, std::vector<LLFace*>& faces, BOOL distance_sort = FALSE);
+ void genDrawInfo(LLSpatialGroup* group, U32 mask, std::vector<LLFace*>& faces, BOOL distance_sort = FALSE, BOOL batch_textures = FALSE);
void registerFace(LLSpatialGroup* group, LLFace* facep, U32 type);
};
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index 277d2430ce..46ff3d808a 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -76,6 +76,7 @@
#include "lluserrelations.h"
#include "llversioninfo.h"
#include "llviewercontrol.h"
+#include "llviewerhelp.h"
#include "llvfs.h"
#include "llxorcipher.h" // saved password, MAC address
#include "llwindow.h"
@@ -163,7 +164,6 @@
#include "llviewerwindow.h"
#include "llvoavatar.h"
#include "llvoavatarself.h"
-#include "llvoclouds.h"
#include "llweb.h"
#include "llworld.h"
#include "llworldmapmessage.h"
@@ -995,6 +995,7 @@ bool idle_startup()
if(STATE_LOGIN_PROCESS_RESPONSE == LLStartUp::getStartupState())
{
+ // Generic failure message
std::ostringstream emsg;
emsg << LLTrans::getString("LoginFailed") << "\n";
if(LLLoginInstance::getInstance()->authFailure())
@@ -1003,25 +1004,33 @@ bool idle_startup()
<< LLLoginInstance::getInstance()->getResponse() << LL_ENDL;
LLSD response = LLLoginInstance::getInstance()->getResponse();
// Still have error conditions that may need some
- // sort of handling.
+ // sort of handling - dig up specific message
std::string reason_response = response["reason"];
std::string message_response = response["message"];
-
- if(!message_response.empty())
+ std::string message_id = response["message_id"];
+ std::string message; // actual string to show the user
+
+ if(!message_id.empty() && LLTrans::findString(message, message_id, response["message_args"]))
{
- // XUI: fix translation for strings returned during login
- // We need a generic table for translations
- std::string big_reason = LLAgent::sTeleportErrorMessages[ message_response ];
- if ( big_reason.size() == 0 )
- {
- emsg << message_response;
- }
- else
- {
- emsg << big_reason;
- }
+ // message will be filled in with the template and arguments
+ }
+ else if(!message_response.empty())
+ {
+ // *HACK: "no_inventory_host" sent as the message itself.
+ // Remove this clause when server is sending message_id as well.
+ message = LLAgent::sTeleportErrorMessages[ message_response ];
}
+ if (message.empty())
+ {
+ // Fallback to server-supplied string; necessary since server
+ // may add strings that this viewer is not yet aware of
+ message = message_response;
+ }
+
+ emsg << message;
+
+
if(reason_response == "key")
{
// Couldn't login because user/password is wrong
@@ -1162,8 +1171,6 @@ bool idle_startup()
// init the shader managers
LLPostProcess::initClass();
- LLWLParamManager::initClass();
- LLWaterParamManager::initClass();
LLViewerObject::initVOClasses();
@@ -1235,6 +1242,25 @@ bool idle_startup()
//---------------------------------------------------------------------
if(STATE_SEED_GRANTED_WAIT == LLStartUp::getStartupState())
{
+ LLViewerRegion *regionp = LLWorld::getInstance()->getRegionFromHandle(gFirstSimHandle);
+ if (regionp->capabilitiesReceived())
+ {
+ LLStartUp::setStartupState( STATE_SEED_CAP_GRANTED );
+ }
+ else
+ {
+ U32 num_retries = regionp->getNumSeedCapRetries();
+ if (num_retries > 0)
+ {
+ LLStringUtil::format_map_t args;
+ args["[NUMBER]"] = llformat("%d", num_retries + 1);
+ set_startup_status(0.4f, LLTrans::getString("LoginRetrySeedCapGrant", args), gAgent.mMOTD);
+ }
+ else
+ {
+ set_startup_status(0.4f, LLTrans::getString("LoginRequestSeedCapGrant"), gAgent.mMOTD);
+ }
+ }
return FALSE;
}
@@ -1683,11 +1709,22 @@ bool idle_startup()
gViewerThrottle.setMaxBandwidth(FAST_RATE_BPS / 1024.f);
}
+ if (gSavedSettings.getBOOL("ShowHelpOnFirstLogin"))
+ {
+ gSavedSettings.setBOOL("HelpFloaterOpen", TRUE);
+ }
+
// Set the show start location to true, now that the user has logged
// on with this install.
gSavedSettings.setBOOL("ShowStartLocation", TRUE);
}
+ if (gSavedSettings.getBOOL("HelpFloaterOpen"))
+ {
+ // show default topic
+ LLViewerHelp::instance().showTopic("");
+ }
+
// We're successfully logged in.
gSavedSettings.setBOOL("FirstLoginThisInstall", FALSE);
@@ -1944,7 +1981,8 @@ bool idle_startup()
gViewerWindow->getWindow()->resetBusyCount();
gViewerWindow->getWindow()->setCursor(UI_CURSOR_ARROW);
LL_DEBUGS("AppInit") << "Done releasing bitmap" << LL_ENDL;
- gViewerWindow->setShowProgress(FALSE);
+ gViewerWindow->revealIntroPanel();
+ //gViewerWindow->setShowProgress(FALSE); // reveal intro video now handles this
gViewerWindow->setProgressCancelButtonVisible(FALSE);
// We're not away from keyboard, even though login might have taken
@@ -1961,7 +1999,6 @@ bool idle_startup()
// Start automatic replay if the flag is set.
if (gSavedSettings.getBOOL("StatsAutoRun") || gAgentPilot.getReplaySession())
{
- LLUUID id;
LL_DEBUGS("AppInit") << "Starting automatic playback" << LL_ENDL;
gAgentPilot.startPlayback();
}
@@ -3142,11 +3179,6 @@ bool process_login_success_response()
gMoonTextureID = id;
}
- id = global_textures["cloud_texture_id"];
- if(id.notNull())
- {
- gCloudTextureID = id;
- }
}
// Set the location of the snapshot sharing config endpoint
diff --git a/indra/newview/llsurface.cpp b/indra/newview/llsurface.cpp
index bccabe21a8..66df7dae3e 100644
--- a/indra/newview/llsurface.cpp
+++ b/indra/newview/llsurface.cpp
@@ -334,6 +334,17 @@ void LLSurface::setOriginGlobal(const LLVector3d &origin_global)
}
}
+void LLSurface::getNeighboringRegions( std::vector<LLViewerRegion*>& uniqueRegions )
+{
+ S32 i;
+ for (i = 0; i < 8; i++)
+ {
+ if ( mNeighbors[i] != NULL )
+ {
+ uniqueRegions.push_back( mNeighbors[i]->getRegion() );
+ }
+ }
+}
void LLSurface::connectNeighbor(LLSurface *neighborp, U32 direction)
{
diff --git a/indra/newview/llsurface.h b/indra/newview/llsurface.h
index 673ee83fe3..a4ef4fe2de 100644
--- a/indra/newview/llsurface.h
+++ b/indra/newview/llsurface.h
@@ -140,6 +140,9 @@ public:
friend class LLSurfacePatch;
friend std::ostream& operator<<(std::ostream &s, const LLSurface &S);
+
+ void getNeighboringRegions( std::vector<LLViewerRegion*>& uniqueRegions );
+
public:
// Number of grid points on one side of a region, including +1 buffer for
// north and east edge.
diff --git a/indra/newview/lltexlayer.cpp b/indra/newview/lltexlayer.cpp
index 500c2a7b86..bd41aa64f0 100644
--- a/indra/newview/lltexlayer.cpp
+++ b/indra/newview/lltexlayer.cpp
@@ -51,6 +51,9 @@
using namespace LLVOAvatarDefines;
+static const S32 BAKE_UPLOAD_ATTEMPTS = 7;
+static const F32 BAKE_UPLOAD_RETRY_DELAY = 2.f; // actual delay grows by power of 2 each attempt
+
class LLTexLayerInfo
{
friend class LLTexLayer;
@@ -93,11 +96,13 @@ private:
//-----------------------------------------------------------------------------
LLBakedUploadData::LLBakedUploadData(const LLVOAvatarSelf* avatar,
LLTexLayerSet* layerset,
- const LLUUID& id) :
+ const LLUUID& id,
+ bool highest_res) :
mAvatar(avatar),
mTexLayerSet(layerset),
mID(id),
- mStartTime(LLFrameTimer::getTotalTime()) // Record starting time
+ mStartTime(LLFrameTimer::getTotalTime()), // Record starting time
+ mIsHighestRes(highest_res)
{
}
@@ -116,6 +121,7 @@ LLTexLayerSetBuffer::LLTexLayerSetBuffer(LLTexLayerSet* const owner,
mUploadPending(FALSE), // Not used for any logic here, just to sync sending of updates
mNeedsUpload(FALSE),
mNumLowresUploads(0),
+ mUploadFailCount(0),
mNeedsUpdate(TRUE),
mNumLowresUpdates(0),
mTexLayerSet(owner)
@@ -204,6 +210,7 @@ void LLTexLayerSetBuffer::cancelUpload()
mNeedsUpload = FALSE;
mUploadPending = FALSE;
mNeedsUploadTimer.pause();
+ mUploadRetryTimer.reset();
}
void LLTexLayerSetBuffer::pushProjection() const
@@ -356,25 +363,38 @@ BOOL LLTexLayerSetBuffer::isReadyToUpload() const
if (!gAgentQueryManager.hasNoPendingQueries()) return FALSE; // Can't upload if there are pending queries.
if (isAgentAvatarValid() && !gAgentAvatarp->isUsingBakedTextures()) return FALSE; // Don't upload if avatar is using composites.
- // If we requested an upload and have the final LOD ready, then upload.
- if (mTexLayerSet->isLocalTextureDataFinal()) return TRUE;
-
- // Upload if we've hit a timeout. Upload is a pretty expensive process so we need to make sure
- // we aren't doing uploads too frequently.
- const U32 texture_timeout = gSavedSettings.getU32("AvatarBakedTextureUploadTimeout");
- if (texture_timeout != 0)
+ BOOL ready = FALSE;
+ if (mTexLayerSet->isLocalTextureDataFinal())
+ {
+ // If we requested an upload and have the final LOD ready, upload (or wait a while if this is a retry)
+ if (mUploadFailCount == 0)
+ {
+ ready = TRUE;
+ }
+ else
+ {
+ ready = mUploadRetryTimer.getElapsedTimeF32() >= BAKE_UPLOAD_RETRY_DELAY * (1 << (mUploadFailCount - 1));
+ }
+ }
+ else
{
- // The timeout period increases exponentially between every lowres upload in order to prevent
- // spamming the server with frequent uploads.
- const U32 texture_timeout_threshold = texture_timeout*(1 << mNumLowresUploads);
+ // Upload if we've hit a timeout. Upload is a pretty expensive process so we need to make sure
+ // we aren't doing uploads too frequently.
+ const U32 texture_timeout = gSavedSettings.getU32("AvatarBakedTextureUploadTimeout");
+ if (texture_timeout != 0)
+ {
+ // The timeout period increases exponentially between every lowres upload in order to prevent
+ // spamming the server with frequent uploads.
+ const U32 texture_timeout_threshold = texture_timeout*(1 << mNumLowresUploads);
- // If we hit our timeout and have textures available at even lower resolution, then upload.
- const BOOL is_upload_textures_timeout = mNeedsUploadTimer.getElapsedTimeF32() >= texture_timeout_threshold;
- const BOOL has_lower_lod = mTexLayerSet->isLocalTextureDataAvailable();
- if (has_lower_lod && is_upload_textures_timeout) return TRUE;
+ // If we hit our timeout and have textures available at even lower resolution, then upload.
+ const BOOL is_upload_textures_timeout = mNeedsUploadTimer.getElapsedTimeF32() >= texture_timeout_threshold;
+ const BOOL has_lower_lod = mTexLayerSet->isLocalTextureDataAvailable();
+ ready = has_lower_lod && is_upload_textures_timeout;
+ }
}
- return FALSE;
+ return ready;
}
BOOL LLTexLayerSetBuffer::isReadyToUpdate() const
@@ -482,17 +502,20 @@ void LLTexLayerSetBuffer::doUpload()
if (valid)
{
+ const bool highest_lod = mTexLayerSet->isLocalTextureDataFinal();
// Baked_upload_data is owned by the responder and deleted after the request completes.
LLBakedUploadData* baked_upload_data = new LLBakedUploadData(gAgentAvatarp,
this->mTexLayerSet,
- asset_id);
+ asset_id,
+ highest_lod);
// upload ID is used to avoid overlaps, e.g. when the user rapidly makes two changes outside of Face Edit.
mUploadID = asset_id;
// Upload the image
const std::string url = gAgent.getRegion()->getCapability("UploadBakedTexture");
if(!url.empty()
- && !LLPipeline::sForceOldBakedUpload) // toggle debug setting UploadBakedTexOld to change between the new caps method and old method
+ && !LLPipeline::sForceOldBakedUpload // toggle debug setting UploadBakedTexOld to change between the new caps method and old method
+ && (mUploadFailCount < (BAKE_UPLOAD_ATTEMPTS - 1))) // Try last ditch attempt via asset store if cap upload is failing.
{
LLSD body = LLSD::emptyMap();
// The responder will call LLTexLayerSetBuffer::onTextureUploadComplete()
@@ -511,7 +534,6 @@ void LLTexLayerSetBuffer::doUpload()
llinfos << "Baked texture upload via Asset Store." << llendl;
}
- const BOOL highest_lod = mTexLayerSet->isLocalTextureDataFinal();
if (highest_lod)
{
// Sending the final LOD for the baked texture. All done, pause
@@ -603,14 +625,15 @@ void LLTexLayerSetBuffer::onTextureUploadComplete(const LLUUID& uuid,
{
LLBakedUploadData* baked_upload_data = (LLBakedUploadData*)userdata;
- if ((result == 0) &&
- isAgentAvatarValid() &&
+ if (isAgentAvatarValid() &&
!gAgentAvatarp->isDead() &&
(baked_upload_data->mAvatar == gAgentAvatarp) && // Sanity check: only the user's avatar should be uploading textures.
(baked_upload_data->mTexLayerSet->hasComposite()))
{
LLTexLayerSetBuffer* layerset_buffer = baked_upload_data->mTexLayerSet->getComposite();
-
+ S32 failures = layerset_buffer->mUploadFailCount;
+ layerset_buffer->mUploadFailCount = 0;
+
if (layerset_buffer->mUploadID.isNull())
{
// The upload got canceled, we should be in the
@@ -626,20 +649,28 @@ void LLTexLayerSetBuffer::onTextureUploadComplete(const LLUUID& uuid,
{
// This is the upload we're currently waiting for.
layerset_buffer->mUploadID.setNull();
+ const std::string name(baked_upload_data->mTexLayerSet->getBodyRegionName());
+ const std::string resolution = baked_upload_data->mIsHighestRes ? " full res " : " low res ";
if (result >= 0)
{
- layerset_buffer->mUploadPending = FALSE;
+ layerset_buffer->mUploadPending = FALSE; // Allows sending of AgentSetAppearance later
LLVOAvatarDefines::ETextureIndex baked_te = gAgentAvatarp->getBakedTE(layerset_buffer->mTexLayerSet);
// Update baked texture info with the new UUID
U64 now = LLFrameTimer::getTotalTime(); // Record starting time
- llinfos << "Baked texture upload took " << (S32)((now - baked_upload_data->mStartTime) / 1000) << " ms" << llendl;
+ llinfos << "Baked" << resolution << "texture upload for " << name << " took " << (S32)((now - baked_upload_data->mStartTime) / 1000) << " ms" << llendl;
gAgentAvatarp->setNewBakedTexture(baked_te, uuid);
}
else
{
- // Avatar appearance is changing, ignore the upload results
- llinfos << "Baked upload failed. Reason: " << result << llendl;
- // *FIX: retry upload after n seconds, asset server could be busy
+ ++failures;
+ S32 max_attempts = baked_upload_data->mIsHighestRes ? BAKE_UPLOAD_ATTEMPTS : 1; // only retry final bakes
+ llwarns << "Baked" << resolution << "texture upload for " << name << " failed (attempt " << failures << "/" << max_attempts << ")" << llendl;
+ if (failures < max_attempts)
+ {
+ layerset_buffer->mUploadFailCount = failures;
+ layerset_buffer->mUploadRetryTimer.start();
+ layerset_buffer->requestUpload();
+ }
}
}
else
diff --git a/indra/newview/lltexlayer.h b/indra/newview/lltexlayer.h
index 2d710d2dce..85dadb213c 100644
--- a/indra/newview/lltexlayer.h
+++ b/indra/newview/lltexlayer.h
@@ -312,6 +312,8 @@ private:
BOOL mUploadPending; // Whether we have received back the new baked textures
LLUUID mUploadID; // The current upload process (null if none).
LLFrameTimer mNeedsUploadTimer; // Tracks time since upload was requested and performed.
+ S32 mUploadFailCount; // Number of consecutive upload failures
+ LLFrameTimer mUploadRetryTimer; // Tracks time since last upload failure.
//--------------------------------------------------------------------
// Updates
@@ -363,12 +365,14 @@ struct LLBakedUploadData
{
LLBakedUploadData(const LLVOAvatarSelf* avatar,
LLTexLayerSet* layerset,
- const LLUUID& id);
+ const LLUUID& id,
+ bool highest_res);
~LLBakedUploadData() {}
const LLUUID mID;
const LLVOAvatarSelf* mAvatar; // note: backlink only; don't LLPointer
LLTexLayerSet* mTexLayerSet;
const U64 mStartTime; // for measuring baked texture upload time
+ const bool mIsHighestRes; // whether this is a "final" bake, or intermediate low res
};
#endif // LL_LLTEXLAYER_H
diff --git a/indra/newview/lltexturecache.cpp b/indra/newview/lltexturecache.cpp
index 7fb52c1939..9b417307fd 100644
--- a/indra/newview/lltexturecache.cpp
+++ b/indra/newview/lltexturecache.cpp
@@ -949,7 +949,7 @@ S64 LLTextureCache::initCache(ELLPath location, S64 max_size, BOOL texture_cache
max_size -= sCacheMaxTexturesSize;
LL_INFOS("TextureCache") << "Headers: " << sCacheMaxEntries
- << " Textures size: " << sCacheMaxTexturesSize/(1024*1024) << " MB" << LL_ENDL;
+ << " Textures size: " << sCacheMaxTexturesSize / (1024 * 1024) << " MB" << LL_ENDL;
setDirNames(location);
@@ -1513,12 +1513,12 @@ void LLTextureCache::purgeAllTextures(bool purge_directories)
{
const char* subdirs = "0123456789abcdef";
std::string delem = gDirUtilp->getDirDelimiter();
- std::string mask = delem + "*";
+ std::string mask = "*";
for (S32 i=0; i<16; i++)
{
std::string dirname = mTexturesDirName + delem + subdirs[i];
llinfos << "Deleting files in directory: " << dirname << llendl;
- gDirUtilp->deleteFilesInDir(dirname,mask);
+ gDirUtilp->deleteFilesInDir(dirname, mask);
if (purge_directories)
{
LLFile::rmdir(dirname);
@@ -1655,7 +1655,7 @@ void LLTextureCache::purgeTextures(bool validate)
LL_INFOS("TextureCache") << "TEXTURE CACHE:"
<< " PURGED: " << purge_count
<< " ENTRIES: " << num_entries
- << " CACHE SIZE: " << mTexturesSizeTotal / 1024*1024 << " MB"
+ << " CACHE SIZE: " << mTexturesSizeTotal / (1024 * 1024) << " MB"
<< llendl;
}
diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp
index 1023a4339b..de22f2ae6b 100644
--- a/indra/newview/lltexturectrl.cpp
+++ b/indra/newview/lltexturectrl.cpp
@@ -420,7 +420,6 @@ BOOL LLFloaterTexturePicker::postBuild()
mInventoryPanel->setFilterPermMask(mImmediateFilterPermMask);
mInventoryPanel->setSelectCallback(boost::bind(&LLFloaterTexturePicker::onSelectionChange, this, _1, _2));
mInventoryPanel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
- mInventoryPanel->setAllowMultiSelect(FALSE);
// Disable auto selecting first filtered item because it takes away
// selection from the item set by LLTextureCtrl owning this floater.
@@ -1093,7 +1092,7 @@ public:
BOOL LLTextureCtrl::handleHover(S32 x, S32 y, MASK mask)
{
- getWindow()->setCursor(UI_CURSOR_HAND);
+ getWindow()->setCursor(mBorder->parentPointInView(x,y) ? UI_CURSOR_HAND : UI_CURSOR_ARROW);
return TRUE;
}
@@ -1102,7 +1101,7 @@ BOOL LLTextureCtrl::handleMouseDown(S32 x, S32 y, MASK mask)
{
BOOL handled = LLUICtrl::handleMouseDown( x, y , mask );
- if( !handled )
+ if (!handled && mBorder->parentPointInView(x, y))
{
showPicker(FALSE);
//grab textures first...
diff --git a/indra/newview/lltoolgrab.cpp b/indra/newview/lltoolgrab.cpp
index b6c0f662e5..319e2508e0 100644
--- a/indra/newview/lltoolgrab.cpp
+++ b/indra/newview/lltoolgrab.cpp
@@ -54,7 +54,6 @@
#include "llviewerobject.h"
#include "llviewerobjectlist.h"
#include "llviewerregion.h"
-#include "llviewerwindow.h"
#include "llvoavatarself.h"
#include "llworld.h"
@@ -387,22 +386,7 @@ void LLToolGrab::startGrab()
mDragStartPointGlobal = grab_start_global;
mDragStartFromCamera = grab_start_global - gAgentCamera.getCameraPositionGlobal();
- LLMessageSystem *msg = gMessageSystem;
- msg->newMessageFast(_PREHASH_ObjectGrab);
- msg->nextBlockFast(_PREHASH_AgentData);
- msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
- msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
- msg->nextBlockFast(_PREHASH_ObjectData);
- msg->addU32Fast(_PREHASH_LocalID, objectp->mLocalID);
- msg->addVector3Fast(_PREHASH_GrabOffset, grab_offset );
- msg->nextBlock("SurfaceInfo");
- msg->addVector3("UVCoord", LLVector3(mGrabPick.mUVCoords));
- msg->addVector3("STCoord", LLVector3(mGrabPick.mSTCoords));
- msg->addS32Fast(_PREHASH_FaceIndex, mGrabPick.mObjectFace);
- msg->addVector3("Position", mGrabPick.mIntersection);
- msg->addVector3("Normal", mGrabPick.mNormal);
- msg->addVector3("Binormal", mGrabPick.mBinormal);
- msg->sendMessage( objectp->getRegion()->getHost());
+ send_ObjectGrab_message(objectp, mGrabPick, grab_offset);
mGrabOffsetFromCenterInitial = grab_offset;
mGrabHiddenOffsetFromCamera = mDragStartFromCamera;
@@ -1036,28 +1020,12 @@ void LLToolGrab::stopGrab()
}
// Next, send messages to simulator
- LLMessageSystem *msg = gMessageSystem;
switch(mMode)
{
case GRAB_ACTIVE_CENTER:
case GRAB_NONPHYSICAL:
case GRAB_LOCKED:
- msg->newMessageFast(_PREHASH_ObjectDeGrab);
- msg->nextBlockFast(_PREHASH_AgentData);
- msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
- msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
- msg->nextBlockFast(_PREHASH_ObjectData);
- msg->addU32Fast(_PREHASH_LocalID, objectp->mLocalID);
- msg->nextBlock("SurfaceInfo");
- msg->addVector3("UVCoord", LLVector3(pick.mUVCoords));
- msg->addVector3("STCoord", LLVector3(pick.mSTCoords));
- msg->addS32Fast(_PREHASH_FaceIndex, pick.mObjectFace);
- msg->addVector3("Position", pick.mIntersection);
- msg->addVector3("Normal", pick.mNormal);
- msg->addVector3("Binormal", pick.mBinormal);
-
- msg->sendMessage(objectp->getRegion()->getHost());
-
+ send_ObjectDeGrab_message(objectp, pick);
mVerticalDragging = FALSE;
break;
@@ -1109,3 +1077,66 @@ LLVector3d LLToolGrab::getGrabPointGlobal()
return gAgent.getPositionGlobal();
}
}
+
+
+void send_ObjectGrab_message(LLViewerObject* object, const LLPickInfo & pick, const LLVector3 &grab_offset)
+{
+ if (!object) return;
+
+ LLMessageSystem *msg = gMessageSystem;
+
+ msg->newMessageFast(_PREHASH_ObjectGrab);
+ msg->nextBlockFast( _PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+ msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+ msg->nextBlockFast( _PREHASH_ObjectData);
+ msg->addU32Fast( _PREHASH_LocalID, object->mLocalID);
+ msg->addVector3Fast(_PREHASH_GrabOffset, grab_offset);
+ msg->nextBlock("SurfaceInfo");
+ msg->addVector3("UVCoord", LLVector3(pick.mUVCoords));
+ msg->addVector3("STCoord", LLVector3(pick.mSTCoords));
+ msg->addS32Fast(_PREHASH_FaceIndex, pick.mObjectFace);
+ msg->addVector3("Position", pick.mIntersection);
+ msg->addVector3("Normal", pick.mNormal);
+ msg->addVector3("Binormal", pick.mBinormal);
+ msg->sendMessage( object->getRegion()->getHost());
+
+ /* Diagnostic code
+ llinfos << "mUVCoords: " << pick.mUVCoords
+ << ", mSTCoords: " << pick.mSTCoords
+ << ", mObjectFace: " << pick.mObjectFace
+ << ", mIntersection: " << pick.mIntersection
+ << ", mNormal: " << pick.mNormal
+ << ", mBinormal: " << pick.mBinormal
+ << llendl;
+
+ llinfos << "Avatar pos: " << gAgent.getPositionAgent() << llendl;
+ llinfos << "Object pos: " << object->getPosition() << llendl;
+ */
+}
+
+
+void send_ObjectDeGrab_message(LLViewerObject* object, const LLPickInfo & pick)
+{
+ if (!object) return;
+
+ LLMessageSystem *msg = gMessageSystem;
+
+ msg->newMessageFast(_PREHASH_ObjectDeGrab);
+ msg->nextBlockFast(_PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+ msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+ msg->nextBlockFast(_PREHASH_ObjectData);
+ msg->addU32Fast(_PREHASH_LocalID, object->mLocalID);
+ msg->nextBlock("SurfaceInfo");
+ msg->addVector3("UVCoord", LLVector3(pick.mUVCoords));
+ msg->addVector3("STCoord", LLVector3(pick.mSTCoords));
+ msg->addS32Fast(_PREHASH_FaceIndex, pick.mObjectFace);
+ msg->addVector3("Position", pick.mIntersection);
+ msg->addVector3("Normal", pick.mNormal);
+ msg->addVector3("Binormal", pick.mBinormal);
+ msg->sendMessage(object->getRegion()->getHost());
+}
+
+
+
diff --git a/indra/newview/lltoolgrab.h b/indra/newview/lltoolgrab.h
index 61e3fcb8b2..06a3b662c8 100644
--- a/indra/newview/lltoolgrab.h
+++ b/indra/newview/lltoolgrab.h
@@ -39,6 +39,13 @@ class LLTextBox;
class LLViewerObject;
class LLPickInfo;
+
+// Message utilities
+void send_ObjectGrab_message(LLViewerObject* object, const LLPickInfo & pick, const LLVector3 &grab_offset);
+void send_ObjectDeGrab_message(LLViewerObject* object, const LLPickInfo & pick);
+
+
+
class LLToolGrab : public LLTool, public LLSingleton<LLToolGrab>
{
public:
diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp
index 9ec4d33036..c38c8bad80 100644
--- a/indra/newview/lltoolpie.cpp
+++ b/indra/newview/lltoolpie.cpp
@@ -639,6 +639,7 @@ BOOL LLToolPie::handleMouseUp(S32 x, S32 y, MASK mask)
if (click_action == CLICK_ACTION_NONE // not doing 1-click action
&& gSavedSettings.getBOOL("ClickToWalk") // click to walk enabled
&& !gAgent.getFlying() // don't auto-navigate while flying until that works
+ && gAgentAvatarp
&& !gAgentAvatarp->isSitting()
&& !mBlockClickToWalk // another behavior hasn't cancelled click to walk
&& !mPick.mPosGlobal.isExactlyZero() // valid coordinates for pick
diff --git a/indra/newview/lltranslate.cpp b/indra/newview/lltranslate.cpp
index 2de7db38ed..2f60b6b90b 100644
--- a/indra/newview/lltranslate.cpp
+++ b/indra/newview/lltranslate.cpp
@@ -28,6 +28,8 @@
#include "lltranslate.h"
+#include <curl/curl.h>
+
#include "llbufferstream.h"
#include "llui.h"
#include "llversioninfo.h"
@@ -76,7 +78,9 @@ void LLTranslate::translateMessage(LLHTTPClient::ResponderPtr &result, const std
//static
void LLTranslate::getTranslateUrl(std::string &translate_url, const std::string &from_lang, const std::string &to_lang, const std::string &mesg)
{
- std::string escaped_mesg = curl_escape(mesg.c_str(), mesg.size());
+ char * curl_str = curl_escape(mesg.c_str(), mesg.size());
+ std::string const escaped_mesg(curl_str);
+ curl_free(curl_str);
translate_url = m_GoogleURL
+ escaped_mesg + m_GoogleLangSpec
diff --git a/indra/newview/lluploadfloaterobservers.cpp b/indra/newview/lluploadfloaterobservers.cpp
new file mode 100644
index 0000000000..5a6a17fbca
--- /dev/null
+++ b/indra/newview/lluploadfloaterobservers.cpp
@@ -0,0 +1,56 @@
+/**
+ * @file lluploadfloaterobservers.cpp
+ * @brief LLUploadModelPremissionsResponder 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 "lluploadfloaterobservers.h"
+
+LLUploadModelPremissionsResponder::LLUploadModelPremissionsResponder(const LLHandle<LLUploadPermissionsObserver>& observer)
+:mObserverHandle(observer)
+{
+}
+
+void LLUploadModelPremissionsResponder::error(U32 status, const std::string& reason)
+{
+ llwarns << "LLUploadModelPremissionsResponder::error("<< status << ": " << reason << ")" << llendl;
+
+ LLUploadPermissionsObserver* observer = mObserverHandle.get();
+
+ if (observer)
+ {
+ observer->setPermissonsErrorStatus(status, reason);
+ }
+}
+
+void LLUploadModelPremissionsResponder::result(const LLSD& content)
+{
+ LLUploadPermissionsObserver* observer = mObserverHandle.get();
+
+ if (observer)
+ {
+ observer->onPermissionsReceived(content);
+ }
+}
diff --git a/indra/newview/lluploadfloaterobservers.h b/indra/newview/lluploadfloaterobservers.h
new file mode 100644
index 0000000000..79aad282d7
--- /dev/null
+++ b/indra/newview/lluploadfloaterobservers.h
@@ -0,0 +1,97 @@
+/**
+ * @file lluploadfloaterobservers.h
+ * @brief LLUploadModelPremissionsResponder declaration
+ *
+ * $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_LLUPLOADFLOATEROBSERVERS_H
+#define LL_LLUPLOADFLOATEROBSERVERS_H
+
+#include "llfloater.h"
+#include "llhttpclient.h"
+#include "llhandle.h"
+
+class LLUploadPermissionsObserver
+{
+public:
+
+ LLUploadPermissionsObserver(){mUploadPermObserverHandle.bind(this);}
+ virtual ~LLUploadPermissionsObserver() {}
+
+ virtual void onPermissionsReceived(const LLSD& result) = 0;
+ virtual void setPermissonsErrorStatus(U32 status, const std::string& reason) = 0;
+
+ LLHandle<LLUploadPermissionsObserver> getPermObserverHandle() const {return mUploadPermObserverHandle;}
+
+protected:
+ LLRootHandle<LLUploadPermissionsObserver> mUploadPermObserverHandle;
+};
+
+class LLWholeModelFeeObserver
+{
+public:
+ LLWholeModelFeeObserver() { mWholeModelFeeObserverHandle.bind(this); }
+ virtual ~LLWholeModelFeeObserver() {}
+
+ virtual void onModelPhysicsFeeReceived(const LLSD& result, std::string upload_url) = 0;
+ virtual void setModelPhysicsFeeErrorStatus(U32 status, const std::string& reason) = 0;
+
+ LLHandle<LLWholeModelFeeObserver> getWholeModelFeeObserverHandle() const { return mWholeModelFeeObserverHandle; }
+
+protected:
+ LLRootHandle<LLWholeModelFeeObserver> mWholeModelFeeObserverHandle;
+};
+
+
+class LLWholeModelUploadObserver
+{
+public:
+ LLWholeModelUploadObserver() { mWholeModelUploadObserverHandle.bind(this); }
+ virtual ~LLWholeModelUploadObserver() {}
+
+ virtual void onModelUploadSuccess() = 0;
+
+ virtual void onModelUploadFailure() = 0;
+
+ LLHandle<LLWholeModelUploadObserver> getWholeModelUploadObserverHandle() const { return mWholeModelUploadObserverHandle; }
+
+protected:
+ LLRootHandle<LLWholeModelUploadObserver> mWholeModelUploadObserverHandle;
+};
+
+
+class LLUploadModelPremissionsResponder : public LLHTTPClient::Responder
+{
+public:
+
+ LLUploadModelPremissionsResponder(const LLHandle<LLUploadPermissionsObserver>& observer);
+
+ void error(U32 status, const std::string& reason);
+
+ void result(const LLSD& content);
+
+private:
+ LLHandle<LLUploadPermissionsObserver> mObserverHandle;
+};
+
+#endif /* LL_LLUPLOADFLOATEROBSERVERS_H */
diff --git a/indra/newview/llviewerchat.cpp b/indra/newview/llviewerchat.cpp
index e06fe7bda0..93687dbd5f 100644
--- a/indra/newview/llviewerchat.cpp
+++ b/indra/newview/llviewerchat.cpp
@@ -80,6 +80,10 @@ void LLViewerChat::getChatColor(const LLChat& chat, LLColor4& r_color)
{
r_color = LLUIColorTable::instance().getColor("llOwnerSayChatColor");
}
+ else if ( chat.mChatType == CHAT_TYPE_DIRECT )
+ {
+ r_color = LLUIColorTable::instance().getColor("DirectChatColor");
+ }
else
{
r_color = LLUIColorTable::instance().getColor("ObjectChatColor");
@@ -146,6 +150,10 @@ void LLViewerChat::getChatColor(const LLChat& chat, std::string& r_color_name, F
{
r_color_name = "llOwnerSayChatColor";
}
+ else if ( chat.mChatType == CHAT_TYPE_DIRECT )
+ {
+ r_color_name = "DirectChatColor";
+ }
else
{
r_color_name = "ObjectChatColor";
diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp
index d4747d7092..0f0b7d7e78 100644
--- a/indra/newview/llviewercontrol.cpp
+++ b/indra/newview/llviewercontrol.cpp
@@ -57,6 +57,7 @@
#include "llworld.h"
#include "pipeline.h"
#include "llviewerjoystick.h"
+#include "llviewerobjectlist.h"
#include "llviewerparcelmgr.h"
#include "llparcel.h"
#include "llkeyboard.h"
@@ -186,6 +187,21 @@ 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();
@@ -360,6 +376,16 @@ static bool handleResetVertexBuffersChanged(const LLSD&)
return true;
}
+static bool handleRepartition(const LLSD&)
+{
+ if (gPipeline.isInit())
+ {
+ gOctreeMaxCapacity = gSavedSettings.getU32("OctreeMaxNodeCapacity");
+ gObjectList.repartitionObjects();
+ }
+ return true;
+}
+
static bool handleRenderDynamicLODChanged(const LLSD& newvalue)
{
LLPipeline::sDynamicLOD = newvalue.asBoolean();
@@ -381,7 +407,7 @@ static bool handleRenderDeferredChanged(const LLSD& newvalue)
gPipeline.releaseGLBuffers();
gPipeline.createGLBuffers();
gPipeline.resetVertexBuffers();
- if (LLPipeline::sRenderDeferred && LLRenderTarget::sUseFBO)
+ if (LLPipeline::sRenderDeferred == (BOOL)LLRenderTarget::sUseFBO)
{
LLViewerShaderMgr::instance()->setShaders();
}
@@ -543,7 +569,7 @@ bool toggle_show_object_render_cost(const LLSD& newvalue)
return true;
}
-void toggle_updater_service_active(LLControlVariable* control, const LLSD& new_value)
+void toggle_updater_service_active(const LLSD& new_value)
{
if(new_value.asInteger())
{
@@ -563,6 +589,12 @@ void settings_setup_listeners()
gSavedSettings.getControl("FirstPersonAvatarVisible")->getSignal()->connect(boost::bind(&handleRenderAvatarMouselookChanged, _2));
gSavedSettings.getControl("RenderFarClip")->getSignal()->connect(boost::bind(&handleRenderFarClipChanged, _2));
gSavedSettings.getControl("RenderTerrainDetail")->getSignal()->connect(boost::bind(&handleTerrainDetailChanged, _2));
+ gSavedSettings.getControl("OctreeStaticObjectSizeFactor")->getSignal()->connect(boost::bind(&handleRepartition, _2));
+ gSavedSettings.getControl("OctreeDistanceFactor")->getSignal()->connect(boost::bind(&handleRepartition, _2));
+ 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("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));
@@ -571,7 +603,7 @@ void settings_setup_listeners()
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(&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));
@@ -707,7 +739,7 @@ void settings_setup_listeners()
gSavedSettings.getControl("ShowNavbarFavoritesPanel")->getSignal()->connect(boost::bind(&toggle_show_favorites_panel, _2));
gSavedSettings.getControl("ShowMiniLocationPanel")->getSignal()->connect(boost::bind(&toggle_show_mini_location_panel, _2));
gSavedSettings.getControl("ShowObjectRenderingCost")->getSignal()->connect(boost::bind(&toggle_show_object_render_cost, _2));
- gSavedSettings.getControl("UpdaterServiceSetting")->getSignal()->connect(&toggle_updater_service_active);
+ gSavedSettings.getControl("UpdaterServiceSetting")->getSignal()->connect(boost::bind(&toggle_updater_service_active, _2));
gSavedSettings.getControl("ForceShowGrid")->getSignal()->connect(boost::bind(&handleForceShowGrid, _2));
gSavedSettings.getControl("RenderTransparentWater")->getSignal()->connect(boost::bind(&handleRenderTransparentWaterChanged, _2));
}
diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp
index e41773d273..911fc8e1ed 100644
--- a/indra/newview/llviewerdisplay.cpp
+++ b/indra/newview/llviewerdisplay.cpp
@@ -178,8 +178,8 @@ void display_update_camera()
gViewerWindow->setup3DRender();
// update all the sky/atmospheric/water settings
- LLWLParamManager::instance()->update(LLViewerCamera::getInstance());
- LLWaterParamManager::instance()->update(LLViewerCamera::getInstance());
+ LLWLParamManager::getInstance()->update(LLViewerCamera::getInstance());
+ LLWaterParamManager::getInstance()->update(LLViewerCamera::getInstance());
// Update land visibility too
LLWorld::getInstance()->setLandFarClip(final_far);
@@ -582,6 +582,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
LLMemType mt_ug(LLMemType::MTYPE_DISPLAY_UPDATE_GEOM);
const F32 max_geom_update_time = 0.005f*10.f*gFrameIntervalSeconds; // 50 ms/second update time
gPipeline.createObjects(max_geom_update_time);
+ gPipeline.processPartitionQ();
gPipeline.updateGeom(max_geom_update_time);
stop_glerror();
}
@@ -836,7 +837,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
if (LLPipeline::sRenderDeferred && !LLPipeline::sUnderWaterRender)
{
gPipeline.mDeferredScreen.bindTarget();
- glClearColor(0,0,0,0);
+ glClearColor(1,0,1,1);
gPipeline.mDeferredScreen.clear();
}
else
@@ -995,8 +996,7 @@ void render_hud_attachments()
S32 use_occlusion = LLPipeline::sUseOcclusion;
LLPipeline::sUseOcclusion = 0;
- LLPipeline::sDisableShaders = TRUE;
-
+
//cull, sort, and render hud objects
static LLCullResult result;
LLSpatialGroup::sNoDelete = TRUE;
@@ -1036,7 +1036,6 @@ void render_hud_attachments()
gPipeline.toggleRenderDebugFeature((void*) LLPipeline::RENDER_DEBUG_FEATURE_UI);
}
LLPipeline::sUseOcclusion = use_occlusion;
- LLPipeline::sDisableShaders = FALSE;
}
glMatrixMode(GL_PROJECTION);
glPopMatrix();
diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp
index a1c2c926af..26f05337a4 100644
--- a/indra/newview/llviewerfloaterreg.cpp
+++ b/indra/newview/llviewerfloaterreg.cpp
@@ -48,11 +48,14 @@
#include "llfloaterbulkpermission.h"
#include "llfloaterbump.h"
#include "llfloatercamera.h"
-#include "llfloaterdaycycle.h"
+#include "llfloaterdeleteenvpreset.h"
#include "llfloaterdisplayname.h"
+#include "llfloatereditdaycycle.h"
+#include "llfloatereditsky.h"
+#include "llfloatereditwater.h"
+#include "llfloaterenvironmentsettings.h"
#include "llfloaterevent.h"
#include "llfloatersearch.h"
-#include "llfloaterenvsettings.h"
#include "llfloaterfonttest.h"
#include "llfloatergesture.h"
#include "llfloatergodtools.h"
@@ -101,9 +104,7 @@
#include "llfloatertopobjects.h"
#include "llfloateruipreview.h"
#include "llfloatervoiceeffect.h"
-#include "llfloaterwater.h"
#include "llfloaterwhitelistentry.h"
-#include "llfloaterwindlight.h"
#include "llfloaterwindowsize.h"
#include "llfloaterworldmap.h"
#include "llimfloatercontainer.h"
@@ -129,12 +130,12 @@
// *NOTE: Please add files in alphabetical order to keep merges easy.
-// handle secondlife:///app/floater/{NAME} URLs
+// handle secondlife:///app/openfloater/{NAME} URLs
class LLFloaterOpenHandler : public LLCommandHandler
{
public:
// requires trusted browser to trigger
- LLFloaterOpenHandler() : LLCommandHandler("floater", UNTRUSTED_THROTTLE) { }
+ LLFloaterOpenHandler() : LLCommandHandler("openfloater", UNTRUSTED_THROTTLE) { }
bool handle(const LLSD& params, const LLSD& query_map,
LLMediaCtrl* web)
@@ -179,11 +180,12 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("compile_queue", "floater_script_queue.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterCompileQueue>);
- LLFloaterReg::add("env_day_cycle", "floater_day_cycle_options.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterDayCycle>);
LLFloaterReg::add("env_post_process", "floater_post_process.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPostProcess>);
- LLFloaterReg::add("env_settings", "floater_env_settings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterEnvSettings>);
- LLFloaterReg::add("env_water", "floater_water.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterWater>);
- LLFloaterReg::add("env_windlight", "floater_windlight_options.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterWindLight>);
+ LLFloaterReg::add("env_settings", "floater_environment_settings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterEnvironmentSettings>);
+ LLFloaterReg::add("env_delete_preset", "floater_delete_env_preset.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterDeleteEnvPreset>);
+ LLFloaterReg::add("env_edit_sky", "floater_edit_sky_preset.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterEditSky>);
+ LLFloaterReg::add("env_edit_water", "floater_edit_water_preset.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterEditWater>);
+ LLFloaterReg::add("env_edit_day_cycle", "floater_edit_day_cycle.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterEditDayCycle>);
LLFloaterReg::add("event", "floater_event.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterEvent>);
diff --git a/indra/newview/llviewerfoldertype.cpp b/indra/newview/llviewerfoldertype.cpp
index 42f780a8a3..9101222393 100644
--- a/indra/newview/llviewerfoldertype.cpp
+++ b/indra/newview/llviewerfoldertype.cpp
@@ -128,8 +128,10 @@ LLViewerFolderDictionary::LLViewerFolderDictionary()
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_INBOX, new ViewerFolderEntry("Inbox", "Inv_SysOpen", "Inv_SysClosed", FALSE));
+ addEntry(LLFolderType::FT_OUTBOX, new ViewerFolderEntry("Outbox", "Inv_SysOpen", "Inv_SysClosed", FALSE));
+
+ addEntry(LLFolderType::FT_BASIC_ROOT, new ViewerFolderEntry("Basic Root", "Inv_SysOpen", "Inv_SysClosed", FALSE));
addEntry(LLFolderType::FT_NONE, new ViewerFolderEntry("New Folder", "Inv_FolderOpen", "Inv_FolderClosed", FALSE, "default"));
diff --git a/indra/newview/llviewerhelp.cpp b/indra/newview/llviewerhelp.cpp
index 9fe8c142b9..3a3d4f3881 100644
--- a/indra/newview/llviewerhelp.cpp
+++ b/indra/newview/llviewerhelp.cpp
@@ -101,8 +101,9 @@ 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 );
+ setRawURL(helpURL);
}
std::string LLViewerHelp::defaultTopic()
@@ -148,18 +149,7 @@ std::string LLViewerHelp::getTopicFromFocus()
// static
void LLViewerHelp::showHelp()
{
- LLFloaterHelpBrowser* helpbrowser = dynamic_cast<LLFloaterHelpBrowser*>(LLFloaterReg::getInstance("help_browser"));
- if (helpbrowser)
- {
- BOOL visible = TRUE;
- BOOL take_focus = TRUE;
- helpbrowser->setVisible(visible);
- helpbrowser->setFrontmost(take_focus);
- }
- else
- {
- llwarns << "Eep, help_browser floater not found" << llendl;
- }
+ LLFloaterReg::showInstance("help_browser");
}
// static
diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp
index 9e58acdcd3..22666cec0d 100644
--- a/indra/newview/llviewerinventory.cpp
+++ b/indra/newview/llviewerinventory.cpp
@@ -1269,7 +1269,7 @@ void menu_create_inventory_item(LLFolderView* root, LLFolderBridge *bridge, cons
{
std::string type_name = userdata.asString();
- if (("category" == type_name) || ("current" == type_name) || ("outfit" == type_name) || ("my_otfts" == type_name))
+ if (("inbox" == type_name) || ("outbox" == type_name) || ("category" == type_name) || ("current" == type_name) || ("outfit" == type_name) || ("my_otfts" == type_name))
{
LLFolderType::EType preferred_type = LLFolderType::lookup(type_name);
diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp
index 79c6c8db75..1be58eae45 100644
--- a/indra/newview/llviewermedia.cpp
+++ b/indra/newview/llviewermedia.cpp
@@ -62,9 +62,12 @@
#include "llmutelist.h"
#include "llpanelprofile.h"
#include "llappviewer.h"
+#include "lllogininstance.h"
//#include "llfirstuse.h"
+#include "llviewernetwork.h"
#include "llwindow.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.
@@ -1359,6 +1362,34 @@ void LLViewerMedia::removeCookie(const std::string &name, const std::string &dom
}
+class LLInventoryUserStatusResponder : public LLHTTPClient::Responder
+{
+public:
+ LLInventoryUserStatusResponder()
+ : LLCurl::Responder()
+ {
+ }
+
+ void completed(U32 status, const std::string& reason, const LLSD& content)
+ {
+ if (isGoodStatus(status))
+ {
+ // Complete success
+ gSavedSettings.setBOOL("InventoryDisplayInbox", true);
+ }
+ 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;
+ }
+ }
+};
+
/////////////////////////////////////////////////////////////////////////////////////////
// static
void LLViewerMedia::setOpenIDCookie()
@@ -1405,6 +1436,25 @@ void LLViewerMedia::setOpenIDCookie()
LLHTTPClient::get(profile_url,
new LLViewerMediaWebProfileResponder(raw_profile_url.getAuthority()),
headers);
+
+ 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());
+ }
+
+ url += "api/1/users/";
+ url += gAgent.getID().getString();
+ url += "/user_status";
+
+ headers = LLSD::emptyMap();
+ headers["Accept"] = "*/*";
+ headers["Cookie"] = sOpenIDCookie;
+ headers["User-Agent"] = getCurrentUserAgent();
+
+ LLHTTPClient::get(url, new LLInventoryUserStatusResponder(), headers);
}
}
@@ -2343,6 +2393,64 @@ BOOL LLViewerMediaImpl::handleMouseUp(S32 x, S32 y, MASK mask)
}
//////////////////////////////////////////////////////////////////////////////////////////
+void LLViewerMediaImpl::updateJavascriptObject()
+{
+ if ( mMediaSource )
+ {
+ // flag to expose this information to internal browser or not.
+ bool enable = gSavedSettings.getBOOL("BrowserEnableJSObject");
+ 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 );
+ }
+
+ // language code the viewer is set to
+ mMediaSource->jsAgentLanguageEvent( LLUI::getLanguage() );
+
+ // maturity setting the agent has selected
+ if ( gAgent.prefersAdult() )
+ mMediaSource->jsAgentMaturityEvent( "GMA" ); // Adult means see adult, mature and general content
+ else
+ if ( gAgent.prefersMature() )
+ mMediaSource->jsAgentMaturityEvent( "GM" ); // Mature means see mature and general content
+ else
+ if ( gAgent.prefersPG() )
+ mMediaSource->jsAgentMaturityEvent( "G" ); // PG means only see General content
+ }
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
std::string LLViewerMediaImpl::getName() const
{
if (mMediaSource)
@@ -2640,6 +2748,9 @@ void LLViewerMediaImpl::update()
{
updateVolume();
+ // TODO: this is updated every frame - is this bad?
+ updateJavascriptObject();
+
// If we didn't just create the impl, it may need to get cookie updates.
if(!sUpdatedCookies.empty())
{
diff --git a/indra/newview/llviewermedia.h b/indra/newview/llviewermedia.h
index e2e342cc45..a70c6f4887 100644
--- a/indra/newview/llviewermedia.h
+++ b/indra/newview/llviewermedia.h
@@ -339,7 +339,10 @@ public:
LLVOVolume *getSomeObject();
void setUpdated(BOOL updated) ;
BOOL isUpdated() ;
-
+
+ // updates the javascript object in the embedded browser with viewer values
+ void updateJavascriptObject();
+
// Updates the "interest" value in this object
void calculateInterest();
F64 getInterest() const { return mInterest; };
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index 4dbf0eaaf8..f38dd12f68 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -45,6 +45,7 @@
#include "llcompilequeue.h"
#include "llconsole.h"
#include "lldebugview.h"
+#include "llenvmanager.h"
#include "llfilepicker.h"
#include "llfirstuse.h"
#include "llfloaterbuy.h"
@@ -60,6 +61,7 @@
#include "llfloatersnapshot.h"
#include "llfloatertools.h"
#include "llfloaterworldmap.h"
+#include "llfloaterbuildoptions.h"
#include "llavataractions.h"
#include "lllandmarkactions.h"
#include "llgroupmgr.h"
@@ -106,6 +108,8 @@
#include "llappearancemgr.h"
#include "lltrans.h"
#include "lleconomy.h"
+#include "lltoolgrab.h"
+#include "llwindow.h"
#include "boost/unordered_map.hpp"
using namespace LLVOAvatarDefines;
@@ -1000,9 +1004,9 @@ U32 info_display_from_string(std::string info_display)
{
return LLPipeline::RENDER_DEBUG_AGENT_TARGET;
}
- else if ("rendercomplexity" == info_display)
+ else if ("sculpt" == info_display)
{
- return LLPipeline::RENDER_DEBUG_RENDER_COMPLEXITY;
+ return LLPipeline::RENDER_DEBUG_SCULPTED;
}
else
{
@@ -2420,50 +2424,23 @@ class LLObjectEnableReportAbuse : public view_listener_t
}
};
+
void handle_object_touch()
{
- LLViewerObject* object = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject();
- if (!object) return;
-
- LLPickInfo pick = LLToolPie::getInstance()->getPick();
+ LLViewerObject* object = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject();
+ if (!object) return;
- LLMessageSystem *msg = gMessageSystem;
+ LLPickInfo pick = LLToolPie::getInstance()->getPick();
- msg->newMessageFast(_PREHASH_ObjectGrab);
- msg->nextBlockFast( _PREHASH_AgentData);
- msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
- msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
- msg->nextBlockFast( _PREHASH_ObjectData);
- msg->addU32Fast( _PREHASH_LocalID, object->mLocalID);
- msg->addVector3Fast(_PREHASH_GrabOffset, LLVector3::zero );
- msg->nextBlock("SurfaceInfo");
- msg->addVector3("UVCoord", LLVector3(pick.mUVCoords));
- msg->addVector3("STCoord", LLVector3(pick.mSTCoords));
- msg->addS32Fast(_PREHASH_FaceIndex, pick.mObjectFace);
- msg->addVector3("Position", pick.mIntersection);
- msg->addVector3("Normal", pick.mNormal);
- msg->addVector3("Binormal", pick.mBinormal);
- msg->sendMessage( object->getRegion()->getHost());
-
- // *NOTE: Hope the packets arrive safely and in order or else
- // there will be some problems.
- // *TODO: Just fix this bad assumption.
- msg->newMessageFast(_PREHASH_ObjectDeGrab);
- msg->nextBlockFast(_PREHASH_AgentData);
- msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
- msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
- msg->nextBlockFast(_PREHASH_ObjectData);
- msg->addU32Fast(_PREHASH_LocalID, object->mLocalID);
- msg->nextBlock("SurfaceInfo");
- msg->addVector3("UVCoord", LLVector3(pick.mUVCoords));
- msg->addVector3("STCoord", LLVector3(pick.mSTCoords));
- msg->addS32Fast(_PREHASH_FaceIndex, pick.mObjectFace);
- msg->addVector3("Position", pick.mIntersection);
- msg->addVector3("Normal", pick.mNormal);
- msg->addVector3("Binormal", pick.mBinormal);
- msg->sendMessage(object->getRegion()->getHost());
+ // *NOTE: Hope the packets arrive safely and in order or else
+ // there will be some problems.
+ // *TODO: Just fix this bad assumption.
+ send_ObjectGrab_message(object, pick, LLVector3::zero);
+ send_ObjectDeGrab_message(object, pick);
}
+
+
static void init_default_item_label(const std::string& item_name)
{
boost::unordered_map<std::string, LLStringExplicit>::iterator it = sDefaultItemLabels.find(item_name);
@@ -7185,9 +7162,11 @@ class LLToolsUseSelectionForGrid : public view_listener_t
} func;
LLSelectMgr::getInstance()->getSelection()->applyToRootObjects(&func);
LLSelectMgr::getInstance()->setGridMode(GRID_MODE_REF_OBJECT);
- if (gFloaterTools)
+
+ LLFloaterBuildOptions* build_options_floater = LLFloaterReg::getTypedInstance<LLFloaterBuildOptions>("build_options");
+ if (build_options_floater && build_options_floater->getVisible())
{
- gFloaterTools->mComboGridMode->setCurrentByIndex((S32)GRID_MODE_REF_OBJECT);
+ build_options_floater->setGridMode(GRID_MODE_REF_OBJECT);
}
return true;
}
@@ -7608,74 +7587,85 @@ class LLWorldEnvSettings : public view_listener_t
bool handleEvent(const LLSD& userdata)
{
std::string tod = userdata.asString();
- LLVector3 sun_direction;
if (tod == "editor")
{
- // if not there or is hidden, show it
LLFloaterReg::toggleInstance("env_settings");
return true;
}
-
+
if (tod == "sunrise")
{
- // set the value, turn off animation
- LLWLParamManager::instance()->mAnimator.setDayTime(0.25);
- LLWLParamManager::instance()->mAnimator.mIsRunning = false;
- LLWLParamManager::instance()->mAnimator.mUseLindenTime = false;
-
- // then call update once
- LLWLParamManager::instance()->mAnimator.update(
- LLWLParamManager::instance()->mCurParams);
+ LLEnvManagerNew::instance().setUseSkyPreset("Sunrise");
}
else if (tod == "noon")
{
- // set the value, turn off animation
- LLWLParamManager::instance()->mAnimator.setDayTime(0.567);
- LLWLParamManager::instance()->mAnimator.mIsRunning = false;
- LLWLParamManager::instance()->mAnimator.mUseLindenTime = false;
-
- // then call update once
- LLWLParamManager::instance()->mAnimator.update(
- LLWLParamManager::instance()->mCurParams);
+ LLEnvManagerNew::instance().setUseSkyPreset("Midday");
}
else if (tod == "sunset")
{
- // set the value, turn off animation
- LLWLParamManager::instance()->mAnimator.setDayTime(0.75);
- LLWLParamManager::instance()->mAnimator.mIsRunning = false;
- LLWLParamManager::instance()->mAnimator.mUseLindenTime = false;
-
- // then call update once
- LLWLParamManager::instance()->mAnimator.update(
- LLWLParamManager::instance()->mCurParams);
+ LLEnvManagerNew::instance().setUseSkyPreset("Sunset");
}
else if (tod == "midnight")
{
- // set the value, turn off animation
- LLWLParamManager::instance()->mAnimator.setDayTime(0.0);
- LLWLParamManager::instance()->mAnimator.mIsRunning = false;
- LLWLParamManager::instance()->mAnimator.mUseLindenTime = false;
-
- // then call update once
- LLWLParamManager::instance()->mAnimator.update(
- LLWLParamManager::instance()->mCurParams);
+ LLEnvManagerNew::instance().setUseSkyPreset("Midnight");
}
else
{
- LLWLParamManager::instance()->mAnimator.mIsRunning = true;
- LLWLParamManager::instance()->mAnimator.mUseLindenTime = true;
+ LLEnvManagerNew::instance().setUseDayCycle(LLEnvManagerNew::instance().getDayCycleName());
}
+
return true;
}
};
-/// Water Menu callbacks
-class LLWorldWaterSettings : public view_listener_t
-{
+class LLWorldEnvPreset : public view_listener_t
+{
bool handleEvent(const LLSD& userdata)
{
- LLFloaterReg::toggleInstance("env_water");
+ std::string item = userdata.asString();
+
+ if (item == "new_water")
+ {
+ LLFloaterReg::showInstance("env_edit_water", "new");
+ }
+ else if (item == "edit_water")
+ {
+ LLFloaterReg::showInstance("env_edit_water", "edit");
+ }
+ else if (item == "delete_water")
+ {
+ LLFloaterReg::showInstance("env_delete_preset", "water");
+ }
+ else if (item == "new_sky")
+ {
+ LLFloaterReg::showInstance("env_edit_sky", "new");
+ }
+ else if (item == "edit_sky")
+ {
+ LLFloaterReg::showInstance("env_edit_sky", "edit");
+ }
+ else if (item == "delete_sky")
+ {
+ LLFloaterReg::showInstance("env_delete_preset", "sky");
+ }
+ else if (item == "new_day_cycle")
+ {
+ LLFloaterReg::showInstance("env_edit_day_cycle", "new");
+ }
+ else if (item == "edit_day_cycle")
+ {
+ LLFloaterReg::showInstance("env_edit_day_cycle", "edit");
+ }
+ else if (item == "delete_day_cycle")
+ {
+ LLFloaterReg::showInstance("env_delete_preset", "day_cycle");
+ }
+ else
+ {
+ llwarns << "Unknown item selected" << llendl;
+ }
+
return true;
}
};
@@ -7690,16 +7680,6 @@ class LLWorldPostProcess : public view_listener_t
}
};
-/// Day Cycle callbacks
-class LLWorldDayCycle : public view_listener_t
-{
- bool handleEvent(const LLSD& userdata)
- {
- LLFloaterReg::showInstance("env_day_cycle");
- return true;
- }
-};
-
class LLWorldToggleMovementControls : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
@@ -7928,9 +7908,8 @@ void initialize_menus()
view_listener_t::addMenu(new LLWorldCheckAlwaysRun(), "World.CheckAlwaysRun");
view_listener_t::addMenu(new LLWorldEnvSettings(), "World.EnvSettings");
- view_listener_t::addMenu(new LLWorldWaterSettings(), "World.WaterSettings");
+ view_listener_t::addMenu(new LLWorldEnvPreset(), "World.EnvPreset");
view_listener_t::addMenu(new LLWorldPostProcess(), "World.PostProcess");
- view_listener_t::addMenu(new LLWorldDayCycle(), "World.DayCycle");
view_listener_t::addMenu(new LLWorldToggleMovementControls(), "World.Toggle.MovementControls");
view_listener_t::addMenu(new LLWorldToggleCameraControls(), "World.Toggle.CameraControls");
diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp
index 37640ad0d4..b9293b3b31 100644
--- a/indra/newview/llviewermenufile.cpp
+++ b/indra/newview/llviewermenufile.cpp
@@ -107,9 +107,7 @@ class LLMeshUploadVisible : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
{
- return gSavedSettings.getBOOL("MeshEnabled") &&
- LLViewerParcelMgr::getInstance()->allowAgentBuild() &&
- !gAgent.getRegion()->getCapability("ObjectAdd").empty();
+ return gMeshRepo.meshUploadEnabled();
}
};
@@ -1203,78 +1201,6 @@ void upload_new_resource(
}
}
-BOOL upload_new_variable_price_resource(
- const LLTransactionID &tid,
- LLAssetType::EType asset_type,
- std::string name,
- std::string desc,
- LLFolderType::EType destination_folder_type,
- LLInventoryType::EType inv_type,
- U32 next_owner_perms,
- U32 group_perms,
- U32 everyone_perms,
- const std::string& display_name,
- const LLSD& asset_resources)
-{
- LLAssetID uuid =
- upload_new_resource_prep(
- tid,
- asset_type,
- inv_type,
- name,
- display_name,
- desc);
-
- llinfos << "*** Uploading: " << llendl;
- llinfos << "Type: " << LLAssetType::lookup(asset_type) << llendl;
- llinfos << "UUID: " << uuid << llendl;
- llinfos << "Name: " << name << llendl;
- llinfos << "Desc: " << desc << llendl;
- lldebugs << "Folder: "
- << gInventory.findCategoryUUIDForType((destination_folder_type == LLFolderType::FT_NONE) ? (LLFolderType::EType)asset_type : destination_folder_type) << llendl;
- lldebugs << "Asset Type: " << LLAssetType::lookup(asset_type) << llendl;
-
- std::string url = gAgent.getRegion()->getCapability(
- "NewFileAgentInventoryVariablePrice");
-
- if ( !url.empty() )
- {
- lldebugs
- << "New Agent Inventory variable price upload" << llendl;
-
- // Each of the two capabilities has similar data, so
- // let's reuse that code
-
- LLSD body;
-
- body = generate_new_resource_upload_capability_body(
- asset_type,
- name,
- desc,
- destination_folder_type,
- inv_type,
- next_owner_perms,
- group_perms,
- everyone_perms);
-
- body["asset_resources"] = asset_resources;
-
- LLHTTPClient::post(
- url,
- body,
- new LLNewAgentInventoryVariablePriceResponder(
- uuid,
- asset_type,
- body));
-
- return TRUE;
- }
- else
- {
- return FALSE;
- }
-}
-
LLAssetID generate_asset_id_for_new_upload(const LLTransactionID& tid)
{
if ( gDisconnected )
diff --git a/indra/newview/llviewermenufile.h b/indra/newview/llviewermenufile.h
index 1597821504..3136358b83 100644
--- a/indra/newview/llviewermenufile.h
+++ b/indra/newview/llviewermenufile.h
@@ -68,23 +68,6 @@ void upload_new_resource(
S32 expected_upload_cost,
void *userdata);
-// TODO* : Move all uploads to use this new function
-// since at some point, that upload path will be deprecated and no longer
-// used
-
-// We make a new function here to ensure that previous code is not broken
-BOOL upload_new_variable_price_resource(
- const LLTransactionID& tid,
- LLAssetType::EType type,
- std::string name,
- std::string desc,
- LLFolderType::EType destination_folder_type,
- LLInventoryType::EType inv_type,
- U32 next_owner_perms,
- U32 group_perms,
- U32 everyone_perms,
- const std::string& display_name,
- const LLSD& asset_resources);
LLAssetID generate_asset_id_for_new_upload(const LLTransactionID& tid);
void increase_new_upload_stats(LLAssetType::EType asset_type);
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 8b80e567b8..e934c38c22 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -37,6 +37,7 @@
#include "lleconomy.h"
#include "lleventtimer.h"
#include "llfloaterreg.h"
+#include "llfolderview.h"
#include "llfollowcamparams.h"
#include "llinventorydefines.h"
#include "lllslconstants.h"
@@ -87,6 +88,7 @@
#include "lluri.h"
#include "llviewergenericmessage.h"
#include "llviewermenu.h"
+#include "llviewerinventory.h"
#include "llviewerjoystick.h"
#include "llviewerobjectlist.h"
#include "llviewerparcelmgr.h"
@@ -96,7 +98,6 @@
#include "llviewerwindow.h"
#include "llvlmanager.h"
#include "llvoavatarself.h"
-#include "llvotextbubble.h"
#include "llworld.h"
#include "pipeline.h"
#include "llfloaterworldmap.h"
@@ -695,7 +696,7 @@ bool join_group_response(const LLSD& notification, const LLSD& response)
return false;
}
-static void highlight_inventory_items_in_panel(const std::vector<LLUUID>& items, LLInventoryPanel *inventory_panel)
+static void highlight_inventory_objects_in_panel(const std::vector<LLUUID>& items, LLInventoryPanel *inventory_panel)
{
if (NULL == inventory_panel) return;
@@ -709,7 +710,7 @@ static void highlight_inventory_items_in_panel(const std::vector<LLUUID>& items,
continue;
}
- LLInventoryItem* item = gInventory.getItem(item_id);
+ LLInventoryObject* item = gInventory.getObject(item_id);
llassert(item);
if (!item) {
continue;
@@ -788,7 +789,6 @@ class LLViewerInventoryMoveFromWorldObserver : public LLInventoryAddItemByAssetO
public:
LLViewerInventoryMoveFromWorldObserver()
: LLInventoryAddItemByAssetObserver()
- , mActivePanel(NULL)
{
}
@@ -799,13 +799,16 @@ private:
/*virtual */void onAssetAdded(const LLUUID& asset_id)
{
// Store active Inventory panel.
- mActivePanel = LLInventoryPanel::getActiveInventoryPanel();
+ if (LLInventoryPanel::getActiveInventoryPanel())
+ {
+ mActivePanel = LLInventoryPanel::getActiveInventoryPanel()->getHandle();
+ }
// Store selected items (without destination folder)
mSelectedItems.clear();
- if (mActivePanel)
+ if (LLInventoryPanel::getActiveInventoryPanel())
{
- mSelectedItems = mActivePanel->getRootFolder()->getSelectionList();
+ mSelectedItems = LLInventoryPanel::getActiveInventoryPanel()->getRootFolder()->getSelectionList();
}
mSelectedItems.erase(mMoveIntoFolderID);
}
@@ -816,12 +819,14 @@ private:
*/
void done()
{
+ LLInventoryPanel* active_panel = dynamic_cast<LLInventoryPanel*>(mActivePanel.get());
+
// if selection is not changed since watch started lets hightlight new items.
- if (mActivePanel && !isSelectionChanged())
+ if (active_panel && !isSelectionChanged())
{
LL_DEBUGS("Inventory_Move") << "Selecting new items..." << LL_ENDL;
- mActivePanel->clearSelection();
- highlight_inventory_items_in_panel(mAddedItems, mActivePanel);
+ active_panel->clearSelection();
+ highlight_inventory_objects_in_panel(mAddedItems, active_panel);
}
}
@@ -829,16 +834,16 @@ private:
* Returns true if selected inventory items were changed since moved inventory items were started to watch.
*/
bool isSelectionChanged()
- {
- const LLInventoryPanel * const current_active_panel = LLInventoryPanel::getActiveInventoryPanel();
+ {
+ LLInventoryPanel* active_panel = dynamic_cast<LLInventoryPanel*>(mActivePanel.get());
- if (NULL == mActivePanel || current_active_panel != mActivePanel)
+ if (NULL == active_panel)
{
return true;
}
// get selected items (without destination folder)
- selected_items_t selected_items = mActivePanel->getRootFolder()->getSelectionList();
+ selected_items_t selected_items = active_panel->getRootFolder()->getSelectionList();
selected_items.erase(mMoveIntoFolderID);
// compare stored & current sets of selected items
@@ -852,7 +857,7 @@ private:
return different_items.size() > 0;
}
- LLInventoryPanel *mActivePanel;
+ LLHandle<LLPanel> mActivePanel;
typedef std::set<LLUUID> selected_items_t;
selected_items_t mSelectedItems;
@@ -881,6 +886,75 @@ void set_dad_inventory_item(LLInventoryItem* inv_item, const LLUUID& into_folder
gInventoryMoveObserver->watchAsset(inv_item->getAssetUUID());
}
+
+/**
+ * Class to observe moving of items and to select them in inventory.
+ *
+ * Used currently for dragging from inbox to regular inventory folders
+ */
+
+class LLViewerInventoryMoveObserver : public LLInventoryObserver
+{
+public:
+
+ LLViewerInventoryMoveObserver(const LLUUID& object_id)
+ : LLInventoryObserver()
+ , mObjectID(object_id)
+ {
+ if (LLInventoryPanel::getActiveInventoryPanel())
+ {
+ mActivePanel = LLInventoryPanel::getActiveInventoryPanel()->getHandle();
+ }
+ }
+
+ virtual ~LLViewerInventoryMoveObserver() {}
+ virtual void changed(U32 mask);
+
+private:
+ LLUUID mObjectID;
+ LLHandle<LLPanel> mActivePanel;
+
+};
+
+void LLViewerInventoryMoveObserver::changed(U32 mask)
+{
+ LLInventoryPanel* active_panel = dynamic_cast<LLInventoryPanel*>(mActivePanel.get());
+
+ if (NULL == active_panel)
+ {
+ gInventory.removeObserver(this);
+ return;
+ }
+
+ if((mask & (LLInventoryObserver::STRUCTURE)) != 0)
+ {
+ const std::set<LLUUID>& changed_items = gInventory.getChangedIDs();
+
+ std::set<LLUUID>::const_iterator id_it = changed_items.begin();
+ std::set<LLUUID>::const_iterator id_end = changed_items.end();
+ for (;id_it != id_end; ++id_it)
+ {
+ if ((*id_it) == mObjectID)
+ {
+ active_panel->clearSelection();
+ std::vector<LLUUID> items;
+ items.push_back(mObjectID);
+ highlight_inventory_objects_in_panel(items, active_panel);
+ active_panel->getRootFolder()->scrollToShowSelection();
+
+ gInventory.removeObserver(this);
+ break;
+ }
+ }
+ }
+}
+
+void set_dad_inbox_object(const LLUUID& object_id)
+{
+ LLViewerInventoryMoveObserver* move_observer = new LLViewerInventoryMoveObserver(object_id);
+ gInventory.addObserver(move_observer);
+}
+
//unlike the FetchObserver for AgentOffer, we only make one
//instance of the AddedObserver for TaskOffers
//and it never dies. We do this because we don't know the UUID of
@@ -937,7 +1011,6 @@ protected:
//one global instance to bind them
LLOpenTaskOffer* gNewInventoryObserver=NULL;
-
class LLNewInventoryHintObserver : public LLInventoryAddedObserver
{
protected:
@@ -947,6 +1020,8 @@ protected:
}
};
+LLNewInventoryHintObserver* gNewInventoryHintObserver=NULL;
+
void start_new_inventory_observer()
{
if (!gNewInventoryObserver) //task offer observer
@@ -963,7 +1038,12 @@ void start_new_inventory_observer()
gInventory.addObserver(gInventoryMoveObserver);
}
- gInventory.addObserver(new LLNewInventoryHintObserver());
+ if (!gNewInventoryHintObserver)
+ {
+ // Observer is deleted by gInventory
+ gNewInventoryHintObserver = new LLNewInventoryHintObserver();
+ gInventory.addObserver(gNewInventoryHintObserver);
+ }
}
class LLDiscardAgentOffer : public LLInventoryFetchItemsObserver
@@ -1502,7 +1582,7 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD&
log_message = chatHistory_string + " " + LLTrans::getString("InvOfferGaveYou") + " " + mDesc + LLTrans::getString(".");
LLSD args;
args["MESSAGE"] = log_message;
- LLNotificationsUtil::add("SystemMessage", args);
+ LLNotificationsUtil::add("SystemMessageTip", args);
}
break;
@@ -1676,7 +1756,7 @@ bool LLOfferInfo::inventory_task_offer_callback(const LLSD& notification, const
log_message = chatHistory_string + " " + LLTrans::getString("InvOfferGaveYou") + " " + mDesc + LLTrans::getString(".");
LLSD args;
args["MESSAGE"] = log_message;
- LLNotificationsUtil::add("SystemMessage", args);
+ LLNotificationsUtil::add("SystemMessageTip", args);
}
// we will want to open this item when it comes back.
@@ -1727,7 +1807,7 @@ bool LLOfferInfo::inventory_task_offer_callback(const LLSD& notification, const
LLSD args;
args["MESSAGE"] = log_message;
- LLNotificationsUtil::add("SystemMessage", args);
+ LLNotificationsUtil::add("SystemMessageTip", args);
}
if (busy && (!mFromGroup && !mFromObject))
@@ -2603,6 +2683,9 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
args["NAME"] = LLSLURL("agent", from_id, "completename").getSLURLString();;
LLSD payload;
payload["from_id"] = from_id;
+ // Passing the "SESSION_NAME" to use it for IM notification logging
+ // in LLTipHandler::processNotification(). See STORM-941.
+ payload["SESSION_NAME"] = name;
LLNotificationsUtil::add("InventoryAccepted", args, payload);
break;
}
@@ -3210,7 +3293,6 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)
if (is_audible)
{
BOOL visible_in_chat_bubble = FALSE;
- std::string verb;
color.setVec(1.f,1.f,1.f,1.f);
msg->getStringFast(_PREHASH_ChatData, _PREHASH_Message, mesg);
@@ -3259,18 +3341,19 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)
}
else
{
+ chat.mText = "";
switch(chat.mChatType)
{
case CHAT_TYPE_WHISPER:
- verb = LLTrans::getString("whisper") + " ";
+ chat.mText = LLTrans::getString("whisper") + " ";
break;
case CHAT_TYPE_DEBUG_MSG:
case CHAT_TYPE_OWNER:
case CHAT_TYPE_NORMAL:
- verb = "";
+ case CHAT_TYPE_DIRECT:
break;
case CHAT_TYPE_SHOUT:
- verb = LLTrans::getString("shout") + " ";
+ chat.mText = LLTrans::getString("shout") + " ";
break;
case CHAT_TYPE_START:
case CHAT_TYPE_STOP:
@@ -3278,13 +3361,9 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)
break;
default:
LL_WARNS("Messaging") << "Unknown type " << chat.mChatType << " in chat!" << LL_ENDL;
- verb = "";
break;
}
-
- chat.mText = "";
- chat.mText += verb;
chat.mText += mesg;
}
@@ -4229,15 +4308,8 @@ void process_kill_object(LLMessageSystem *mesgsys, void **user_data)
// Display green bubble on kill
if ( gShowObjectUpdates )
{
- LLViewerObject* newobject;
- newobject = gObjectList.createObjectViewer(LL_PCODE_LEGACY_TEXT_BUBBLE, objectp->getRegion());
-
- LLVOTextBubble* bubble = (LLVOTextBubble*) newobject;
-
- bubble->mColor.setVec(0.f, 1.f, 0.f, 1.f);
- bubble->setScale( 2.0f * bubble->getScale() );
- bubble->setPositionGlobal(objectp->getPositionGlobal());
- gPipeline.addObject(bubble);
+ LLColor4 color(0.f,1.f,0.f,1.f);
+ gPipeline.addDebugBlip(objectp->getPositionAgent(), color);
}
// Do the kill
@@ -4274,8 +4346,7 @@ void process_time_synch(LLMessageSystem *mesgsys, void **user_data)
LLWorld::getInstance()->setSpaceTimeUSec(space_time_usec);
- //LL_DEBUGS("Messaging") << "time_synch() - " << sun_direction << ", " << sun_ang_velocity
- // << ", " << phase << LL_ENDL;
+ LL_DEBUGS("Windlight Sync") << "Sun phase: " << phase << " rad = " << fmodf(phase / F_TWO_PI + 0.25, 1.f) * 24.f << " h" << LL_ENDL;
gSky.setSunPhase(phase);
gSky.setSunTargetDirection(sun_direction, sun_ang_velocity);
@@ -4334,6 +4405,12 @@ void process_sound_trigger(LLMessageSystem *msg, void **)
return;
}
+ // Don't play sounds from gestures if they are not enabled.
+ if (object_id == owner_id && !gSavedSettings.getBOOL("EnableGestureSounds"))
+ {
+ return;
+ }
+
gAudiop->triggerSound(sound_id, owner_id, gain, LLAudioEngine::AUDIO_TYPE_SFX, pos_global);
}
@@ -5373,10 +5450,10 @@ bool attempt_standard_notification(LLMessageSystem* msgsystem)
{
// notification was specified using the new mechanism, so we can just handle it here
std::string notificationID;
- msgsystem->getStringFast(_PREHASH_AlertInfo, _PREHASH_Message, notificationID);
- if (!LLNotifications::getInstance()->templateExists(notificationID))
- {
- return false;
+ msgsystem->getStringFast(_PREHASH_AlertInfo, _PREHASH_Message, notificationID);
+ if (!LLNotifications::getInstance()->templateExists(notificationID))
+ {
+ return false;
}
std::string llsdRaw;
@@ -6267,6 +6344,18 @@ void send_group_notice(const LLUUID& group_id,
bool handle_lure_callback(const LLSD& notification, const LLSD& response)
{
+ static const unsigned OFFER_RECIPIENT_LIMIT = 250;
+ if(notification["payload"]["ids"].size() > OFFER_RECIPIENT_LIMIT)
+ {
+ // More than OFFER_RECIPIENT_LIMIT targets will overload the message
+ // producing an llerror.
+ LLSD args;
+ args["OFFERS"] = notification["payload"]["ids"].size();
+ args["LIMIT"] = static_cast<int>(OFFER_RECIPIENT_LIMIT);
+ LLNotificationsUtil::add("TooManyTeleportOffers", args);
+ return false;
+ }
+
std::string text = response["message"].asString();
LLSLURL slurl;
LLAgentUI::buildSLURL(slurl);
@@ -6484,10 +6573,14 @@ void process_script_dialog(LLMessageSystem* msg, void**)
LLSD payload;
LLUUID object_id;
- LLUUID owner_id;
-
msg->getUUID("Data", "ObjectID", object_id);
+
+// For compability with OS grids first check for presence of extended packet before fetching data.
+ LLUUID owner_id;
+ if (gMessageSystem->getNumberOfBlocks("OwnerData") > 0)
+ {
msg->getUUID("OwnerData", "OwnerID", owner_id);
+ }
if (LLMuteList::getInstance()->isMuted(object_id) || LLMuteList::getInstance()->isMuted(owner_id))
{
diff --git a/indra/newview/llviewermessage.h b/indra/newview/llviewermessage.h
index b4a9b8e677..9d09d9c01a 100644
--- a/indra/newview/llviewermessage.h
+++ b/indra/newview/llviewermessage.h
@@ -203,6 +203,8 @@ void open_inventory_offer(const uuid_vec_t& items, const std::string& from_name)
bool highlight_offered_object(const LLUUID& obj_id);
void set_dad_inventory_item(LLInventoryItem* inv_item, const LLUUID& into_folder_uuid);
+void set_dad_inbox_object(const LLUUID& object_id);
+
class LLOfferInfo : public LLNotificationResponderInterface
{
diff --git a/indra/newview/llviewernetwork.cpp b/indra/newview/llviewernetwork.cpp
index a59afdc28a..ef5c65eb87 100644
--- a/indra/newview/llviewernetwork.cpp
+++ b/indra/newview/llviewernetwork.cpp
@@ -35,7 +35,7 @@
#include "llweb.h"
-const char* DEFAULT_LOGIN_PAGE = "http://secondlife.com/app/login/";
+const char* DEFAULT_LOGIN_PAGE = "http://viewer-login.agni.lindenlab.com/";
const char* SYSTEM_GRID_SLURL_BASE = "secondlife://%s/secondlife/";
const char* MAIN_GRID_SLURL_BASE = "http://maps.secondlife.com/secondlife/";
diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp
index 6d493bfcd5..b5fdca632b 100644
--- a/indra/newview/llviewerobject.cpp
+++ b/indra/newview/llviewerobject.cpp
@@ -81,7 +81,6 @@
#include "llviewerwindow.h" // For getSpinAxis
#include "llvoavatar.h"
#include "llvoavatarself.h"
-#include "llvoclouds.h"
#include "llvograss.h"
#include "llvoground.h"
#include "llvolume.h"
@@ -89,7 +88,6 @@
#include "llvopartgroup.h"
#include "llvosky.h"
#include "llvosurfacepatch.h"
-#include "llvotextbubble.h"
#include "llvotree.h"
#include "llvovolume.h"
#include "llvowater.h"
@@ -102,6 +100,7 @@
#include "lltrans.h"
#include "llsdutil.h"
#include "llmediaentry.h"
+#include "llaccountingquota.h"
//#define DEBUG_UPDATE_TYPE
@@ -167,10 +166,6 @@ LLViewerObject *LLViewerObject::createObject(const LLUUID &id, const LLPCode pco
// llwarns << "Creating new tree!" << llendl;
// res = new LLVOTree(id, pcode, regionp); break;
res = NULL; break;
- case LL_PCODE_LEGACY_TEXT_BUBBLE:
- res = new LLVOTextBubble(id, pcode, regionp); break;
- case LL_VO_CLOUDS:
- res = new LLVOClouds(id, pcode, regionp); break;
case LL_VO_SURFACE_PATCH:
res = new LLVOSurfacePatch(id, pcode, regionp); break;
case LL_VO_SKY:
@@ -521,7 +516,6 @@ void LLViewerObject::setNameValueList(const std::string& name_value_list)
}
}
-
// This method returns true if the object is over land owned by the
// agent.
bool LLViewerObject::isReturnable()
@@ -530,17 +524,108 @@ bool LLViewerObject::isReturnable()
{
return false;
}
+
std::vector<LLBBox> boxes;
boxes.push_back(LLBBox(getPositionRegion(), getRotationRegion(), getScale() * -0.5f, getScale() * 0.5f).getAxisAligned());
for (child_list_t::iterator iter = mChildList.begin();
iter != mChildList.end(); iter++)
{
LLViewerObject* child = *iter;
- boxes.push_back(LLBBox(child->getPositionRegion(), child->getRotationRegion(), child->getScale() * -0.5f, child->getScale() * 0.5f).getAxisAligned());
+ boxes.push_back( LLBBox(child->getPositionRegion(), child->getRotationRegion(), child->getScale() * -0.5f, child->getScale() * 0.5f).getAxisAligned());
}
- return mRegionp
- && mRegionp->objectIsReturnable(getPositionRegion(), boxes);
+ bool result = (mRegionp && mRegionp->objectIsReturnable(getPositionRegion(), boxes)) ? 1 : 0;
+
+ if ( !result )
+ {
+ //Get list of neighboring regions relative to this vo's region
+ std::vector<LLViewerRegion*> uniqueRegions;
+ mRegionp->getNeighboringRegions( uniqueRegions );
+
+ //Build aabb's - for root and all children
+ std::vector<PotentialReturnableObject> returnables;
+ typedef std::vector<LLViewerRegion*>::iterator RegionIt;
+ RegionIt regionStart = uniqueRegions.begin();
+ RegionIt regionEnd = uniqueRegions.end();
+
+ for (; regionStart != regionEnd; ++regionStart )
+ {
+ LLViewerRegion* pTargetRegion = *regionStart;
+ //Add the root vo as there may be no children and we still want
+ //to test for any edge overlap
+ buildReturnablesForChildrenVO( returnables, this, pTargetRegion );
+ //Add it's children
+ for (child_list_t::iterator iter = mChildList.begin(); iter != mChildList.end(); iter++)
+ {
+ LLViewerObject* pChild = *iter;
+ buildReturnablesForChildrenVO( returnables, pChild, pTargetRegion );
+ }
+ }
+
+ //TBD#Eventually create a region -> box list map
+ typedef std::vector<PotentialReturnableObject>::iterator ReturnablesIt;
+ ReturnablesIt retCurrentIt = returnables.begin();
+ ReturnablesIt retEndIt = returnables.end();
+
+ for ( ; retCurrentIt !=retEndIt; ++retCurrentIt )
+ {
+ boxes.clear();
+ LLViewerRegion* pRegion = (*retCurrentIt).pRegion;
+ boxes.push_back( (*retCurrentIt).box );
+ bool retResult = pRegion
+ && pRegion->childrenObjectReturnable( boxes )
+ && pRegion->canManageEstate();
+ if ( retResult )
+ {
+ result = true;
+ break;
+ }
+ }
+ }
+ return result;
+}
+
+void LLViewerObject::buildReturnablesForChildrenVO( std::vector<PotentialReturnableObject>& returnables, LLViewerObject* pChild, LLViewerRegion* pTargetRegion )
+{
+ if ( !pChild )
+ {
+ llerrs<<"child viewerobject is NULL "<<llendl;
+ }
+
+ constructAndAddReturnable( returnables, pChild, pTargetRegion );
+
+ //We want to handle any children VO's as well
+ for (child_list_t::iterator iter = pChild->mChildList.begin(); iter != pChild->mChildList.end(); iter++)
+ {
+ LLViewerObject* pChildofChild = *iter;
+ buildReturnablesForChildrenVO( returnables, pChildofChild, pTargetRegion );
+ }
+}
+
+void LLViewerObject::constructAndAddReturnable( std::vector<PotentialReturnableObject>& returnables, LLViewerObject* pChild, LLViewerRegion* pTargetRegion )
+{
+
+ LLVector3 targetRegionPos;
+ targetRegionPos.setVec( pChild->getPositionGlobal() );
+
+ LLBBox childBBox = LLBBox( targetRegionPos, pChild->getRotationRegion(), pChild->getScale() * -0.5f,
+ pChild->getScale() * 0.5f).getAxisAligned();
+
+ LLVector3 edgeA = targetRegionPos + childBBox.getMinLocal();
+ LLVector3 edgeB = targetRegionPos + childBBox.getMaxLocal();
+
+ LLVector3d edgeAd, edgeBd;
+ edgeAd.setVec(edgeA);
+ edgeBd.setVec(edgeB);
+
+ //Only add the box when either of the extents are in a neighboring region
+ if ( pTargetRegion->pointInRegionGlobal( edgeAd ) || pTargetRegion->pointInRegionGlobal( edgeBd ) )
+ {
+ PotentialReturnableObject returnableObj;
+ returnableObj.box = childBBox;
+ returnableObj.pRegion = pTargetRegion;
+ returnables.push_back( returnableObj );
+ }
}
BOOL LLViewerObject::setParent(LLViewerObject* parent)
@@ -1893,7 +1978,7 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
//
//
- // WTF? If we're going to skip this message, why are we
+ // If we're going to skip this message, why are we
// doing all the parenting, etc above?
U32 packet_id = mesgsys->getCurrentRecvPacketID();
if (packet_id < mLatestRecvPacketID &&
@@ -1972,23 +2057,16 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
if ( gShowObjectUpdates )
{
- if (!((mPrimitiveCode == LL_PCODE_LEGACY_AVATAR) && (((LLVOAvatar *) this)->isSelf()))
- && mRegionp)
+ LLColor4 color;
+ if (update_type == OUT_TERSE_IMPROVED)
{
- LLViewerObject* object = gObjectList.createObjectViewer(LL_PCODE_LEGACY_TEXT_BUBBLE, mRegionp);
- LLVOTextBubble* bubble = (LLVOTextBubble*) object;
-
- if (update_type == OUT_TERSE_IMPROVED)
- {
- bubble->mColor.setVec(0.f, 0.f, 1.f, 1.f);
- }
- else
- {
- bubble->mColor.setVec(1.f, 0.f, 0.f, 1.f);
- }
- object->setPositionGlobal(getPositionGlobal());
- gPipeline.addObject(object);
+ color.setVec(0.f, 0.f, 1.f, 1.f);
+ }
+ else
+ {
+ color.setVec(1.f, 0.f, 0.f, 1.f);
}
+ gPipeline.addDebugBlip(getPositionAgent(), color);
}
if ((0.0f == vel_mag_sq) &&
@@ -4799,6 +4877,10 @@ void LLViewerObject::adjustAudioGain(const F32 gain)
bool LLViewerObject::unpackParameterEntry(U16 param_type, LLDataPacker *dp)
{
+ if (LLNetworkData::PARAMS_MESH == param_type)
+ {
+ param_type = LLNetworkData::PARAMS_SCULPT;
+ }
ExtraParameter* param = getExtraParameterEntryCreate(param_type);
if (param)
{
@@ -5282,7 +5364,7 @@ bool LLViewerObject::specialHoverCursor() const
|| (mClickAction != 0);
}
-void LLViewerObject::updateFlags()
+void LLViewerObject::updateFlags(BOOL physics_changed)
{
LLViewerRegion* regionp = getRegion();
if(!regionp) return;
@@ -5295,12 +5377,15 @@ void LLViewerObject::updateFlags()
gMessageSystem->addBOOL("IsTemporary", flagTemporaryOnRez() );
gMessageSystem->addBOOL("IsPhantom", flagPhantom() );
gMessageSystem->addBOOL("CastsShadows", flagCastShadows() );
- gMessageSystem->nextBlock("ExtraPhysics");
- gMessageSystem->addU8("PhysicsShapeType", getPhysicsShapeType() );
- gMessageSystem->addF32("Density", getPhysicsDensity() );
- gMessageSystem->addF32("Friction", getPhysicsFriction() );
- gMessageSystem->addF32("Restitution", getPhysicsRestitution() );
- gMessageSystem->addF32("GravityMultiplier", getPhysicsGravity() );
+ if (physics_changed)
+ {
+ gMessageSystem->nextBlock("ExtraPhysics");
+ gMessageSystem->addU8("PhysicsShapeType", getPhysicsShapeType() );
+ gMessageSystem->addF32("Density", getPhysicsDensity() );
+ gMessageSystem->addF32("Friction", getPhysicsFriction() );
+ gMessageSystem->addF32("Restitution", getPhysicsRestitution() );
+ gMessageSystem->addF32("GravityMultiplier", getPhysicsGravity() );
+ }
gMessageSystem->sendReliable( regionp->getHost() );
}
@@ -5699,3 +5784,10 @@ public:
LLHTTPRegistration<ObjectPhysicsProperties>
gHTTPRegistrationObjectPhysicsProperties("/message/ObjectPhysicsProperties");
+
+
+void LLViewerObject::updateQuota( const SelectionQuota& quota )
+{
+ //update quotas
+ mSelectionQuota = quota;
+}
diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h
index e417343bec..1828a64917 100644
--- a/indra/newview/llviewerobject.h
+++ b/indra/newview/llviewerobject.h
@@ -43,11 +43,12 @@
#include "v3dmath.h"
#include "v3math.h"
#include "llvertexbuffer.h"
+#include "llaccountingquota.h"
+#include "llbbox.h"
class LLAgent; // TODO: Get rid of this.
class LLAudioSource;
class LLAudioSourceVO;
-class LLBBox;
class LLDataPacker;
class LLColor4;
class LLFrameTimer;
@@ -111,6 +112,12 @@ public:
LLColor4 mColor;
};
+struct PotentialReturnableObject
+{
+ LLBBox box;
+ LLViewerRegion* pRegion;
+};
+
//============================================================================
class LLViewerObject : public LLPrimitive, public LLRefCount, public LLGLUpdate
@@ -233,6 +240,9 @@ public:
// anti-encroachment is enabled
bool isReturnable();
+ void buildReturnablesForChildrenVO( std::vector<PotentialReturnableObject>& returnables, LLViewerObject* pChild, LLViewerRegion* pTargetRegion );
+ void constructAndAddReturnable( std::vector<PotentialReturnableObject>& returnables, LLViewerObject* pChild, LLViewerRegion* pTargetRegion );
+
/*
// This method will scan through this object, and then query the
// selection manager to see if the local agent probably has the
@@ -488,7 +498,7 @@ public:
void setRegion(LLViewerRegion *regionp);
virtual void updateRegion(LLViewerRegion *regionp);
- void updateFlags();
+ void updateFlags(BOOL physics_changed = FALSE);
BOOL setFlags(U32 flag, BOOL state);
void setPhysicsShapeType(U8 type);
void setPhysicsGravity(F32 gravity);
@@ -546,7 +556,7 @@ public:
//
typedef enum e_vo_types
{
- LL_VO_CLOUDS = LL_PCODE_APP | 0x20,
+ LL_VO_CLOUDS = LL_PCODE_APP | 0x20, // no longer used
LL_VO_SURFACE_PATCH = LL_PCODE_APP | 0x30,
LL_VO_WL_SKY = LL_PCODE_APP | 0x40,
LL_VO_SQUARE_TORUS = LL_PCODE_APP | 0x50,
@@ -643,7 +653,11 @@ protected:
void unpackParticleSource(LLDataPacker &dp, const LLUUID& owner_id);
void deleteParticleSource();
void setParticleSource(const LLPartSysData& particle_parameters, const LLUUID& owner_id);
-
+
+public:
+ void updateQuota( const SelectionQuota& quota );
+ const SelectionQuota& getQuota( void ) { return mSelectionQuota; }
+
private:
void setNameValueList(const std::string& list); // clears nv pairs and then individually adds \n separated NV pairs from \0 terminated string
void deleteTEImages(); // correctly deletes list of images
@@ -705,6 +719,8 @@ protected:
F32 mPhysicsCost;
F32 mLinksetPhysicsCost;
+ SelectionQuota mSelectionQuota;
+
bool mCostStale;
mutable bool mPhysicsShapeUnknown;
diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp
index 59c40e420f..d6f9696e77 100644
--- a/indra/newview/llviewerobjectlist.cpp
+++ b/indra/newview/llviewerobjectlist.cpp
@@ -958,8 +958,7 @@ void LLViewerObjectList::update(LLAgent &agent, LLWorld &world)
iter != idle_list.end(); iter++)
{
objectp = *iter;
- if (objectp->getPCode() == LLViewerObject::LL_VO_CLOUDS ||
- objectp->isAvatar())
+ if (objectp->isAvatar())
{
objectp->idleUpdate(agent, world, frame_time);
}
@@ -1076,10 +1075,12 @@ void LLViewerObjectList::fetchObjectCosts()
LLSD id_list;
U32 object_index = 0;
+ U32 count = 0;
+
for (
std::set<LLUUID>::iterator iter = mStaleObjectCost.begin();
iter != mStaleObjectCost.end();
- ++iter)
+ )
{
// Check to see if a request for this object
// has already been made.
@@ -1089,13 +1090,15 @@ void LLViewerObjectList::fetchObjectCosts()
mPendingObjectCost.insert(*iter);
id_list[object_index++] = *iter;
}
- }
- // id_list should now contain all
- // requests in mStaleObjectCost before, so clear
- // it now
- mStaleObjectCost.clear();
+ mStaleObjectCost.erase(iter++);
+ if (count++ >= 450)
+ {
+ break;
+ }
+ }
+
if ( id_list.size() > 0 )
{
LLSD post_data = LLSD::emptyMap();
@@ -1399,6 +1402,10 @@ void LLViewerObjectList::updateActive(LLViewerObject *objectp)
void LLViewerObjectList::updateObjectCost(LLViewerObject* object)
{
+ if (!object->isRoot())
+ { //always fetch cost for the parent when fetching cost for children
+ mStaleObjectCost.insert(((LLViewerObject*)object->getParent())->getID());
+ }
mStaleObjectCost.insert(object->getID());
}
@@ -1422,6 +1429,15 @@ void LLViewerObjectList::onObjectCostFetchFailure(const LLUUID& object_id)
mPendingObjectCost.erase(object_id);
}
+void LLViewerObjectList::updateQuota( const LLUUID& objectId, const SelectionQuota& quota )
+{
+ LLViewerObject* pVO = findObject( objectId );
+ if ( pVO )
+ {
+ pVO->updateQuota( quota );
+ }
+}
+
void LLViewerObjectList::updatePhysicsFlags(const LLViewerObject* object)
{
mStalePhysicsFlags.insert(object->getID());
@@ -1492,6 +1508,24 @@ void LLViewerObjectList::shiftObjects(const LLVector3 &offset)
LLWorld::getInstance()->shiftRegions(offset);
}
+void LLViewerObjectList::repartitionObjects()
+{
+ for (vobj_list_t::iterator iter = mObjects.begin(); iter != mObjects.end(); ++iter)
+ {
+ LLViewerObject* objectp = *iter;
+ if (!objectp->isDead())
+ {
+ LLDrawable* drawable = objectp->mDrawable;
+ if (drawable && !drawable->isDead())
+ {
+ drawable->updateBinRadius();
+ drawable->updateSpatialExtents();
+ drawable->movePartition();
+ }
+ }
+ }
+}
+
//debug code
bool LLViewerObjectList::hasMapObjectInRegion(LLViewerRegion* regionp)
{
diff --git a/indra/newview/llviewerobjectlist.h b/indra/newview/llviewerobjectlist.h
index 65374bca70..9d1b5cb56f 100644
--- a/indra/newview/llviewerobjectlist.h
+++ b/indra/newview/llviewerobjectlist.h
@@ -36,6 +36,7 @@
// project includes
#include "llviewerobject.h"
+#include "llaccountingquota.h"
class LLCamera;
class LLNetMap;
@@ -101,7 +102,10 @@ public:
F32 restitution,
F32 gravity_multiplier);
+ void updateQuota( const LLUUID& objectId, const SelectionQuota& costs );
+
void shiftObjects(const LLVector3 &offset);
+ void repartitionObjects();
bool hasMapObjectInRegion(LLViewerRegion* regionp) ;
void clearAllMapObjectsInRegion(LLViewerRegion* regionp) ;
diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp
index 5ae4e872f3..8db72da1ee 100644
--- a/indra/newview/llviewerparcelmgr.cpp
+++ b/indra/newview/llviewerparcelmgr.cpp
@@ -2202,9 +2202,9 @@ bool LLViewerParcelMgr::canAgentBuyParcel(LLParcel* parcel, bool forGroup) const
= parcelOwner == (forGroup ? gAgent.getGroupID() : gAgent.getID());
bool isAuthorized
- = (authorizeBuyer.isNull()
- || (gAgent.getID() == authorizeBuyer)
- || (gAgent.hasPowerInGroup(authorizeBuyer,GP_LAND_DEED)
+ = (authorizeBuyer.isNull()
+ || (gAgent.getID() == authorizeBuyer)
+ || (gAgent.hasPowerInGroup(authorizeBuyer,GP_LAND_DEED)
&& gAgent.hasPowerInGroup(authorizeBuyer,GP_LAND_SET_SALE_INFO)));
return isForSale && !isOwner && isAuthorized && isEmpowered;
diff --git a/indra/newview/llviewerparceloverlay.cpp b/indra/newview/llviewerparceloverlay.cpp
index 26765bdd01..eff16b6a6e 100644
--- a/indra/newview/llviewerparceloverlay.cpp
+++ b/indra/newview/llviewerparceloverlay.cpp
@@ -173,6 +173,33 @@ bool LLViewerParcelOverlay::encroachesOwned(const std::vector<LLBBox>& boxes) co
}
return false;
}
+bool LLViewerParcelOverlay::encroachesOnUnowned(const std::vector<LLBBox>& boxes) const
+{
+ // boxes are expected to already be axis aligned
+ for (U32 i = 0; i < boxes.size(); ++i)
+ {
+ LLVector3 min = boxes[i].getMinAgent();
+ LLVector3 max = boxes[i].getMaxAgent();
+
+ S32 left = S32(llclamp((min.mV[VX] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1));
+ S32 right = S32(llclamp((max.mV[VX] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1));
+ S32 top = S32(llclamp((min.mV[VY] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1));
+ S32 bottom = S32(llclamp((max.mV[VY] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1));
+
+ for (S32 row = top; row <= bottom; row++)
+ {
+ for (S32 column = left; column <= right; column++)
+ {
+ U8 type = ownership(row, column);
+ if ((PARCEL_SELF != type))
+ {
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+}
BOOL LLViewerParcelOverlay::isSoundLocal(const LLVector3& pos) const
{
diff --git a/indra/newview/llviewerparceloverlay.h b/indra/newview/llviewerparceloverlay.h
index c80baedda6..3c6794e7d0 100644
--- a/indra/newview/llviewerparceloverlay.h
+++ b/indra/newview/llviewerparceloverlay.h
@@ -60,6 +60,7 @@ public:
// might be in another parcel. for now, we simply test axis aligned
// bounding boxes which isn't perfect, but is close
bool encroachesOwned(const std::vector<LLBBox>& boxes) const;
+ bool encroachesOnUnowned(const std::vector<LLBBox>& boxes) const;
BOOL isSoundLocal(const LLVector3& pos) const;
diff --git a/indra/newview/llviewerprecompiledheaders.h b/indra/newview/llviewerprecompiledheaders.h
index 45c9b3e91f..252183b6d7 100644
--- a/indra/newview/llviewerprecompiledheaders.h
+++ b/indra/newview/llviewerprecompiledheaders.h
@@ -33,6 +33,8 @@
// in viewer.
// It is used to precompile headers for improved build speed.
+#include <boost/coroutine/coroutine.hpp>
+
#include "linden_common.h"
// Work around stupid Microsoft STL warning
diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp
index f835351c04..5be2234ec2 100644
--- a/indra/newview/llviewerregion.cpp
+++ b/indra/newview/llviewerregion.cpp
@@ -54,6 +54,7 @@
#include "llfloaterreporter.h"
#include "llfloaterregioninfo.h"
#include "llhttpnode.h"
+#include "llregioninfomodel.h"
#include "llsdutil.h"
#include "llstartup.h"
#include "lltrans.h"
@@ -64,11 +65,11 @@
#include "llvlmanager.h"
#include "llvlcomposition.h"
#include "llvocache.h"
-#include "llvoclouds.h"
#include "llworld.h"
#include "llspatialpartition.h"
#include "stringize.h"
#include "llviewercontrol.h"
+#include "llsdserialize.h"
#ifdef LL_WINDOWS
#pragma warning(disable:4355)
@@ -76,6 +77,13 @@
const F32 WATER_TEXTURE_SCALE = 8.f; // Number of times to repeat the water texture across a region
const S16 MAX_MAP_DIST = 10;
+// The server only keeps our pending agent info for 60 seconds.
+// We want to allow for seed cap retry, but its not useful after that 60 seconds.
+// Give it 3 chances, each at 18 seconds to give ourselves a few seconds to connect anyways if we give up.
+const S32 MAX_SEED_CAP_ATTEMPTS_BEFORE_LOGIN = 3;
+const F32 CAP_REQUEST_TIMEOUT = 18;
+// Even though we gave up on login, keep trying for caps after we are logged in:
+const S32 MAX_CAP_REQUEST_ATTEMPTS = 30;
typedef std::map<std::string, std::string> CapabilityMap;
@@ -85,6 +93,10 @@ public:
: mHost(host),
mCompositionp(NULL),
mEventPoll(NULL),
+ mSeedCapMaxAttempts(MAX_CAP_REQUEST_ATTEMPTS),
+ mSeedCapMaxAttemptsBeforeLogin(MAX_SEED_CAP_ATTEMPTS_BEFORE_LOGIN),
+ mSeedCapAttempts(0),
+ mHttpResponderID(0),
// I'd prefer to set the LLCapabilityListener name to match the region
// name -- it's disappointing that's not available at construction time.
// We could instead store an LLCapabilityListener*, making
@@ -99,6 +111,8 @@ public:
{
}
+ void buildCapabilityNames(LLSD& capabilityNames);
+
// The surfaces and other layers
LLSurface* mLandp;
@@ -131,6 +145,12 @@ public:
LLEventPoll* mEventPoll;
+ S32 mSeedCapMaxAttempts;
+ S32 mSeedCapMaxAttemptsBeforeLogin;
+ S32 mSeedCapAttempts;
+
+ S32 mHttpResponderID;
+
/// Post an event to this LLCapabilityListener to invoke a capability message on
/// this LLViewerRegion's server
/// (https://wiki.lindenlab.com/wiki/Viewer:Messaging/Messaging_Notes#Capabilities)
@@ -138,8 +158,6 @@ public:
//spatial partitions for objects in this region
std::vector<LLSpatialPartition*> mObjectPartition;
-
- LLHTTPClient::ResponderPtr mHttpResponderPtr ;
};
// support for secondlife:///app/region/{REGION} SLapps
@@ -185,54 +203,51 @@ class BaseCapabilitiesComplete : public LLHTTPClient::Responder
{
LOG_CLASS(BaseCapabilitiesComplete);
public:
- BaseCapabilitiesComplete(LLViewerRegion* region)
- : mRegion(region)
+ BaseCapabilitiesComplete(U64 region_handle, S32 id)
+ : mRegionHandle(region_handle), mID(id)
{ }
virtual ~BaseCapabilitiesComplete()
- {
- if(mRegion)
- {
- mRegion->setHttpResponderPtrNULL() ;
- }
- }
-
- void setRegion(LLViewerRegion* region)
- {
- mRegion = region ;
- }
+ { }
void error(U32 statusNum, const std::string& reason)
{
LL_WARNS2("AppInit", "Capabilities") << statusNum << ": " << reason << LL_ENDL;
-
- if (STATE_SEED_GRANTED_WAIT == LLStartUp::getStartupState())
+ LLViewerRegion *regionp = LLWorld::getInstance()->getRegionFromHandle(mRegionHandle);
+ if (regionp)
{
- LLStartUp::setStartupState( STATE_SEED_CAP_GRANTED );
+ regionp->failedSeedCapability();
}
}
void result(const LLSD& content)
{
- if(!mRegion || LLHTTPClient::ResponderPtr(this) != mRegion->getHttpResponderPtr()) //region is removed or responder is not created.
+ LLViewerRegion *regionp = LLWorld::getInstance()->getRegionFromHandle(mRegionHandle);
+ if(!regionp) //region was removed
+ {
+ LL_WARNS2("AppInit", "Capabilities") << "Received results for region that no longer exists!" << LL_ENDL;
+ return ;
+ }
+ if( mID != regionp->getHttpResponderID() ) // region is no longer referring to this responder
{
+ LL_WARNS2("AppInit", "Capabilities") << "Received results for a stale http responder!" << LL_ENDL;
return ;
}
LLSD::map_const_iterator iter;
for(iter = content.beginMap(); iter != content.endMap(); ++iter)
{
- mRegion->setCapability(iter->first, iter->second);
+ regionp->setCapability(iter->first, iter->second);
LL_DEBUGS2("AppInit", "Capabilities") << "got capability for "
<< iter->first << LL_ENDL;
/* HACK we're waiting for the ServerReleaseNotes */
- if (iter->first == "ServerReleaseNotes" && mRegion->getReleaseNotesRequested())
+ if (iter->first == "ServerReleaseNotes" && regionp->getReleaseNotesRequested())
{
- mRegion->showReleaseNotes();
+ regionp->showReleaseNotes();
}
}
- mRegion->setCapabilitiesReceived(true);
+ regionp->setCapabilitiesReceived(true);
if (STATE_SEED_GRANTED_WAIT == LLStartUp::getStartupState())
{
@@ -240,15 +255,15 @@ public:
}
}
- static boost::intrusive_ptr<BaseCapabilitiesComplete> build(
- LLViewerRegion* region)
+ static boost::intrusive_ptr<BaseCapabilitiesComplete> build( U64 region_handle, S32 id )
{
- return boost::intrusive_ptr<BaseCapabilitiesComplete>(
- new BaseCapabilitiesComplete(region));
+ return boost::intrusive_ptr<BaseCapabilitiesComplete>(
+ new BaseCapabilitiesComplete(region_handle, id) );
}
private:
- LLViewerRegion* mRegion;
+ U64 mRegionHandle;
+ S32 mID;
};
@@ -314,7 +329,6 @@ LLViewerRegion::LLViewerRegion(const U64 &handle,
mImpl->mObjectPartition.push_back(new LLWaterPartition()); //PARTITION_WATER
mImpl->mObjectPartition.push_back(new LLTreePartition()); //PARTITION_TREE
mImpl->mObjectPartition.push_back(new LLParticlePartition()); //PARTITION_PARTICLE
- mImpl->mObjectPartition.push_back(new LLCloudPartition()); //PARTITION_CLOUD
mImpl->mObjectPartition.push_back(new LLGrassPartition()); //PARTITION_GRASS
mImpl->mObjectPartition.push_back(new LLVolumePartition()); //PARTITION_VOLUME
mImpl->mObjectPartition.push_back(new LLBridgePartition()); //PARTITION_BRIDGE
@@ -340,16 +354,10 @@ void LLViewerRegion::initStats()
LLViewerRegion::~LLViewerRegion()
{
- if(mImpl->mHttpResponderPtr)
- {
- (static_cast<BaseCapabilitiesComplete*>(mImpl->mHttpResponderPtr.get()))->setRegion(NULL) ;
- }
-
gVLManager.cleanupData(this);
// Can't do this on destruction, because the neighbor pointers might be invalid.
// This should be reference counted...
disconnectAllNeighbors();
- mCloudLayer.destroy();
LLViewerPartSim::getInstance()->cleanupRegion(this);
gObjectList.killObjects(this);
@@ -485,7 +493,6 @@ void LLViewerRegion::setOriginGlobal(const LLVector3d &origin_global)
updateRenderMatrix();
mImpl->mLandp->setOriginGlobal(origin_global);
mWind.setOriginGlobal(origin_global);
- mCloudLayer.setOriginGlobal(origin_global);
calculateCenterGlobal();
}
@@ -646,6 +653,9 @@ std::string LLViewerRegion::accessToShortString(U8 sim_access)
void LLViewerRegion::processRegionInfo(LLMessageSystem* msg, void**)
{
// send it to 'observers'
+ // *TODO: switch the floaters to using LLRegionInfoModel
+ llinfos << "Processing region info" << llendl;
+ LLRegionInfoModel::instance().update(msg);
LLFloaterGodTools::processRegionInfo(msg);
LLFloaterRegionInfo::processRegionInfo(msg);
LLFloaterReporter::processRegionInfo(msg);
@@ -708,14 +718,12 @@ void LLViewerRegion::forceUpdate()
void LLViewerRegion::connectNeighbor(LLViewerRegion *neighborp, U32 direction)
{
mImpl->mLandp->connectNeighbor(neighborp->mImpl->mLandp, direction);
- mCloudLayer.connectNeighbor(&(neighborp->mCloudLayer), direction);
}
void LLViewerRegion::disconnectAllNeighbors()
{
mImpl->mLandp->disconnectAllNeighbors();
- mCloudLayer.disconnectAllNeighbors();
}
LLVLComposition * LLViewerRegion::getComposition() const
@@ -892,14 +900,9 @@ U32 LLViewerRegion::getPacketsLost() const
}
}
-void LLViewerRegion::setHttpResponderPtrNULL()
+S32 LLViewerRegion::getHttpResponderID() const
{
- mImpl->mHttpResponderPtr = NULL;
-}
-
-const LLHTTPClient::ResponderPtr LLViewerRegion::getHttpResponderPtr() const
-{
- return mImpl->mHttpResponderPtr;
+ return mImpl->mHttpResponderID;
}
BOOL LLViewerRegion::pointInRegionGlobal(const LLVector3d &point_global) const
@@ -1140,6 +1143,20 @@ void LLViewerRegion::getInfo(LLSD& info)
info["Region"]["Handle"]["y"] = (LLSD::Integer)y;
}
+void LLViewerRegion::getSimulatorFeatures(LLSD& sim_features)
+{
+ sim_features = mSimulatorFeatures;
+}
+
+void LLViewerRegion::setSimulatorFeatures(const LLSD& sim_features)
+{
+ std::stringstream str;
+
+ LLSDSerialize::toPrettyXML(sim_features, str);
+ llinfos << str.str() << llendl;
+ mSimulatorFeatures = sim_features;
+}
+
LLViewerRegion::eCacheUpdateResult LLViewerRegion::cacheFullUpdate(LLViewerObject* objectp, LLDataPackerBinaryBuffer &dp)
{
U32 local_id = objectp->getLocalID();
@@ -1464,22 +1481,11 @@ void LLViewerRegion::unpackRegionHandshake()
msg->sendReliable(host);
}
-void LLViewerRegion::setSeedCapability(const std::string& url)
-{
- if (getCapability("Seed") == url)
- {
- // llwarns << "Ignoring duplicate seed capability" << llendl;
- return;
- }
-
- delete mImpl->mEventPoll;
- mImpl->mEventPoll = NULL;
-
- mImpl->mCapabilities.clear();
- setCapability("Seed", url);
-
- LLSD capabilityNames = LLSD::emptyArray();
+void LLViewerRegionImpl::buildCapabilityNames(LLSD& capabilityNames)
+{
+ capabilityNames.append("AccountingParcel");
+ capabilityNames.append("AccountingSelection");
capabilityNames.append("AttachmentResources");
capabilityNames.append("AvatarPickerSearch");
capabilityNames.append("ChatSessionRequest");
@@ -1487,6 +1493,7 @@ void LLViewerRegion::setSeedCapability(const std::string& url)
capabilityNames.append("DispatchRegionInfo");
capabilityNames.append("EstateChangeInfo");
capabilityNames.append("EventQueueGet");
+ capabilityNames.append("EnvironmentSettings");
capabilityNames.append("ObjectMedia");
capabilityNames.append("ObjectMediaNavigate");
@@ -1508,9 +1515,8 @@ void LLViewerRegion::setSeedCapability(const std::string& url)
capabilityNames.append("LandResources");
capabilityNames.append("MapLayer");
capabilityNames.append("MapLayerGod");
+ capabilityNames.append("MeshUploadFlag");
capabilityNames.append("NewFileAgentInventory");
- capabilityNames.append("NewFileAgentInventoryVariablePrice");
- capabilityNames.append("ObjectAdd");
capabilityNames.append("ParcelPropertiesUpdate");
capabilityNames.append("ParcelMediaURLFilterList");
capabilityNames.append("ParcelNavigateMedia");
@@ -1541,19 +1547,131 @@ void LLViewerRegion::setSeedCapability(const std::string& url)
capabilityNames.append("UpdateNotecardTaskInventory");
capabilityNames.append("UpdateScriptTask");
capabilityNames.append("UploadBakedTexture");
- capabilityNames.append("UploadObjectAsset");
capabilityNames.append("ViewerMetrics");
capabilityNames.append("ViewerStartAuction");
capabilityNames.append("ViewerStats");
+ //prep# Finalize these!!!!!!!!!
+ //capabilityNames.append("AccountingVO");
+ capabilityNames.append("AccountingParcel");
+ capabilityNames.append("AccountingRegion");
+
// Please add new capabilities alphabetically to reduce
// merge conflicts.
+}
+
+void LLViewerRegion::setSeedCapability(const std::string& url)
+{
+ if (getCapability("Seed") == url)
+ {
+ // llwarns << "Ignoring duplicate seed capability" << llendl;
+ return;
+ }
+
+ delete mImpl->mEventPoll;
+ mImpl->mEventPoll = NULL;
+
+ mImpl->mCapabilities.clear();
+ setCapability("Seed", url);
+
+ LLSD capabilityNames = LLSD::emptyArray();
+ mImpl->buildCapabilityNames(capabilityNames);
llinfos << "posting to seed " << url << llendl;
- mImpl->mHttpResponderPtr = BaseCapabilitiesComplete::build(this) ;
- LLHTTPClient::post(url, capabilityNames, mImpl->mHttpResponderPtr);
+ S32 id = ++mImpl->mHttpResponderID;
+ LLHTTPClient::post(url, capabilityNames,
+ BaseCapabilitiesComplete::build(getHandle(), id),
+ LLSD(), CAP_REQUEST_TIMEOUT);
+}
+
+S32 LLViewerRegion::getNumSeedCapRetries()
+{
+ return mImpl->mSeedCapAttempts;
+}
+
+void LLViewerRegion::failedSeedCapability()
+{
+ // Should we retry asking for caps?
+ mImpl->mSeedCapAttempts++;
+ std::string url = getCapability("Seed");
+ if ( url.empty() )
+ {
+ LL_WARNS2("AppInit", "Capabilities") << "Failed to get seed capabilities, and can not determine url for retries!" << LL_ENDL;
+ return;
+ }
+ // After a few attempts, continue login. We will keep trying once in-world:
+ if ( mImpl->mSeedCapAttempts >= mImpl->mSeedCapMaxAttemptsBeforeLogin &&
+ STATE_SEED_GRANTED_WAIT == LLStartUp::getStartupState() )
+ {
+ LLStartUp::setStartupState( STATE_SEED_CAP_GRANTED );
+ }
+
+ if ( mImpl->mSeedCapAttempts < mImpl->mSeedCapMaxAttempts)
+ {
+ LLSD capabilityNames = LLSD::emptyArray();
+ mImpl->buildCapabilityNames(capabilityNames);
+
+ llinfos << "posting to seed " << url << " (retry "
+ << mImpl->mSeedCapAttempts << ")" << llendl;
+
+ S32 id = ++mImpl->mHttpResponderID;
+ LLHTTPClient::post(url, capabilityNames,
+ BaseCapabilitiesComplete::build(getHandle(), id),
+ LLSD(), CAP_REQUEST_TIMEOUT);
+ }
+ else
+ {
+ // *TODO: Give a user pop-up about this error?
+ LL_WARNS2("AppInit", "Capabilities") << "Failed to get seed capabilities from '" << url << "' after " << mImpl->mSeedCapAttempts << " attempts. Giving up!" << LL_ENDL;
+ }
}
+class SimulatorFeaturesReceived : public LLHTTPClient::Responder
+{
+ LOG_CLASS(SimulatorFeaturesReceived);
+public:
+ SimulatorFeaturesReceived(const std::string& retry_url, U64 region_handle,
+ S32 attempt = 0, S32 max_attempts = MAX_CAP_REQUEST_ATTEMPTS)
+ : mRetryURL(retry_url), mRegionHandle(region_handle), mAttempt(attempt), mMaxAttempts(max_attempts)
+ { }
+
+
+ void error(U32 statusNum, const std::string& reason)
+ {
+ LL_WARNS2("AppInit", "SimulatorFeatures") << statusNum << ": " << reason << LL_ENDL;
+ retry();
+ }
+
+ void result(const LLSD& content)
+ {
+ LLViewerRegion *regionp = LLWorld::getInstance()->getRegionFromHandle(mRegionHandle);
+ if(!regionp) //region is removed or responder is not created.
+ {
+ LL_WARNS2("AppInit", "SimulatorFeatures") << "Received results for region that no longer exists!" << LL_ENDL;
+ return ;
+ }
+
+ regionp->setSimulatorFeatures(content);
+ }
+
+private:
+ void retry()
+ {
+ if (mAttempt < mMaxAttempts)
+ {
+ mAttempt++;
+ LL_WARNS2("AppInit", "SimulatorFeatures") << "Re-trying '" << mRetryURL << "'. Retry #" << mAttempt << LL_ENDL;
+ LLHTTPClient::get(mRetryURL, new SimulatorFeaturesReceived(*this), LLSD(), CAP_REQUEST_TIMEOUT);
+ }
+ }
+
+ std::string mRetryURL;
+ U64 mRegionHandle;
+ S32 mAttempt;
+ S32 mMaxAttempts;
+};
+
+
void LLViewerRegion::setCapability(const std::string& name, const std::string& url)
{
if(name == "EventQueueGet")
@@ -1566,6 +1684,11 @@ void LLViewerRegion::setCapability(const std::string& name, const std::string& u
{
LLHTTPSender::setSender(mImpl->mHost, new LLCapHTTPSender(url));
}
+ else if (name == "SimulatorFeatures")
+ {
+ // kick off a request for simulator features
+ LLHTTPClient::get(url, new SimulatorFeaturesReceived(url, getHandle()), LLSD(), CAP_REQUEST_TIMEOUT);
+ }
else
{
mImpl->mCapabilities[name] = url;
@@ -1600,6 +1723,21 @@ bool LLViewerRegion::capabilitiesReceived() const
void LLViewerRegion::setCapabilitiesReceived(bool received)
{
mCapabilitiesReceived = received;
+
+ // Tell interested parties that we've received capabilities,
+ // so that they can safely use getCapability().
+ if (received)
+ {
+ mCapabilitiesReceivedSignal(getRegionID());
+
+ // This is a single-shot signal. Forget callbacks to save resources.
+ mCapabilitiesReceivedSignal.disconnect_all_slots();
+ }
+}
+
+boost::signals2::connection LLViewerRegion::setCapabilitiesReceivedCallback(const caps_received_signal_t::slot_type& cb)
+{
+ return mCapabilitiesReceivedSignal.connect(cb);
}
void LLViewerRegion::logActiveCapabilities() const
@@ -1639,6 +1777,18 @@ bool LLViewerRegion::objectIsReturnable(const LLVector3& pos, const std::vector<
&& mParcelOverlay->encroachesOwned(boxes)) );
}
+bool LLViewerRegion::childrenObjectReturnable( const std::vector<LLBBox>& boxes ) const
+{
+ bool result = false;
+ result = ( mParcelOverlay && mParcelOverlay->encroachesOnUnowned( boxes ) ) ? 1 : 0;
+ return result;
+}
+
+void LLViewerRegion::getNeighboringRegions( std::vector<LLViewerRegion*>& uniqueRegions )
+{
+ mImpl->mLandp->getNeighboringRegions( uniqueRegions );
+}
+
void LLViewerRegion::showReleaseNotes()
{
std::string url = this->getCapability("ServerReleaseNotes");
@@ -1658,3 +1808,17 @@ std::string LLViewerRegion::getDescription() const
{
return stringize(*this);
}
+
+bool LLViewerRegion::meshUploadEnabled() const
+{
+ return (mSimulatorFeatures.has("MeshUploadEnabled") &&
+ mSimulatorFeatures["MeshUploadEnabled"].asBoolean());
+}
+
+bool LLViewerRegion::meshRezEnabled() const
+{
+ return (mSimulatorFeatures.has("MeshRezEnabled") &&
+ mSimulatorFeatures["MeshRezEnabled"].asBoolean());
+}
+
+
diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h
index 9c5b85b77f..b3c19ea58d 100644
--- a/indra/newview/llviewerregion.h
+++ b/indra/newview/llviewerregion.h
@@ -30,10 +30,10 @@
// A ViewerRegion is a class that contains a bunch of objects and surfaces
// that are in to a particular region.
#include <string>
+#include <boost/signals2.hpp>
#include "lldarray.h"
#include "llwind.h"
-#include "llcloud.h"
#include "llstat.h"
#include "v3dmath.h"
#include "llstring.h"
@@ -81,7 +81,6 @@ public:
PARTITION_WATER,
PARTITION_TREE,
PARTITION_PARTICLE,
- PARTITION_CLOUD,
PARTITION_GRASS,
PARTITION_VOLUME,
PARTITION_BRIDGE,
@@ -90,6 +89,8 @@ public:
NUM_PARTITIONS
} eObjectPartitions;
+ typedef boost::signals2::signal<void(const LLUUID& region_id)> caps_received_signal_t;
+
LLViewerRegion(const U64 &handle,
const LLHost &host,
const U32 surface_grid_width,
@@ -225,11 +226,12 @@ public:
U32 getPacketsLost() const;
- void setHttpResponderPtrNULL();
- const LLHTTPClient::ResponderPtr getHttpResponderPtr() const;
+ S32 getHttpResponderID() const;
// Get/set named capability URLs for this region.
void setSeedCapability(const std::string& url);
+ void failedSeedCapability();
+ S32 getNumSeedCapRetries();
void setCapability(const std::string& name, const std::string& url);
// implements LLCapabilityProvider
virtual std::string getCapability(const std::string& name) const;
@@ -237,6 +239,7 @@ public:
// has region received its final (not seed) capability list?
bool capabilitiesReceived() const;
void setCapabilitiesReceived(bool received);
+ boost::signals2::connection setCapabilitiesReceivedCallback(const caps_received_signal_t::slot_type& cb);
static bool isSpecialCapabilityName(const std::string &name);
void logActiveCapabilities() const;
@@ -275,6 +278,12 @@ public:
F32 getLandHeightRegion(const LLVector3& region_pos);
void getInfo(LLSD& info);
+
+ bool meshRezEnabled() const;
+ bool meshUploadEnabled() const;
+
+ void getSimulatorFeatures(LLSD& info);
+ void setSimulatorFeatures(const LLSD& info);
typedef enum
{
@@ -312,6 +321,10 @@ public:
LLSpatialPartition* getSpatialPartition(U32 type);
bool objectIsReturnable(const LLVector3& pos, const std::vector<LLBBox>& boxes) const;
+ bool childrenObjectReturnable( const std::vector<LLBBox>& boxes ) const;
+
+ void getNeighboringRegions( std::vector<LLViewerRegion*>& uniqueRegions );
+
public:
struct CompareDistance
{
@@ -330,7 +343,6 @@ protected:
public:
LLWind mWind;
- LLCloudLayer mCloudLayer;
LLViewerParcelOverlay *mParcelOverlay;
LLStat mBitStat;
@@ -398,8 +410,11 @@ private:
bool mAlive; // can become false if circuit disconnects
bool mCapabilitiesReceived;
+ caps_received_signal_t mCapabilitiesReceivedSignal;
BOOL mReleaseNotesRequested;
+
+ LLSD mSimulatorFeatures;
};
inline BOOL LLViewerRegion::getAllowDamage() const
diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp
index 3e85802ba6..5579473b8b 100644
--- a/indra/newview/llviewershadermgr.cpp
+++ b/indra/newview/llviewershadermgr.cpp
@@ -66,12 +66,20 @@ LLGLSLShader gObjectSimpleProgram;
LLGLSLShader gObjectSimpleWaterProgram;
LLGLSLShader gObjectFullbrightProgram;
LLGLSLShader gObjectFullbrightWaterProgram;
-
LLGLSLShader gObjectFullbrightShinyProgram;
LLGLSLShader gObjectFullbrightShinyWaterProgram;
LLGLSLShader gObjectShinyProgram;
LLGLSLShader gObjectShinyWaterProgram;
+LLGLSLShader gObjectSimpleNonIndexedProgram;
+LLGLSLShader gObjectSimpleNonIndexedWaterProgram;
+LLGLSLShader gObjectFullbrightNonIndexedProgram;
+LLGLSLShader gObjectFullbrightNonIndexedWaterProgram;
+LLGLSLShader gObjectFullbrightShinyNonIndexedProgram;
+LLGLSLShader gObjectFullbrightShinyNonIndexedWaterProgram;
+LLGLSLShader gObjectShinyNonIndexedProgram;
+LLGLSLShader gObjectShinyNonIndexedWaterProgram;
+
//object hardware skinning shaders
LLGLSLShader gSkinnedObjectSimpleProgram;
LLGLSLShader gSkinnedObjectFullbrightProgram;
@@ -113,6 +121,7 @@ LLGLSLShader gDeferredImpostorProgram;
LLGLSLShader gDeferredEdgeProgram;
LLGLSLShader gDeferredWaterProgram;
LLGLSLShader gDeferredDiffuseProgram;
+LLGLSLShader gDeferredNonIndexedDiffuseProgram;
LLGLSLShader gDeferredSkinnedDiffuseProgram;
LLGLSLShader gDeferredSkinnedBumpProgram;
LLGLSLShader gDeferredSkinnedAlphaProgram;
@@ -132,13 +141,16 @@ LLGLSLShader gDeferredShadowProgram;
LLGLSLShader gDeferredAvatarShadowProgram;
LLGLSLShader gDeferredAttachmentShadowProgram;
LLGLSLShader gDeferredAlphaProgram;
+LLGLSLShader gDeferredAvatarEyesProgram;
LLGLSLShader gDeferredFullbrightProgram;
LLGLSLShader gDeferredGIProgram;
LLGLSLShader gDeferredGIFinalProgram;
LLGLSLShader gDeferredPostGIProgram;
LLGLSLShader gDeferredPostProgram;
LLGLSLShader gDeferredPostNoDoFProgram;
-
+LLGLSLShader gDeferredWLSkyProgram;
+LLGLSLShader gDeferredWLCloudProgram;
+LLGLSLShader gDeferredStarProgram;
LLGLSLShader gLuminanceGatherProgram;
@@ -154,12 +166,17 @@ LLViewerShaderMgr::LLViewerShaderMgr() :
mShaderList.push_back(&gWLCloudProgram);
mShaderList.push_back(&gAvatarProgram);
mShaderList.push_back(&gObjectShinyProgram);
+ mShaderList.push_back(&gObjectShinyNonIndexedProgram);
mShaderList.push_back(&gWaterProgram);
mShaderList.push_back(&gAvatarEyeballProgram);
mShaderList.push_back(&gObjectSimpleProgram);
mShaderList.push_back(&gObjectFullbrightProgram);
mShaderList.push_back(&gObjectFullbrightShinyProgram);
mShaderList.push_back(&gObjectFullbrightShinyWaterProgram);
+ mShaderList.push_back(&gObjectSimpleNonIndexedProgram);
+ mShaderList.push_back(&gObjectFullbrightNonIndexedProgram);
+ mShaderList.push_back(&gObjectFullbrightShinyNonIndexedProgram);
+ mShaderList.push_back(&gObjectFullbrightShinyNonIndexedWaterProgram);
mShaderList.push_back(&gSkinnedObjectSimpleProgram);
mShaderList.push_back(&gSkinnedObjectFullbrightProgram);
mShaderList.push_back(&gSkinnedObjectFullbrightShinyProgram);
@@ -174,6 +191,7 @@ LLViewerShaderMgr::LLViewerShaderMgr() :
mShaderList.push_back(&gObjectFullbrightWaterProgram);
mShaderList.push_back(&gAvatarWaterProgram);
mShaderList.push_back(&gObjectShinyWaterProgram);
+ mShaderList.push_back(&gObjectShinyNonIndexedWaterProgram);
mShaderList.push_back(&gUnderWaterProgram);
mShaderList.push_back(&gDeferredSunProgram);
mShaderList.push_back(&gDeferredBlurLightProgram);
@@ -183,6 +201,7 @@ LLViewerShaderMgr::LLViewerShaderMgr() :
mShaderList.push_back(&gDeferredAlphaProgram);
mShaderList.push_back(&gDeferredSkinnedAlphaProgram);
mShaderList.push_back(&gDeferredFullbrightProgram);
+ mShaderList.push_back(&gDeferredAvatarEyesProgram);
mShaderList.push_back(&gDeferredPostGIProgram);
mShaderList.push_back(&gDeferredEdgeProgram);
mShaderList.push_back(&gDeferredPostProgram);
@@ -190,6 +209,9 @@ LLViewerShaderMgr::LLViewerShaderMgr() :
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()
@@ -347,6 +369,10 @@ void LLViewerShaderMgr::setShaders()
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);
+
reentrance = true;
// Make sure the compiled shader map is cleared before we recompile shaders.
@@ -577,6 +603,16 @@ void LLViewerShaderMgr::unloadShaders()
gObjectFullbrightShinyWaterProgram.unload();
gObjectShinyWaterProgram.unload();
+ gObjectSimpleNonIndexedProgram.unload();
+ gObjectSimpleNonIndexedWaterProgram.unload();
+ gObjectFullbrightNonIndexedProgram.unload();
+ gObjectFullbrightNonIndexedWaterProgram.unload();
+
+ gObjectShinyNonIndexedProgram.unload();
+ gObjectFullbrightShinyNonIndexedProgram.unload();
+ gObjectFullbrightShinyNonIndexedWaterProgram.unload();
+ gObjectShinyNonIndexedWaterProgram.unload();
+
gSkinnedObjectSimpleProgram.unload();
gSkinnedObjectFullbrightProgram.unload();
gSkinnedObjectFullbrightShinyProgram.unload();
@@ -607,6 +643,7 @@ void LLViewerShaderMgr::unloadShaders()
gPostNightVisionProgram.unload();
gDeferredDiffuseProgram.unload();
+ gDeferredNonIndexedDiffuseProgram.unload();
gDeferredSkinnedDiffuseProgram.unload();
gDeferredSkinnedBumpProgram.unload();
gDeferredSkinnedAlphaProgram.unload();
@@ -685,24 +722,40 @@ BOOL LLViewerShaderMgr::loadBasicShaders()
shaders.clear();
shaders.reserve(13);
- shaders.push_back( make_pair( "windlight/atmosphericsVarsF.glsl", mVertexShaderLevel[SHADER_WINDLIGHT] ) );
- shaders.push_back( make_pair( "windlight/gammaF.glsl", mVertexShaderLevel[SHADER_WINDLIGHT]) );
- shaders.push_back( make_pair( "windlight/atmosphericsF.glsl", mVertexShaderLevel[SHADER_WINDLIGHT] ) );
- shaders.push_back( make_pair( "windlight/transportF.glsl", mVertexShaderLevel[SHADER_WINDLIGHT] ) );
- shaders.push_back( make_pair( "environment/waterFogF.glsl", mVertexShaderLevel[SHADER_WATER] ) );
- shaders.push_back( make_pair( "lighting/lightF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
- shaders.push_back( make_pair( "lighting/lightFullbrightF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
- shaders.push_back( make_pair( "lighting/lightWaterF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
- shaders.push_back( make_pair( "lighting/lightFullbrightWaterF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
- shaders.push_back( make_pair( "lighting/lightShinyF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
- shaders.push_back( make_pair( "lighting/lightFullbrightShinyF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
- shaders.push_back( make_pair( "lighting/lightShinyWaterF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
- shaders.push_back( make_pair( "lighting/lightFullbrightShinyWaterF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
+ S32 ch = gGLManager.mNumTextureImageUnits-1;
+
+ if (gGLManager.mGLVersion < 3.1f)
+ { //force to 1 texture index channel for old drivers
+ ch = 1;
+ }
+
+ 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/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] ) );
+ index_channels.push_back(-1); shaders.push_back( make_pair( "environment/waterFogF.glsl", mVertexShaderLevel[SHADER_WATER] ) );
+ index_channels.push_back(-1); shaders.push_back( make_pair( "lighting/lightNonIndexedF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
+ index_channels.push_back(-1); shaders.push_back( make_pair( "lighting/lightFullbrightNonIndexedF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
+ index_channels.push_back(-1); shaders.push_back( make_pair( "lighting/lightWaterNonIndexedF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
+ index_channels.push_back(-1); shaders.push_back( make_pair( "lighting/lightFullbrightWaterNonIndexedF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
+ index_channels.push_back(-1); shaders.push_back( make_pair( "lighting/lightShinyNonIndexedF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
+ index_channels.push_back(-1); shaders.push_back( make_pair( "lighting/lightFullbrightShinyNonIndexedF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
+ index_channels.push_back(-1); shaders.push_back( make_pair( "lighting/lightShinyWaterNonIndexedF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
+ index_channels.push_back(-1); shaders.push_back( make_pair( "lighting/lightFullbrightShinyWaterNonIndexedF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
+ index_channels.push_back(ch); shaders.push_back( make_pair( "lighting/lightF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
+ index_channels.push_back(ch); shaders.push_back( make_pair( "lighting/lightFullbrightF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
+ index_channels.push_back(ch); shaders.push_back( make_pair( "lighting/lightWaterF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
+ index_channels.push_back(ch); shaders.push_back( make_pair( "lighting/lightFullbrightWaterF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
+ index_channels.push_back(ch); shaders.push_back( make_pair( "lighting/lightShinyF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
+ index_channels.push_back(ch); shaders.push_back( make_pair( "lighting/lightFullbrightShinyF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
+ index_channels.push_back(ch); shaders.push_back( make_pair( "lighting/lightShinyWaterF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
+ index_channels.push_back(ch); shaders.push_back( make_pair( "lighting/lightFullbrightShinyWaterF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
for (U32 i = 0; i < shaders.size(); i++)
{
// Note usage of GL_FRAGMENT_SHADER_ARB
- if (loadShaderFile(shaders[i].first, shaders[i].second, GL_FRAGMENT_SHADER_ARB) == 0)
+ if (loadShaderFile(shaders[i].first, shaders[i].second, GL_FRAGMENT_SHADER_ARB, index_channels[i]) == 0)
{
return FALSE;
}
@@ -833,6 +886,9 @@ 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();
@@ -858,10 +914,21 @@ 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("effects/glowExtractF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gGlowExtractProgram.mShaderFiles.push_back(make_pair(fragment, GL_FRAGMENT_SHADER_ARB));
gGlowExtractProgram.mShaderLevel = mVertexShaderLevel[SHADER_EFFECT];
success = gGlowExtractProgram.createShader(NULL, &mGlowExtractUniforms);
if (!success)
@@ -925,6 +992,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
{
gDeferredTreeProgram.unload();
gDeferredDiffuseProgram.unload();
+ gDeferredNonIndexedDiffuseProgram.unload();
gDeferredSkinnedDiffuseProgram.unload();
gDeferredSkinnedBumpProgram.unload();
gDeferredSkinnedAlphaProgram.unload();
@@ -945,6 +1013,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
gDeferredAvatarAlphaProgram.unload();
gDeferredAlphaProgram.unload();
gDeferredFullbrightProgram.unload();
+ gDeferredAvatarEyesProgram.unload();
gDeferredPostGIProgram.unload();
gDeferredEdgeProgram.unload();
gDeferredPostProgram.unload();
@@ -952,6 +1021,9 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
gDeferredGIProgram.unload();
gDeferredGIFinalProgram.unload();
gDeferredWaterProgram.unload();
+ gDeferredWLSkyProgram.unload();
+ gDeferredWLCloudProgram.unload();
+ gDeferredStarProgram.unload();
return TRUE;
}
@@ -959,18 +1031,33 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
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/diffuseF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gDeferredDiffuseProgram.mShaderFiles.push_back(make_pair("deferred/diffuseIndexedF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gDeferredDiffuseProgram.mFeatures.mIndexedTextureChannels = gGLManager.mNumTextureImageUnits;
gDeferredDiffuseProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
success = gDeferredDiffuseProgram.createShader(NULL, NULL);
}
if (success)
{
+ gDeferredNonIndexedDiffuseProgram.mName = "Non Indexed Deferred Diffuse Shader";
+ gDeferredNonIndexedDiffuseProgram.mShaderFiles.clear();
+ gDeferredNonIndexedDiffuseProgram.mShaderFiles.push_back(make_pair("deferred/diffuseV.glsl", GL_VERTEX_SHADER_ARB));
+ gDeferredNonIndexedDiffuseProgram.mShaderFiles.push_back(make_pair("deferred/diffuseF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gDeferredNonIndexedDiffuseProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
+ success = gDeferredNonIndexedDiffuseProgram.createShader(NULL, NULL);
+ }
+
+
+ if (success)
+ {
gDeferredSkinnedDiffuseProgram.mName = "Deferred Skinned Diffuse Shader";
gDeferredSkinnedDiffuseProgram.mFeatures.hasObjectSkinning = true;
gDeferredSkinnedDiffuseProgram.mShaderFiles.clear();
@@ -1000,9 +1087,10 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
gDeferredSkinnedAlphaProgram.mFeatures.hasGamma = true;
gDeferredSkinnedAlphaProgram.mFeatures.hasAtmospherics = true;
gDeferredSkinnedAlphaProgram.mFeatures.hasLighting = true;
+ gDeferredSkinnedAlphaProgram.mFeatures.disableTextureIndex = true;
gDeferredSkinnedAlphaProgram.mShaderFiles.clear();
gDeferredSkinnedAlphaProgram.mShaderFiles.push_back(make_pair("deferred/alphaSkinnedV.glsl", GL_VERTEX_SHADER_ARB));
- gDeferredSkinnedAlphaProgram.mShaderFiles.push_back(make_pair("deferred/alphaF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gDeferredSkinnedAlphaProgram.mShaderFiles.push_back(make_pair("deferred/alphaNonIndexedF.glsl", GL_FRAGMENT_SHADER_ARB));
gDeferredSkinnedAlphaProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
success = gDeferredSkinnedAlphaProgram.createShader(NULL, NULL);
}
@@ -1039,40 +1127,83 @@ 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("deferred/pointLightF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gDeferredLightProgram.mShaderFiles.push_back(make_pair(fragment, 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("deferred/multiPointLightF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gDeferredMultiLightProgram.mShaderFiles.push_back(make_pair(fragment, 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("deferred/multiSpotLightF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gDeferredSpotLightProgram.mShaderFiles.push_back(make_pair(fragment, 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("deferred/multiSpotLightF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gDeferredMultiSpotLightProgram.mShaderFiles.push_back(make_pair(fragment, GL_FRAGMENT_SHADER_ARB));
gDeferredMultiSpotLightProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
success = gDeferredMultiSpotLightProgram.createShader(NULL, NULL);
}
@@ -1083,11 +1214,25 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
if (gSavedSettings.getBOOL("RenderDeferredSSAO"))
{
- fragment = "deferred/sunLightSSAOF.glsl";
+ if (multisample)
+ {
+ fragment = "deferred/sunLightSSAOMSF.glsl";
+ }
+ else
+ {
+ fragment = "deferred/sunLightSSAOF.glsl";
+ }
}
else
{
- fragment = "deferred/sunLightF.glsl";
+ if (multisample)
+ {
+ fragment = "deferred/sunLightMSF.glsl";
+ }
+ else
+ {
+ fragment = "deferred/sunLightF.glsl";
+ }
}
gDeferredSunProgram.mName = "Deferred Sun Shader";
@@ -1100,10 +1245,21 @@ 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("deferred/blurLightF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gDeferredBlurLightProgram.mShaderFiles.push_back(make_pair(fragment, GL_FRAGMENT_SHADER_ARB));
gDeferredBlurLightProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
success = gDeferredBlurLightProgram.createShader(NULL, NULL);
}
@@ -1116,6 +1272,16 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
gDeferredAlphaProgram.mFeatures.hasGamma = true;
gDeferredAlphaProgram.mFeatures.hasAtmospherics = true;
gDeferredAlphaProgram.mFeatures.hasLighting = true;
+ gDeferredAlphaProgram.mFeatures.disableTextureIndex = true; //hack to disable auto-setup of texture channels
+ if (mVertexShaderLevel[SHADER_DEFERRED] < 1)
+ {
+ gDeferredAlphaProgram.mFeatures.mIndexedTextureChannels = gGLManager.mNumTextureImageUnits;
+ }
+ else
+ { //shave off some texture units for shadow maps
+ gDeferredAlphaProgram.mFeatures.mIndexedTextureChannels = gGLManager.mNumTextureImageUnits - 6;
+ }
+
gDeferredAlphaProgram.mShaderFiles.clear();
gDeferredAlphaProgram.mShaderFiles.push_back(make_pair("deferred/alphaV.glsl", GL_VERTEX_SHADER_ARB));
gDeferredAlphaProgram.mShaderFiles.push_back(make_pair("deferred/alphaF.glsl", GL_FRAGMENT_SHADER_ARB));
@@ -1125,11 +1291,25 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
if (success)
{
+ gDeferredAvatarEyesProgram.mName = "Deferred Avatar Eyes Shader";
+ gDeferredAvatarEyesProgram.mFeatures.calculatesAtmospherics = true;
+ gDeferredAvatarEyesProgram.mFeatures.hasGamma = true;
+ gDeferredAvatarEyesProgram.mFeatures.hasTransport = true;
+ gDeferredAvatarEyesProgram.mFeatures.disableTextureIndex = true;
+ gDeferredAvatarEyesProgram.mShaderFiles.clear();
+ gDeferredAvatarEyesProgram.mShaderFiles.push_back(make_pair("deferred/avatarEyesV.glsl", GL_VERTEX_SHADER_ARB));
+ gDeferredAvatarEyesProgram.mShaderFiles.push_back(make_pair("deferred/diffuseF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gDeferredAvatarEyesProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
+ success = gDeferredAvatarEyesProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
gDeferredFullbrightProgram.mName = "Deferred Fullbright Shader";
gDeferredFullbrightProgram.mFeatures.calculatesAtmospherics = true;
gDeferredFullbrightProgram.mFeatures.hasGamma = true;
gDeferredFullbrightProgram.mFeatures.hasTransport = true;
- gDeferredFullbrightProgram.mFeatures.isFullbright = true;
+ gDeferredFullbrightProgram.mFeatures.mIndexedTextureChannels = gGLManager.mNumTextureImageUnits;
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));
@@ -1153,10 +1333,21 @@ 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("deferred/softenLightF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gDeferredSoftenProgram.mShaderFiles.push_back(make_pair(fragment, GL_FRAGMENT_SHADER_ARB));
gDeferredSoftenProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
@@ -1230,41 +1421,106 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
gDeferredAvatarAlphaProgram.mFeatures.hasGamma = true;
gDeferredAvatarAlphaProgram.mFeatures.hasAtmospherics = true;
gDeferredAvatarAlphaProgram.mFeatures.hasLighting = 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/alphaF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gDeferredAvatarAlphaProgram.mShaderFiles.push_back(make_pair("deferred/alphaNonIndexedF.glsl", GL_FRAGMENT_SHADER_ARB));
gDeferredAvatarAlphaProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
success = gDeferredAvatarAlphaProgram.createShader(&mAvatarAttribs, &mAvatarUniforms);
}
if (success)
{
+ std::string fragment;
+ if (multisample)
+ {
+ fragment = "deferred/postDeferredMSF.glsl";
+ }
+ else
+ {
+ fragment = "deferred/postDeferredF.glsl";
+ }
+
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("deferred/postDeferredF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gDeferredPostProgram.mShaderFiles.push_back(make_pair(fragment, 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";
+ }
+
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("deferred/postDeferredNoDoFF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gDeferredPostNoDoFProgram.mShaderFiles.push_back(make_pair(fragment, GL_FRAGMENT_SHADER_ARB));
gDeferredPostNoDoFProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
success = gDeferredPostNoDoFProgram.createShader(NULL, NULL);
}
+ if (success)
+ {
+ gDeferredWLSkyProgram.mName = "Deferred Windlight Sky Shader";
+ //gWLSkyProgram.mFeatures.hasGamma = true;
+ gDeferredWLSkyProgram.mShaderFiles.clear();
+ gDeferredWLSkyProgram.mShaderFiles.push_back(make_pair("deferred/skyV.glsl", GL_VERTEX_SHADER_ARB));
+ gDeferredWLSkyProgram.mShaderFiles.push_back(make_pair("deferred/skyF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gDeferredWLSkyProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
+ gDeferredWLSkyProgram.mShaderGroup = LLGLSLShader::SG_SKY;
+ success = gDeferredWLSkyProgram.createShader(NULL, &mWLUniforms);
+ }
+
+ if (success)
+ {
+ gDeferredWLCloudProgram.mName = "Deferred Windlight Cloud Program";
+ gDeferredWLCloudProgram.mShaderFiles.clear();
+ gDeferredWLCloudProgram.mShaderFiles.push_back(make_pair("deferred/cloudsV.glsl", GL_VERTEX_SHADER_ARB));
+ gDeferredWLCloudProgram.mShaderFiles.push_back(make_pair("deferred/cloudsF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gDeferredWLCloudProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
+ gDeferredWLCloudProgram.mShaderGroup = LLGLSLShader::SG_SKY;
+ success = gDeferredWLCloudProgram.createShader(NULL, &mWLUniforms);
+ }
+
+ if (success)
+ {
+ gDeferredStarProgram.mName = "Deferred Star Program";
+ gDeferredStarProgram.mShaderFiles.clear();
+ gDeferredStarProgram.mShaderFiles.push_back(make_pair("deferred/starsV.glsl", GL_VERTEX_SHADER_ARB));
+ gDeferredStarProgram.mShaderFiles.push_back(make_pair("deferred/starsF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gDeferredStarProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
+ gDeferredStarProgram.mShaderGroup = LLGLSLShader::SG_SKY;
+ success = gDeferredStarProgram.createShader(NULL, &mWLUniforms);
+ }
+
if (mVertexShaderLevel[SHADER_DEFERRED] > 1)
{
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("deferred/edgeF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gDeferredEdgeProgram.mShaderFiles.push_back(make_pair(fragment, GL_FRAGMENT_SHADER_ARB));
gDeferredEdgeProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
success = gDeferredEdgeProgram.createShader(NULL, NULL);
}
@@ -1272,8 +1528,6 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
if (mVertexShaderLevel[SHADER_DEFERRED] > 2)
{
-
-
if (success)
{
gDeferredPostGIProgram.mName = "Deferred Post GI Shader";
@@ -1321,7 +1575,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
BOOL LLViewerShaderMgr::loadShadersObject()
{
BOOL success = TRUE;
-
+
if (mVertexShaderLevel[SHADER_OBJECT] == 0)
{
gObjectShinyProgram.unload();
@@ -1332,6 +1586,14 @@ BOOL LLViewerShaderMgr::loadShadersObject()
gObjectSimpleWaterProgram.unload();
gObjectFullbrightProgram.unload();
gObjectFullbrightWaterProgram.unload();
+ gObjectShinyNonIndexedProgram.unload();
+ gObjectFullbrightShinyNonIndexedProgram.unload();
+ gObjectFullbrightShinyNonIndexedWaterProgram.unload();
+ gObjectShinyNonIndexedWaterProgram.unload();
+ gObjectSimpleNonIndexedProgram.unload();
+ gObjectSimpleNonIndexedWaterProgram.unload();
+ gObjectFullbrightNonIndexedProgram.unload();
+ gObjectFullbrightNonIndexedWaterProgram.unload();
gSkinnedObjectSimpleProgram.unload();
gSkinnedObjectFullbrightProgram.unload();
gSkinnedObjectFullbrightShinyProgram.unload();
@@ -1346,12 +1608,144 @@ BOOL LLViewerShaderMgr::loadShadersObject()
if (success)
{
+ gObjectSimpleNonIndexedProgram.mName = "Non indexed Shader";
+ gObjectSimpleNonIndexedProgram.mFeatures.calculatesLighting = true;
+ gObjectSimpleNonIndexedProgram.mFeatures.calculatesAtmospherics = true;
+ gObjectSimpleNonIndexedProgram.mFeatures.hasGamma = true;
+ gObjectSimpleNonIndexedProgram.mFeatures.hasAtmospherics = true;
+ gObjectSimpleNonIndexedProgram.mFeatures.hasLighting = true;
+ gObjectSimpleNonIndexedProgram.mFeatures.disableTextureIndex = true;
+ gObjectSimpleNonIndexedProgram.mShaderFiles.clear();
+ gObjectSimpleNonIndexedProgram.mShaderFiles.push_back(make_pair("objects/simpleV.glsl", GL_VERTEX_SHADER_ARB));
+ gObjectSimpleNonIndexedProgram.mShaderFiles.push_back(make_pair("objects/simpleF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gObjectSimpleNonIndexedProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ success = gObjectSimpleNonIndexedProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
+ gObjectSimpleNonIndexedWaterProgram.mName = "Non indexed Water Shader";
+ gObjectSimpleNonIndexedWaterProgram.mFeatures.calculatesLighting = true;
+ gObjectSimpleNonIndexedWaterProgram.mFeatures.calculatesAtmospherics = true;
+ gObjectSimpleNonIndexedWaterProgram.mFeatures.hasWaterFog = true;
+ gObjectSimpleNonIndexedWaterProgram.mFeatures.hasAtmospherics = true;
+ gObjectSimpleNonIndexedWaterProgram.mFeatures.hasLighting = true;
+ gObjectSimpleNonIndexedWaterProgram.mFeatures.disableTextureIndex = true;
+ gObjectSimpleNonIndexedWaterProgram.mShaderFiles.clear();
+ gObjectSimpleNonIndexedWaterProgram.mShaderFiles.push_back(make_pair("objects/simpleV.glsl", GL_VERTEX_SHADER_ARB));
+ gObjectSimpleNonIndexedWaterProgram.mShaderFiles.push_back(make_pair("objects/simpleWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gObjectSimpleNonIndexedWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ gObjectSimpleNonIndexedWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
+ success = gObjectSimpleNonIndexedWaterProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
+ gObjectFullbrightNonIndexedProgram.mName = "Non Indexed Fullbright Shader";
+ gObjectFullbrightNonIndexedProgram.mFeatures.calculatesAtmospherics = true;
+ gObjectFullbrightNonIndexedProgram.mFeatures.hasGamma = true;
+ gObjectFullbrightNonIndexedProgram.mFeatures.hasTransport = true;
+ gObjectFullbrightNonIndexedProgram.mFeatures.isFullbright = true;
+ gObjectFullbrightNonIndexedProgram.mFeatures.disableTextureIndex = true;
+ gObjectFullbrightNonIndexedProgram.mShaderFiles.clear();
+ gObjectFullbrightNonIndexedProgram.mShaderFiles.push_back(make_pair("objects/fullbrightV.glsl", GL_VERTEX_SHADER_ARB));
+ gObjectFullbrightNonIndexedProgram.mShaderFiles.push_back(make_pair("objects/fullbrightF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gObjectFullbrightNonIndexedProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ success = gObjectFullbrightNonIndexedProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
+ gObjectFullbrightNonIndexedWaterProgram.mName = "Non Indexed Fullbright Water Shader";
+ gObjectFullbrightNonIndexedWaterProgram.mFeatures.calculatesAtmospherics = true;
+ gObjectFullbrightNonIndexedWaterProgram.mFeatures.isFullbright = true;
+ gObjectFullbrightNonIndexedWaterProgram.mFeatures.hasWaterFog = true;
+ gObjectFullbrightNonIndexedWaterProgram.mFeatures.hasTransport = true;
+ gObjectFullbrightNonIndexedWaterProgram.mFeatures.disableTextureIndex = true;
+ gObjectFullbrightNonIndexedWaterProgram.mShaderFiles.clear();
+ gObjectFullbrightNonIndexedWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightV.glsl", GL_VERTEX_SHADER_ARB));
+ gObjectFullbrightNonIndexedWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gObjectFullbrightNonIndexedWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ gObjectFullbrightNonIndexedWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
+ success = gObjectFullbrightNonIndexedWaterProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
+ gObjectShinyNonIndexedProgram.mName = "Non Indexed Shiny Shader";
+ gObjectShinyNonIndexedProgram.mFeatures.calculatesAtmospherics = true;
+ gObjectShinyNonIndexedProgram.mFeatures.calculatesLighting = true;
+ gObjectShinyNonIndexedProgram.mFeatures.hasGamma = true;
+ gObjectShinyNonIndexedProgram.mFeatures.hasAtmospherics = true;
+ gObjectShinyNonIndexedProgram.mFeatures.isShiny = true;
+ gObjectShinyNonIndexedProgram.mFeatures.disableTextureIndex = true;
+ gObjectShinyNonIndexedProgram.mShaderFiles.clear();
+ gObjectShinyNonIndexedProgram.mShaderFiles.push_back(make_pair("objects/shinyV.glsl", GL_VERTEX_SHADER_ARB));
+ gObjectShinyNonIndexedProgram.mShaderFiles.push_back(make_pair("objects/shinyF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gObjectShinyNonIndexedProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ success = gObjectShinyNonIndexedProgram.createShader(NULL, &mShinyUniforms);
+ }
+
+ if (success)
+ {
+ gObjectShinyNonIndexedWaterProgram.mName = "Non Indexed Shiny Water Shader";
+ gObjectShinyNonIndexedWaterProgram.mFeatures.calculatesAtmospherics = true;
+ gObjectShinyNonIndexedWaterProgram.mFeatures.calculatesLighting = true;
+ gObjectShinyNonIndexedWaterProgram.mFeatures.isShiny = true;
+ gObjectShinyNonIndexedWaterProgram.mFeatures.hasWaterFog = true;
+ gObjectShinyNonIndexedWaterProgram.mFeatures.hasAtmospherics = true;
+ gObjectShinyNonIndexedWaterProgram.mFeatures.disableTextureIndex = true;
+ gObjectShinyNonIndexedWaterProgram.mShaderFiles.clear();
+ gObjectShinyNonIndexedWaterProgram.mShaderFiles.push_back(make_pair("objects/shinyWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gObjectShinyNonIndexedWaterProgram.mShaderFiles.push_back(make_pair("objects/shinyV.glsl", GL_VERTEX_SHADER_ARB));
+ gObjectShinyNonIndexedWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ gObjectShinyNonIndexedWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
+ success = gObjectShinyNonIndexedWaterProgram.createShader(NULL, &mShinyUniforms);
+ }
+
+ if (success)
+ {
+ gObjectFullbrightShinyNonIndexedProgram.mName = "Non Indexed Fullbright Shiny Shader";
+ gObjectFullbrightShinyNonIndexedProgram.mFeatures.calculatesAtmospherics = true;
+ gObjectFullbrightShinyNonIndexedProgram.mFeatures.isFullbright = true;
+ gObjectFullbrightShinyNonIndexedProgram.mFeatures.isShiny = true;
+ gObjectFullbrightShinyNonIndexedProgram.mFeatures.hasGamma = true;
+ gObjectFullbrightShinyNonIndexedProgram.mFeatures.hasTransport = true;
+ gObjectFullbrightShinyNonIndexedProgram.mFeatures.disableTextureIndex = true;
+ gObjectFullbrightShinyNonIndexedProgram.mShaderFiles.clear();
+ gObjectFullbrightShinyNonIndexedProgram.mShaderFiles.push_back(make_pair("objects/fullbrightShinyV.glsl", GL_VERTEX_SHADER_ARB));
+ gObjectFullbrightShinyNonIndexedProgram.mShaderFiles.push_back(make_pair("objects/fullbrightShinyF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gObjectFullbrightShinyNonIndexedProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ success = gObjectFullbrightShinyNonIndexedProgram.createShader(NULL, &mShinyUniforms);
+ }
+
+ if (success)
+ {
+ gObjectFullbrightShinyNonIndexedWaterProgram.mName = "Non Indexed Fullbright Shiny Water Shader";
+ gObjectFullbrightShinyNonIndexedWaterProgram.mFeatures.calculatesAtmospherics = true;
+ gObjectFullbrightShinyNonIndexedWaterProgram.mFeatures.isFullbright = true;
+ gObjectFullbrightShinyNonIndexedWaterProgram.mFeatures.isShiny = true;
+ gObjectFullbrightShinyNonIndexedWaterProgram.mFeatures.hasGamma = true;
+ gObjectFullbrightShinyNonIndexedWaterProgram.mFeatures.hasTransport = true;
+ gObjectFullbrightShinyNonIndexedWaterProgram.mFeatures.hasWaterFog = true;
+ gObjectFullbrightShinyNonIndexedWaterProgram.mFeatures.disableTextureIndex = true;
+ gObjectFullbrightShinyNonIndexedWaterProgram.mShaderFiles.clear();
+ gObjectFullbrightShinyNonIndexedWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightShinyV.glsl", GL_VERTEX_SHADER_ARB));
+ gObjectFullbrightShinyNonIndexedWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightShinyWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gObjectFullbrightShinyNonIndexedWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ gObjectFullbrightShinyNonIndexedWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
+ success = gObjectFullbrightShinyNonIndexedWaterProgram.createShader(NULL, &mShinyUniforms);
+ }
+
+ if (success)
+ {
gObjectSimpleProgram.mName = "Simple Shader";
gObjectSimpleProgram.mFeatures.calculatesLighting = true;
gObjectSimpleProgram.mFeatures.calculatesAtmospherics = true;
gObjectSimpleProgram.mFeatures.hasGamma = true;
gObjectSimpleProgram.mFeatures.hasAtmospherics = true;
gObjectSimpleProgram.mFeatures.hasLighting = true;
+ gObjectSimpleProgram.mFeatures.mIndexedTextureChannels = 0;
gObjectSimpleProgram.mShaderFiles.clear();
gObjectSimpleProgram.mShaderFiles.push_back(make_pair("objects/simpleV.glsl", GL_VERTEX_SHADER_ARB));
gObjectSimpleProgram.mShaderFiles.push_back(make_pair("objects/simpleF.glsl", GL_FRAGMENT_SHADER_ARB));
@@ -1367,6 +1761,7 @@ BOOL LLViewerShaderMgr::loadShadersObject()
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));
@@ -1382,6 +1777,7 @@ BOOL LLViewerShaderMgr::loadShadersObject()
gObjectFullbrightProgram.mFeatures.hasGamma = true;
gObjectFullbrightProgram.mFeatures.hasTransport = true;
gObjectFullbrightProgram.mFeatures.isFullbright = true;
+ gObjectFullbrightProgram.mFeatures.mIndexedTextureChannels = 0;
gObjectFullbrightProgram.mShaderFiles.clear();
gObjectFullbrightProgram.mShaderFiles.push_back(make_pair("objects/fullbrightV.glsl", GL_VERTEX_SHADER_ARB));
gObjectFullbrightProgram.mShaderFiles.push_back(make_pair("objects/fullbrightF.glsl", GL_FRAGMENT_SHADER_ARB));
@@ -1396,6 +1792,7 @@ BOOL LLViewerShaderMgr::loadShadersObject()
gObjectFullbrightWaterProgram.mFeatures.isFullbright = true;
gObjectFullbrightWaterProgram.mFeatures.hasWaterFog = true;
gObjectFullbrightWaterProgram.mFeatures.hasTransport = true;
+ gObjectFullbrightWaterProgram.mFeatures.mIndexedTextureChannels = 0;
gObjectFullbrightWaterProgram.mShaderFiles.clear();
gObjectFullbrightWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightV.glsl", GL_VERTEX_SHADER_ARB));
gObjectFullbrightWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
@@ -1412,6 +1809,7 @@ BOOL LLViewerShaderMgr::loadShadersObject()
gObjectShinyProgram.mFeatures.hasGamma = true;
gObjectShinyProgram.mFeatures.hasAtmospherics = true;
gObjectShinyProgram.mFeatures.isShiny = true;
+ gObjectShinyProgram.mFeatures.mIndexedTextureChannels = 0;
gObjectShinyProgram.mShaderFiles.clear();
gObjectShinyProgram.mShaderFiles.push_back(make_pair("objects/shinyV.glsl", GL_VERTEX_SHADER_ARB));
gObjectShinyProgram.mShaderFiles.push_back(make_pair("objects/shinyF.glsl", GL_FRAGMENT_SHADER_ARB));
@@ -1427,6 +1825,7 @@ BOOL LLViewerShaderMgr::loadShadersObject()
gObjectShinyWaterProgram.mFeatures.isShiny = true;
gObjectShinyWaterProgram.mFeatures.hasWaterFog = true;
gObjectShinyWaterProgram.mFeatures.hasAtmospherics = true;
+ gObjectShinyWaterProgram.mFeatures.mIndexedTextureChannels = 0;
gObjectShinyWaterProgram.mShaderFiles.clear();
gObjectShinyWaterProgram.mShaderFiles.push_back(make_pair("objects/shinyWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
gObjectShinyWaterProgram.mShaderFiles.push_back(make_pair("objects/shinyV.glsl", GL_VERTEX_SHADER_ARB));
@@ -1443,6 +1842,7 @@ BOOL LLViewerShaderMgr::loadShadersObject()
gObjectFullbrightShinyProgram.mFeatures.isShiny = true;
gObjectFullbrightShinyProgram.mFeatures.hasGamma = true;
gObjectFullbrightShinyProgram.mFeatures.hasTransport = true;
+ gObjectFullbrightShinyProgram.mFeatures.mIndexedTextureChannels = 0;
gObjectFullbrightShinyProgram.mShaderFiles.clear();
gObjectFullbrightShinyProgram.mShaderFiles.push_back(make_pair("objects/fullbrightShinyV.glsl", GL_VERTEX_SHADER_ARB));
gObjectFullbrightShinyProgram.mShaderFiles.push_back(make_pair("objects/fullbrightShinyF.glsl", GL_FRAGMENT_SHADER_ARB));
@@ -1459,6 +1859,7 @@ BOOL LLViewerShaderMgr::loadShadersObject()
gObjectFullbrightShinyWaterProgram.mFeatures.hasGamma = true;
gObjectFullbrightShinyWaterProgram.mFeatures.hasTransport = true;
gObjectFullbrightShinyWaterProgram.mFeatures.hasWaterFog = true;
+ gObjectFullbrightShinyWaterProgram.mFeatures.mIndexedTextureChannels = 0;
gObjectFullbrightShinyWaterProgram.mShaderFiles.clear();
gObjectFullbrightShinyWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightShinyV.glsl", GL_VERTEX_SHADER_ARB));
gObjectFullbrightShinyWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightShinyWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
@@ -1478,6 +1879,7 @@ BOOL LLViewerShaderMgr::loadShadersObject()
gSkinnedObjectSimpleProgram.mFeatures.hasAtmospherics = true;
gSkinnedObjectSimpleProgram.mFeatures.hasLighting = true;
gSkinnedObjectSimpleProgram.mFeatures.hasObjectSkinning = true;
+ gSkinnedObjectSimpleProgram.mFeatures.disableTextureIndex = true;
gSkinnedObjectSimpleProgram.mShaderFiles.clear();
gSkinnedObjectSimpleProgram.mShaderFiles.push_back(make_pair("objects/simpleSkinnedV.glsl", GL_VERTEX_SHADER_ARB));
gSkinnedObjectSimpleProgram.mShaderFiles.push_back(make_pair("objects/simpleF.glsl", GL_FRAGMENT_SHADER_ARB));
@@ -1493,6 +1895,7 @@ BOOL LLViewerShaderMgr::loadShadersObject()
gSkinnedObjectFullbrightProgram.mFeatures.hasTransport = true;
gSkinnedObjectFullbrightProgram.mFeatures.isFullbright = true;
gSkinnedObjectFullbrightProgram.mFeatures.hasObjectSkinning = true;
+ gSkinnedObjectFullbrightProgram.mFeatures.disableTextureIndex = true;
gSkinnedObjectFullbrightProgram.mShaderFiles.clear();
gSkinnedObjectFullbrightProgram.mShaderFiles.push_back(make_pair("objects/fullbrightSkinnedV.glsl", GL_VERTEX_SHADER_ARB));
gSkinnedObjectFullbrightProgram.mShaderFiles.push_back(make_pair("objects/fullbrightF.glsl", GL_FRAGMENT_SHADER_ARB));
@@ -1509,6 +1912,7 @@ BOOL LLViewerShaderMgr::loadShadersObject()
gSkinnedObjectFullbrightShinyProgram.mFeatures.isShiny = true;
gSkinnedObjectFullbrightShinyProgram.mFeatures.isFullbright = true;
gSkinnedObjectFullbrightShinyProgram.mFeatures.hasObjectSkinning = true;
+ gSkinnedObjectFullbrightShinyProgram.mFeatures.disableTextureIndex = true;
gSkinnedObjectFullbrightShinyProgram.mShaderFiles.clear();
gSkinnedObjectFullbrightShinyProgram.mShaderFiles.push_back(make_pair("objects/fullbrightShinySkinnedV.glsl", GL_VERTEX_SHADER_ARB));
gSkinnedObjectFullbrightShinyProgram.mShaderFiles.push_back(make_pair("objects/fullbrightShinyF.glsl", GL_FRAGMENT_SHADER_ARB));
@@ -1525,6 +1929,7 @@ BOOL LLViewerShaderMgr::loadShadersObject()
gSkinnedObjectShinySimpleProgram.mFeatures.hasAtmospherics = true;
gSkinnedObjectShinySimpleProgram.mFeatures.hasObjectSkinning = true;
gSkinnedObjectShinySimpleProgram.mFeatures.isShiny = true;
+ gSkinnedObjectShinySimpleProgram.mFeatures.disableTextureIndex = true;
gSkinnedObjectShinySimpleProgram.mShaderFiles.clear();
gSkinnedObjectShinySimpleProgram.mShaderFiles.push_back(make_pair("objects/shinySimpleSkinnedV.glsl", GL_VERTEX_SHADER_ARB));
gSkinnedObjectShinySimpleProgram.mShaderFiles.push_back(make_pair("objects/shinyF.glsl", GL_FRAGMENT_SHADER_ARB));
@@ -1540,9 +1945,11 @@ BOOL LLViewerShaderMgr::loadShadersObject()
gSkinnedObjectSimpleWaterProgram.mFeatures.hasGamma = true;
gSkinnedObjectSimpleWaterProgram.mFeatures.hasAtmospherics = true;
gSkinnedObjectSimpleWaterProgram.mFeatures.hasLighting = true;
+ gSkinnedObjectSimpleWaterProgram.mFeatures.disableTextureIndex = true;
gSkinnedObjectSimpleWaterProgram.mFeatures.hasWaterFog = true;
gSkinnedObjectSimpleWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
gSkinnedObjectSimpleWaterProgram.mFeatures.hasObjectSkinning = true;
+ gSkinnedObjectSimpleWaterProgram.mFeatures.disableTextureIndex = true;
gSkinnedObjectSimpleWaterProgram.mShaderFiles.clear();
gSkinnedObjectSimpleWaterProgram.mShaderFiles.push_back(make_pair("objects/simpleSkinnedV.glsl", GL_VERTEX_SHADER_ARB));
gSkinnedObjectSimpleWaterProgram.mShaderFiles.push_back(make_pair("objects/simpleWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
@@ -1559,6 +1966,7 @@ BOOL LLViewerShaderMgr::loadShadersObject()
gSkinnedObjectFullbrightWaterProgram.mFeatures.isFullbright = true;
gSkinnedObjectFullbrightWaterProgram.mFeatures.hasObjectSkinning = true;
gSkinnedObjectFullbrightWaterProgram.mFeatures.hasWaterFog = true;
+ gSkinnedObjectFullbrightWaterProgram.mFeatures.disableTextureIndex = true;
gSkinnedObjectFullbrightWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
gSkinnedObjectFullbrightWaterProgram.mShaderFiles.clear();
gSkinnedObjectFullbrightWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightSkinnedV.glsl", GL_VERTEX_SHADER_ARB));
@@ -1577,6 +1985,7 @@ BOOL LLViewerShaderMgr::loadShadersObject()
gSkinnedObjectFullbrightShinyWaterProgram.mFeatures.isFullbright = true;
gSkinnedObjectFullbrightShinyWaterProgram.mFeatures.hasObjectSkinning = true;
gSkinnedObjectFullbrightShinyWaterProgram.mFeatures.hasWaterFog = true;
+ gSkinnedObjectFullbrightShinyWaterProgram.mFeatures.disableTextureIndex = true;
gSkinnedObjectFullbrightShinyWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
gSkinnedObjectFullbrightShinyWaterProgram.mShaderFiles.clear();
gSkinnedObjectFullbrightShinyWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightShinySkinnedV.glsl", GL_VERTEX_SHADER_ARB));
@@ -1595,6 +2004,7 @@ BOOL LLViewerShaderMgr::loadShadersObject()
gSkinnedObjectShinySimpleWaterProgram.mFeatures.hasObjectSkinning = true;
gSkinnedObjectShinySimpleWaterProgram.mFeatures.isShiny = true;
gSkinnedObjectShinySimpleWaterProgram.mFeatures.hasWaterFog = true;
+ gSkinnedObjectShinySimpleWaterProgram.mFeatures.disableTextureIndex = true;
gSkinnedObjectShinySimpleWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
gSkinnedObjectShinySimpleWaterProgram.mShaderFiles.clear();
gSkinnedObjectShinySimpleWaterProgram.mShaderFiles.push_back(make_pair("objects/shinySimpleSkinnedV.glsl", GL_VERTEX_SHADER_ARB));
@@ -1635,6 +2045,7 @@ BOOL LLViewerShaderMgr::loadShadersAvatar()
gAvatarProgram.mFeatures.hasGamma = true;
gAvatarProgram.mFeatures.hasAtmospherics = true;
gAvatarProgram.mFeatures.hasLighting = true;
+ gAvatarProgram.mFeatures.disableTextureIndex = true;
gAvatarProgram.mShaderFiles.clear();
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));
@@ -1650,6 +2061,7 @@ BOOL LLViewerShaderMgr::loadShadersAvatar()
gAvatarWaterProgram.mFeatures.hasWaterFog = true;
gAvatarWaterProgram.mFeatures.hasAtmospherics = true;
gAvatarWaterProgram.mFeatures.hasLighting = true;
+ gAvatarWaterProgram.mFeatures.disableTextureIndex = true;
gAvatarWaterProgram.mShaderFiles.clear();
gAvatarWaterProgram.mShaderFiles.push_back(make_pair("avatar/avatarV.glsl", GL_VERTEX_SHADER_ARB));
gAvatarWaterProgram.mShaderFiles.push_back(make_pair("objects/simpleWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
@@ -1670,6 +2082,7 @@ BOOL LLViewerShaderMgr::loadShadersAvatar()
{
gAvatarPickProgram.mName = "Avatar Pick Shader";
gAvatarPickProgram.mFeatures.hasSkinning = true;
+ gAvatarPickProgram.mFeatures.disableTextureIndex = true;
gAvatarPickProgram.mShaderFiles.clear();
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));
@@ -1686,6 +2099,7 @@ BOOL LLViewerShaderMgr::loadShadersAvatar()
gAvatarEyeballProgram.mFeatures.hasGamma = true;
gAvatarEyeballProgram.mFeatures.hasAtmospherics = true;
gAvatarEyeballProgram.mFeatures.hasLighting = true;
+ gAvatarEyeballProgram.mFeatures.disableTextureIndex = true;
gAvatarEyeballProgram.mShaderFiles.clear();
gAvatarEyeballProgram.mShaderFiles.push_back(make_pair("avatar/eyeballV.glsl", GL_VERTEX_SHADER_ARB));
gAvatarEyeballProgram.mShaderFiles.push_back(make_pair("avatar/eyeballF.glsl", GL_FRAGMENT_SHADER_ARB));
@@ -1777,6 +2191,16 @@ std::string LLViewerShaderMgr::getShaderDirPrefix(void)
void LLViewerShaderMgr::updateShaderUniforms(LLGLSLShader * shader)
{
- LLWLParamManager::instance()->updateShaderUniforms(shader);
- LLWaterParamManager::instance()->updateShaderUniforms(shader);
+ LLWLParamManager::getInstance()->updateShaderUniforms(shader);
+ LLWaterParamManager::getInstance()->updateShaderUniforms(shader);
+}
+
+LLViewerShaderMgr::shader_iter LLViewerShaderMgr::beginShaders() const
+{
+ return mShaderList.begin();
+}
+
+LLViewerShaderMgr::shader_iter LLViewerShaderMgr::endShaders() const
+{
+ return mShaderList.end();
}
diff --git a/indra/newview/llviewershadermgr.h b/indra/newview/llviewershadermgr.h
index 72ac5e02ee..efef9ec5b2 100644
--- a/indra/newview/llviewershadermgr.h
+++ b/indra/newview/llviewershadermgr.h
@@ -241,20 +241,12 @@ public:
base_iter_t mIter;
};
- shader_iter beginShaders() const
- {
- return mShaderList.begin();
- }
-
- shader_iter endShaders() const
- {
- return mShaderList.end();
- }
+ shader_iter beginShaders() const;
+ shader_iter endShaders() const;
+ /* virtual */ std::string getShaderDirPrefix(void);
- /* virtual */ std::string getShaderDirPrefix(void); // Virtual
-
- /* virtual */ void updateShaderUniforms(LLGLSLShader * shader); // Virtual
+ /* virtual */ void updateShaderUniforms(LLGLSLShader * shader);
private:
@@ -298,16 +290,25 @@ extern LLVector4 gShinyOrigin;
//object shaders
extern LLGLSLShader gObjectSimpleProgram;
extern LLGLSLShader gObjectSimpleWaterProgram;
+extern LLGLSLShader gObjectSimpleNonIndexedProgram;
+extern LLGLSLShader gObjectSimpleNonIndexedWaterProgram;
extern LLGLSLShader gObjectFullbrightProgram;
extern LLGLSLShader gObjectFullbrightWaterProgram;
+extern LLGLSLShader gObjectFullbrightNonIndexedProgram;
+extern LLGLSLShader gObjectFullbrightNonIndexedWaterProgram;
extern LLGLSLShader gObjectSimpleLODProgram;
extern LLGLSLShader gObjectFullbrightLODProgram;
extern LLGLSLShader gObjectFullbrightShinyProgram;
extern LLGLSLShader gObjectFullbrightShinyWaterProgram;
+extern LLGLSLShader gObjectFullbrightShinyNonIndexedProgram;
+extern LLGLSLShader gObjectFullbrightShinyNonIndexedWaterProgram;
+
extern LLGLSLShader gObjectShinyProgram;
extern LLGLSLShader gObjectShinyWaterProgram;
+extern LLGLSLShader gObjectShinyNonIndexedProgram;
+extern LLGLSLShader gObjectShinyNonIndexedWaterProgram;
extern LLGLSLShader gSkinnedObjectSimpleProgram;
extern LLGLSLShader gSkinnedObjectFullbrightProgram;
@@ -349,6 +350,7 @@ extern LLGLSLShader gDeferredImpostorProgram;
extern LLGLSLShader gDeferredEdgeProgram;
extern LLGLSLShader gDeferredWaterProgram;
extern LLGLSLShader gDeferredDiffuseProgram;
+extern LLGLSLShader gDeferredNonIndexedDiffuseProgram;
extern LLGLSLShader gDeferredSkinnedDiffuseProgram;
extern LLGLSLShader gDeferredSkinnedBumpProgram;
extern LLGLSLShader gDeferredSkinnedAlphaProgram;
@@ -373,8 +375,11 @@ extern LLGLSLShader gDeferredAvatarShadowProgram;
extern LLGLSLShader gDeferredAttachmentShadowProgram;
extern LLGLSLShader gDeferredAlphaProgram;
extern LLGLSLShader gDeferredFullbrightProgram;
+extern LLGLSLShader gDeferredAvatarEyesProgram;
extern LLGLSLShader gDeferredAvatarAlphaProgram;
-
+extern LLGLSLShader gDeferredWLSkyProgram;
+extern LLGLSLShader gDeferredWLCloudProgram;
+extern LLGLSLShader gDeferredStarProgram;
extern LLGLSLShader gLuminanceGatherProgram;
//current avatar shader parameter pointer
diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp
index af06421bf9..4da0f80a00 100644
--- a/indra/newview/llviewertexture.cpp
+++ b/indra/newview/llviewertexture.cpp
@@ -1168,6 +1168,7 @@ void LLViewerFetchedTexture::init(bool firstinit)
mSavedRawDiscardLevel = -1 ;
mDesiredSavedRawDiscardLevel = -1 ;
mLastReferencedSavedRawImageTime = 0.0f ;
+ mKeptSavedRawImageTime = 0.f ;
mLastCallBackActiveTime = 0.f;
}
@@ -2696,8 +2697,16 @@ void LLViewerFetchedTexture::saveRawImage()
mLastReferencedSavedRawImageTime = sCurrentTime ;
}
-void LLViewerFetchedTexture::forceToSaveRawImage(S32 desired_discard)
+void LLViewerFetchedTexture::forceToSaveRawImage(S32 desired_discard, F32 kept_time)
{
+ mKeptSavedRawImageTime = kept_time ;
+ mLastReferencedSavedRawImageTime = sCurrentTime ;
+
+ if(mSavedRawDiscardLevel > -1 && mSavedRawDiscardLevel <= desired_discard)
+ {
+ return ; //raw imge is ready.
+ }
+
if(!mForceToSaveRawImage || mDesiredSavedRawDiscardLevel < 0 || mDesiredSavedRawDiscardLevel > desired_discard)
{
mForceToSaveRawImage = TRUE ;
@@ -2713,11 +2722,16 @@ void LLViewerFetchedTexture::forceToSaveRawImage(S32 desired_discard)
mRawImage = NULL ;
mRawDiscardLevel = INVALID_DISCARD_LEVEL ;
- }
+ }
}
}
void LLViewerFetchedTexture::destroySavedRawImage()
{
+ if(mLastReferencedSavedRawImageTime < mKeptSavedRawImageTime)
+ {
+ return ; //keep the saved raw image.
+ }
+
mForceToSaveRawImage = FALSE ;
mSaveRawImage = FALSE ;
@@ -2729,6 +2743,7 @@ void LLViewerFetchedTexture::destroySavedRawImage()
mSavedRawDiscardLevel = -1 ;
mDesiredSavedRawDiscardLevel = -1 ;
mLastReferencedSavedRawImageTime = 0.0f ;
+ mKeptSavedRawImageTime = 0.f ;
}
LLImageRaw* LLViewerFetchedTexture::getSavedRawImage()
diff --git a/indra/newview/llviewertexture.h b/indra/newview/llviewertexture.h
index d512f8ec3a..c5b8c8923a 100644
--- a/indra/newview/llviewertexture.h
+++ b/indra/newview/llviewertexture.h
@@ -465,7 +465,7 @@ public:
S32 getCachedRawImageLevel() const {return mCachedRawDiscardLevel;}
BOOL isCachedRawImageReady() const {return mCachedRawImageReady ;}
BOOL isRawImageValid()const { return mIsRawImageValid ; }
- void forceToSaveRawImage(S32 desired_discard = 0) ;
+ void forceToSaveRawImage(S32 desired_discard = 0, F32 kept_time = 0.f) ;
/*virtual*/ void setCachedRawImage(S32 discard_level, LLImageRaw* imageraw) ;
void destroySavedRawImage() ;
LLImageRaw* getSavedRawImage() ;
@@ -550,6 +550,7 @@ protected:
S32 mSavedRawDiscardLevel;
S32 mDesiredSavedRawDiscardLevel;
F32 mLastReferencedSavedRawImageTime ;
+ F32 mKeptSavedRawImageTime ;
//a small version of the copy of the raw image (<= 64 * 64)
LLPointer<LLImageRaw> mCachedRawImage;
diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp
index d9ff931575..d24174adea 100644
--- a/indra/newview/llviewertexturelist.cpp
+++ b/indra/newview/llviewertexturelist.cpp
@@ -76,7 +76,6 @@ LLStat LLViewerTextureList::sFormattedMemStat(32, TRUE);
LLViewerTextureList gTextureList;
static LLFastTimer::DeclareTimer FTM_PROCESS_IMAGES("Process Images");
-U32 LLViewerTextureList::sRenderThreadID = 0 ;
///////////////////////////////////////////////////////////////////////////////
LLViewerTextureList::LLViewerTextureList()
@@ -89,16 +88,13 @@ LLViewerTextureList::LLViewerTextureList()
}
void LLViewerTextureList::init()
-{
- sRenderThreadID = LLThread::currentID() ;
-
+{
mInitialized = TRUE ;
sNumImages = 0;
+ mUpdateStats = TRUE;
mMaxResidentTexMemInMegaBytes = 0;
mMaxTotalTextureMemInMegaBytes = 0 ;
- mUpdateStats = TRUE;
-
// Update how much texture RAM we're allowed to use.
updateMaxResidentTexMem(0); // 0 = use current
@@ -110,8 +106,8 @@ void LLViewerTextureList::doPreloadImages()
{
LL_DEBUGS("ViewerImages") << "Preloading images..." << LL_ENDL;
- llassert_always(mInitialized) ;
- llassert_always(mImageList.empty()) ;
+ llassert_always(mInitialized) ;
+ llassert_always(mImageList.empty()) ;
llassert_always(mUUIDMap.empty()) ;
// Set the "missing asset" image
@@ -283,6 +279,8 @@ void LLViewerTextureList::shutdown()
mUUIDMap.clear();
mImageList.clear();
+
+ mInitialized = FALSE ; //prevent loading textures again.
}
void LLViewerTextureList::dump()
@@ -330,6 +328,11 @@ LLViewerFetchedTexture* LLViewerTextureList::getImageFromFile(const std::string&
LLGLenum primary_format,
const LLUUID& force_id)
{
+ if(!mInitialized)
+ {
+ return NULL ;
+ }
+
std::string full_path = gDirUtilp->findSkinnedFilename("textures", filename);
if (full_path.empty())
{
@@ -350,6 +353,11 @@ LLViewerFetchedTexture* LLViewerTextureList::getImageFromUrl(const std::string&
LLGLenum primary_format,
const LLUUID& force_id)
{
+ if(!mInitialized)
+ {
+ return NULL ;
+ }
+
// generate UUID based on hash of filename
LLUUID new_id;
if (force_id.notNull())
@@ -409,6 +417,11 @@ LLViewerFetchedTexture* LLViewerTextureList::getImage(const LLUUID &image_id,
LLGLenum primary_format,
LLHost request_from_host)
{
+ if(!mInitialized)
+ {
+ return NULL ;
+ }
+
// Return the image with ID image_id
// If the image is not found, creates new image and
// enqueues a request for transmission
@@ -487,10 +500,9 @@ LLViewerFetchedTexture *LLViewerTextureList::findImage(const LLUUID &image_id)
return iter->second;
}
-void LLViewerTextureList::addImageToList(LLViewerFetchedTexture *image, U32 thread_id)
+void LLViewerTextureList::addImageToList(LLViewerFetchedTexture *image)
{
llassert_always(mInitialized) ;
- llassert_always(sRenderThreadID == thread_id);
llassert(image);
if (image->isInImageList())
{
@@ -504,10 +516,9 @@ void LLViewerTextureList::addImageToList(LLViewerFetchedTexture *image, U32 thre
image->setInImageList(TRUE) ;
}
-void LLViewerTextureList::removeImageFromList(LLViewerFetchedTexture *image, U32 thread_id)
+void LLViewerTextureList::removeImageFromList(LLViewerFetchedTexture *image)
{
llassert_always(mInitialized) ;
- llassert_always(sRenderThreadID == thread_id);
llassert(image);
if (!image->isInImageList())
{
@@ -644,10 +655,7 @@ void LLViewerTextureList::updateImagesDecodePriorities()
const F32 LAZY_FLUSH_TIMEOUT = 30.f; // stop decoding
const F32 MAX_INACTIVE_TIME = 50.f; // actually delete
S32 min_refs = 3; // 1 for mImageList, 1 for mUUIDMap, 1 for local reference
- if (imagep->hasCallbacks())
- {
- min_refs++; // Add an extra reference if we're on the loaded callback list
- }
+
S32 num_refs = imagep->getNumRefs();
if (num_refs == min_refs)
{
@@ -704,9 +712,9 @@ void LLViewerTextureList::updateImagesDecodePriorities()
if ((decode_priority_test < old_priority_test * .8f) ||
(decode_priority_test > old_priority_test * 1.25f))
{
- removeImageFromList(imagep, sRenderThreadID);
+ removeImageFromList(imagep);
imagep->setDecodePriority(decode_priority);
- addImageToList(imagep, sRenderThreadID);
+ addImageToList(imagep);
}
update_counter--;
}
@@ -878,8 +886,6 @@ void LLViewerTextureList::decodeAllImages(F32 max_time)
{
LLTimer timer;
- llassert_always(sRenderThreadID == LLThread::currentID());
-
// Update texture stats and priorities
std::vector<LLPointer<LLViewerFetchedTexture> > image_list;
for (image_priority_list_t::iterator iter = mImageList.begin();
diff --git a/indra/newview/llviewertexturelist.h b/indra/newview/llviewertexturelist.h
index d02b6be6b5..7f4dd0ae88 100644
--- a/indra/newview/llviewertexturelist.h
+++ b/indra/newview/llviewertexturelist.h
@@ -121,8 +121,8 @@ private:
void addImage(LLViewerFetchedTexture *image);
void deleteImage(LLViewerFetchedTexture *image);
- void addImageToList(LLViewerFetchedTexture *image, U32 thread_id = LLThread::currentID());
- void removeImageFromList(LLViewerFetchedTexture *image, U32 thread_id = LLThread::currentID());
+ void addImageToList(LLViewerFetchedTexture *image);
+ void removeImageFromList(LLViewerFetchedTexture *image);
LLViewerFetchedTexture * getImage(const LLUUID &image_id,
BOOL usemipmap = TRUE,
@@ -208,9 +208,6 @@ public:
private:
static S32 sNumImages;
static void (*sUUIDCallback)(void**, const LLUUID &);
-
- //debug use
- static U32 sRenderThreadID;
};
class LLUIImageList : public LLImageProviderInterface, public LLSingleton<LLUIImageList>
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index 6fe79c2e85..0e158693b9 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -528,8 +528,8 @@ public:
addText(xpos,ypos, llformat("%s streaming cost: %.1f", label, cost));
ypos += y_inc;
- addText(xpos, ypos, llformat(" %.1f KTris, %.1f/%.1f KB, %d objects",
- count/1024.f, visible_bytes/1024.f, total_bytes/1024.f, object_count));
+ addText(xpos, ypos, llformat(" %.3f KTris, %.1f/%.1f KB, %d objects",
+ count/1000.f, visible_bytes/1024.f, total_bytes/1024.f, object_count));
ypos += y_inc;
}
@@ -601,7 +601,7 @@ public:
ypos += y_inc;
- if (gSavedSettings.getBOOL("MeshEnabled"))
+ if (gMeshRepo.meshRezEnabled())
{
addText(xpos, ypos, llformat("%.3f MB Mesh Data Received", LLMeshRepository::sBytesReceived/(1024.f*1024.f)));
@@ -726,19 +726,6 @@ public:
}
}
- if (gSavedSettings.getBOOL("DebugShowUploadCost"))
- {
- addText(xpos, ypos, llformat(" Meshes: L$%d", gPipeline.mDebugMeshUploadCost));
- ypos += y_inc/2;
- addText(xpos, ypos, llformat(" Sculpties: L$%d", gPipeline.mDebugSculptUploadCost));
- ypos += y_inc/2;
- addText(xpos, ypos, llformat(" Textures: L$%d", gPipeline.mDebugTextureUploadCost));
- ypos += y_inc/2;
- addText(xpos, ypos, "Upload Cost: ");
-
- ypos += y_inc;
- }
-
//temporary hack to give feedback on mesh upload progress
if (!gMeshRepo.mUploads.empty())
{
@@ -747,10 +734,8 @@ public:
{
LLMeshUploadThread* thread = *iter;
- addText(xpos, ypos, llformat("Mesh Upload -- price quote: %d:%d | upload: %d:%d | create: %d",
- thread->mPendingConfirmations, thread->mUploadQ.size()+thread->mTextureQ.size(),
- thread->mPendingUploads, thread->mConfirmedQ.size()+thread->mConfirmedTextureQ.size(),
- thread->mInstanceQ.size()));
+ addText(xpos, ypos, llformat("Mesh Uploads: %d",
+ thread->mPendingUploads));
ypos += y_inc;
}
}
@@ -1578,6 +1563,25 @@ LLViewerWindow::LLViewerWindow(
ignore_pixel_depth,
gSavedSettings.getBOOL("RenderDeferred") ? 0 : gSavedSettings.getU32("RenderFSAASamples")); //don't use window level anti-aliasing if FBOs are enabled
+ if (NULL == mWindow)
+ {
+ LLSplashScreen::update(LLTrans::getString("StartupRequireDriverUpdate"));
+
+ LL_WARNS("Window") << "Failed to create window, to be shutting Down, be sure your graphics driver is updated." << llendl ;
+
+ ms_sleep(5000) ; //wait for 5 seconds.
+
+ LLSplashScreen::update(LLTrans::getString("ShuttingDown"));
+#if LL_LINUX || LL_SOLARIS
+ llwarns << "Unable to create window, be sure screen is set at 32-bit color and your graphics driver is configured correctly. See README-linux.txt or README-solaris.txt for further information."
+ << llendl;
+#else
+ LL_WARNS("Window") << "Unable to create window, be sure screen is set at 32-bit color in Control Panels->Display->Settings"
+ << LL_ENDL;
+#endif
+ LLAppViewer::instance()->fastQuit(1);
+ }
+
if (!LLAppViewer::instance()->restoreErrorTrap())
{
LL_WARNS("Window") << " Someone took over my signal/exception handler (post createWindow)!" << LL_ENDL;
@@ -1593,19 +1597,6 @@ LLViewerWindow::LLViewerWindow(
gSavedSettings.setS32("FullScreenHeight",scr.mY);
}
- if (NULL == mWindow)
- {
- LLSplashScreen::update(LLTrans::getString("ShuttingDown"));
-#if LL_LINUX || LL_SOLARIS
- llwarns << "Unable to create window, be sure screen is set at 32-bit color and your graphics driver is configured correctly. See README-linux.txt or README-solaris.txt for further information."
- << llendl;
-#else
- LL_WARNS("Window") << "Unable to create window, be sure screen is set at 32-bit color in Control Panels->Display->Settings"
- << LL_ENDL;
-#endif
- LLAppViewer::instance()->fastQuit(1);
- }
-
// Get the real window rect the window was created with (since there are various OS-dependent reasons why
// the size of a window or fullscreen context may have been adjusted slightly...)
F32 ui_scale_factor = gSavedSettings.getF32("UIScaleFactor");
@@ -1638,6 +1629,7 @@ LLViewerWindow::LLViewerWindow(
gSavedSettings.setBOOL("RenderVBOEnable", FALSE);
}
LLVertexBuffer::initClass(gSavedSettings.getBOOL("RenderVBOEnable"), gSavedSettings.getBOOL("RenderVBOMappingDisable"));
+ LL_INFOS("RenderInit") << "LLVertexBuffer initialization done." << LL_ENDL ;
if (LLFeatureManager::getInstance()->isSafe()
|| (gSavedSettings.getS32("LastFeatureVersion") != LLFeatureManager::getInstance()->getVersion())
@@ -1978,7 +1970,10 @@ void LLViewerWindow::shutdownViews()
// destroy the nav bar, not currently part of gViewerWindow
// *TODO: Make LLNavigationBar part of gViewerWindow
+ if (LLNavigationBar::instanceExists())
+ {
delete LLNavigationBar::getInstance();
+ }
// destroy menus after instantiating navbar above, as it needs
// access to gMenuHolder
@@ -3141,6 +3136,12 @@ void LLViewerWindow::updateLayout()
//gMenuBarView->setItemVisible("BuildTools", gFloaterTools->getVisible());
}
+ LLFloaterBuildOptions* build_options_floater = LLFloaterReg::getTypedInstance<LLFloaterBuildOptions>("build_options");
+ if (build_options_floater && build_options_floater->getVisible())
+ {
+ build_options_floater->updateGridMode();
+ }
+
// Always update console
if(gConsole)
{
@@ -4511,6 +4512,14 @@ void LLViewerWindow::setup3DViewport(S32 x_offset, S32 y_offset)
glViewport(gGLViewport[0], gGLViewport[1], gGLViewport[2], gGLViewport[3]);
}
+void LLViewerWindow::revealIntroPanel()
+{
+ if (mProgressView)
+ {
+ mProgressView->revealIntroPanel();
+ }
+}
+
void LLViewerWindow::setShowProgress(const BOOL show)
{
if (mProgressView)
diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h
index df6928aa1d..ff49ed1f62 100644
--- a/indra/newview/llviewerwindow.h
+++ b/indra/newview/llviewerwindow.h
@@ -271,6 +271,7 @@ public:
void setProgressMessage(const std::string& msg);
void setProgressCancelButtonVisible( BOOL b, const std::string& label = LLStringUtil::null );
LLProgressView *getProgressView() const;
+ void revealIntroPanel();
void updateObjectUnderCursor();
diff --git a/indra/newview/llvlmanager.cpp b/indra/newview/llvlmanager.cpp
index 25f2687fe2..d8de979f56 100644
--- a/indra/newview/llvlmanager.cpp
+++ b/indra/newview/llvlmanager.cpp
@@ -94,7 +94,7 @@ void LLVLManager::unpackData(const S32 num_packets)
}
else if (CLOUD_LAYER_CODE == datap->mType)
{
- datap->mRegionp->mCloudLayer.decompress(bit_pack, &goph);
+
}
}
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index cd98fe6d7e..c77c4f167b 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -56,6 +56,7 @@
#include "lleditingmotion.h"
#include "llemote.h"
//#include "llfirstuse.h"
+#include "llfloatertools.h"
#include "llheadrotmotion.h"
#include "llhudeffecttrail.h"
#include "llhudmanager.h"
@@ -1122,14 +1123,20 @@ void LLVOAvatar::initClass()
// Process XML data
// avatar_skeleton.xml
- llassert(!sAvatarSkeletonInfo);
+ if (sAvatarSkeletonInfo)
+ { //this can happen if a login attempt failed
+ delete sAvatarSkeletonInfo;
+ }
sAvatarSkeletonInfo = new LLVOAvatarSkeletonInfo;
if (!sAvatarSkeletonInfo->parseXml(sSkeletonXMLTree.getRoot()))
{
llerrs << "Error parsing skeleton XML file: " << skeleton_path << llendl;
}
// parse avatar_lad.xml
- llassert(!sAvatarXmlInfo);
+ if (sAvatarXmlInfo)
+ { //this can happen if a login attempt failed
+ deleteAndClear(sAvatarXmlInfo);
+ }
sAvatarXmlInfo = new LLVOAvatarXmlInfo;
if (!sAvatarXmlInfo->parseXmlSkeletonNode(root))
{
@@ -1541,7 +1548,35 @@ BOOL LLVOAvatar::lineSegmentIntersect(const LLVector3& start, const LLVector3& e
return TRUE;
}
}
+
+ if (isSelf())
+ {
+ for (attachment_map_t::iterator iter = mAttachmentPoints.begin();
+ iter != mAttachmentPoints.end();
+ ++iter)
+ {
+ LLViewerJointAttachment* attachment = iter->second;
+
+ for (LLViewerJointAttachment::attachedobjs_vec_t::iterator attachment_iter = attachment->mAttachedObjects.begin();
+ attachment_iter != attachment->mAttachedObjects.end();
+ ++attachment_iter)
+ {
+ LLViewerObject* attached_object = (*attachment_iter);
+
+ if (attached_object && !attached_object->isDead() && attachment->getValid())
+ {
+ LLDrawable* drawable = attached_object->mDrawable;
+ if (drawable->isState(LLDrawable::RIGGED))
+ { //regenerate octree for rigged attachment
+ gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_RIGGED, TRUE);
+ }
+ }
+ }
+ }
+ }
}
+
+
LLVector3 position;
if (mNameText.notNull() && mNameText->lineSegmentIntersect(start, end, position))
@@ -1557,6 +1592,56 @@ BOOL LLVOAvatar::lineSegmentIntersect(const LLVector3& start, const LLVector3& e
return FALSE;
}
+LLViewerObject* LLVOAvatar::lineSegmentIntersectRiggedAttachments(const LLVector3& start, const LLVector3& end,
+ S32 face,
+ BOOL pick_transparent,
+ S32* face_hit,
+ LLVector3* intersection,
+ LLVector2* tex_coord,
+ LLVector3* normal,
+ LLVector3* bi_normal)
+{
+ if (isSelf() && !gAgent.needsRenderAvatar())
+ {
+ return NULL;
+ }
+
+ LLViewerObject* hit = NULL;
+
+ if (lineSegmentBoundingBox(start, end))
+ {
+ LLVector3 local_end = end;
+ LLVector3 local_intersection;
+
+ for (attachment_map_t::iterator iter = mAttachmentPoints.begin();
+ iter != mAttachmentPoints.end();
+ ++iter)
+ {
+ LLViewerJointAttachment* attachment = iter->second;
+
+ for (LLViewerJointAttachment::attachedobjs_vec_t::iterator attachment_iter = attachment->mAttachedObjects.begin();
+ attachment_iter != attachment->mAttachedObjects.end();
+ ++attachment_iter)
+ {
+ LLViewerObject* attached_object = (*attachment_iter);
+
+ if (attached_object->lineSegmentIntersect(start, local_end, face, pick_transparent, face_hit, &local_intersection, tex_coord, normal, bi_normal))
+ {
+ local_end = local_intersection;
+ if (intersection)
+ {
+ *intersection = local_intersection;
+ }
+
+ hit = attached_object;
+ }
+ }
+ }
+ }
+
+ return hit;
+}
+
//-----------------------------------------------------------------------------
// parseSkeletonFile()
//-----------------------------------------------------------------------------
@@ -4971,19 +5056,6 @@ void LLVOAvatar::resetSpecificJointPosition( const std::string& name )
//-----------------------------------------------------------------------------
void LLVOAvatar::resetJointPositionsToDefault( void )
{
- const LLVector3& avPos = getCharacterPosition();
-
- //Reposition the pelvis
- LLJoint* pPelvis = mRoot.findJoint("mPelvis");
- if ( pPelvis )
- {
- pPelvis->setPosition( avPos + pPelvis->getPosition() );
- }
- else
- {
- llwarns<<"Can't get pelvis joint."<<llendl;
- return;
- }
//Subsequent joints are relative to pelvis
for( S32 i = 0; i < (S32)mNumJoints; ++i )
@@ -4994,7 +5066,7 @@ void LLVOAvatar::resetJointPositionsToDefault( void )
pJoint->setId( LLUUID::null );
//restore joints to default positions, however skip over the pelvis
- if ( pJoint && pPelvis != pJoint )
+ if ( pJoint )
{
pJoint->restoreOldXform();
}
@@ -6020,7 +6092,7 @@ void LLVOAvatar::cleanupAttachedMesh( LLViewerObject* pVO )
LLVOVolume* pVObj = pVO->mDrawable->getVOVolume();
if ( pVObj )
{
- const LLMeshSkinInfo* pSkinData = gMeshRepo.getSkinInfo( pVObj->getVolume()->getParams().getSculptID() );
+ const LLMeshSkinInfo* pSkinData = gMeshRepo.getSkinInfo( pVObj->getVolume()->getParams().getSculptID(), pVObj );
if ( pSkinData )
{
const int jointCnt = pSkinData->mJointNames.size();
@@ -6031,6 +6103,14 @@ void LLVOAvatar::cleanupAttachedMesh( LLViewerObject* pVO )
if ( bindCnt > 0 )
{
LLVOAvatar::resetJointPositionsToDefault();
+ //Need to handle the repositioning of the cam, updating rig data etc during outfit editing
+ //This handles the case where we detach a replacement rig.
+ if ( gAgentCamera.cameraCustomizeAvatar() )
+ {
+ gAgent.unpauseAnimation();
+ //Still want to refocus on head bone
+ gAgentCamera.changeCameraToCustomizeAvatar();
+ }
}
}
}
@@ -7214,9 +7294,9 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )
llinfos << "Re-requesting AvatarAppearance for object: " << getID() << llendl;
LLAvatarPropertiesProcessor::getInstance()->sendAvatarTexturesRequest(getID());
mRuthTimer.reset();
- }
- else
- {
+ }
+ else
+ {
llinfos << "That's okay, we already have a non-default shape for object: " << getID() << llendl;
// we don't really care.
}
@@ -8186,6 +8266,8 @@ U32 LLVOAvatar::getPartitionType() const
//static
void LLVOAvatar::updateImpostors()
{
+ LLCharacter::sAllowInstancesChange = FALSE ;
+
for (std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin();
iter != LLCharacter::sInstances.end(); ++iter)
{
@@ -8195,6 +8277,8 @@ void LLVOAvatar::updateImpostors()
gPipeline.generateImpostor(avatar);
}
}
+
+ LLCharacter::sAllowInstancesChange = TRUE ;
}
BOOL LLVOAvatar::isImpostor() const
diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h
index 6db119978a..6f14b42513 100644
--- a/indra/newview/llvoavatar.h
+++ b/indra/newview/llvoavatar.h
@@ -145,6 +145,14 @@ public:
LLVector2* tex_coord = NULL, // return the texture coordinates of the intersection point
LLVector3* normal = NULL, // return the surface normal at the intersection point
LLVector3* bi_normal = NULL); // return the surface bi-normal at the intersection point
+ LLViewerObject* lineSegmentIntersectRiggedAttachments(const LLVector3& start, const LLVector3& end,
+ S32 face = -1, // which face to check, -1 = ALL_SIDES
+ BOOL pick_transparent = FALSE,
+ S32* face_hit = NULL, // which face was hit
+ LLVector3* intersection = NULL, // return the intersection point
+ LLVector2* tex_coord = NULL, // return the texture coordinates of the intersection point
+ LLVector3* normal = NULL, // return the surface normal at the intersection point
+ LLVector3* bi_normal = NULL); // return the surface bi-normal at the intersection point
//--------------------------------------------------------------------
// LLCharacter interface and related
diff --git a/indra/newview/llvocache.cpp b/indra/newview/llvocache.cpp
index b888a263d0..f0b5b50feb 100644
--- a/indra/newview/llvocache.cpp
+++ b/indra/newview/llvocache.cpp
@@ -76,6 +76,7 @@ LLVOCacheEntry::LLVOCacheEntry(LLAPRFile* apr_file)
S32 size = -1;
BOOL success;
+ mDP.assignBuffer(mBuffer, 0);
success = check_read(apr_file, &mLocalID, sizeof(U32));
if(success)
{
@@ -136,10 +137,7 @@ LLVOCacheEntry::LLVOCacheEntry(LLAPRFile* apr_file)
LLVOCacheEntry::~LLVOCacheEntry()
{
- if(mBuffer)
- {
- delete[] mBuffer;
- }
+ mDP.freeBuffer();
}
@@ -285,8 +283,6 @@ LLVOCache::~LLVOCache()
void LLVOCache::setDirNames(ELLPath location)
{
- std::string delem = gDirUtilp->getDirDelimiter();
-
mHeaderFileName = gDirUtilp->getExpandedFilename(location, object_cache_dirname, header_filename);
mObjectCacheDirName = gDirUtilp->getExpandedFilename(location, object_cache_dirname);
}
@@ -339,8 +335,7 @@ void LLVOCache::removeCache(ELLPath location)
llinfos << "about to remove the object cache due to settings." << llendl ;
- std::string delem = gDirUtilp->getDirDelimiter();
- std::string mask = delem + "*";
+ std::string mask = "*";
std::string cache_dir = gDirUtilp->getExpandedFilename(location, object_cache_dirname);
llinfos << "Removing cache at " << cache_dir << llendl;
gDirUtilp->deleteFilesInDir(cache_dir, mask); //delete all files
@@ -361,8 +356,7 @@ void LLVOCache::removeCache()
llinfos << "about to remove the object cache due to some error." << llendl ;
- std::string delem = gDirUtilp->getDirDelimiter();
- std::string mask = delem + "*";
+ std::string mask = "*";
llinfos << "Removing cache at " << mObjectCacheDirName << llendl;
gDirUtilp->deleteFilesInDir(mObjectCacheDirName, mask);
diff --git a/indra/newview/llvoclouds.cpp b/indra/newview/llvoclouds.cpp
deleted file mode 100644
index 78aa6e6ab8..0000000000
--- a/indra/newview/llvoclouds.cpp
+++ /dev/null
@@ -1,293 +0,0 @@
-/**
- * @file llvoclouds.cpp
- * @brief Implementation of LLVOClouds class which is a derivation fo 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$
- */
-
-#include "llviewerprecompiledheaders.h"
-
-#include "llvoclouds.h"
-
-#include "lldrawpoolalpha.h"
-
-#include "llviewercontrol.h"
-
-#include "llagent.h" // to get camera position
-#include "lldrawable.h"
-#include "llface.h"
-#include "llprimitive.h"
-#include "llsky.h"
-#include "llviewercamera.h"
-#include "llviewertexturelist.h"
-#include "llviewerobjectlist.h"
-#include "llviewerregion.h"
-#include "llvosky.h"
-#include "llworld.h"
-#include "pipeline.h"
-#include "llspatialpartition.h"
-
-LLUUID gCloudTextureID = IMG_CLOUD_POOF;
-
-
-LLVOClouds::LLVOClouds(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp)
-: LLAlphaObject(id, LL_VO_CLOUDS, regionp)
-{
- mCloudGroupp = NULL;
- mbCanSelect = FALSE;
- setNumTEs(1);
- LLViewerTexture* image = LLViewerTextureManager::getFetchedTexture(gCloudTextureID);
- image->setBoostLevel(LLViewerTexture::BOOST_CLOUDS);
- setTEImage(0, image);
-}
-
-
-LLVOClouds::~LLVOClouds()
-{
-}
-
-
-BOOL LLVOClouds::isActive() const
-{
- return TRUE;
-}
-
-BOOL LLVOClouds::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
-{
- static LLFastTimer::DeclareTimer ftm("Idle Clouds");
- LLFastTimer t(ftm);
-
- if (!(gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_CLOUDS)))
- {
- return TRUE;
- }
-
- // Set dirty flag (so renderer will rebuild primitive)
- if (mDrawable)
- {
- gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_VOLUME, TRUE);
- }
-
- return TRUE;
-}
-
-
-void LLVOClouds::setPixelAreaAndAngle(LLAgent &agent)
-{
- mAppAngle = 50;
- mPixelArea = 1500*100;
-}
-
-void LLVOClouds::updateTextures()
-{
- getTEImage(0)->addTextureStats(mPixelArea);
-}
-
-LLDrawable* LLVOClouds::createDrawable(LLPipeline *pipeline)
-{
- pipeline->allocDrawable(this);
- mDrawable->setLit(FALSE);
- mDrawable->setRenderType(LLPipeline::RENDER_TYPE_CLOUDS);
-
- return mDrawable;
-}
-
-static LLFastTimer::DeclareTimer FTM_UPDATE_CLOUDS("Update Clouds");
-
-BOOL LLVOClouds::updateGeometry(LLDrawable *drawable)
-{
- LLFastTimer ftm(FTM_UPDATE_CLOUDS);
- if (!(gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_CLOUDS)))
- {
- return TRUE;
- }
-
- if (drawable->isVisible())
- {
- dirtySpatialGroup(TRUE);
- }
-
- LLFace *facep;
-
- S32 num_faces = mCloudGroupp->getNumPuffs();
-
- if (num_faces > drawable->getNumFaces())
- {
- drawable->setNumFacesFast(num_faces, NULL, getTEImage(0));
- }
-
- mDepth = (getPositionAgent()-LLViewerCamera::getInstance()->getOrigin())*LLViewerCamera::getInstance()->getAtAxis();
-
- S32 face_indx = 0;
- for ( ; face_indx < num_faces; face_indx++)
- {
- facep = drawable->getFace(face_indx);
- if (!facep)
- {
- llwarns << "No facep for index " << face_indx << llendl;
- continue;
- }
-
- facep->setSize(4, 6);
-
- facep->setTEOffset(face_indx);
- facep->setTexture(getTEImage(0));
- const LLCloudPuff &puff = mCloudGroupp->getPuff(face_indx);
- const LLVector3 puff_pos_agent = gAgent.getPosAgentFromGlobal(puff.getPositionGlobal());
- facep->mCenterLocal = puff_pos_agent;
- /// Update cloud color based on sun color.
- LLColor4 float_color(LLColor3(gSky.getSunDiffuseColor() + gSky.getSunAmbientColor()),puff.getAlpha());
- facep->setFaceColor(float_color);
- }
- for ( ; face_indx < drawable->getNumFaces(); face_indx++)
- {
- facep = drawable->getFace(face_indx);
- if (!facep)
- {
- llwarns << "No facep for index " << face_indx << llendl;
- continue;
- }
-
- facep->setTEOffset(face_indx);
- facep->setSize(0,0);
- }
-
- drawable->movePartition();
-
- return TRUE;
-}
-
-F32 LLVOClouds::getPartSize(S32 idx)
-{
- return (CLOUD_PUFF_HEIGHT+CLOUD_PUFF_WIDTH)*0.5f;
-}
-
-void LLVOClouds::getGeometry(S32 te,
- LLStrider<LLVector3>& verticesp,
- LLStrider<LLVector3>& normalsp,
- LLStrider<LLVector2>& texcoordsp,
- LLStrider<LLColor4U>& colorsp,
- LLStrider<U16>& indicesp)
-{
-
- if (te >= mCloudGroupp->getNumPuffs())
- {
- return;
- }
-
- LLDrawable* drawable = mDrawable;
- LLFace *facep = drawable->getFace(te);
-
- if (!facep->hasGeometry())
- {
- return;
- }
-
- LLVector3 normal(0.f,0.f,-1.f);
-
- const LLCloudPuff &puff = mCloudGroupp->getPuff(te);
- S32 index_offset = facep->getGeomIndex();
- LLColor4 float_color(LLColor3(gSky.getSunDiffuseColor() + gSky.getSunAmbientColor()),puff.getAlpha());
- LLColor4U color;
- color.setVec(float_color);
- facep->setFaceColor(float_color);
-
-
- LLVector3 up;
- LLVector3 right;
- LLVector3 at;
-
- const LLVector3& puff_pos_agent = facep->mCenterLocal;
- LLVector2 uvs[4];
-
- uvs[0].setVec(0.f, 1.f);
- uvs[1].setVec(0.f, 0.f);
- uvs[2].setVec(1.f, 1.f);
- uvs[3].setVec(1.f, 0.f);
-
- LLVector3 vtx[4];
-
- at = LLViewerCamera::getInstance()->getAtAxis();
- right = at % LLVector3(0.f, 0.f, 1.f);
- right.normVec();
- up = right % at;
- up.normVec();
- right *= 0.5f*CLOUD_PUFF_WIDTH;
- up *= 0.5f*CLOUD_PUFF_HEIGHT;;
-
- *colorsp++ = color;
- *colorsp++ = color;
- *colorsp++ = color;
- *colorsp++ = color;
-
- vtx[0] = puff_pos_agent - right + up;
- vtx[1] = puff_pos_agent - right - up;
- vtx[2] = puff_pos_agent + right + up;
- vtx[3] = puff_pos_agent + right - up;
-
- *verticesp++ = vtx[0];
- *verticesp++ = vtx[1];
- *verticesp++ = vtx[2];
- *verticesp++ = vtx[3];
-
- *texcoordsp++ = uvs[0];
- *texcoordsp++ = uvs[1];
- *texcoordsp++ = uvs[2];
- *texcoordsp++ = uvs[3];
-
- *normalsp++ = normal;
- *normalsp++ = normal;
- *normalsp++ = normal;
- *normalsp++ = normal;
-
- *indicesp++ = index_offset + 0;
- *indicesp++ = index_offset + 1;
- *indicesp++ = index_offset + 2;
-
- *indicesp++ = index_offset + 1;
- *indicesp++ = index_offset + 3;
- *indicesp++ = index_offset + 2;
-}
-
-U32 LLVOClouds::getPartitionType() const
-{
- return LLViewerRegion::PARTITION_CLOUD;
-}
-
-// virtual
-void LLVOClouds::updateDrawable(BOOL force_damped)
-{
- // Force an immediate rebuild on any update
- if (mDrawable.notNull())
- {
- mDrawable->updateXform(TRUE);
- gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_ALL, TRUE);
- }
- clearChanged(SHIFTED);
-}
-
-LLCloudPartition::LLCloudPartition()
-{
- mDrawableType = LLPipeline::RENDER_TYPE_CLOUDS;
- mPartitionType = LLViewerRegion::PARTITION_CLOUD;
-}
-
diff --git a/indra/newview/llvoclouds.h b/indra/newview/llvoclouds.h
deleted file mode 100644
index 430923a108..0000000000
--- a/indra/newview/llvoclouds.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/**
- * @file llvoclouds.h
- * @brief Description of LLVOClouds class
- *
- * $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_LLVOCLOUDS_H
-#define LL_LLVOCLOUDS_H
-
-#include "llviewerobject.h"
-#include "lltable.h"
-#include "v4coloru.h"
-
-class LLViewerTexture;
-class LLViewerCloudGroup;
-
-class LLCloudGroup;
-
-
-class LLVOClouds : public LLAlphaObject
-{
-public:
- LLVOClouds(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp );
-
- // Initialize data that's only inited once per class.
- static void initClass();
-
- void updateDrawable(BOOL force_damped);
-
- /*virtual*/ LLDrawable* createDrawable(LLPipeline *pipeline);
- /*virtual*/ BOOL updateGeometry(LLDrawable *drawable);
- /*virtual*/ void getGeometry(S32 te,
- LLStrider<LLVector3>& verticesp,
- LLStrider<LLVector3>& normalsp,
- LLStrider<LLVector2>& texcoordsp,
- LLStrider<LLColor4U>& colorsp,
- LLStrider<U16>& indicesp);
-
- /*virtual*/ BOOL isActive() const; // Whether this object needs to do an idleUpdate.
- F32 getPartSize(S32 idx);
-
- /*virtual*/ void updateTextures();
- /*virtual*/ void setPixelAreaAndAngle(LLAgent &agent); // generate accurate apparent angle and area
-
- void updateFaceSize(S32 idx) { }
- BOOL idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time);
-
- virtual U32 getPartitionType() const;
-
- void setCloudGroup(LLCloudGroup *cgp) { mCloudGroupp = cgp; }
-protected:
- virtual ~LLVOClouds();
-
- LLCloudGroup *mCloudGroupp;
-};
-
-extern LLUUID gCloudTextureID;
-
-#endif // LL_VO_CLOUDS_H
diff --git a/indra/newview/llvoicevivox.cpp b/indra/newview/llvoicevivox.cpp
index 6ee6822e2f..cd2bbad620 100644
--- a/indra/newview/llvoicevivox.cpp
+++ b/indra/newview/llvoicevivox.cpp
@@ -195,12 +195,13 @@ static LLVivoxVoiceClientFriendsObserver *friendslist_listener = NULL;
class LLVivoxVoiceClientCapResponder : public LLHTTPClient::Responder
{
public:
- LLVivoxVoiceClientCapResponder(void){};
+ LLVivoxVoiceClientCapResponder(LLVivoxVoiceClient::state requesting_state) : mRequestingState(requesting_state) {};
virtual void error(U32 status, const std::string& reason); // called with bad status codes
virtual void result(const LLSD& content);
private:
+ LLVivoxVoiceClient::state mRequestingState; // state
};
void LLVivoxVoiceClientCapResponder::error(U32 status, const std::string& reason)
@@ -208,6 +209,7 @@ void LLVivoxVoiceClientCapResponder::error(U32 status, const std::string& reason
LL_WARNS("Voice") << "LLVivoxVoiceClientCapResponder::error("
<< status << ": " << reason << ")"
<< LL_ENDL;
+ LLVivoxVoiceClient::getInstance()->sessionTerminate();
}
void LLVivoxVoiceClientCapResponder::result(const LLSD& content)
@@ -216,12 +218,12 @@ void LLVivoxVoiceClientCapResponder::result(const LLSD& content)
LL_DEBUGS("Voice") << "ParcelVoiceInfoRequest response:" << ll_pretty_print_sd(content) << LL_ENDL;
+ std::string uri;
+ std::string credentials;
+
if ( content.has("voice_credentials") )
{
LLSD voice_credentials = content["voice_credentials"];
- std::string uri;
- std::string credentials;
-
if ( voice_credentials.has("channel_uri") )
{
uri = voice_credentials["channel_uri"].asString();
@@ -231,7 +233,12 @@ void LLVivoxVoiceClientCapResponder::result(const LLSD& content)
credentials =
voice_credentials["channel_credentials"].asString();
}
-
+ }
+
+ // set the spatial channel. If no voice credentials or uri are
+ // available, then we simply drop out of voice spatially.
+ if(LLVivoxVoiceClient::getInstance()->parcelVoiceInfoReceived(mRequestingState))
+ {
LLVivoxVoiceClient::getInstance()->setSpatialChannel(uri, credentials);
}
}
@@ -551,18 +558,27 @@ void LLVivoxVoiceClient::userAuthorized(const std::string& user_id, const LLUUID
void LLVivoxVoiceClient::requestVoiceAccountProvision(S32 retries)
{
- if ( gAgent.getRegion() && mVoiceEnabled )
+ LLViewerRegion *region = gAgent.getRegion();
+
+ if ( region && mVoiceEnabled )
{
std::string url =
- gAgent.getRegion()->getCapability(
- "ProvisionVoiceAccountRequest");
-
- if ( url == "" ) return;
-
+ region->getCapability("ProvisionVoiceAccountRequest");
+
+ if ( url.empty() )
+ {
+ // we've not received the capability yet, so return.
+ // the password will remain empty, so we'll remain in
+ // stateIdle
+ return;
+ }
+
LLHTTPClient::post(
- url,
- LLSD(),
- new LLVivoxVoiceAccountProvisionResponder(retries));
+ url,
+ LLSD(),
+ new LLVivoxVoiceAccountProvisionResponder(retries));
+
+ setState(stateConnectorStart);
}
}
@@ -673,7 +689,8 @@ std::string LLVivoxVoiceClient::state2string(LLVivoxVoiceClient::state inState)
CASE(stateVoiceFontsWait);
CASE(stateVoiceFontsReceived);
CASE(stateCreatingSessionGroup);
- CASE(stateNoChannel);
+ CASE(stateNoChannel);
+ CASE(stateRetrievingParcelVoiceInfo);
CASE(stateJoiningSession);
CASE(stateSessionJoined);
CASE(stateRunning);
@@ -741,42 +758,6 @@ void LLVivoxVoiceClient::stateMachine()
}
}
- // Check for parcel boundary crossing
- {
- LLViewerRegion *region = gAgent.getRegion();
- LLParcel *parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
-
- if(region && parcel)
- {
- S32 parcelLocalID = parcel->getLocalID();
- std::string regionName = region->getName();
- std::string capURI = region->getCapability("ParcelVoiceInfoRequest");
-
-// LL_DEBUGS("Voice") << "Region name = \"" << regionName << "\", parcel local ID = " << parcelLocalID << ", cap URI = \"" << capURI << "\"" << LL_ENDL;
-
- // The region name starts out empty and gets filled in later.
- // Also, the cap gets filled in a short time after the region cross, but a little too late for our purposes.
- // If either is empty, wait for the next time around.
- if(!regionName.empty())
- {
- if(!capURI.empty())
- {
- if((parcelLocalID != mCurrentParcelLocalID) || (regionName != mCurrentRegionName))
- {
- // We have changed parcels. Initiate a parcel channel lookup.
- mCurrentParcelLocalID = parcelLocalID;
- mCurrentRegionName = regionName;
-
- parcelChanged();
- }
- }
- else
- {
- LL_WARNS_ONCE("Voice") << "region doesn't have ParcelVoiceInfoRequest capability. This is normal for a short time after teleporting, but bad if it persists for very long." << LL_ENDL;
- }
- }
- }
- }
switch(getState())
{
@@ -1026,22 +1007,9 @@ void LLVivoxVoiceClient::stateMachine()
}
else if(!mAccountName.empty())
{
- LLViewerRegion *region = gAgent.getRegion();
-
- if(region)
+ if ( mAccountPassword.empty() )
{
- if ( region->getCapability("ProvisionVoiceAccountRequest") != "" )
- {
- if ( mAccountPassword.empty() )
- {
- requestVoiceAccountProvision();
- }
- setState(stateConnectorStart);
- }
- else
- {
- LL_WARNS_ONCE("Voice") << "region doesn't have ProvisionVoiceAccountRequest capability!" << LL_ENDL;
- }
+ requestVoiceAccountProvision();
}
}
break;
@@ -1382,11 +1350,7 @@ void LLVivoxVoiceClient::stateMachine()
setState(stateCreatingSessionGroup);
sessionGroupCreateSendMessage();
#else
- // Not using session groups -- skip the stateCreatingSessionGroup state.
- setState(stateNoChannel);
-
- // Initial kick-off of channel lookup logic
- parcelChanged();
+ setState(stateNoChannel);
#endif
break;
@@ -1399,19 +1363,29 @@ void LLVivoxVoiceClient::stateMachine()
}
else if(!mMainSessionGroupHandle.empty())
{
- setState(stateNoChannel);
-
// Start looped recording (needed for "panic button" anti-griefing tool)
recordingLoopStart();
-
- // Initial kick-off of channel lookup logic
- parcelChanged();
+ setState(stateNoChannel);
}
break;
+
+ //MARK: stateRetrievingParcelVoiceInfo
+ case stateRetrievingParcelVoiceInfo:
+ // wait until parcel voice info is received.
+ if(mSessionTerminateRequested || !mVoiceEnabled)
+ {
+ // if a terminate request has been received,
+ // bail and go to the stateSessionTerminated
+ // state. If the cap request is still pending,
+ // the responder will check to see if we've moved
+ // to a new session and won't change any state.
+ setState(stateSessionTerminated);
+ }
+ break;
+
//MARK: stateNoChannel
case stateNoChannel:
-
LL_DEBUGS("Voice") << "State No Channel" << LL_ENDL;
mSpatialJoiningNum = 0;
// Do this here as well as inside sendPositionalUpdate().
@@ -1432,6 +1406,16 @@ void LLVivoxVoiceClient::stateMachine()
{
setState(stateCaptureBufferPaused);
}
+ else if(checkParcelChanged() || (mNextAudioSession == NULL))
+ {
+ // the parcel is changed, or we have no pending audio sessions,
+ // so try to request the parcel voice info
+ // if we have the cap, we move to the appropriate state
+ if(requestParcelVoiceInfo())
+ {
+ setState(stateRetrievingParcelVoiceInfo);
+ }
+ }
else if(sessionNeedsRelog(mNextAudioSession))
{
requestRelog();
@@ -1466,32 +1450,28 @@ void LLVivoxVoiceClient::stateMachine()
notifyStatusObservers(LLVoiceClientStatusObserver::STATUS_JOINING);
setState(stateJoiningSession);
}
- else if(!mSpatialSessionURI.empty())
- {
- // If we're not headed elsewhere and have a spatial URI, return to spatial.
- switchChannel(mSpatialSessionURI, true, false, false, mSpatialSessionCredentials);
- }
break;
-
+
//MARK: stateJoiningSession
case stateJoiningSession: // waiting for session handle
-
- // If this is true we have problem with connection to voice server (EXT-4313).
- // See descriptions of mSpatialJoiningNum and MAX_NORMAL_JOINING_SPATIAL_NUM.
- if(mSpatialJoiningNum == MAX_NORMAL_JOINING_SPATIAL_NUM)
+
+ // If this is true we have problem with connection to voice server (EXT-4313).
+ // See descriptions of mSpatialJoiningNum and MAX_NORMAL_JOINING_SPATIAL_NUM.
+ if(mSpatialJoiningNum == MAX_NORMAL_JOINING_SPATIAL_NUM)
{
- // Notify observers to let them know there is problem with voice
- notifyStatusObservers(LLVoiceClientStatusObserver::STATUS_VOICE_DISABLED);
- llwarns << "There seems to be problem with connection to voice server. Disabling voice chat abilities." << llendl;
+ // Notify observers to let them know there is problem with voice
+ notifyStatusObservers(LLVoiceClientStatusObserver::STATUS_VOICE_DISABLED);
+ llwarns << "There seems to be problem with connection to voice server. Disabling voice chat abilities." << llendl;
}
-
- // Increase mSpatialJoiningNum only for spatial sessions- it's normal to reach this case for
- // example for p2p many times while waiting for response, so it can't be used to detect errors
- if(mAudioSession && mAudioSession->mIsSpatial)
+
+ // Increase mSpatialJoiningNum only for spatial sessions- it's normal to reach this case for
+ // example for p2p many times while waiting for response, so it can't be used to detect errors
+ if(mAudioSession && mAudioSession->mIsSpatial)
{
- mSpatialJoiningNum++;
+
+ mSpatialJoiningNum++;
}
-
+
// joinedAudioSession() will transition from here to stateSessionJoined.
if(!mVoiceEnabled)
{
@@ -1511,12 +1491,13 @@ void LLVivoxVoiceClient::stateMachine()
}
}
}
- break;
-
+ break;
+
//MARK: stateSessionJoined
case stateSessionJoined: // session handle received
- mSpatialJoiningNum = 0;
+
+ mSpatialJoiningNum = 0;
// It appears that I need to wait for BOTH the SessionGroup.AddSession response and the SessionStateChangeEvent with state 4
// before continuing from this state. They can happen in either order, and if I don't wait for both, things can get stuck.
// For now, the SessionGroup.AddSession response handler sets mSessionHandle and the SessionStateChangeEvent handler transitions to stateSessionJoined.
@@ -1553,7 +1534,7 @@ void LLVivoxVoiceClient::stateMachine()
sessionMediaDisconnectSendMessage(mAudioSession);
setState(stateSessionTerminated);
}
- }
+ }
break;
//MARK: stateRunning
@@ -1565,6 +1546,7 @@ void LLVivoxVoiceClient::stateMachine()
}
else
{
+
if(!inSpatialChannel())
{
// When in a non-spatial channel, never send positional updates.
@@ -1572,8 +1554,22 @@ void LLVivoxVoiceClient::stateMachine()
}
else
{
+ if(checkParcelChanged())
+ {
+ // if the parcel has changed, attempted to request the
+ // cap for the parcel voice info. If we can't request it
+ // then we don't have the cap URL so we do nothing and will
+ // recheck next time around
+ if(requestParcelVoiceInfo())
+ {
+ // we did get the cap, and we made the request,
+ // so go wait for the response.
+ setState(stateRetrievingParcelVoiceInfo);
+ }
+ }
// Do the calculation that enforces the listener<->speaker tether (and also updates the real camera position)
enforceTether();
+
}
// Do notifications for expiring Voice Fonts.
@@ -3840,7 +3836,7 @@ void LLVivoxVoiceClient::participantUpdatedEvent(
// also initialize voice moderate_mode depend on Agent's participant. See EXT-6937.
// *TODO: remove once a way to request the current voice channel moderation mode is implemented.
- if (gAgentID == participant->mAvatarID)
+ if (gAgent.getID() == participant->mAvatarID)
{
speaker_manager->initVoiceModerateMode();
}
@@ -4073,7 +4069,7 @@ void LLVivoxVoiceClient::messageEvent(
}
LL_DEBUGS("Voice") << "adding message, name " << session->mName << " session " << session->mIMSessionID << ", target " << session->mCallerID << LL_ENDL;
- gIMMgr->addMessage(session->mIMSessionID,
+ LLIMMgr::getInstance()->addMessage(session->mIMSessionID,
session->mCallerID,
session->mName.c_str(),
message.c_str(),
@@ -4447,24 +4443,91 @@ LLVivoxVoiceClient::participantState* LLVivoxVoiceClient::findParticipantByID(co
}
-void LLVivoxVoiceClient::parcelChanged()
+
+// Check for parcel boundary crossing
+bool LLVivoxVoiceClient::checkParcelChanged(bool update)
{
- if(getState() >= stateNoChannel)
+ LLViewerRegion *region = gAgent.getRegion();
+ LLParcel *parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
+
+ if(region && parcel)
{
- // If the user is logged in, start a channel lookup.
- LL_DEBUGS("Voice") << "sending ParcelVoiceInfoRequest (" << mCurrentRegionName << ", " << mCurrentParcelLocalID << ")" << LL_ENDL;
+ S32 parcelLocalID = parcel->getLocalID();
+ std::string regionName = region->getName();
+
+ // LL_DEBUGS("Voice") << "Region name = \"" << regionName << "\", parcel local ID = " << parcelLocalID << ", cap URI = \"" << capURI << "\"" << LL_ENDL;
+
+ // The region name starts out empty and gets filled in later.
+ // Also, the cap gets filled in a short time after the region cross, but a little too late for our purposes.
+ // If either is empty, wait for the next time around.
+ if(!regionName.empty())
+ {
+ if((parcelLocalID != mCurrentParcelLocalID) || (regionName != mCurrentRegionName))
+ {
+ // We have changed parcels. Initiate a parcel channel lookup.
+ if (update)
+ {
+ mCurrentParcelLocalID = parcelLocalID;
+ mCurrentRegionName = regionName;
+ }
+ return true;
+ }
+ }
+ }
+ return false;
+}
+
+bool LLVivoxVoiceClient::parcelVoiceInfoReceived(state requesting_state)
+{
+ // pop back to the state we were in when the parcel changed and we managed to
+ // do the request.
+ if(getState() == stateRetrievingParcelVoiceInfo)
+ {
+ setState(requesting_state);
+ return true;
+ }
+ else
+ {
+ // we've dropped out of stateRetrievingParcelVoiceInfo
+ // before we received the cap result, due to a terminate
+ // or transition to a non-voice channel. Don't switch channels.
+ return false;
+ }
+}
+
- std::string url = gAgent.getRegion()->getCapability("ParcelVoiceInfoRequest");
+bool LLVivoxVoiceClient::requestParcelVoiceInfo()
+{
+ LL_DEBUGS("Voice") << "sending ParcelVoiceInfoRequest (" << mCurrentRegionName << ", " << mCurrentParcelLocalID << ")" << LL_ENDL;
+
+ // grab the cap for parcel voice info from the region.
+ LLViewerRegion * region = gAgent.getRegion();
+ if (region == NULL)
+ {
+ return false;
+ }
+ // grab the cap.
+ std::string url = gAgent.getRegion()->getCapability("ParcelVoiceInfoRequest");
+ if (!url.empty())
+ {
+ // if we've already retrieved the cap from the region, go ahead and make the request,
+ // and return true so we can go into the state that waits for the response.
+ checkParcelChanged(true);
LLSD data;
+ LL_DEBUGS("Voice") << "sending ParcelVoiceInfoRequest (" << mCurrentRegionName << ", " << mCurrentParcelLocalID << ")" << LL_ENDL;
+
LLHTTPClient::post(
- url,
- data,
- new LLVivoxVoiceClientCapResponder);
+ url,
+ data,
+ new LLVivoxVoiceClientCapResponder(getState()));
+ return true;
}
- else
+ else
{
- // The transition to stateNoChannel needs to kick this off again.
- LL_INFOS("Voice") << "not logged in yet, deferring" << LL_ENDL;
+
+ // we don't have the cap yet, so return false so the caller can try again later.
+ LL_DEBUGS("Voice") << "ParcelVoiceInfoRequest cap not yet available, deferring" << LL_ENDL;
+ return false;
}
}
@@ -4488,6 +4551,7 @@ void LLVivoxVoiceClient::switchChannel(
case stateJoinSessionFailed:
case stateJoinSessionFailedWaiting:
case stateNoChannel:
+ case stateRetrievingParcelVoiceInfo:
// Always switch to the new URI from these states.
needsSwitch = true;
break;
@@ -4560,13 +4624,10 @@ void LLVivoxVoiceClient::switchChannel(
mNextAudioSession->mIsP2P = is_p2p;
}
- if(getState() <= stateNoChannel)
- {
- // We're already set up to join a channel, just needed to fill in the session URI
- }
- else
+ if(getState() >= stateRetrievingParcelVoiceInfo)
{
- // State machine will come around and rejoin if uri/handle is not empty.
+ // If we're already in a channel, or if we're joining one, terminate
+ // so we can rejoin with the new session data.
sessionTerminate();
}
}
@@ -6267,13 +6328,13 @@ void LLVivoxVoiceClient::avatarNameResolved(const LLUUID &id, const std::string
{
session->mTextInvitePending = false;
- // We don't need to call gIMMgr->addP2PSession() here. The first incoming message will create the panel.
+ // We don't need to call LLIMMgr::getInstance()->addP2PSession() here. The first incoming message will create the panel.
}
if(session->mVoiceInvitePending)
{
session->mVoiceInvitePending = false;
- gIMMgr->inviteToSession(
+ LLIMMgr::getInstance()->inviteToSession(
session->mIMSessionID,
session->mName,
session->mCallerID,
diff --git a/indra/newview/llvoicevivox.h b/indra/newview/llvoicevivox.h
index 471545de56..1142a1a49c 100644
--- a/indra/newview/llvoicevivox.h
+++ b/indra/newview/llvoicevivox.h
@@ -380,7 +380,8 @@ protected:
stateVoiceFontsWait, // Awaiting the list of voice fonts
stateVoiceFontsReceived, // List of voice fonts received
stateCreatingSessionGroup, // Creating the main session group
- stateNoChannel, //
+ stateNoChannel, // Need to join a channel
+ stateRetrievingParcelVoiceInfo, // waiting for parcel voice info request to return with spatial credentials
stateJoiningSession, // waiting for session handle
stateSessionJoined, // session handle received
stateRunning, // in session, steady state
@@ -620,6 +621,8 @@ protected:
void sessionMediaDisconnectSendMessage(sessionState *session);
void sessionTextDisconnectSendMessage(sessionState *session);
+
+
// Pokes the state machine to leave the audio session next time around.
void sessionTerminate();
@@ -629,6 +632,12 @@ protected:
// Does the actual work to get out of the audio session
void leaveAudioSession();
+ // notifies the voice client that we've received parcel voice info
+ bool parcelVoiceInfoReceived(state requesting_state);
+
+ friend class LLVivoxVoiceClientCapResponder;
+
+
void lookupName(const LLUUID &id);
void onAvatarNameCache(const LLUUID& id, const LLAvatarName& av_name);
void avatarNameResolved(const LLUUID &id, const std::string &name);
@@ -733,9 +742,11 @@ private:
bool mCaptureDeviceDirty;
bool mRenderDeviceDirty;
+
+ bool checkParcelChanged(bool update = false);
// This should be called when the code detects we have changed parcels.
// It initiates the call to the server that gets the parcel channel.
- void parcelChanged();
+ bool requestParcelVoiceInfo();
void switchChannel(std::string uri = std::string(), bool spatial = true, bool no_reconnect = false, bool is_p2p = false, std::string hash = "");
void joinSession(sessionState *session);
diff --git a/indra/newview/llvopartgroup.cpp b/indra/newview/llvopartgroup.cpp
index 6f354b78b1..a4b0910c92 100644
--- a/indra/newview/llvopartgroup.cpp
+++ b/indra/newview/llvopartgroup.cpp
@@ -324,10 +324,18 @@ void LLVOPartGroup::getGeometry(S32 idx,
LLVector3 normal = -LLViewerCamera::getInstance()->getXAxis();
-
+
+ //HACK -- the verticesp->mV[3] = 0.f here are to set the texture index to 0 (particles don't use texture batching, maybe they should)
+ // 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;
*colorsp++ = part.mColor;
@@ -360,7 +368,7 @@ U32 LLVOPartGroup::getPartitionType() const
}
LLParticlePartition::LLParticlePartition()
-: LLSpatialPartition(LLDrawPoolAlpha::VERTEX_DATA_MASK, TRUE, GL_STREAM_DRAW_ARB)
+: LLSpatialPartition(LLDrawPoolAlpha::VERTEX_DATA_MASK | LLVertexBuffer::MAP_TEXTURE_INDEX, TRUE, GL_STREAM_DRAW_ARB)
{
mRenderPass = LLRenderPass::PASS_ALPHA;
mDrawableType = LLPipeline::RENDER_TYPE_PARTICLES;
@@ -418,6 +426,7 @@ void LLParticlePartition::addGeometryCount(LLSpatialGroup* group, U32& vertex_co
mFaceList.push_back(facep);
vertex_count += facep->getGeomCount();
index_count += facep->getIndicesCount();
+ llassert(facep->getIndicesCount() < 65536);
}
obj->mDepth /= count;
diff --git a/indra/newview/llvosky.cpp b/indra/newview/llvosky.cpp
index 6396bc042d..66ba6249d3 100644
--- a/indra/newview/llvosky.cpp
+++ b/indra/newview/llvosky.cpp
@@ -370,7 +370,7 @@ LLVOSky::LLVOSky(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp)
mAtmHeight = ATM_HEIGHT;
mEarthCenter = LLVector3(mCameraPosAgent.mV[0], mCameraPosAgent.mV[1], -EARTH_RADIUS);
- mSunDefaultPosition = LLVector3(LLWLParamManager::instance()->mCurParams.getVector("lightnorm", error));
+ mSunDefaultPosition = LLVector3(LLWLParamManager::getInstance()->mCurParams.getVector("lightnorm", error));
if (gSavedSettings.getBOOL("SkyOverrideSimSunPosition"))
{
initSunDirection(mSunDefaultPosition, LLVector3(0, 0, 0));
@@ -646,24 +646,24 @@ void LLVOSky::initAtmospherics(void)
bool error;
// uniform parameters for convenience
- dome_radius = LLWLParamManager::instance()->getDomeRadius();
- dome_offset_ratio = LLWLParamManager::instance()->getDomeOffset();
- sunlight_color = LLColor3(LLWLParamManager::instance()->mCurParams.getVector("sunlight_color", error));
- ambient = LLColor3(LLWLParamManager::instance()->mCurParams.getVector("ambient", error));
- //lightnorm = LLWLParamManager::instance()->mCurParams.getVector("lightnorm", error);
- gamma = LLWLParamManager::instance()->mCurParams.getVector("gamma", error)[0];
- blue_density = LLColor3(LLWLParamManager::instance()->mCurParams.getVector("blue_density", error));
- blue_horizon = LLColor3(LLWLParamManager::instance()->mCurParams.getVector("blue_horizon", error));
- haze_density = LLWLParamManager::instance()->mCurParams.getVector("haze_density", error)[0];
- haze_horizon = LLColor3(LLWLParamManager::instance()->mCurParams.getVector("haze_horizon", error));
- density_multiplier = LLWLParamManager::instance()->mCurParams.getVector("density_multiplier", error)[0];
- max_y = LLWLParamManager::instance()->mCurParams.getVector("max_y", error)[0];
- glow = LLColor3(LLWLParamManager::instance()->mCurParams.getVector("glow", error));
- cloud_shadow = LLWLParamManager::instance()->mCurParams.getVector("cloud_shadow", error)[0];
- cloud_color = LLColor3(LLWLParamManager::instance()->mCurParams.getVector("cloud_color", error));
- cloud_scale = LLWLParamManager::instance()->mCurParams.getVector("cloud_scale", error)[0];
- cloud_pos_density1 = LLColor3(LLWLParamManager::instance()->mCurParams.getVector("cloud_pos_density1", error));
- cloud_pos_density2 = LLColor3(LLWLParamManager::instance()->mCurParams.getVector("cloud_pos_density2", error));
+ dome_radius = LLWLParamManager::getInstance()->getDomeRadius();
+ dome_offset_ratio = LLWLParamManager::getInstance()->getDomeOffset();
+ sunlight_color = LLColor3(LLWLParamManager::getInstance()->mCurParams.getVector("sunlight_color", error));
+ ambient = LLColor3(LLWLParamManager::getInstance()->mCurParams.getVector("ambient", error));
+ //lightnorm = LLWLParamManager::getInstance()->mCurParams.getVector("lightnorm", error);
+ gamma = LLWLParamManager::getInstance()->mCurParams.getVector("gamma", error)[0];
+ blue_density = LLColor3(LLWLParamManager::getInstance()->mCurParams.getVector("blue_density", error));
+ blue_horizon = LLColor3(LLWLParamManager::getInstance()->mCurParams.getVector("blue_horizon", error));
+ haze_density = LLWLParamManager::getInstance()->mCurParams.getVector("haze_density", error)[0];
+ haze_horizon = LLColor3(LLWLParamManager::getInstance()->mCurParams.getVector("haze_horizon", error));
+ density_multiplier = LLWLParamManager::getInstance()->mCurParams.getVector("density_multiplier", error)[0];
+ max_y = LLWLParamManager::getInstance()->mCurParams.getVector("max_y", error)[0];
+ glow = LLColor3(LLWLParamManager::getInstance()->mCurParams.getVector("glow", error));
+ cloud_shadow = LLWLParamManager::getInstance()->mCurParams.getVector("cloud_shadow", error)[0];
+ cloud_color = LLColor3(LLWLParamManager::getInstance()->mCurParams.getVector("cloud_color", error));
+ cloud_scale = LLWLParamManager::getInstance()->mCurParams.getVector("cloud_scale", error)[0];
+ cloud_pos_density1 = LLColor3(LLWLParamManager::getInstance()->mCurParams.getVector("cloud_pos_density1", error));
+ cloud_pos_density2 = LLColor3(LLWLParamManager::getInstance()->mCurParams.getVector("cloud_pos_density2", error));
// light norm is different. We need the sun's direction, not the light direction
// which could be from the moon. And we need to clamp it
@@ -1033,7 +1033,7 @@ void LLVOSky::calcAtmospherics(void)
// Since WL scales everything by 2, there should always be at least a 2:1 brightness ratio
// between sunlight and point lights in windlight to normalize point lights.
F32 sun_dynamic_range = llmax(gSavedSettings.getF32("RenderSunDynamicRange"), 0.0001f);
- LLWLParamManager::instance()->mSceneLightStrength = 2.0f * (1.0f + sun_dynamic_range * dp);
+ LLWLParamManager::getInstance()->mSceneLightStrength = 2.0f * (1.0f + sun_dynamic_range * dp);
mSunDiffuse = vary_SunlightColor;
mSunAmbient = vary_AmbientColor;
@@ -1483,6 +1483,8 @@ BOOL LLVOSky::updateHeavenlyBodyGeometry(LLDrawable *drawable, const S32 f, cons
facep->setVertexBuffer(buff);
}
+ llassert(facep->getVertexBuffer()->getNumIndices() == 6);
+
index_offset = facep->getGeometry(verticesp,normalsp,texCoordsp, indicesp);
if (-1 == index_offset)
@@ -2127,7 +2129,7 @@ void LLVOSky::updateFog(const F32 distance)
F32 depth = water_height - camera_height;
// get the water param manager variables
- float water_fog_density = LLWaterParamManager::instance()->getFogDensity();
+ float water_fog_density = LLWaterParamManager::getInstance()->getFogDensity();
LLColor4 water_fog_color = LLDrawPoolWater::sWaterFogColor.mV;
// adjust the color based on depth. We're doing linear approximations
diff --git a/indra/newview/llvosurfacepatch.cpp b/indra/newview/llvosurfacepatch.cpp
index dbcd4f50ca..510525259f 100644
--- a/indra/newview/llvosurfacepatch.cpp
+++ b/indra/newview/llvosurfacepatch.cpp
@@ -375,6 +375,8 @@ void LLVOSurfacePatch::updateMainGeometry(LLFace *facep,
S32 num_vertices, num_indices;
U32 index;
+ llassert(mLastStride > 0);
+
render_stride = mLastStride;
patch_size = mPatchp->getSurface()->getGridsPerPatchEdge();
S32 vert_size = patch_size / render_stride;
diff --git a/indra/newview/llvotree.cpp b/indra/newview/llvotree.cpp
index 8946d4e0b6..3c7fe708e6 100644
--- a/indra/newview/llvotree.cpp
+++ b/indra/newview/llvotree.cpp
@@ -980,11 +980,6 @@ void LLVOTree::appendMesh(LLStrider<LLVector3>& vertices,
for (S32 i = 0; i < index_count; i++)
{
U16 index = index_offset + i;
- if (idx[index] >= vert_start + vert_count ||
- idx[index] < vert_start)
- {
- llerrs << "WTF?" << llendl;
- }
*indices++ = idx[index]-vert_start+cur_idx;
}
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index 4c8bfaee27..bc94748002 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -73,6 +73,7 @@
#include "llagent.h"
#include "llviewermediafocus.h"
#include "lldatapacker.h"
+#include "llviewershadermgr.h"
#include "llvoavatar.h"
#include "llvocache.h"
@@ -967,7 +968,7 @@ BOOL LLVOVolume::setVolume(const LLVolumeParams &params_in, const S32 detail, bo
S32 lod = mLOD;
BOOL is404 = FALSE;
-
+
if (isSculpted())
{
// if it's a mesh
@@ -1018,6 +1019,8 @@ BOOL LLVOVolume::setVolume(const LLVolumeParams &params_in, const S32 detail, bo
if (is404)
{
setIcon(LLViewerTextureManager::getFetchedTextureFromFile("icons/Inv_Mesh.png", TRUE, LLViewerTexture::BOOST_UI));
+ //render prim proxy when mesh loading attempts give up
+ volume_params.setSculptID(LLUUID::null, LL_SCULPT_TYPE_NONE);
}
if ((LLPrimitive::setVolume(volume_params, lod, (mVolumeImpl && mVolumeImpl->isVolumeUnique()))) || mSculptChanged)
@@ -1097,8 +1100,6 @@ void LLVOVolume::updateSculptTexture()
}
-
-
void LLVOVolume::notifyMeshLoaded()
{
mSculptChanged = TRUE;
@@ -1224,7 +1225,7 @@ BOOL LLVOVolume::calcLOD()
}
//hold onto unmodified distance for debugging
- F32 debug_distance = distance;
+ //F32 debug_distance = distance;
distance *= sDistanceFactor;
@@ -1247,7 +1248,9 @@ BOOL LLVOVolume::calcLOD()
if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_LOD_INFO))
{
- setDebugText(llformat("%.2f:%.2f, %d", debug_distance, radius, cur_detail));
+ //setDebugText(llformat("%.2f:%.2f, %d", debug_distance, radius, cur_detail));
+
+ setDebugText(llformat("%d", mDrawable->getFace(0)->getTextureIndex()));
}
if (cur_detail != mLOD)
@@ -1276,6 +1279,15 @@ BOOL LLVOVolume::updateLOD()
gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_VOLUME, FALSE);
mLODChanged = TRUE;
}
+ else
+ {
+ F32 new_radius = getBinRadius();
+ F32 old_radius = mDrawable->getBinRadius();
+ if (new_radius < old_radius * 0.9f || new_radius > old_radius*1.1f)
+ {
+ gPipeline.markPartitionMove(mDrawable);
+ }
+ }
lod_changed = lod_changed || LLViewerObject::updateLOD();
@@ -3220,16 +3232,28 @@ U32 LLVOVolume::getRenderCost(texture_cost_t &textures) const
F32 LLVOVolume::getStreamingCost(S32* bytes, S32* visible_bytes)
{
+ F32 radius = getScale().length()*0.5f;
+
if (isMesh())
{
LLSD& header = gMeshRepo.getMeshHeader(getVolume()->getParams().getSculptID());
- F32 radius = getScale().length();
-
return LLMeshRepository::getStreamingCost(header, radius, bytes, visible_bytes, mLOD);
}
-
- return 0.f;
+ else
+ {
+ LLVolume* volume = getVolume();
+ S32 counts[4];
+ LLVolume::getLoDTriangleCounts(volume->getParams(), counts);
+
+ LLSD header;
+ header["lowest_lod"]["size"] = counts[0] * 10;
+ header["low_lod"]["size"] = counts[1] * 10;
+ header["medium_lod"]["size"] = counts[2] * 10;
+ header["high_lod"]["size"] = counts[3] * 10;
+
+ return LLMeshRepository::getStreamingCost(header, radius);
+ }
}
//static
@@ -3328,6 +3352,10 @@ F32 LLVOVolume::getBinRadius()
F32 scale = 1.f;
+ S32 size_factor = llmax(gSavedSettings.getS32("OctreeStaticObjectSizeFactor"), 1);
+ S32 attachment_size_factor = llmax(gSavedSettings.getS32("OctreeAttachmentSizeFactor"), 1);
+ LLVector3 distance_factor = gSavedSettings.getVector3("OctreeDistanceFactor");
+ LLVector3 alpha_distance_factor = gSavedSettings.getVector3("OctreeAlphaDistanceFactor");
const LLVector4a* ext = mDrawable->getSpatialExtents();
BOOL shrink_wrap = mDrawable->isAnimating();
@@ -3357,6 +3385,8 @@ F32 LLVOVolume::getBinRadius()
radius = llmin(bounds.mV[1], bounds.mV[2]);
radius = llmin(radius, bounds.mV[0]);
radius *= 0.5f;
+ radius *= 1.f+mDrawable->mDistanceWRTCamera*alpha_distance_factor[1];
+ radius += mDrawable->mDistanceWRTCamera*alpha_distance_factor[0];
}
else if (shrink_wrap)
{
@@ -3367,24 +3397,19 @@ F32 LLVOVolume::getBinRadius()
}
else if (mDrawable->isStatic())
{
- /*if (mDrawable->getRadius() < 2.0f)
- {
- radius = 16.f;
- }
- else
- {
- radius = llmax(mDrawable->getRadius(), 32.f);
- }*/
-
- radius = (((S32) mDrawable->getRadius())/2+1)*8;
+ radius = llmax((S32) mDrawable->getRadius(), 1)*size_factor;
+ radius *= 1.f + mDrawable->mDistanceWRTCamera * distance_factor[1];
+ radius += mDrawable->mDistanceWRTCamera * distance_factor[0];
}
else if (mDrawable->getVObj()->isAttachment())
{
- radius = (((S32) (mDrawable->getRadius()*4)+1))*2;
+ radius = llmax((S32) mDrawable->getRadius(),1)*attachment_size_factor;
}
else
{
- radius = 8.f;
+ radius = mDrawable->getRadius();
+ radius *= 1.f + mDrawable->mDistanceWRTCamera * distance_factor[1];
+ radius += mDrawable->mDistanceWRTCamera * distance_factor[0];
}
return llclamp(radius*scale, 0.5f, 256.f);
@@ -3483,7 +3508,8 @@ BOOL LLVOVolume::lineSegmentIntersect(const LLVector3& start, const LLVector3& e
{
if (LLFloater::isVisible(gFloaterTools) && getAvatar()->isSelf())
{
- gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_RIGGED, TRUE);
+ updateRiggedVolume();
+ genBBoxes(FALSE);
volume = mRiggedVolume;
transform = false;
}
@@ -3662,7 +3688,7 @@ void LLVOVolume::updateRiggedVolume()
LLVolume* volume = getVolume();
- const LLMeshSkinInfo* skin = gMeshRepo.getSkinInfo(volume->getParams().getSculptID());
+ const LLMeshSkinInfo* skin = gMeshRepo.getSkinInfo(volume->getParams().getSculptID(), this);
if (!skin)
{
@@ -3853,6 +3879,21 @@ LLVolumeBridge::LLVolumeBridge(LLDrawable* drawablep)
mSlopRatio = 0.25f;
}
+bool can_batch_texture(LLFace* facep)
+{
+ if (facep->getTextureEntry()->getBumpmap())
+ { //bump maps aren't worked into texture batching yet
+ return false;
+ }
+
+ if (facep->isState(LLFace::TEXTURE_ANIM) && facep->getVirtualSize() > MIN_TEX_ANIM_SIZE)
+ { //texture animation breaks batches
+ return false;
+ }
+
+ return true;
+}
+
void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep, U32 type)
{
LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
@@ -3903,12 +3944,36 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep,
LLViewerTexture* tex = facep->getTexture();
+ U8 index = facep->getTextureIndex();
+
+ bool batchable = false;
+
+ if (index < 255 && idx >= 0)
+ {
+ if (index < draw_vec[idx]->mTextureList.size())
+ {
+ if (draw_vec[idx]->mTextureList[index].isNull())
+ {
+ batchable = true;
+ draw_vec[idx]->mTextureList[index] = tex;
+ }
+ else if (draw_vec[idx]->mTextureList[index] == tex)
+ { //this face's texture index can be used with this batch
+ batchable = true;
+ }
+ }
+ else
+ { //texture list can be expanded to fit this texture index
+ batchable = true;
+ }
+ }
+
U8 glow = (U8) (facep->getTextureEntry()->getGlow() * 255);
if (idx >= 0 &&
draw_vec[idx]->mVertexBuffer == facep->getVertexBuffer() &&
draw_vec[idx]->mEnd == facep->getGeomIndex()-1 &&
- (LLPipeline::sTextureBindTest || draw_vec[idx]->mTexture == tex) &&
+ (LLPipeline::sTextureBindTest || draw_vec[idx]->mTexture == tex || batchable) &&
#if LL_DARWIN
draw_vec[idx]->mEnd - draw_vec[idx]->mStart + facep->getGeomCount() <= (U32) gGLManager.mGLMaxVertexRange &&
draw_vec[idx]->mCount + facep->getIndicesCount() <= (U32) gGLManager.mGLMaxIndexRange &&
@@ -3922,6 +3987,12 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep,
draw_vec[idx]->mCount += facep->getIndicesCount();
draw_vec[idx]->mEnd += facep->getGeomCount();
draw_vec[idx]->mVSize = llmax(draw_vec[idx]->mVSize, facep->getVirtualSize());
+
+ if (index >= draw_vec[idx]->mTextureList.size())
+ {
+ draw_vec[idx]->mTextureList.resize(index+1);
+ draw_vec[idx]->mTextureList[index] = tex;
+ }
draw_vec[idx]->validate();
update_min_max(draw_vec[idx]->mExtents[0], draw_vec[idx]->mExtents[1], facep->mExtents[0]);
update_min_max(draw_vec[idx]->mExtents[0], draw_vec[idx]->mExtents[1], facep->mExtents[1]);
@@ -3952,6 +4023,11 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep,
draw_info->mDrawMode = LLRender::TRIANGLE_STRIP;
}
+ if (index < 255)
+ { //initialize texture list for texture batching
+ draw_info->mTextureList.resize(index+1);
+ draw_info->mTextureList[index] = tex;
+ }
draw_info->validate();
}
}
@@ -4051,7 +4127,7 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
LLVOVolume* vobj = drawablep->getVOVolume();
- if (vobj->getVolume() && vobj->getVolume()->isTetrahedron())
+ if (vobj->getVolume() && vobj->getVolume()->isTetrahedron() || (vobj->isMesh() && !gMeshRepo.meshRezEnabled()))
{
continue;
}
@@ -4064,7 +4140,7 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
bool rigged = vobj->isAttachment() &&
vobj->isMesh() &&
- gMeshRepo.getSkinInfo(vobj->getVolume()->getParams().getSculptID());
+ gMeshRepo.getSkinInfo(vobj->getVolume()->getParams().getSculptID(), vobj);
bool bake_sunlight = LLPipeline::sBakeSunlight && drawablep->isStatic();
@@ -4106,7 +4182,7 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
if ( pAvatarVO )
{
LLUUID currentId = vobj->getVolume()->getParams().getSculptID();
- const LLMeshSkinInfo* pSkinData = gMeshRepo.getSkinInfo( currentId );
+ const LLMeshSkinInfo* pSkinData = gMeshRepo.getSkinInfo( currentId, vobj );
if ( pSkinData )
{
@@ -4374,15 +4450,24 @@ 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 (LLPipeline::sRenderDeferred)
+ bool batch_textures = LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_OBJECT) > 1;
+
+ if (batch_textures)
{
bump_mask |= LLVertexBuffer::MAP_BINORMAL;
+ genDrawInfo(group, simple_mask | LLVertexBuffer::MAP_TEXTURE_INDEX, simple_faces, FALSE, TRUE);
+ genDrawInfo(group, fullbright_mask | LLVertexBuffer::MAP_TEXTURE_INDEX, fullbright_faces, FALSE, TRUE);
+ genDrawInfo(group, bump_mask | LLVertexBuffer::MAP_TEXTURE_INDEX, bump_faces, FALSE, TRUE);
+ genDrawInfo(group, alpha_mask | LLVertexBuffer::MAP_TEXTURE_INDEX, alpha_faces, TRUE, TRUE);
+ }
+ else
+ {
+ genDrawInfo(group, simple_mask, simple_faces);
+ genDrawInfo(group, fullbright_mask, fullbright_faces);
+ genDrawInfo(group, bump_mask, bump_faces, FALSE, TRUE);
+ genDrawInfo(group, alpha_mask, alpha_faces, TRUE);
}
- genDrawInfo(group, simple_mask, simple_faces);
- genDrawInfo(group, bump_mask, bump_faces);
- genDrawInfo(group, fullbright_mask, fullbright_faces);
- genDrawInfo(group, alpha_mask, alpha_faces, TRUE);
if (!LLPipeline::sDelayVBUpdate)
{
@@ -4438,11 +4523,6 @@ void LLVolumeGeometryManager::rebuildMesh(LLSpatialGroup* group)
face->getGeometryVolume(*volume, face->getTEOffset(),
vobj->getRelativeXform(), vobj->getRelativeXformInvTrans(), face->getGeomIndex());
}
-
- if (!face)
- {
- llerrs << "WTF?" << llendl;
- }
}
drawablep->clearState(LLDrawable::REBUILD_ALL);
@@ -4497,13 +4577,37 @@ void LLVolumeGeometryManager::rebuildMesh(LLSpatialGroup* group)
group->clearState(LLSpatialGroup::MESH_DIRTY | LLSpatialGroup::NEW_DRAWINFO);
}
- if (group && group->isState(LLSpatialGroup::NEW_DRAWINFO))
+ llassert(!group || !group->isState(LLSpatialGroup::NEW_DRAWINFO));
+}
+
+struct CompareBatchBreakerModified
+{
+ bool operator()(const LLFace* const& lhs, const LLFace* const& rhs)
{
- llerrs << "WTF?" << llendl;
+ const LLTextureEntry* lte = lhs->getTextureEntry();
+ const LLTextureEntry* rte = rhs->getTextureEntry();
+
+ if (lte->getBumpmap() != rte->getBumpmap())
+ {
+ return lte->getBumpmap() < rte->getBumpmap();
+ }
+ else if (lte->getFullbright() != rte->getFullbright())
+ {
+ return lte->getFullbright() < rte->getFullbright();
+ }
+ else if (lte->getGlow() != rte->getGlow())
+ {
+ return lte->getGlow() < rte->getGlow();
+ }
+ else
+ {
+ return lhs->getTexture() < rhs->getTexture();
+ }
+
}
-}
+};
-void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::vector<LLFace*>& faces, BOOL distance_sort)
+void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::vector<LLFace*>& faces, BOOL distance_sort, BOOL batch_textures)
{
//calculate maximum number of vertices to store in a single buffer
U32 max_vertices = (gSavedSettings.getS32("RenderMaxVBOSize")*1024)/LLVertexBuffer::calcVertexSize(group->mSpatialPartition->mVertexDataMask);
@@ -4512,7 +4616,7 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::
if (!distance_sort)
{
//sort faces by things that break batches
- std::sort(faces.begin(), faces.end(), LLFace::CompareBatchBreaker());
+ std::sort(faces.begin(), faces.end(), CompareBatchBreakerModified());
}
else
{
@@ -4532,6 +4636,21 @@ 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
+
+ if (gGLManager.mGLVersion < 3.1f)
+ {
+ texture_index_channels = 1;
+ }
+
+ if (LLPipeline::sRenderDeferred && distance_sort)
+ {
+ texture_index_channels = gDeferredAlphaProgram.mFeatures.mIndexedTextureChannels;
+ }
+
+ texture_index_channels = llmin(texture_index_channels, (S32) gSavedSettings.getU32("RenderMaxTextureIndex"));
+
+
while (face_iter != faces.end())
{
//pull off next face
@@ -4562,24 +4681,101 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::
std::vector<LLFace*>::iterator i = face_iter;
++i;
- while (i != faces.end() &&
- (LLPipeline::sTextureBindTest || (distance_sort || (*i)->getTexture() == tex)))
+ std::vector<LLViewerTexture*> texture_list;
+
+ if (batch_textures)
{
- facep = *i;
-
- if (geom_count + facep->getGeomCount() > max_vertices)
- { //cut batches on geom count too big
- break;
+ U8 cur_tex = 0;
+ facep->setTextureIndex(cur_tex);
+ texture_list.push_back(tex);
+
+ //if (can_batch_texture(facep))
+ {
+ while (i != faces.end())
+ {
+ facep = *i;
+ if (facep->getTexture() != tex)
+ {
+ if (distance_sort)
+ { //textures might be out of order, see if texture exists in current batch
+ bool found = false;
+ for (U32 tex_idx = 0; tex_idx < texture_list.size(); ++tex_idx)
+ {
+ if (facep->getTexture() == texture_list[tex_idx])
+ {
+ cur_tex = tex_idx;
+ found = true;
+ break;
+ }
+ }
+
+ if (!found)
+ {
+ cur_tex = texture_list.size();
+ }
+ }
+ else
+ {
+ cur_tex++;
+ }
+
+ if (!can_batch_texture(facep))
+ { //face is bump mapped or has an animated texture matrix -- can't
+ //batch more than 1 texture at a time
+ break;
+ }
+
+ if (cur_tex >= texture_index_channels)
+ { //cut batches when index channels are depleted
+ break;
+ }
+
+ tex = facep->getTexture();
+
+ texture_list.push_back(tex);
+ }
+
+ if (geom_count + facep->getGeomCount() > max_vertices)
+ { //cut batches on geom count too big
+ break;
+ }
+
+ ++i;
+ index_count += facep->getIndicesCount();
+ geom_count += facep->getGeomCount();
+
+ facep->setTextureIndex(cur_tex);
+ }
}
- ++i;
- index_count += facep->getIndicesCount();
- geom_count += facep->getGeomCount();
+ tex = texture_list[0];
+ }
+ else
+ {
+ while (i != faces.end() &&
+ (LLPipeline::sTextureBindTest || (distance_sort || (*i)->getTexture() == tex)))
+ {
+ facep = *i;
+
+
+ //face has no texture index
+ facep->mDrawInfo = NULL;
+ facep->setTextureIndex(255);
+
+ if (geom_count + facep->getGeomCount() > max_vertices)
+ { //cut batches on geom count too big
+ break;
+ }
+
+ ++i;
+ index_count += facep->getIndicesCount();
+ geom_count += facep->getGeomCount();
+ }
}
//create/delete/resize vertex buffer if needed
LLVertexBuffer* buffer = NULL;
- LLSpatialGroup::buffer_texture_map_t::iterator found_iter = group->mBufferMap[mask].find(tex);
+ LLSpatialGroup::buffer_texture_map_t::iterator found_iter = group->mBufferMap[mask].find(*face_iter);
if (found_iter != group->mBufferMap[mask].end())
{
@@ -4610,7 +4806,7 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::
}
}
- buffer_map[mask][tex].push_back(buffer);
+ buffer_map[mask][*face_iter].push_back(buffer);
//add face geometry
@@ -4624,6 +4820,11 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::
facep->setGeomIndex(index_offset);
facep->setVertexBuffer(buffer);
+ if (batch_textures && facep->getTextureIndex() == 255)
+ {
+ llerrs << "Invalid texture index." << llendl;
+ }
+
{
//for debugging, set last time face was updated vs moved
facep->updateRebuildFlags();
@@ -4636,12 +4837,8 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::
U32 te_idx = facep->getTEOffset();
- if (facep->getGeometryVolume(*volume, te_idx,
- vobj->getRelativeXform(), vobj->getRelativeXformInvTrans(), index_offset))
- {
- buffer->markDirty(facep->getGeomIndex(), facep->getGeomCount(),
- facep->getIndicesStart(), facep->getIndicesCount());
- }
+ facep->getGeometryVolume(*volume, te_idx,
+ vobj->getRelativeXform(), vobj->getRelativeXformInvTrans(), index_offset);
}
}
@@ -4822,7 +5019,7 @@ void LLGeometryManager::addGeometryCount(LLSpatialGroup* group, U32 &vertex_coun
{
vertex_count += facep->getGeomCount();
index_count += facep->getIndicesCount();
-
+ llassert(facep->getIndicesCount() < 65536);
//remember face (for sorting)
mFaceList.push_back(facep);
}
diff --git a/indra/newview/llvowlsky.cpp b/indra/newview/llvowlsky.cpp
index 51664cb31d..7b1c725483 100644
--- a/indra/newview/llvowlsky.cpp
+++ b/indra/newview/llvowlsky.cpp
@@ -568,7 +568,7 @@ void LLVOWLSky::buildFanBuffer(LLStrider<LLVector3> & vertices,
LLStrider<LLVector2> & texCoords,
LLStrider<U16> & indices)
{
- const F32 RADIUS = LLWLParamManager::instance()->getDomeRadius();
+ const F32 RADIUS = LLWLParamManager::getInstance()->getDomeRadius();
U32 i, num_slices;
F32 phi0, theta, x0, y0, z0;
@@ -629,7 +629,7 @@ void LLVOWLSky::buildStripsBuffer(U32 begin_stack, U32 end_stack,
LLStrider<LLVector2> & texCoords,
LLStrider<U16> & indices)
{
- const F32 RADIUS = LLWLParamManager::instance()->getDomeRadius();
+ const F32 RADIUS = LLWLParamManager::getInstance()->getDomeRadius();
U32 i, j, num_slices, num_stacks;
F32 phi0, theta, x0, y0, z0;
diff --git a/indra/newview/llwaterparammanager.cpp b/indra/newview/llwaterparammanager.cpp
index 67bb965f99..1a98d4c6c2 100644
--- a/indra/newview/llwaterparammanager.cpp
+++ b/indra/newview/llwaterparammanager.cpp
@@ -54,12 +54,9 @@
#include "llwlparammanager.h"
#include "llwaterparamset.h"
-#include "llfloaterwater.h"
#include "curl/curl.h"
-LLWaterParamManager * LLWaterParamManager::sInstance = NULL;
-
LLWaterParamManager::LLWaterParamManager() :
mFogColor(22.f/255.f, 43.f/255.f, 54.f/255.f, 0.0f, 0.0f, "waterFogColor", "WaterFogColor"),
mFogDensity(4, "waterFogDensity", 2),
@@ -73,8 +70,6 @@ LLWaterParamManager::LLWaterParamManager() :
mWave1Dir(.5f, .5f, "wave1Dir"),
mWave2Dir(.5f, .5f, "wave2Dir"),
mDensitySliderValue(1.0f),
- mPrevFogDensity(16.0f), // 2^4
- mPrevFogColor(22.f/255.f, 43.f/255.f, 54.f/255.f, 0.0f),
mWaterFogKS(1.0f)
{
}
@@ -83,131 +78,73 @@ LLWaterParamManager::~LLWaterParamManager()
{
}
-void LLWaterParamManager::loadAllPresets(const std::string& file_name)
+void LLWaterParamManager::loadAllPresets()
{
- std::string path_name(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight/water", ""));
- LL_DEBUGS2("AppInit", "Shaders") << "Loading Default water settings from " << path_name << LL_ENDL;
-
- bool found = true;
- LLDirIterator app_settings_iter(path_name, "*.xml");
- while(found)
- {
- std::string name;
- found = app_settings_iter.next(name);
- if(found)
- {
-
- name=name.erase(name.length()-4);
+ // First, load system (coming out of the box) water presets.
+ loadPresetsFromDir(getSysDir());
- // bugfix for SL-46920: preventing filenames that break stuff.
- char * curl_str = curl_unescape(name.c_str(), name.size());
- std::string unescaped_name(curl_str);
- curl_free(curl_str);
- curl_str = NULL;
-
- LL_DEBUGS2("AppInit", "Shaders") << "name: " << name << LL_ENDL;
- loadPreset(unescaped_name,FALSE);
- }
- }
+ // Then load user presets. Note that user day presets will modify any system ones already loaded.
+ loadPresetsFromDir(getUserDir());
+}
- // And repeat for user presets, note the user presets will modify any system presets already loaded
+void LLWaterParamManager::loadPresetsFromDir(const std::string& dir)
+{
+ LL_INFOS2("AppInit", "Shaders") << "Loading water presets from " << dir << LL_ENDL;
- std::string path_name2(gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight/water", ""));
- LL_DEBUGS2("AppInit", "Shaders") << "Loading User water settings from " << path_name2 << LL_ENDL;
-
- found = true;
- LLDirIterator user_settings_iter(path_name2, "*.xml");
- while(found)
+ LLDirIterator dir_iter(dir, "*.xml");
+ while (1)
{
- std::string name;
- found = user_settings_iter.next(name);
- if(found)
+ std::string file;
+ if (!dir_iter.next(file))
{
- name=name.erase(name.length()-4);
-
- // bugfix for SL-46920: preventing filenames that break stuff.
- char * curl_str = curl_unescape(name.c_str(), name.size());
- std::string unescaped_name(curl_str);
- curl_free(curl_str);
- curl_str = NULL;
+ break; // no more files
+ }
- LL_DEBUGS2("AppInit", "Shaders") << "name: " << name << LL_ENDL;
- loadPreset(unescaped_name,FALSE);
+ std::string path = dir + file;
+ if (!loadPreset(path))
+ {
+ llwarns << "Error loading water preset from " << path << llendl;
}
}
-
}
-void LLWaterParamManager::loadPreset(const std::string & name,bool propagate)
+bool LLWaterParamManager::loadPreset(const std::string& path)
{
- // bugfix for SL-46920: preventing filenames that break stuff.
- char * curl_str = curl_escape(name.c_str(), name.size());
- std::string escaped_filename(curl_str);
- curl_free(curl_str);
- curl_str = NULL;
-
- escaped_filename += ".xml";
+ llifstream xml_file;
+ std::string name(gDirUtilp->getBaseFileName(LLURI::unescape(path), /*strip_exten = */ true));
- std::string pathName(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight/water", escaped_filename));
- LL_DEBUGS2("AppInit", "Shaders") << "Loading water settings from " << pathName << LL_ENDL;
-
- llifstream presetsXML;
- presetsXML.open(pathName.c_str());
-
- // That failed, try loading from the users area instead.
- if(!presetsXML)
+ xml_file.open(path.c_str());
+ if (!xml_file)
{
- pathName=gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight/water", escaped_filename);
- LL_DEBUGS2("AppInit", "Shaders") << "Loading User water setting from " << pathName << LL_ENDL;
- presetsXML.clear();
- presetsXML.open(pathName.c_str());
+ return false;
}
- if (presetsXML)
- {
- LLSD paramsData(LLSD::emptyMap());
+ LL_DEBUGS2("AppInit", "Shaders") << "Loading water " << name << LL_ENDL;
- LLPointer<LLSDParser> parser = new LLSDXMLParser();
+ LLSD params_data;
+ LLPointer<LLSDParser> parser = new LLSDXMLParser();
+ parser->parse(xml_file, params_data, LLSDSerialize::SIZE_UNLIMITED);
+ xml_file.close();
- parser->parse(presetsXML, paramsData, LLSDSerialize::SIZE_UNLIMITED);
-
- std::map<std::string, LLWaterParamSet>::iterator mIt = mParamList.find(name);
- if(mIt == mParamList.end())
- {
- addParamSet(name, paramsData);
- }
- else
- {
- setParamSet(name, paramsData);
- }
- presetsXML.close();
- }
- else
+ if (hasParamSet(name))
{
- llwarns << "Can't find " << name << llendl;
- return;
+ setParamSet(name, params_data);
}
-
- if(propagate)
+ else
{
- getParamSet(name, mCurParams);
- propagateParameters();
+ addParamSet(name, params_data);
}
-}
+
+ return true;
+}
void LLWaterParamManager::savePreset(const std::string & name)
{
- // bugfix for SL-46920: preventing filenames that break stuff.
- char * curl_str = curl_escape(name.c_str(), name.size());
- std::string escaped_filename(curl_str);
- curl_free(curl_str);
- curl_str = NULL;
-
- escaped_filename += ".xml";
+ llassert(!name.empty());
// make an empty llsd
LLSD paramsData(LLSD::emptyMap());
- std::string pathName(gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight/water", escaped_filename));
+ std::string pathName(getUserDir() + LLURI::escape(name) + ".xml");
// fill it with LLSD windlight params
paramsData = mParamList[name].getAll();
@@ -221,7 +158,6 @@ void LLWaterParamManager::savePreset(const std::string & name)
propagateParameters();
}
-
void LLWaterParamManager::propagateParameters(void)
{
// bind the variables only if we're using shaders
@@ -251,7 +187,7 @@ void LLWaterParamManager::updateShaderUniforms(LLGLSLShader * shader)
{
if (shader->mShaderGroup == LLGLSLShader::SG_WATER)
{
- shader->uniform4fv(LLViewerShaderMgr::LIGHTNORM, 1, LLWLParamManager::instance()->getRotatedLightDir().mV);
+ 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->uniform4fv("waterPlane", 1, mWaterPlane.mV);
@@ -261,36 +197,33 @@ void LLWaterParamManager::updateShaderUniforms(LLGLSLShader * shader)
}
}
-static LLFastTimer::DeclareTimer FTM_UPDATE_WLPARAM("Update Windlight Params");
-
-void LLWaterParamManager::update(LLViewerCamera * cam)
+void LLWaterParamManager::applyParams(const LLSD& params, bool interpolate)
{
- LLFastTimer ftm(FTM_UPDATE_WLPARAM);
-
- // update the shaders and the menu
- propagateParameters();
-
- // If water fog color has been changed, save it.
- if (mPrevFogColor != mFogColor)
+ if (params.size() == 0)
{
- gSavedSettings.setColor4("WaterFogColor", mFogColor);
- mPrevFogColor = mFogColor;
+ llwarns << "Undefined water params" << llendl;
+ return;
}
- // If water fog density has been changed, save it.
- if (mPrevFogDensity != mFogDensity)
+ if (interpolate)
{
- gSavedSettings.setF32("WaterFogDensity", mFogDensity);
- mPrevFogDensity = mFogDensity;
+ LLWLParamManager::getInstance()->mAnimator.startInterpolation(params);
}
-
- // sync menus if they exist
- LLFloaterWater* waterfloater = LLFloaterReg::findTypedInstance<LLFloaterWater>("env_water");
- if(waterfloater)
+ else
{
- waterfloater->syncMenu();
+ mCurParams.setAll(params);
}
+}
+static LLFastTimer::DeclareTimer FTM_UPDATE_WATERPARAM("Update Water Params");
+
+void LLWaterParamManager::update(LLViewerCamera * cam)
+{
+ LLFastTimer ftm(FTM_UPDATE_WATERPARAM);
+
+ // update the shaders and the menu
+ propagateParameters();
+
// only do this if we're dealing with shaders
if(gPipeline.canUseVertexShaders())
{
@@ -339,26 +272,14 @@ void LLWaterParamManager::update(LLViewerCamera * cam)
}
}
-// static
-void LLWaterParamManager::initClass(void)
-{
- instance();
-}
-
-// static
-void LLWaterParamManager::cleanupClass(void)
-{
- delete sInstance;
- sInstance = NULL;
-}
-
bool LLWaterParamManager::addParamSet(const std::string& name, LLWaterParamSet& param)
{
// add a new one if not one there already
- std::map<std::string, LLWaterParamSet>::iterator mIt = mParamList.find(name);
+ preset_map_t::iterator mIt = mParamList.find(name);
if(mIt == mParamList.end())
{
mParamList[name] = param;
+ mPresetListChangeSignal();
return true;
}
@@ -367,23 +288,15 @@ bool LLWaterParamManager::addParamSet(const std::string& name, LLWaterParamSet&
BOOL LLWaterParamManager::addParamSet(const std::string& name, LLSD const & param)
{
- // add a new one if not one there already
- std::map<std::string, LLWaterParamSet>::const_iterator finder = mParamList.find(name);
- if(finder == mParamList.end())
- {
- mParamList[name].setAll(param);
- return TRUE;
- }
- else
- {
- return FALSE;
- }
+ LLWaterParamSet param_set;
+ param_set.setAll(param);
+ return addParamSet(name, param_set);
}
bool LLWaterParamManager::getParamSet(const std::string& name, LLWaterParamSet& param)
{
// find it and set it
- std::map<std::string, LLWaterParamSet>::iterator mIt = mParamList.find(name);
+ preset_map_t::iterator mIt = mParamList.find(name);
if(mIt != mParamList.end())
{
param = mParamList[name];
@@ -394,6 +307,12 @@ bool LLWaterParamManager::getParamSet(const std::string& name, LLWaterParamSet&
return false;
}
+bool LLWaterParamManager::hasParamSet(const std::string& name)
+{
+ LLWaterParamSet dummy;
+ return getParamSet(name, dummy);
+}
+
bool LLWaterParamManager::setParamSet(const std::string& name, LLWaterParamSet& param)
{
mParamList[name] = param;
@@ -417,29 +336,74 @@ bool LLWaterParamManager::setParamSet(const std::string& name, const LLSD & para
bool LLWaterParamManager::removeParamSet(const std::string& name, bool delete_from_disk)
{
// remove from param list
- std::map<std::string, LLWaterParamSet>::iterator mIt = mParamList.find(name);
- if(mIt != mParamList.end())
+ preset_map_t::iterator it = mParamList.find(name);
+ if (it == mParamList.end())
{
- mParamList.erase(mIt);
+ LL_WARNS("WindLight") << "No water preset named " << name << LL_ENDL;
+ return false;
}
- if(delete_from_disk)
- {
+ mParamList.erase(it);
- std::string path_name(gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight/water", ""));
-
- // use full curl escaped name
- char * curl_str = curl_escape(name.c_str(), name.size());
- std::string escaped_name(curl_str);
- curl_free(curl_str);
- curl_str = NULL;
-
- gDirUtilp->deleteFilesInDir(path_name, escaped_name + ".xml");
+ // remove from file system if requested
+ if (delete_from_disk)
+ {
+ if (gDirUtilp->deleteFilesInDir(getUserDir(), LLURI::escape(name) + ".xml") < 1)
+ {
+ LL_WARNS("WindLight") << "Error removing water preset " << name << " from disk" << LL_ENDL;
+ }
}
+ // signal interested parties
+ mPresetListChangeSignal();
return true;
}
+bool LLWaterParamManager::isSystemPreset(const std::string& preset_name) const
+{
+ // *TODO: file system access is excessive here.
+ return gDirUtilp->fileExists(getSysDir() + LLURI::escape(preset_name) + ".xml");
+}
+
+void LLWaterParamManager::getPresetNames(preset_name_list_t& presets) const
+{
+ presets.clear();
+
+ for (preset_map_t::const_iterator it = mParamList.begin(); it != mParamList.end(); ++it)
+ {
+ presets.push_back(it->first);
+ }
+}
+
+void LLWaterParamManager::getPresetNames(preset_name_list_t& user_presets, preset_name_list_t& system_presets) const
+{
+ user_presets.clear();
+ system_presets.clear();
+
+ for (preset_map_t::const_iterator it = mParamList.begin(); it != mParamList.end(); ++it)
+ {
+ if (isSystemPreset(it->first))
+ {
+ system_presets.push_back(it->first);
+ }
+ else
+ {
+ user_presets.push_back(it->first);
+ }
+ }
+}
+
+void LLWaterParamManager::getUserPresetNames(preset_name_list_t& user_presets) const
+{
+ preset_name_list_t dummy;
+ getPresetNames(user_presets, dummy);
+}
+
+boost::signals2::connection LLWaterParamManager::setPresetListChangeCallback(const preset_list_signal_t::slot_type& cb)
+{
+ return mPresetListChangeSignal.connect(cb);
+}
+
F32 LLWaterParamManager::getFogDensity(void)
{
bool err;
@@ -458,34 +422,22 @@ F32 LLWaterParamManager::getFogDensity(void)
return fogDensity;
}
-// static
-LLWaterParamManager * LLWaterParamManager::instance()
+// virtual static
+void LLWaterParamManager::initSingleton()
{
- if(NULL == sInstance)
- {
- sInstance = new LLWaterParamManager();
-
- sInstance->loadAllPresets(LLStringUtil::null);
-
- sInstance->getParamSet("Default", sInstance->mCurParams);
- sInstance->initOverrides();
- }
+ LL_DEBUGS("Windlight") << "Initializing water" << LL_ENDL;
+ loadAllPresets();
+ LLEnvManagerNew::instance().usePrefs();
+}
- return sInstance;
+// static
+std::string LLWaterParamManager::getSysDir()
+{
+ return gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight/water", "");
}
-void LLWaterParamManager::initOverrides()
+// static
+std::string LLWaterParamManager::getUserDir()
{
- // Override fog color from the current preset with the saved setting.
- LLColor4 fog_color_override = gSavedSettings.getColor4("WaterFogColor");
- mFogColor = fog_color_override;
- mPrevFogColor = fog_color_override;
- mCurParams.set("waterFogColor", fog_color_override);
-
- // Do the same with fog density.
- F32 fog_density = gSavedSettings.getF32("WaterFogDensity");
- mPrevFogDensity = fog_density;
- mFogDensity = fog_density;
- mCurParams.set("waterFogDensity", fog_density);
- setDensitySliderValue(mFogDensity.mExp);
+ return gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS , "windlight/water", "");
}
diff --git a/indra/newview/llwaterparammanager.h b/indra/newview/llwaterparammanager.h
index f465034c39..dc7d41be2a 100644
--- a/indra/newview/llwaterparammanager.h
+++ b/indra/newview/llwaterparammanager.h
@@ -27,7 +27,7 @@
#ifndef LL_WATER_PARAMMANAGER_H
#define LL_WATER_PARAMMANAGER_H
-#include <vector>
+#include <list>
#include <map>
#include "llwaterparamset.h"
#include "llviewercamera.h"
@@ -212,19 +212,13 @@ struct WaterExpFloatControl
/// WindLight parameter manager class - what controls all the wind light shaders
-class LLWaterParamManager
+class LLWaterParamManager : public LLSingleton<LLWaterParamManager>
{
+ LOG_CLASS(LLWaterParamManager);
public:
-
- LLWaterParamManager();
- ~LLWaterParamManager();
-
- /// load a preset file
- void loadAllPresets(const std::string & fileName);
-
- /// load an individual preset into the sky
-
- void loadPreset(const std::string & name,bool propagate=true);
+ typedef std::list<std::string> preset_name_list_t;
+ typedef std::map<std::string, LLWaterParamSet> preset_map_t;
+ typedef boost::signals2::signal<void()> preset_list_signal_t;
/// save the parameter presets to file
void savePreset(const std::string & name);
@@ -232,18 +226,15 @@ public:
/// send the parameters to the shaders
void propagateParameters(void);
+ // display specified water
+ void applyParams(const LLSD& params, bool interpolate);
+
/// update information for the shader
void update(LLViewerCamera * cam);
/// Update shader uniforms that have changed.
void updateShaderUniforms(LLGLSLShader * shader);
- /// Perform global initialization for this class.
- static void initClass(void);
-
- // Cleanup of global data that's only inited once per class.
- static void cleanupClass();
-
/// add a param to the list
bool addParamSet(const std::string& name, LLWaterParamSet& param);
@@ -253,6 +244,9 @@ public:
/// get a param from the list
bool getParamSet(const std::string& name, LLWaterParamSet& param);
+ /// check whether the preset is in the list
+ bool hasParamSet(const std::string& name);
+
/// set the param in the list with a new param
bool setParamSet(const std::string& name, LLWaterParamSet& param);
@@ -263,6 +257,24 @@ public:
/// returns true if successful
bool removeParamSet(const std::string& name, bool delete_from_disk);
+ /// @return true if the preset comes out of the box
+ bool isSystemPreset(const std::string& preset_name) const;
+
+ /// @return all named water presets.
+ const preset_map_t& getPresets() const { return mParamList; }
+
+ /// @return user and system preset names as a single list
+ void getPresetNames(preset_name_list_t& presets) const;
+
+ /// @return user and system preset names separately
+ void getPresetNames(preset_name_list_t& user_presets, preset_name_list_t& system_presets) const;
+
+ /// @return list of user presets names
+ void getUserPresetNames(preset_name_list_t& user_presets) const;
+
+ /// Emitted when a preset gets added or deleted.
+ boost::signals2::connection setPresetListChangeCallback(const preset_list_signal_t::slot_type& cb);
+
/// set the normap map we want for water
bool setNormalMapID(const LLUUID& img);
@@ -281,12 +293,6 @@ public:
F32 getFogDensity(void);
LLColor4 getFogColor(void);
- // singleton pattern implementation
- static LLWaterParamManager * instance();
-
-private:
- void initOverrides();
-
public:
LLWaterParamSet mCurParams;
@@ -308,20 +314,28 @@ public:
WaterFloatControl mScaleBelow;
WaterFloatControl mBlurMultiplier;
- // list of all the parameters, listed by name
- std::map<std::string, LLWaterParamSet> mParamList;
-
F32 mDensitySliderValue;
private:
+ friend class LLSingleton<LLWaterParamManager>;
+ /*virtual*/ void initSingleton();
+ LLWaterParamManager();
+ ~LLWaterParamManager();
+
+ void loadAllPresets();
+ void loadPresetsFromDir(const std::string& dir);
+ bool loadPreset(const std::string& path);
+
+ static std::string getSysDir();
+ static std::string getUserDir();
+
LLVector4 mWaterPlane;
F32 mWaterFogKS;
- LLColor4 mPrevFogColor;
- F32 mPrevFogDensity;
+ // list of all the parameters, listed by name
+ preset_map_t mParamList;
- // our parameter manager singleton instance
- static LLWaterParamManager * sInstance;
+ preset_list_signal_t mPresetListChangeSignal;
};
inline void LLWaterParamManager::setDensitySliderValue(F32 val)
diff --git a/indra/newview/llwaterparamset.cpp b/indra/newview/llwaterparamset.cpp
index 9457d631be..39d366b023 100644
--- a/indra/newview/llwaterparamset.cpp
+++ b/indra/newview/llwaterparamset.cpp
@@ -29,7 +29,6 @@
#include "llwaterparamset.h"
#include "llsd.h"
-#include "llfloaterwater.h"
#include "llwaterparammanager.h"
#include "lluictrlfactory.h"
#include "llsliderctrl.h"
@@ -224,3 +223,46 @@ F32 LLWaterParamSet::getFloat(const std::string& paramName, bool& error)
return 0;
}
+// Added for interpolation effect in DEV-33645
+// Based on LLWLParamSet::mix, but written by Jacob without an intimate knowledge of how WindLight works.
+// The function definition existed in the header but was never implemented. If you think there is something
+// wrong with this, you're probably right. Ask Jacob, Q, or a member of the original WindLight team.
+void LLWaterParamSet::mix(LLWaterParamSet& src, LLWaterParamSet& dest, F32 weight)
+{
+ // Setup
+ LLSD srcVal, destVal; // LLSD holders for get/set calls, reusable
+
+ // Iterate through values
+ for(LLSD::map_iterator iter = mParamValues.beginMap(); iter != mParamValues.endMap(); ++iter)
+ {
+ // If param exists in both src and dest, set the holder variables, otherwise skip
+ if(src.mParamValues.has(iter->first) && dest.mParamValues.has(iter->first))
+ {
+ srcVal = src.mParamValues[iter->first];
+ destVal = dest.mParamValues[iter->first];
+ }
+ else
+ {
+ continue;
+ }
+
+ if(iter->second.isReal()) // If it's a real, interpolate directly
+ {
+ iter->second = srcVal.asReal() + ((destVal.asReal() - srcVal.asReal()) * weight);
+ }
+ else if(iter->second.isArray() && iter->second[0].isReal() // If it's an array of reals, loop through the reals and interpolate on those
+ && iter->second.size() == srcVal.size() && iter->second.size() == destVal.size())
+ {
+ // Actually do interpolation: old value + (difference in values * factor)
+ for(int i=0; i < iter->second.size(); ++i)
+ {
+ // iter->second[i] = (1.f-weight)*(F32)srcVal[i].asReal() + weight*(F32)destVal[i].asReal(); // old way of doing it -- equivalent but one more operation
+ iter->second[i] = srcVal[i].asReal() + ((destVal[i].asReal() - srcVal[i].asReal()) * weight);
+ }
+ }
+ else // Else, skip
+ {
+ continue;
+ }
+ }
+}
diff --git a/indra/newview/llwaterparamset.h b/indra/newview/llwaterparamset.h
index 9957d5371b..b28585af59 100644
--- a/indra/newview/llwaterparamset.h
+++ b/indra/newview/llwaterparamset.h
@@ -34,7 +34,6 @@
#include "v4color.h"
#include "llviewershadermgr.h"
-class LLFloaterWater;
class LLWaterParamSet;
/// A class representing a set of parameter values for the Water shaders.
diff --git a/indra/newview/llwlanimator.cpp b/indra/newview/llwlanimator.cpp
index a94a2e41aa..e568638cf6 100644
--- a/indra/newview/llwlanimator.cpp
+++ b/indra/newview/llwlanimator.cpp
@@ -30,20 +30,31 @@
#include "llsky.h"
#include "pipeline.h"
#include "llwlparammanager.h"
+#include "llwaterparammanager.h"
-LLWLAnimator::LLWLAnimator() : mStartTime(0), mDayRate(1), mDayTime(0),
- mIsRunning(FALSE), mUseLindenTime(false)
+extern LLControlGroup gSavedSettings;
+
+F64 LLWLAnimator::INTERP_TOTAL_SECONDS = 3.f;
+
+LLWLAnimator::LLWLAnimator() : mStartTime(0.f), mDayRate(1.f), mDayTime(0.f),
+ mIsRunning(FALSE), mIsInterpolating(FALSE), mTimeType(TIME_LINDEN),
+ mInterpStartTime(), mInterpEndTime()
{
- mDayTime = 0;
+ mInterpBeginWL = new LLWLParamSet();
+ mInterpBeginWater = new LLWaterParamSet();
+ mInterpEndWater = new LLWaterParamSet();
}
void LLWLAnimator::update(LLWLParamSet& curParams)
{
+ //llassert(mUseLindenTime != mUseLocalTime);
+
F64 curTime;
curTime = getDayTime();
// don't do anything if empty
- if(mTimeTrack.size() == 0) {
+ if(mTimeTrack.size() == 0)
+ {
return;
}
@@ -53,13 +64,15 @@ void LLWLAnimator::update(LLWLParamSet& curParams)
mSecondIt++;
// grab the two tween iterators
- while(mSecondIt != mTimeTrack.end() && curTime > mSecondIt->first) {
+ while(mSecondIt != mTimeTrack.end() && curTime > mSecondIt->first)
+ {
mFirstIt++;
mSecondIt++;
}
// scroll it around when you get to the end
- if(mSecondIt == mTimeTrack.end() || mFirstIt->first > curTime) {
+ if(mSecondIt == mTimeTrack.end() || mFirstIt->first > curTime)
+ {
mSecondIt = mTimeTrack.begin();
mFirstIt = mTimeTrack.end();
mFirstIt--;
@@ -67,70 +80,111 @@ void LLWLAnimator::update(LLWLParamSet& curParams)
F32 weight = 0;
- if(mFirstIt->first < mSecondIt->first) {
+ if(mFirstIt->first < mSecondIt->first)
+ {
// get the delta time and the proper weight
weight = F32 (curTime - mFirstIt->first) /
(mSecondIt->first - mFirstIt->first);
// handle the ends
- } else if(mFirstIt->first > mSecondIt->first) {
+ }
+ else if(mFirstIt->first > mSecondIt->first)
+ {
// right edge of time line
- if(curTime >= mFirstIt->first) {
+ if(curTime >= mFirstIt->first)
+ {
weight = F32 (curTime - mFirstIt->first) /
((1 + mSecondIt->first) - mFirstIt->first);
-
// left edge of time line
- } else {
+ }
+ else
+ {
weight = F32 ((1 + curTime) - mFirstIt->first) /
((1 + mSecondIt->first) - mFirstIt->first);
}
-
// handle same as whatever the last one is
- } else {
+ }
+ else
+ {
weight = 1;
}
+ if(mIsInterpolating)
+ {
+ // *TODO_JACOB: this is kind of laggy. Not sure why. The part that lags is the curParams.mix call, and none of the other mixes. It works, though.
+ clock_t current = clock();
+ if(current >= mInterpEndTime)
+ {
+ mIsInterpolating = false;
+ return;
+ }
+
+ // determine moving target for final interpolation value
+ // *TODO: this will not work with lazy loading of sky presets.
+ LLWLParamSet buf = LLWLParamSet();
+ buf.setAll(LLWLParamManager::getInstance()->mParamList[mFirstIt->second].getAll()); // just give it some values, otherwise it has no params to begin with (see comment in constructor)
+ buf.mix(LLWLParamManager::getInstance()->mParamList[mFirstIt->second], LLWLParamManager::getInstance()->mParamList[mSecondIt->second], weight); // mix to determine moving target for interpolation finish (as below)
+
+ // mix from previous value to moving target
+ weight = (current - mInterpStartTime) / (INTERP_TOTAL_SECONDS * CLOCKS_PER_SEC);
+ curParams.mix(*mInterpBeginWL, buf, weight);
+
+ // mix water
+ LLWaterParamManager::getInstance()->mCurParams.mix(*mInterpBeginWater, *mInterpEndWater, weight);
+ }
+ else
+ {
// do the interpolation and set the parameters
- curParams.mix(LLWLParamManager::instance()->mParamList[mFirstIt->second],
- LLWLParamManager::instance()->mParamList[mSecondIt->second], weight);
+ // *TODO: this will not work with lazy loading of sky presets.
+ curParams.mix(LLWLParamManager::getInstance()->mParamList[mFirstIt->second], LLWLParamManager::getInstance()->mParamList[mSecondIt->second], weight);
+ }
}
F64 LLWLAnimator::getDayTime()
{
- if(!mIsRunning) {
+ if(!mIsRunning)
+ {
return mDayTime;
}
-
- if(mUseLindenTime) {
-
+ else if(mTimeType == TIME_LINDEN)
+ {
F32 phase = gSky.getSunPhase() / F_PI;
// we're not solving the non-linear equation that determines sun phase
// we're just linearly interpolating between the major points
if (phase <= 5.0 / 4.0) {
mDayTime = (1.0 / 3.0) * phase + (1.0 / 3.0);
- } else {
+ }
+ else
+ {
mDayTime = phase - (1.0 / 2.0);
}
- if(mDayTime > 1) {
+ if(mDayTime > 1)
+ {
mDayTime--;
}
return mDayTime;
}
+ else if(mTimeType == TIME_LOCAL)
+ {
+ return getLocalTime();
+ }
// get the time;
mDayTime = (LLTimer::getElapsedSeconds() - mStartTime) / mDayRate;
// clamp it
- if(mDayTime < 0) {
+ if(mDayTime < 0)
+ {
mDayTime = 0;
}
- while(mDayTime > 1) {
+ while(mDayTime > 1)
+ {
mDayTime--;
}
@@ -144,15 +198,18 @@ void LLWLAnimator::setDayTime(F64 dayTime)
mDayTime = dayTime;
// clamp it
- if(mDayTime < 0) {
+ if(mDayTime < 0)
+ {
mDayTime = 0;
- } else if(mDayTime > 1) {
+ }
+ else if(mDayTime > 1)
+ {
mDayTime = 1;
}
}
-void LLWLAnimator::setTrack(std::map<F32, std::string>& curTrack,
+void LLWLAnimator::setTrack(std::map<F32, LLWLParamKey>& curTrack,
F32 dayRate, F64 dayTime, bool run)
{
mTimeTrack = curTrack;
@@ -161,3 +218,96 @@ void LLWLAnimator::setTrack(std::map<F32, std::string>& curTrack,
mIsRunning = run;
}
+
+void LLWLAnimator::startInterpolation(const LLSD& targetWater)
+{
+ mInterpBeginWL->setAll(LLWLParamManager::getInstance()->mCurParams.getAll());
+ mInterpBeginWater->setAll(LLWaterParamManager::getInstance()->mCurParams.getAll());
+
+ mInterpStartTime = clock();
+ mInterpEndTime = mInterpStartTime + clock_t(INTERP_TOTAL_SECONDS) * CLOCKS_PER_SEC;
+
+ // Don't set any ending WL -- this is continuously calculated as the animator updates since it's a moving target
+ mInterpEndWater->setAll(targetWater);
+
+ mIsInterpolating = true;
+}
+
+std::string LLWLAnimator::timeToString(F32 curTime)
+{
+ S32 hours;
+ S32 min;
+ bool isPM = false;
+
+ // get hours and minutes
+ hours = (S32) (24.0 * curTime);
+ curTime -= ((F32) hours / 24.0f);
+ min = llround(24.0f * 60.0f * curTime);
+
+ // handle case where it's 60
+ if(min == 60)
+ {
+ hours++;
+ min = 0;
+ }
+
+ // set for PM
+ if(hours >= 12 && hours < 24)
+ {
+ isPM = true;
+ }
+
+ // convert to non-military notation
+ if(hours >= 24)
+ {
+ hours = 12;
+ }
+ else if(hours > 12)
+ {
+ hours -= 12;
+ }
+ else if(hours == 0)
+ {
+ hours = 12;
+ }
+
+ // make the string
+ std::stringstream newTime;
+ newTime << hours << ":";
+
+ // double 0
+ if(min < 10)
+ {
+ newTime << 0;
+ }
+
+ // finish it
+ newTime << min << " ";
+ if(isPM)
+ {
+ newTime << "PM";
+ }
+ else
+ {
+ newTime << "AM";
+ }
+
+ return newTime.str();
+}
+
+F64 LLWLAnimator::getLocalTime()
+{
+ char buffer[9];
+ time_t rawtime;
+ struct tm* timeinfo;
+
+ time(&rawtime);
+ timeinfo = localtime(&rawtime);
+ strftime(buffer, 9, "%H:%M:%S", timeinfo);
+ std::string timeStr(buffer);
+
+ F64 tod = ((F64)atoi(timeStr.substr(0,2).c_str())) / 24.f +
+ ((F64)atoi(timeStr.substr(3,2).c_str())) / 1440.f +
+ ((F64)atoi(timeStr.substr(6,2).c_str())) / 86400.f;
+ return tod;
+}
diff --git a/indra/newview/llwlanimator.h b/indra/newview/llwlanimator.h
index 5677290213..5223b45343 100644
--- a/indra/newview/llwlanimator.h
+++ b/indra/newview/llwlanimator.h
@@ -28,28 +28,39 @@
#define LL_WL_ANIMATOR_H
#include "llwlparamset.h"
+#include "llwaterparamset.h"
#include <string>
#include <map>
+struct LLWLParamKey;
+
class LLWLAnimator {
public:
+ typedef enum e_time
+ {
+ TIME_LINDEN,
+ TIME_LOCAL,
+ TIME_CUSTOM
+ } ETime;
+
F64 mStartTime;
F32 mDayRate;
F64 mDayTime;
// track to play
- std::map<F32, std::string> mTimeTrack;
- std::map<F32, std::string>::iterator mFirstIt, mSecondIt;
-
- // params to use
- //std::map<std::string, LLWLParamSet> mParamList;
-
- bool mIsRunning;
- bool mUseLindenTime;
+ std::map<F32, LLWLParamKey> mTimeTrack;
+ std::map<F32, LLWLParamKey>::iterator mFirstIt, mSecondIt;
// simple constructor
LLWLAnimator();
+ ~LLWLAnimator()
+ {
+ delete mInterpBeginWL;
+ delete mInterpBeginWater;
+ delete mInterpEndWater;
+ }
+
// update the parameters
void update(LLWLParamSet& curParams);
@@ -63,9 +74,66 @@ public:
void setDayTime(F64 dayTime);
// set an animation track
- void setTrack(std::map<F32, std::string>& track,
+ void setTrack(std::map<F32, LLWLParamKey>& track,
F32 dayRate, F64 dayTime = 0, bool run = true);
+ void deactivate()
+ {
+ mIsRunning = false;
+ }
+
+ void activate(ETime time)
+ {
+ mIsRunning = true;
+ mTimeType = time;
+ }
+
+ void startInterpolation(const LLSD& targetWater);
+
+ bool getIsRunning()
+ {
+ return mIsRunning;
+ }
+
+ bool getUseCustomTime()
+ {
+ return mTimeType == TIME_CUSTOM;
+ }
+
+ bool getUseLocalTime()
+ {
+ return mTimeType == TIME_LOCAL;
+ }
+
+ bool getUseLindenTime()
+ {
+ return mTimeType == TIME_LINDEN;
+ }
+
+ void setTimeType(ETime time)
+ {
+ mTimeType = time;
+ }
+
+ ETime getTimeType()
+ {
+ return mTimeType;
+ }
+
+ /// convert the present time to a digital clock time
+ static std::string timeToString(F32 curTime);
+
+ /// get local time between 0 and 1
+ static F64 getLocalTime();
+
+private:
+ ETime mTimeType;
+ bool mIsRunning, mIsInterpolating;
+ LLWLParamSet *mInterpBeginWL;
+ LLWaterParamSet *mInterpBeginWater, *mInterpEndWater;
+ clock_t mInterpStartTime, mInterpEndTime;
+
+ static F64 INTERP_TOTAL_SECONDS;
};
#endif // LL_WL_ANIMATOR_H
diff --git a/indra/newview/llwldaycycle.cpp b/indra/newview/llwldaycycle.cpp
index 85b3d62a49..4c0cb7c0f4 100644
--- a/indra/newview/llwldaycycle.cpp
+++ b/indra/newview/llwldaycycle.cpp
@@ -27,12 +27,11 @@
#include "llviewerprecompiledheaders.h"
#include "llwldaycycle.h"
-
-#include "llnotificationsutil.h"
#include "llsdserialize.h"
-#include "llxmlnode.h"
-
#include "llwlparammanager.h"
+#include "llnotifications.h"
+
+#include "llviewerwindow.h"
#include <map>
@@ -45,85 +44,160 @@ LLWLDayCycle::~LLWLDayCycle()
{
}
-void LLWLDayCycle::loadDayCycle(const std::string & fileName)
+void LLWLDayCycle::loadDayCycle(const LLSD& day_data, LLWLParamKey::EScope scope)
{
- // clear the first few things
+ lldebugs << "Loading day cycle (day_data.size() = " << day_data.size() << ", scope = " << scope << ")" << llendl;
mTimeMap.clear();
- // now load the file
- std::string pathName(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS,
- "windlight/days", fileName));
- llinfos << "Loading DayCycle settings from " << pathName << llendl;
-
- llifstream day_cycle_xml(pathName);
- if (day_cycle_xml.is_open())
+ // add each key frame
+ for(S32 i = 0; i < day_data.size(); ++i)
{
- // load and parse it
- LLSD day_data(LLSD::emptyArray());
- LLPointer<LLSDParser> parser = new LLSDXMLParser();
- parser->parse(day_cycle_xml, day_data, LLSDSerialize::SIZE_UNLIMITED);
-
- // add each key
- for(S32 i = 0; i < day_data.size(); ++i)
+ // make sure it's a two array
+ if(day_data[i].size() != 2)
+ {
+ continue;
+ }
+
+ // check each param key exists in param manager
+ bool success;
+ LLWLParamSet pset;
+ LLWLParamKey frame = LLWLParamKey(day_data[i][1].asString(), scope);
+ success =
+ LLWLParamManager::getInstance()->getParamSet(frame, pset);
+ if(!success)
{
- // make sure it's a two array
- if(day_data[i].size() != 2)
+ // *HACK: If loading region day cycle, try local sky presets as well.
+ // Local presets may be referenced by a region day cycle after
+ // it has been edited but the changes have not been uploaded.
+ if (scope == LLEnvKey::SCOPE_REGION)
{
- continue;
+ frame.scope = LLEnvKey::SCOPE_LOCAL;
+ success = LLWLParamManager::getInstance()->getParamSet(frame, pset);
}
-
- // check each param name exists in param manager
- bool success;
- LLWLParamSet pset;
- success = LLWLParamManager::instance()->getParamSet(day_data[i][1].asString(), pset);
- if(!success)
+
+ if (!success)
{
// alert the user
LLSD args;
args["SKY"] = day_data[i][1].asString();
- LLNotificationsUtil::add("WLMissingSky", args);
+ LLNotifications::instance().add("WLMissingSky", args, LLSD());
continue;
}
-
- // then add the key
- addKey((F32)day_data[i][0].asReal(), day_data[i][1].asString());
}
+
+ // then add the keyframe
+ addKeyframe((F32)day_data[i][0].asReal(), frame);
+ }
+}
+
+void LLWLDayCycle::loadDayCycleFromFile(const std::string & fileName)
+{
+ loadDayCycle(loadCycleDataFromFile(fileName), LLWLParamKey::SCOPE_LOCAL);
+}
+/*static*/ LLSD LLWLDayCycle::loadCycleDataFromFile(const std::string & fileName)
+{
+ // *FIX: Cannot load user day cycles.
+ std::string pathName(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS,
+ "windlight/days", fileName));
+
+ return loadDayCycleFromPath(pathName);
+}
+
+// static
+LLSD LLWLDayCycle::loadDayCycleFromPath(const std::string& file_path)
+{
+ LL_INFOS("Windlight") << "Loading DayCycle settings from " << file_path << LL_ENDL;
+
+ llifstream day_cycle_xml(file_path);
+ if (day_cycle_xml.is_open())
+ {
+ // load and parse it
+ LLSD day_data(LLSD::emptyArray());
+ LLPointer<LLSDParser> parser = new LLSDXMLParser();
+ parser->parse(day_cycle_xml, day_data, LLSDSerialize::SIZE_UNLIMITED);
day_cycle_xml.close();
+ return day_data;
+ }
+ else
+ {
+ return LLSD();
}
}
void LLWLDayCycle::saveDayCycle(const std::string & fileName)
{
- LLSD day_data(LLSD::emptyArray());
-
std::string pathName(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight/days", fileName));
//llinfos << "Saving WindLight settings to " << pathName << llendl;
- for(std::map<F32, std::string>::const_iterator mIt = mTimeMap.begin();
- mIt != mTimeMap.end();
- ++mIt)
+ save(pathName);
+}
+
+void LLWLDayCycle::save(const std::string& file_path)
+{
+ LLSD day_data = asLLSD();
+
+ llofstream day_cycle_xml(file_path);
+ LLPointer<LLSDFormatter> formatter = new LLSDXMLFormatter();
+ formatter->format(day_data, day_cycle_xml, LLSDFormatter::OPTIONS_PRETTY);
+ day_cycle_xml.close();
+}
+
+LLSD LLWLDayCycle::asLLSD()
+{
+ LLSD day_data(LLSD::emptyArray());
+ for(std::map<F32, LLWLParamKey>::const_iterator mIt = mTimeMap.begin(); mIt != mTimeMap.end(); ++mIt)
{
LLSD key(LLSD::emptyArray());
key.append(mIt->first);
- key.append(mIt->second);
+ key.append(mIt->second.name);
day_data.append(key);
}
- llofstream day_cycle_xml(pathName);
- LLPointer<LLSDFormatter> formatter = new LLSDXMLFormatter();
- formatter->format(day_data, day_cycle_xml, LLSDFormatter::OPTIONS_PRETTY);
- day_cycle_xml.close();
+ lldebugs << "Dumping day cycle (" << mTimeMap.size() << ") to LLSD: " << day_data << llendl;
+ return day_data;
}
+bool LLWLDayCycle::getSkyRefs(std::map<LLWLParamKey, LLWLParamSet>& refs) const
+{
+ bool result = true;
+ LLWLParamManager& wl_mgr = LLWLParamManager::instance();
+
+ refs.clear();
+ for (std::map<F32, LLWLParamKey>::const_iterator iter = mTimeMap.begin(); iter != mTimeMap.end(); ++iter)
+ {
+ const LLWLParamKey& key = iter->second;
+ if (!wl_mgr.getParamSet(key, refs[key]))
+ {
+ llwarns << "Cannot find sky [" << key.name << "] referenced by a day cycle" << llendl;
+ result = false;
+ }
+ }
+
+ return result;
+}
-void LLWLDayCycle::clearKeys()
+bool LLWLDayCycle::getSkyMap(LLSD& sky_map) const
{
+ std::map<LLWLParamKey, LLWLParamSet> refs;
+
+ if (!getSkyRefs(refs))
+ {
+ return false;
+ }
+
+ sky_map = LLWLParamManager::createSkyMap(refs);
+ return true;
+}
+
+void LLWLDayCycle::clearKeyframes()
+{
+ lldebugs << "Clearing key frames" << llendl;
mTimeMap.clear();
}
-bool LLWLDayCycle::addKey(F32 newTime, const std::string & paramName)
+bool LLWLDayCycle::addKeyframe(F32 newTime, LLWLParamKey frame)
{
// no adding negative time
if(newTime < 0)
@@ -134,48 +208,58 @@ bool LLWLDayCycle::addKey(F32 newTime, const std::string & paramName)
// if time not being used, add it and return true
if(mTimeMap.find(newTime) == mTimeMap.end())
{
- mTimeMap.insert(std::pair<F32, std::string>(newTime, paramName));
+ mTimeMap.insert(std::pair<F32, LLWLParamKey>(newTime, frame));
+ lldebugs << "Adding key frame (" << newTime << ", " << frame.toLLSD() << ")" << llendl;
return true;
}
// otherwise, don't add, and return error
+ llwarns << "Error adding key frame (" << newTime << ", " << frame.toLLSD() << ")" << llendl;
return false;
}
-bool LLWLDayCycle::changeKeyTime(F32 oldTime, F32 newTime)
+bool LLWLDayCycle::changeKeyframeTime(F32 oldTime, F32 newTime)
{
+ lldebugs << "Changing key frame time (" << oldTime << " => " << newTime << ")" << llendl;
+
// just remove and add back
- std::string name = mTimeMap[oldTime];
+ LLWLParamKey frame = mTimeMap[oldTime];
- bool stat = removeKey(oldTime);
+ bool stat = removeKeyframe(oldTime);
if(stat == false)
{
+ lldebugs << "Failed to change key frame time (" << oldTime << " => " << newTime << ")" << llendl;
return stat;
}
- return addKey(newTime, name);
+ return addKeyframe(newTime, frame);
}
-bool LLWLDayCycle::changeKeyParam(F32 time, const std::string & name)
+bool LLWLDayCycle::changeKeyframeParam(F32 time, LLWLParamKey key)
{
+ lldebugs << "Changing key frame param (" << time << ", " << key.toLLSD() << ")" << llendl;
+
// just remove and add back
// make sure param exists
LLWLParamSet tmp;
- bool stat = LLWLParamManager::instance()->getParamSet(name, tmp);
+ bool stat = LLWLParamManager::getInstance()->getParamSet(key, tmp);
if(stat == false)
{
+ lldebugs << "Failed to change key frame param (" << time << ", " << key.toLLSD() << ")" << llendl;
return stat;
}
- mTimeMap[time] = name;
+ mTimeMap[time] = key;
return true;
}
-bool LLWLDayCycle::removeKey(F32 time)
+bool LLWLDayCycle::removeKeyframe(F32 time)
{
+ lldebugs << "Removing key frame (" << time << ")" << llendl;
+
// look for the time. If there, erase it
- std::map<F32, std::string>::iterator mIt = mTimeMap.find(time);
+ std::map<F32, LLWLParamKey>::iterator mIt = mTimeMap.find(time);
if(mIt != mTimeMap.end())
{
mTimeMap.erase(mIt);
@@ -185,15 +269,15 @@ bool LLWLDayCycle::removeKey(F32 time)
return false;
}
-bool LLWLDayCycle::getKey(const std::string & name, F32& key)
+bool LLWLDayCycle::getKeytime(LLWLParamKey frame, F32& key_time) const
{
- // scroll through till we find the
- std::map<F32, std::string>::iterator mIt = mTimeMap.begin();
+ // scroll through till we find the correct value in the map
+ std::map<F32, LLWLParamKey>::const_iterator mIt = mTimeMap.begin();
for(; mIt != mTimeMap.end(); ++mIt)
{
- if(name == mIt->second)
+ if(frame == mIt->second)
{
- key = mIt->first;
+ key_time = mIt->first;
return true;
}
}
@@ -204,26 +288,52 @@ bool LLWLDayCycle::getKey(const std::string & name, F32& key)
bool LLWLDayCycle::getKeyedParam(F32 time, LLWLParamSet& param)
{
// just scroll on through till you find it
- std::map<F32, std::string>::iterator mIt = mTimeMap.find(time);
- if(mIt != mTimeMap.end())
+ std::map<F32, LLWLParamKey>::iterator mIt = mTimeMap.find(time);
+ if(mIt != mTimeMap.end())
{
- return LLWLParamManager::instance()->getParamSet(mIt->second, param);
+ return LLWLParamManager::getInstance()->getParamSet(mIt->second, param);
}
// return error if not found
+ lldebugs << "Key " << time << " not found" << llendl;
return false;
}
bool LLWLDayCycle::getKeyedParamName(F32 time, std::string & name)
{
// just scroll on through till you find it
- std::map<F32, std::string>::iterator mIt = mTimeMap.find(time);
+ std::map<F32, LLWLParamKey>::iterator mIt = mTimeMap.find(time);
if(mIt != mTimeMap.end())
{
- name = mTimeMap[time];
+ name = mTimeMap[time].name;
return true;
}
// return error if not found
+ lldebugs << "Key " << time << " not found" << llendl;
return false;
}
+
+bool LLWLDayCycle::hasReferencesTo(const LLWLParamKey& keyframe) const
+{
+ F32 dummy;
+ return getKeytime(keyframe, dummy);
+}
+
+void LLWLDayCycle::removeReferencesTo(const LLWLParamKey& keyframe)
+{
+ lldebugs << "Removing references to key frame " << keyframe.toLLSD() << llendl;
+ F32 keytime;
+ bool might_exist;
+ do
+ {
+ // look for it
+ might_exist = getKeytime(keyframe, keytime);
+ if(!might_exist)
+ {
+ return;
+ }
+ might_exist = removeKeyframe(keytime);
+
+ } while(might_exist); // might be another one
+}
diff --git a/indra/newview/llwldaycycle.h b/indra/newview/llwldaycycle.h
index 5cbf72191d..c8585564ed 100644
--- a/indra/newview/llwldaycycle.h
+++ b/indra/newview/llwldaycycle.h
@@ -34,13 +34,16 @@ class LLWLDayCycle;
#include <string>
#include "llwlparamset.h"
#include "llwlanimator.h"
+struct LLWLParamKey;
+#include "llenvmanager.h" // for LLEnvKey::EScope
class LLWLDayCycle
{
+ LOG_CLASS(LLWLDayCycle);
public:
// lists what param sets are used when during the day
- std::map<F32, std::string> mTimeMap;
+ std::map<F32, LLWLParamKey> mTimeMap;
// how long is my day
F32 mDayRate;
@@ -54,35 +57,56 @@ public:
~LLWLDayCycle();
/// load a day cycle
- void loadDayCycle(const std::string & fileName);
+ void loadDayCycle(const LLSD& llsd, LLEnvKey::EScope scope);
/// load a day cycle
+ void loadDayCycleFromFile(const std::string & fileName);
+
+ /// save a day cycle
void saveDayCycle(const std::string & fileName);
- /// clear keys
- void clearKeys();
+ /// save a day cycle
+ void save(const std::string& file_path);
+
+ /// load the LLSD data from a file (returns the undefined LLSD if not found)
+ static LLSD loadCycleDataFromFile(const std::string & fileName);
+
+ /// load the LLSD data from a file specified by full path
+ static LLSD loadDayCycleFromPath(const std::string& file_path);
+
+ /// get the LLSD data for this day cycle
+ LLSD asLLSD();
+
+ // get skies referenced by this day cycle
+ bool getSkyRefs(std::map<LLWLParamKey, LLWLParamSet>& refs) const;
+
+ // get referenced skies as LLSD
+ bool getSkyMap(LLSD& sky_map) const;
+
+ /// clear keyframes
+ void clearKeyframes();
/// Getters and Setters
/// add a new key frame to the day cycle
/// returns true if successful
/// no negative time
- bool addKey(F32 newTime, const std::string & paramName);
+ bool addKeyframe(F32 newTime, LLWLParamKey key);
- /// adjust a key's placement in the day cycle
+ /// adjust a keyframe's placement in the day cycle
/// returns true if successful
- bool changeKeyTime(F32 oldTime, F32 newTime);
+ bool changeKeyframeTime(F32 oldTime, F32 newTime);
- /// adjust a key's parameter used
+ /// adjust a keyframe's parameter used
/// returns true if successful
- bool changeKeyParam(F32 time, const std::string & paramName);
+ bool changeKeyframeParam(F32 time, LLWLParamKey key);
- /// remove a key from the day cycle
+ /// remove a key frame from the day cycle
/// returns true if successful
- bool removeKey(F32 time);
+ bool removeKeyframe(F32 time);
/// get the first key time for a parameter
/// returns false if not there
- bool getKey(const std::string & name, F32& key);
+ bool getKeytime(LLWLParamKey keyFrame, F32& keyTime) const;
/// get the param set at a given time
/// returns true if found one
@@ -92,6 +116,12 @@ public:
/// returns true if it found one
bool getKeyedParamName(F32 time, std::string & name);
+ /// @return true if there are references to the given sky
+ bool hasReferencesTo(const LLWLParamKey& keyframe) const;
+
+ /// removes all references to the sky (paramkey)
+ /// does nothing if the sky doesn't exist in the day
+ void removeReferencesTo(const LLWLParamKey& keyframe);
};
diff --git a/indra/newview/llwlhandlers.cpp b/indra/newview/llwlhandlers.cpp
new file mode 100644
index 0000000000..b5f53232cc
--- /dev/null
+++ b/indra/newview/llwlhandlers.cpp
@@ -0,0 +1,203 @@
+/**
+ * @file llwlhandlers.cpp
+ * @brief Various classes which handle Windlight-related messaging
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llwlhandlers.h"
+
+#include "llagent.h"
+#include "llviewerregion.h"
+#include "llenvmanager.h"
+#include "llnotificationsutil.h"
+
+/****
+ * LLEnvironmentRequest
+ ****/
+// static
+bool LLEnvironmentRequest::initiate()
+{
+ LLViewerRegion* cur_region = gAgent.getRegion();
+
+ if (!cur_region)
+ {
+ LL_WARNS("WindlightCaps") << "Viewer region not set yet, skipping env. settings request" << LL_ENDL;
+ return false;
+ }
+
+ if (!cur_region->capabilitiesReceived())
+ {
+ LL_INFOS("WindlightCaps") << "Deferring windlight settings request until we've got region caps" << LL_ENDL;
+ cur_region->setCapabilitiesReceivedCallback(boost::bind(&LLEnvironmentRequest::onRegionCapsReceived, _1));
+ return false;
+ }
+
+ return doRequest();
+}
+
+// static
+void LLEnvironmentRequest::onRegionCapsReceived(const LLUUID& region_id)
+{
+ if (region_id != gAgent.getRegion()->getRegionID())
+ {
+ LL_INFOS("WindlightCaps") << "Got caps for a non-current region" << LL_ENDL;
+ return;
+ }
+
+ LL_DEBUGS("WindlightCaps") << "Received region capabilities" << LL_ENDL;
+ doRequest();
+}
+
+// static
+bool LLEnvironmentRequest::doRequest()
+{
+ std::string url = gAgent.getRegion()->getCapability("EnvironmentSettings");
+ if (url.empty())
+ {
+ LL_INFOS("WindlightCaps") << "Skipping windlight setting request - we don't have this capability" << LL_ENDL;
+ // region is apparently not capable of this; don't respond at all
+ return false;
+ }
+
+ LL_INFOS("WindlightCaps") << "Requesting region windlight settings via " << url << LL_ENDL;
+ LLHTTPClient::get(url, new LLEnvironmentRequestResponder());
+ return true;
+}
+
+/****
+ * LLEnvironmentRequestResponder
+ ****/
+int LLEnvironmentRequestResponder::sCount = 0; // init to 0
+
+LLEnvironmentRequestResponder::LLEnvironmentRequestResponder()
+{
+ mID = ++sCount;
+}
+/*virtual*/ void LLEnvironmentRequestResponder::result(const LLSD& unvalidated_content)
+{
+ LL_INFOS("WindlightCaps") << "Received region windlight settings" << LL_ENDL;
+
+ if (mID != sCount)
+ {
+ LL_INFOS("WindlightCaps") << "Got superseded by another responder; ignoring..." << LL_ENDL;
+ return;
+ }
+
+ if (unvalidated_content[0]["regionID"].asUUID() != gAgent.getRegion()->getRegionID())
+ {
+ LL_WARNS("WindlightCaps") << "Not in the region from where this data was received (wanting "
+ << gAgent.getRegion()->getRegionID() << " but got " << unvalidated_content[0]["regionID"].asUUID()
+ << ") - ignoring..." << LL_ENDL;
+ return;
+ }
+
+ LLEnvManagerNew::getInstance()->onRegionSettingsResponse(unvalidated_content);
+}
+/*virtual*/ void LLEnvironmentRequestResponder::error(U32 status, const std::string& reason)
+{
+ LL_INFOS("WindlightCaps") << "Got an error, not using region windlight..." << LL_ENDL;
+ LLEnvManagerNew::getInstance()->onRegionSettingsResponse(LLSD());
+}
+
+/****
+ * LLEnvironmentApply
+ ****/
+
+clock_t LLEnvironmentApply::UPDATE_WAIT_SECONDS = clock_t(3.f);
+clock_t LLEnvironmentApply::sLastUpdate = clock_t(0.f);
+
+// static
+bool LLEnvironmentApply::initiateRequest(const LLSD& content)
+{
+ clock_t current = clock();
+
+ // Make sure we don't update too frequently.
+ if (current < sLastUpdate + (UPDATE_WAIT_SECONDS * CLOCKS_PER_SEC))
+ {
+ LLSD args(LLSD::emptyMap());
+ args["WAIT"] = (F64)UPDATE_WAIT_SECONDS;
+ LLNotificationsUtil::add("EnvUpdateRate", args);
+ return false;
+ }
+
+ sLastUpdate = current;
+
+ // Send update request.
+ std::string url = gAgent.getRegion()->getCapability("EnvironmentSettings");
+ if (url.empty())
+ {
+ LL_WARNS("WindlightCaps") << "Applying windlight settings not supported" << LL_ENDL;
+ return false;
+ }
+
+ LL_INFOS("WindlightCaps") << "Sending windlight settings to " << url << LL_ENDL;
+ LL_DEBUGS("WindlightCaps") << "content: " << content << LL_ENDL;
+ LLHTTPClient::post(url, content, new LLEnvironmentApplyResponder());
+ return true;
+}
+
+/****
+ * LLEnvironmentApplyResponder
+ ****/
+/*virtual*/ void LLEnvironmentApplyResponder::result(const LLSD& content)
+{
+ if (content["regionID"].asUUID() != gAgent.getRegion()->getRegionID())
+ {
+ LL_WARNS("WindlightCaps") << "No longer in the region where data was sent (currently "
+ << gAgent.getRegion()->getRegionID() << ", reply is from " << content["regionID"].asUUID()
+ << "); ignoring..." << LL_ENDL;
+ return;
+ }
+ else if (content["success"].asBoolean())
+ {
+ LL_DEBUGS("WindlightCaps") << "Success in applying windlight settings to region " << content["regionID"].asUUID() << LL_ENDL;
+ LLEnvManagerNew::instance().onRegionSettingsApplyResponse(true);
+ }
+ else
+ {
+ LL_WARNS("WindlightCaps") << "Region couldn't apply windlight settings! Reason from sim: " << content["fail_reason"].asString() << LL_ENDL;
+ LLSD args(LLSD::emptyMap());
+ args["FAIL_REASON"] = content["fail_reason"].asString();
+ LLNotificationsUtil::add("WLRegionApplyFail", args);
+ LLEnvManagerNew::instance().onRegionSettingsApplyResponse(false);
+ }
+}
+/*virtual*/ void LLEnvironmentApplyResponder::error(U32 status, const std::string& reason)
+{
+ std::stringstream msg;
+ msg << reason << " (Code " << status << ")";
+
+ LL_WARNS("WindlightCaps") << "Couldn't apply windlight settings to region! Reason: " << msg << LL_ENDL;
+
+ LLSD args(LLSD::emptyMap());
+ args["FAIL_REASON"] = msg.str();
+ LLNotificationsUtil::add("WLRegionApplyFail", args);
+}
diff --git a/indra/newview/llwlhandlers.h b/indra/newview/llwlhandlers.h
new file mode 100644
index 0000000000..213bc7c7ce
--- /dev/null
+++ b/indra/newview/llwlhandlers.h
@@ -0,0 +1,106 @@
+/**
+ * @file llwlhandlers.h
+ * @brief Headers for classes in llwlhandlers.cpp
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLWLHANDLERS_H
+#define LL_LLWLHANDLERS_H
+
+#include "llviewerprecompiledheaders.h"
+#include "llhttpclient.h"
+
+class LLEnvironmentRequest
+{
+ LOG_CLASS(LLEnvironmentRequest);
+public:
+ /// @return true if request was successfully sent
+ static bool initiate();
+
+private:
+ static void onRegionCapsReceived(const LLUUID& region_id);
+ static bool doRequest();
+};
+
+class LLEnvironmentRequestResponder: public LLHTTPClient::Responder
+{
+ LOG_CLASS(LLEnvironmentRequestResponder);
+public:
+ virtual void result(const LLSD& content);
+ virtual void error(U32 status, const std::string& reason);
+
+private:
+ friend class LLEnvironmentRequest;
+
+ LLEnvironmentRequestResponder();
+ static int sCount;
+ int mID;
+};
+
+class LLEnvironmentApply
+{
+ LOG_CLASS(LLEnvironmentApply);
+public:
+ /// @return true if request was successfully sent
+ static bool initiateRequest(const LLSD& content);
+
+private:
+ static clock_t sLastUpdate;
+ static clock_t UPDATE_WAIT_SECONDS;
+};
+
+class LLEnvironmentApplyResponder: public LLHTTPClient::Responder
+{
+ LOG_CLASS(LLEnvironmentApplyResponder);
+public:
+ /*
+ * Expecting reply from sim in form of:
+ * {
+ * regionID : uuid,
+ * messageID: uuid,
+ * success : true
+ * }
+ * or
+ * {
+ * regionID : uuid,
+ * success : false,
+ * fail_reason : string
+ * }
+ */
+ virtual void result(const LLSD& content);
+
+ virtual void error(U32 status, const std::string& reason); // non-200 errors only
+
+private:
+ friend class LLEnvironmentApply;
+
+ LLEnvironmentApplyResponder() {}
+};
+
+#endif // LL_LLWLHANDLERS_H
diff --git a/indra/newview/llwlparammanager.cpp b/indra/newview/llwlparammanager.cpp
index 848efcbb49..55608a059f 100644
--- a/indra/newview/llwlparammanager.cpp
+++ b/indra/newview/llwlparammanager.cpp
@@ -37,23 +37,29 @@
#include "llspinctrl.h"
#include "llcheckboxctrl.h"
#include "lluictrlfactory.h"
+#include "llviewercamera.h"
#include "llcombobox.h"
#include "lllineeditor.h"
#include "llsdserialize.h"
#include "v4math.h"
+#include "llviewerdisplay.h"
#include "llviewercontrol.h"
+#include "llviewerwindow.h"
+#include "lldrawpoolwater.h"
+#include "llagent.h"
+#include "llviewerregion.h"
+#include "lldaycyclemanager.h"
+#include "llenvmanager.h"
#include "llwlparamset.h"
#include "llpostprocess.h"
-#include "llfloaterwindlight.h"
-#include "llfloaterdaycycle.h"
-#include "llfloaterenvsettings.h"
-#include "curl/curl.h"
+#include "llviewershadermgr.h"
+#include "llglslshader.h"
-LLWLParamManager * LLWLParamManager::sInstance = NULL;
-static LLFastTimer::DeclareTimer FTM_UPDATE_WLPARAM("Update Windlight Params");
+#include "curl/curl.h"
+#include "llstreamtools.h"
LLWLParamManager::LLWLParamManager() :
@@ -96,161 +102,237 @@ LLWLParamManager::~LLWLParamManager()
{
}
-void LLWLParamManager::loadPresets(const std::string& file_name)
+void LLWLParamManager::clearParamSetsOfScope(LLWLParamKey::EScope scope)
{
- std::string path_name(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight/skies", ""));
- LL_DEBUGS2("AppInit", "Shaders") << "Loading Default WindLight settings from " << path_name << LL_ENDL;
-
- bool found = true;
- LLDirIterator app_settings_iter(path_name, "*.xml");
- while(found)
+ if (LLWLParamKey::SCOPE_LOCAL == scope)
{
- std::string name;
- found = app_settings_iter.next(name);
- if(found)
- {
-
- name=name.erase(name.length()-4);
-
- // bugfix for SL-46920: preventing filenames that break stuff.
- char * curl_str = curl_unescape(name.c_str(), name.size());
- std::string unescaped_name(curl_str);
- curl_free(curl_str);
- curl_str = NULL;
+ LL_WARNS("Windlight") << "Tried to clear windlight sky presets from local system! This shouldn't be called..." << LL_ENDL;
+ return;
+ }
- LL_DEBUGS2("AppInit", "Shaders") << "name: " << name << LL_ENDL;
- loadPreset(unescaped_name,FALSE);
+ std::set<LLWLParamKey> to_remove;
+ for(std::map<LLWLParamKey, LLWLParamSet>::iterator iter = mParamList.begin(); iter != mParamList.end(); ++iter)
+ {
+ if(iter->first.scope == scope)
+ {
+ to_remove.insert(iter->first);
}
}
- // And repeat for user presets, note the user presets will modify any system presets already loaded
+ for(std::set<LLWLParamKey>::iterator iter = to_remove.begin(); iter != to_remove.end(); ++iter)
+ {
+ mParamList.erase(*iter);
+ }
+}
- std::string path_name2(gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight/skies", ""));
- LL_DEBUGS2("AppInit", "Shaders") << "Loading User WindLight settings from " << path_name2 << LL_ENDL;
-
- found = true;
- LLDirIterator user_settings_iter(path_name2, "*.xml");
- while(found)
+// returns all skies referenced by the day cycle, with their final names
+// side effect: applies changes to all internal structures!
+std::map<LLWLParamKey, LLWLParamSet> LLWLParamManager::finalizeFromDayCycle(LLWLParamKey::EScope scope)
+{
+ lldebugs << "mDay before finalizing:" << llendl;
{
- std::string name;
- found = user_settings_iter.next(name);
- if(found)
+ for (std::map<F32, LLWLParamKey>::iterator iter = mDay.mTimeMap.begin(); iter != mDay.mTimeMap.end(); ++iter)
{
- name=name.erase(name.length()-4);
+ LLWLParamKey& key = iter->second;
+ lldebugs << iter->first << "->" << key.name << llendl;
+ }
+ }
+
+ std::map<LLWLParamKey, LLWLParamSet> final_references;
- // bugfix for SL-46920: preventing filenames that break stuff.
- char * curl_str = curl_unescape(name.c_str(), name.size());
- std::string unescaped_name(curl_str);
- curl_free(curl_str);
- curl_str = NULL;
+ // Move all referenced to desired scope, renaming if necessary
+ // First, save skies referenced
+ std::map<LLWLParamKey, LLWLParamSet> current_references; // all skies referenced by the day cycle, with their current names
+ // guard against skies with same name and different scopes
+ std::set<std::string> inserted_names;
+ std::map<std::string, unsigned int> conflicted_names; // integer later used as a count, for uniquely renaming conflicts
- LL_DEBUGS2("AppInit", "Shaders") << "name: " << name << LL_ENDL;
- loadPreset(unescaped_name,FALSE);
+ LLWLDayCycle& cycle = mDay;
+ for(std::map<F32, LLWLParamKey>::iterator iter = cycle.mTimeMap.begin();
+ iter != cycle.mTimeMap.end();
+ ++iter)
+ {
+ LLWLParamKey& key = iter->second;
+ std::string desired_name = key.name;
+ replace_newlines_with_whitespace(desired_name); // already shouldn't have newlines, but just in case
+ if(inserted_names.find(desired_name) == inserted_names.end())
+ {
+ inserted_names.insert(desired_name);
}
+ else
+ {
+ // make exist in map
+ conflicted_names[desired_name] = 0;
+ }
+ current_references[key] = mParamList[key];
}
-}
+ // forget all old skies in target scope, and rebuild, renaming as needed
+ clearParamSetsOfScope(scope);
+ for(std::map<LLWLParamKey, LLWLParamSet>::iterator iter = current_references.begin(); iter != current_references.end(); ++iter)
+ {
+ const LLWLParamKey& old_key = iter->first;
-void LLWLParamManager::savePresets(const std::string & fileName)
-{
- //Nobody currently calls me, but if they did, then its reasonable to write the data out to the user's folder
- //and not over the RO system wide version.
+ std::string desired_name(old_key.name);
+ replace_newlines_with_whitespace(desired_name);
- LLSD paramsData(LLSD::emptyMap());
-
- std::string pathName(gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight", fileName));
+ LLWLParamKey new_key(desired_name, scope); // name will be replaced later if necessary
- for(std::map<std::string, LLWLParamSet>::iterator mIt = mParamList.begin();
- mIt != mParamList.end();
- ++mIt)
- {
- paramsData[mIt->first] = mIt->second.getAll();
- }
+ // if this sky is one with a non-unique name, rename via appending a number
+ // an existing preset of the target scope gets to keep its name
+ if (scope != old_key.scope && conflicted_names.find(desired_name) != conflicted_names.end())
+ {
+ std::string& new_name = new_key.name;
- llofstream presetsXML(pathName);
+ do
+ {
+ // if this executes more than once, this is an absurdly pathological case
+ // (e.g. "x" repeated twice, but "x 1" already exists, so need to use "x 2")
+ std::stringstream temp;
+ temp << desired_name << " " << (++conflicted_names[desired_name]);
+ new_name = temp.str();
+ } while (inserted_names.find(new_name) != inserted_names.end());
- LLPointer<LLSDFormatter> formatter = new LLSDXMLFormatter();
+ // yay, found one that works
+ inserted_names.insert(new_name); // track names we consume here; shouldn't be necessary due to ++int? but just in case
- formatter->format(paramsData, presetsXML, LLSDFormatter::OPTIONS_PRETTY);
+ // *TODO factor out below into a rename()?
- presetsXML.close();
-}
+ LL_INFOS("Windlight") << "Renamed " << old_key.name << " (scope" << old_key.scope << ") to "
+ << new_key.name << " (scope " << new_key.scope << ")" << LL_ENDL;
-void LLWLParamManager::loadPreset(const std::string & name,bool propagate)
-{
-
- // bugfix for SL-46920: preventing filenames that break stuff.
- char * curl_str = curl_escape(name.c_str(), name.size());
- std::string escaped_filename(curl_str);
- curl_free(curl_str);
- curl_str = NULL;
+ // update name in sky
+ iter->second.mName = new_name;
- escaped_filename += ".xml";
+ // update keys in day cycle
+ for(std::map<F32, LLWLParamKey>::iterator frame = cycle.mTimeMap.begin(); frame != cycle.mTimeMap.end(); ++frame)
+ {
+ if (frame->second == old_key)
+ {
+ frame->second = new_key;
+ }
+ }
- std::string pathName(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight/skies", escaped_filename));
- LL_DEBUGS2("AppInit", "Shaders") << "Loading WindLight sky setting from " << pathName << LL_ENDL;
+ // add to master sky map
+ mParamList[new_key] = iter->second;
+ }
- llifstream presetsXML;
- presetsXML.open(pathName.c_str());
+ final_references[new_key] = iter->second;
+ }
- // That failed, try loading from the users area instead.
- if(!presetsXML)
+ lldebugs << "mDay after finalizing:" << llendl;
{
- pathName=gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight/skies", escaped_filename);
- LL_DEBUGS2("AppInit", "Shaders") << "Loading User WindLight sky setting from " << pathName << LL_ENDL;
- presetsXML.clear();
- presetsXML.open(pathName.c_str());
+ for (std::map<F32, LLWLParamKey>::iterator iter = mDay.mTimeMap.begin(); iter != mDay.mTimeMap.end(); ++iter)
+ {
+ LLWLParamKey& key = iter->second;
+ lldebugs << iter->first << "->" << key.name << llendl;
+ }
}
- if (presetsXML)
+ return final_references;
+}
+
+// static
+LLSD LLWLParamManager::createSkyMap(std::map<LLWLParamKey, LLWLParamSet> refs)
+{
+ LLSD skies = LLSD::emptyMap();
+ for(std::map<LLWLParamKey, LLWLParamSet>::iterator iter = refs.begin(); iter != refs.end(); ++iter)
{
- LLSD paramsData(LLSD::emptyMap());
+ skies.insert(iter->first.name, iter->second.getAll());
+ }
+ return skies;
+}
- LLPointer<LLSDParser> parser = new LLSDXMLParser();
+void LLWLParamManager::addAllSkies(const LLWLParamKey::EScope scope, const LLSD& sky_presets)
+{
+ for(LLSD::map_const_iterator iter = sky_presets.beginMap(); iter != sky_presets.endMap(); ++iter)
+ {
+ LLWLParamSet set;
+ set.setAll(iter->second);
+ mParamList[LLWLParamKey(iter->first, scope)] = set;
+ }
+}
- parser->parse(presetsXML, paramsData, LLSDSerialize::SIZE_UNLIMITED);
+void LLWLParamManager::refreshRegionPresets()
+{
+ // Remove all region sky presets because they may belong to a previously visited region.
+ clearParamSetsOfScope(LLEnvKey::SCOPE_REGION);
+
+ // Add all sky presets belonging to the current region.
+ addAllSkies(LLEnvKey::SCOPE_REGION, LLEnvManagerNew::instance().getRegionSettings().getSkyMap());
+}
+
+void LLWLParamManager::loadAllPresets()
+{
+ // First, load system (coming out of the box) sky presets.
+ loadPresetsFromDir(getSysDir());
- std::map<std::string, LLWLParamSet>::iterator mIt = mParamList.find(name);
- if(mIt == mParamList.end())
+ // Then load user presets. Note that user day presets will modify any system ones already loaded.
+ loadPresetsFromDir(getUserDir());
+}
+
+void LLWLParamManager::loadPresetsFromDir(const std::string& dir)
+{
+ LL_INFOS2("AppInit", "Shaders") << "Loading sky presets from " << dir << LL_ENDL;
+
+ LLDirIterator dir_iter(dir, "*.xml");
+ while (1)
+ {
+ std::string file;
+ if (!dir_iter.next(file))
{
- addParamSet(name, paramsData);
+ break; // no more files
}
- else
+
+ std::string path = dir + file;
+ if (!loadPreset(path))
{
- setParamSet(name, paramsData);
+ llwarns << "Error loading sky preset from " << path << llendl;
}
- presetsXML.close();
- }
- else
+ }
+}
+
+bool LLWLParamManager::loadPreset(const std::string& path)
+{
+ llifstream xml_file;
+ std::string name(gDirUtilp->getBaseFileName(LLURI::unescape(path), /*strip_exten = */ true));
+
+ xml_file.open(path.c_str());
+ if (!xml_file)
{
- llwarns << "Can't find " << name << llendl;
- return;
+ return false;
}
-
- if(propagate)
+ LL_DEBUGS2("AppInit", "Shaders") << "Loading sky " << name << LL_ENDL;
+
+ LLSD params_data;
+ LLPointer<LLSDParser> parser = new LLSDXMLParser();
+ parser->parse(xml_file, params_data, LLSDSerialize::SIZE_UNLIMITED);
+ xml_file.close();
+
+ LLWLParamKey key(name, LLEnvKey::SCOPE_LOCAL);
+ if (hasParamSet(key))
{
- getParamSet(name, mCurParams);
- propagateParameters();
+ setParamSet(key, params_data);
+ }
+ else
+ {
+ addParamSet(key, params_data);
}
-}
-void LLWLParamManager::savePreset(const std::string & name)
-{
- // bugfix for SL-46920: preventing filenames that break stuff.
- char * curl_str = curl_escape(name.c_str(), name.size());
- std::string escaped_filename(curl_str);
- curl_free(curl_str);
- curl_str = NULL;
+ return true;
+}
- escaped_filename += ".xml";
+void LLWLParamManager::savePreset(LLWLParamKey key)
+{
+ llassert(key.scope == LLEnvKey::SCOPE_LOCAL && !key.name.empty());
// make an empty llsd
LLSD paramsData(LLSD::emptyMap());
- std::string pathName(gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight/skies", escaped_filename));
+ std::string pathName(getUserDir() + escapeString(key.name) + ".xml");
// fill it with LLSD windlight params
- paramsData = mParamList[name].getAll();
+ paramsData = mParamList[key].getAll();
// write to file
llofstream presetsXML(pathName);
@@ -283,6 +365,8 @@ void LLWLParamManager::updateShaderUniforms(LLGLSLShader * shader)
}
+static LLFastTimer::DeclareTimer FTM_UPDATE_WLPARAM("Update Windlight Params");
+
void LLWLParamManager::propagateParameters(void)
{
LLFastTimer ftm(FTM_UPDATE_WLPARAM);
@@ -362,7 +446,7 @@ void LLWLParamManager::update(LLViewerCamera * cam)
mCurParams.updateCloudScrolling();
// update only if running
- if(mAnimator.mIsRunning)
+ if(mAnimator.getIsRunning())
{
mAnimator.update(mCurParams);
}
@@ -370,31 +454,16 @@ void LLWLParamManager::update(LLViewerCamera * cam)
// update the shaders and the menu
propagateParameters();
- // sync menus if they exist
- LLFloaterWindLight* wlfloater = LLFloaterReg::findTypedInstance<LLFloaterWindLight>("env_windlight");
- if (wlfloater)
- {
- wlfloater->syncMenu();
- }
- LLFloaterDayCycle* dlfloater = LLFloaterReg::findTypedInstance<LLFloaterDayCycle>("env_day_cycle");
- if (dlfloater)
- {
- dlfloater->syncMenu();
- }
- LLFloaterEnvSettings* envfloater = LLFloaterReg::findTypedInstance<LLFloaterEnvSettings>("env_settings");
- if (envfloater)
- {
- envfloater->syncMenu();
- }
-
F32 camYaw = cam->getYaw();
+ stop_glerror();
+
// *TODO: potential optimization - this block may only need to be
// executed some of the time. For example for water shaders only.
{
F32 camYawDelta = mSunDeltaYaw * DEG_TO_RAD;
- LLVector3 lightNorm3(mLightDir);
+ LLVector3 lightNorm3(mLightDir);
lightNorm3 *= LLQuaternion(-(camYaw + camYawDelta), LLVector3(0.f, 1.f, 0.f));
mRotatedLightDir = LLVector4(lightNorm3, 0.f);
@@ -412,17 +481,18 @@ void LLWLParamManager::update(LLViewerCamera * cam)
}
}
-// static
-void LLWLParamManager::initClass(void)
+bool LLWLParamManager::applyDayCycleParams(const LLSD& params, LLEnvKey::EScope scope, F32 time)
{
- instance();
+ mDay.loadDayCycle(params, scope);
+ resetAnimator(time, true); // set to specified time and start animator
+ return true;
}
-// static
-void LLWLParamManager::cleanupClass()
+bool LLWLParamManager::applySkyParams(const LLSD& params)
{
- delete sInstance;
- sInstance = NULL;
+ mAnimator.deactivate();
+ mCurParams.setAll(params);
+ return true;
}
void LLWLParamManager::resetAnimator(F32 curTime, bool run)
@@ -432,133 +502,227 @@ void LLWLParamManager::resetAnimator(F32 curTime, bool run)
return;
}
-bool LLWLParamManager::addParamSet(const std::string& name, LLWLParamSet& param)
+
+bool LLWLParamManager::addParamSet(const LLWLParamKey& key, LLWLParamSet& param)
{
// add a new one if not one there already
- std::map<std::string, LLWLParamSet>::iterator mIt = mParamList.find(name);
+ std::map<LLWLParamKey, LLWLParamSet>::iterator mIt = mParamList.find(key);
if(mIt == mParamList.end())
{
- mParamList[name] = param;
+ llassert(!key.name.empty());
+ // *TODO: validate params
+ mParamList[key] = param;
+ mPresetListChangeSignal();
return true;
}
return false;
}
-BOOL LLWLParamManager::addParamSet(const std::string& name, LLSD const & param)
+BOOL LLWLParamManager::addParamSet(const LLWLParamKey& key, LLSD const & param)
{
- // add a new one if not one there already
- std::map<std::string, LLWLParamSet>::const_iterator finder = mParamList.find(name);
- if(finder == mParamList.end())
- {
- mParamList[name].setAll(param);
- return TRUE;
- }
- else
- {
- return FALSE;
- }
+ LLWLParamSet param_set;
+ param_set.setAll(param);
+ return addParamSet(key, param_set);
}
-bool LLWLParamManager::getParamSet(const std::string& name, LLWLParamSet& param)
+bool LLWLParamManager::getParamSet(const LLWLParamKey& key, LLWLParamSet& param)
{
// find it and set it
- std::map<std::string, LLWLParamSet>::iterator mIt = mParamList.find(name);
+ std::map<LLWLParamKey, LLWLParamSet>::iterator mIt = mParamList.find(key);
if(mIt != mParamList.end())
{
- param = mParamList[name];
- param.mName = name;
+ param = mParamList[key];
+ param.mName = key.name;
return true;
}
return false;
}
-bool LLWLParamManager::setParamSet(const std::string& name, LLWLParamSet& param)
+bool LLWLParamManager::hasParamSet(const LLWLParamKey& key)
{
- mParamList[name] = param;
+ LLWLParamSet dummy;
+ return getParamSet(key, dummy);
+}
+
+bool LLWLParamManager::setParamSet(const LLWLParamKey& key, LLWLParamSet& param)
+{
+ llassert(!key.name.empty());
+ // *TODO: validate params
+ mParamList[key] = param;
return true;
}
-bool LLWLParamManager::setParamSet(const std::string& name, const LLSD & param)
+bool LLWLParamManager::setParamSet(const LLWLParamKey& key, const LLSD & param)
{
+ llassert(!key.name.empty());
+ // *TODO: validate params
+
// quick, non robust (we won't be working with files, but assets) check
+ // this might not actually be true anymore....
if(!param.isMap())
{
return false;
}
- mParamList[name].setAll(param);
-
- return true;
+ LLWLParamSet param_set;
+ param_set.setAll(param);
+ return setParamSet(key, param_set);
}
-bool LLWLParamManager::removeParamSet(const std::string& name, bool delete_from_disk)
+void LLWLParamManager::removeParamSet(const LLWLParamKey& key, bool delete_from_disk)
{
+ // *NOTE: Removing a sky preset invalidates day cycles that refer to it.
+
+ if (key.scope == LLEnvKey::SCOPE_REGION)
+ {
+ llwarns << "Removing region skies not supported" << llendl;
+ llassert(key.scope == LLEnvKey::SCOPE_LOCAL);
+ return;
+ }
+
// remove from param list
- std::map<std::string, LLWLParamSet>::iterator mIt = mParamList.find(name);
- if(mIt != mParamList.end())
+ std::map<LLWLParamKey, LLWLParamSet>::iterator it = mParamList.find(key);
+ if (it == mParamList.end())
{
- mParamList.erase(mIt);
+ LL_WARNS("WindLight") << "No sky preset named " << key.name << LL_ENDL;
+ return;
}
- F32 key;
+ mParamList.erase(it);
+ mDay.removeReferencesTo(key);
- // remove all references
- bool stat = true;
- do
+ // remove from file system if requested
+ if (delete_from_disk)
{
- // get it
- stat = mDay.getKey(name, key);
- if(stat == false)
+ std::string path_name(getUserDir());
+ std::string escaped_name = escapeString(key.name);
+
+ if(gDirUtilp->deleteFilesInDir(path_name, escaped_name + ".xml") < 1)
{
- break;
+ LL_WARNS("WindLight") << "Error removing sky preset " << key.name << " from disk" << LL_ENDL;
}
+ }
- // and remove
- stat = mDay.removeKey(key);
+ // signal interested parties
+ mPresetListChangeSignal();
+}
- } while(stat == true);
-
- if(delete_from_disk)
+bool LLWLParamManager::isSystemPreset(const std::string& preset_name) const
+{
+ // *TODO: file system access is excessive here.
+ return gDirUtilp->fileExists(getSysDir() + escapeString(preset_name) + ".xml");
+}
+
+void LLWLParamManager::getPresetNames(preset_name_list_t& region, preset_name_list_t& user, preset_name_list_t& sys) const
+{
+ region.clear();
+ user.clear();
+ sys.clear();
+
+ for (std::map<LLWLParamKey, LLWLParamSet>::const_iterator it = mParamList.begin(); it != mParamList.end(); it++)
{
- std::string path_name(gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight/skies", ""));
-
- // use full curl escaped name
- char * curl_str = curl_escape(name.c_str(), name.size());
- std::string escaped_name(curl_str);
- curl_free(curl_str);
- curl_str = NULL;
-
- gDirUtilp->deleteFilesInDir(path_name, escaped_name + ".xml");
- }
+ const LLWLParamKey& key = it->first;
+ const std::string& name = key.name;
- return true;
+ if (key.scope == LLEnvKey::SCOPE_REGION)
+ {
+ region.push_back(name);
+ }
+ else
+ {
+ if (isSystemPreset(name))
+ {
+ sys.push_back(name);
+ }
+ else
+ {
+ user.push_back(name);
+ }
+ }
+ }
}
+void LLWLParamManager::getUserPresetNames(preset_name_list_t& user) const
+{
+ preset_name_list_t region, sys; // unused
+ getPresetNames(region, user, sys);
+}
-// static
-LLWLParamManager * LLWLParamManager::instance()
+void LLWLParamManager::getPresetKeys(preset_key_list_t& keys) const
{
- if(NULL == sInstance)
+ keys.clear();
+
+ for (std::map<LLWLParamKey, LLWLParamSet>::const_iterator it = mParamList.begin(); it != mParamList.end(); it++)
{
- sInstance = new LLWLParamManager();
+ keys.push_back(it->first);
+ }
+}
+
+boost::signals2::connection LLWLParamManager::setPresetListChangeCallback(const preset_list_signal_t::slot_type& cb)
+{
+ return mPresetListChangeSignal.connect(cb);
+}
- sInstance->loadPresets(LLStringUtil::null);
+// virtual static
+void LLWLParamManager::initSingleton()
+{
+ LL_DEBUGS("Windlight") << "Initializing sky" << LL_ENDL;
+
+ loadAllPresets();
- // load the day
- sInstance->mDay.loadDayCycle(std::string("Default.xml"));
+ // load the day
+ std::string preferred_day = LLEnvManagerNew::instance().getDayCycleName();
+ if (!LLDayCycleManager::instance().getPreset(preferred_day, mDay))
+ {
+ // Fall back to default.
+ llwarns << "No day cycle named " << preferred_day << ", falling back to defaults" << llendl;
+ mDay.loadDayCycleFromFile("Default.xml");
- // *HACK - sets cloud scrolling to what we want... fix this better in the future
- sInstance->getParamSet("Default", sInstance->mCurParams);
+ // *TODO: Fix user preferences accordingly.
+ }
- // set it to noon
- sInstance->resetAnimator(0.5, true);
+ // *HACK - sets cloud scrolling to what we want... fix this better in the future
+ std::string sky = LLEnvManagerNew::instance().getSkyPresetName();
+ if (!getParamSet(LLWLParamKey(sky, LLWLParamKey::SCOPE_LOCAL), mCurParams))
+ {
+ llwarns << "No sky preset named " << sky << ", falling back to defaults" << llendl;
+ getParamSet(LLWLParamKey("Default", LLWLParamKey::SCOPE_LOCAL), mCurParams);
- // but use linden time sets it to what the estate is
- sInstance->mAnimator.mUseLindenTime = true;
+ // *TODO: Fix user preferences accordingly.
}
- return sInstance;
+ // set it to noon
+ resetAnimator(0.5, LLEnvManagerNew::instance().getUseDayCycle());
+
+ // but use linden time sets it to what the estate is
+ mAnimator.setTimeType(LLWLAnimator::TIME_LINDEN);
+
+ LLEnvManagerNew::instance().usePrefs();
+}
+
+// static
+std::string LLWLParamManager::getSysDir()
+{
+ return gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight/skies", "");
+}
+
+// static
+std::string LLWLParamManager::getUserDir()
+{
+ return gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS , "windlight/skies", "");
+}
+
+// static
+std::string LLWLParamManager::escapeString(const std::string& str)
+{
+ // Don't use LLURI::escape() because it doesn't encode '-' characters
+ // which may break handling of some system presets like "A-12AM".
+ char* curl_str = curl_escape(str.c_str(), str.size());
+ std::string escaped_str(curl_str);
+ curl_free(curl_str);
+
+ return escaped_str;
}
diff --git a/indra/newview/llwlparammanager.h b/indra/newview/llwlparammanager.h
index 8c6329e769..bc984b9126 100644
--- a/indra/newview/llwlparammanager.h
+++ b/indra/newview/llwlparammanager.h
@@ -27,12 +27,14 @@
#ifndef LL_WLPARAMMANAGER_H
#define LL_WLPARAMMANAGER_H
-#include <vector>
+#include <list>
#include <map>
+#include "llenvmanager.h"
#include "llwlparamset.h"
#include "llwlanimator.h"
#include "llwldaycycle.h"
#include "llviewercamera.h"
+#include "lltrans.h"
class LLGLSLShader;
@@ -72,7 +74,7 @@ struct WLColorControl {
r = val.mV[0];
g = val.mV[1];
b = val.mV[2];
- i = val.mV[3];
+ i = val.mV[3];
return *this;
}
@@ -115,25 +117,112 @@ struct WLFloatControl {
}
};
-/// WindLight parameter manager class - what controls all the wind light shaders
-class LLWLParamManager
+struct LLWLParamKey : LLEnvKey
{
public:
+ // scope and source of a param set (WL sky preset)
+ std::string name;
+ EScope scope;
- LLWLParamManager();
- ~LLWLParamManager();
+ // for conversion from LLSD
+ static const int NAME_IDX = 0;
+ static const int SCOPE_IDX = 1;
+
+ inline LLWLParamKey(const std::string& n, EScope s)
+ : name(n), scope(s)
+ {
+ }
+
+ inline LLWLParamKey(LLSD llsd)
+ : name(llsd[NAME_IDX].asString()), scope(EScope(llsd[SCOPE_IDX].asInteger()))
+ {
+ }
+
+ inline LLWLParamKey() // NOT really valid, just so std::maps can return a default of some sort
+ : name(""), scope(SCOPE_LOCAL)
+ {
+ }
+
+ inline LLWLParamKey(std::string& stringVal)
+ {
+ size_t len = stringVal.length();
+ if (len > 0)
+ {
+ name = stringVal.substr(0, len - 1);
+ scope = (EScope) atoi(stringVal.substr(len - 1, len).c_str());
+ }
+ }
+
+ inline std::string toStringVal() const
+ {
+ std::stringstream str;
+ str << name << scope;
+ return str.str();
+ }
+
+ inline LLSD toLLSD() const
+ {
+ LLSD llsd = LLSD::emptyArray();
+ llsd.append(LLSD(name));
+ llsd.append(LLSD(scope));
+ return llsd;
+ }
+
+ inline void fromLLSD(const LLSD& llsd)
+ {
+ name = llsd[NAME_IDX].asString();
+ scope = EScope(llsd[SCOPE_IDX].asInteger());
+ }
+
+ inline bool operator <(const LLWLParamKey other) const
+ {
+ if (name < other.name)
+ {
+ return true;
+ }
+ else if (name > other.name)
+ {
+ return false;
+ }
+ else
+ {
+ return scope < other.scope;
+ }
+ }
+
+ inline bool operator ==(const LLWLParamKey other) const
+ {
+ return (name == other.name) && (scope == other.scope);
+ }
- /// load a preset file
- void loadPresets(const std::string & fileName);
+ inline std::string toString() const
+ {
+ switch (scope)
+ {
+ case SCOPE_LOCAL:
+ return name + std::string(" (") + LLTrans::getString("Local") + std::string(")");
+ break;
+ case SCOPE_REGION:
+ return name + std::string(" (") + LLTrans::getString("Region") + std::string(")");
+ break;
+ default:
+ return name + " (?)";
+ }
+ }
+};
- /// save the preset file
- void savePresets(const std::string & fileName);
+/// WindLight parameter manager class - what controls all the wind light shaders
+class LLWLParamManager : public LLSingleton<LLWLParamManager>
+{
+ LOG_CLASS(LLWLParamManager);
- /// load an individual preset into the sky
- void loadPreset(const std::string & name,bool propogate=true);
+public:
+ typedef std::list<std::string> preset_name_list_t;
+ typedef std::list<LLWLParamKey> preset_key_list_t;
+ typedef boost::signals2::signal<void()> preset_list_signal_t;
/// save the parameter presets to file
- void savePreset(const std::string & name);
+ void savePreset(const LLWLParamKey key);
/// Set shader uniforms dirty, so they'll update automatically.
void propagateParameters(void);
@@ -147,6 +236,12 @@ public:
/// update information camera dependent parameters
void update(LLViewerCamera * cam);
+ /// apply specified day cycle, setting time to noon by default
+ bool applyDayCycleParams(const LLSD& params, LLEnvKey::EScope scope, F32 time = 0.5);
+
+ /// apply specified fixed sky params
+ bool applySkyParams(const LLSD& params);
+
// get where the light is pointing
inline LLVector4 getLightDir(void) const;
@@ -161,36 +256,62 @@ public:
/// get the radius of the dome
inline F32 getDomeRadius(void) const;
-
- /// Perform global initialization for this class.
- static void initClass(void);
-
- // Cleanup of global data that's only inited once per class.
- static void cleanupClass();
- /// add a param to the list
- bool addParamSet(const std::string& name, LLWLParamSet& param);
+ /// add a param set (preset) to the list
+ bool addParamSet(const LLWLParamKey& key, LLWLParamSet& param);
- /// add a param to the list
- BOOL addParamSet(const std::string& name, LLSD const & param);
+ /// add a param set (preset) to the list
+ BOOL addParamSet(const LLWLParamKey& key, LLSD const & param);
- /// get a param from the list
- bool getParamSet(const std::string& name, LLWLParamSet& param);
+ /// get a param set (preset) from the list
+ bool getParamSet(const LLWLParamKey& key, LLWLParamSet& param);
+
+ /// check whether the preset is in the list
+ bool hasParamSet(const LLWLParamKey& key);
/// set the param in the list with a new param
- bool setParamSet(const std::string& name, LLWLParamSet& param);
+ bool setParamSet(const LLWLParamKey& key, LLWLParamSet& param);
/// set the param in the list with a new param
- bool setParamSet(const std::string& name, LLSD const & param);
+ bool setParamSet(const LLWLParamKey& key, LLSD const & param);
/// gets rid of a parameter and any references to it
- /// returns true if successful
- bool removeParamSet(const std::string& name, bool delete_from_disk);
+ /// ignores "delete_from_disk" if the scope is not local
+ void removeParamSet(const LLWLParamKey& key, bool delete_from_disk);
- // singleton pattern implementation
- static LLWLParamManager * instance();
+ /// clear parameter mapping of a given scope
+ void clearParamSetsOfScope(LLEnvKey::EScope scope);
-public:
+ /// @return true if the preset comes out of the box
+ bool isSystemPreset(const std::string& preset_name) const;
+
+ /// @return user and system preset names as a single list
+ void getPresetNames(preset_name_list_t& region, preset_name_list_t& user, preset_name_list_t& sys) const;
+
+ /// @return user preset names
+ void getUserPresetNames(preset_name_list_t& user) const;
+
+ /// @return keys of all known presets
+ void getPresetKeys(preset_key_list_t& keys) const;
+
+ /// Emitted when a preset gets added or deleted.
+ boost::signals2::connection setPresetListChangeCallback(const preset_list_signal_t::slot_type& cb);
+
+ /// add all skies in LLSD using the given scope
+ void addAllSkies(LLEnvKey::EScope scope, const LLSD& preset_map);
+
+ /// refresh region-scope presets
+ void refreshRegionPresets();
+
+ // returns all skies referenced by the current day cycle (in mDay), with their final names
+ // side effect: applies changes to all internal structures! (trashes all unreferenced skies in scope, keys in day cycle rescoped to scope, etc.)
+ std::map<LLWLParamKey, LLWLParamSet> finalizeFromDayCycle(LLWLParamKey::EScope scope);
+
+ // returns all skies in map (intended to be called with output from a finalize)
+ static LLSD createSkyMap(std::map<LLWLParamKey, LLWLParamSet> map);
+
+ /// escape string in a way different from LLURI::escape()
+ static std::string escapeString(const std::string& str);
// helper variables
LLWLAnimator mAnimator;
@@ -243,14 +364,27 @@ public:
F32 mDomeOffset;
F32 mDomeRadius;
- // list of all the parameters, listed by name
- std::map<std::string, LLWLParamSet> mParamList;
-
-
+
private:
- // our parameter manager singleton instance
- static LLWLParamManager * sInstance;
+ friend class LLWLAnimator;
+
+ void loadAllPresets();
+ void loadPresetsFromDir(const std::string& dir);
+ bool loadPreset(const std::string& path);
+
+ static std::string getSysDir();
+ static std::string getUserDir();
+
+ friend class LLSingleton<LLWLParamManager>;
+ /*virtual*/ void initSingleton();
+ LLWLParamManager();
+ ~LLWLParamManager();
+
+ // list of all the parameters, listed by name
+ std::map<LLWLParamKey, LLWLParamSet> mParamList;
+
+ preset_list_signal_t mPresetListChangeSignal;
};
inline F32 LLWLParamManager::getDomeOffset(void) const
diff --git a/indra/newview/llwlparamset.cpp b/indra/newview/llwlparamset.cpp
index cf06766d73..02d914a812 100644
--- a/indra/newview/llwlparamset.cpp
+++ b/indra/newview/llwlparamset.cpp
@@ -29,8 +29,8 @@
#include "llwlparamset.h"
#include "llwlanimator.h"
-#include "llfloaterwindlight.h"
#include "llwlparammanager.h"
+#include "llglslshader.h"
#include "lluictrlfactory.h"
#include "llsliderctrl.h"
@@ -94,7 +94,7 @@ void LLWLParamSet::update(LLGLSLShader * shader) const
shader->uniform4fv(param, 1, val.mV);
}
- else
+ else // param is the uniform name
{
LLVector4 val;
@@ -119,7 +119,6 @@ void LLWLParamSet::update(LLGLSLShader * shader) const
val.mV[0] = i->second.asBoolean();
}
-
shader->uniform4fv(param, 1, val.mV);
}
}
@@ -260,7 +259,6 @@ void LLWLParamSet::setEastAngle(float val)
void LLWLParamSet::mix(LLWLParamSet& src, LLWLParamSet& dest, F32 weight)
{
// set up the iterators
- LLSD::map_iterator cIt = mParamValues.beginMap();
// keep cloud positions and coverage the same
/// TODO masking will do this later
@@ -273,55 +271,39 @@ void LLWLParamSet::mix(LLWLParamSet& src, LLWLParamSet& dest, F32 weight)
LLSD srcVal;
LLSD destVal;
- // do the interpolation for all the ones saved as vectors
- // skip the weird ones
- for(; cIt != mParamValues.endMap(); cIt++) {
+ // Iterate through values
+ for(LLSD::map_iterator iter = mParamValues.beginMap(); iter != mParamValues.endMap(); ++iter)
+ {
- // check params to make sure they're actually there
- if(src.mParamValues.has(cIt->first))
+ // If param exists in both src and dest, set the holder variables, otherwise skip
+ if(src.mParamValues.has(iter->first) && dest.mParamValues.has(iter->first))
{
- srcVal = src.mParamValues[cIt->first];
+ srcVal = src.mParamValues[iter->first];
+ destVal = dest.mParamValues[iter->first];
}
else
{
continue;
}
- if(dest.mParamValues.has(cIt->first))
+ if(iter->second.isReal()) // If it's a real, interpolate directly
{
- destVal = dest.mParamValues[cIt->first];
+ iter->second = srcVal.asReal() + ((destVal.asReal() - srcVal.asReal()) * weight);
}
- else
- {
- continue;
- }
-
- // skip if not a vector
- if(!cIt->second.isArray())
- {
- continue;
- }
-
- // only Real vectors allowed
- if(!cIt->second[0].isReal())
+ else if(iter->second.isArray() && iter->second[0].isReal() // If it's an array of reals, loop through the reals and interpolate on those
+ && iter->second.size() == srcVal.size() && iter->second.size() == destVal.size())
{
- continue;
+ // Actually do interpolation: old value + (difference in values * factor)
+ for(int i=0; i < iter->second.size(); ++i)
+ {
+ // iter->second[i] = (1.f-weight)*(F32)srcVal[i].asReal() + weight*(F32)destVal[i].asReal(); // old way of doing it -- equivalent but one more operation
+ iter->second[i] = srcVal[i].asReal() + ((destVal[i].asReal() - srcVal[i].asReal()) * weight);
+ }
}
-
- // make sure all the same size
- if( cIt->second.size() != srcVal.size() ||
- cIt->second.size() != destVal.size())
+ else // Else, skip
{
continue;
- }
-
- // more error checking might be necessary;
-
- for(int i=0; i < cIt->second.size(); ++i)
- {
- cIt->second[i] = (1.0f - weight) * (F32) srcVal[i].asReal() +
- weight * (F32) destVal[i].asReal();
- }
+ }
}
// now mix the extra parameters
diff --git a/indra/newview/llwlparamset.h b/indra/newview/llwlparamset.h
index 487e2bf922..3c44ed3bb8 100644
--- a/indra/newview/llwlparamset.h
+++ b/indra/newview/llwlparamset.h
@@ -32,10 +32,9 @@
#include "v4math.h"
#include "v4color.h"
-#include "llviewershadermgr.h"
-class LLFloaterWindLight;
class LLWLParamSet;
+class LLGLSLShader;
/// A class representing a set of parameter values for the WindLight shaders.
class LLWLParamSet {
diff --git a/indra/newview/llworld.cpp b/indra/newview/llworld.cpp
index ec24b02934..4a6ec7fdbb 100644
--- a/indra/newview/llworld.cpp
+++ b/indra/newview/llworld.cpp
@@ -61,6 +61,7 @@
#include <map>
#include <cstring>
+
//
// Globals
//
@@ -91,8 +92,7 @@ LLWorld::LLWorld() :
mLastPacketsIn(0),
mLastPacketsOut(0),
mLastPacketsLost(0),
- mSpaceTimeUSec(0),
- mClassicCloudsEnabled(TRUE)
+ mSpaceTimeUSec(0)
{
for (S32 i = 0; i < 8; i++)
{
@@ -183,10 +183,6 @@ LLViewerRegion* LLWorld::addRegion(const U64 &region_handle, const LLHost &host)
llerrs << "Unable to create new region!" << llendl;
}
- regionp->mCloudLayer.create(regionp);
- regionp->mCloudLayer.setWidth((F32)mWidth);
- regionp->mCloudLayer.setWindPointer(&regionp->mWind);
-
mRegionList.push_back(regionp);
mActiveRegionList.push_back(regionp);
mCulledRegionList.push_back(regionp);
@@ -661,92 +657,6 @@ void LLWorld::updateParticles()
LLViewerPartSim::getInstance()->updateSimulation();
}
-void LLWorld::updateClouds(const F32 dt)
-{
- static LLFastTimer::DeclareTimer ftm("World Clouds");
- LLFastTimer t(ftm);
-
- if ( gSavedSettings.getBOOL("FreezeTime") )
- {
- // don't move clouds in snapshot mode
- return;
- }
-
- if (
- mClassicCloudsEnabled !=
- gSavedSettings.getBOOL("SkyUseClassicClouds") )
- {
- // The classic cloud toggle has been flipped
- // gotta update all of the cloud layers
- mClassicCloudsEnabled =
- gSavedSettings.getBOOL("SkyUseClassicClouds");
-
- if ( !mClassicCloudsEnabled && mActiveRegionList.size() )
- {
- // We've transitioned to having classic clouds disabled
- // reset all cloud layers.
- for (
- region_list_t::iterator iter = mActiveRegionList.begin();
- iter != mActiveRegionList.end();
- ++iter)
- {
- LLViewerRegion* regionp = *iter;
- regionp->mCloudLayer.reset();
- }
-
- return;
- }
- }
- else if ( !mClassicCloudsEnabled ) return;
-
- if (mActiveRegionList.size())
- {
- for (region_list_t::iterator iter = mActiveRegionList.begin();
- iter != mActiveRegionList.end(); ++iter)
- {
- LLViewerRegion* regionp = *iter;
- regionp->mCloudLayer.updatePuffs(dt);
- }
-
- // Reshuffle who owns which puffs
- for (region_list_t::iterator iter = mActiveRegionList.begin();
- iter != mActiveRegionList.end(); ++iter)
- {
- LLViewerRegion* regionp = *iter;
- regionp->mCloudLayer.updatePuffOwnership();
- }
-
- // Add new puffs
- for (region_list_t::iterator iter = mActiveRegionList.begin();
- iter != mActiveRegionList.end(); ++iter)
- {
- LLViewerRegion* regionp = *iter;
- regionp->mCloudLayer.updatePuffCount();
- }
- }
-}
-
-LLCloudGroup* LLWorld::findCloudGroup(const LLCloudPuff &puff)
-{
- if (mActiveRegionList.size())
- {
- // Update all the cloud puff positions, and timer based stuff
- // such as death decay
- for (region_list_t::iterator iter = mActiveRegionList.begin();
- iter != mActiveRegionList.end(); ++iter)
- {
- LLViewerRegion* regionp = *iter;
- LLCloudGroup *groupp = regionp->mCloudLayer.findCloudGroup(puff);
- if (groupp)
- {
- return groupp;
- }
- }
- }
- return NULL;
-}
-
-
void LLWorld::renderPropertyLines()
{
S32 region_count = 0;
diff --git a/indra/newview/llxmlrpclistener.cpp b/indra/newview/llxmlrpclistener.cpp
index 2596f239ca..97a9eb7f5f 100644
--- a/indra/newview/llxmlrpclistener.cpp
+++ b/indra/newview/llxmlrpclistener.cpp
@@ -499,6 +499,13 @@ private:
// 'array' as the value of this 'key'.
responses.insert(key, array);
}
+ else if (xmlrpc_type_struct == type)
+ {
+ LLSD submap = parseValues(status_string,
+ STRINGIZE(key_pfx << key << ':'),
+ current);
+ responses.insert(key, submap);
+ }
else
{
// whoops - unrecognized type
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index f64eb89866..2d61a049f7 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -392,6 +392,7 @@ void LLPipeline::init()
{
LLMemType mt(LLMemType::MTYPE_PIPELINE_INIT);
+ gOctreeMaxCapacity = gSavedSettings.getU32("OctreeMaxNodeCapacity");
sDynamicLOD = gSavedSettings.getBOOL("RenderDynamicLOD");
sRenderBump = gSavedSettings.getBOOL("RenderObjectBump");
sUseTriStrips = gSavedSettings.getBOOL("RenderUseTriStrips");
@@ -580,11 +581,6 @@ void LLPipeline::allocatePhysicsBuffer()
if (mPhysicsDisplay.getWidth() != resX || mPhysicsDisplay.getHeight() != resY)
{
mPhysicsDisplay.allocate(resX, resY, GL_RGBA, TRUE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE);
- if (mSampleBuffer.getWidth() == mPhysicsDisplay.getWidth() &&
- mSampleBuffer.getHeight() == mPhysicsDisplay.getHeight())
- {
- mPhysicsDisplay.setSampleBuffer(&mSampleBuffer);
- }
}
}
@@ -594,8 +590,9 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)
mScreenWidth = resX;
mScreenHeight = resY;
- //never use more than 4 samples for render targets
- U32 samples = llmin(gSavedSettings.getU32("RenderFSAASamples"), (U32) 4);
+ //cap samples at 4 for render targets to avoid out of memory errors
+ U32 samples = gGLManager.getNumFBOFSAASamples(gSavedSettings.getU32("RenderFSAASamples"));
+
if (gGLManager.mIsATI)
{ //disable multisampling of render targets where ATI is involved
samples = 0;
@@ -621,16 +618,22 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)
bool gi = LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_DEFERRED);
//allocate deferred rendering color buffers
- mDeferredScreen.allocate(resX, resY, GL_RGBA, TRUE, TRUE, LLTexUnit::TT_RECT_TEXTURE, FALSE);
- mDeferredDepth.allocate(resX, resY, 0, TRUE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE);
+ mDeferredScreen.allocate(resX, resY, GL_RGBA, TRUE, TRUE, LLTexUnit::TT_RECT_TEXTURE, FALSE, samples);
+ mDeferredDepth.allocate(resX, resY, 0, TRUE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE, samples);
addDeferredAttachments(mDeferredScreen);
- mScreen.allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE);
+ mScreen.allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE, samples);
+
+#if LL_DARWIN
+ // As of OS X 10.6.7, Apple doesn't support multiple color formats in a single FBO
+ mEdgeMap.allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE);
+#else
mEdgeMap.allocate(resX, resY, GL_ALPHA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE);
+#endif
if (shadow_detail > 0 || ssao)
{ //only need mDeferredLight[0] for shadows OR ssao
- mDeferredLight[0].allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE);
+ mDeferredLight[0].allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE);
}
else
{
@@ -639,7 +642,7 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)
if (ssao)
{ //only need mDeferredLight[1] for ssao
- mDeferredLight[1].allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE);
+ mDeferredLight[1].allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, false);
}
else
{
@@ -648,10 +651,15 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)
if (gi)
{ //only need mDeferredLight[2] and mGIMapPost for gi
- mDeferredLight[2].allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE);
+ mDeferredLight[2].allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, false);
for (U32 i = 0; i < 2; i++)
{
+#if LL_DARWIN
+ // As of OS X 10.6.7, Apple doesn't support multiple color formats in a single FBO
+ mGIMapPost[i].allocate(resX,resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE);
+#else
mGIMapPost[i].allocate(resX,resY, GL_RGB, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE);
+#endif
}
}
else
@@ -666,8 +674,12 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)
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
if (shadow_detail > 0)
{ //allocate 4 sun shadow maps
@@ -729,35 +741,9 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)
mScreen.allocate(resX, resY, GL_RGBA, TRUE, TRUE, LLTexUnit::TT_RECT_TEXTURE, FALSE);
}
- if (LLRenderTarget::sUseFBO && samples > 1)
- {
- mSampleBuffer.allocate(resX,resY,GL_RGBA,TRUE,TRUE,LLTexUnit::TT_RECT_TEXTURE,FALSE,samples);
- if (LLPipeline::sRenderDeferred)
- {
- addDeferredAttachments(mSampleBuffer);
- mDeferredScreen.setSampleBuffer(&mSampleBuffer);
- mEdgeMap.setSampleBuffer(&mSampleBuffer);
- }
-
- mScreen.setSampleBuffer(&mSampleBuffer);
-
- stop_glerror();
- }
- else
- {
- mSampleBuffer.release();
- }
-
if (LLPipeline::sRenderDeferred)
{ //share depth buffer between deferred targets
mDeferredScreen.shareDepthBuffer(mScreen);
- for (U32 i = 0; i < 3; i++)
- { //share stencil buffer with screen space lightmap to stencil out sky
- if (mDeferredLight[i].getTexture(0))
- {
- mDeferredScreen.shareDepthBuffer(mDeferredLight[i]);
- }
- }
}
gGL.getTexUnit(0)->disable();
@@ -787,16 +773,7 @@ void LLPipeline::updateRenderDeferred()
//static
void LLPipeline::refreshRenderDeferred()
{
- if(gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_PHYSICS_SHAPES))
- {
- //turn the deferred rendering and glow off when draw physics shapes.
- sRenderDeferred = FALSE ;
- sRenderGlow = FALSE ;
- }
- else
- {
- updateRenderDeferred() ;
- }
+ updateRenderDeferred();
}
void LLPipeline::releaseGLBuffers()
@@ -826,7 +803,6 @@ void LLPipeline::releaseGLBuffers()
mScreen.release();
mPhysicsDisplay.release();
mUIScreen.release();
- mSampleBuffer.release();
mDeferredScreen.release();
mDeferredDepth.release();
for (U32 i = 0; i < 3; i++)
@@ -2535,6 +2511,32 @@ void LLPipeline::markGLRebuild(LLGLUpdate* glu)
}
}
+void LLPipeline::markPartitionMove(LLDrawable* drawable)
+{
+ if (!drawable->isState(LLDrawable::PARTITION_MOVE) &&
+ !drawable->getPositionGroup().equals3(LLVector4a::getZero()))
+ {
+ drawable->setState(LLDrawable::PARTITION_MOVE);
+ mPartitionQ.push_back(drawable);
+ }
+}
+
+void LLPipeline::processPartitionQ()
+{
+ for (LLDrawable::drawable_list_t::iterator iter = mPartitionQ.begin(); iter != mPartitionQ.end(); ++iter)
+ {
+ LLDrawable* drawable = *iter;
+ if (!drawable->isDead())
+ {
+ drawable->updateBinRadius();
+ drawable->movePartition();
+ }
+ drawable->clearState(LLDrawable::PARTITION_MOVE);
+ }
+
+ mPartitionQ.clear();
+}
+
void LLPipeline::markRebuild(LLSpatialGroup* group, BOOL priority)
{
LLMemType mt(LLMemType::MTYPE_PIPELINE);
@@ -3595,7 +3597,7 @@ void LLPipeline::renderGeom(LLCamera& camera, BOOL forceVBOUpdate)
if (gDebugGL)
{
check_stack_depth(stack_depth);
- std::string msg = llformat("%s pass %d", gPoolNames[cur_type].c_str(), i);
+ std::string msg = llformat("pass %d", i);
LLGLState::checkStates(msg);
LLGLState::checkTextureChannels(msg);
LLGLState::checkClientArrays(msg);
@@ -4070,6 +4072,37 @@ void LLPipeline::renderDebug()
bool hud_only = hasRenderType(LLPipeline::RENDER_TYPE_HUD);
+ if (!hud_only && !mDebugBlips.empty())
+ { //render debug blips
+ glPointSize(8.f);
+ LLGLDepthTest depth(GL_TRUE, GL_TRUE, GL_ALWAYS);
+
+ gGL.begin(LLRender::POINTS);
+ for (std::list<DebugBlip>::iterator iter = mDebugBlips.begin(); iter != mDebugBlips.end(); )
+ {
+ DebugBlip& blip = *iter;
+
+ blip.mAge += gFrameIntervalSeconds;
+ if (blip.mAge > 2.f)
+ {
+ mDebugBlips.erase(iter++);
+ }
+ else
+ {
+ iter++;
+ }
+
+ blip.mPosition.mV[2] += gFrameIntervalSeconds*2.f;
+
+ gGL.color4fv(blip.mColor.mV);
+ gGL.vertex3fv(blip.mPosition.mV);
+ }
+ gGL.end();
+ gGL.flush();
+ glPointSize(1.f);
+ }
+
+
// Debug stuff.
for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin();
iter != LLWorld::getInstance()->getRegionList().end(); ++iter)
@@ -4101,63 +4134,6 @@ void LLPipeline::renderDebug()
}
}
- if (gSavedSettings.getBOOL("DebugShowUploadCost"))
- {
- std::set<LLUUID> textures;
- std::set<LLUUID> sculpts;
- std::set<LLUUID> meshes;
-
- BOOL selected = TRUE;
- if (LLSelectMgr::getInstance()->getSelection()->isEmpty())
- {
- selected = FALSE;
- }
-
- for (LLCullResult::sg_list_t::iterator iter = sCull->beginVisibleGroups(); iter != sCull->endVisibleGroups(); ++iter)
- {
- LLSpatialGroup* group = *iter;
- LLSpatialGroup::OctreeNode* node = group->mOctreeNode;
- for (LLSpatialGroup::OctreeNode::element_iter elem = node->getData().begin(); elem != node->getData().end(); ++elem)
- {
- LLDrawable* drawable = *elem;
- LLVOVolume* volume = drawable->getVOVolume();
- if (volume && volume->isSelected() == selected)
- {
- for (U32 i = 0; i < volume->getNumTEs(); ++i)
- {
- LLTextureEntry* te = volume->getTE(i);
- textures.insert(te->getID());
- }
-
- if (volume->isSculpted())
- {
- LLUUID sculpt_id = volume->getVolume()->getParams().getSculptID();
- if (volume->isMesh())
- {
- meshes.insert(sculpt_id);
- }
- else
- {
- sculpts.insert(sculpt_id);
- }
- }
- }
- }
- }
-
- gPipeline.mDebugTextureUploadCost = textures.size() * 10;
- gPipeline.mDebugSculptUploadCost = sculpts.size()*10;
-
- U32 mesh_cost = 0;
-
- for (std::set<LLUUID>::iterator iter = meshes.begin(); iter != meshes.end(); ++iter)
- {
- mesh_cost += gMeshRepo.getResourceCost(*iter)*10;
- }
-
- gPipeline.mDebugMeshUploadCost = mesh_cost;
- }
-
if (hasRenderDebugMask(LLPipeline::RENDER_DEBUG_SHADOW_FRUSTA))
{
LLVertexBuffer::unbind();
@@ -5904,7 +5880,6 @@ LLSpatialPartition* LLPipeline::getSpatialPartition(LLViewerObject* vobj)
return NULL;
}
-
void LLPipeline::resetVertexBuffers(LLDrawable* drawable)
{
if (!drawable || drawable->isDead())
@@ -6050,7 +6025,8 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)
{
LLMemType mt_ru(LLMemType::MTYPE_PIPELINE_RENDER_BLOOM);
if (!(gPipeline.canUseVertexShaders() &&
- sRenderGlow))
+ sRenderGlow) ||
+ (!sRenderDeferred && hasRenderDebugMask(LLPipeline::RENDER_DEBUG_PHYSICS_SHAPES)))
{
return;
}
@@ -6096,67 +6072,7 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)
gGL.setColorMask(true, true);
glClearColor(0,0,0,0);
-
- /*if (for_snapshot)
- {
- gGL.getTexUnit(0)->bind(&mGlow[1]);
- {
- //LLGLEnable stencil(GL_STENCIL_TEST);
- //glStencilFunc(GL_NOTEQUAL, 255, 0xFFFFFFFF);
- //glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
- //LLGLDisable blend(GL_BLEND);
-
- // If the snapshot is constructed from tiles, calculate which
- // tile we're in.
-
- //from LLViewerCamera::setPerpsective
- if (zoom_factor > 1.f)
- {
- int pos_y = subfield / llceil(zoom_factor);
- int pos_x = subfield - (pos_y*llceil(zoom_factor));
- F32 size = 1.f/zoom_factor;
-
- tc1.set(pos_x*size, pos_y*size);
- tc2 = tc1 + LLVector2(size,size);
- }
- else
- {
- tc2.set(1,1);
- }
-
- LLGLEnable blend(GL_BLEND);
- gGL.setSceneBlendType(LLRender::BT_ADD);
-
-
- gGL.begin(LLRender::TRIANGLE_STRIP);
- gGL.color4f(1,1,1,1);
- gGL.texCoord2f(tc1.mV[0], tc1.mV[1]);
- gGL.vertex2f(-1,-1);
-
- gGL.texCoord2f(tc1.mV[0], tc2.mV[1]);
- gGL.vertex2f(-1,1);
-
- gGL.texCoord2f(tc2.mV[0], tc1.mV[1]);
- gGL.vertex2f(1,-1);
-
- gGL.texCoord2f(tc2.mV[0], tc2.mV[1]);
- gGL.vertex2f(1,1);
-
- gGL.end();
-
- gGL.flush();
- gGL.setSceneBlendType(LLRender::BT_ALPHA);
- }
-
- gGL.flush();
- glMatrixMode(GL_PROJECTION);
- glPopMatrix();
- glMatrixMode(GL_MODELVIEW);
- glPopMatrix();
-
- return;
- }*/
-
+
{
{
LLFastTimer ftm(FTM_RENDER_BLOOM_FBO);
@@ -6180,11 +6096,8 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)
gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);
gGL.setSceneBlendType(LLRender::BT_ADD_WITH_ALPHA);
- gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
- gGL.getTexUnit(0)->disable();
- gGL.getTexUnit(0)->enable(LLTexUnit::TT_RECT_TEXTURE);
- gGL.getTexUnit(0)->bind(&mScreen);
-
+ mScreen.bindTexture(0, 0);
+
gGL.color4f(1,1,1,1);
gPipeline.enableLightsFullbright(LLColor4(1,1,1,1));
gGL.begin(LLRender::TRIANGLE_STRIP);
@@ -6199,7 +6112,7 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)
gGL.end();
- gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE);
+ gGL.getTexUnit(0)->unbind(mScreen.getUsage());
mGlow[2].flush();
}
@@ -6227,7 +6140,6 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)
for (S32 i = 0; i < kernel; i++)
{
- gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
{
LLFastTimer ftm(FTM_RENDER_BLOOM_FBO);
mGlow[i%2].bindTarget();
@@ -6288,9 +6200,9 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)
LLVertexBuffer::unbind();
- if (LLPipeline::sRenderDeferred && !LLViewerCamera::getInstance()->cameraUnderWater())
+ if (LLPipeline::sRenderDeferred)
{
- bool dof_enabled = true;
+ bool dof_enabled = !LLViewerCamera::getInstance()->cameraUnderWater();
LLGLSLShader* shader = &gDeferredPostProgram;
if (LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_DEFERRED) > 2)
@@ -6298,7 +6210,7 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)
shader = &gDeferredGIFinalProgram;
dof_enabled = false;
}
- else if (LLToolMgr::getInstance()->inBuildMode() || !gSavedSettings.getBOOL("RenderDepthOfField"))
+ 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;
@@ -6420,11 +6332,10 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)
shader->uniform1f("magnification", magnification);
}
- S32 channel = shader->enableTexture(LLViewerShaderMgr::DEFERRED_DIFFUSE, LLTexUnit::TT_RECT_TEXTURE);
+ S32 channel = shader->enableTexture(LLViewerShaderMgr::DEFERRED_DIFFUSE, mScreen.getUsage());
if (channel > -1)
{
mScreen.bindTexture(0, channel);
- gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_BILINEAR);
}
//channel = shader->enableTexture(LLViewerShaderMgr::DEFERRED_DEPTH, LLTexUnit::TT_RECT_TEXTURE);
//if (channel > -1)
@@ -6517,6 +6428,8 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)
if (hasRenderDebugMask(LLPipeline::RENDER_DEBUG_PHYSICS_SHAPES))
{
+ gGL.setColorMask(true, false);
+
LLVector2 tc1(0,0);
LLVector2 tc2((F32) gViewerWindow->getWorldViewWidthRaw()*2,
(F32) gViewerWindow->getWorldViewHeightRaw()*2);
@@ -6563,25 +6476,23 @@ void LLPipeline::bindDeferredShader(LLGLSLShader& shader, U32 light_index, LLRen
noise_map = mNoiseMap;
}
- LLGLState::checkTextureChannels();
-
shader.bind();
S32 channel = 0;
- channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_DIFFUSE, LLTexUnit::TT_RECT_TEXTURE);
+ channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_DIFFUSE, mDeferredScreen.getUsage());
if (channel > -1)
{
mDeferredScreen.bindTexture(0,channel);
gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_POINT);
}
- channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_SPECULAR, LLTexUnit::TT_RECT_TEXTURE);
+ channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_SPECULAR, mDeferredScreen.getUsage());
if (channel > -1)
{
mDeferredScreen.bindTexture(1, channel);
gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_POINT);
}
- channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_NORMAL, LLTexUnit::TT_RECT_TEXTURE);
+ channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_NORMAL, mDeferredScreen.getUsage());
if (channel > -1)
{
mDeferredScreen.bindTexture(2, channel);
@@ -6704,22 +6615,16 @@ void LLPipeline::bindDeferredShader(LLGLSLShader& shader, U32 light_index, LLRen
shader.uniformMatrix4fv("gi_norm_mat", 1, FALSE, mGINormalMatrix.m);
}
}
-
- /*channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_POSITION, LLTexUnit::TT_RECT_TEXTURE);
- if (channel > -1)
- {
- mDeferredScreen.bindTexture(3, channel);
- }*/
+ stop_glerror();
- channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_DEPTH, LLTexUnit::TT_RECT_TEXTURE);
+ channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_DEPTH, mDeferredDepth.getUsage());
if (channel > -1)
{
gGL.getTexUnit(channel)->bind(&mDeferredDepth, TRUE);
- gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_POINT);
stop_glerror();
- glTexParameteri(LLTexUnit::getInternalType(mDeferredDepth.getUsage()), GL_TEXTURE_COMPARE_MODE_ARB, GL_NONE);
- glTexParameteri(LLTexUnit::getInternalType(mDeferredDepth.getUsage()), GL_DEPTH_TEXTURE_MODE_ARB, GL_ALPHA);
+ //glTexParameteri(LLTexUnit::getInternalType(mDeferredDepth.getUsage()), GL_TEXTURE_COMPARE_MODE_ARB, GL_NONE);
+ //glTexParameteri(LLTexUnit::getInternalType(mDeferredDepth.getUsage()), GL_DEPTH_TEXTURE_MODE_ARB, GL_ALPHA);
stop_glerror();
@@ -6748,7 +6653,7 @@ void LLPipeline::bindDeferredShader(LLGLSLShader& shader, U32 light_index, LLRen
stop_glerror();
- channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_LIGHT, LLTexUnit::TT_RECT_TEXTURE);
+ channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_LIGHT, mDeferredLight[light_index].getUsage());
if (channel > -1)
{
mDeferredLight[light_index].bindTexture(0, channel);
@@ -6968,9 +6873,9 @@ void LLPipeline::renderDeferredLighting()
}
//ati doesn't seem to love actually using the stencil buffer on FBO's
- LLGLEnable stencil(GL_STENCIL_TEST);
- glStencilFunc(GL_EQUAL, 1, 0xFFFFFFFF);
- glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
+ LLGLDisable stencil(GL_STENCIL_TEST);
+ //glStencilFunc(GL_EQUAL, 1, 0xFFFFFFFF);
+ //glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
gGL.setColorMask(true, true);
@@ -7772,33 +7677,41 @@ void LLPipeline::setupSpotLight(LLGLSLShader& shader, LLDrawable* drawablep)
LLViewerTexture* img = volume->getLightTexture();
+ if (img == NULL)
+ {
+ img = LLViewerFetchedTexture::sWhiteImagep;
+ }
+
S32 channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_PROJECTION);
- if (channel > -1 && img)
+ if (channel > -1)
{
- gGL.getTexUnit(channel)->bind(img);
+ if (img)
+ {
+ gGL.getTexUnit(channel)->bind(img);
- F32 lod_range = logf(img->getWidth())/logf(2.f);
+ 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("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));
+ }
}
+
}
void LLPipeline::unbindDeferredShader(LLGLSLShader &shader)
{
stop_glerror();
- shader.disableTexture(LLViewerShaderMgr::DEFERRED_POSITION, LLTexUnit::TT_RECT_TEXTURE);
- shader.disableTexture(LLViewerShaderMgr::DEFERRED_NORMAL, LLTexUnit::TT_RECT_TEXTURE);
- shader.disableTexture(LLViewerShaderMgr::DEFERRED_DIFFUSE, LLTexUnit::TT_RECT_TEXTURE);
- shader.disableTexture(LLViewerShaderMgr::DEFERRED_SPECULAR, LLTexUnit::TT_RECT_TEXTURE);
- shader.disableTexture(LLViewerShaderMgr::DEFERRED_DEPTH, LLTexUnit::TT_RECT_TEXTURE);
- shader.disableTexture(LLViewerShaderMgr::DEFERRED_LIGHT, LLTexUnit::TT_RECT_TEXTURE);
+ 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, LLTexUnit::TT_RECT_TEXTURE);
- shader.disableTexture(LLViewerShaderMgr::DEFERRED_SUN_LIGHT, LLTexUnit::TT_RECT_TEXTURE);
- shader.disableTexture(LLViewerShaderMgr::DEFERRED_LOCAL_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);
@@ -7845,8 +7758,6 @@ void LLPipeline::unbindDeferredShader(LLGLSLShader &shader)
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
gGL.getTexUnit(0)->activate();
shader.unbind();
-
- LLGLState::checkTextureChannels();
}
inline float sgn(float a)
@@ -9394,6 +9305,11 @@ void LLPipeline::generateSunShadow(LLCamera& camera)
mShadow[i+4].flush();
}
}
+ else
+ { //no spotlight shadows
+ mShadowSpotLight[0] = mShadowSpotLight[1] = NULL;
+ }
+
if (!gSavedSettings.getBOOL("CameraOffset"))
{
@@ -9816,4 +9732,9 @@ void LLPipeline::clearRenderTypeMask(U32 type, ...)
}
}
+void LLPipeline::addDebugBlip(const LLVector3& position, const LLColor4& color)
+{
+ DebugBlip blip(position, color);
+ mDebugBlips.push_back(blip);
+}
diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h
index b35341b6d9..33844ab8ed 100644
--- a/indra/newview/pipeline.h
+++ b/indra/newview/pipeline.h
@@ -157,7 +157,8 @@ public:
void markGLRebuild(LLGLUpdate* glu);
void markRebuild(LLSpatialGroup* group, BOOL priority = FALSE);
void markRebuild(LLDrawable *drawablep, LLDrawable::EDrawableFlags flag = LLDrawable::REBUILD_ALL, BOOL priority = FALSE);
-
+ void markPartitionMove(LLDrawable* drawablep);
+
//get the object between start and end that's closest to start.
LLViewerObject* lineSegmentIntersectInWorld(const LLVector3& start, const LLVector3& end,
BOOL pick_transparent,
@@ -211,6 +212,7 @@ public:
void updateCull(LLCamera& camera, LLCullResult& result, S32 water_clip = 0, LLPlane* plane = NULL); //if water_clip is 0, ignore water plane, 1, cull to above plane, -1, cull to below plane
void createObjects(F32 max_dtime);
void createObject(LLViewerObject* vobj);
+ void processPartitionQ();
void updateGeom(F32 max_dtime);
void updateGL();
void rebuildPriorityGroups();
@@ -358,6 +360,8 @@ public:
static void updateRenderDeferred();
static void refreshRenderDeferred();
+ void addDebugBlip(const LLVector3& position, const LLColor4& color);
+
private:
void unloadShaders();
void addToQuickLookup( LLDrawPool* new_poolp );
@@ -525,7 +529,6 @@ public:
LLRenderTarget mEdgeMap;
LLRenderTarget mDeferredDepth;
LLRenderTarget mDeferredLight[3];
- LLMultisampleBuffer mSampleBuffer;
LLRenderTarget mGIMap;
LLRenderTarget mGIMapPost[2];
LLRenderTarget mLuminanceMap;
@@ -638,6 +641,9 @@ protected:
LLDrawable::drawable_list_t mBuildQ2; // non-priority
LLSpatialGroup::sg_vector_t mGroupQ1; //priority
LLSpatialGroup::sg_vector_t mGroupQ2; // non-priority
+
+ LLDrawable::drawable_list_t mPartitionQ; //drawables that need to update their spatial partition radius
+
bool mGroupQ2Locked;
bool mGroupQ1Locked;
@@ -727,6 +733,20 @@ public:
protected:
std::vector<LLFace*> mSelectedFaces;
+ class DebugBlip
+ {
+ public:
+ LLColor4 mColor;
+ LLVector3 mPosition;
+ F32 mAge;
+
+ DebugBlip(const LLVector3& position, const LLColor4& color)
+ : mColor(color), mPosition(position), mAge(0.f)
+ { }
+ };
+
+ std::list<DebugBlip> mDebugBlips;
+
LLPointer<LLViewerFetchedTexture> mFaceSelectImagep;
U32 mLightMask;
diff --git a/indra/newview/res/resource.h b/indra/newview/res/resource.h
index 28813be896..01d90da971 100644
--- a/indra/newview/res/resource.h
+++ b/indra/newview/res/resource.h
@@ -38,6 +38,7 @@
#define IDC_CURSOR5 154
#define IDI_LCD_LL_ICON 157
#define IDC_CURSOR6 158
+#define IDC_STATIC 1000
#define IDC_RADIO_56 1000
#define IDC_RADIO_128 1001
#define IDC_RADIO_256 1002
diff --git a/indra/newview/res/viewerRes.rc b/indra/newview/res/viewerRes.rc
index 5e8cee1f5f..a53dece422 100644
--- a/indra/newview/res/viewerRes.rc
+++ b/indra/newview/res/viewerRes.rc
@@ -7,7 +7,7 @@
//
// Generated from the TEXTINCLUDE 2 resource.
//
-#include "winres.h"
+#include "windows.h"
/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS
@@ -34,7 +34,7 @@ END
2 TEXTINCLUDE
BEGIN
- "#include ""winres.h""\r\n"
+ "#include ""windows.h""\r\n"
"\0"
END
@@ -62,12 +62,12 @@ IDI_LCD_LL_ICON ICON "icon1.ico"
// Dialog
//
-SPLASHSCREEN DIALOG 32, 32, 144, 34
+SPLASHSCREEN DIALOG 32, 32, 264, 34
STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE
FONT 8, "MS Sans Serif"
BEGIN
ICON IDI_LL_ICON,IDC_STATIC,7,7,20,20
- LTEXT "Loading Second Life...",666,36,13,91,8
+ LTEXT "Loading Second Life...",666,36,13,211,8
END
@@ -82,7 +82,7 @@ BEGIN
"SPLASHSCREEN", DIALOG
BEGIN
LEFTMARGIN, 7
- RIGHTMARGIN, 137
+ RIGHTMARGIN, 257
VERTGUIDE, 36
TOPMARGIN, 7
BOTTOMMARGIN, 27
diff --git a/indra/newview/skins/default/colors.xml b/indra/newview/skins/default/colors.xml
index d02662681b..76965ad14b 100644
--- a/indra/newview/skins/default/colors.xml
+++ b/indra/newview/skins/default/colors.xml
@@ -133,6 +133,15 @@
name="AvatarListItemIconVoiceLeftColor"
reference="AvatarListItemIconOfflineColor" />
<color
+ name="BadgeImageColor"
+ value="0.44 0.69 0.56 1.0" />
+ <color
+ name="BadgeBorderColor"
+ value="0.9 0.9 0.9 1.0" />
+ <color
+ name="BadgeLabelColor"
+ reference="White" />
+ <color
name="ButtonBorderColor"
reference="Unused?" />
<color
@@ -500,22 +509,22 @@
reference="DkGray2" />
<color
name="MultiSliderDisabledThumbColor"
- reference="Unused?" />
+ reference="Black" />
<color
name="MultiSliderThumbCenterColor"
- reference="Unused?" />
+ reference="White" />
<color
name="MultiSliderThumbCenterSelectedColor"
- reference="Unused?" />
+ reference="Green" />
<color
name="MultiSliderThumbOutlineColor"
reference="Unused?" />
<color
name="MultiSliderTrackColor"
- reference="Unused?" />
+ reference="LtGray" />
<color
name="MultiSliderTriangleColor"
- reference="Unused?" />
+ reference="Yellow" />
<!--
<color
name="NameTagBackground"
@@ -760,7 +769,7 @@
<color
name="MenuBarProjectBgColor"
reference="MdBlue" />
-
+
<color
name="MeshImportTableNormalColor"
value="1 1 1 1"/>
@@ -768,6 +777,9 @@
name="MeshImportTableHighlightColor"
value="0.2 0.8 1 1"/>
+ <color
+ name="DirectChatColor"
+ reference="LtOrange" />
<!-- Generic color names (legacy) -->
<color
diff --git a/indra/newview/skins/default/textures/icons/Edit_Wrench.png b/indra/newview/skins/default/textures/icons/Edit_Wrench.png
index 250697b4b1..edb40b9c96 100644
--- a/indra/newview/skins/default/textures/icons/Edit_Wrench.png
+++ b/indra/newview/skins/default/textures/icons/Edit_Wrench.png
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
new file mode 100644
index 0000000000..5afe85d72d
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Inv_Gift.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/OutboxPush_Disabled.png b/indra/newview/skins/default/textures/icons/OutboxPush_Disabled.png
new file mode 100644
index 0000000000..be58114aa1
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/OutboxPush_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/OutboxPush_Off.png b/indra/newview/skins/default/textures/icons/OutboxPush_Off.png
new file mode 100644
index 0000000000..e6b9480ab1
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/OutboxPush_Off.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/OutboxPush_On.png b/indra/newview/skins/default/textures/icons/OutboxPush_On.png
new file mode 100644
index 0000000000..ffda2e92d4
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/OutboxPush_On.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/OutboxPush_On_Over.png b/indra/newview/skins/default/textures/icons/OutboxPush_On_Over.png
new file mode 100644
index 0000000000..6b5911014f
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/OutboxPush_On_Over.png
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
new file mode 100644
index 0000000000..0e60b417b0
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/OutboxPush_On_Selected.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/OutboxPush_Over.png b/indra/newview/skins/default/textures/icons/OutboxPush_Over.png
new file mode 100644
index 0000000000..9c26b92e73
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/OutboxPush_Over.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/OutboxPush_Press.png b/indra/newview/skins/default/textures/icons/OutboxPush_Press.png
new file mode 100644
index 0000000000..3b5d462975
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/OutboxPush_Press.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/OutboxPush_Progress_1.png b/indra/newview/skins/default/textures/icons/OutboxPush_Progress_1.png
new file mode 100644
index 0000000000..f85be047b0
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/OutboxPush_Progress_1.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/OutboxPush_Progress_2.png b/indra/newview/skins/default/textures/icons/OutboxPush_Progress_2.png
new file mode 100644
index 0000000000..cd4e482216
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/OutboxPush_Progress_2.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/OutboxPush_Progress_3.png b/indra/newview/skins/default/textures/icons/OutboxPush_Progress_3.png
new file mode 100644
index 0000000000..d212a871ce
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/OutboxPush_Progress_3.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/OutboxPush_Progress_4.png b/indra/newview/skins/default/textures/icons/OutboxPush_Progress_4.png
new file mode 100644
index 0000000000..e5b6023e36
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/OutboxPush_Progress_4.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/OutboxPush_Progress_5.png b/indra/newview/skins/default/textures/icons/OutboxPush_Progress_5.png
new file mode 100644
index 0000000000..e1911a092f
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/OutboxPush_Progress_5.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/OutboxPush_Progress_6.png b/indra/newview/skins/default/textures/icons/OutboxPush_Progress_6.png
new file mode 100644
index 0000000000..9e59f7843a
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/OutboxPush_Progress_6.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/OutboxPush_Selected.png b/indra/newview/skins/default/textures/icons/OutboxPush_Selected.png
new file mode 100644
index 0000000000..51e8bff646
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/OutboxPush_Selected.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/OutboxPush_Selected_Disabled.png b/indra/newview/skins/default/textures/icons/OutboxPush_Selected_Disabled.png
new file mode 100644
index 0000000000..300e2e69e1
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/OutboxPush_Selected_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/OutboxPush_Selected_Over.png b/indra/newview/skins/default/textures/icons/OutboxPush_Selected_Over.png
new file mode 100644
index 0000000000..32fb236381
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/OutboxPush_Selected_Over.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/OutboxPush_Selected_Press.png b/indra/newview/skins/default/textures/icons/OutboxPush_Selected_Press.png
new file mode 100644
index 0000000000..827f343b1e
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/OutboxPush_Selected_Press.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Parcel_SeeAVsOff_Dark.png b/indra/newview/skins/default/textures/icons/Parcel_SeeAVsOff_Dark.png
new file mode 100644
index 0000000000..956e02b14d
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Parcel_SeeAVsOff_Dark.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Parcel_SeeAVsOff_Light.png b/indra/newview/skins/default/textures/icons/Parcel_SeeAVsOff_Light.png
new file mode 100644
index 0000000000..434caeda8b
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Parcel_SeeAVsOff_Light.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Parcel_SeeAVsOn_Dark.png b/indra/newview/skins/default/textures/icons/Parcel_SeeAVsOn_Dark.png
new file mode 100644
index 0000000000..064687ed0f
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Parcel_SeeAVsOn_Dark.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Parcel_SeeAVsOn_Light.png b/indra/newview/skins/default/textures/icons/Parcel_SeeAVsOn_Light.png
new file mode 100644
index 0000000000..5465650d0c
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Parcel_SeeAVsOn_Light.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Sync_Disabled.png b/indra/newview/skins/default/textures/icons/Sync_Disabled.png
new file mode 100644
index 0000000000..ca2e8def97
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Sync_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Sync_Enabled.png b/indra/newview/skins/default/textures/icons/Sync_Enabled.png
new file mode 100644
index 0000000000..bc236c8b98
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Sync_Enabled.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Sync_Progress_1.png b/indra/newview/skins/default/textures/icons/Sync_Progress_1.png
new file mode 100644
index 0000000000..624e556376
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Sync_Progress_1.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Sync_Progress_2.png b/indra/newview/skins/default/textures/icons/Sync_Progress_2.png
new file mode 100644
index 0000000000..5769803b3f
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Sync_Progress_2.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Sync_Progress_3.png b/indra/newview/skins/default/textures/icons/Sync_Progress_3.png
new file mode 100644
index 0000000000..92d4bfb020
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Sync_Progress_3.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Sync_Progress_4.png b/indra/newview/skins/default/textures/icons/Sync_Progress_4.png
new file mode 100644
index 0000000000..6d43eb3a9f
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Sync_Progress_4.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Sync_Progress_5.png b/indra/newview/skins/default/textures/icons/Sync_Progress_5.png
new file mode 100644
index 0000000000..766d063c99
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Sync_Progress_5.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Sync_Progress_6.png b/indra/newview/skins/default/textures/icons/Sync_Progress_6.png
new file mode 100644
index 0000000000..dfe7f68b72
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Sync_Progress_6.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index cc7cce99c9..799cd907dc 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -1,4 +1,4 @@
-<!--
+<!--
This file contains metadata about how to load, display, and scale textures for rendering in the UI.
Images do *NOT* have to appear in this file in order to use them as textures in the UI...simply refer
to them by filename (relative to textures directory).
@@ -72,8 +72,11 @@ with the same filename but different name
<texture name="BackButton_Over" file_name="icons/back_arrow_over.png" preload="false" scale.left="22" scale.top="12" scale.right="25" scale.bottom="12" />
<texture name="BackButton_Press" file_name="icons/back_arrow_press.png" preload="false" scale.left="22" scale.top="12" scale.right="25" scale.bottom="12" />
+ <texture name="Badge_Background" file_name="widgets/Badge_Background.png" preload="true" scale.left="9" scale.top="12" scale.right="248" scale.bottom="12" />
+ <texture name="Badge_Border" file_name="widgets/Badge_Border.png" preload="true" scale.left="9" scale.top="12" scale.right="248" scale.bottom="12" />
+
<texture name="Blank" file_name="Blank.png" preload="false" />
-
+
<texture name="BreadCrumbBtn_Left_Disabled" file_name="widgets/BreadCrumbBtn_Left_Disabled.png" preload="false"/>
<texture name="BreadCrumbBtn_Left_Off" file_name="widgets/BreadCrumbBtn_Left_Off.png" preload="false"/>
<texture name="BreadCrumbBtn_Left_Over" file_name="widgets/BreadCrumbBtn_Left_Over.png" preload="false"/>
@@ -88,7 +91,6 @@ with the same filename but different name
<texture name="BreadCrumbBtn_Right_Off" file_name="widgets/BreadCrumbBtn_Right_Off.png" preload="false"/>
<texture name="BreadCrumbBtn_Right_Over" file_name="widgets/BreadCrumbBtn_Right_Over.png" preload="false"/>
<texture name="BreadCrumbBtn_Right_Press" file_name="widgets/BreadCrumbBtn_Right_Press.png" preload="false"/>
-
<texture name="BuyArrow_Over" file_name="navbar/BuyArrow_Over.png" preload="true" scale.left="0" scale.top="1" scale.right="0" scale.bottom="0" />
<texture name="BuyArrow_Press" file_name="navbar/BuyArrow_Press.png" preload="true" scale.left="1" scale.top="1" scale.right="0" scale.bottom="0" />
@@ -266,6 +268,8 @@ with the same filename but different name
<texture name="Locked_Icon" file_name="icons/Locked_Icon.png" preload="false" />
+ <texture name="MarketplaceBtn_Off" file_name="widgets/MarketplaceBtn_Off.png" preload="true" scale.left="30" scale.top="19" scale.right="35" scale.bottom="4" />
+ <texture name="MarketplaceBtn_Selected" file_name="widgets/MarketplaceBtn_Selected.png" preload="true" scale.left="30" scale.top="19" scale.right="35" scale.bottom="4" />
<texture name="Microphone_On" file_name="icons/Microphone_On.png" preload="false" />
@@ -349,6 +353,23 @@ 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="PanOrbit_Off" file_name="bottomtray/PanOrbit_Off.png" preload="false" />
<texture name="Parcel_Exp_Color" file_name="icons/Parcel_Exp_Color.png" preload="false" />
@@ -369,6 +390,10 @@ with the same filename but different name
<texture name="Parcel_ScriptsNo_Dark" file_name="icons/Parcel_ScriptsNo_Dark.png" preload="false" />
<texture name="Parcel_Voice_Dark" file_name="icons/Parcel_Voice_Dark.png" preload="false" />
<texture name="Parcel_VoiceNo_Dark" file_name="icons/Parcel_VoiceNo_Dark.png" preload="false" />
+ <texture name="Parcel_SeeAVsOff_Dark" file_name="icons/Parcel_SeeAVsOff_Dark.png" preload="false" />
+ <texture name="Parcel_SeeAVsOn_Dark" file_name="icons/Parcel_SeeAVsOn_Dark.png" preload="false" />
+ <texture name="Parcel_SeeAVsOff_Light" file_name="icons/Parcel_SeeAVsOff_Light.png" preload="false" />
+ <texture name="Parcel_SeeAVsOn_Light" file_name="icons/Parcel_SeeAVsOn_Light.png" preload="false" />
<texture name="Parcel_BuildNo_Light" file_name="icons/Parcel_BuildNo_Light.png" preload="false" />
<texture name="Parcel_FlyNo_Light" file_name="icons/Parcel_FlyNo_Light.png" preload="false" />
@@ -496,6 +521,15 @@ with the same filename but different name
<texture name="StopReload_Off" file_name="icons/StopReload_Off.png" preload="false" />
<texture name="StopReload_Over" file_name="icons/StopReload_Over.png" preload="false" />
+ <texture name="Sync_Disabled" file_name="icons/Sync_Disabled.png" preload="true" />
+ <texture name="Sync_Enabled" file_name="icons/Sync_Enabled.png" preload="true" />
+ <texture name="Sync_Progress_1" file_name="icons/Sync_Progress_1.png" preload="true" />
+ <texture name="Sync_Progress_2" file_name="icons/Sync_Progress_2.png" preload="true" />
+ <texture name="Sync_Progress_3" file_name="icons/Sync_Progress_3.png" preload="true" />
+ <texture name="Sync_Progress_4" file_name="icons/Sync_Progress_4.png" preload="true" />
+ <texture name="Sync_Progress_5" file_name="icons/Sync_Progress_5.png" preload="true" />
+ <texture name="Sync_Progress_6" file_name="icons/Sync_Progress_6.png" preload="true" />
+
<texture name="TabIcon_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" />
@@ -649,6 +683,7 @@ with the same filename but different name
<texture name="inv_folder_mesh.tga"/>
<texture name="inv_item_mesh.tga"/>
+
<texture name="lag_status_critical.tga" />
<texture name="lag_status_good.tga" />
<texture name="lag_status_warning.tga" />
diff --git a/indra/newview/skins/default/textures/widgets/Badge_Background.png b/indra/newview/skins/default/textures/widgets/Badge_Background.png
new file mode 100644
index 0000000000..5089c30312
--- /dev/null
+++ b/indra/newview/skins/default/textures/widgets/Badge_Background.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/Badge_Border.png b/indra/newview/skins/default/textures/widgets/Badge_Border.png
new file mode 100644
index 0000000000..4b086a63fb
--- /dev/null
+++ b/indra/newview/skins/default/textures/widgets/Badge_Border.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/MarketplaceBtn_Off.png b/indra/newview/skins/default/textures/widgets/MarketplaceBtn_Off.png
new file mode 100644
index 0000000000..e603c44384
--- /dev/null
+++ b/indra/newview/skins/default/textures/widgets/MarketplaceBtn_Off.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/MarketplaceBtn_Selected.png b/indra/newview/skins/default/textures/widgets/MarketplaceBtn_Selected.png
new file mode 100644
index 0000000000..fbc164123f
--- /dev/null
+++ b/indra/newview/skins/default/textures/widgets/MarketplaceBtn_Selected.png
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 9b1df65d1b..0ccaab73ba 100644
--- a/indra/newview/skins/default/xui/da/floater_about.xml
+++ b/indra/newview/skins/default/xui/da/floater_about.xml
@@ -56,24 +56,30 @@ Tak til følgende beboere: Drew Dwi, Zai Lynch, Latif Khalifa, Ellla McMahon, Ha
<panel label="Licenser" 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.
+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.
-Alle rettigheder forbeholdes. Se licenses.txt for detaljer.
+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.
+
+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>
diff --git a/indra/newview/skins/default/xui/da/floater_about_land.xml b/indra/newview/skins/default/xui/da/floater_about_land.xml
index e78924a1ab..5b9e618666 100644
--- a/indra/newview/skins/default/xui/da/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/da/floater_about_land.xml
@@ -312,17 +312,17 @@ Kun større parceller kan vises i søgning.
</text>
<check_box label="Redigere terræn" name="edit land check" tool_tip="Hvis dette er valg, kan enhver redigere dit land. Det er bedst ikke at vælge her, da det altid er muligt for dig som ejer at ændre terræn på dit eget land."/>
<check_box label="Flyve" name="check fly" tool_tip="Hvis valgt, kan beboere flyve på dit land. Hvis ikke valgt kan beboere kun flyve ind på dit land og over dit land."/>
- <text left="194" name="allow_label2">
+ <text name="allow_label2">
Lave objekter:
</text>
<check_box label="Alle beboere" name="edit objects check"/>
<check_box label="Gruppe" name="edit group objects check"/>
- <text left="170" name="allow_label3">
+ <text name="allow_label3">
Anbringe objekter:
</text>
<check_box label="Alle beboere" name="all object entry check"/>
<check_box label="Gruppe" name="group object entry check"/>
- <text left="200" name="allow_label4">
+ <text name="allow_label4">
Køre scripts:
</text>
<check_box label="Alle beboere" name="check other scripts"/>
@@ -346,6 +346,7 @@ Kun større parceller kan vises i søgning.
<combo_box.item label="Parker &amp; natur" name="item9"/>
<combo_box.item label="Beboelse" name="item10"/>
<combo_box.item label="Indkøb" name="item11"/>
+ <combo_box.item label="Leje" name="item13"/>
<combo_box.item label="Andet" name="item12"/>
</combo_box>
<combo_box name="land category">
@@ -360,6 +361,7 @@ Kun større parceller kan vises i søgning.
<combo_box.item label="Parker &amp; natur" name="item9"/>
<combo_box.item label="Beboelse" name="item10"/>
<combo_box.item label="Indkøb" name="item11"/>
+ <combo_box.item label="Leje" name="item13"/>
<combo_box.item label="Andet" name="item12"/>
</combo_box>
<check_box label="Mature indhold" name="MatureCheck" tool_tip=""/>
@@ -426,7 +428,7 @@ Kun større parceller kan vises i søgning.
(Defineret via estate)
</panel.string>
<panel.string name="allow_public_access">
- Tillad adgang for alle ([MATURITY])
+ Tillad offentlig adgang ([MATURITY]) (Bemærk: Ellers oprettes blokeringslinier)
</panel.string>
<panel.string name="estate_override">
En eller flere af disse valg er indstillet på estate niveau
diff --git a/indra/newview/skins/default/xui/da/floater_beacons.xml b/indra/newview/skins/default/xui/da/floater_beacons.xml
index 8049b072ce..5100a6df1f 100644
--- a/indra/newview/skins/default/xui/da/floater_beacons.xml
+++ b/indra/newview/skins/default/xui/da/floater_beacons.xml
@@ -17,5 +17,6 @@
<check_box label="Kun berøring" name="touch_only"/>
<check_box label="Lydkilder" name="sounds"/>
<check_box label="Partikel kilder" name="particles"/>
+ <check_box label="Medie kilder" name="moapbeacon"/>
</panel>
</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_buy_contents.xml b/indra/newview/skins/default/xui/da/floater_buy_contents.xml
index c2b2ccc244..085fa2f9cc 100644
--- a/indra/newview/skins/default/xui/da/floater_buy_contents.xml
+++ b/indra/newview/skins/default/xui/da/floater_buy_contents.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_buy_contents" title="KØB INDHOLD">
<text name="contains_text">
- [NAME] indeholder:
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; contains:
</text>
<text name="buy_text">
Køb for L$[AMOUNT] fra [NAME]?
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 ec6ac5b2a8..ec47b2f445 100644
--- a/indra/newview/skins/default/xui/da/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/da/floater_buy_currency.xml
@@ -52,7 +52,8 @@
Indtast beløbet for at se nyeste valutakurs.
</text>
<text name="purchase_warning_repurchase">
- Bekræftelse af dette køb medfører kun køb af L$, ikke objektet.
+ Bekræftelse af dette køb medfører kun køb af L$, ikke
+objektet.
</text>
<text name="purchase_warning_notenough">
Du køber ikke nok L$. Forøg venligst beløbet.
diff --git a/indra/newview/skins/default/xui/da/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/da/floater_day_cycle_options.xml
deleted file mode 100644
index ffae3d788f..0000000000
--- a/indra/newview/skins/default/xui/da/floater_day_cycle_options.xml
+++ /dev/null
@@ -1,96 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Day Cycle Floater" title="DAG CYKLUS OPSÆTNING">
- <tab_container name="Day Cycle Tabs">
- <panel label="Dag cyklus" name="Day Cycle">
- <button label="?" name="WLDayCycleHelp"/>
- <multi_slider label="" name="WLTimeSlider"/>
- <multi_slider label="" name="WLDayCycleKeys"/>
- <text name="WL12am">
- 00:00
- </text>
- <text name="WL3am">
- 03:00
- </text>
- <text name="WL6am">
- 06:00
- </text>
- <text name="WL9amHash">
- 09:00
- </text>
- <text name="WL12pmHash">
- 12:00
- </text>
- <text name="WL3pm">
- 15:00
- </text>
- <text name="WL6pm">
- 18:00
- </text>
- <text name="WL9pm">
- 21:00
- </text>
- <text name="WL12am2">
- 00:00
- </text>
- <text name="WL12amHash">
- |
- </text>
- <text name="WL3amHash">
- I
- </text>
- <text name="WL6amHash">
- |
- </text>
- <text name="WL9amHash2">
- I
- </text>
- <text name="WL12pmHash2">
- |
- </text>
- <text name="WL3pmHash">
- I
- </text>
- <text name="WL6pmHash">
- |
- </text>
- <text name="WL9pmHash">
- I
- </text>
- <text name="WL12amHash2">
- |
- </text>
- <button label="Tilføj key" label_selected="Tilføj key" name="WLAddKey"/>
- <button label="Slet key" label_selected="Slet key" name="WLDeleteKey"/>
- <text name="WLCurKeyFrameText">
- Key-frame indstillinger:
- </text>
- <text name="WLCurKeyTimeText">
- Key tid:
- </text>
- <spinner label="Timer" name="WLCurKeyHour"/>
- <spinner label="Min." name="WLCurKeyMin"/>
- <text name="WLCurKeyTimeText2">
- Key fast indstilling:
- </text>
- <combo_box label="Faste" name="WLKeyPresets"/>
- <text name="DayCycleText">
- Snap:
- </text>
- <combo_box label="5 min" name="WLSnapOptions"/>
- <text name="DayCycleText2">
- Cycluslængde:
- </text>
- <spinner label="Timer" name="WLLengthOfDayHour"/>
- <spinner label="Min." name="WLLengthOfDayMin"/>
- <spinner label="Sek." name="WLLengthOfDaySec"/>
- <text name="DayCycleText3">
- Vis :
- </text>
- <button label="Afspil" label_selected="Afspil" name="WLAnimSky"/>
- <button label="Stop!" label_selected="Stop" name="WLStopAnimSky"/>
- <button label="Benyt estate tid" label_selected="GÃ¥ til estate tid" name="WLUseLindenTime"/>
- <button label="Gem test-dag" label_selected="Gem test-dag" name="WLSaveDayCycle"/>
- <button label="Hent test-dag" label_selected="Hent test-dag" name="WLLoadDayCycle"/>
- </panel>
- </tab_container>
-</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_env_settings.xml b/indra/newview/skins/default/xui/da/floater_env_settings.xml
deleted file mode 100644
index 8d9c05500b..0000000000
--- a/indra/newview/skins/default/xui/da/floater_env_settings.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Environment Editor Floater" title="REDIGERING AF OMGIVELSER">
- <floater.string name="timeStr">
- [hour12,datetime,utc]:[min,datetime,utc] [ampm,datetime,utc]
- </floater.string>
- <text name="EnvTimeText">
- Tid på dagen
- </text>
- <text name="EnvTimeText2">
- 00:00
- </text>
- <slider label="" name="EnvTimeSlider"/>
- <text name="EnvCloudText">
- Skydække
- </text>
- <slider label="" name="EnvCloudSlider"/>
- <text name="EnvWaterColorText">
- Farve på vand
- </text>
- <color_swatch label="" name="EnvWaterColor" tool_tip="Klik for at åbne farvevælger"/>
- <text name="EnvWaterFogText">
- Tåge på vand
- </text>
- <slider label="" name="EnvWaterFogSlider"/>
- <button label="Benyt tid fra estate" name="EnvUseEstateTimeButton"/>
- <button label="Avanceret himmel" name="EnvAdvancedSkyButton"/>
- <button label="Avanceret vand" name="EnvAdvancedWaterButton"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_import_collada.xml b/indra/newview/skins/default/xui/da/floater_import_collada.xml
new file mode 100644
index 0000000000..ebc7c86388
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/floater_import_collada.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Import Collada" title="Import Scene">
+ <text name="mesh count">
+ Meshes: [COUNT]
+ </text>
+ <text name="texture count">
+ Textures: [COUNT]
+ </text>
+ <text name="status">
+ Status: [STATUS]
+ </text>
+ <button label="Cancel" name="cancel"/>
+ <button label="OK" name="ok"/>
+ <string name="status_idle">
+ Idle
+ </string>
+ <string name="status_uploading">
+ Uploading [NAME]
+ </string>
+ <string name="status_creating">
+ Creating object [NAME]
+ </string>
+</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/da/floater_inventory_view_finder.xml
index af2910fe58..655701bb96 100644
--- a/indra/newview/skins/default/xui/da/floater_inventory_view_finder.xml
+++ b/indra/newview/skins/default/xui/da/floater_inventory_view_finder.xml
@@ -1,24 +1,25 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Inventory Finder" title="INVENTORY_RECENT_ITEMS">
- <check_box label="Animation" name="check_animation" />
- <check_box label="Visitkort" name="check_calling_card" />
- <check_box label="Tøj" name="check_clothing" />
- <check_box label="Bevægelser" name="check_gesture" />
- <check_box label="Landemærke" name="check_landmark" />
- <check_box label="Note" name="check_notecard" />
- <check_box label="Objekter" name="check_object" />
- <check_box label="Scripts" name="check_script" />
- <check_box label="Lyde" name="check_sound" />
- <check_box label="Teksturer" name="check_texture" />
- <check_box label="Foto&apos;s" name="check_snapshot" />
- <button label="Alle" label_selected="Alle" name="All" />
- <button label="Ingen" label_selected="Ingen" name="None" />
- <check_box label="Vis altid mapper" name="check_show_empty" />
- <check_box label="Siden sidste logoff" name="check_since_logoff" />
+ <check_box label="Animation" name="check_animation"/>
+ <check_box label="Visitkort" name="check_calling_card"/>
+ <check_box label="Tøj" name="check_clothing"/>
+ <check_box label="Bevægelser" name="check_gesture"/>
+ <check_box label="Landemærke" name="check_landmark"/>
+ <check_box label="Meshes" name="check_mesh"/>
+ <check_box label="Note" name="check_notecard"/>
+ <check_box label="Objekter" name="check_object"/>
+ <check_box label="Scripts" name="check_script"/>
+ <check_box label="Lyde" name="check_sound"/>
+ <check_box label="Teksturer" name="check_texture"/>
+ <check_box label="Foto&apos;s" name="check_snapshot"/>
+ <button label="Alle" label_selected="Alle" name="All"/>
+ <button label="Ingen" label_selected="Ingen" name="None"/>
+ <check_box label="Vis altid mapper" name="check_show_empty"/>
+ <check_box label="Siden sidste logoff" name="check_since_logoff"/>
<text name="- OR -">
- ELLER -
</text>
- <spinner label="Timer siden" name="spin_hours_ago" />
- <spinner label="Dage siden" name="spin_days_ago" />
- <button label="Luk" label_selected="Luk" name="Close" />
+ <spinner label="Timer siden" name="spin_hours_ago"/>
+ <spinner label="Dage siden" name="spin_days_ago"/>
+ <button label="Luk" label_selected="Luk" name="Close"/>
</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_map.xml b/indra/newview/skins/default/xui/da/floater_map.xml
index 5df9bb5f6e..4912d73ba0 100644
--- a/indra/newview/skins/default/xui/da/floater_map.xml
+++ b/indra/newview/skins/default/xui/da/floater_map.xml
@@ -3,6 +3,9 @@
<floater.string name="ToolTipMsg">
[REGION](Dobbeltklik for at åbne kort, klik-og-træk for at panorere)
</floater.string>
+ <floater.string name="AltToolTipMsg">
+ [REGION](Dobbeltklik for at teleportere, træk for at panorere)
+ </floater.string>
<floater.string name="mini_map_caption">
MINIKORT
</floater.string>
diff --git a/indra/newview/skins/default/xui/da/floater_model_preview.xml b/indra/newview/skins/default/xui/da/floater_model_preview.xml
new file mode 100644
index 0000000000..a98c70ff52
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/floater_model_preview.xml
@@ -0,0 +1,231 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Model Preview" title="Upload Model">
+ <string name="status_idle">
+ Idle
+ </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>
+ <string name="high">
+ High
+ </string>
+ <string name="medium">
+ Medium
+ </string>
+ <string name="low">
+ Low
+ </string>
+ <string name="lowest">
+ Lowest
+ </string>
+ <string name="mesh_status_good">
+ Ship it!
+ </string>
+ <string name="mesh_status_na">
+ N/A
+ </string>
+ <string name="mesh_status_none">
+ None
+ </string>
+ <string name="mesh_status_submesh_mismatch">
+ Levels of detail have a different number of textureable faces.
+ </string>
+ <string name="mesh_status_mesh_mismatch">
+ Levels of detail have a different number of mesh instances.
+ </string>
+ <string name="mesh_status_too_many_vertices">
+ Level of detail has too many vertices.
+ </string>
+ <string name="mesh_status_missing_lod">
+ Missing required level of detail.
+ </string>
+ <string name="layer_all">
+ All
+ </string>
+ <string name="decomposing">
+ Analyzing...
+ </string>
+ <string name="simplifying">
+ Simplifying...
+ </string>
+ <text name="name_label">
+ Name:
+ </text>
+ <text name="lod_label">
+ Preview:
+ </text>
+ <combo_box name="preview_lod_combo" tool_tip="LOD to view in preview render">
+ <combo_item name="high">
+ Level of Detail: High
+ </combo_item>
+ <combo_item name="medium">
+ Level of Detail: Medium
+ </combo_item>
+ <combo_item name="low">
+ Level of Detail: Low
+ </combo_item>
+ <combo_item name="lowest">
+ Level of Detail: Lowest
+ </combo_item>
+ </combo_box>
+ <panel>
+ <text name="streaming cost">
+ Resource Cost: [COST]
+ </text>
+ <text name="physics cost">
+ Physics Cost: [COST]
+ </text>
+ <text name="upload fee">
+ Upload Fee: N/A
+ </text>
+ </panel>
+ <text name="status">
+ [STATUS]
+ </text>
+ <button label="Defaults" name="reset_btn" tool_tip="Reset to defaults"/>
+ <button label="Upload" name="ok_btn" tool_tip="Upload to simulator"/>
+ <button label="Cancel" name="cancel_btn"/>
+ <tab_container name="import_tab">
+ <panel label="Level of Detail" name="lod_panel">
+ <text name="lod_table_header">
+ Select Level of Detail:
+ </text>
+ <text name="high_label" value="High"/>
+ <text name="high_triangles" value="0"/>
+ <text name="high_vertices" value="0"/>
+ <text name="medium_label" value="Medium"/>
+ <text name="medium_triangles" value="0"/>
+ <text name="medium_vertices" value="0"/>
+ <text name="low_label" value="Low"/>
+ <text name="low_triangles" value="0"/>
+ <text name="low_vertices" value="0"/>
+ <text name="lowest_label" value="Lowest"/>
+ <text name="lowest_triangles" value="0"/>
+ <text name="lowest_vertices" value="0"/>
+ <text name="lod_table_footer">
+ Level of Detail: [DETAIL]
+ </text>
+ <radio_group name="lod_file_or_limit" value="lod_from_file">
+ <radio_item label="Load from file" name="lod_from_file"/>
+ <radio_item label="Auto generate" name="lod_auto_generate"/>
+ <radio_item label="None" name="lod_none"/>
+ </radio_group>
+ <button label="Browse..." name="lod_browse"/>
+ <combo_box name="lod_mode">
+ <combo_item name="triangle_limit">
+ Triangle Limit
+ </combo_item>
+ <combo_item name="error_threshold">
+ Error Threshold
+ </combo_item>
+ </combo_box>
+ <text name="build_operator_text">
+ Build Operator:
+ </text>
+ <text name="queue_mode_text">
+ Queue Mode:
+ </text>
+ <combo_box name="build_operator">
+ <combo_item name="edge_collapse">
+ Edge Collapse
+ </combo_item>
+ <combo_item name="half_edge_collapse">
+ Half Edge Collapse
+ </combo_item>
+ </combo_box>
+ <combo_box name="queue_mode">
+ <combo_item name="greedy">
+ Greedy
+ </combo_item>
+ <combo_item name="lazy">
+ Lazy
+ </combo_item>
+ <combo_item name="independent">
+ Independent
+ </combo_item>
+ </combo_box>
+ <text name="border_mode_text">
+ Border Mode:
+ </text>
+ <text name="share_tolderance_text">
+ Share Tolerance:
+ </text>
+ <combo_box name="border_mode">
+ <combo_item name="border_unlock">
+ Unlock
+ </combo_item>
+ <combo_item name="border_lock">
+ Lock
+ </combo_item>
+ </combo_box>
+ <text name="crease_label">
+ Crease Angle:
+ </text>
+ <spinner name="crease_angle" value="75"/>
+ </panel>
+ <panel label="Physics" 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="Use Level of Detail:" name="physics_use_lod"/>
+ </radio_group>
+ <combo_box name="physics_lod_combo" tool_tip="LOD to use for physics shape">
+ <combo_item name="physics_lowest">
+ Lowest
+ </combo_item>
+ <combo_item name="physics_low">
+ Low
+ </combo_item>
+ <combo_item name="physics_medium">
+ Medium
+ </combo_item>
+ <combo_item name="physics_high">
+ High
+ </combo_item>
+ </combo_box>
+ <button label="Browse..." name="physics_browse"/>
+ </panel>
+ <panel name="physics analysis">
+ <slider label="Smooth:" name="Smooth"/>
+ <check_box label="Close Holes (slow)" name="Close Holes (Slow)"/>
+ <button label="Analyze" name="Decompose"/>
+ <button label="Cancel" name="decompose_cancel"/>
+ </panel>
+ <panel name="physics simplification">
+ <slider label="Passes:" name="Combine Quality"/>
+ <slider label="Detail Scale:" name="Detail Scale"/>
+ <slider label="Retain:" name="Retain%"/>
+ <button label="Simplify" name="Simplify"/>
+ <button label="Cancel" name="simplify_cancel"/>
+ </panel>
+ <panel name="physics info">
+ <slider label="Preview Spread:" name="physics_explode"/>
+ <text name="physics_triangles">
+ Triangles: [TRIANGLES]
+ </text>
+ <text name="physics_points">
+ Vertices: [POINTS]
+ </text>
+ <text name="physics_hulls">
+ Hulls: [HULLS]
+ </text>
+ </panel>
+ </panel>
+ <panel label="Modifiers" name="modifiers_panel">
+ <spinner name="import_scale" value="1.0"/>
+ <text name="import_dimensions">
+ [X] x [Y] x [Z] m
+ </text>
+ <check_box label="Textures" name="upload_textures"/>
+ <check_box label="Skin weight" name="upload_skin"/>
+ <check_box label="Joint positions" name="upload_joints"/>
+ <spinner name="pelvis_offset" value="0.0"/>
+ </panel>
+ </tab_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_model_wizard.xml b/indra/newview/skins/default/xui/da/floater_model_wizard.xml
new file mode 100644
index 0000000000..8ad443581a
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/floater_model_wizard.xml
@@ -0,0 +1,241 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Model Wizard" title="UPLOAD MODEL WIZARD">
+ <button label="5. Upload" name="upload_btn"/>
+ <button label="4. Review" name="review_btn"/>
+ <button label="3. Physics" name="physics2_btn"/>
+ <button label="3. Physics" name="physics_btn"/>
+ <button label="2. Optimize" name="optimize_btn"/>
+ <button label="1. Choose File" name="choose_file_btn"/>
+ <panel name="choose_file_panel">
+ <panel name="header_panel">
+ <text name="header_text">
+ Upload Model
+ </text>
+ </panel>
+ <text name="description">
+ This wizard will help you import mesh models to Second Life. First specify a file containing the model you wish to import. Second Life supports COLLADA (.dae) files.
+ </text>
+ <panel name="content">
+ <text name="Cache location">
+ Filename:
+ </text>
+ <button label="Browse..." label_selected="Browse..." name="browse"/>
+ <text name="dimensions">
+ X: Y: Z:
+ </text>
+ <text name="dimension_dividers">
+ | |
+ </text>
+ </panel>
+ </panel>
+ <panel name="optimize_panel">
+ <panel name="header_panel">
+ <text name="header_text">
+ Optimize
+ </text>
+ </panel>
+ <text name="description">
+ This wizard has optimized your model to improve performance. You may adjust the results of the optimization process bellow or click Next to continue.
+ </text>
+ <panel name="content">
+ <text name="high_detail_text">
+ Generate Level of Detail: High
+ </text>
+ <text name="medium_detail_text">
+ Generate Level of Detail: Medium
+ </text>
+ <text name="low_detail_text">
+ Generate Level of Detail: Low
+ </text>
+ <text name="lowest_detail_text">
+ Generate Level of Detail: Lowest
+ </text>
+ </panel>
+ <panel name="content2">
+ <text name="lod_label">
+ Model Preview:
+ </text>
+ <combo_box name="preview_lod_combo2" tool_tip="LOD to view in preview render">
+ <combo_item name="high">
+ High
+ </combo_item>
+ <combo_item name="medium">
+ Medium
+ </combo_item>
+ <combo_item name="low">
+ Low
+ </combo_item>
+ <combo_item name="lowest">
+ Lowest
+ </combo_item>
+ </combo_box>
+ <text name="streaming cost">
+ Resource Cost: [COST]
+ </text>
+ <text name="dimensions">
+ X: Y: Z:
+ </text>
+ <text name="dimension_dividers">
+ | |
+ </text>
+ </panel>
+ </panel>
+ <panel name="physics_panel">
+ <panel name="header_panel">
+ <text name="header_text">
+ Physics
+ </text>
+ </panel>
+ <text name="description">
+ The wizard will create a physical shape, which determines how the object interacts with other objects and avatars. Set the slider to the detail level most appropriate for how your object will be used:
+ </text>
+ <panel name="content">
+ <text name="streaming cost">
+ Resource Cost: [COST]
+ </text>
+ </panel>
+ </panel>
+ <panel name="physics2_panel">
+ <panel name="header_panel">
+ <text name="header_text">
+ Physics
+ </text>
+ </panel>
+ <text name="description">
+ Preview the physics shape below then click Next to continue. To modify the physics shape, click the Back button.
+ </text>
+ <panel name="content">
+ <text name="lod_label">
+ Model Preview:
+ </text>
+ <combo_box name="preview_lod_combo3" tool_tip="LOD to view in preview render">
+ <combo_item name="high">
+ High
+ </combo_item>
+ <combo_item name="medium">
+ Medium
+ </combo_item>
+ <combo_item name="low">
+ Low
+ </combo_item>
+ <combo_item name="lowest">
+ Lowest
+ </combo_item>
+ </combo_box>
+ <text name="dimensions">
+ X: Y: Z:
+ </text>
+ <text name="dimension_dividers">
+ | |
+ </text>
+ <text name="streaming cost">
+ Resource Cost: [COST]
+ </text>
+ </panel>
+ </panel>
+ <panel name="review_panel">
+ <panel name="header_panel">
+ <text name="header_text">
+ Review
+ </text>
+ </panel>
+ <text name="description">
+ Review the details below then click. Upload to upload your model. Your L$ balance will be charged when you click Upload.
+ </text>
+ <panel name="content">
+ <text name="lod_label">
+ Model Preview:
+ </text>
+ <combo_box name="preview_lod_combo" tool_tip="LOD to view in preview render">
+ <combo_item name="high">
+ High
+ </combo_item>
+ <combo_item name="medium">
+ Medium
+ </combo_item>
+ <combo_item name="low">
+ Low
+ </combo_item>
+ <combo_item name="lowest">
+ Lowest
+ </combo_item>
+ </combo_box>
+ <text name="dimensions">
+ X: Y: Z:
+ </text>
+ <text name="dimension_dividers">
+ | |
+ </text>
+ </panel>
+ <text name="streaming cost">
+ Resource Cost: [COST]
+ </text>
+ <text name="physics cost">
+ Physics Cost: [COST]
+ </text>
+ </panel>
+ <panel name="upload_panel">
+ <panel name="header_panel">
+ <text name="header_text">
+ Upload Complete!
+ </text>
+ </panel>
+ <text name="description">
+ Congratulations! Your model has been sucessfully uploaded. You will find the model in the Objects folder in your inventory.
+ </text>
+ </panel>
+ <button label="&lt;&lt; Back" name="back"/>
+ <button label="Next &gt;&gt;" name="next"/>
+ <button label="Upload" name="upload" tool_tip="Upload to simulator"/>
+ <button label="Cancel" name="cancel"/>
+ <button label="Close" name="close"/>
+ <spinner name="import_scale" value="1.0"/>
+ <string name="status_idle">
+ Idle
+ </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>
+ <string name="high">
+ High
+ </string>
+ <string name="medium">
+ Medium
+ </string>
+ <string name="low">
+ Low
+ </string>
+ <string name="lowest">
+ Lowest
+ </string>
+ <string name="mesh_status_good">
+ Ship it!
+ </string>
+ <string name="mesh_status_na">
+ N/A
+ </string>
+ <string name="mesh_status_none">
+ None
+ </string>
+ <string name="mesh_status_submesh_mismatch">
+ Levels of detail have a different number of textureable faces.
+ </string>
+ <string name="mesh_status_mesh_mismatch">
+ Levels of detail have a different number of mesh instances.
+ </string>
+ <string name="mesh_status_too_many_vertices">
+ Level of detail has too many vertices.
+ </string>
+ <string name="mesh_status_missing_lod">
+ Missing required level of detail.
+ </string>
+ <string name="layer_all">
+ All
+ </string>
+</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_price_for_listing.xml b/indra/newview/skins/default/xui/da/floater_price_for_listing.xml
new file mode 100644
index 0000000000..b091fa09b5
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/floater_price_for_listing.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="price_for_listing" title="PUBLISH CLASSIFIED AD">
+ <text name="explanation_text">
+ Din annonce vil løbe en uge fra udgivelsesdatoen.
+
+Placeringen af din annonce i listerne er afhængig af hvor meget du har valgt at betale.
+
+De annoncer der betales mest for vises øverst i lister og højere i søgeresultater.
+ </text>
+ <text name="price_text">
+ Pris for annonce:
+ </text>
+ <text name="price_symbol">
+ L$
+ </text>
+ <button label="OK" name="set_price_btn"/>
+ <button label="Annullér" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_settings_debug.xml b/indra/newview/skins/default/xui/da/floater_settings_debug.xml
index 016e5af378..f7eda56e48 100644
--- a/indra/newview/skins/default/xui/da/floater_settings_debug.xml
+++ b/indra/newview/skins/default/xui/da/floater_settings_debug.xml
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="settings_debug" title="DEBUG INDSTILLINGER">
<radio_group name="boolean_combo">
- <radio_item label="SANDT" name="TRUE" value="sand"/>
- <radio_item label="FALSK" name="FALSE" value=""/>
+ <radio_item label="SANDT" name="TRUE" />
+ <radio_item label="FALSK" name="FALSE" />
</radio_group>
<color_swatch label="Farve" name="val_color_swatch"/>
<spinner label="x" name="val_spinner_1"/>
diff --git a/indra/newview/skins/default/xui/da/floater_sound_devices.xml b/indra/newview/skins/default/xui/da/floater_sound_devices.xml
new file mode 100644
index 0000000000..cb4cbba570
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/floater_sound_devices.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_sound_devices" title="Lyd enheder">
+ <text name="voice_label">
+ Stemme chat
+ </text>
+ <check_box label="Aktiveret" name="enable_voice"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_tools.xml b/indra/newview/skins/default/xui/da/floater_tools.xml
index 9e673d0d5b..815bde456e 100644
--- a/indra/newview/skins/default/xui/da/floater_tools.xml
+++ b/indra/newview/skins/default/xui/da/floater_tools.xml
@@ -64,6 +64,8 @@
<radio_item label="Vælg overflade" name="radio select face"/>
</radio_group>
<check_box label="Redigér lænkede" name="checkbox edit linked parts"/>
+ <button label="Sammenkæd" name="link_btn"/>
+ <button label="Adskil" name="unlink_btn"/>
<text name="RenderingCost" tool_tip="Hvis beregnede rendering omkostninger for dette objekt">
þ: [COUNT]
</text>
@@ -120,6 +122,18 @@
<text name="prim_count">
Prims: [COUNT]
</text>
+ <text name="linked_set_count">
+ Lænkede sæt: [COUNT]
+ </text>
+ <text name="linked_set_cost" tool_tip="Pris for nuværende valgte lænkede sæt som [prims] / [physics complexity]">
+ Pris: [COST] / [PHYSICS]
+ </text>
+ <text name="object_count">
+ Objekter: [COUNT]
+ </text>
+ <text name="object_cost" tool_tip="Pris for nuværende valgte objekter som [prims] / [physics complexity]">
+ Pris: [COST] / [PHYSICS]
+ </text>
<tab_container name="Object Info Tabs">
<panel label="Generelt" name="General">
<panel.string name="text deed continued">
@@ -264,15 +278,6 @@
<combo_box.item label="Ring" name="Ring"/>
<combo_box.item label="Sculpted" name="Sculpted"/>
</combo_box>
- <combo_box name="material">
- <combo_box.item label="Sten" name="Stone"/>
- <combo_box.item label="Metal" name="Metal"/>
- <combo_box.item label="Glas" name="Glass"/>
- <combo_box.item label="Træ" name="Wood"/>
- <combo_box.item label="Kød" name="Flesh"/>
- <combo_box.item label="Plastik" name="Plastic"/>
- <combo_box.item label="Gummi" name="Rubber"/>
- </combo_box>
<text name="text cut">
Snit Z-akse (start/slut)
</text>
@@ -345,9 +350,19 @@
<combo_box.item label="Kuglering" name="Torus"/>
<combo_box.item label="Plan" name="Plane"/>
<combo_box.item label="Cylinder" name="Cylinder"/>
+ <combo_box.item label="Mesh" name="Mesh"/>
</combo_box>
</panel>
<panel label="Features" name="Features">
+ <panel.string name="None">
+ Ingen
+ </panel.string>
+ <panel.string name="Prim">
+ Prim
+ </panel.string>
+ <panel.string name="Convex Hull">
+ Konveks skrog
+ </panel.string>
<text name="select_single">
Vælg kun én prim for at ændre egenskaber.
</text>
@@ -372,6 +387,23 @@
<spinner label="Fokus" name="Light Focus"/>
<spinner label="Udfasning" name="Light Falloff"/>
<spinner label="Omgivelser" name="Light Ambiance"/>
+ <text name="label physicsshapetype">
+ Fysisk form type:
+ </text>
+ <combo_box name="Physics Shape Type Combo Ctrl" tool_tip="Vælg fysisk form type"/>
+ <combo_box name="material">
+ <combo_box.item label="Sten" name="Stone"/>
+ <combo_box.item label="Metal" name="Metal"/>
+ <combo_box.item label="Glas" name="Glass"/>
+ <combo_box.item label="Træ" name="Wood"/>
+ <combo_box.item label="Kød" name="Flesh"/>
+ <combo_box.item label="Plastik" name="Plastic"/>
+ <combo_box.item label="Gummi" name="Rubber"/>
+ </combo_box>
+ <spinner label="Tyngde" name="Physics Gravity"/>
+ <spinner label="Friktion" name="Physics Friction"/>
+ <spinner label="Tæthed" name="Physics Density"/>
+ <spinner label="Restitution" name="Physics Restitution"/>
</panel>
<panel label="Tekstur" name="Texture">
<panel.string name="string repeats per meter">
diff --git a/indra/newview/skins/default/xui/da/floater_water.xml b/indra/newview/skins/default/xui/da/floater_water.xml
deleted file mode 100644
index aedd1b442c..0000000000
--- a/indra/newview/skins/default/xui/da/floater_water.xml
+++ /dev/null
@@ -1,103 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Water Floater" title="AVANCERET OPSÆTNING AF VAND">
- <text name="KeyFramePresetsText">
- Vand opsætninger:
- </text>
- <button label="Ny" label_selected="Ny" name="WaterNewPreset"/>
- <button label="Gem" label_selected="Gem" name="WaterSavePreset"/>
- <button label="Slet" label_selected="Slet" name="WaterDeletePreset"/>
- <tab_container name="Water Tabs">
- <panel label="INDSTILLINGER" name="Settings">
- <text name="BHText">
- Vandtåge farve
- </text>
- <button label="?" name="WaterFogColorHelp"/>
- <color_swatch label="" name="WaterFogColor" tool_tip="Klik for at åbne farvevælger"/>
- <text name="WaterFogDensText">
- Tåge tæthedskarakteristik
- </text>
- <button label="?" name="WaterFogDensityHelp"/>
- <slider label="" name="WaterFogDensity"/>
- <text name="WaterUnderWaterFogModText">
- Tilretning undervandståge
- </text>
- <button label="?" name="WaterUnderWaterFogModHelp"/>
- <slider label="" name="WaterUnderWaterFogMod"/>
- <text name="BDensText">
- Lille bølge reflektionsskala
- </text>
- <button label="?" name="WaterNormalScaleHelp"/>
- <text name="BHText2">
- 1
- </text>
- <text name="BHText3">
- 2
- </text>
- <text name="BHText4">
- 3
- </text>
- <slider label="" name="WaterNormalScaleX"/>
- <slider label="" name="WaterNormalScaleY"/>
- <slider label="" name="WaterNormalScaleZ"/>
- <text name="HDText">
- Spredningsskala
- </text>
- <button label="?" name="WaterFresnelScaleHelp"/>
- <slider label="" name="WaterFresnelScale"/>
- <text name="FresnelOffsetText">
- Spredning offset
- </text>
- <button label="?" name="WaterFresnelOffsetHelp"/>
- <slider label="" name="WaterFresnelOffset"/>
- <text name="DensMultText">
- Lysbrydning fra oven
- </text>
- <button label="?" name="WaterScaleAboveHelp"/>
- <slider label="" name="WaterScaleAbove"/>
- <text name="WaterScaleBelowText">
- Lysbrydning fra neden
- </text>
- <button label="?" name="WaterScaleBelowHelp"/>
- <slider label="" name="WaterScaleBelow"/>
- <text name="MaxAltText">
- Udviskning
- </text>
- <button label="?" name="WaterBlurMultiplierHelp"/>
- <slider label="" name="WaterBlurMult"/>
- </panel>
- <panel label="BILLEDE" name="Waves">
- <text name="BHText">
- Retning for store bølger
- </text>
- <button label="?" name="WaterWave1Help"/>
- <text name="WaterWave1DirXText">
- X
- </text>
- <text name="WaterWave1DirYText">
- Y
- </text>
- <slider label="" name="WaterWave1DirX"/>
- <slider label="" name="WaterWave1DirY"/>
- <text name="BHText2">
- Retning for små bølger
- </text>
- <button label="?" name="WaterWave2Help"/>
- <text name="WaterWave2DirXText">
- X
- </text>
- <text name="WaterWave2DirYText">
- Y
- </text>
- <slider label="" name="WaterWave2DirX"/>
- <slider label="" name="WaterWave2DirY"/>
- <text name="BHText3">
- Tekstur map
- </text>
- <button label="?" name="WaterNormalMapHelp"/>
- <texture_picker label="" name="WaterNormalMap"/>
- </panel>
- </tab_container>
- <string name="WLDefaultWaterNames">
- Default:Glassy:Pond:Murky:Second Plague:SNAKE!!!:Valdez
- </string>
-</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_windlight_options.xml b/indra/newview/skins/default/xui/da/floater_windlight_options.xml
deleted file mode 100644
index 56f94b24e9..0000000000
--- a/indra/newview/skins/default/xui/da/floater_windlight_options.xml
+++ /dev/null
@@ -1,228 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="WindLight floater" title="AVANCERET OPSÆTNING FOR HIMMEL">
- <text name="KeyFramePresetsText">
- Faste indstillinger:
- </text>
- <button label="Ny" label_selected="Ny" name="WLNewPreset" />
- <button label="Gem" label_selected="Gem" name="WLSavePreset" />
- <button label="Slet" label_selected="Slet" name="WLDeletePreset" />
- <button label="Dags cyklus" label_selected="Dags cyklus" name="WLDayCycleMenuButton" />
- <tab_container name="WindLight Tabs">
- <panel label="ATMOSFÆRE" name="Atmosphere">
- <text name="BHText">
- Blå - horisont
- </text>
- <button label="?" name="WLBlueHorizonHelp" />
- <text name="BHText2">
- R
- </text>
- <text name="BHText3">
- G
- </text>
- <text name="BHText4">
- B
- </text>
- <text name="BHText5">
- I
- </text>
- <slider label="" name="WLBlueHorizonR" />
- <slider label="" name="WLBlueHorizonG" />
- <slider label="" name="WLBlueHorizonB" />
- <slider label="" name="WLBlueHorizonI" />
- <text name="BDensText">
- Dis - horisont
- </text>
- <button label="?" name="WLHazeHorizonHelp" />
- <slider label="" name="WLHazeHorizon" />
- <text name="BDensText2">
- Blå - tæthed
- </text>
- <button label="?" name="WLBlueDensityHelp" />
- <text name="BHText6">
- R
- </text>
- <text name="BHText7">
- G
- </text>
- <text name="BHText8">
- B
- </text>
- <text name="BHText9">
- I
- </text>
- <slider label="" name="WLBlueDensityR" />
- <slider label="" name="WLBlueDensityG" />
- <slider label="" name="WLBlueDensityB" />
- <slider label="" name="WLBlueDensityI" />
- <text name="HDText">
- Dis - intensitet
- </text>
- <button label="?" name="WLHazeDensityHelp" />
- <slider label="" name="WLHazeDensity" />
- <text name="DensMultText">
- Densitet faktor
- </text>
- <button label="?" name="WLDensityMultHelp" />
- <slider label="" name="WLDensityMult" />
- <text name="WLDistanceMultText">
- Distance faktor
- </text>
- <button label="?" name="WLDistanceMultHelp" />
- <slider label="" name="WLDistanceMult" />
- <text name="MaxAltText">
- Maximum højde
- </text>
- <button label="?" name="WLMaxAltitudeHelp" />
- <slider label="" name="WLMaxAltitude" />
- </panel>
- <panel label="LYS" name="Lighting">
- <text name="SLCText">
- Sol/MÃ¥ne farve
- </text>
- <button label="?" name="WLSunlightColorHelp" />
- <text name="BHText">
- R
- </text>
- <text name="BHText2">
- G
- </text>
- <text name="BHText3">
- B
- </text>
- <text name="BHText4">
- I
- </text>
- <slider label="" name="WLSunlightR" />
- <slider label="" name="WLSunlightG" />
- <slider label="" name="WLSunlightB" />
- <slider label="" name="WLSunlightI" />
- <text name="TODText">
- Sol/MÃ¥ne position
- </text>
- <button label="?" name="WLTimeOfDayHelp" />
- <slider label="" name="WLSunAngle" />
- <text name="WLAmbientText">
- Omgivende
- </text>
- <button label="?" name="WLAmbientHelp" />
- <text name="BHText5">
- R
- </text>
- <text name="BHText6">
- G
- </text>
- <text name="BHText7">
- B
- </text>
- <text name="BHText8">
- I
- </text>
- <slider label="" name="WLAmbientR" />
- <slider label="" name="WLAmbientG" />
- <slider label="" name="WLAmbientB" />
- <slider label="" name="WLAmbientI" />
- <text name="WLEastAngleText">
- Øst vinkel
- </text>
- <button label="?" name="WLEastAngleHelp" />
- <slider label="" name="WLEastAngle" />
- <text name="SunGlowText">
- Sol glød
- </text>
- <button label="?" name="WLSunGlowHelp" />
- <slider label="Fokus " name="WLGlowB" />
- <slider label="Størr. " name="WLGlowR" />
- <text name="SceneGammaText">
- Lysintensitet (gamma)
- </text>
- <button label="?" name="WLSceneGammaHelp" />
- <slider label="" name="WLGamma" />
- <text name="WLStarText">
- Stjerne intensitet
- </text>
- <button label="?" name="WLStarBrightnessHelp" />
- <slider label="" name="WLStarAlpha" />
- </panel>
- <panel label="SKYER" name="Clouds">
- <text name="WLCloudColorText">
- Farve på skyer
- </text>
- <button label="?" name="WLCloudColorHelp" />
- <text name="BHText">
- R
- </text>
- <text name="BHText2">
- G
- </text>
- <text name="BHText3">
- B
- </text>
- <text name="BHText4">
- I
- </text>
- <slider label="" name="WLCloudColorR" />
- <slider label="" name="WLCloudColorG" />
- <slider label="" name="WLCloudColorB" />
- <slider label="" name="WLCloudColorI" />
- <text name="WLCloudColorText2">
- Skyer XY/Tæthed
- </text>
- <button label="?" name="WLCloudDensityHelp" />
- <text name="BHText5">
- X
- </text>
- <text name="BHText6">
- Y
- </text>
- <text name="BHText7">
- T
- </text>
- <slider label="" name="WLCloudX" />
- <slider label="" name="WLCloudY" />
- <slider label="" name="WLCloudDensity" />
- <text name="WLCloudCoverageText">
- Skydække
- </text>
- <button label="?" name="WLCloudCoverageHelp" />
- <slider label="" name="WLCloudCoverage" />
- <text name="WLCloudScaleText">
- Skystørrelse
- </text>
- <button label="?" name="WLCloudScaleHelp" />
- <slider label="" name="WLCloudScale" />
- <text name="WLCloudDetailText">
- Sky detaljer(XY/tæthed)
- </text>
- <button label="?" name="WLCloudDetailHelp" />
- <text name="BHText8">
- X
- </text>
- <text name="BHText9">
- Y
- </text>
- <text name="BHText10">
- T
- </text>
- <slider label="" name="WLCloudDetailX" />
- <slider label="" name="WLCloudDetailY" />
- <slider label="" name="WLCloudDetailDensity" />
- <text name="WLCloudScrollXText">
- Sky drift X
- </text>
- <button label="?" name="WLCloudScrollXHelp" />
- <check_box label="LÃ¥s" name="WLCloudLockX" />
- <slider label="" name="WLCloudScrollX" />
- <text name="WLCloudScrollYText">
- Sky drift Y
- </text>
- <button label="?" name="WLCloudScrollYHelp" />
- <check_box label="LÃ¥s" name="WLCloudLockY" />
- <slider label="" name="WLCloudScrollY" />
- <check_box label="Benyt simple skyer" name="DrawClassicClouds" />
- <button label="?" name="WLClassicCloudsHelp" />
- </panel>
- </tab_container>
- <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
- </string>
-</floater>
diff --git a/indra/newview/skins/default/xui/da/language_settings.xml b/indra/newview/skins/default/xui/da/language_settings.xml
index 3e46f69af1..0e3cbfd2d2 100644
--- a/indra/newview/skins/default/xui/da/language_settings.xml
+++ b/indra/newview/skins/default/xui/da/language_settings.xml
@@ -4,6 +4,7 @@
<!-- Locale Information -->
<string name="MicrosoftLocale">danish</string>
+ <string name="MacLocale">da_DK.UTF-8</string>
<string name="DarwinLocale">da_DK.UTF-8</string>
<string name="LinuxLocale">da_DK.UTF-8</string>
diff --git a/indra/newview/skins/default/xui/da/menu_attachment_self.xml b/indra/newview/skins/default/xui/da/menu_attachment_self.xml
index 1c19435f90..35ba27f9e2 100644
--- a/indra/newview/skins/default/xui/da/menu_attachment_self.xml
+++ b/indra/newview/skins/default/xui/da/menu_attachment_self.xml
@@ -5,7 +5,7 @@
<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="Skift sæt" name="Change Outfit"/>
+ <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..."/>
diff --git a/indra/newview/skins/default/xui/da/menu_avatar_self.xml b/indra/newview/skins/default/xui/da/menu_avatar_self.xml
index 5a05a12b4e..4e6b42a744 100644
--- a/indra/newview/skins/default/xui/da/menu_avatar_self.xml
+++ b/indra/newview/skins/default/xui/da/menu_avatar_self.xml
@@ -14,6 +14,7 @@
<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="Fysik" name="Self Physics"/>
<menu_item_call label="Alpha" name="Self Alpha"/>
<menu_item_call label="Alt tøj" name="All Clothes"/>
</context_menu>
@@ -21,7 +22,7 @@
<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="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..."/>
diff --git a/indra/newview/skins/default/xui/da/menu_bottomtray.xml b/indra/newview/skins/default/xui/da/menu_bottomtray.xml
index e979e35a91..a0d74db36d 100644
--- a/indra/newview/skins/default/xui/da/menu_bottomtray.xml
+++ b/indra/newview/skins/default/xui/da/menu_bottomtray.xml
@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="hide_camera_move_controls_menu">
+ <menu_item_check label="Tal knap" 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="Sidepanel knap" name="ShowSidebarButton"/>
<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"/>
diff --git a/indra/newview/skins/default/xui/da/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/da/menu_inspect_avatar_gear.xml
index 89111d49f1..8da35adb1b 100644
--- a/indra/newview/skins/default/xui/da/menu_inspect_avatar_gear.xml
+++ b/indra/newview/skins/default/xui/da/menu_inspect_avatar_gear.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
-<menu name="Gear Menu">
+<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"/>
@@ -11,9 +11,11 @@
<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"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/da/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/da/menu_inspect_self_gear.xml
index a2ddd116a7..887c6484bc 100644
--- a/indra/newview/skins/default/xui/da/menu_inspect_self_gear.xml
+++ b/indra/newview/skins/default/xui/da/menu_inspect_self_gear.xml
@@ -1,10 +1,31 @@
-<?xml version="1.0" encoding="utf-8"?>
-<menu name="Gear Menu">
- <menu_item_call label="Sid ned" name="sit_down_here"/>
- <menu_item_call label="Stå op" name="stand_up"/>
- <menu_item_call label="Skift sæt" name="change_outfit"/>
- <menu_item_call label="Profil" name="my_profile"/>
- <menu_item_call label="Venner" name="my_friends"/>
- <menu_item_call label="Grupper" name="my_groups"/>
+<?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..."/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/da/menu_inventory.xml b/indra/newview/skins/default/xui/da/menu_inventory.xml
index 35551318d1..f9bdf36f1f 100644
--- a/indra/newview/skins/default/xui/da/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/da/menu_inventory.xml
@@ -25,6 +25,7 @@
<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_item_call label="Ny fysik" name="New Physics"/>
</menu>
<menu label="Nye kropsdele" name="New Body Parts">
<menu_item_call label="Ny figur" name="New Shape"/>
diff --git a/indra/newview/skins/default/xui/da/menu_inventory_add.xml b/indra/newview/skins/default/xui/da/menu_inventory_add.xml
index 07f70d7190..eca03d3ee9 100644
--- a/indra/newview/skins/default/xui/da/menu_inventory_add.xml
+++ b/indra/newview/skins/default/xui/da/menu_inventory_add.xml
@@ -4,6 +4,8 @@
<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="Model..." name="Upload Model"/>
+ <menu_item_call label="Model Wizard..." name="Upload Model Wizard"/>
<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>
@@ -23,6 +25,7 @@
<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_item_call label="Ny fysik" name="New Physics"/>
</menu>
<menu label="Nye kropsdele" name="New Body Parts">
<menu_item_call label="Ny kropsbygning" name="New Shape"/>
diff --git a/indra/newview/skins/default/xui/da/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/da/menu_inventory_gear_default.xml
index b359d94f07..4809b24463 100644
--- a/indra/newview/skins/default/xui/da/menu_inventory_gear_default.xml
+++ b/indra/newview/skins/default/xui/da/menu_inventory_gear_default.xml
@@ -3,6 +3,7 @@
<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"/>
diff --git a/indra/newview/skins/default/xui/da/menu_media_ctrl.xml b/indra/newview/skins/default/xui/da/menu_media_ctrl.xml
new file mode 100644
index 0000000000..788b1c4b59
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/menu_media_ctrl.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="media ctrl context menu">
+ <menu_item_call label="Klip" name="Cut"/>
+ <menu_item_call label="Kopier" name="Copy"/>
+ <menu_item_call label="Sæt ind" name="Paste"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/da/menu_model_import_gear_default.xml b/indra/newview/skins/default/xui/da/menu_model_import_gear_default.xml
new file mode 100644
index 0000000000..d9626692d5
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/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="Show edges" name="show_edges"/>
+ <menu_item_check label="Show physics" name="show_physics"/>
+ <menu_item_check label="Show textures" name="show_textures"/>
+ <menu_item_check label="Show skin weight" name="show_skin_weight"/>
+ <menu_item_check label="Show joint positions" name="show_joint_positions"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/da/menu_object.xml b/indra/newview/skins/default/xui/da/menu_object.xml
index bc0cdde86f..ba62ccf90c 100644
--- a/indra/newview/skins/default/xui/da/menu_object.xml
+++ b/indra/newview/skins/default/xui/da/menu_object.xml
@@ -16,14 +16,14 @@
<context_menu label="Vedhæft" name="Object Attach"/>
<context_menu label="Vedhæft HUD" name="Object Attach HUD"/>
</context_menu>
- <context_menu label="Fjern" name="Remove">
+ <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..."/>
- <menu_item_call label="Slet" name="Delete"/>
</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/default/xui/da/menu_outfit_gear.xml b/indra/newview/skins/default/xui/da/menu_outfit_gear.xml
index 8b4c776496..0b0fff3b93 100644
--- a/indra/newview/skins/default/xui/da/menu_outfit_gear.xml
+++ b/indra/newview/skins/default/xui/da/menu_outfit_gear.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Gear Outfit">
+<toggleable_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"/>
@@ -14,6 +14,7 @@
<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 fysik" name="New Physics"/>
<menu_item_call label="Ny tatovering" name="New Tattoo"/>
</menu>
<menu label="Nye kropsdele" name="New Body Parts">
@@ -24,4 +25,4 @@
</menu>
<menu_item_call label="Omdøb sæt" name="rename"/>
<menu_item_call label="Slet sæt" name="delete_outfit"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/da/menu_places_gear_folder.xml b/indra/newview/skins/default/xui/da/menu_places_gear_folder.xml
index 3ee3c02fb1..5f573c2363 100644
--- a/indra/newview/skins/default/xui/da/menu_places_gear_folder.xml
+++ b/indra/newview/skins/default/xui/da/menu_places_gear_folder.xml
@@ -1,7 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_folder_gear">
+<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"/>
@@ -12,4 +13,4 @@
<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"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/da/menu_places_gear_landmark.xml b/indra/newview/skins/default/xui/da/menu_places_gear_landmark.xml
index 21f425c49d..13dbcdd42e 100644
--- a/indra/newview/skins/default/xui/da/menu_places_gear_landmark.xml
+++ b/indra/newview/skins/default/xui/da/menu_places_gear_landmark.xml
@@ -1,10 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_ladmark_gear">
+<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"/>
@@ -15,4 +16,4 @@
<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"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/da/menu_viewer.xml b/indra/newview/skins/default/xui/da/menu_viewer.xml
index fc32be9dc9..d352312d15 100644
--- a/indra/newview/skins/default/xui/da/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/da/menu_viewer.xml
@@ -5,7 +5,7 @@
<menu_item_call label="Mit instrumentpanel" name="Manage My Account"/>
<menu_item_call label="Køb L$" name="Buy and Sell L$"/>
<menu_item_call label="Profil" name="Profile"/>
- <menu_item_call label="Skift sæt" name="ChangeOutfit"/>
+ <menu_item_call label="Udseende" name="ChangeOutfit"/>
<menu_item_check label="Beholdning" name="Inventory"/>
<menu_item_check label="Min beholdning" name="ShowSidetrayInventory"/>
<menu_item_check label="Mine bevægelser" name="Gestures"/>
@@ -33,6 +33,7 @@
<menu label="Verden" name="World">
<menu_item_check label="Mini-kort" name="Mini-Map"/>
<menu_item_check label="Verdenskort" name="World Map"/>
+ <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">
@@ -117,6 +118,8 @@
<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="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>
<menu_item_call label="Fortyd" name="Undo"/>
@@ -156,7 +159,7 @@
<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="Overflade" name="SurfacePath"/>
+ <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"/>
@@ -214,6 +217,7 @@
<menu_item_check label="Konsol med tekstur kategorier" name="Texture Category"/>
<menu_item_check label="Hurtig-timere" name="Fast Timers"/>
<menu_item_check label="Hukommelse" name="Memory"/>
+ <menu_item_check label="Scene Statistics" name="Scene Statistics"/>
<menu_item_call label="Vis Regionsinfo i debug-konsol" name="Region Info to Debug Console"/>
<menu_item_check label="Kamera" name="Camera"/>
<menu_item_check label="Vind" name="Wind"/>
@@ -221,8 +225,11 @@
</menu>
<menu label="Vis info" name="Display Info">
<menu_item_check label="Vis tid" name="Show Time"/>
+ <menu_item_check label="Show Upload Cost" name="Show Upload Cost"/>
<menu_item_check label="Vis gengivelses information" name="Show Render Info"/>
+ <menu_item_check label="Vis tekstur information" name="Show Texture Info"/>
<menu_item_check label="Vis farve under cursor" name="Show Color Under Cursor"/>
+ <menu_item_check label="Vis memory" name="Show Memory"/>
<menu_item_check label="Vis opdateringer på objekter" name="Show Updates"/>
</menu>
<menu label="Fremtving en fejl" name="Force Errors">
@@ -240,6 +247,14 @@
<menu_item_check label="Tilfældige framerates" name="Randomize Framerate"/>
<menu_item_check label="Frame test" name="Frame Test"/>
</menu>
+ <menu label="Render Metadata" name="Render Metadata">
+ <menu_item_check label="Normals" name="Normals"/>
+ <menu_item_check label="Physics Shapes" name="Physics Shapes"/>
+ <menu_item_check label="Opdatér type" name="Update Type"/>
+ <menu_item_check label="LOD Info" name="LOD Info"/>
+ <menu_item_check label="Build Queue" name="Build Queue"/>
+ <menu_item_check label="Sculpt" name="Sculpt"/>
+ </menu>
<menu label="Gengivelse" name="Rendering">
<menu_item_check label="Akser" name="Axes"/>
<menu_item_check label="Wireframe" name="Wireframe"/>
@@ -304,6 +319,7 @@
<menu_item_call label="Debug avatar teksturer" name="Debug Avatar Textures"/>
</menu>
<menu_item_check label="HTTP teksturer" name="HTTP Textures"/>
+ <menu_item_check label="HTTP Inventory" name="HTTP Inventory"/>
<menu_item_check label="Benyt consol vindue ved næste opstart" name="Console Window"/>
<menu_item_call label="Anmod om administrator status" name="Request Admin Options"/>
<menu_item_call label="Forlad administrationsstatus" name="Leave Admin Options"/>
@@ -328,4 +344,9 @@
</menu>
<menu_item_call label="&quot;God Tools&quot;" name="God Tools"/>
</menu>
+ <menu label="Admin" name="Deprecated">
+ <menu label="Take Off Clothing" name="Take Off Clothing">
+ <menu_item_call label="Fysik" name="Physics"/>
+ </menu>
+ </menu>
</menu_bar>
diff --git a/indra/newview/skins/default/xui/da/notifications.xml b/indra/newview/skins/default/xui/da/notifications.xml
index 30b54d3eb2..4c0fbd280b 100644
--- a/indra/newview/skins/default/xui/da/notifications.xml
+++ b/indra/newview/skins/default/xui/da/notifications.xml
@@ -72,9 +72,9 @@ Fejl detaljer: Beskeden kaldet &apos;[_NAME]&apos; blev ikke fundet i notificati
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="LoginFailedNoNetwork">
- Kunne ikke oprette forbindelse til [SECOND_LIFE_GRID].
-&apos;[DIAGNOSTIC]&apos;
-Make sure your Internet connection is working properly.
+ 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">
@@ -215,13 +215,6 @@ Du skal bruge en konto for at benytte [SECOND_LIFE]. Ønsker du at oprette en ko
<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="AddClassified">
- Annoncer vil vises i &apos;Annoncer&apos; sektionen i søge biblioteket og på [http://secondlife.com/community/classifieds secondlife.com] i en uge.
-Udfyld din annonce og klik på &apos;Udgiv...&apos; for at tilf&apos;je den til biblioteket.
-Du vil blive spurgt om en pris når du klikker på &apos;Udgiv&apos;.
-Jo mere du betaler, jo højere oppe på listen vises annoncen, og den vil også optræde højere oppe når personer søger.
- <usetemplate ignoretext="Hvordan man opretter en annonce" name="okcancelignore" notext="Cancel" yestext="OK"/>
- </notification>
<notification name="DeleteMedia">
Du har valgt at slette media tilknyttet denne overflade.
Er du sikker på at du vil fortsætte?
@@ -1078,6 +1071,12 @@ Det kan påvirke din indtastning af password.
<notification name="RezItemNoPermissions">
Utilstrækkelige tilladelser til at danne genstanden.
</notification>
+ <notification name="IMAcrossParentEstates">
+ Ikke muligt at sende IM over forældre estates.
+ </notification>
+ <notification name="TransferInventoryAcrossParentEstates">
+ Ikke muligt at overføre din beholdning over forældre parceller.
+ </notification>
<notification name="UnableToLoadNotecard">
Ikke muligt at indlæse note.
Prøv venligst igen.
@@ -1648,6 +1647,10 @@ De vil blive blokeret nogle få sekunder af sikkerhedsmæssige årsager.
Din stemme er blevet slukket af moderatoren.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
+ <notification name="UploadCostConfirmation">
+ Dette upload vil koste L$[PRICE], ønsker du at sende?
+ <usetemplate name="okcancelbuttons" notext="Annullér" yestext="Send"/>
+ </notification>
<notification name="ConfirmClearTeleportHistory">
Er du sikker på at du vil slette teleport historikken?
<usetemplate name="okcancelbuttons" notext="Annullér" yestext="OK"/>
@@ -1659,12 +1662,15 @@ Knappen vil blive vist når der er nok plads til den.
<notification name="ShareNotification">
Vælg beboere at dele med.
</notification>
+ <notification name="MeshUploadError">
+ [LABEL] kunne ikke sendes: [MESSAGE] [IDENTIFIER] [INVALIDITY_IDENTIFIER]
+ </notification>
<notification name="ShareItemsConfirmation">
Er du sikker på at du vil dele følgende genstande:
&lt;nolink&gt;[ITEMS]&lt;/nolink&gt;
-Med følgende beboere:
+Me følgende beboere:
[RESIDENTS]
<usetemplate name="okcancelbuttons" notext="Annullér" yestext="Ok"/>
@@ -1675,6 +1681,19 @@ Med følgende beboere:
<notification name="DeedToGroupFail">
Dedikering til gruppe fejlede.
</notification>
+ <notification name="ReleaseLandThrottled">
+ Parcellen [PARCEL_NAME] kan ikke efterlades på nuværende tidspunkt.
+ </notification>
+ <notification name="ReleasedLandWithReclaim">
+ [AREA] m² parcellen &apos;[PARCEL_NAME]&apos; er blevet frigivet.
+
+Du har [RECLAIM_PERIOD] timer til at få den tilbage for L$0 før den udbydes til salg til andre beboere.
+ </notification>
+ <notification name="ReleasedLandNoReclaim">
+ [AREA] m² parcel &apos;[PARCEL_NAME]&apos; er blevet frigivet.
+
+Parcellen kan nu købes af enhver beboer.
+ </notification>
<notification name="AvatarRezNotification">
( [EXISTENCE] sekunder i live )
Avatar &apos;[NAME]&apos; var ikke sky mere, efter [TIME] sekunder.
@@ -1753,24 +1772,32 @@ Sluk for alles lyd?
<notification label="Stå op" name="HintSit">
For at rejse dig op og forlad siddeposition, tryk på &quot;Stå op&quot; knappen.
</notification>
+ <notification label="Tal" name="HintSpeak">
+ Klik på tal knappen for at tænde og slukke for din mikrofon.
+
+Klik på den lille pil-op for at se stemme kontrolpanelet.
+
+Skjules tale knappen, vil stemmechat ikke være mulig.
+ </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="Ændre dit udseende" name="HintAvatarPicker">
- Kunne du tænke dig at prøve et nyt udseende? Klik på knappen nedenfor for at se flere avatarer.
- </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="" name="HintMoveClick">
+ 1. Klik for at gå
+Klik et hvorsomhelst på jorden for at gå til dette sted.
+
+2. Klik og træk for at rotere visning
+Klik hvorsomhelst i verden for at rotere din visning
+ </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>
@@ -1796,6 +1823,54 @@ Sluk for alles lyd?
<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="NoPlaceInfo">
+ Det er kun muligt at vise profil for stedet i avanceret opsætning. Ø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>
+ <notification label="" name="NoInventory">
+ Det er kun muligt at vise beholdning i avanceret tilstand. Ønsker du at logge ud og logge på i avanceret tilstand.
+ <usetemplate name="okcancelbuttons" notext="Afslut ikke" yestext="Afslut"/>
+ </notification>
+ <notification label="" name="NoAppearance">
+ Udseende opsætning er kun tilgængelig i avanceret tilstand. Ønsker du at logge ud og logge på i avanceret tilstand.
+ <usetemplate name="okcancelbuttons" notext="Afslut ikke" yestext="Afslut"/>
+ </notification>
+ <notification label="" name="NoSearch">
+ Søgning er kun mulig i avanceret tilstand. Ønsker du at logge ud og logge på i avanceret 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.
diff --git a/indra/newview/skins/default/xui/da/panel_edit_physics.xml b/indra/newview/skins/default/xui/da/panel_edit_physics.xml
new file mode 100644
index 0000000000..16c9b16fa3
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/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="Bryst fasthed"/>
+ <accordion_tab name="physics_breasts_inout_tab" title="Kavalergang"/>
+ <accordion_tab name="physics_breasts_leftright_tab" title="Bryst sving"/>
+ <accordion_tab name="physics_belly_tab" title="Mave fasthed"/>
+ <accordion_tab name="physics_butt_tab" title="Bagdel fasthed"/>
+ <accordion_tab name="physics_butt_leftright_tab" title="Bagdel sving"/>
+ <accordion_tab name="physics_advanced_tab" title="Avancerede parametre"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_edit_pick.xml b/indra/newview/skins/default/xui/da/panel_edit_pick.xml
index fd287b1a0a..3036f30240 100644
--- a/indra/newview/skins/default/xui/da/panel_edit_pick.xml
+++ b/indra/newview/skins/default/xui/da/panel_edit_pick.xml
@@ -29,7 +29,7 @@
<layout_panel name="layout_panel1">
<button label="Gem valgte" name="save_changes_btn"/>
</layout_panel>
- <layout_panel name="layout_panel1">
+ <layout_panel name="layout_panel2">
<button label="Annullér" name="cancel_btn"/>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/da/panel_edit_wearable.xml b/indra/newview/skins/default/xui/da/panel_edit_wearable.xml
index 4b9360f0d1..906870e6d9 100644
--- a/indra/newview/skins/default/xui/da/panel_edit_wearable.xml
+++ b/indra/newview/skins/default/xui/da/panel_edit_wearable.xml
@@ -45,6 +45,9 @@
<string name="edit_tattoo_title">
Redigerer tatovering
</string>
+ <string name="edit_physics_title">
+ Redigering af fysik
+ </string>
<string name="shape_desc_text">
Kropsbygning:
</string>
@@ -90,6 +93,9 @@
<string name="tattoo_desc_text">
Tatovering:
</string>
+ <string name="physics_desc_text">
+ Fysik:
+ </string>
<labeled_back_button label="Gem" name="back_btn" tool_tip="Tilbage til redigering"/>
<text name="edit_wearable_title" value="Redigerer kropsbygning"/>
<panel label="Trøje" name="wearable_type_panel">
diff --git a/indra/newview/skins/default/xui/da/panel_login.xml b/indra/newview/skins/default/xui/da/panel_login.xml
index dc8d9bc432..2e0f726e1a 100644
--- a/indra/newview/skins/default/xui/da/panel_login.xml
+++ b/indra/newview/skins/default/xui/da/panel_login.xml
@@ -17,6 +17,13 @@
</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>
diff --git a/indra/newview/skins/default/xui/da/panel_media_settings_security.xml b/indra/newview/skins/default/xui/da/panel_media_settings_security.xml
index 278fe0eeea..1b64888271 100644
--- a/indra/newview/skins/default/xui/da/panel_media_settings_security.xml
+++ b/indra/newview/skins/default/xui/da/panel_media_settings_security.xml
@@ -2,7 +2,8 @@
<panel label="Sikkerhed" name="Media Settings Security">
<check_box initial_value="false" label="Tillad kun adgang til angivne URL mønstre" name="whitelist_enable"/>
<text name="home_url_fails_some_items_in_whitelist">
- Angivelser som hjemmesiden fejler imod er markeret:
+ Angivelser som hjemmesiden fejler imod er
+markeret:
</text>
<button label="Tilføj" name="whitelist_add"/>
<button label="Slet" name="whitelist_del"/>
diff --git a/indra/newview/skins/default/xui/da/panel_nearby_media.xml b/indra/newview/skins/default/xui/da/panel_nearby_media.xml
index b4be70a22a..ef8ed3ad07 100644
--- a/indra/newview/skins/default/xui/da/panel_nearby_media.xml
+++ b/indra/newview/skins/default/xui/da/panel_nearby_media.xml
@@ -19,7 +19,7 @@
<button label="Stop alt" name="all_nearby_media_disable_btn" tool_tip="Stop al media tæt på"/>
<button label="Start alt" name="all_nearby_media_enable_btn" tool_tip="Tænd al media tæt på"/>
<button name="open_prefs_btn" tool_tip="Vis media preferencer"/>
- <button label="Mere &gt;&gt;" label_selected="Mindre &lt;&lt;" name="more_btn" tool_tip="Advancerede kontroller"/>
+ <button label="Mere &gt;&gt;" label_selected="&lt;&lt; Mindre" name="more_btn" tool_tip="Advancerede kontroller"/>
<button label="Mere &gt;&gt;" label_selected="Mindre &lt;&lt;" name="less_btn" tool_tip="Advancerede kontroller"/>
</panel>
<panel name="nearby_media_panel">
diff --git a/indra/newview/skins/default/xui/da/panel_people.xml b/indra/newview/skins/default/xui/da/panel_people.xml
index b85a33279a..66a128cd13 100644
--- a/indra/newview/skins/default/xui/da/panel_people.xml
+++ b/indra/newview/skins/default/xui/da/panel_people.xml
@@ -18,6 +18,8 @@ Leder du efter nogen at være sammen med? Prøv [secondlife:///app/worldmap Verd
<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](Dobbeltklik for at åbne kort, træk for at panorere)"/>
+ <string name="AltMiniMapToolTipMsg" value="[REGION](Dobbelt-klik fot 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">
@@ -64,16 +66,16 @@ Leder du efter nogen at være sammen med? Prøv [secondlife:///app/worldmap Verd
<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="chat_btn_lp">
+ <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="chat_btn_lp">
+ <layout_panel name="call_btn_lp">
<button label="Kald" name="call_btn" tool_tip="Opkald til denne beboer"/>
</layout_panel>
- <layout_panel name="chat_btn_lp">
+ <layout_panel name="share_btn_lp">
<button label="Del" name="share_btn" tool_tip="Del en genstand fra beholdning"/>
</layout_panel>
- <layout_panel name="chat_btn_lp">
+ <layout_panel name="teleport_btn_lp">
<button label="Teleportér" name="teleport_btn" tool_tip="Tilbyd teleport"/>
</layout_panel>
</layout_stack>
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 ed499619f6..19c82509cd 100644
--- a/indra/newview/skins/default/xui/da/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/da/panel_preferences_chat.xml
@@ -30,7 +30,9 @@
<spinner label="Tid før chatvisning forsvinder:" name="nearby_toasts_lifetime"/>
<spinner label="Tid før chatvisning forsvinder:" name="nearby_toasts_fadingtime"/>
<check_box name="translate_chat_checkbox"/>
- <text name="translate_chb_label" >Benyt maskin-oversættelse ved chat (håndteret af Google)</text>
+ <text name="translate_chb_label">
+ Benyt maskinel oversættelse ved chat (håndteret af Google)
+ </text>
<text name="translate_language_text" width="110">
Oversæt chat til :
</text>
diff --git a/indra/newview/skins/default/xui/da/panel_preferences_colors.xml b/indra/newview/skins/default/xui/da/panel_preferences_colors.xml
index b2b00db769..cc3dc480bc 100644
--- a/indra/newview/skins/default/xui/da/panel_preferences_colors.xml
+++ b/indra/newview/skins/default/xui/da/panel_preferences_colors.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Farver" name="colors_panel">
<text name="effects_color_textbox">
- Mine effekter (selektions-stråle):
+ Mine effekter (selektions pejlelys):
</text>
- <color_swatch name="effect_color_swatch" tool_tip="Klik for at åbne farve-vælger"/>
+ <color_swatch name="effect_color_swatch" tool_tip="Klik for at åbne farvevælger"/>
<text name="font_colors">
- Chat bogstavsfarver:
+ Vælg font farver:
</text>
<text name="text_box1">
Mig
@@ -22,6 +22,9 @@
<text name="text_box5">
Fejl
</text>
+ <text name="text_box10">
+ Direkte
+ </text>
<text name="text_box7">
Ejer
</text>
@@ -29,12 +32,12 @@
URL&apos;er
</text>
<text name="bubble_chat">
- Baggrundsfarve til navne-skilt (berører også Bubble Chat):
+ Navneskilt baggrundsfarve (påvirker også chat talebobler):
</text>
- <color_swatch name="background" tool_tip="Vælg farve til navne-skilt"/>
- <slider label="Uigennemsigtighed:" name="bubble_chat_opacity" tool_tip="Vælg gennemsigtighed for navneskilt"/>
+ <color_swatch name="background" tool_tip="Vælg navneskilt farve"/>
+ <slider label="Gennemsigtighed:" name="bubble_chat_opacity" tool_tip="Vælg navneskilt gennemsigtighed"/>
<text name="floater_opacity">
- Vindue uigennemsigtighed:
+ Floater gennemsigtighed:
</text>
<slider label="Aktiv:" name="active"/>
<slider label="Inaktiv:" name="inactive"/>
diff --git a/indra/newview/skins/default/xui/da/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/da/panel_preferences_graphics1.xml
index 15da1f9ec5..72200a07ad 100644
--- a/indra/newview/skins/default/xui/da/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/da/panel_preferences_graphics1.xml
@@ -28,8 +28,20 @@
</text>
<check_box initial_value="sand" label="Gennemsigtig vand" name="TransparentWater"/>
<check_box initial_value="true" label="Glatte flader og skin" name="BumpShiny"/>
+ <check_box initial_value="sand" label="Lokale lys" name="LocalLights"/>
<check_box initial_value="true" label="Basale flader" name="BasicShaders" tool_tip="Ved at slå dette valg fra, kan det forhindres at visse grafikkort drivere crasher."/>
<check_box initial_value="true" label="Atmosfæriske flader" name="WindLightUseAtmosShaders"/>
+ <check_box initial_value="sand" label="Lys og skygger" name="UseLightShaders"/>
+ <check_box initial_value="sand" label="&quot;Ambient Occlusion&quot;" name="UseSSAO"/>
+ <check_box initial_value="sand" label="Skarphedsdybde" name="UseDoF"/>
+ <text name="shadows_label">
+ Skygger:
+ </text>
+ <combo_box name="ShadowDetail">
+ <combo_box.item label="Ingen" name="0"/>
+ <combo_box.item label="Sol/MÃ¥ne" name="1"/>
+ <combo_box.item label="Sol/MÃ¥ne + Projektorer" name="2"/>
+ </combo_box>
<text name="reflection_label">
Reflektioner i vand:
</text>
@@ -40,6 +52,10 @@
<combo_box.item label="Alle avatarer og objekter" name="3"/>
<combo_box.item label="Alt" name="4"/>
</combo_box>
+ <slider label="Avatar fysik:" name="AvatarPhysicsDetail"/>
+ <text name="AvatarPhysicsDetailText">
+ Lav
+ </text>
<slider label="Maks. visnings-afstand:" name="DrawDistance"/>
<text name="DrawDistanceMeterText2">
m
@@ -78,7 +94,7 @@
Lav
</text>
<text name="AvatarRenderingText">
- Avatar gengivelse
+ Avatar rendering:
</text>
<check_box initial_value="true" label="Mini-figurer på lang afstand" name="AvatarImpostors"/>
<check_box initial_value="true" label="Hardware Skinning" name="AvatarVertexProgram"/>
diff --git a/indra/newview/skins/default/xui/da/panel_preferences_sound.xml b/indra/newview/skins/default/xui/da/panel_preferences_sound.xml
index 067463be02..26d2ae4abd 100644
--- a/indra/newview/skins/default/xui/da/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/da/panel_preferences_sound.xml
@@ -5,7 +5,9 @@
</panel.string>
<slider label="Generel" name="System Volume"/>
<check_box initial_value="true" name="mute_when_minimized"/>
- <text name="mute_chb_label">Sluk lyd når minimeret</text>
+ <text name="mute_chb_label">
+ Sluk for lyd når minimeret
+ </text>
<slider label="Knapper" name="UI Volume"/>
<slider label="Omgivelser" name="Wind Volume"/>
<slider label="Lyd effekter" name="SFX Volume"/>
diff --git a/indra/newview/skins/default/xui/da/panel_profile.xml b/indra/newview/skins/default/xui/da/panel_profile.xml
index b8b99a9c21..db85eb23a8 100644
--- a/indra/newview/skins/default/xui/da/panel_profile.xml
+++ b/indra/newview/skins/default/xui/da/panel_profile.xml
@@ -5,6 +5,12 @@
<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">
@@ -19,7 +25,7 @@
<text name="title_acc_status_text" value="Konto status:"/>
<text name="title_partner_text" value="Partner:"/>
<panel name="partner_data_panel">
- <name_box initial_value="(henter)" name="partner_text"/>
+ <text initial_value="(henter)" name="partner_text"/>
</panel>
<text name="title_groups_text" value="Grupper:"/>
</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_region_general.xml b/indra/newview/skins/default/xui/da/panel_region_general.xml
index 5b5dd411ac..667c88c5b1 100644
--- a/indra/newview/skins/default/xui/da/panel_region_general.xml
+++ b/indra/newview/skins/default/xui/da/panel_region_general.xml
@@ -25,6 +25,7 @@
<check_box label="Tillad at sælge land" name="allow_land_resell_check"/>
<check_box label="Tillad at samle/dele land" name="allow_parcel_changes_check"/>
<check_box label="Blokér visning af land i Søgning" name="block_parcel_search_check" tool_tip="Lad beboere se denne region og dens parceller i søgeresultater"/>
+ <check_box label="Til &quot;mesh&quot; objekter" name="mesh_rez_enabled_check" tool_tip="Lad personer rezze mesh objekter i denne region"/>
<spinner label="Max besøgende" name="agent_limit_spin"/>
<spinner label="Objekt bonus" name="object_bonus_spin"/>
<text label="Indhold" name="access_text">
diff --git a/indra/newview/skins/default/xui/da/panel_script_ed.xml b/indra/newview/skins/default/xui/da/panel_script_ed.xml
index 8997cab30c..3dec4bf101 100644
--- a/indra/newview/skins/default/xui/da/panel_script_ed.xml
+++ b/indra/newview/skins/default/xui/da/panel_script_ed.xml
@@ -15,6 +15,9 @@
<panel.string name="Title">
Script: [NAME]
</panel.string>
+ <panel.string name="external_editor_not_set">
+ Vælg en editor ved at opsætte miljø-variablen LL_SCRIPT_EDITOR eller opsætning af Ekstern editor.
+ </panel.string>
<menu_bar name="script_menu">
<menu label="Filer" name="File">
<menu_item_call label="Gem" name="Save"/>
diff --git a/indra/newview/skins/default/xui/da/panel_scrolling_param_base.xml b/indra/newview/skins/default/xui/da/panel_scrolling_param_base.xml
new file mode 100644
index 0000000000..fa659040ea
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/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/da/panel_sound_devices.xml b/indra/newview/skins/default/xui/da/panel_sound_devices.xml
new file mode 100644
index 0000000000..27b7666a1f
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_sound_devices.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<panel label="Opsætning for udstyr" name="device_settings_panel">
+ <panel.string name="default_text">
+ Standard
+ </panel.string>
+ <text name="Input">
+ Input
+ </text>
+ <text name="My volume label">
+ Min lydstyrke:
+ </text>
+ <slider_bar initial_value="1.0" name="mic_volume_slider" tool_tip="Ændre lydstyrke med denne skyder"/>
+ <text name="wait_text">
+ Vent venligst
+ </text>
+ <text name="Output">
+ Output
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/strings.xml b/indra/newview/skins/default/xui/da/strings.xml
index aa02fc14e5..b5d8ac44bc 100644
--- a/indra/newview/skins/default/xui/da/strings.xml
+++ b/indra/newview/skins/default/xui/da/strings.xml
@@ -115,6 +115,140 @@
<string name="Quit">
Afslut
</string>
+ <string name="LoginFailedViewerNotPermitted">
+ Den klient du benytter kan ikke længere få adgang til Second Life. Besøg venligst denne side for at hente en ny klient:
+http://secondlife.com/download
+
+For mere information, se denne FAQ:
+http://secondlife.com/viewer-access-faq
+ </string>
+ <string name="LoginIntermediateOptionalUpdateAvailable">
+ Valgfri klient opdatering tilgængelig: [VERSION]
+ </string>
+ <string name="LoginFailedRequiredUpdate">
+ Påkrævet opdatering a klient: [VERSION]
+ </string>
+ <string name="LoginFailedAlreadyLoggedIn">
+ Din avatar er allerede logget på.
+ </string>
+ <string name="LoginFailedAuthenticationFailed">
+ Beklager! vi kunne ikke logge dig på.
+Undersøg venligst at du har indtastet det rette
+Please check to make sure you entered the right
+ * Brugernavn (like bobsmith12 or steller.sunshine)
+ * Password
+Check også at Caps Lock ikke er aktiveret.
+ </string>
+ <string name="LoginFailedPasswordChanged">
+ Som en sikkerhedsforanstaltning er dit password blevet ændret.
+Går venligst til din konto-side på http://secondlife.com/password
+og besvar sikkerhedsspørgsmål for at nulstille dit password.
+Vi undskylder besværet.
+ </string>
+ <string name="LoginFailedPasswordReset">
+ vi har lavet nogle ændringer i vores system og det er nødvendigt at nulstille dit password.
+Går venligst til din konto-side på http://secondlife.com/password
+og besvar sikkerhedsspørgsmål for at nulstille dit password.
+Vi undskylder besværet.
+ </string>
+ <string name="LoginFailedEmployeesOnly">
+ Second Life er midlertidig lukket ned for vedligeholdelse.
+Kun medarbejdere kan logge på for øjeblikket.
+Check www.secondlife.com/status for opdateringer.
+ </string>
+ <string name="LoginFailedPremiumOnly">
+ Second Life har midlertidig begrænset muligheden for log-in for at sikre, at brugere på systemet ikke får dårlige svartider.
+
+ Brugere med gratis-konti vil ikke kunne logge på Second Life på dette tidspunkt.
+ </string>
+ <string name="LoginFailedComputerProhibited">
+ Second Life kan ikke tilgås fra dennecomputer.
+Hvis du mener dette er en fejl, kontakt venligst support@secondlife.com.
+ </string>
+ <string name="LoginFailedAcountSuspended">
+ Din konto vil ikke være tilgængelig før
+[TIME] Pacific Time.
+ </string>
+ <string name="LoginFailedAccountDisabled">
+ Vi kan desværre ikke behandle forespøgsel lige nu.
+Kontakt venligst Second Life supper for assitance via http://secondlife.com/support.
+Hvis du ikke kan ændre dit password ring venligst +1 (866) 476-9763.
+ </string>
+ <string name="LoginFailedTransformError">
+ Data inkonsistens registret ved login.
+Kontakt venligst support@secondlife.com.
+ </string>
+ <string name="LoginFailedAccountMaintenance">
+ Der foretages vedligehold på din konto lige nu.
+Din konto vil ikke være tilgængelig før
+[TIME] Pacific Time.
+Hvis du mener dette er en fejl, kontakt venligst support@secondlife.com.
+ </string>
+ <string name="LoginFailedPendingLogoutFault">
+ Forespøgsel på logout blev besvaret med en fejl fra simulatoren.
+ </string>
+ <string name="LoginFailedPendingLogout">
+ Systemet er i gang med at logge dig ud netop nu.
+Din konto vil ikke være tilgængelig før
+[TIME] Pacific Time.
+ </string>
+ <string name="LoginFailedUnableToCreateSession">
+ Ikke muligt at oprette gyldig session.
+ </string>
+ <string name="LoginFailedUnableToConnectToSimulator">
+ Ikke muligt at koble til en simulator.
+ </string>
+ <string name="LoginFailedRestrictedHours">
+ Din konto kan kun tilgå Second Life
+mellem [START] [END] Pacific Time.
+Kom venligst tilbage i dette tidsrum.
+
+Hvis du mener dette er en fejl, kontakt venligst support@secondlife.com.
+ </string>
+ <string name="LoginFailedIncorrectParameters">
+ Ugyldig parametre.
+Hvis du mener dette er en fejl, kontakt venligst support@secondlife.com.
+ </string>
+ <string name="LoginFailedFirstNameNotAlphanumeric">
+ Fornavn parameter skal være alfanumerisk
+Hvis du mener dette er en fejl, kontakt venligst support@secondlife.com.
+ </string>
+ <string name="LoginFailedLastNameNotAlphanumeric">
+ Efternavn parameter skal være alfanumerisk
+Hvis du mener dette er en fejl, kontakt venligst support@secondlife.com.
+ </string>
+ <string name="LogoutFailedRegionGoingOffline">
+ Regionen er lukket ned.
+Prøv at logge på om lidt igen.
+ </string>
+ <string name="LogoutFailedAgentNotInRegion">
+ Avatar ikke i en region.
+Prøv venligst om lidt igen.
+ </string>
+ <string name="LogoutFailedPendingLogin">
+ The region was logging in another session.
+Please try logging in again in a minute.
+ </string>
+ <string name="LogoutFailedLoggingOut">
+ Region har lukket sidste session ned.
+Prøv venligst om lidt igen.
+ </string>
+ <string name="LogoutFailedStillLoggingOut">
+ Regionen er stadig ved at lukke forrige session ud.
+Prøv venligst om lidt igen.
+ </string>
+ <string name="LogoutSucceeded">
+ Region har lukket sidste session ned.
+Prøv venligst om lidt igen.
+ </string>
+ <string name="LogoutFailedLogoutBegun">
+ Region er i gang med at logge ud.
+Prøv venligst om lidt igen.
+ </string>
+ <string name="LoginFailedLoggingOutSession">
+ Region er i gang med at lukket sidste session ned.
+Prøv venligst om lidt igen.
+ </string>
<string name="AgentLostConnection">
Denne region kan have problemer. Tjek venligst din forbindelse til internettet.
</string>
@@ -423,6 +557,9 @@
<string name="symbolic folder link">
link til mappe
</string>
+ <string name="mesh">
+ mesh
+ </string>
<string name="AvatarAway">
Væk
</string>
@@ -852,6 +989,9 @@
<string name="tattoo">
Tatovering
</string>
+ <string name="physics">
+ Fysik
+ </string>
<string name="invalid">
ugyldig
</string>
@@ -891,6 +1031,9 @@
<string name="tattoo_not_worn">
Tatovering ikke benyttet
</string>
+ <string name="physics_not_worn">
+ Ikke noget fysisk båret
+ </string>
<string name="invalid_not_worn">
ugyldig
</string>
@@ -939,6 +1082,9 @@
<string name="create_new_tattoo">
Opret ny tatovering
</string>
+ <string name="create_new_physics">
+ Opret ny fysik
+ </string>
<string name="create_new_invalid">
ugyldig
</string>
@@ -1037,7 +1183,7 @@
</string>
<string name="WornOnAttachmentPoint" value=" (båret på [ATTACHMENT_POINT])"/>
<string name="ActiveGesture" value="[GESLABEL] (aktiv)"/>
- <string name="Chat" value=" Chat : "/>
+ <string name="Chat Message" value="Chat :"/>
<string name="Sound" value=" Lyd : "/>
<string name="Wait" value=" --- Vent : "/>
<string name="AnimFlagStop" value=" Stop Animation : "/>
@@ -1063,9 +1209,6 @@
<string name="InvFolder My Inventory">
Min beholdning
</string>
- <string name="InvFolder My Favorites">
- Mine favoritter
- </string>
<string name="InvFolder Library">
Bibliotek
</string>
@@ -1124,10 +1267,10 @@
Bevægelser
</string>
<string name="InvFolder Favorite">
- Favoritter
+ Mine favoritter
</string>
<string name="InvFolder favorite">
- Favoritter
+ Mine favoritter
</string>
<string name="InvFolder Current Outfit">
Nuværende sæt
@@ -1141,6 +1284,9 @@
<string name="InvFolder Accessories">
Tilbehør
</string>
+ <string name="InvFolder Meshes">
+ Meshes
+ </string>
<string name="InvFolder Friends">
Venner
</string>
@@ -1455,7 +1601,7 @@
(ukendt)
</string>
<string name="SummaryForTheWeek" value="Opsummering for denne uge, begyndende med "/>
- <string name="NextStipendDay" value="Næste stipendie dag er "/>
+ <string name="NextStipendDay" value=". Næste stipendie dag er "/>
<string name="GroupIndividualShare" value=" Gruppe Individuel Delt"/>
<string name="GroupColumn" value="Gruppe"/>
<string name="Balance">
@@ -1819,12 +1965,6 @@ Forventet .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
<string name="accel-win-shift">
Shift+
</string>
- <string name="Esc">
- Esc
- </string>
- <string name="Home">
- Hjem
- </string>
<string name="FileSaved">
Fil gemt
</string>
@@ -1942,6 +2082,9 @@ Forventet .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
<string name="Other">
Andet
</string>
+ <string name="Rental">
+ Leje
+ </string>
<string name="Any">
Enhver
</string>
@@ -2178,6 +2321,114 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE].
<string name="Bulbous Nose">
Kartoffelnæse
</string>
+ <string name="Breast Physics Mass">
+ Bryst fylde
+ </string>
+ <string name="Breast Physics Smoothing">
+ Brystudjævning
+ </string>
+ <string name="Breast Physics Gravity">
+ Bryst tyngde
+ </string>
+ <string name="Breast Physics Drag">
+ Bryst inerti
+ </string>
+ <string name="Breast Physics InOut Max Effect">
+ Maks. effekt
+ </string>
+ <string name="Breast Physics InOut Spring">
+ Fjeder
+ </string>
+ <string name="Breast Physics InOut Gain">
+ Øg
+ </string>
+ <string name="Breast Physics InOut Damping">
+ Dæmpning
+ </string>
+ <string name="Breast Physics UpDown Max Effect">
+ Maks. effekt
+ </string>
+ <string name="Breast Physics UpDown Spring">
+ Fjeder
+ </string>
+ <string name="Breast Physics UpDown Gain">
+ Øg
+ </string>
+ <string name="Breast Physics UpDown Damping">
+ Dæmpning
+ </string>
+ <string name="Breast Physics LeftRight Max Effect">
+ Maks. effekt
+ </string>
+ <string name="Breast Physics LeftRight Spring">
+ Fjeder
+ </string>
+ <string name="Breast Physics LeftRight Gain">
+ Øg
+ </string>
+ <string name="Breast Physics LeftRight Damping">
+ Dæmpning
+ </string>
+ <string name="Belly Physics Mass">
+ Mave omfang
+ </string>
+ <string name="Belly Physics Smoothing">
+ maveudjævning
+ </string>
+ <string name="Belly Physics Gravity">
+ Mave tyngde
+ </string>
+ <string name="Belly Physics Drag">
+ Mave inerti
+ </string>
+ <string name="Belly Physics UpDown Max Effect">
+ Maks. effekt
+ </string>
+ <string name="Belly Physics UpDown Spring">
+ Fjeder
+ </string>
+ <string name="Belly Physics UpDown Gain">
+ Øg
+ </string>
+ <string name="Belly Physics UpDown Damping">
+ Dæmpning
+ </string>
+ <string name="Butt Physics Mass">
+ Bagdel omfang
+ </string>
+ <string name="Butt Physics Smoothing">
+ Bagdelsudjævning
+ </string>
+ <string name="Butt Physics Gravity">
+ Bagdel tyngde
+ </string>
+ <string name="Butt Physics Drag">
+ Bagdel modstand
+ </string>
+ <string name="Butt Physics UpDown Max Effect">
+ Maks. effekt
+ </string>
+ <string name="Butt Physics UpDown Spring">
+ Fjeder
+ </string>
+ <string name="Butt Physics UpDown Gain">
+ Øg
+ </string>
+ <string name="Butt Physics UpDown Damping">
+ Dæmpning
+ </string>
+ <string name="Butt Physics LeftRight Max Effect">
+ Maks. effekt
+ </string>
+ <string name="Butt Physics LeftRight Spring">
+ Fjeder
+ </string>
+ <string name="Butt Physics LeftRight Gain">
+ Øg
+ </string>
+ <string name="Butt Physics LeftRight Damping">
+ Dæmpning
+ </string>
<string name="Bushy Eyebrows">
Buskede øjenbryn
</string>
@@ -2187,6 +2438,9 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE].
<string name="Butt Size">
Størrelse bagdel
</string>
+ <string name="Butt Gravity">
+ Bagdel tyngde
+ </string>
<string name="bustle skirt">
Tournure
</string>
@@ -3540,6 +3794,9 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE].
<string name="session_initialization_timed_out_error">
Initialisering af session er &quot;timed out&quot;
</string>
+ <string name="Home position set.">
+ Hjemmeposition sat.
+ </string>
<string name="voice_morphing_url">
http://secondlife.com/landing/voicemorphing
</string>
@@ -3662,6 +3919,9 @@ Krænkelsesanmeldelse
<string name="New Tattoo">
Ny tatovering
</string>
+ <string name="New Physics">
+ Ny fysik
+ </string>
<string name="Invalid Wearable">
Kan ikke tages på
</string>
@@ -3861,7 +4121,7 @@ Krænkelsesanmeldelse
<string name="Notices">
Beskeder
</string>
- <string name="Chat">
+ <string name="Chat" value=" Chat : ">
Chat
</string>
<string name="DeleteItems">
@@ -3873,4 +4133,348 @@ Krænkelsesanmeldelse
<string name="EmptyOutfitText">
Der er ingen genstande i dette sæt
</string>
+ <string name="ExternalEditorNotSet">
+ Vælg en editor via opsætningen for Ekstern editor.
+ </string>
+ <string name="ExternalEditorNotFound">
+ Kan ikke benytte deb eksterne editor der er angivet.
+Prøv at omkrandse stien til editor med anførselstegn.
+(f.eks. &quot;/stil til min editor&quot; &quot;%s&quot;)
+ </string>
+ <string name="ExternalEditorCommandParseError">
+ Fejl ved håndtering af kommando til ekstern editor.
+ </string>
+ <string name="ExternalEditorFailedToRun">
+ Den eksterne editor kunne ikke startes.
+ </string>
+ <string name="Esc">
+ Esc
+ </string>
+ <string name="Space">
+ Space
+ </string>
+ <string name="Enter">
+ 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="Home">
+ Hjem
+ </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">
+ Tilføj
+ </string>
+ <string name="Subtract">
+ Træk fra
+ </string>
+ <string name="Multiply">
+ Multiplicer
+ </string>
+ <string name="Divide">
+ Divider
+ </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">
+ Viser pejlelys for for partikler (blå)
+ </string>
+ <string name="BeaconPhysical">
+ Viser pejlelys for fysiske objekter (grøn)
+ </string>
+ <string name="BeaconScripted">
+ Viser pejlelys for &quot;scriptede&quot; objekter (rød)
+ </string>
+ <string name="BeaconScriptedTouch">
+ Viser pejlelys for &quot;scriptede&quot; objekter med berøringsfunktion (rød)
+ </string>
+ <string name="BeaconSound">
+ Viser pejlelys for lyd (gul)
+ </string>
+ <string name="BeaconMedia">
+ Viser pejlelys for media (hvid)
+ </string>
+ <string name="ParticleHiding">
+ Skjuler partikler
+ </string>
</strings>
diff --git a/indra/newview/skins/default/xui/de/floater_about.xml b/indra/newview/skins/default/xui/de/floater_about.xml
index d15ab105c2..578dcd50e5 100644
--- a/indra/newview/skins/default/xui/de/floater_about.xml
+++ b/indra/newview/skins/default/xui/de/floater_about.xml
@@ -55,27 +55,33 @@ Wir bedanken uns bei folgenden Einwohnern, die uns geholfen haben, dies zur bish
</panel>
<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
-cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se)
+ 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)
+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
+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)
+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.
-Alle Rechte vorbehalten. Details siehe licenses.txt.
+Second Life Viewer verwendet Havok (TM) Physics. (c)Copyright 1999-2010 Havok.com Inc. (und Lizenzgeber). Alle Rechte vorbehalten. Details siehe www.havok.com.
+
+Alle Rechte vorbehalten. Details siehe licenses.txt.
-Voice-Chat-Audiocoding: Polycom(R) Siren14(TM)
-(ITU-T Empf.G.722.1 Anhang 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 2d8459479a..f0fa4386d2 100644
--- a/indra/newview/skins/default/xui/de/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/de/floater_about_land.xml
@@ -103,17 +103,17 @@
Preis: [PRICE] L$ ([PRICE_PER_SQM]L$/m²)
</text>
<text name="SalePending"/>
- <button bottom="-222" label="Land verkaufen" label_selected="Land verkaufen..." name="Sell Land..."/>
+ <button label="Land verkaufen" label_selected="Land verkaufen..." name="Sell Land..."/>
<text name="For sale to">
Zum Verkauf an: [BUYER]
</text>
- <text left_delta="-50" name="Sell with landowners objects in parcel." width="240">
+ <text name="Sell with landowners objects in parcel.">
Objekte sind im Verkauf eingeschlossen
</text>
- <text name="Selling with no objects in parcel." width="260">
+ <text name="Selling with no objects in parcel.">
Objekte sind im Verkauf nicht eingeschlossen
</text>
- <button bottom="-222" label="Landverkauf abbrechen" label_selected="Landverkauf abbrechen" name="Cancel Land Sale"/>
+ <button label="Landverkauf abbrechen" label_selected="Landverkauf abbrechen" name="Cancel Land Sale"/>
<text name="Claimed:">
Gekauft am:
</text>
@@ -219,38 +219,38 @@ werden.
<text name="objects_available">
[COUNT] von [MAX] ([AVAILABLE] verfügbar)
</text>
- <text name="Primitives parcel supports:" width="200">
+ <text name="Primitives parcel supports:">
Von Parzelle unterstützte Prims:
</text>
- <text left="204" name="object_contrib_text" width="152">
+ <text name="object_contrib_text">
[COUNT]
</text>
<text name="Primitives on parcel:">
Prims auf Parzelle:
</text>
- <text left="204" name="total_objects_text" width="48">
+ <text name="total_objects_text">
[COUNT]
</text>
- <text left="14" name="Owned by parcel owner:" width="200">
+ <text name="Owned by parcel owner:" width="200">
Im Eigentum des Parzellenbesitzers:
</text>
- <text left="204" left_delta="200" name="owner_objects_text" width="48">
+ <text left_delta="204" name="owner_objects_text">
[COUNT]
</text>
- <button label="Anzeigen" label_selected="Anzeigen" name="ShowOwner" right="-135" width="60"/>
- <button label="Zurückgeben" label_selected="Zurückgeben..." name="ReturnOwner..." right="-10" tool_tip="Objekte an ihre Eigentümer zurückgeben." width="119"/>
- <text left="14" name="Set to group:">
+ <button label="Anzeigen" label_selected="Anzeigen" name="ShowOwner"/>
+ <button label="Zurückgeben" label_selected="Zurückgeben..." name="ReturnOwner..." tool_tip="Objekte an ihre Eigentümer zurückgeben."/>
+ <text name="Set to group:">
Der Gruppe zugeordnet:
</text>
- <text left="204" name="group_objects_text" width="48">
+ <text name="group_objects_text">
[COUNT]
</text>
- <button label="Anzeigen" label_selected="Anzeigen" name="ShowGroup" right="-135" width="60"/>
- <button label="Zurückgeben" label_selected="Zurückgeben..." name="ReturnGroup..." right="-10" tool_tip="Objekte an ihre Eigentümer zurückgeben." width="119"/>
- <text left="14" name="Owned by others:" width="128">
+ <button label="Anzeigen" label_selected="Anzeigen" name="ShowGroup"/>
+ <button label="Zurückgeben" label_selected="Zurückgeben..." name="ReturnGroup..." tool_tip="Objekte an ihre Eigentümer zurückgeben."/>
+ <text name="Owned by others:">
Im Eigentum anderer:
</text>
- <text left="204" name="other_objects_text" width="48">
+ <text name="other_objects_text">
[COUNT]
</text>
<button label="Anzeigen" label_selected="Anzeigen" name="ShowOther"/>
diff --git a/indra/newview/skins/default/xui/de/floater_buy_contents.xml b/indra/newview/skins/default/xui/de/floater_buy_contents.xml
index ccafa11cf4..bd6ace6bda 100644
--- a/indra/newview/skins/default/xui/de/floater_buy_contents.xml
+++ b/indra/newview/skins/default/xui/de/floater_buy_contents.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater min_width="300" name="floater_buy_contents" title="INHALT KAUFEN">
<text name="contains_text">
- [NAME] enthält:
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; enthält:
</text>
<text name="buy_text">
[AMOUNT] L$ von [NAME] kaufen?
diff --git a/indra/newview/skins/default/xui/de/floater_buy_land.xml b/indra/newview/skins/default/xui/de/floater_buy_land.xml
index 5369155cf9..ca4ee8981b 100644
--- a/indra/newview/skins/default/xui/de/floater_buy_land.xml
+++ b/indra/newview/skins/default/xui/de/floater_buy_land.xml
@@ -127,41 +127,41 @@ unterstützt [AMOUNT2] Objekte
<text name="region_name_label">
Region:
</text>
- <text left="680" left_delta="140" name="region_name_text">
+ <text name="region_name_text">
(unbekannt)
</text>
<text name="region_type_label">
Typ:
</text>
- <text left="680" left_delta="140" name="region_type_text">
+ <text name="region_type_text">
(unbekannt)
</text>
<text name="estate_name_label">
Grundbesitz:
</text>
- <text left="680" left_delta="140" name="estate_name_text">
+ <text name="estate_name_text">
(unbekannt)
</text>
- <text name="estate_owner_label" right="600" width="200">
+ <text name="estate_owner_label">
Grundbesitzer:
</text>
- <text left="680" left_delta="140" name="estate_owner_text">
+ <text name="estate_owner_text">
(unbekannt)
</text>
- <text left="410" name="resellable_changeable_label">
+ <text name="resellable_changeable_label">
Gekauftes Land in dieser Region:
</text>
- <text left="410" name="resellable_clause">
+ <text name="resellable_clause">
Wiederverkauf möglich oder nicht möglich.
</text>
- <text left="410" name="changeable_clause">
+ <text name="changeable_clause">
Darft oder darf nicht zusammengelegt/unterteilt werden.
</text>
- <text left="410" name="covenant_text">
+ <text name="covenant_text">
Sie müssen dem Grundbesitzvertrag zustimmen:
</text>
- <text left="470" name="covenant_timestamp_text"/>
- <text_editor left="470" name="covenant_editor">
+ <text name="covenant_timestamp_text"/>
+ <text_editor name="covenant_editor">
Wird geladen...
</text_editor>
<check_box label="Ich stimme dem obigen Vertrag zu." name="agree_covenant"/>
@@ -191,7 +191,7 @@ Objekte im Verkauf eingeschlossen
<text name="error_message">
Irgendetwas stimmt nicht.
</text>
- <button label="Gehe zu Website" name="error_web" top_delta="136"/>
+ <button label="Gehe zu Website" name="error_web" />
<text name="account_action">
Macht Sie zum Premium-Mitglied.
</text>
@@ -203,9 +203,8 @@ Objekte im Verkauf eingeschlossen
<combo_box.item label="7,50 US$/Monat, vierteljährliche Abrechnung" name="US$7.50/month,billedquarterly"/>
<combo_box.item label="6,00 US$/Monat, jährliche Abrechnung" name="US$6.00/month,billedannually"/>
</combo_box>
- <text height="36" name="land_use_action" top="270">
- Erhöhen Sie Ihre monatlichen Landnutzungsgebühren
-auf 40 US$/month.
+ <text name="land_use_action">
+ Erhöhen Sie Ihre monatlichen Landnutzungsgebühren auf 40 US$/month.
</text>
<text name="land_use_reason">
Sie besitzen 1309 m² Land.
diff --git a/indra/newview/skins/default/xui/de/floater_customize.xml b/indra/newview/skins/default/xui/de/floater_customize.xml
deleted file mode 100644
index 3651577797..0000000000
--- a/indra/newview/skins/default/xui/de/floater_customize.xml
+++ /dev/null
@@ -1,529 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater customize" title="AUSSEHEN">
- <tab_container name="customize tab container">
- <text label="Körperteile" name="body_parts_placeholder">
- Körperteile
- </text>
- <panel label="Form" name="Shape">
- <button font="SansSerifSmall" label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/>
- <button label="Körper" label_selected="Körper" name="Body"/>
- <button label="Kopf" label_selected="Kopf" name="Head"/>
- <button label="Augen" label_selected="Augen" name="Eyes"/>
- <button label="Ohren" label_selected="Ohren" name="Ears"/>
- <button label="Nase" label_selected="Nase" name="Nose"/>
- <button label="Mund" label_selected="Mund" name="Mouth"/>
- <button label="Kinn" label_selected="Kinn" name="Chin"/>
- <button label="Oberkörper" label_selected="Oberkörper" name="Torso"/>
- <button label="Beine" label_selected="Beine" name="Legs"/>
- <radio_group name="sex radio">
- <radio_item label="Weiblich" name="radio" value="0"/>
- <radio_item label="Männlich" name="radio2" value="1"/>
- </radio_group>
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: bearbeiten nicht möglich
- </text>
- <text name="title_loading">
- [DESC]: wird geladen...
- </text>
- <text name="title_not_worn">
- [DESC]: nicht getragen
- </text>
- <text name="path">
- In [PATH]
- </text>
- <text name="not worn instructions">
- Ziehen Sie eine neue Form aus dem Inventar auf Ihren Avatar, um diese anzulegen. Sie können aber auch eine neue erstellen und diese anlegen.
- </text>
- <text name="no modify instructions">
- Sie sind nicht berechtigt, diese Kleidung zu bearbeiten.
- </text>
- <text name="Item Action Label">
- Form:
- </text>
- <button label="Neue Form/Gestalt" label_selected="Neue Form/Gestalt" name="Create New"/>
- <button font="SansSerifSmall" label="Speichern" label_selected="Speichern" name="Save"/>
- <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/>
- </panel>
- <panel label="Haut" name="Skin">
- <button label="Hautfarbe" label_selected="Hautfarbe" left="2" name="Skin Color" width="92"/>
- <button label="Gesichtsdetails" label_selected="Gesichtsdetails" left="2" name="Face Detail" width="92"/>
- <button label="Make-Up" label_selected="Make-Up" left="2" name="Makeup" width="92"/>
- <button label="Körperdetails" label_selected="Körperdetails" left="2" name="Body Detail" width="92"/>
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: bearbeiten nicht möglich
- </text>
- <text name="title_loading">
- [DESC]: wird geladen...
- </text>
- <text name="title_not_worn">
- [DESC]: nicht getragen
- </text>
- <text name="path">
- In [PATH]
- </text>
- <text name="not worn instructions">
- Ziehen Sie eine neue Skin (Haut) aus dem Inventar auf Ihren Avatar, um diese anzulegen. Sie können aber auch eine neue erstellen und diese anlegen.
- </text>
- <text name="no modify instructions">
- Sie sind nicht berechtigt, diese Kleidung zu bearbeiten.
- </text>
- <text name="Item Action Label" right="100">
- Haut:
- </text>
- <texture_picker label="Kopftattoo" name="Head Tattoos" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/>
- <texture_picker label="Obere Tattoos" name="Upper Tattoos" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/>
- <texture_picker label="Untere Tattoos" name="Lower Tattoos" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/>
- <button label="Neue Haut" label_selected="Neue Haut" name="Create New"/>
- <button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/>
- <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/>
- <button font="SansSerifSmall" label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/>
- </panel>
- <panel label="Haar" name="Hair">
- <button label="Farbe" label_selected="Farbe" name="Color"/>
- <button label="Stil" label_selected="Stil" name="Style"/>
- <button label="Augenbrauen" label_selected="Augenbrauen" name="Eyebrows"/>
- <button label="Gesichtshaar" label_selected="Gesichtshaar" name="Facial"/>
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: bearbeiten nicht möglich
- </text>
- <text name="title_loading">
- [DESC]: wird geladen...
- </text>
- <text name="title_not_worn">
- [DESC]: nicht getragen
- </text>
- <text name="path">
- In [PATH]
- </text>
- <text name="not worn instructions">
- Ziehen Sie Haar aus dem Inventar auf Ihren Avatar, um dieses anzulegen. Sie können aber auch neues Haar erstellen und anlegen.
- </text>
- <text name="no modify instructions">
- Sie sind nicht berechtigt, diese Kleidung zu bearbeiten.
- </text>
- <text name="Item Action Label" right="100">
- Haare:
- </text>
- <texture_picker label="Textur" name="Texture" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/>
- <button label="Neue Haare" label_selected="Neue Haare" name="Create New"/>
- <button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/>
- <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/>
- <button font="SansSerifSmall" label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/>
- </panel>
- <panel label="Augen" name="Eyes">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: bearbeiten nicht möglich
- </text>
- <text name="title_loading">
- [DESC]: wird geladen...
- </text>
- <text name="title_not_worn">
- [DESC]: nicht getragen
- </text>
- <text name="path">
- In [PATH]
- </text>
- <text name="not worn instructions">
- Ziehen Sie neue Augen aus dem Inventar auf Ihren Avatar, um diese anzulegen. Sie können aber auch neue Augen erstellen und diese anlegen.
- </text>
- <text name="no modify instructions">
- Sie sind nicht berechtigt, diese Kleidung zu bearbeiten.
- </text>
- <text name="Item Action Label" right="100">
- Augen:
- </text>
- <texture_picker label="Iris" name="Iris" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/>
- <button label="Neue Augen" label_selected="Neue Augen" name="Create New"/>
- <button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/>
- <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/>
- <button font="SansSerifSmall" label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/>
- </panel>
- <text label="Kleidung" name="clothes_placeholder">
- Kleidung
- </text>
- <panel label="Hemd" name="Shirt">
- <texture_picker label="Stoff" name="Fabric" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/>
- <color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
- <button font="SansSerifSmall" label="Ausziehen" label_selected="Ausziehen" name="Take Off"/>
- <button label="Neues Hemd" label_selected="Neues Hemd" name="Create New"/>
- <button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/>
- <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/>
- <button font="SansSerifSmall" label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/>
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: bearbeiten nicht möglich
- </text>
- <text name="title_loading">
- [DESC]: wird geladen...
- </text>
- <text name="title_not_worn">
- [DESC]: nicht getragen
- </text>
- <text name="path">
- In [PATH]
- </text>
- <text name="not worn instructions">
- Ziehen Sie ein neues Hemd aus dem Inventar auf Ihren Avatar, um dieses anzuziehen. Sie können aber auch ein neues Hemd erstellen und dieses anlegen.
- </text>
- <text name="no modify instructions">
- Sie sind nicht berechtigt, diese Kleidung zu bearbeiten.
- </text>
- <text name="Item Action Label" right="100">
- Hemd:
- </text>
- </panel>
- <panel label="Hose" name="Pants">
- <texture_picker label="Stoff" name="Fabric" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/>
- <color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
- <button font="SansSerifSmall" label="Ausziehen" label_selected="Ausziehen" name="Take Off"/>
- <button label="Neue Hose" label_selected="Neue Hose" name="Create New"/>
- <button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/>
- <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/>
- <button font="SansSerifSmall" label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/>
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: bearbeiten nicht möglich
- </text>
- <text name="title_loading">
- [DESC]: wird geladen...
- </text>
- <text name="title_not_worn">
- [DESC]: nicht getragen
- </text>
- <text name="path">
- In [PATH]
- </text>
- <text name="not worn instructions">
- Ziehen Sie eine neue Hose aus dem Inventar auf Ihren Avatar, um diese anzuziehen. Sie können aber auch eine neue erstellen und diese anziehen.
- </text>
- <text name="no modify instructions">
- Sie sind nicht berechtigt, diese Kleidung zu bearbeiten.
- </text>
- <text name="Item Action Label" right="100">
- Hose:
- </text>
- </panel>
- <panel label="Schuhe" name="Shoes">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: bearbeiten nicht möglich
- </text>
- <text name="title_loading">
- [DESC]: wird geladen...
- </text>
- <text name="title_not_worn">
- [DESC]: nicht getragen
- </text>
- <text name="path">
- In [PATH]
- </text>
- <text name="not worn instructions">
- Ziehen Sie neue Schuhe aus dem Inventar auf Ihren Avatar, um diese anzuziehen. Sie können aber auch neue Schuhe erstellen und diese anlegen.
- </text>
- <button label="Neue Schuhe" label_selected="Neue Schuhe" name="Create New"/>
- <text name="no modify instructions">
- Sie sind nicht berechtigt, diese Kleidung zu bearbeiten.
- </text>
- <text name="Item Action Label" right="100">
- Schuhe:
- </text>
- <texture_picker label="Stoff" name="Fabric" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/>
- <color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
- <button font="SansSerifSmall" label="Ausziehen" label_selected="Ausziehen" name="Take Off"/>
- <button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/>
- <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/>
- <button font="SansSerifSmall" label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/>
- </panel>
- <panel label="Socken" name="Socks">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: bearbeiten nicht möglich
- </text>
- <text name="title_loading">
- [DESC]: wird geladen...
- </text>
- <text name="title_not_worn">
- [DESC]: nicht getragen
- </text>
- <text name="path">
- In [PATH]
- </text>
- <text name="not worn instructions">
- Ziehen Sie neue Socken aus dem Inventar auf Ihren Avatar, um diese anzuziehen. Sie können aber auch neue erstellen und diese anziehen.
- </text>
- <button label="Neue Socken" label_selected="Neue Socken" name="Create New"/>
- <text name="no modify instructions">
- Sie sind nicht berechtigt, diese Kleidung zu bearbeiten.
- </text>
- <text name="Item Action Label" right="100">
- Socken:
- </text>
- <texture_picker label="Stoff" name="Fabric" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/>
- <color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
- <button font="SansSerifSmall" label="Ausziehen" label_selected="Ausziehen" name="Take Off"/>
- <button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/>
- <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/>
- <button font="SansSerifSmall" label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/>
- </panel>
- <panel label="Jacke" name="Jacket">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: bearbeiten nicht möglich
- </text>
- <text name="title_loading">
- [DESC]: wird geladen...
- </text>
- <text name="title_not_worn">
- [DESC]: nicht getragen
- </text>
- <text name="path">
- In [PATH]
- </text>
- <text name="not worn instructions">
- Ziehen Sie eine neue Jacke aus dem Inventar auf Ihren Avatar, um diese anzuziehen. Sie können aber auch eine neue erstellen und diese anziehen.
- </text>
- <button label="Neue Jacke" label_selected="Neue Jacke" name="Create New"/>
- <text name="no modify instructions">
- Sie sind nicht berechtigt, diese Kleidung zu bearbeiten.
- </text>
- <text name="Item Action Label" right="100">
- Jacke:
- </text>
- <texture_picker label="Stoff: oben" name="Upper Fabric" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/>
- <texture_picker label="Stoff: unten" name="Lower Fabric" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/>
- <color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
- <button font="SansSerifSmall" label="Ausziehen" label_selected="Ausziehen" name="Take Off"/>
- <button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/>
- <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/>
- <button font="SansSerifSmall" label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/>
- </panel>
- <panel label="Handschuhe" name="Gloves">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: bearbeiten nicht möglich
- </text>
- <text name="title_loading">
- [DESC]: wird geladen...
- </text>
- <text name="title_not_worn">
- [DESC]: nicht getragen
- </text>
- <text name="path">
- In [PATH]
- </text>
- <text name="not worn instructions">
- Ziehen Sie neue Handschuhe aus dem Inventar auf Ihren Avatar, um diese anzuziehen. Sie können aber auch neue erstellen und diese anziehen.
- </text>
- <button label="Neue Handschuhe" label_selected="Neue Handschuhe" name="Create New"/>
- <text name="no modify instructions">
- Sie sind nicht berechtigt, diese Kleidung zu bearbeiten.
- </text>
- <text name="Item Action Label" right="100">
- Handschuhe:
- </text>
- <texture_picker label="Stoff" name="Fabric" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/>
- <color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
- <button font="SansSerifSmall" label="Ausziehen" label_selected="Ausziehen" name="Take Off"/>
- <button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/>
- <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/>
- <button font="SansSerifSmall" label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/>
- </panel>
- <panel label="Unterhemd" name="Undershirt">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: bearbeiten nicht möglich
- </text>
- <text name="title_loading">
- [DESC]: wird geladen...
- </text>
- <text name="title_not_worn">
- [DESC]: nicht getragen
- </text>
- <text name="path">
- In [PATH]
- </text>
- <text name="not worn instructions">
- Ziehen Sie ein neues Unterhemd aus dem Inventar auf Ihren Avatar, um dieses anzuziehen. Sie können aber auch ein neues Unterhemd erstellen und dieses anziehen.
- </text>
- <button label="Neues Unterhemd" label_selected="Neues Unterhemd" name="Create New"/>
- <text name="no modify instructions">
- Sie sind nicht berechtigt, diese Kleidung zu bearbeiten.
- </text>
- <text name="Item Action Label" right="100">
- Unterhemd:
- </text>
- <texture_picker label="Stoff" name="Fabric" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/>
- <color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
- <button font="SansSerifSmall" label="Ausziehen" label_selected="Ausziehen" name="Take Off"/>
- <button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/>
- <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/>
- <button font="SansSerifSmall" label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/>
- </panel>
- <panel label="Unterhose" name="Underpants">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: bearbeiten nicht möglich
- </text>
- <text name="title_loading">
- [DESC]: wird geladen...
- </text>
- <text name="title_not_worn">
- [DESC]: nicht getragen
- </text>
- <text name="path">
- In [PATH]
- </text>
- <text name="not worn instructions">
- Ziehen Sie eine neue Unterhose aus dem Inventar auf Ihren Avatar, um diese anzuziehen. Sie können aber auch eine neue erstellen und diese anziehen.
- </text>
- <button label="Neue Unterhose" label_selected="Neue Unterhose" name="Create New"/>
- <text name="no modify instructions">
- Sie sind nicht berechtigt, diese Kleidung zu bearbeiten.
- </text>
- <text name="Item Action Label" right="100">
- Unterhose:
- </text>
- <texture_picker label="Stoff" name="Fabric" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/>
- <color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
- <button font="SansSerifSmall" label="Ausziehen" label_selected="Ausziehen" name="Take Off"/>
- <button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/>
- <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/>
- <button font="SansSerifSmall" label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/>
- </panel>
- <panel label="Rock" name="Skirt">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: bearbeiten nicht möglich
- </text>
- <text name="title_loading">
- [DESC]: wird geladen...
- </text>
- <text name="title_not_worn">
- [DESC]: nicht getragen
- </text>
- <text name="path">
- In [PATH]
- </text>
- <text name="not worn instructions">
- Ziehen Sie einen neuen Rock aus dem Inventar auf Ihren Avatar, um diesen anzuziehen. Sie können aber auch einen neuen Rock erstellen und diesen anziehen.
- </text>
- <button label="Neuer Rock" label_selected="Neuer Rock" name="Create New"/>
- <text name="no modify instructions">
- Sie sind nicht berechtigt, diese Kleidung zu bearbeiten.
- </text>
- <text name="Item Action Label" right="100">
- Rock:
- </text>
- <texture_picker label="Stoff" name="Fabric" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/>
- <color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
- <button font="SansSerifSmall" label="Ausziehen" label_selected="Ausziehen" name="Take Off"/>
- <button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/>
- <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/>
- <button font="SansSerifSmall" label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/>
- </panel>
- <panel label="Tätowierung" name="Tattoo">
- <text name="title">
- Tätowierung
- </text>
- <text name="title_no_modify">
- [BESCHR]: bearbeiten nicht möglich
- </text>
- <text name="title_loading">
- [BESCHR]: wird geladen...
- </text>
- <text name="title_not_worn">
- [BESCHR]: nicht getragen
- </text>
- <text name="path">
- Befindet sich in [PATH]
- </text>
- <text name="not worn instructions">
- Ziehen Sie eine neue Tätowierung aus dem Inventar auf Ihren Avatar, um diese anzulegen. Sie können aber auch eine neue erstellen und diese anlegen.
- </text>
- <button label="Neue Tätowierung erstellen" label_selected="Neue Tätowierung erstellen" name="Create New"/>
- <text name="no modify instructions">
- Sie sind nicht berechtigt, diese Kleidung zu bearbeiten.
- </text>
- <text name="Item Action Label">
- Tätowierung:
- </text>
- <texture_picker label="Kopftattoo" name="Head Tattoo" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
- <texture_picker label="Obere Tattoos" name="Upper Tattoo" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
- <texture_picker label="Untere Tattoos" name="Lower Tattoo" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
- <button label="Ausziehen" label_selected="Ausziehen" name="Take Off"/>
- <button label="Speichern" label_selected="Speichern" name="Save"/>
- <button label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/>
- <button label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/>
- </panel>
- <panel label="Alpha" name="Alpha">
- <text name="title">
- Alpha
- </text>
- <text name="title_no_modify">
- [BESCHR]: bearbeiten nicht möglich
- </text>
- <text name="title_loading">
- [BESCHR]: wird geladen...
- </text>
- <text name="title_not_worn">
- [BESCHR]: nicht getragen
- </text>
- <text name="path">
- Befindet sich in [PATH]
- </text>
- <text name="not worn instructions">
- Sie können eine neue Alpha-Maske anlegen, indem Sie eine von Ihrem Inventar auf Ihren Avatar ziehen. Sie können aber auch eine neue erstellen und diese anlegen.
- </text>
- <button label="Neue Alpha erstellen" label_selected="Neue Alpha erstellen" name="Create New"/>
- <text name="no modify instructions">
- Sie sind nicht berechtigt, diese Kleidung zu bearbeiten.
- </text>
- <text name="Item Action Label">
- Alpha:
- </text>
- <texture_picker label="Alpha: Unten" name="Lower Alpha" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
- <texture_picker label="Alpha: Oben" name="Upper Alpha" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
- <texture_picker label="Kopf: Alpha" name="Head Alpha" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
- <texture_picker label="Alpha: Augen" name="Eye Alpha" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
- <texture_picker label="Alpha: Haare" name="Hair Alpha" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
- <button label="Ausziehen" label_selected="Ausziehen" name="Take Off"/>
- <button label="Speichern" label_selected="Speichern" name="Save"/>
- <button label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/>
- <button label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/>
- </panel>
- </tab_container>
- <button label="Skriptinfo" label_selected="Skriptinfo" name="script_info" tool_tip="Skripts, die an Ihren Avatar angehängt sind, anzeigen"/>
- <button label="Outfit erstellen" label_selected="Outfit erstellen" name="make_outfit_btn"/>
- <button label="Abbrechen" label_selected="Abbrechen" name="Cancel"/>
- <button label="OK" label_selected="OK" name="Ok"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/de/floater_day_cycle_options.xml
deleted file mode 100644
index 8599737106..0000000000
--- a/indra/newview/skins/default/xui/de/floater_day_cycle_options.xml
+++ /dev/null
@@ -1,94 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Day Cycle Floater" title="TAGESZYKLUS-EDITOR">
- <tab_container name="Day Cycle Tabs">
- <panel label="Tageszyklus" name="Day Cycle">
- <button label=" ?" name="WLDayCycleHelp"/>
- <text name="WL12am">
- 24:00
- </text>
- <text name="WL3am">
- 03:00
- </text>
- <text name="WL6am">
- 06:00
- </text>
- <text name="WL9amHash">
- 09:00
- </text>
- <text name="WL12pmHash">
- 12:00
- </text>
- <text name="WL3pm">
- 15:00
- </text>
- <text name="WL6pm">
- 18:00
- </text>
- <text name="WL9pm">
- 21:00
- </text>
- <text name="WL12am2">
- 24:00
- </text>
- <text name="WL12amHash">
- |
- </text>
- <text name="WL3amHash">
- I
- </text>
- <text name="WL6amHash">
- |
- </text>
- <text name="WL9amHash2">
- I
- </text>
- <text name="WL12pmHash2">
- |
- </text>
- <text name="WL3pmHash">
- I
- </text>
- <text name="WL6pmHash">
- |
- </text>
- <text name="WL9pmHash">
- I
- </text>
- <text name="WL12amHash2">
- |
- </text>
- <button label="Key hinzu" label_selected="Key hinzu" name="WLAddKey"/>
- <button label="Key löschen" label_selected="Key löschen" name="WLDeleteKey"/>
- <text name="WLCurKeyFrameText">
- Keyframe-Einstellungen:
- </text>
- <text name="WLCurKeyTimeText">
- Key-Zeit:
- </text>
- <spinner label="Std." name="WLCurKeyHour"/>
- <spinner label="Min." name="WLCurKeyMin"/>
- <text name="WLCurKeyTimeText2">
- Key-Voreinstellung:
- </text>
- <combo_box label="Voreinstellung" name="WLKeyPresets"/>
- <text name="DayCycleText">
- Einrasten:
- </text>
- <combo_box label="5 min" name="WLSnapOptions"/>
- <text name="DayCycleText2">
- Zykluslänge:
- </text>
- <spinner label="Std." name="WLLengthOfDayHour"/>
- <spinner label="Min." name="WLLengthOfDayMin"/>
- <spinner label="Sek." name="WLLengthOfDaySec"/>
- <text name="DayCycleText3">
- Vorschau:
- </text>
- <button label="Start" label_selected="Start" name="WLAnimSky"/>
- <button label="Stopp" label_selected="Stopp" name="WLStopAnimSky"/>
- <button label="Grundbesitzzeit verw" label_selected="Zur Grundbesitzzeit" name="WLUseLindenTime"/>
- <button label="Testtag speichern" label_selected="Testtag speichern" name="WLSaveDayCycle"/>
- <button label="Testtag laden" label_selected="Testtag laden" name="WLLoadDayCycle"/>
- </panel>
- </tab_container>
-</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_env_settings.xml b/indra/newview/skins/default/xui/de/floater_env_settings.xml
deleted file mode 100644
index 0c78909108..0000000000
--- a/indra/newview/skins/default/xui/de/floater_env_settings.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Environment Editor Floater" title="UMWELT-EDITOR">
- <floater.string name="timeStr">
- [hour12,datetime,utc]:[min,datetime,utc] [ampm,datetime,utc]
- </floater.string>
- <text name="EnvTimeText">
- Tageszeit
- </text>
- <text name="EnvTimeText2">
- 12:00
- </text>
- <text name="EnvCloudText">
- Wolkendecke
- </text>
- <text name="EnvWaterColorText">
- Wasserfarbe
- </text>
- <color_swatch name="EnvWaterColor" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
- <text name="EnvWaterFogText">
- Wasser-
-trübung
- </text>
- <button label="Grundbesitzzeit verw." name="EnvUseEstateTimeButton"/>
- <button label="Himmel (erweitert)" name="EnvAdvancedSkyButton"/>
- <button label="Wasser (erweitert)" name="EnvAdvancedWaterButton"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_import_collada.xml b/indra/newview/skins/default/xui/de/floater_import_collada.xml
new file mode 100644
index 0000000000..8b1313c7b5
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_import_collada.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Import Collada" title="Szene importieren">
+ <text name="mesh count">
+ Netze: [COUNT]
+ </text>
+ <text name="texture count">
+ Texturen: [COUNT]
+ </text>
+ <text name="status">
+ Status: [STATUS]
+ </text>
+ <button label="Abbrechen" name="cancel"/>
+ <button label="OK" name="ok"/>
+ <string name="status_idle">
+ Inaktiv
+ </string>
+ <string name="status_uploading">
+ [NAME] wird hochgeladen
+ </string>
+ <string name="status_creating">
+ Objektname [NAME] wird erstellt
+ </string>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/de/floater_inventory_view_finder.xml
index 9cc5b92daf..d63426d684 100644
--- a/indra/newview/skins/default/xui/de/floater_inventory_view_finder.xml
+++ b/indra/newview/skins/default/xui/de/floater_inventory_view_finder.xml
@@ -5,6 +5,7 @@
<check_box label="Kleidung" name="check_clothing"/>
<check_box label="Gesten" name="check_gesture"/>
<check_box label="Landmarken" name="check_landmark"/>
+ <check_box label="Netze" name="check_mesh"/>
<check_box label="Notizkarten" name="check_notecard"/>
<check_box label="Objekte" name="check_object"/>
<check_box label="Skripts" name="check_script"/>
diff --git a/indra/newview/skins/default/xui/de/floater_model_preview.xml b/indra/newview/skins/default/xui/de/floater_model_preview.xml
new file mode 100644
index 0000000000..83c51132ee
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_model_preview.xml
@@ -0,0 +1,231 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Model Preview" title="Modell hochladen">
+ <string name="status_idle">
+ Inaktiv
+ </string>
+ <string name="status_reading_file">
+ Laden...
+ </string>
+ <string name="status_generating_meshes">
+ Netze werden generiert...
+ </string>
+ <string name="status_vertex_number_overflow">
+ Fehler: Anzahl von Vertices überschreitet 65534. Operation abgebrochen.
+ </string>
+ <string name="high">
+ Hoch
+ </string>
+ <string name="medium">
+ Mittel
+ </string>
+ <string name="low">
+ Niedrig
+ </string>
+ <string name="lowest">
+ Niedrigste
+ </string>
+ <string name="mesh_status_good">
+ Ausliefern
+ </string>
+ <string name="mesh_status_na">
+ --
+ </string>
+ <string name="mesh_status_none">
+ Keine
+ </string>
+ <string name="mesh_status_submesh_mismatch">
+ Detailstufen haben unterschiedliche Anzahl texturfähiger Flächen.
+ </string>
+ <string name="mesh_status_mesh_mismatch">
+ Detailstufen haben unterschiedliche Anzahl von Netzinstanzen.
+ </string>
+ <string name="mesh_status_too_many_vertices">
+ Detailstufe hat zu viele Vertices.
+ </string>
+ <string name="mesh_status_missing_lod">
+ Erforderliche Detailstufe fehlt.
+ </string>
+ <string name="layer_all">
+ Alle
+ </string>
+ <string name="decomposing">
+ Analyse läuft...
+ </string>
+ <string name="simplifying">
+ Vereinfachung läuft...
+ </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>
+ <panel>
+ <text name="streaming cost">
+ Ressourcenkosten: [COST]
+ </text>
+ <text name="physics cost">
+ Physikkosten: [COST]
+ </text>
+ <text name="upload fee">
+ Gebühr für Hochladen: --
+ </text>
+ </panel>
+ <text name="status">
+ [STATUS]
+ </text>
+ <button label="Standardwerte" name="reset_btn" tool_tip="Standardwerte wiederherstellen"/>
+ <button label="Hochladen" name="ok_btn" tool_tip="An Simulator hochladen"/>
+ <button label="Abbrechen" name="cancel_btn"/>
+ <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:
+ </text>
+ <text name="share_tolderance_text">
+ Sharetoleranz:
+ </text>
+ <combo_box name="border_mode">
+ <combo_item name="border_unlock">
+ Freigeben
+ </combo_item>
+ <combo_item name="border_lock">
+ Sperren
+ </combo_item>
+ </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"/>
+ </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>
+ <panel name="physics info">
+ <slider label="Vorschaudehnung:" name="physics_explode"/>
+ <text name="physics_triangles">
+ Dreiecke: [TRIANGLES]
+ </text>
+ <text name="physics_points">
+ Vertices: [POINTS]
+ </text>
+ <text name="physics_hulls">
+ Hüllen: [HULLS]
+ </text>
+ </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
+ </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>
+</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
new file mode 100644
index 0000000000..2c7b45906e
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_model_wizard.xml
@@ -0,0 +1,241 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Model Wizard" title="ASSISTENT ZUM HOCHLADEN VON MODELLEN">
+ <button label="5. Hochladen" name="upload_btn"/>
+ <button label="4. Überprüfen" name="review_btn"/>
+ <button label="3. Physik" name="physics2_btn"/>
+ <button label="3. Physik" name="physics_btn"/>
+ <button label="2. Optimieren" name="optimize_btn"/>
+ <button label="1. Datei auswählen" name="choose_file_btn"/>
+ <panel name="choose_file_panel">
+ <panel name="header_panel">
+ <text name="header_text">
+ Modell hochladen
+ </text>
+ </panel>
+ <text name="description">
+ Mit diesem Assistenten können Sie Netzmodelle in Second Life hochladen. Geben Sie zuerst die Datei mit dem zu importierenden Modell an. Second Life unterstützt COLLADA-Dateien (.dae).
+ </text>
+ <panel name="content">
+ <text name="Cache location">
+ Dateiname:
+ </text>
+ <button label="Durchsuchen..." label_selected="Durchsuchen..." name="browse"/>
+ <text name="dimensions">
+ X: Y: Z:
+ </text>
+ <text name="dimension_dividers">
+ | |
+ </text>
+ </panel>
+ </panel>
+ <panel name="optimize_panel">
+ <panel name="header_panel">
+ <text name="header_text">
+ Optimieren
+ </text>
+ </panel>
+ <text name="description">
+ Dieser Assistent hat Ihr Modell optimiert, um die Leistung zu erhöhen. Sie können die Optimierungsergebnisse unten ändern oder zum Fortfahren auf „Weiter“ klicken.
+ </text>
+ <panel name="content">
+ <text name="high_detail_text">
+ Detailstufe generieren: Hoch
+ </text>
+ <text name="medium_detail_text">
+ Detailstufe generieren: Mittel
+ </text>
+ <text name="low_detail_text">
+ Detailstufe generieren: Niedrig
+ </text>
+ <text name="lowest_detail_text">
+ Detailstufe generieren: Niedrigste
+ </text>
+ </panel>
+ <panel name="content2">
+ <text name="lod_label">
+ Modellvorschau:
+ </text>
+ <combo_box name="preview_lod_combo2" 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="streaming cost">
+ Ressourcenkosten: [COST]
+ </text>
+ <text name="dimensions">
+ X: Y: Z:
+ </text>
+ <text name="dimension_dividers">
+ | |
+ </text>
+ </panel>
+ </panel>
+ <panel name="physics_panel">
+ <panel name="header_panel">
+ <text name="header_text">
+ Physik
+ </text>
+ </panel>
+ <text name="description">
+ Der Assistent erstellt eine physische Form, die die Interaktionen des Objekts mit anderen Objekten und Avataren bestimmt. Setzen Sie den Schieber auf die Detailstufe, die für Ihr Objekt am besten geeignet ist:
+ </text>
+ <panel name="content">
+ <text name="streaming cost">
+ Ressourcenkosten: [COST]
+ </text>
+ </panel>
+ </panel>
+ <panel name="physics2_panel">
+ <panel name="header_panel">
+ <text name="header_text">
+ Physik
+ </text>
+ </panel>
+ <text name="description">
+ Überprüfen Sie die physische Form unten und klicken Sie dann auf „Weiter“. Um die physische Form zu ändern, klicken Sie auf „Zurück“.
+ </text>
+ <panel name="content">
+ <text name="lod_label">
+ Modellvorschau:
+ </text>
+ <combo_box name="preview_lod_combo3" 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="dimensions">
+ X: Y: Z:
+ </text>
+ <text name="dimension_dividers">
+ | |
+ </text>
+ <text name="streaming cost">
+ Ressourcenkosten: [COST]
+ </text>
+ </panel>
+ </panel>
+ <panel name="review_panel">
+ <panel name="header_panel">
+ <text name="header_text">
+ Überprüfen
+ </text>
+ </panel>
+ <text name="description">
+ Überprüfen Sie die Details unten und klicken Sie dann auf „Hochladen“, um das Modell hochzuladen. Die Kosten werden von Ihrem L$-Kontostand abgezogen.
+ </text>
+ <panel name="content">
+ <text name="lod_label">
+ Modellvorschau:
+ </text>
+ <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="dimensions">
+ X: Y: Z:
+ </text>
+ <text name="dimension_dividers">
+ | |
+ </text>
+ </panel>
+ <text name="streaming cost">
+ Ressourcenkosten: [COST]
+ </text>
+ <text name="physics cost">
+ Physikkosten: [COST]
+ </text>
+ </panel>
+ <panel name="upload_panel">
+ <panel name="header_panel">
+ <text name="header_text">
+ Upload abgeschlossen
+ </text>
+ </panel>
+ <text name="description">
+ Herzlichen Glückwunsch! Ihr Modell wurde erfolgreich hochgeladen. Sie finden das Modell im Objektordner Ihres Inventars.
+ </text>
+ </panel>
+ <button label="&lt;&lt; Zurück" name="back"/>
+ <button label="Weiter &gt;&gt;" name="next"/>
+ <button label="Hochladen" name="upload" tool_tip="An Simulator hochladen"/>
+ <button label="Abbrechen" name="cancel"/>
+ <button label="Schließen" name="close"/>
+ <spinner name="import_scale" value="1,0"/>
+ <string name="status_idle">
+ Inaktiv
+ </string>
+ <string name="status_reading_file">
+ Laden...
+ </string>
+ <string name="status_generating_meshes">
+ Netze werden generiert...
+ </string>
+ <string name="status_vertex_number_overflow">
+ Fehler: Anzahl von Vertices überschreitet 65534. Operation abgebrochen.
+ </string>
+ <string name="high">
+ Hoch
+ </string>
+ <string name="medium">
+ Mittel
+ </string>
+ <string name="low">
+ Niedrig
+ </string>
+ <string name="lowest">
+ Niedrigste
+ </string>
+ <string name="mesh_status_good">
+ Ausliefern
+ </string>
+ <string name="mesh_status_na">
+ --
+ </string>
+ <string name="mesh_status_none">
+ Keine
+ </string>
+ <string name="mesh_status_submesh_mismatch">
+ Detailstufen haben unterschiedliche Anzahl texturfähiger Flächen.
+ </string>
+ <string name="mesh_status_mesh_mismatch">
+ Detailstufen haben unterschiedliche Anzahl von Netzinstanzen.
+ </string>
+ <string name="mesh_status_too_many_vertices">
+ Detailstufe hat zu viele Vertices.
+ </string>
+ <string name="mesh_status_missing_lod">
+ Erforderliche Detailstufe fehlt.
+ </string>
+ <string name="layer_all">
+ Alle
+ </string>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_perm_prefs.xml b/indra/newview/skins/default/xui/de/floater_perm_prefs.xml
index fd65987aa9..9be22f3ccb 100644
--- a/indra/newview/skins/default/xui/de/floater_perm_prefs.xml
+++ b/indra/newview/skins/default/xui/de/floater_perm_prefs.xml
@@ -9,7 +9,7 @@
</text>
<check_box label="Bearbeiten" name="next_owner_modify"/>
<check_box label="Kopieren" name="next_owner_copy"/>
- <check_box label="Verkaufen/Weggeben" left_delta="80" name="next_owner_transfer"/>
+ <check_box label="Verkaufen/Weggeben" name="next_owner_transfer"/>
</panel>
<button label="OK" label_selected="OK" name="ok"/>
<button label="Abbrechen" label_selected="Abbrechen" name="cancel"/>
diff --git a/indra/newview/skins/default/xui/de/floater_postcard.xml b/indra/newview/skins/default/xui/de/floater_postcard.xml
index 91e0bb8133..28af0183cb 100644
--- a/indra/newview/skins/default/xui/de/floater_postcard.xml
+++ b/indra/newview/skins/default/xui/de/floater_postcard.xml
@@ -3,29 +3,23 @@
<text name="to_label">
E-Mail des Empfängers:
</text>
- <line_editor left_delta="145" name="to_form" width="125"/>
<text name="from_label">
Ihre E-Mail:
- </text>
- <line_editor left_delta="145" name="from_form" width="125"/>
+ </text>
<text name="name_label">
Ihr Name:
- </text>
- <line_editor left_delta="145" name="name_form" width="125"/>
+ </text>
<text name="subject_label">
Betreff:
</text>
- <line_editor label="Betreff hier eingeben." left_delta="145" name="subject_form" width="125"/>
+ <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>
- <check_box label="Im Web veröffentlichen" name="allow_publish_check" tool_tip="Veröffentlicht diese Postkarte im Web."/>
- <check_box label="Ab-18-Inhalt" name="mature_check" tool_tip="Diese Postkarte enthält nicht jugendfreie Inhalte."/>
- <button label="?" name="publish_help_btn"/>
- <text name="fine_print" bottom_delta="21" height="140">
+ </text_editor>
+ <text name="fine_print">
Wenn sich der Empfänger bei SL anmeldet, erhalten Sie einen Empfehlungsbonus.
</text>
<button label="Abbrechen" name="cancel_btn"/>
diff --git a/indra/newview/skins/default/xui/de/floater_preview_gesture.xml b/indra/newview/skins/default/xui/de/floater_preview_gesture.xml
index 6d3635fa8d..76dc623ca4 100644
--- a/indra/newview/skins/default/xui/de/floater_preview_gesture.xml
+++ b/indra/newview/skins/default/xui/de/floater_preview_gesture.xml
@@ -33,7 +33,7 @@
<text name="replace_text" tool_tip="Ersetzt den Auslösertext mit diesem Text. Wenn Sie zum Beispiel den Auslöser „hallo“ durch „wie geht&apos;s“ ersetzen, erscheint im Chat anstelle von „Ich wollte nur hallo sagen“ der Text „Ich wollte nur wie geht&apos;s sagen“ und die zugehörige Geste wird abgespielt.">
Ersetzen mit:
</text>
- <line_editor left_delta="94" name="replace_editor" tool_tip="Ersetzt den Auslösertext mit diesem Text. Wenn Sie zum Beispiel den Auslöser „hallo“ durch „wie geht&apos;s“ ersetzen, erscheint im Chat anstelle von „Ich wollte nur hallo sagen“ der Text „Ich wollte nur wie geht&apos;s sagen“ und die zugehörige Geste wird abgespielt." width="160"/>
+ <line_editor name="replace_editor" tool_tip="Ersetzt den Auslösertext mit diesem Text. Wenn Sie zum Beispiel den Auslöser „hallo“ durch „wie geht&apos;s“ ersetzen, erscheint im Chat anstelle von „Ich wollte nur hallo sagen“ der Text „Ich wollte nur wie geht&apos;s sagen“ und die zugehörige Geste wird abgespielt."/>
<text name="key_label">
Tastenkürzel:
</text>
diff --git a/indra/newview/skins/default/xui/de/floater_price_for_listing.xml b/indra/newview/skins/default/xui/de/floater_price_for_listing.xml
new file mode 100644
index 0000000000..bdd772a9c2
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_price_for_listing.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="price_for_listing" title="ANZEIGE VERÖFFENTLICHEN">
+ <text name="explanation_text">
+ Ihre Anzeige wird für eine Woche veröffentlicht.
+
+Die Position Ihrer Anzeige hängt davon ab, wie viel Sie dafür bezahlen möchten.
+
+Die Anzeigen, für die am meisten bezahlt wird, werden am Anfang der Liste angezeigt und erscheinen in Suchergebnissen weiter oben.
+ </text>
+ <text name="price_text">
+ Anzeigenpreis:
+ </text>
+ <text name="price_symbol">
+ L$
+ </text>
+ <button label="OK" name="set_price_btn"/>
+ <button label="Abbrechen" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_sell_land.xml b/indra/newview/skins/default/xui/de/floater_sell_land.xml
index 8f67fae464..646138eaad 100644
--- a/indra/newview/skins/default/xui/de/floater_sell_land.xml
+++ b/indra/newview/skins/default/xui/de/floater_sell_land.xml
@@ -5,16 +5,16 @@
<text name="info_parcel_label">
Parzelle:
</text>
- <text bottom_delta="-5" height="16" name="info_parcel" left="70">
+ <text name="info_parcel">
PARZELLENNAME
</text>
<text name="info_size_label">
Größe:
</text>
- <text bottom_delta="-21" height="32" name="info_size" left="70">
+ <text name="info_size">
[AREA] m².
</text>
- <text bottom_delta="-57" height="28" name="info_action">
+ <text name="info_action">
Zum Verkauf dieser Parzelle:
</text>
<text name="price_label">
@@ -32,13 +32,13 @@
<text name="price_per_m">
([PER_METER] L$ pro m²)
</text>
- <text bottom_delta="38" left="72" name="sell_to_label" right="-20">
+ <text name="sell_to_label">
2. Land verkaufen an:
</text>
- <text bottom_delta="-16" height="16" left="72" name="sell_to_text" right="-10">
+ <text name="sell_to_text">
Offener Verkauf oder Verkauf an bestimmte Person?
</text>
- <combo_box bottom_delta="-32" height="16" left="72" name="sell_to" width="140">
+ <combo_box name="sell_to">
<combo_box.item label="-- Auswählen --" name="--selectone--"/>
<combo_box.item label="An jeden" name="Anyone"/>
<combo_box.item label="An bestimmte Person:" name="Specificuser:"/>
@@ -50,15 +50,15 @@
<text name="sell_objects_text">
Die transferierbaren Landeigentümer-Objekte auf der Parzelle wechseln den Eigentümer.
</text>
- <radio_group bottom_delta="-58" name="sell_objects">
+ <radio_group name="sell_objects">
<radio_item label="Nein, Objekte behalten" name="no"/>
<radio_item label="Ja, Objekte mit Land verkaufen" name="yes"/>
</radio_group>
- <button label="Objekte anzeigen" name="show_objects" width="116"/>
+ <button label="Objekte anzeigen" name="show_objects"/>
<text name="nag_message_label">
ACHTUNG: Verkäufe sind endgültig.
</text>
- <button label="Zum Verkauf freigeben" name="sell_btn" width="180"/>
+ <button label="Zum Verkauf freigeben" name="sell_btn"/>
<button label="Abbrechen" name="cancel_btn"/>
</panel>
</scroll_container>
diff --git a/indra/newview/skins/default/xui/de/floater_snapshot.xml b/indra/newview/skins/default/xui/de/floater_snapshot.xml
index c014b8e040..ae68c71a80 100644
--- a/indra/newview/skins/default/xui/de/floater_snapshot.xml
+++ b/indra/newview/skins/default/xui/de/floater_snapshot.xml
@@ -4,7 +4,7 @@
unbekannt
</floater.string>
<radio_group label="Fototyp" name="snapshot_type_radio">
- <radio_item label="Email" name="postcard"/>
+ <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>
diff --git a/indra/newview/skins/default/xui/de/floater_sound_devices.xml b/indra/newview/skins/default/xui/de/floater_sound_devices.xml
new file mode 100644
index 0000000000..7575ad9e2a
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_sound_devices.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_sound_devices" title="Audiogeräte">
+ <text name="voice_label">
+ Voice-Chat
+ </text>
+ <check_box label="Aktiviert" name="enable_voice"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_tools.xml b/indra/newview/skins/default/xui/de/floater_tools.xml
index d95d674df2..338b609343 100644
--- a/indra/newview/skins/default/xui/de/floater_tools.xml
+++ b/indra/newview/skins/default/xui/de/floater_tools.xml
@@ -64,9 +64,9 @@
<radio_item label="Fläche auswählen" name="radio select face"/>
</radio_group>
<check_box label="Verknüpfte Teile bearbeiten" name="checkbox edit linked parts"/>
- <button label="Link" name="link_btn"/>
- <button label="Verknüpfung auflösen" name="unlink_btn"/>
- <text name="RenderingCost" tool_tip="Zeigt die errechneten Wiedergabekosten für dieses Objekt">
+ <button label="Link" name="link_btn" width="30"/>
+ <button label="Verknüpfung auflösen" name="unlink_btn" width="126"/>
+ <text name="RenderingCost" tool_tip="Zeigt die errechneten Wiedergabekosten für dieses Objekt" left_pad="0">
þ: [COUNT]
</text>
<check_box label="" name="checkbox uniform"/>
@@ -125,6 +125,18 @@
<text name="prim_count">
Primitive: [COUNT]
</text>
+ <text name="linked_set_count">
+ Verknüpfte Sätze: [COUNT]
+ </text>
+ <text name="linked_set_cost" tool_tip="Kosten der gegenwärtig ausgewählten verknüpften Sätze als [Prims],[Komplexität der Physik]">
+ Kosten: [COST] / [PHYSICS]
+ </text>
+ <text name="object_count">
+ Objekte: [COUNT]
+ </text>
+ <text name="object_cost" tool_tip="Kosten der gegenwärtig ausgewählten Objekte als [Prims] / [Komplexität der Physik]">
+ Kosten: [COST] / [PHYSICS]
+ </text>
<tab_container name="Object Info Tabs">
<panel label="Allgemein" name="General">
<panel.string name="text deed continued">
@@ -269,15 +281,6 @@
<combo_box.item label="Ring" name="Ring"/>
<combo_box.item label="Geformt" name="Sculpted"/>
</combo_box>
- <combo_box name="material">
- <combo_box.item label="Stein" name="Stone"/>
- <combo_box.item label="Metall" name="Metal"/>
- <combo_box.item label="Glas" name="Glass"/>
- <combo_box.item label="Holz" name="Wood"/>
- <combo_box.item label="Fleisch" name="Flesh"/>
- <combo_box.item label="Kunststoff" name="Plastic"/>
- <combo_box.item label="Gummi" name="Rubber"/>
- </combo_box>
<text name="text cut">
Pfadschnitt (Anfang/Ende)
</text>
@@ -353,9 +356,19 @@
<combo_box.item label="Torus" name="Torus"/>
<combo_box.item label="Fläche" name="Plane"/>
<combo_box.item label="Zylinder" name="Cylinder"/>
+ <combo_box.item label="Netz" name="Mesh"/>
</combo_box>
</panel>
<panel label="Eigenschaften" name="Features">
+ <panel.string name="None">
+ Keine
+ </panel.string>
+ <panel.string name="Prim">
+ Prim
+ </panel.string>
+ <panel.string name="Convex Hull">
+ Konvexe Hülle
+ </panel.string>
<text name="select_single">
Wählen Sie nur einen einzelnen Baustein aus, um Eigenschaften zu bearbeiten.
</text>
@@ -380,6 +393,23 @@
<spinner label="Fokus" name="Light Focus"/>
<spinner label="Abnehmend" name="Light Falloff"/>
<spinner label="Ambiente" name="Light Ambiance"/>
+ <text name="label physicsshapetype">
+ Art der physischen Form:
+ </text>
+ <combo_box name="Physics Shape Type Combo Ctrl" tool_tip="Art der physischen Form auswählen"/>
+ <combo_box name="material">
+ <combo_box.item label="Stein" name="Stone"/>
+ <combo_box.item label="Metall" name="Metal"/>
+ <combo_box.item label="Glas" name="Glass"/>
+ <combo_box.item label="Holz" name="Wood"/>
+ <combo_box.item label="Fleisch" name="Flesh"/>
+ <combo_box.item label="Plastik" name="Plastic"/>
+ <combo_box.item label="Gummi" name="Rubber"/>
+ </combo_box>
+ <spinner label="Schwerkraft" name="Physics Gravity"/>
+ <spinner label="Reibung" name="Physics Friction"/>
+ <spinner label="Dichte" name="Physics Density"/>
+ <spinner label="Restitution" name="Physics Restitution"/>
</panel>
<panel label="Textur" name="Texture">
<panel.string name="string repeats per meter">
diff --git a/indra/newview/skins/default/xui/de/floater_top_objects.xml b/indra/newview/skins/default/xui/de/floater_top_objects.xml
index dad550227e..d2055a53db 100644
--- a/indra/newview/skins/default/xui/de/floater_top_objects.xml
+++ b/indra/newview/skins/default/xui/de/floater_top_objects.xml
@@ -39,21 +39,18 @@
<text name="id_text">
Objekt-ID:
</text>
- <line_editor bg_readonly_color="clear" bottom_delta="3" enabled="false" follows="left|bottom|right" font="SansSerifSmall" height="20" left="80" name="id_editor" text_readonly_color="white" width="244"/>
- <button bottom_delta="0" follows="bottom|right" height="20" label="Beacon anzeigen" name="show_beacon_btn" right="-10" width="110"/>
+ <button label="Beacon anzeigen" name="show_beacon_btn"/>
<text name="obj_name_text">
Objektname:
- </text>
- <line_editor bg_readonly_color="clear" bottom_delta="3" enabled="false" follows="left|bottom|right" font="SansSerifSmall" height="20" left="80" name="object_name_editor" text_readonly_color="white" width="244"/>
- <button bottom_delta="0" follows="bottom|right" height="20" label="Filter" name="filter_object_btn" right="-10" width="110"/>
+ </text>
+ <button label="Filter" name="filter_object_btn"/>
<text name="owner_name_text">
Eigentümer:
- </text>
- <line_editor bg_readonly_color="clear" bottom_delta="3" enabled="true" follows="left|bottom|right" font="SansSerifSmall" height="20" left="106" name="owner_name_editor" text_readonly_color="white" width="218"/>
- <button bottom_delta="0" follows="bottom|right" height="20" label="Filter" name="filter_owner_btn" right="-10" width="110"/>
- <button bottom_delta="0" follows="bottom|right" height="20" label="Aktualisieren" name="refresh_btn" right="-10" width="110"/>
- <button bottom="35" follows="bottom|left" height="20" label="Auswahl zurückgeben" left="10" name="return_selected_btn" width="134"/>
- <button bottom="35" follows="bottom|left" height="20" label="Alle zurückgeben" left="150" name="return_all_btn" width="134"/>
- <button bottom="10" follows="bottom|left" height="20" label="Auswahl deaktivieren" left="10" name="disable_selected_btn" width="134"/>
- <button bottom="10" follows="bottom|left" height="20" label="Alle deaktivieren" left="150" name="disable_all_btn" width="134"/>
+ </text>
+ <button label="Filter" name="filter_owner_btn"/>
+ <button label="Aktualisieren" name="refresh_btn"/>
+ <button label="Auswahl zurückgeben" name="return_selected_btn" width="134"/>
+ <button label="Alle zurückgeben" left="150" name="return_all_btn" width="134"/>
+ <button label="Auswahl deaktivieren" name="disable_selected_btn" width="134"/>
+ <button label="Alle deaktivieren" left="150" name="disable_all_btn" width="134"/>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_water.xml b/indra/newview/skins/default/xui/de/floater_water.xml
deleted file mode 100644
index 097a60a444..0000000000
--- a/indra/newview/skins/default/xui/de/floater_water.xml
+++ /dev/null
@@ -1,71 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Water Floater" title="ERWEITERTER WASSER-EDITOR">
- <floater.string name="WLDefaultWaterNames">
- Default:Glassy:Pond:Murky:Second Plague:SNAKE!!!:Valdez
- </floater.string>
- <text name="KeyFramePresetsText" width="116">
- Voreinstellungen:
- </text>
- <button label="Neu" label_selected="Neu" name="WaterNewPreset"/>
- <button label="Speichern" label_selected="Speichern" name="WaterSavePreset"/>
- <button label="Löschen" label_selected="Löschen" name="WaterDeletePreset"/>
- <tab_container name="Water Tabs">
- <panel label="EINSTELLUNGEN" name="Settings">
- <text name="BHText">
- Wassertrübungsfarbe
- </text>
- <color_swatch name="WaterFogColor" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
- <text name="WaterFogDensText">
- Wassertrübungsdichte
- </text>
- <text name="WaterUnderWaterFogModText">
- Wassertrübungs-Modifikator
- </text>
- <slider bottom_delta="-34" name="WaterUnderWaterFogMod"/>
- <text name="BDensText">
- Reflexionswellengröße
- </text>
- <slider label="1" name="WaterNormalScaleX"/>
- <slider label="2" name="WaterNormalScaleY"/>
- <slider label="3" name="WaterNormalScaleZ"/>
- <text name="HDText">
- Fresnel-Skalierung
- </text>
- <text name="FresnelOffsetText">
- Fresnel-Versatz
- </text>
- <text name="DensMultText">
- Brechungsstärke oben
- </text>
- <text name="WaterScaleBelowText">
- Brechungsstärke unten
- </text>
- <text name="MaxAltText">
- Mischungsmultiplikator
- </text>
- </panel>
- <panel label="BILD" name="Waves">
- <text name="BHText">
- Richtung große Welle
- </text>
- <text name="WaterWave1DirXText">
- X
- </text>
- <text name="WaterWave1DirYText">
- Y
- </text>
- <text name="BHText2">
- Richtung kleine Welle
- </text>
- <text name="WaterWave2DirXText">
- X
- </text>
- <text name="WaterWave2DirYText">
- Y
- </text>
- <text name="BHText3">
- Normal-Map
- </text>
- </panel>
- </tab_container>
-</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_wearable_save_as.xml b/indra/newview/skins/default/xui/de/floater_wearable_save_as.xml
deleted file mode 100644
index f9b3552e8b..0000000000
--- a/indra/newview/skins/default/xui/de/floater_wearable_save_as.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="modal container" title=" ">
- <button label="Speichern" label_selected="Speichern" name="Save"/>
- <button label="Abbrechen" label_selected="Abbrechen" name="Cancel"/>
- <text name="Save item as:">
- Objekt in meinem Inventar speichern als:
- </text>
- <line_editor name="name ed">
- Neu [DESC]
- </line_editor>
-</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_windlight_options.xml b/indra/newview/skins/default/xui/de/floater_windlight_options.xml
deleted file mode 100644
index 5b59336f9d..0000000000
--- a/indra/newview/skins/default/xui/de/floater_windlight_options.xml
+++ /dev/null
@@ -1,189 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="WindLight floater" title="ERWEITERTER HIMMEL-EDITOR">
- <text name="KeyFramePresetsText">
- Voreinstellungen:
- </text>
- <button label="Neu" label_selected="Neu" name="WLNewPreset"/>
- <button label="Speichern" label_selected="Speichern" name="WLSavePreset"/>
- <button label="Löschen" label_selected="Löschen" name="WLDeletePreset"/>
- <button label="Tageszyklus-Editor" label_selected="Tageszyklus-Editor" name="WLDayCycleMenuButton"/>
- <tab_container name="WindLight Tabs">
- <panel label="ATMOSPHÄRE" name="Atmosphere">
- <text name="BHText">
- Horizontfarbe
- </text>
- <button label=" ?" name="WLBlueHorizonHelp"/>
- <text name="BHText2">
- R
- </text>
- <text name="BHText3">
- G
- </text>
- <text name="BHText4">
- B
- </text>
- <text name="BHText5">
- I
- </text>
- <text name="BDensText">
- Horizonttrübung
- </text>
- <button label=" ?" name="WLHazeHorizonHelp"/>
- <text name="BDensText2">
- Farbintensität
- </text>
- <button label=" ?" name="WLBlueDensityHelp"/>
- <text name="BHText6">
- R
- </text>
- <text name="BHText7">
- G
- </text>
- <text name="BHText8">
- B
- </text>
- <text name="BHText9">
- I
- </text>
- <text name="HDText">
- Trübungsintensität
- </text>
- <button label=" ?" name="WLHazeDensityHelp"/>
- <text name="DensMultText">
- Dichtemultiplikator
- </text>
- <button label=" ?" name="WLDensityMultHelp"/>
- <text name="WLDistanceMultText">
- Entfernungsmultiplikator
- </text>
- <button label=" ?" name="WLDistanceMultHelp"/>
- <text name="MaxAltText">
- Max. Höhe
- </text>
- <button label=" ?" name="WLMaxAltitudeHelp"/>
- </panel>
- <panel label="LICHT" name="Lighting">
- <text name="SLCText">
- Sonne/Mond-Farbe
- </text>
- <button label=" ?" name="WLSunlightColorHelp"/>
- <text name="BHText">
- R
- </text>
- <text name="BHText2">
- G
- </text>
- <text name="BHText3">
- B
- </text>
- <text name="BHText4">
- I
- </text>
- <text name="TODText">
- Sonne/Mond-Stand
- </text>
- <button label=" ?" name="WLTimeOfDayHelp"/>
- <text name="WLAmbientText">
- Umgebung
- </text>
- <button label=" ?" name="WLAmbientHelp"/>
- <text name="BHText5">
- R
- </text>
- <text name="BHText6">
- G
- </text>
- <text name="BHText7">
- B
- </text>
- <text name="BHText8">
- I
- </text>
- <text name="WLEastAngleText">
- Ostausrichtung
- </text>
- <button label=" ?" name="WLEastAngleHelp"/>
- <text name="SunGlowText">
- Sonnenleuchtkraft
- </text>
- <button label=" ?" name="WLSunGlowHelp"/>
- <slider label="Fokus " name="WLGlowB"/>
- <slider label="Größe " name="WLGlowR"/>
- <text name="SceneGammaText">
- Gamma in Szene
- </text>
- <button label=" ?" name="WLSceneGammaHelp"/>
- <text name="WLStarText">
- Sternenleuchtkraft
- </text>
- <button label=" ?" name="WLStarBrightnessHelp"/>
- </panel>
- <panel label="WOLKEN" name="Clouds">
- <text name="WLCloudColorText">
- Wolkenfarbe
- </text>
- <button label=" ?" name="WLCloudColorHelp"/>
- <text name="BHText">
- R
- </text>
- <text name="BHText2">
- G
- </text>
- <text name="BHText3">
- B
- </text>
- <text name="BHText4">
- I
- </text>
- <text name="WLCloudColorText2">
- Wolken-XY/Dichte
- </text>
- <button label=" ?" name="WLCloudDensityHelp"/>
- <text name="BHText5">
- X
- </text>
- <text name="BHText6">
- Y
- </text>
- <text name="BHText7">
- D
- </text>
- <text name="WLCloudCoverageText">
- Wolkendichte
- </text>
- <button label=" ?" name="WLCloudCoverageHelp"/>
- <text name="WLCloudScaleText">
- Wolkenskalierung
- </text>
- <button label=" ?" name="WLCloudScaleHelp"/>
- <text name="WLCloudDetailText">
- Wolkendetails (XY/Dichte)
- </text>
- <button label=" ?" name="WLCloudDetailHelp"/>
- <text name="BHText8">
- X
- </text>
- <text name="BHText9">
- Y
- </text>
- <text name="BHText10">
- D
- </text>
- <text name="WLCloudScrollXText">
- Wolkenbewegung X
- </text>
- <button label=" ?" name="WLCloudScrollXHelp"/>
- <check_box label="Fest" name="WLCloudLockX"/>
- <text name="WLCloudScrollYText">
- Wolkenbewegung Y
- </text>
- <button label=" ?" name="WLCloudScrollYHelp"/>
- <check_box label="Fest" name="WLCloudLockY"/>
- <check_box label="Klassische Wolken" name="DrawClassicClouds"/>
- <button label=" ?" name="WLClassicCloudsHelp"/>
- </panel>
- </tab_container>
- <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
- </string>
-</floater>
diff --git a/indra/newview/skins/default/xui/de/language_settings.xml b/indra/newview/skins/default/xui/de/language_settings.xml
index d54f548fe1..f9346eef7d 100644
--- a/indra/newview/skins/default/xui/de/language_settings.xml
+++ b/indra/newview/skins/default/xui/de/language_settings.xml
@@ -4,6 +4,7 @@
<!-- Locale Information -->
<string name="MicrosoftLocale">german</string>
+ <string name="MacLocale">de_DE.UTF-8</string>
<string name="DarwinLocale">de_DE.UTF-8</string>
<string name="LinuxLocale">de_DE.UTF-8</string>
diff --git a/indra/newview/skins/default/xui/de/menu_inventory_add.xml b/indra/newview/skins/default/xui/de/menu_inventory_add.xml
index 165e9a9264..af70c08ba1 100644
--- a/indra/newview/skins/default/xui/de/menu_inventory_add.xml
+++ b/indra/newview/skins/default/xui/de/menu_inventory_add.xml
@@ -4,6 +4,8 @@
<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="Modell..." name="Upload Model"/>
+ <menu_item_call label="Modellassistent..." name="Upload Model Wizard"/>
<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>
diff --git a/indra/newview/skins/default/xui/de/menu_model_import_gear_default.xml b/indra/newview/skins/default/xui/de/menu_model_import_gear_default.xml
new file mode 100644
index 0000000000..e1faeedcde
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/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="Kanten anzeigen" name="show_edges"/>
+ <menu_item_check label="Physik anzeigen" name="show_physics"/>
+ <menu_item_check label="Texturen anzeigen" name="show_textures"/>
+ <menu_item_check label="Skingewicht anzeigen" name="show_skin_weight"/>
+ <menu_item_check label="Gelenkpositionen anzeigen" name="show_joint_positions"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_viewer.xml b/indra/newview/skins/default/xui/de/menu_viewer.xml
index 9d5a69105d..05f9f94c8a 100644
--- a/indra/newview/skins/default/xui/de/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/de/menu_viewer.xml
@@ -120,6 +120,8 @@
<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="Modell..." name="Upload Model"/>
+ <menu_item_call label="Modellassistent..." name="Upload Model Wizard"/>
<menu_item_call label="Mehrfach-Upload ([COST] L$ pro Datei)..." name="Bulk Upload"/>
</menu>
<menu_item_call label="Rückgängig" name="Undo"/>
@@ -159,7 +161,7 @@
<menu_item_check label="Alpha" name="Alpha"/>
<menu_item_check label="Baum" name="Tree"/>
<menu_item_check label="Avatare" name="Character"/>
- <menu_item_check label="SurfacePath" name="SurfacePath"/>
+ <menu_item_check label="Flächenpatch" name="Surface Patch"/>
<menu_item_check label="Himmel" name="Sky"/>
<menu_item_check label="Wasser" name="Water"/>
<menu_item_check label="Boden" name="Ground"/>
@@ -218,6 +220,7 @@
<menu_item_check label="Texture-Kategorie" name="Texture Category"/>
<menu_item_check label="Schnelle Timer" name="Fast Timers"/>
<menu_item_check label="Speicher" name="Memory"/>
+ <menu_item_check label="Szenestatistiken" name="Scene Statistics"/>
<menu_item_call label="Info zu Region in Fenster Fehler beseitigen" name="Region Info to Debug Console"/>
<menu_item_call label="Gruppeninfo in Fenster Fehler beseitigen" name="Group Info to Debug Console"/>
<menu_item_call label="Info zu Fähigkeiten in Fenster Fehler beseitigen" name="Capabilities Info to Debug Console"/>
@@ -228,6 +231,7 @@
</menu>
<menu label="Info anzeigen" name="Display Info">
<menu_item_check label="Zeit anzeigen" name="Show Time"/>
+ <menu_item_check label="Kosten für Hochladen anzeigen" name="Show Upload Cost"/>
<menu_item_check label="Render-Info anzeigen" name="Show Render Info"/>
<menu_item_check label="Texturinfos anzeigen" name="Show Texture Info"/>
<menu_item_check label="Matrizen anzeigen" name="Show Matrices"/>
@@ -253,8 +257,10 @@
</menu>
<menu label="Metadaten darstellen" name="Render Metadata">
<menu_item_check label="Bonding Boxes" name="Bounding Boxes"/>
+ <menu_item_check label="Normalen" name="Normals"/>
<menu_item_check label="Octree" name="Octree"/>
<menu_item_check label="Shadow Frusta" name="Shadow Frusta"/>
+ <menu_item_check label="Physische Formen" name="Physics Shapes"/>
<menu_item_check label="Okklusion" name="Occlusion"/>
<menu_item_check label="Bündel rendern" name="Render Batches"/>
<menu_item_check label="Typ aktualisieren" name="Update Type"/>
@@ -262,9 +268,12 @@
<menu_item_check label="Textur-Priorität" name="Texture Priority"/>
<menu_item_check label="Texturbereich" name="Texture Area"/>
<menu_item_check label="Oberflächenbereich" name="Face Area"/>
+ <menu_item_check label="Detailstufeninfos" name="LOD Info"/>
+ <menu_item_check label="Konstruktionswarteschlange" name="Build Queue"/>
<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="Formen" name="Sculpt"/>
</menu>
<menu label="Rendering" name="Rendering">
<menu_item_check label="Achsen" name="Axes"/>
@@ -272,7 +281,6 @@
<menu_item_call label="Texturinfo für ausgewähltes Objekt" name="Selected Texture Info Basis"/>
<menu_item_check label="Wireframe" name="Wireframe"/>
<menu_item_check label="Objekt-Objekt Okklusion" name="Object-Object Occlusion"/>
- <menu_item_check label="Framebuffer-Objekte" name="Framebuffer Objects"/>
<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"/>
@@ -371,6 +379,7 @@
<menu_item_call label="Lokale Texturen ausgeben" name="Dump Local Textures"/>
</menu>
<menu_item_check label="HTTP-Texturen" name="HTTP Textures"/>
+ <menu_item_check label="HTTP-Inventar" name="HTTP Inventory"/>
<menu_item_call label="Bilder komprimieren" name="Compress Images"/>
<menu_item_check label="Ausgabe Fehlerbeseitigung ausgeben" name="Output Debug Minidump"/>
<menu_item_check label="Bei nächster Ausführung Fenster öffnen" name="Console Window"/>
diff --git a/indra/newview/skins/default/xui/de/notifications.xml b/indra/newview/skins/default/xui/de/notifications.xml
index c172f7ea2d..75f26c6990 100644
--- a/indra/newview/skins/default/xui/de/notifications.xml
+++ b/indra/newview/skins/default/xui/de/notifications.xml
@@ -2172,6 +2172,12 @@ Dies kann die Eingabe Ihres Passworts beeinflussen.
<notification name="RezItemNoPermissions">
Keine Berechtigung zum Rezzen von Objekten.
</notification>
+ <notification name="IMAcrossParentEstates">
+ Senden von IMs über übergeordnete Grundbesitze hinweg nicht möglich.
+ </notification>
+ <notification name="TransferInventoryAcrossParentEstates">
+ Inventarübertragung über übergeordnete Grundbesitze hinweg nicht möglich.
+ </notification>
<notification name="UnableToLoadNotecard">
Notizkarten-Asset konnte nicht geladen werden.
</notification>
@@ -2749,6 +2755,10 @@ Diese werden für ein paar Sekunden sicherheitshalber gesperrt.
Sie wurden vom Moderator stummgeschaltet.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
+ <notification name="UploadCostConfirmation">
+ Das Hochladen kostet [PRICE] L$. Möchten Sie fortfahren?
+ <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Hochladen"/>
+ </notification>
<notification name="ConfirmClearTeleportHistory">
Möchten Sie Ihre Teleport-Liste löschen?
<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
@@ -2760,6 +2770,9 @@ Die Schaltfläche wird angezeigt, wenn genügend Platz vorhanden ist.
<notification name="ShareNotification">
Wählen Sie Einwohner aus, für die Sie das Objekt freigeben möchten.
</notification>
+ <notification name="MeshUploadError">
+ [LABEL] konnte nicht hochgeladen werden: [MESSAGE] [IDENTIFIER] [INVALIDITY_IDENTIFIER]
+ </notification>
<notification name="ShareItemsConfirmation">
Möchten Sie wirklich die folgenden Objekte:
@@ -2776,6 +2789,19 @@ für folgende Einwohner freigeben:
<notification name="DeedToGroupFail">
Ãœbertragung an Gruppe ist fehlgeschlagen.
</notification>
+ <notification name="ReleaseLandThrottled">
+ Die Parzelle [PARCEL_NAME] kann zurzeit nicht aufgegeben werden.
+ </notification>
+ <notification name="ReleasedLandWithReclaim">
+ Die [AREA] m² große Parzelle „[PARCEL_NAME]“ wurde freigegeben.
+
+Sie haben [RECLAIM_PERIOD] Stunden, um die Parzelle für 0 L$ zurückzufordern, bevor sie zum Verkauf an alle freigegeben wird.
+ </notification>
+ <notification name="ReleasedLandNoReclaim">
+ Die [AREA] m² große Parzelle „[PARCEL_NAME]“ wurde freigegeben.
+
+Sie steht jetzt zum Verkauf an alle zur Verfügung.
+ </notification>
<notification name="AvatarRezNotification">
(Seit [EXISTENCE] Sekunden inworld )
Avatar &apos;[NAME]&apos; wurde in [TIME] Sekunden gerezzt.
@@ -2914,6 +2940,10 @@ Durch Ausblenden der Schaltfläche „Sprechen“ wird die Sprechfunktion deakti
Die Erstellung und Bearbeitung von Gruppen 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"/>
</notification>
+ <notification label="" name="NoPlaceInfo">
+ Die Anzeige des Ortsprofils 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"/>
+ </notification>
<notification label="" name="NoPicks">
Die Erstellung und Bearbeitung von Auswahlen 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"/>
@@ -2934,9 +2964,18 @@ Durch Ausblenden der Schaltfläche „Sprechen“ wird die Sprechfunktion deakti
Die Bezahlung anderer Einwohner 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>
- <global name="UnsupportedCPU">
- - Ihre CPU-Geschwindigkeit entspricht nicht den Mindestanforderungen.
- </global>
+ <notification label="" name="NoInventory">
+ Die Inventaranzeige 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="NoAppearance">
+ Das Fenster zum Bearbeiten des Aussehens ist nur im Modus „Erweitert“ verfügbar. Möchten Sie sich abmelden und den Modus wechseln?
+ <usetemplate name="okcancelbuttons" notext="Nicht beenden" yestext="Beenden"/>
+ </notification>
+ <notification label="" name="NoSearch">
+ 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>
<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_edit_pick.xml b/indra/newview/skins/default/xui/de/panel_edit_pick.xml
index 3c56df763d..aafffc7ae3 100644
--- a/indra/newview/skins/default/xui/de/panel_edit_pick.xml
+++ b/indra/newview/skins/default/xui/de/panel_edit_pick.xml
@@ -29,7 +29,7 @@
<layout_panel name="layout_panel1">
<button label="Auswahl speichern" name="save_changes_btn"/>
</layout_panel>
- <layout_panel name="layout_panel1">
+ <layout_panel name="layout_panel2">
<button label="Abbrechen" name="cancel_btn"/>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/de/panel_friends.xml b/indra/newview/skins/default/xui/de/panel_friends.xml
deleted file mode 100644
index 50013a2b24..0000000000
--- a/indra/newview/skins/default/xui/de/panel_friends.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="friends">
- <string name="Multiple">
- Mehrere Freunde
- </string>
- <scroll_list name="friend_list" tool_tip="Halten Sie die Tasten „Umschalt“ oder „Strg“ gedrückt, um durch Klicken mehrere Freunde auszuwählen.">
- <column name="icon_online_status" tool_tip="Online-Status"/>
- <column label="Name" name="friend_name" tool_tip="Name"/>
- <column name="icon_visible_online" tool_tip="Freund kann sehen, wenn Sie online sind"/>
- <column name="icon_visible_map" tool_tip="Freund kann Sie auf der Karte finden"/>
- <column name="icon_edit_mine" tool_tip="Freunde können Objekte bearbeiten, löschen und an sich nehmen"/>
- <column name="icon_edit_theirs" tool_tip="Sie können die Objekte dieses Freunds bearbeiten"/>
- </scroll_list>
- <panel name="rights_container">
- <text name="friend_name_label">
- Wählen Sie den/die Freund(e) aus, dessen/deren Rechte Sie ändern möchten...
- </text>
- <check_box label="Kann meinen Online-Status sehen" name="online_status_cb" tool_tip="Festlegen, ob dieser Freund meinen Online-Status auf seiner Freundesliste oder Visitenkarte einsehen kann"/>
- <check_box label="Kann mich auf der Weltkarte sehen" name="map_status_cb" tool_tip="Festlegen, ob dieser Freund auf seiner Karte meinen Standort sehen kann"/>
- <check_box label="Kann meine Objekte verändern" name="modify_status_cb" tool_tip="Festlegen, ob dieser Freund meine Objekte verändern kann"/>
- <text name="process_rights_label">
- Rechte werden geändert...
- </text>
- </panel>
- <button label="IM/Anruf" name="im_btn" tool_tip="Beginnt eine Instant Message-Sitzung"/>
- <button label="Profil" name="profile_btn" tool_tip="Bilder, Gruppen und andere Informationen anzeigen"/>
- <button label="Teleportieren" name="offer_teleport_btn" tool_tip="Bieten Sie diesem Freund einen Teleport an Ihre Position an"/>
- <button label="Bezahlen" name="pay_btn" tool_tip="Diesem Freund Linden-Dollar (L$) geben"/>
- <button label="Entfernen" name="remove_btn" tool_tip="Diese Person von Ihrer Freundesliste entfernen"/>
- <button label="Hinzufügen" name="add_btn" tool_tip="Bieten Sie einem Einwohner die Freundschaft an"/>
-</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_group_notices.xml b/indra/newview/skins/default/xui/de/panel_group_notices.xml
index 8c1df04ed8..df423cc69a 100644
--- a/indra/newview/skins/default/xui/de/panel_group_notices.xml
+++ b/indra/newview/skins/default/xui/de/panel_group_notices.xml
@@ -49,7 +49,7 @@ Maximal 200 pro Gruppe täglich
Archivierte Mitteilung
</text>
<text name="lbl2">
- Um eine neue Mitteilung zu senden, klicken Sie die Schaltfläche +
+ Um eine neue Mitteilung zu senden, klicken Sie die + Neue Mitteilung
</text>
<text name="lbl3">
Betreff:
diff --git a/indra/newview/skins/default/xui/de/panel_people.xml b/indra/newview/skins/default/xui/de/panel_people.xml
index 004792bbf5..63a832a165 100644
--- a/indra/newview/skins/default/xui/de/panel_people.xml
+++ b/indra/newview/skins/default/xui/de/panel_people.xml
@@ -66,16 +66,16 @@ Sie suchen nach Leuten? Verwenden Sie die [secondlife:///app/worldmap Karte].
<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="chat_btn_lp">
+ <layout_panel name="im_btn_lp">
<button label="IM" name="im_btn" tool_tip="Instant Messenger öffnen"/>
</layout_panel>
- <layout_panel name="chat_btn_lp">
+ <layout_panel name="call_btn_lp">
<button label="Anrufen" name="call_btn" tool_tip="Diesen Einwohner anrufen"/>
</layout_panel>
- <layout_panel name="chat_btn_lp">
+ <layout_panel name="share_btn_lp">
<button label="Teilen" name="share_btn" tool_tip="Inventarobjekt teilen"/>
</layout_panel>
- <layout_panel name="chat_btn_lp">
+ <layout_panel name="teleport_btn_lp">
<button label="Teleportieren" name="teleport_btn" tool_tip="Teleport anbieten"/>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/de/panel_preferences_colors.xml b/indra/newview/skins/default/xui/de/panel_preferences_colors.xml
index 22681ffdf2..19c5efcb05 100644
--- a/indra/newview/skins/default/xui/de/panel_preferences_colors.xml
+++ b/indra/newview/skins/default/xui/de/panel_preferences_colors.xml
@@ -22,6 +22,9 @@
<text name="text_box5">
Fehler
</text>
+ <text name="text_box10">
+ Direkt
+ </text>
<text name="text_box7">
Eigentümer
</text>
diff --git a/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml
index 78cb03a50a..9175ea0bae 100644
--- a/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml
@@ -27,8 +27,20 @@
</text>
<check_box initial_value="true" label="Transparentes Wasser" name="TransparentWater"/>
<check_box initial_value="true" label="Bumpmapping und Glanz" name="BumpShiny"/>
+ <check_box initial_value="true" label="Lokale Lichtquellen" name="LocalLights"/>
<check_box initial_value="true" label="Einfache Shader" name="BasicShaders" tool_tip="Deaktivieren Sie diese Option, wenn der Grafikkartentreiber Abstürze verursacht"/>
<check_box initial_value="true" label="Atmosphären-Shader" name="WindLightUseAtmosShaders"/>
+ <check_box initial_value="true" label="Licht und Schatten" name="UseLightShaders"/>
+ <check_box initial_value="true" label="Ambient Occlusion" name="UseSSAO"/>
+ <check_box initial_value="true" label="Schärfentiefe" name="UseDoF"/>
+ <text name="shadows_label">
+ Schatten:
+ </text>
+ <combo_box name="ShadowDetail">
+ <combo_box.item label="Keine" name="0"/>
+ <combo_box.item label="Sonne/Mond" name="1"/>
+ <combo_box.item label="Sonne/Mond + Projektoren" name="2"/>
+ </combo_box>
<text name="reflection_label">
Wasserreflexionen:
</text>
@@ -48,7 +60,7 @@
m
</text>
<slider label="Max. Partikelzahl:" name="MaxParticleCount"/>
- <slider label="Max. Anzahl an voll dargestellten Avataren:" name="MaxNumberAvatarDrawn"/>
+ <slider label="Max. Anzahl an voll dargestellten Avataren:" label_width="230" name="MaxNumberAvatarDrawn" width="315"/>
<slider label="Post-Processing-Qualität:" name="RenderPostProcess"/>
<text name="MeshDetailText">
Darstellungsgrad:
diff --git a/indra/newview/skins/default/xui/de/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/de/panel_preferences_privacy.xml
index b56f150394..e21bed6bb5 100644
--- a/indra/newview/skins/default/xui/de/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/de/panel_preferences_privacy.xml
@@ -11,7 +11,7 @@
<check_box label="Nur Freunde und Gruppen wissen, dass ich online bin" name="online_visibility"/>
<check_box label="Nur Freunde und Gruppen können mich anrufen oder mir eine IM schicken" name="voice_call_friends_only_check"/>
<check_box label="Mikrofon ausschalten, wenn Anrufe beendet werden" name="auto_disengage_mic_check"/>
- <check_box label="Meine Lieblingslandmarken bei Anmeldung anzeigen (im Dropdown-Menü „Hier anfangen“)" name="favorites_on_login_check"/>
+ <check_box label="Meine Lieblingslandmarken bei Anmeldung anzeigen (im Dropdown-Menü &#10;„Hier anfangen“)" name="favorites_on_login_check" top_pad="15"/>
<text name="Logs:">
Chatprotokolle:
</text>
diff --git a/indra/newview/skins/default/xui/de/panel_region_general.xml b/indra/newview/skins/default/xui/de/panel_region_general.xml
index be8507ebbd..f383be992b 100644
--- a/indra/newview/skins/default/xui/de/panel_region_general.xml
+++ b/indra/newview/skins/default/xui/de/panel_region_general.xml
@@ -25,6 +25,7 @@
<check_box label="Landwiederverkauf zulassen" name="allow_land_resell_check"/>
<check_box label="Landumverteilung zulassen" name="allow_parcel_changes_check"/>
<check_box label="Landanzeige in Suche blockieren" name="block_parcel_search_check" tool_tip="Diese Region und ihre Parzellen in Suchergebnissen anzeigen"/>
+ <check_box label="Netzobjekte zulassen" name="mesh_rez_enabled_check" tool_tip="Anderen das Rezzen von Netzobjekten in dieser Region gestatten"/>
<spinner label="Avatar-Limit" name="agent_limit_spin"/>
<spinner label="Objektbonus" name="object_bonus_spin"/>
<text label="Inhaltseinstufung" name="access_text">
diff --git a/indra/newview/skins/default/xui/de/panel_scrolling_param_base.xml b/indra/newview/skins/default/xui/de/panel_scrolling_param_base.xml
index 990193574e..fa659040ea 100644
--- a/indra/newview/skins/default/xui/de/panel_scrolling_param_base.xml
+++ b/indra/newview/skins/default/xui/de/panel_scrolling_param_base.xml
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="LLScrollingPanelParamBase">
- <slider label="[BESCHR]" name="param slider"/>
+ <slider label="[DESC]" name="param slider"/>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_sound_devices.xml b/indra/newview/skins/default/xui/de/panel_sound_devices.xml
new file mode 100644
index 0000000000..da20f7e214
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_sound_devices.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<panel label="Geräteeinstellungen" name="device_settings_panel">
+ <panel.string name="default_text">
+ Standard
+ </panel.string>
+ <text name="Input">
+ Eingabe
+ </text>
+ <text name="My volume label">
+ Meine Lautstärke:
+ </text>
+ <slider_bar initial_value="1,0" name="mic_volume_slider" tool_tip="Lautstärke mit diesem Regler ändern"/>
+ <text name="wait_text">
+ Bitte warten
+ </text>
+ <text name="Output">
+ Ausgabe
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/strings.xml b/indra/newview/skins/default/xui/de/strings.xml
index f32eb21dd3..ed38267466 100644
--- a/indra/newview/skins/default/xui/de/strings.xml
+++ b/indra/newview/skins/default/xui/de/strings.xml
@@ -130,6 +130,139 @@
<string name="create_account_url">
http://join.secondlife.com/index.php?lang=de-DE
</string>
+ <string name="LoginFailedViewerNotPermitted">
+ Mit dem von Ihnen verwendeten Viewer ist der Zugriff auf Second Life nicht mehr möglich. Laden Sie von den folgenden Seite einen neuen Viewer herunter:
+http://secondlife.com/download
+
+Weitere Informationen finden Sie auf der folgenden FAQ-Seite:
+http://secondlife.com/viewer-access-faq
+ </string>
+ <string name="LoginIntermediateOptionalUpdateAvailable">
+ Optionales Viewer-Update verfügbar: [VERSION]
+ </string>
+ <string name="LoginFailedRequiredUpdate">
+ Erforderliches Viewer-Update: [VERSION]
+ </string>
+ <string name="LoginFailedAlreadyLoggedIn">
+ Dieser Agent ist bereits angemeldet.
+ </string>
+ <string name="LoginFailedAuthenticationFailed">
+ Wir bitten um Entschuldigung! Wir konnten Sie nicht anmelden.
+Stellen Sie sicher, dass Sie die richtigen Informationen eingegeben haben:
+ * Benutzername (wie robertschmidt12 oder warme.sonne)
+ * Kennwort
+Stellen Sie außerdem sicher, dass die Umschaltsperre deaktiviert ist.
+ </string>
+ <string name="LoginFailedPasswordChanged">
+ Ihr Kennwort wurde aus Sicherheitsgründen geändert.
+Gehen Sie zur Seite „Mein Account“ unter http://secondlife.com/password
+und beantworten Sie die Sicherheitsfrage, um Ihr Kennwort zurückzusetzen.
+Wir entschuldigen uns für eventuell enstandene Unannehmlichkeiten.
+ </string>
+ <string name="LoginFailedPasswordReset">
+ Aufgrund von Systemänderungen müssen Sie Ihr Kennwort zurücksetzen.
+Gehen Sie zur Seite „Mein Account“ unter http://secondlife.com/password
+und beantworten Sie die Sicherheitsfrage, um Ihr Kennwort zurückzusetzen.
+Wir entschuldigen uns für eventuell enstandene Unannehmlichkeiten.
+ </string>
+ <string name="LoginFailedEmployeesOnly">
+ Second Life ist vorübergehend wegen Wartung geschlossen.
+Nur Mitarbeiter können sich anmelden.
+Aktuelle Informationen finden Sie unter www.secondlife.com/status.
+ </string>
+ <string name="LoginFailedPremiumOnly">
+ Die Anmeldung bei Second Life ist vorübergehend eingeschränkt, um sicherzustellen, dass Einwohner, die sich bereits inworld aufhalten, das bestmögliche Erlebnis haben.
+
+Benutzer mit kostenlosen Konten können sich während dieses Zeitraums nicht bei Second Life anmelden, damit die Kapazität den Benutzern zur Verfügung steht, die ein gebührenpflichtiges Premium-Konto besitzen.
+ </string>
+ <string name="LoginFailedComputerProhibited">
+ Der Zugriff auf Second Life ist von diesem Computer aus nicht möglich.
+Wenn Sie der Ansicht sind, dass Sie diese Meldung fälschlicherweise erhalten haben, wenden Sie sich an
+support@secondlife.com.
+ </string>
+ <string name="LoginFailedAcountSuspended">
+ Ihr Konto ist erst ab
+[TIME] Pacific Time wieder verfügbar.
+ </string>
+ <string name="LoginFailedAccountDisabled">
+ Ihre Anfrage kann derzeit nicht bearbeitet werden.
+Wenden Sie sich unter http://secondlife.com/support an den Second Life-Support.
+Wenn Sie Ihr Kennwort nicht ändern können, rufen Sie die US-Nummer (866) 476-9763 an.
+ </string>
+ <string name="LoginFailedTransformError">
+ Nicht übereinstimmende Daten bei der Anmeldung festgestellt.
+Wenden Sie sich an support@secondlife.com.
+ </string>
+ <string name="LoginFailedAccountMaintenance">
+ An Ihrem Konto werden gerade kleinere Wartungsarbeiten durchgeführt.
+Ihr Konto ist erst ab
+[TIME] Pacific Time wieder verfügbar.
+Wenn Sie der Ansicht sind, dass Sie diese Meldung fälschlicherweise erhalten haben, wenden Sie sich an support@secondlife.com.
+ </string>
+ <string name="LoginFailedPendingLogoutFault">
+ Abmeldeanforderung führte zu einem Simulatorfehler.
+ </string>
+ <string name="LoginFailedPendingLogout">
+ Das System meldet Sie gerade ab.
+Ihr Konto ist erst ab
+[TIME] Pacific Time wieder verfügbar.
+ </string>
+ <string name="LoginFailedUnableToCreateSession">
+ Es kann keine gültige Sitzung erstellt werden.
+ </string>
+ <string name="LoginFailedUnableToConnectToSimulator">
+ Es kann keine Simulatorverbindung hergestellt werden.
+ </string>
+ <string name="LoginFailedRestrictedHours">
+ Mit Ihrem Konto ist der Zugriff auf Second Life
+nur zwischen [START] und [END] Pacific Time möglich.
+Schauen Sie während dieses Zeitraums vorbei.
+Wenn Sie der Ansicht sind, dass Sie diese Meldung fälschlicherweise erhalten haben, wenden Sie sich an support@secondlife.com.
+ </string>
+ <string name="LoginFailedIncorrectParameters">
+ Falsche Parameter.
+Wenn Sie der Ansicht sind, dass Sie diese Meldung fälschlicherweise erhalten haben, wenden Sie sich an support@secondlife.com.
+ </string>
+ <string name="LoginFailedFirstNameNotAlphanumeric">
+ Vorname muss alphanumerisch sein.
+Wenn Sie der Ansicht sind, dass Sie diese Meldung fälschlicherweise erhalten haben, wenden Sie sich an support@secondlife.com.
+ </string>
+ <string name="LoginFailedLastNameNotAlphanumeric">
+ Nachname muss alphanumerisch sein.
+Wenn Sie der Ansicht sind, dass Sie diese Meldung fälschlicherweise erhalten haben, wenden Sie sich an support@secondlife.com.
+ </string>
+ <string name="LogoutFailedRegionGoingOffline">
+ Die Region wird gerade offline geschaltet.
+Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
+ </string>
+ <string name="LogoutFailedAgentNotInRegion">
+ Agent nicht in Region.
+Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
+ </string>
+ <string name="LogoutFailedPendingLogin">
+ Die Region war gerade dabei, eine andere Sitzung anzumelden.
+Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
+ </string>
+ <string name="LogoutFailedLoggingOut">
+ Die Region war gerade dabei, die vorherige Sitzung abzumelden.
+Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
+ </string>
+ <string name="LogoutFailedStillLoggingOut">
+ Die Region ist noch immer dabei, die vorherige Sitzung abzumelden.
+Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
+ </string>
+ <string name="LogoutSucceeded">
+ Die Region hat soeben die letzte Sitzung abgemeldet.
+Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
+ </string>
+ <string name="LogoutFailedLogoutBegun">
+ Die Region hat den Abmeldevorgang gestartet.
+Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
+ </string>
+ <string name="LoginFailedLoggingOutSession">
+ Das System hat begonnen, Ihre letzte Sitzung abzumelden.
+Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
+ </string>
<string name="AgentLostConnection">
In dieser Region kann es zu Problemen kommen. Bitte überprüfen Sie Ihre Internetverbindung.
</string>
@@ -441,6 +574,9 @@
<string name="symbolic folder link">
Link zu Ordner
</string>
+ <string name="mesh">
+ mesh
+ </string>
<string name="AvatarEditingAppearance">
(Aussehen wird bearbeitet)
</string>
@@ -1102,9 +1238,6 @@
<string name="InvFolder My Inventory">
Mein Inventar
</string>
- <string name="InvFolder My Favorites">
- Meine Favoriten
- </string>
<string name="InvFolder Library">
Bibliothek
</string>
@@ -1163,10 +1296,10 @@
Gesten
</string>
<string name="InvFolder Favorite">
- Favoriten
+ Meine Favoriten
</string>
<string name="InvFolder favorite">
- Favoriten
+ Meine Favoriten
</string>
<string name="InvFolder Current Outfit">
Aktuelles Outfit
@@ -1180,6 +1313,9 @@
<string name="InvFolder Accessories">
Zubehör
</string>
+ <string name="InvFolder Meshes">
+ Netze
+ </string>
<string name="InvFolder Friends">
Freunde
</string>
@@ -3762,6 +3898,9 @@ Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_
<string name="session_initialization_timed_out_error">
Die Initialisierung der Sitzung ist fehlgeschlagen
</string>
+ <string name="Home position set.">
+ Position für Zuhause festgelegt.
+ </string>
<string name="voice_morphing_url">
http://secondlife.com/landing/voicemorphing
</string>
diff --git a/indra/newview/skins/default/xui/en/floater_about_land.xml b/indra/newview/skins/default/xui/en/floater_about_land.xml
index 6e985e0476..07cb4c12f5 100644
--- a/indra/newview/skins/default/xui/en/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/en/floater_about_land.xml
@@ -414,7 +414,7 @@
right="-10"
name="Cancel Land Sale"
left_pad="5"
- top_pad="-15"
+ top_pad="7"
width="180" />
<text
type="string"
@@ -488,6 +488,7 @@
width="186">
0
</text>
+
<button
enabled="false"
follows="left|top"
@@ -495,9 +496,20 @@
label="Buy Land"
layout="topleft"
left_delta="52"
+ top_pad="5"
name="Buy Land..."
- top_pad="7"
width="130" />
+ <button
+ enabled="false"
+ follows="left|top"
+ height="23"
+ label="Linden Sale"
+ layout="topleft"
+ left="10"
+ name="Linden Sale..."
+ tool_tip="Land must be owned, set content, and not already for auction."
+ top_pad="-23"
+ width="150" />
<button
enabled="true"
follows="left|top"
@@ -545,18 +557,7 @@
layout="topleft"
left_delta="0"
name="Reclaim Land..."
- top_delta="-50"
- width="180" />
- <button
- enabled="false"
- follows="left|top"
- height="23"
- label="Linden Sale"
- layout="topleft"
- left_delta="0"
- name="Linden Sale..."
- tool_tip="Land must be owned, set content, and not already for auction."
- top_pad="2"
+ top_delta="-25"
width="180" />
</panel>
<panel
@@ -1204,6 +1205,10 @@ Only large parcels can be listed in search.
name="push_restrict_region_text">
No Pushing (Region Override)
</panel.string>
+ <panel.string
+ name="see_avs_text">
+ See and chat with residents on this parcel
+ </panel.string>
<text
type="string"
length="1"
@@ -1313,7 +1318,7 @@ Only large parcels can be listed in search.
name="check group scripts"
top_delta="0"
width="70" />
- <text
+ <text
type="string"
text_color="white"
length="1"
@@ -1514,10 +1519,32 @@ Only large parcels can be listed in search.
type="string"
length="1"
follows="left|top"
+ text_color="white"
+ height="16"
+ layout="topleft"
+ left="230"
+ top="174"
+ name="allow_label5"
+ width="278">
+ Allow Residents on other parcels to:
+ </text>
+ <check_box
+ height="16"
+ label="See Avatars"
+ follows="top"
+ layout="topleft"
+ left="230"
+ name="SeeAvatarsCheck"
+ tool_tip="Allows residents on other parcels to see and chat with residents on this parcel, and you to see and chat with them."
+ width="120" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
height="16"
layout="topleft"
- left="220"
- top="180"
+ left="230"
+ top="230"
text_color="white"
name="landing_point"
word_wrap="true"
@@ -1531,7 +1558,7 @@ Only large parcels can be listed in search.
label_selected="Set"
layout="topleft"
name="Set"
- right="-68"
+ left="230"
tool_tip="Sets the landing point where visitors arrive. Sets to your avatar&apos;s location inside this parcel."
width="50" />
<button
@@ -1543,7 +1570,6 @@ Only large parcels can be listed in search.
left_pad="5"
name="Clear"
tool_tip="Clear the landing point"
- right="-10"
width="55" />
<text
type="string"
@@ -1552,7 +1578,7 @@ Only large parcels can be listed in search.
follows="left|top"
height="16"
layout="topleft"
- left="220"
+ left="230"
top_pad="10"
name="Teleport Routing: "
width="200">
@@ -1845,6 +1871,34 @@ Only large parcels can be listed in search.
name="check sound local"
left_pad="0"
width="292" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left="10"
+ name="Avatar Sounds:"
+ top_pad="10"
+ width="100">
+ Avatar Sounds:
+ </text>
+ <check_box
+ height="16"
+ label="Everyone"
+ layout="topleft"
+ left_pad="0"
+ name="all av sound check"
+ top_delta="0"
+ width="130" />
+ <check_box
+ height="16"
+ label="Group"
+ layout="topleft"
+ left_pad="0"
+ name="group av sound check"
+ top_delta="0"
+ width="70" />
<text
type="string"
length="1"
@@ -2125,4 +2179,4 @@ Only large parcels can be listed in search.
</panel>
</panel>
</tab_container>
-</floater>
+</floater> \ No newline at end of file
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 56230e912c..c247a12e7a 100644
--- a/indra/newview/skins/default/xui/en/floater_build_options.xml
+++ b/indra/newview/skins/default/xui/en/floater_build_options.xml
@@ -2,27 +2,84 @@
<floater
legacy_header_height="18"
follows="right"
- height="170"
+ height="198"
layout="topleft"
name="build options floater"
help_topic="build_options_floater"
save_rect="true"
title="GRID OPTIONS"
width="264">
+ <floater.string
+ name="grid_screen_text">
+ Screen
+ </floater.string>
+ <floater.string
+ name="grid_local_text">
+ Local
+ </floater.string>
+ <floater.string
+ name="grid_world_text">
+ World
+ </floater.string>
+ <floater.string
+ name="grid_reference_text">
+ Reference
+ </floater.string>
+ <floater.string
+ name="grid_attachment_text">
+ Attachment
+ </floater.string>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left="10"
+ tool_tip="Grid opacity"
+ name="grid_opacity_label"
+ top_pad="30"
+ width="123">
+ Mode
+ </text>
+ <combo_box
+ height="23"
+ layout="topleft"
+ left_pad="9"
+ follows="left|top"
+ name="combobox grid mode"
+ tool_tip="Choose the type of grid ruler for positioning the object"
+ top_delta="-3"
+ width="108">
+ <combo_box.item
+ label="World grid"
+ name="World"
+ value="World" />
+ <combo_box.item
+ label="Local grid"
+ name="Local"
+ value="Local" />
+ <combo_box.item
+ label="Reference grid"
+ name="Reference"
+ value="Reference" />
+ <combo_box.commit_callback
+ function="GridOptions.gridMode"/>
+ </combo_box>
<spinner
control_name="GridResolution"
follows="left|top"
height="23"
initial_value="1"
- label="Grid Units (meters)"
- label_width="160"
+ label="Units (meters)"
+ label_width="130"
layout="topleft"
left="10"
max_val="5"
min_val="0.01"
name="GridResolution"
- top="25"
- width="230" />
+ top_pad="4"
+ width="200" />
<spinner
control_name="GridDrawSize"
decimal_digits="1"
@@ -30,15 +87,15 @@
height="23"
increment="0.5"
initial_value="5"
- label="Grid Extents (meters)"
- label_width="160"
+ label="Extents (meters)"
+ label_width="130"
layout="topleft"
left_delta="0"
max_val="50"
min_val="1"
name="GridDrawSize"
top_pad="0"
- width="230" />
+ width="200" />
<check_box
control_name="GridSubUnit"
height="16"
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 49deb9b025..49ca6cc8ba 100644
--- a/indra/newview/skins/default/xui/en/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/en/floater_buy_currency.xml
@@ -247,10 +247,10 @@ Re-enter amount to see the latest exchange rate.
follows="top|left"
layout="topleft"
halign="right"
- top="213"
+ top="208"
left="10"
width="310"
- height="30"
+ height="35"
name="purchase_warning_repurchase">
Confirming this purchase only buys L$, not the object.
</text>
@@ -299,7 +299,7 @@ Re-enter amount to see the latest exchange rate.
type="string"
font="SansSerifHuge"
left="165"
- width="170"
+ width="360"
height="25"
top="25"
name="info_cannot_buy">
diff --git a/indra/newview/skins/default/xui/en/floater_buy_land.xml b/indra/newview/skins/default/xui/en/floater_buy_land.xml
index d5d4565ca1..ab81a86720 100644
--- a/indra/newview/skins/default/xui/en/floater_buy_land.xml
+++ b/indra/newview/skins/default/xui/en/floater_buy_land.xml
@@ -204,7 +204,7 @@ supports [AMOUNT2] objects
follows="left|top"
height="14"
layout="topleft"
- left_delta="110"
+ left_delta="125"
name="region_name_text"
top_delta="0"
use_ellipses="true"
@@ -237,7 +237,7 @@ supports [AMOUNT2] objects
follows="left|top"
height="14"
layout="topleft"
- left_delta="110"
+ left_delta="125"
name="region_type_text"
top_delta="0"
width="175">
@@ -262,7 +262,7 @@ supports [AMOUNT2] objects
follows="left|top"
height="14"
layout="topleft"
- left_delta="110"
+ left_delta="125"
name="estate_name_text"
top_delta="0"
width="175">
@@ -276,8 +276,8 @@ supports [AMOUNT2] objects
layout="topleft"
left="440"
name="estate_owner_label"
- right="550"
- width="100"
+ right="565"
+ width="120"
word_wrap="true">
Estate Owner:
</text>
@@ -287,7 +287,7 @@ supports [AMOUNT2] objects
follows="left|top"
height="20"
layout="topleft"
- left_delta="110"
+ left_delta="125"
name="estate_owner_text"
top_delta="0"
width="175">
diff --git a/indra/newview/skins/default/xui/en/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/en/floater_day_cycle_options.xml
deleted file mode 100644
index 65e2462ef8..0000000000
--- a/indra/newview/skins/default/xui/en/floater_day_cycle_options.xml
+++ /dev/null
@@ -1,558 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater
- legacy_header_height="18"
- height="275"
- layout="topleft"
- name="Day Cycle Floater"
- help_topic="day_cycle_floater"
- save_rect="true"
- title="DAY CYCLE EDITOR"
- width="658">
- <tab_container
- follows="left|top"
- height="255"
- layout="topleft"
- left="0"
- name="Day Cycle Tabs"
- tab_position="top"
- top="20"
- width="656">
- <panel
- border="true"
- follows="left|top|right|bottom"
- height="255"
- label="Day Cycle"
- layout="topleft"
- left="1"
- mouse_opaque="false"
- name="Day Cycle"
- top="0"
- width="654">
- <multi_slider
- can_edit_text="true"
- control_name="WLTimeSlider"
- decimal_digits="0"
- draw_track="false"
- follows="bottom"
- height="10"
- increment="0.0833333"
- initial_value="0"
- layout="topleft"
- left="20"
- max_sliders="20"
- max_val="24"
- name="WLTimeSlider"
- show_text="false"
- top="25"
- use_triangle="true"
- width="525" />
- <multi_slider
- can_edit_text="true"
- control_name="WLDayCycleKeys"
- decimal_digits="0"
- follows="bottom"
- height="10"
- increment="0.0833333"
- initial_value="0"
- layout="topleft"
- left_delta="0"
- max_sliders="20"
- max_val="24"
- name="WLDayCycleKeys"
- show_text="false"
- top_pad="15"
- width="525" />
- <text
- type="string"
- length="1"
- border_visible="true"
- follows="left|top|right"
- height="16"
- layout="topleft"
- left="8"
- name="WL12am"
- top="74"
- width="55">
- 12am
- </text>
- <text
- type="string"
- length="1"
- border_visible="true"
- follows="left|top|right"
- height="16"
- layout="topleft"
- left_pad="10"
- name="WL3am"
- top_delta="0"
- width="55">
- 3am
- </text>
- <text
- type="string"
- length="1"
- border_visible="true"
- follows="left|top|right"
- height="16"
- layout="topleft"
- left_pad="10"
- name="WL6am"
- top_delta="0"
- width="55">
- 6am
- </text>
- <text
- type="string"
- length="1"
- border_visible="true"
- follows="left|top|right"
- height="16"
- layout="topleft"
- left_pad="10"
- name="WL9amHash"
- top_delta="0"
- width="55">
- 9am
- </text>
- <text
- type="string"
- length="1"
- border_visible="true"
- follows="left|top|right"
- height="16"
- layout="topleft"
- left_pad="10"
- name="WL12pmHash"
- top_delta="0"
- width="55">
- 12pm
- </text>
- <text
- type="string"
- length="1"
- border_visible="true"
- follows="left|top|right"
- height="16"
- layout="topleft"
- left_pad="10"
- name="WL3pm"
- top_delta="0"
- width="55">
- 3pm
- </text>
- <text
- type="string"
- length="1"
- border_visible="true"
- follows="left|top|right"
- height="16"
- layout="topleft"
- left_pad="10"
- name="WL6pm"
- top_delta="0"
- width="55">
- 6pm
- </text>
- <text
- type="string"
- length="1"
- border_visible="true"
- follows="left|top|right"
- height="16"
- layout="topleft"
- left_pad="10"
- name="WL9pm"
- top_delta="0"
- width="55">
- 9pm
- </text>
- <text
- type="string"
- length="1"
- border_visible="true"
- follows="left|top|right"
- height="16"
- layout="topleft"
- left_pad="10"
- name="WL12am2"
- top_delta="0"
- width="55">
- 12am
- </text>
- <text
- type="string"
- length="1"
- border_visible="true"
- follows="left|top|right"
- font="SansSerif"
- height="14"
- layout="topleft"
- left="20"
- name="WL12amHash"
- top="54"
- width="6">
- |
- </text>
- <text
- type="string"
- length="1"
- border_visible="true"
- follows="left|top|right"
- font="SansSerif"
- height="11"
- layout="topleft"
- left_pad="59"
- name="WL3amHash"
- top_delta="3"
- width="6">
- I
- </text>
- <text
- type="string"
- length="1"
- border_visible="true"
- follows="left|top|right"
- font="SansSerif"
- height="14"
- layout="topleft"
- left_pad="59"
- name="WL6amHash"
- top_delta="-3"
- width="6">
- |
- </text>
- <text
- type="string"
- length="1"
- border_visible="true"
- follows="left|top|right"
- font="SansSerif"
- height="11"
- layout="topleft"
- left_pad="59"
- name="WL9amHash2"
- top_delta="3"
- width="6">
- I
- </text>
- <text
- type="string"
- length="1"
- border_visible="true"
- follows="left|top|right"
- font="SansSerif"
- height="14"
- layout="topleft"
- left_pad="59"
- name="WL12pmHash2"
- top_delta="-3"
- width="6">
- |
- </text>
- <text
- type="string"
- length="1"
- border_visible="true"
- follows="left|top|right"
- font="SansSerif"
- height="11"
- layout="topleft"
- left_pad="59"
- name="WL3pmHash"
- top_delta="3"
- width="6">
- I
- </text>
- <text
- type="string"
- length="1"
- border_visible="true"
- follows="left|top|right"
- font="SansSerif"
- height="14"
- layout="topleft"
- left_pad="59"
- name="WL6pmHash"
- top_delta="-3"
- width="6">
- |
- </text>
- <text
- type="string"
- length="1"
- border_visible="true"
- follows="left|top|right"
- font="SansSerif"
- height="11"
- layout="topleft"
- left_pad="59"
- name="WL9pmHash"
- top_delta="3"
- width="6">
- I
- </text>
- <text
- type="string"
- length="1"
- border_visible="true"
- follows="left|top|right"
- font="SansSerif"
- height="14"
- layout="topleft"
- left_pad="59"
- name="WL12amHash2"
- top_delta="-3"
- width="6">
- |
- </text>
- <button
- height="20"
- label="Add Key"
- label_selected="Add Key"
- layout="topleft"
- left="555"
- name="WLAddKey"
- top="30"
- width="96" />
- <button
- height="20"
- label="Delete Key"
- label_selected="Delete Key"
- layout="topleft"
- left_delta="0"
- name="WLDeleteKey"
- top_pad="5"
- width="96" />
- <text
- type="string"
- length="1"
- border_visible="true"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left="20"
- name="WLCurKeyFrameText"
- top="104"
- width="235">
- Key Frame Settings:
- </text>
- <text
- type="string"
- length="1"
- border_visible="true"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left="30"
- name="WLCurKeyTimeText"
- top="124"
- width="105">
- Key Time:
- </text>
- <spinner
- control_name="WLCurKeyHour"
- decimal_digits="0"
- follows="left|top"
- height="16"
- increment="1"
- initial_value="0"
- label="Hour"
- label_width="35"
- layout="topleft"
- left_delta="20"
- max_val="100"
- name="WLCurKeyHour"
- top_pad="4"
- width="74" />
- <spinner
- control_name="WLCurKeyMin"
- decimal_digits="0"
- follows="left|top"
- height="16"
- increment="5"
- initial_value="0"
- label="Min"
- label_width="45"
- layout="topleft"
- left_pad="5"
- max_val="55"
- name="WLCurKeyMin"
- top_delta="0"
- width="85" />
- <text
- type="string"
- length="1"
- border_visible="true"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left="30"
- name="WLCurKeyTimeText2"
- top="169"
- width="185">
- Key Preset:
- </text>
- <combo_box
- height="18"
- label="Preset"
- layout="topleft"
- left_delta="0"
- name="WLKeyPresets"
- top_pad="7"
- width="205" />
- <view_border
- bevel_style="none"
- follows="top|left"
- height="115"
- layout="topleft"
- left="12"
- top="101"
- width="240" />
- <text
- type="string"
- length="1"
- border_visible="true"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left_pad="15"
- name="DayCycleText"
- top="114"
- width="120">
- Snap:
- </text>
- <combo_box
- enabled="false"
- height="18"
- label="5 min"
- layout="topleft"
- left_delta="0"
- name="WLSnapOptions"
- top_pad="7"
- width="70" />
- <text
- type="string"
- length="1"
- border_visible="true"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left_delta="0"
- name="DayCycleText2"
- top_pad="17"
- width="120">
- Length of Cycle:
- </text>
- <spinner
- control_name="WLLengthOfDayHour"
- decimal_digits="0"
- follows="left|top"
- height="16"
- increment="1"
- initial_value="0"
- label="Hour"
- label_width="33"
- layout="topleft"
- left_delta="-3"
- max_val="100"
- name="WLLengthOfDayHour"
- top_pad="4"
- width="74" />
- <spinner
- control_name="WLLengthOfDayMin"
- decimal_digits="0"
- follows="left|top"
- height="16"
- increment="1"
- initial_value="0"
- label="Min"
- label_width="25"
- layout="topleft"
- left_pad="2"
- max_val="59"
- name="WLLengthOfDayMin"
- top_delta="0"
- width="65" />
- <spinner
- control_name="WLLengthOfDaySec"
- decimal_digits="0"
- follows="left|top"
- height="16"
- increment="1"
- initial_value="24"
- label="Sec"
- label_width="25"
- layout="topleft"
- left_pad="2"
- max_val="59"
- name="WLLengthOfDaySec"
- top_delta="0"
- width="65"/>
- <text
- type="string"
- halign="right"
- length="1"
- border_visible="true"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left_delta="-23"
- name="DayCycleText3"
- top="114"
- width="85">
- Preview :
- </text>
- <button
- height="20"
- label="Play"
- label_selected="Play"
- layout="topleft"
- left="480"
- name="WLAnimSky"
- top_pad="5"
- width="83" />
- <button
- height="20"
- label="Stop!"
- label_selected="Stop"
- layout="topleft"
- left_pad="4"
- name="WLStopAnimSky"
- top_delta="0"
- width="83" />
- <button
- height="20"
- label="Use Estate Time"
- label_selected="Go to Estate Time"
- layout="topleft"
- left="480"
- name="WLUseLindenTime"
- top_pad="9"
- width="170" />
- <button
- height="20"
- label="Save Test Day"
- label_selected="Save Test Day"
- layout="topleft"
- left_delta="0"
- name="WLSaveDayCycle"
- top_pad="9"
- width="170" />
- <button
- height="20"
- label="Load Test Day"
- label_selected="Load Test Day"
- layout="topleft"
- left_delta="0"
- name="WLLoadDayCycle"
- top_pad="3"
- width="170" />
- </panel>
- </tab_container>
-</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_delete_env_preset.xml b/indra/newview/skins/default/xui/en/floater_delete_env_preset.xml
new file mode 100644
index 0000000000..b5de4166f6
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_delete_env_preset.xml
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<floater
+ legacy_header_height="18"
+ height="130"
+ help_topic=""
+ layout="topleft"
+ name="Delete Env Preset"
+ save_rect="true"
+ title="DELETE ENV PRESET"
+ width="550">
+
+ <string name="title_water">Delete Water Preset</string>
+ <string name="title_sky">Delete Sky Preset</string>
+ <string name="title_day_cycle">Delete Day Cycle</string>
+
+ <string name="label_water">Preset:</string>
+ <string name="label_sky">Preset:</string>
+ <string name="label_day_cycle">Day cycle:</string>
+
+ <string name="msg_confirm_deletion">Are you sure you want to delete the selected preset?</string>
+ <string name="msg_sky_is_referenced">Cannot remove a preset that is referenced by some day cycle(s).</string>
+
+ <string name="combo_label">-Select a preset-</string>
+
+ <text
+ follows="top|left|right"
+ font="SansSerif"
+ height="10"
+ layout="topleft"
+ left="50"
+ name="label"
+ top="60"
+ width="60">
+ Preset:
+ </text>
+ <combo_box
+ follows="top|left"
+ layout="topleft"
+ left_pad="10"
+ name="preset_combo"
+ top_delta="-5"
+ width="200"/>
+ <button
+ follows="bottom|right"
+ height="23"
+ label="Delete"
+ layout="topleft"
+ left_pad="15"
+ name="delete"
+ width="70"/>
+ <button
+ follows="bottom|right"
+ height="23"
+ label="Cancel"
+ layout="topleft"
+ left_pad="5"
+ name="cancel"
+ width="70"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_edit_day_cycle.xml b/indra/newview/skins/default/xui/en/floater_edit_day_cycle.xml
new file mode 100644
index 0000000000..d9a3ad0c4b
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_edit_day_cycle.xml
@@ -0,0 +1,485 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ legacy_header_height="18"
+ height="381"
+ layout="topleft"
+ name="Edit Day cycle"
+ help_topic="day_presets"
+ save_rect="true"
+ title="Edit Day Cycle"
+ width="705">
+
+ <string name="title_new">Create a New Day Cycle</string>
+ <string name="title_edit">Edit Day Cycle</string>
+ <string name="hint_new">Name your day cycle, adjust the controls to create it, and click "Save".</string>
+ <string name="hint_edit">To edit your day cycle, adjust the controls below and click "Save".</string>
+ <string name="combo_label">-Select a preset-</string>
+
+ <text
+ follows="top|left|right"
+ height="10"
+ layout="topleft"
+ left="10"
+ name="hint"
+ top="25"
+ width="685" />
+ <text
+ follows="top|left|right"
+ font="SansSerif"
+ height="10"
+ layout="topleft"
+ left="10"
+ name="label"
+ top_pad="25"
+ width="120">
+ Preset Name:
+ </text>
+ <combo_box
+ allow_text_entry="true"
+ follows="top|left"
+ layout="topleft"
+ left_pad="10"
+ max_chars="100"
+ name="day_cycle_combo"
+ top_delta="-5"
+ width="200" />
+ <line_editor
+ height="20"
+ left_delta="0"
+ name="day_cycle_name"
+ top_delta="0"
+ visible="true"
+ width="200" />
+ <text
+ follows="top|left|right"
+ height="95"
+ layout="topleft"
+ left_pad="10"
+ name="note"
+ top_delta="0"
+ width="345"
+ wrap="true">
+ Note: if you change the name of your preset, you will be creating a new preset and the existing preset will not be changed.
+ </text>
+ <!--======== Controls panel ========-->
+ <text
+ follows="left|top|right"
+ height="10"
+ layout="topleft"
+ left="10"
+ name="hint_item1"
+ top="100"
+ width="300">
+ - Click on a tab to edit the specific sky settings and time.
+ </text>
+ <text
+ follows="left|top|right"
+ height="10"
+ layout="topleft"
+ name="hint_item2"
+ top_pad="10"
+ width="300">
+ - Click and drag the tabs to set the transition times.
+ </text>
+ <text
+ follows="left|top|right"
+ height="10"
+ layout="topleft"
+ name="hint_item3"
+ top_pad="10"
+ width="300">
+ - Use the scrubber to preview your day cycle.
+ </text>
+ <panel
+ follows="top|left"
+ height="100"
+ name="day_cycle_slider_panel"
+ layout="topleft"
+ left_delta="25"
+ top_pad="15"
+ width="660">
+ <multi_slider
+ can_edit_text="true"
+ control_name="WLTimeSlider"
+ decimal_digits="0"
+ draw_track="false"
+ follows="bottom"
+ height="10"
+ increment="0.0833333"
+ initial_value="0"
+ layout="topleft"
+ left="20"
+ max_sliders="20"
+ max_val="24"
+ name="WLTimeSlider"
+ show_text="false"
+ top_pad="0"
+ use_triangle="true"
+ width="525" />
+ <multi_slider
+ can_edit_text="true"
+ control_name="WLDayCycleKeys"
+ decimal_digits="0"
+ follows="bottom"
+ height="10"
+ increment="0.0833333"
+ initial_value="0"
+ layout="topleft"
+ left_delta="0"
+ max_sliders="20"
+ max_val="24"
+ name="WLDayCycleKeys"
+ show_text="false"
+ top_pad="15"
+ width="525" />
+ <button
+ height="20"
+ label="Add Key"
+ label_selected="Add Key"
+ layout="topleft"
+ left_pad="20"
+ name="WLAddKey"
+ top_delta="-18"
+ width="96" />
+ <button
+ height="20"
+ label="Delete Key"
+ label_selected="Delete Key"
+ layout="topleft"
+ name="WLDeleteKey"
+ top_pad="5"
+ width="96" />
+ <text
+ type="string"
+ length="1"
+ border_visible="true"
+ follows="left|top|right"
+ height="16"
+ layout="topleft"
+ left="8"
+ name="WL12am"
+ top="74"
+ width="55">
+ 12am
+ </text>
+ <text
+ type="string"
+ length="1"
+ border_visible="true"
+ follows="left|top|right"
+ height="16"
+ layout="topleft"
+ left_pad="10"
+ name="WL3am"
+ top_delta="0"
+ width="55">
+ 3am
+ </text>
+ <text
+ type="string"
+ length="1"
+ border_visible="true"
+ follows="left|top|right"
+ height="16"
+ layout="topleft"
+ left_pad="10"
+ name="WL6am"
+ top_delta="0"
+ width="55">
+ 6am
+ </text>
+ <text
+ type="string"
+ length="1"
+ border_visible="true"
+ follows="left|top|right"
+ height="16"
+ layout="topleft"
+ left_pad="10"
+ name="WL9amHash"
+ top_delta="0"
+ width="55">
+ 9am
+ </text>
+ <text
+ type="string"
+ length="1"
+ border_visible="true"
+ follows="left|top|right"
+ height="16"
+ layout="topleft"
+ left_pad="10"
+ name="WL12pmHash"
+ top_delta="0"
+ width="55">
+ 12pm
+ </text>
+ <text
+ type="string"
+ length="1"
+ border_visible="true"
+ follows="left|top|right"
+ height="16"
+ layout="topleft"
+ left_pad="10"
+ name="WL3pm"
+ top_delta="0"
+ width="55">
+ 3pm
+ </text>
+ <text
+ type="string"
+ length="1"
+ border_visible="true"
+ follows="left|top|right"
+ height="16"
+ layout="topleft"
+ left_pad="10"
+ name="WL6pm"
+ top_delta="0"
+ width="55">
+ 6pm
+ </text>
+ <text
+ type="string"
+ length="1"
+ border_visible="true"
+ follows="left|top|right"
+ height="16"
+ layout="topleft"
+ left_pad="10"
+ name="WL9pm"
+ top_delta="0"
+ width="55">
+ 9pm
+ </text>
+ <text
+ type="string"
+ length="1"
+ border_visible="true"
+ follows="left|top|right"
+ height="16"
+ layout="topleft"
+ left_pad="10"
+ name="WL12am2"
+ top_delta="0"
+ width="55">
+ 12am
+ </text>
+ <text
+ type="string"
+ length="1"
+ border_visible="true"
+ follows="left|top|right"
+ font="SansSerif"
+ height="14"
+ layout="topleft"
+ left="20"
+ name="WL12amHash"
+ top="54"
+ width="6">
+ |
+ </text>
+ <text
+ type="string"
+ length="1"
+ border_visible="true"
+ follows="left|top|right"
+ font="SansSerif"
+ height="11"
+ layout="topleft"
+ left_pad="59"
+ name="WL3amHash"
+ top_delta="3"
+ width="6">
+ I
+ </text>
+ <text
+ type="string"
+ length="1"
+ border_visible="true"
+ follows="left|top|right"
+ font="SansSerif"
+ height="14"
+ layout="topleft"
+ left_pad="59"
+ name="WL6amHash"
+ top_delta="-3"
+ width="6">
+ |
+ </text>
+ <text
+ type="string"
+ length="1"
+ border_visible="true"
+ follows="left|top|right"
+ font="SansSerif"
+ height="11"
+ layout="topleft"
+ left_pad="59"
+ name="WL9amHash2"
+ top_delta="3"
+ width="6">
+ I
+ </text>
+ <text
+ type="string"
+ length="1"
+ border_visible="true"
+ follows="left|top|right"
+ font="SansSerif"
+ height="14"
+ layout="topleft"
+ left_pad="59"
+ name="WL12pmHash2"
+ top_delta="-3"
+ width="6">
+ |
+ </text>
+ <text
+ type="string"
+ length="1"
+ border_visible="true"
+ follows="left|top|right"
+ font="SansSerif"
+ height="11"
+ layout="topleft"
+ left_pad="59"
+ name="WL3pmHash"
+ top_delta="3"
+ width="6">
+ I
+ </text>
+ <text
+ type="string"
+ length="1"
+ border_visible="true"
+ follows="left|top|right"
+ font="SansSerif"
+ height="14"
+ layout="topleft"
+ left_pad="59"
+ name="WL6pmHash"
+ top_delta="-3"
+ width="6">
+ |
+ </text>
+ <text
+ type="string"
+ length="1"
+ border_visible="true"
+ follows="left|top|right"
+ font="SansSerif"
+ height="11"
+ layout="topleft"
+ left_pad="59"
+ name="WL9pmHash"
+ top_delta="3"
+ width="6">
+ I
+ </text>
+ <text
+ type="string"
+ length="1"
+ border_visible="true"
+ follows="left|top|right"
+ font="SansSerif"
+ height="14"
+ layout="topleft"
+ left_pad="59"
+ name="WL12amHash2"
+ top_delta="-3"
+ width="6">
+ |
+ </text>
+ </panel>
+ <text
+ type="string"
+ length="1"
+ border_visible="true"
+ follows="left|top|right"
+ font="SansSerif"
+ height="16"
+ layout="topleft"
+ left_delta="192"
+ name="WLCurKeyPresetText"
+ top_pad="10"
+ width="80">
+ Sky Setting:
+ </text>
+ <combo_box
+ height="18"
+ label="Preset"
+ layout="topleft"
+ left_pad="5"
+ name="WLSkyPresets"
+ width="205" />
+ <text
+ type="string"
+ length="1"
+ border_visible="true"
+ follows="left|top|right"
+ font="SansSerif"
+ height="16"
+ layout="topleft"
+ left_delta="-40"
+ name="WLCurKeyTimeText"
+ top_pad="15"
+ width="35">
+ Time:
+ </text>
+ <time
+ follows="left|top"
+ height="16"
+ label_width="0"
+ layout="topleft"
+ left_pad="3"
+ name="time"
+ top_delta="-1"
+ value="6:00 AM"
+ width="75"/>
+ <view_border
+ bevel_style="none"
+ follows="top|left"
+ height="0"
+ layout="topleft"
+ left="10"
+ name="horiz_separator"
+ top_pad="20"
+ width="685"/>
+ <loading_indicator
+ height="23"
+ layout="topleft"
+ left="25"
+ name="progress_indicator"
+ top="350"
+ visible="false"
+ width="23" />
+ <check_box
+ follows="top|left"
+ height="10"
+ label="Make this my new day cycle"
+ layout="topleft"
+ left="310"
+ name="make_default_cb"
+ top_delta="13"
+ width="230"/>
+ <button
+ follows="bottom|right"
+ height="23"
+ label="Save"
+ layout="topleft"
+ left_pad="0"
+ name="save"
+ top_delta="-13"
+ width="70"/>
+ <button
+ follows="bottom|right"
+ height="23"
+ label="Cancel"
+ layout="topleft"
+ left_pad="15"
+ name="cancel"
+ top_delta="0"
+ width="70"/>
+ </floater>
diff --git a/indra/newview/skins/default/xui/en/floater_edit_sky_preset.xml b/indra/newview/skins/default/xui/en/floater_edit_sky_preset.xml
new file mode 100644
index 0000000000..56233d91ee
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_edit_sky_preset.xml
@@ -0,0 +1,953 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ legacy_header_height="18"
+ height="375"
+ layout="topleft"
+ name="Edit Sky Preset"
+ help_topic="sky_preset"
+ save_rect="true"
+ title="Edit Sky Preset"
+ width="840">
+
+ <string name="title_new">Create a New Sky Preset</string>
+ <string name="title_edit">Edit Sky Preset</string>
+ <string name="hint_new">Name your preset, adjust the controls to create it, and click "Save".</string>
+ <string name="hint_edit">To edit your sky preset, adjust the controls and click "Save".</string>
+ <string name="combo_label">-Select a preset-</string>
+
+ <text
+ follows="top|left|right"
+ height="10"
+ layout="topleft"
+ left="30"
+ name="hint"
+ top="25"
+ width="700">
+ To edit your preset, adjust the controls then click "Save"
+ </text>
+ <text
+ follows="top|left|right"
+ font="SansSerif"
+ height="10"
+ layout="topleft"
+ left="30"
+ name="label"
+ top_pad="25"
+ width="120">
+ Preset Name:
+ </text>
+ <combo_box
+ allow_text_entry="true"
+ follows="top|left"
+ layout="topleft"
+ left_pad="10"
+ max_chars="100"
+ name="sky_preset_combo"
+ top_delta="-5"
+ width="200"/>
+ <line_editor
+ height="20"
+ left_delta="0"
+ name="sky_preset_name"
+ top_delta="0"
+ width="200" />
+ <text
+ follows="top|left|right"
+ height="40"
+ layout="topleft"
+ left_pad="10"
+ name="note"
+ top_delta="0"
+ width="405"
+ wrap="true">
+ Note: if you change the name of your preset, you will be creating a new preset and the existing preset will not be changed.
+ </text>
+ <!--======== Controls panel ========-->
+ <view_border
+ bevel_style="none"
+ follows="top|left"
+ height="203"
+ layout="topleft"
+ left="25"
+ name="panel_water_preset"
+ top="122"
+ visible="true"
+ width="790"/>
+ <tab_container
+ follows="left|top"
+ height="225"
+ halign="center"
+ layout="topleft"
+ left="22"
+ name="WindLight Tabs"
+ tab_position="top"
+ top="101"
+ width="794">
+ <panel
+ border="true"
+ bevel_style="none"
+ follows="left|top|right|bottom"
+ height="196"
+ label="ATMOSPHERE"
+ layout="topleft"
+ left="1"
+ help_topic="sky_preset_atmosphere"
+ mouse_opaque="false"
+ name="Atmosphere"
+ top="60"
+ width="698">
+
+ <!--======== Tab Panel I. I conlumn of controls ========-->
+
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ font="SansSerif"
+ height="16"
+ layout="topleft"
+ left="40"
+ name="BHText"
+ top="25"
+ width="200">
+ Blue Horizon
+ </text>
+ <color_swatch
+ can_apply_immediately="true"
+ follows="left|top"
+ height="37"
+ label_height="0"
+ layout="topleft"
+ left_delta="0"
+ name="WLBlueHorizon"
+ top_pad="6"
+ width="60" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ font="SansSerif"
+ height="16"
+ layout="topleft"
+ left_delta="0"
+ top_pad="20"
+ name="BDensText"
+ width="200">
+ Haze Horizon
+ </text>
+ <slider
+ control_name="WLHazeHorizon"
+ decimal_digits="2"
+ follows="left|top"
+ height="10"
+ increment="0.01"
+ initial_value="0.25"
+ layout="topleft"
+ left_delta="0"
+ top_pad="6"
+ name="WLHazeHorizon"
+ width="200" />
+
+ <!--======== Tab Panel I. II conlumn of controls ========-->
+
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ font="SansSerif"
+ height="16"
+ layout="topleft"
+ left_pad="55"
+ name="BDensText2"
+ top="25"
+ width="200">
+ Blue Density
+ </text>
+ <color_swatch
+ can_apply_immediately="true"
+ follows="left|top"
+ height="37"
+ label_height="0"
+ layout="topleft"
+ left_delta="0"
+ name="WLBlueDensity"
+ top_pad="6"
+ width="60" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ font="SansSerif"
+ height="16"
+ layout="topleft"
+ left_delta="0"
+ name="HDText"
+ top_pad="20"
+ width="200">
+ Haze Density
+ </text>
+ <slider
+ control_name="WLHazeDensity"
+ decimal_digits="2"
+ follows="left|top"
+ height="10"
+ increment="0.01"
+ initial_value="0.7"
+ layout="topleft"
+ left_delta="0"
+ max_val="4"
+ name="WLHazeDensity"
+ top_pad="6"
+ width="200" />
+
+ <!--======== Tab Panel I. III conlumn of controls ========-->
+
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ font="SansSerif"
+ height="16"
+ layout="topleft"
+ left_pad="55"
+ name="DensMultText"
+ top="25"
+ width="200">
+ Density Multiplier
+ </text>
+ <slider
+ control_name="WLDensityMult"
+ decimal_digits="2"
+ follows="left|top"
+ height="10"
+ increment="0.01"
+ initial_value="0.1"
+ layout="topleft"
+ left_delta="15"
+ max_val="0.9"
+ name="WLDensityMult"
+ top_pad="6"
+ width="200" />
+
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ font="SansSerif"
+ height="16"
+ layout="topleft"
+ left_delta="-15"
+ name="WLDistanceMultText"
+ top_pad="20"
+ width="200">
+ Distance Multiplier
+ </text>
+ <slider
+ control_name="WLDistancMult"
+ decimal_digits="1"
+ follows="left|top"
+ height="10"
+ initial_value="1.0"
+ layout="topleft"
+ left_delta="15"
+ max_val="100"
+ name="WLDistanceMult"
+ top_pad="6"
+ width="200" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ font="SansSerif"
+ height="16"
+ layout="topleft"
+ left_delta="-15"
+ name="MaxAltText"
+ top_pad="20"
+ width="200">
+ Max Altitude
+ </text>
+ <slider
+ control_name="WLMaxAltitude"
+ decimal_digits="0"
+ follows="left|top"
+ height="10"
+ increment="1"
+ initial_value="500"
+ layout="topleft"
+ left_delta="15"
+ max_val="4000"
+ name="WLMaxAltitude"
+ top_pad="6"
+ width="200" />
+ </panel>
+ <panel
+ border="true"
+ bevel_style="none"
+ follows="left|top|right|bottom"
+ height="196"
+ label="LIGHTING"
+ layout="topleft"
+ left_delta="0"
+ help_topic="sky_preset_lighting"
+ name="Lighting"
+ top_delta="4"
+ width="698">
+
+ <!--======== Tab Panel II. I conlumn of controls ========-->
+
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ font="SansSerif"
+ height="16"
+ layout="topleft"
+ left="20"
+ name="SLCText"
+ top="25"
+ width="150">
+ Sun/Moon Color
+ </text>
+ <color_swatch
+ can_apply_immediately="true"
+ follows="left|top"
+ height="37"
+ label_height="0"
+ layout="topleft"
+ left_delta="10"
+ name="WLSunlight"
+ top_pad="6"
+ width="60" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ font="SansSerif"
+ height="16"
+ layout="topleft"
+ left_delta="-10"
+ name="WLAmbientText"
+ top_pad="20"
+ width="150">
+ Ambient
+ </text>
+ <color_swatch
+ can_apply_immediately="true"
+ follows="left|top"
+ height="37"
+ label_height="0"
+ layout="topleft"
+ left_delta="10"
+ name="WLAmbient"
+ top_pad="6"
+ width="60" />
+
+ <!--======== Tab Panel II. II conlumn of controls ========-->
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ font="SansSerif"
+ height="16"
+ layout="topleft"
+ left_pad="100"
+ name="SunGlowText"
+ top="25"
+ width="200">
+ Sun Glow
+ </text>
+ <slider
+ control_name="WLGlowB"
+ decimal_digits="2"
+ follows="left|top"
+ height="10"
+ increment="0.01"
+ initial_value="0.1"
+ label="Focus "
+ layout="topleft"
+ left_delta="10"
+ max_val="0.5"
+ name="WLGlowB"
+ top_pad="6"
+ width="200" />
+ <slider
+ control_name="WLGlowR"
+ decimal_digits="2"
+ follows="top|left"
+ height="10"
+ increment="0.01"
+ initial_value="0.25"
+ label="Size "
+ layout="topleft"
+ left_delta="0"
+ max_val="1.99"
+ min_val="1"
+ name="WLGlowR"
+ top_pad="6"
+ width="200" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ font="SansSerif"
+ height="16"
+ layout="topleft"
+ left_delta="-10"
+ name="WLStarText"
+ top_pad="20"
+ width="200">
+ Star Brightness
+ </text>
+ <slider
+ control_name="WLStarAlpha"
+ decimal_digits="2"
+ follows="top|left"
+ height="10"
+ increment="0.01"
+ initial_value="0"
+ layout="topleft"
+ left_delta="10"
+ max_val="2"
+ name="WLStarAlpha"
+ top_pad="6"
+ width="200" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ font="SansSerif"
+ height="16"
+ layout="topleft"
+ left_delta="-10"
+ name="SceneGammaText"
+ top_pad="20"
+ width="200">
+ Scene Gamma
+ </text>
+ <slider
+ control_name="WLGamma"
+ decimal_digits="2"
+ follows="top|left"
+ height="10"
+ increment="0.01"
+ initial_value="2.0"
+ layout="topleft"
+ left_delta="10"
+ max_val="10"
+ name="WLGamma"
+ top_pad="6"
+ width="200" />
+
+ <!--======== Tab Panel II. III conlumn of controls ========-->
+
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ font="SansSerif"
+ height="16"
+ layout="topleft"
+ left_pad="60"
+ name="TODText"
+ top="25"
+ width="200">
+ Sun/Moon Position
+ </text>
+ <multi_slider
+ can_edit_text="true"
+ control_name="WLSunPos"
+ decimal_digits="0"
+ follows="bottom"
+ height="10"
+ increment="0.0833333"
+ initial_value="0"
+ layout="topleft"
+ left_delta="0"
+ max_sliders="1"
+ max_val="24"
+ name="WLSunPos"
+ show_text="false"
+ top_pad="0"
+ width="300" />
+
+ <text
+ type="string"
+ length="1"
+ border_visible="true"
+ follows="left|top|right"
+ font="SansSerif"
+ height="14"
+ layout="topleft"
+ left_delta="2"
+ name="WL12amHash"
+ top_pad="6"
+ width="6">
+ |
+ </text>
+ <text
+ type="string"
+ length="1"
+ border_visible="true"
+ follows="left|top|right"
+ font="SansSerif"
+ height="14"
+ layout="topleft"
+ left_pad="66"
+ name="WL6amHash"
+ top_delta="0"
+ width="6">
+ |
+ </text>
+ <text
+ type="string"
+ length="1"
+ border_visible="true"
+ follows="left|top|right"
+ font="SansSerif"
+ height="14"
+ layout="topleft"
+ left_pad="67"
+ name="WL12pmHash2"
+ top_delta="0"
+ width="6">
+ |
+ </text>
+ <text
+ type="string"
+ length="1"
+ border_visible="true"
+ follows="left|top|right"
+ font="SansSerif"
+ height="14"
+ layout="topleft"
+ left_pad="67"
+ name="WL6pmHash"
+ top_delta="0"
+ width="6">
+ |
+ </text>
+ <text
+ type="string"
+ length="1"
+ border_visible="true"
+ follows="left|top|right"
+ font="SansSerif"
+ height="14"
+ layout="topleft"
+ left_pad="67"
+ name="WL12amHash2"
+ top_delta="0"
+ width="6">
+ |
+ </text>
+
+
+ <text
+ type="string"
+ length="1"
+ border_visible="true"
+ follows="left|top|right"
+ height="16"
+ layout="topleft"
+ left_delta="-300"
+ name="WL12am"
+ top="74"
+ width="55">
+ 12am
+ </text>
+ <text
+ type="string"
+ length="1"
+ border_visible="true"
+ follows="left|top|right"
+ height="16"
+ layout="topleft"
+ left_pad="20"
+ name="WL6am"
+ top_delta="0"
+ width="55">
+ 6am
+ </text>
+ <text
+ type="string"
+ length="1"
+ border_visible="true"
+ follows="left|top|right"
+ height="16"
+ layout="topleft"
+ left_pad="15"
+ name="WL12pmHash"
+ top_delta="0"
+ width="55">
+ 12pm
+ </text>
+ <text
+ type="string"
+ length="1"
+ border_visible="true"
+ follows="left|top|right"
+ height="16"
+ layout="topleft"
+ left_pad="18"
+ name="WL6pm"
+ top_delta="0"
+ width="55">
+ 6pm
+ </text>
+ <text
+ type="string"
+ length="1"
+ border_visible="true"
+ follows="left|top|right"
+ height="16"
+ layout="topleft"
+ left_pad="15"
+ name="WL12am2"
+ top_delta="0"
+ width="55">
+ 12am
+ </text>
+
+ <time
+ follows="left|top"
+ height="16"
+ label_width="0"
+ layout="topleft"
+ left_delta="-175"
+ name="WLDayTime"
+ top_pad="15"
+ value="6:00 AM"
+ width="75"/>
+
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ font="SansSerif"
+ height="16"
+ layout="topleft"
+ left_delta="-106"
+ name="WLEastAngleText"
+ top_pad="24"
+ width="200">
+ East Angle
+ </text>
+ <slider
+ control_name="WLEastAngle"
+ decimal_digits="2"
+ follows="left|top"
+ height="10"
+ increment="0.01"
+ initial_value="0.0"
+ layout="topleft"
+ left_delta="10"
+ name="WLEastAngle"
+ top_pad="6"
+ width="200" />
+
+ </panel>
+ <panel
+ border="true"
+ bevel_style="none"
+ follows="left|top|right|bottom"
+ height="196"
+ label="CLOUDS"
+ layout="topleft"
+ left_delta="0"
+ mouse_opaque="false"
+ help_topic="sky_preset_clouds"
+ name="Clouds"
+ top_delta="4"
+ width="698">
+
+ <!--======== Tab Panel III. I conlumn of controls ========-->
+
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ font="SansSerif"
+ height="16"
+ layout="topleft"
+ left="40"
+ name="WLCloudColorText"
+ top="25"
+ width="200">
+ Cloud Color
+ </text>
+ <color_swatch
+ can_apply_immediately="true"
+ follows="left|top"
+ height="37"
+ label_height="0"
+ layout="topleft"
+ left_delta="0"
+ name="WLCloudColor"
+ top_pad="6"
+ width="60" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ font="SansSerif"
+ height="16"
+ layout="topleft"
+ left_delta="0"
+ name="WLCloudColorText2"
+ top_pad="20"
+ width="200">
+ Cloud XY/Density
+ </text>
+ <slider
+ control_name="WLCloudX"
+ decimal_digits="2"
+ follows="left|top"
+ height="10"
+ increment="0.01"
+ initial_value="0.5"
+ label="X"
+ layout="topleft"
+ left_delta="0"
+ top_pad="6"
+ name="WLCloudX"
+ width="200" />
+ <slider
+ control_name="WLCloudY"
+ decimal_digits="2"
+ follows="left|top"
+ height="10"
+ increment="0.01"
+ initial_value="0.5"
+ label="Y"
+ layout="topleft"
+ left_delta="0"
+ top_pad="6"
+ name="WLCloudY"
+ width="200" />
+ <slider
+ control_name="WLCloudDensity"
+ decimal_digits="2"
+ follows="left|top"
+ height="10"
+ increment="0.01"
+ initial_value="1.0"
+ label="D"
+ layout="topleft"
+ left_delta="0"
+ name="WLCloudDensity"
+ top_pad="6"
+ width="200" />
+
+ <!--======== Tab Panel III. II conlumn of controls ========-->
+
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ font="SansSerif"
+ height="16"
+ layout="topleft"
+ left_pad="55"
+ name="WLCloudCoverageText"
+ top="15"
+ width="200">
+ Cloud Coverage
+ </text>
+ <slider
+ control_name="WLCloudCoverage"
+ decimal_digits="2"
+ follows="left|top"
+ height="10"
+ increment="0.01"
+ initial_value="0.5"
+ layout="topleft"
+ left_delta="15"
+ name="WLCloudCoverage"
+ top_pad="6"
+ width="200" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ font="SansSerif"
+ height="16"
+ layout="topleft"
+ left_delta="-15"
+ name="WLCloudScaleText"
+ top_pad="20"
+ width="200">
+ Cloud Scale
+ </text>
+ <slider
+ control_name="WLCloudScale"
+ decimal_digits="2"
+ follows="left|top"
+ height="10"
+ increment="0.01"
+ initial_value="1.0"
+ layout="topleft"
+ left_delta="15"
+ min_val="0.01"
+ name="WLCloudScale"
+ top_pad="6"
+ width="200" />
+
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ font="SansSerif"
+ height="16"
+ layout="topleft"
+ left_delta="-13"
+ name="WLCloudDetailText"
+ top_pad="20"
+ width="200">
+ Cloud Detail (XY/Density)
+ </text>
+ <slider
+ control_name="WLCloudDetailX"
+ decimal_digits="2"
+ follows="left|top"
+ height="10"
+ increment="0.01"
+ initial_value="0.5"
+ label="X"
+ layout="topleft"
+ left_delta="0"
+ top_pad="6"
+ name="WLCloudDetailX"
+ width="200" />
+ <slider
+ control_name="WLCloudDetailY"
+ decimal_digits="2"
+ follows="left|top"
+ height="10"
+ increment="0.01"
+ initial_value="0.5"
+ label="Y"
+ layout="topleft"
+ left_delta="0"
+ name="WLCloudDetailY"
+ top_pad="6"
+ width="200" />
+ <slider
+ control_name="WLCloudDetailDensity"
+ decimal_digits="2"
+ follows="left|top"
+ height="10"
+ increment="0.01"
+ initial_value="1.0"
+ label="D"
+ layout="topleft"
+ left_delta="0"
+ name="WLCloudDetailDensity"
+ top_pad="6"
+ width="200" />
+
+ <!--======== Tab Panel III. III conlumn of controls ========-->
+
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ font="SansSerif"
+ height="16"
+ layout="topleft"
+ left_pad="55"
+ name="WLCloudScrollXText"
+ top="15"
+ width="150">
+ Cloud Scroll X
+ </text>
+ <check_box
+ control_name="WLCloudLockX"
+ follows="left|top"
+ height="16"
+ label="Lock"
+ layout="topleft"
+ left_delta="150"
+ name="WLCloudLockX"
+ top_delta="0"
+ width="200" />
+ <slider
+ control_name="WLCloudScrollX"
+ decimal_digits="2"
+ follows="left|top"
+ height="10"
+ increment="0.01"
+ initial_value="0.5"
+ layout="topleft"
+ left_delta="-135"
+ max_val="10"
+ min_val="-10"
+ name="WLCloudScrollX"
+ top_pad="6"
+ width="200" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ font="SansSerif"
+ height="16"
+ layout="topleft"
+ left_delta="-15"
+ name="WLCloudScrollYText"
+ top_pad="20"
+ width="150">
+ Cloud Scroll Y
+ </text>
+ <check_box
+ control_name="WLCloudLockY"
+ follows="left|top"
+ height="16"
+ label="Lock"
+ layout="topleft"
+ left_delta="150"
+ name="WLCloudLockY"
+ width="200" />
+ <slider
+ control_name="WLCloudScrollY"
+ decimal_digits="2"
+ follows="left|top"
+ height="10"
+ increment="0.01"
+ initial_value="0.5"
+ layout="topleft"
+ left_delta="-135"
+ max_val="10"
+ min_val="-10"
+ name="WLCloudScrollY"
+ top_pad="6"
+ width="200" />
+ </panel>
+ </tab_container>
+<!--======== End of Controls panel ========-->
+
+ <check_box
+ follows="top|left"
+ height="10"
+ label="Make this preset my new sky setting"
+ layout="topleft"
+ left="380"
+ name="make_default_cb"
+ top_pad="30"
+ width="280"/>
+ <button
+ follows="bottom|right"
+ height="23"
+ label="Save"
+ layout="topleft"
+ left_pad="0"
+ name="save"
+ width="70"/>
+ <button
+ follows="bottom|right"
+ height="23"
+ label="Cancel"
+ layout="topleft"
+ left_pad="15"
+ name="cancel"
+ width="70"/>
+ </floater>
diff --git a/indra/newview/skins/default/xui/en/floater_edit_water_preset.xml b/indra/newview/skins/default/xui/en/floater_edit_water_preset.xml
new file mode 100644
index 0000000000..905983e7fa
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_edit_water_preset.xml
@@ -0,0 +1,448 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ legacy_header_height="18"
+ height="375"
+ layout="topleft"
+ name="Edit Water Preset"
+ help_topic="water_preset"
+ save_rect="true"
+ title="Edit Water Preset"
+ width="725">
+
+ <string name="title_new">Create a New Water Preset</string>
+ <string name="title_edit">Edit a Water Preset</string>
+ <string name="hint_new">Name your preset, adjust the controls to create it, and click "Save".</string>
+ <string name="hint_edit">To edit your water preset, adjust the controls and click "Save".</string>
+ <string name="combo_label">-Select a preset-</string>
+
+ <text
+ follows="top|left|right"
+ height="10"
+ layout="topleft"
+ left="30"
+ name="hint"
+ top="25"
+ width="680">
+ To edit your preset, adjust the controls then click "Save"
+ </text>
+
+ <text
+ follows="top|left|right"
+ font="SansSerif"
+ height="10"
+ layout="topleft"
+ left="30"
+ name="label"
+ top_pad="25"
+ width="120">
+ Preset Name:
+ </text>
+
+ <combo_box
+ allow_text_entry="true"
+ follows="top|left"
+ layout="topleft"
+ left_pad="10"
+ max_chars="100"
+ name="water_preset_combo"
+ top_delta="-5"
+ width="200"/>
+
+ <line_editor
+ height="20"
+ left_delta="0"
+ name="water_preset_name"
+ top_delta="0"
+ width="200" />
+
+ <text
+ follows="top|left|right"
+ height="40"
+ layout="topleft"
+ left_pad="10"
+ name="note"
+ top_delta="0"
+ width="340"
+ wrap="true">
+ Note: if you change the name of your preset, you will be creating a new preset and the existing preset will not be changed.
+ </text>
+
+ <!--======== Controls panel ========-->
+ <panel
+ border="false"
+ bevel_style="none"
+ follows="top|left"
+ height="230"
+ layout="topleft"
+ left="10"
+ name="panel_water_preset"
+ top="100"
+ width="700">
+
+<!--======== I conlumn of controls ========-->
+ <text
+ follows="left|top|right"
+ height="10"
+ font="SansSerif"
+ layout="topleft"
+ left="10"
+ name="water_color_label"
+ top="5"
+ width="215">
+ Water Fog Color
+ </text>
+ <color_swatch
+ can_apply_immediately="true"
+ follows="left|top"
+ height="37"
+ label_height="0"
+ layout="topleft"
+ left_delta="15"
+ name="WaterFogColor"
+ top_pad="8"
+ width="60" />
+
+
+ <text
+ follows="left|top|right"
+ font="SansSerif"
+ layout="topleft"
+ left_delta="-15"
+ top_pad="10"
+ name="water_fog_density_label"
+ width="215">
+ Fog Density Exponent
+ </text>
+ <slider
+ decimal_digits="1"
+ follows="left|top"
+ height="10"
+ initial_value="0"
+ layout="topleft"
+ left_delta="15"
+ max_val="10"
+ name="WaterFogDensity"
+ top_pad="10"
+ width="200"/>
+
+
+ <text
+ follows="left|top|right"
+ font="SansSerif"
+ layout="topleft"
+ left_delta="-15"
+ top_pad="15"
+ name="underwater_fog_modifier_label"
+ width="215">
+ Underwater Fog Modifier
+ </text>
+ <slider
+ decimal_digits="1"
+ follows="left|top"
+ height="10"
+ initial_value="0"
+ layout="topleft"
+ left_delta="15"
+ max_val="10"
+ name="WaterUnderWaterFogMod"
+ top_pad="10"
+ width="200"/>
+
+
+ <text
+ follows="left|top|right"
+ font="SansSerif"
+ layout="topleft"
+ left_delta="-15"
+ name="BHText"
+ top_pad="15"
+ width="215">
+ Big Wave Direction
+ </text>
+ <slider
+ control_name="WaterWave1DirX"
+ decimal_digits="2"
+ follows="left|top"
+ increment="0.01"
+ initial_value="0.7"
+ label="X"
+ layout="topleft"
+ max_val="4"
+ min_val="-4"
+ name="WaterWave1DirX"
+ top_pad="10"
+ width="216"/>
+ <slider
+ control_name="WaterWave1DirY"
+ decimal_digits="2"
+ follows="left|top"
+ increment="0.01"
+ initial_value="0.7"
+ label="Y"
+ layout="topleft"
+ max_val="4"
+ min_val="-4"
+ name="WaterWave1DirY"
+ top_pad="5"
+ width="216"/>
+
+<!--======== II conlumn of controls ========-->
+
+ <text
+ follows="left|top|right"
+ font="SansSerif"
+ height="10"
+ layout="topleft"
+ left_pad="20"
+ name="BDensText"
+ top="5"
+ width="215">
+ Reflection Wavelet Scale
+ </text>
+ <slider
+ control_name="WaterNormalScaleX"
+ decimal_digits="1"
+ follows="left|top"
+ initial_value="0.7"
+ layout="topleft"
+ left_delta="15"
+ max_val="10"
+ name="WaterNormalScaleX"
+ top_pad="10"
+ width="200"/>
+ <slider
+ control_name="WaterNormalScaleY"
+ decimal_digits="1"
+ follows="left|top"
+ initial_value="0.7"
+ layout="topleft"
+ max_val="10"
+ name="WaterNormalScaleY"
+ top_pad="6"
+ width="200"/>
+ <slider
+ control_name="WaterNormalScaleZ"
+ decimal_digits="1"
+ follows="left|top"
+ initial_value="0.7"
+ layout="topleft"
+ max_val="10"
+ name="WaterNormalScaleZ"
+ top_pad="6"
+ width="200"/>
+
+
+ <text
+ follows="left|top|right"
+ font="SansSerif"
+ layout="topleft"
+ left_delta="-15"
+ name="HDText"
+ top_pad="16"
+ width="215">
+ Fresnel Scale
+ </text>
+ <slider
+ control_name="WaterFresnelScale"
+ decimal_digits="2"
+ follows="left|top"
+ height="10"
+ increment="0.01"
+ initial_value="0.7"
+ layout="topleft"
+ left_delta="15"
+ name="WaterFresnelScale"
+ top_pad="10"
+ width="200"/>
+ <text
+ follows="left|top|right"
+ font="SansSerif"
+ layout="topleft"
+ left_delta="-15"
+ name="FresnelOffsetText"
+ top_pad="15"
+ width="215">
+ Fresnel Offset
+ </text>
+ <slider
+ control_name="WaterFresnelOffset"
+ decimal_digits="2"
+ follows="left"
+ increment="0.01"
+ initial_value="0.7"
+ layout="topleft"
+ left_delta="15"
+ name="WaterFresnelOffset"
+ top_pad="10"
+ width="200"/>
+
+
+ <text
+ follows="left|top|right"
+ font="SansSerif"
+ layout="topleft"
+ left_delta="-15"
+ name="BHText2"
+ top_pad="15"
+ width="215">
+ Little Wave Direction
+ </text>
+ <slider
+ control_name="WaterWave2DirX"
+ decimal_digits="2"
+ follows="left|top"
+ increment="0.01"
+ initial_value="0.7"
+ label="X"
+ layout="topleft"
+ max_val="4"
+ min_val="-4"
+ name="WaterWave2DirX"
+ top_pad="10"
+ width="216" />
+ <slider
+ control_name="WaterWave2DirY"
+ decimal_digits="2"
+ follows="left|top"
+ increment="0.01"
+ initial_value="0.7"
+ label="Y"
+ layout="topleft"
+ max_val="4"
+ min_val="-4"
+ name="WaterWave2DirY"
+ top_pad="6"
+ width="216" />
+
+<!--======== III conlumn of contorls ========-->
+
+ <text
+ follows="left|top|right"
+ font="SansSerif"
+ height="16"
+ layout="topleft"
+ left_pad="20"
+ name="DensMultText"
+ top="5"
+ width="215">
+ Refract Scale Above
+ </text>
+ <slider
+ control_name="WaterScaleAbove"
+ decimal_digits="2"
+ follows="left|top"
+ increment="0.01"
+ initial_value="0.1"
+ layout="topleft"
+ left_delta="15"
+ name="WaterScaleAbove"
+ top_pad="5"
+ width="200" />
+
+ <text
+ type="string"
+ length="1"
+ follows="left|top|right"
+ font="SansSerif"
+ height="16"
+ layout="topleft"
+ left_delta="-15"
+ name="WaterScaleBelowText"
+ top_pad="15"
+ width="215">
+ Refract Scale Below
+ </text>
+ <slider
+ control_name="WaterScaleBelow"
+ decimal_digits="2"
+ follows="left|top"
+ height="10"
+ increment="0.01"
+ initial_value="0"
+ layout="topleft"
+ left_delta="15"
+ name="WaterScaleBelow"
+ top_pad="5"
+ width="200"/>
+
+ <text
+ follows="left|top|right"
+ font="SansSerif"
+ height="16"
+ layout="topleft"
+ left_delta="-15"
+ name="MaxAltText"
+ top_pad="15"
+ width="215">
+ Blur Multiplier
+ </text>
+ <slider
+ control_name="WaterBlurMult"
+ follows="left|top"
+ height="10"
+ increment="0.001"
+ initial_value="0"
+ layout="topleft"
+ left_delta="15"
+ max_val="0.16"
+ name="WaterBlurMult"
+ top_pad="5"
+ width="200"/>
+
+ <text
+ follows="left|top|right"
+ font="SansSerif"
+ height="16"
+ layout="topleft"
+ left_delta="-15"
+ name="BHText3"
+ top_pad="15"
+ width="215">
+ Normal Map
+ </text>
+ <texture_picker
+ height="80"
+ layout="topleft"
+ left_delta="15"
+ name="WaterNormalMap"
+ top_pad="5"
+ width="100" />
+ </panel>
+<!--======== End of Controls panel ========-->
+
+ <view_border
+ bevel_style="none"
+ follows="top|left"
+ height="0"
+ layout="topleft"
+ left="10"
+ name="horiz_separator"
+ top_pad="5"
+ width="700"/>
+ <check_box
+ follows="top|left"
+ height="10"
+ label="Make this preset my new water setting"
+ layout="topleft"
+ left="275"
+ name="make_default_cb"
+ top_pad="20"
+ width="280"/>
+ <button
+ follows="bottom|right"
+ height="23"
+ label="Save"
+ layout="topleft"
+ left_pad="0"
+ name="save"
+ width="70"/>
+ <button
+ follows="bottom|right"
+ height="23"
+ label="Cancel"
+ layout="topleft"
+ left_pad="15"
+ name="cancel"
+ width="70"/>
+
+ </floater>
diff --git a/indra/newview/skins/default/xui/en/floater_env_settings.xml b/indra/newview/skins/default/xui/en/floater_env_settings.xml
deleted file mode 100644
index 8df5e232d9..0000000000
--- a/indra/newview/skins/default/xui/en/floater_env_settings.xml
+++ /dev/null
@@ -1,164 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater
- legacy_header_height="18"
- height="150"
- layout="topleft"
- name="Environment Editor Floater"
- help_topic="environment_editor_floater"
- save_rect="true"
- title="ENVIRONMENT EDITOR"
- width="600">
- <floater.string
- name="timeStr">
- [hour12,datetime,utc]:[min,datetime,utc] [ampm,datetime,utc]
- </floater.string>
- <text
- type="string"
- length="1"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left="10"
- name="EnvTimeText"
- top="32"
- width="140">
- Time of Day
- </text>
- <text
- type="string"
- length="1"
- follows="left|top|right"
- height="16"
- layout="topleft"
- left="15"
- name="EnvTimeText2"
- top="62"
- width="140">
- 12:00 PM
- </text>
- <icon
- height="25"
- image_name="icon_diurnal.tga"
- layout="topleft"
- left="85"
- name="EnvDayCycle"
- top="30"
- use_draw_context_alpha="false"
- width="200" />
- <slider
- control_name="EnvTimeSlider"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.0069444"
- initial_value="0.7"
- layout="topleft"
- left_delta="0"
- max_val="0.99"
- name="EnvTimeSlider"
- show_text="false"
- top_pad="10"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left="10"
- name="EnvCloudText"
- top="86"
- width="140">
- Cloud Cover
- </text>
- <slider
- control_name="EnvCloudSlider"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.7"
- layout="topleft"
- left_delta="75"
- name="EnvCloudSlider"
- top_delta="4"
- width="210" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left="310"
- name="EnvWaterColorText"
- top="39"
- width="140">
- Water Color
- </text>
- <color_swatch
- can_apply_immediately="true"
- color="0.5 0.5 0.5 1"
- follows="left|top"
- height="50"
- layout="topleft"
- left="390"
- name="EnvWaterColor"
- tool_tip="Click to open color picker"
- top="30"
- width="40" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left="310"
- name="EnvWaterFogText"
- top="86"
- width="140">
- Water Fog
- </text>
- <slider
- control_name="EnvWaterFogSlider"
- decimal_digits="2"
- follows="left"
- height="10"
- initial_value="0"
- layout="topleft"
- left_delta="75"
- max_val="10"
- name="EnvWaterFogSlider"
- top_delta="4"
- width="210" />
- <button
- follows="left|top"
- height="23"
- label="Use Estate Time"
- layout="topleft"
- left="10"
- name="EnvUseEstateTimeButton"
- top="120"
- width="137" />
- <button
- follows="left|top"
- height="23"
- label="Advanced Sky"
- layout="topleft"
- left_pad="3"
- name="EnvAdvancedSkyButton"
- top_delta="0"
- width="137" />
- <button
- follows="left|top"
- height="23"
- label="Advanced Water"
- layout="topleft"
- left_pad="3"
- name="EnvAdvancedWaterButton"
- top_delta="0"
- width="137" />
-</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_environment_settings.xml b/indra/newview/skins/default/xui/en/floater_environment_settings.xml
new file mode 100644
index 0000000000..1b1cafaca6
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_environment_settings.xml
@@ -0,0 +1,162 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ legacy_header_height="18"
+ height="328"
+ layout="topleft"
+ name="Environment Editor Floater"
+ help_topic="environment_editor_floater"
+ save_rect="true"
+ title="ENVIRONMENT SETTINGS"
+ width="540">
+
+ <text
+ follows="top|left|right"
+ height="15"
+ layout="topleft"
+ left="20"
+ name="note"
+ top="25"
+ width="510"
+ wrap="true">
+ Use the options below to customize the environment settings for your viewer.
+ </text>
+
+ <view_border
+ bevel_style="none"
+ follows="top|left"
+ height="237"
+ layout="topleft"
+ left="20"
+ name="border"
+ top_pad="8"
+ width="500"/>
+ <radio_group
+ follows="top|left"
+ height="45"
+ layout="topleft"
+ left_delta="10"
+ name="region_settings_radio_group"
+ top_delta="20"
+ width="200">
+ <radio_item
+ label="Use region settings"
+ layout="topleft"
+ name="use_region_settings"/>
+ <radio_item
+ label="Customize my environment"
+ layout="topleft"
+ name="use_my_settings"
+ top_pad="20"/>
+ </radio_group>
+
+ <panel
+ height="170"
+ layout="topleft"
+ left="50"
+ name="user_environment_settings"
+ top_pad="0"
+ width="470">
+
+ <text
+ follows="top|left|right"
+ font="SansSerifItalic"
+ height="15"
+ layout="topleft"
+ left_delta="0"
+ name="note"
+ top_pad="0"
+ width="470"
+ wrap="true">
+ Note: your custom settings will not be visible to other users.
+ </text>
+
+ <!-- Water Setting -->
+ <text
+ name="water_settings_title"
+ follows="top|left"
+ height="16"
+ layout="topleft"
+ left="50"
+ top="40"
+ width="200">
+ Water Setting
+ </text>
+ <combo_box
+ follows="top|left"
+ left_pad="2"
+ name="water_settings_preset_combo"
+ top_delta="-5"
+ width="200">
+ <combo_box.item
+ label="-Select a preset-"
+ name="item0"/>
+ </combo_box>
+
+
+ <!-- Sky/Day Cycle Settings -->
+ <text
+ name="sky_dayc_settings_title"
+ follows="top|left"
+ height="16"
+ layout="topleft"
+ left="50"
+ top_pad="20"
+ width="100">
+ Sky / Day Cycle
+ </text>
+ <radio_group
+ layout="topleft"
+ left_delta="50"
+ name="sky_dayc_settings_radio_group"
+ top_pad="10"
+ height="50"
+ width="150">
+ <radio_item
+ layout="topleft"
+ label="Fixed sky"
+ name="my_sky_settings"/>
+ <radio_item
+ layout="topleft"
+ label="Day cycle"
+ name="my_dayc_settings"
+ top_pad="25"/>
+ </radio_group>
+ <combo_box
+ follows="top|left"
+ left_pad="2"
+ name="sky_settings_preset_combo"
+ top_delta="-7"
+ width="200">
+ <combo_box.item
+ label="-Select a preset-"
+ name="item0"/>
+ </combo_box>
+ <combo_box
+ follows="top|left"
+ name="dayc_settings_preset_combo"
+ top_delta="36"
+ width="200">
+ <combo_box.item
+ label="-Select a preset-"
+ name="item0"/>
+ </combo_box>
+ </panel>
+
+ <button
+ follows="left|top"
+ height="23"
+ label="OK"
+ layout="topleft"
+ right="-130"
+ name="ok_btn"
+ top_pad="10"
+ 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_hardware_settings.xml b/indra/newview/skins/default/xui/en/floater_hardware_settings.xml
index a97c697b24..05f4c52b95 100644
--- a/indra/newview/skins/default/xui/en/floater_hardware_settings.xml
+++ b/indra/newview/skins/default/xui/en/floater_hardware_settings.xml
@@ -80,7 +80,7 @@
left_pad="10"
name="antialiasing restart"
top_delta="0"
- width="188">
+ width="230">
(requires viewer restart)
</text>
<spinner
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 02e50ee584..de6d586f72 100644
--- a/indra/newview/skins/default/xui/en/floater_help_browser.xml
+++ b/indra/newview/skins/default/xui/en/floater_help_browser.xml
@@ -2,6 +2,8 @@
<floater
legacy_header_height="18"
can_resize="true"
+ left="10000"
+ bottom="10000"
height="600"
layout="topleft"
min_height="150"
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 43729d7c9f..5a1f920398 100644
--- a/indra/newview/skins/default/xui/en/floater_media_browser.xml
+++ b/indra/newview/skins/default/xui/en/floater_media_browser.xml
@@ -5,7 +5,7 @@
height="440"
layout="topleft"
min_height="140"
- min_width="467"
+ min_width="0"
name="floater_about"
help_topic="floater_about"
save_rect="true"
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 374eeeb0de..1d4a1d4827 100644
--- a/indra/newview/skins/default/xui/en/floater_model_preview.xml
+++ b/indra/newview/skins/default/xui/en/floater_model_preview.xml
@@ -1,12 +1,15 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater can_close="true" can_drag_on_left="false" can_minimize="false"
can_resize="true" height="550" min_height="550" min_width="620"
- name="Model Preview" title="Upload Model" width="620">
+ name="Model Preview" title="Upload Model" width="620"
+ help_topic="upload_model" >
<string name="status_idle">Idle</string>
+ <string name="status_parse_error">Dae parsing issue - see log for details.</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>
+ <string name="bad_element">Error: element is invalid</string>
<string name="high">High</string>
<string name="medium">Medium</string>
<string name="low">Low</string>
@@ -21,12 +24,13 @@
<string name="layer_all">All</string> <!-- Text to display in physics layer combo box for "all layers" -->
<string name="decomposing">Analyzing...</string>
<string name="simplifying">Simplifying...</string>
+ <string name="tbd">TBD</string>
<text left="15" bottom="25" follows="top|left" height="15" name="name_label">
Name:
</text>
- <line_editor bottom_delta="20" follows="top|left|right" height="19"
+ <line_editor bottom_delta="20" follows="top|left|right" height="19" max_length_bytes="64"
name="description_form" prevalidate_callback="ascii" width="290" />
<text bottom_delta="20" left="15" follows="left|top" height="15" name="lod_label">
@@ -68,29 +72,89 @@
width="290"
height="290"
follows="all"/>
-
- <text bottom_delta="25" left="25" width="100" follows="bottom|left">Upload Details</text>
- <panel top_pad="5" border="true" left="15" width="290" height="70" follows="bottom|left"
- bevel_style="none" bg_alpha_color="0 0 0 0" bg_opaque_color="0 0 0 0.3">
- <text left="25" follows="bottom|left" width="140" height="15" name="streaming cost">
- Resource Cost: [COST]
- </text>
- <text left="25" top_pad="5" width="140" follows="bottom|left" height="15" name="physics cost">
- Physics Cost: [COST]
+
+ <text
+ font="SansSerif"
+ bottom_delta="15"
+ left_delta="0"
+ name="warning_title"
+ text_color="Yellow"
+ visible="false">
+ WARNING:
</text>
- <text left="25" top_pad="5" follows="bottom|left" height="15" name="upload fee">
- Upload Fee: N/A
- </text>
- </panel>
+ <text
+ text_color="White"
+ height="40"
+ width="290"
+ top_delta="15"
+ left_delta="0"
+ name="warning_message"
+ parse_urls="true"
+ wrap="true"
+ visible="false">
+ You will not be able to complete the final upload of this model to the Second Life servers. [[VURL] Find out how] to get enabled for mesh model uploads.</text>
+
+ <text
+ height="65"
+ top_delta="45"
+ left_delta="0"
+ name="weights_text"
+ width="80"
+ word_wrap="true"
+ >
+Download:
+Physics:
+Server:
+
+Prim equivs:
+ </text>
- <text left="10" bottom="540" width="290" height="15" follows="bottom|left|right" name="status">[STATUS]</text>
+ <text
+ height="65"
+ top_delta="0"
+ left_delta="80"
+ name="weights"
+ width="70"
+ word_wrap="true"
+ >
+[ST]
+[PH]
+[SIM]
+
+[EQ]
+ </text>
-
- <button bottom="540" left="300" follows="bottom|right" height="20" label="Defaults"
- width="80" name="reset_btn" tool_tip="Reset to defaults"/>
- <button bottom="540" left="430" follows="bottom|right" height="20" label="Upload"
- width="80" name="ok_btn" tool_tip="Upload to simulator"/>
- <button left_pad="10" follows="right|bottom" height="20" width="80" label="Cancel" name="cancel_btn"/>
+<!--
+ <text
+ height="65"
+ top_delta="0"
+ left_delta="70"
+ name="price_breakdown_text"
+ width="80"
+ word_wrap="true"
+ >
+Streaming:
+Physics:
+Instances:
+Textures:
+Model:
+ </text>
+
+ <text
+ height="65"
+ top_delta="0"
+ left_delta="80"
+ name="price_breakdown"
+ width="65"
+ word_wrap="true"
+ >
+L$ [STREAMING]
+L$ [PHYSICS]
+L$ [INSTANCES]
+L$ [TEXTURES]
+L$ [MODEL]
+ </text>
+ -->
<tab_container
follows="right|top|bottom"
@@ -106,7 +170,8 @@
<panel
border="true"
label="Level of Detail"
- name="lod_panel">
+ name="lod_panel"
+ help_topic="upload_model_lod">
<text left="10" width="240" bottom="20" height="15" follows="left|top" name="lod_table_header">
Select Level of Detail:
@@ -229,7 +294,8 @@
<panel
border="true"
label="Physics"
- name="physics_panel">
+ name="physics_panel"
+ help_topic="upload_model_physics">
<!-- PHYSICS GEOMETRY-->
<panel
@@ -370,7 +436,9 @@
<panel
border="true"
label="Modifiers"
- name="modifiers_panel">
+ name="modifiers_panel"
+ help_topic="upload_model_modifiers">
+
<text left="10" width="90" bottom="30" follows="top|left" height="15">
Scale:
</text>
@@ -400,6 +468,26 @@
</panel>
</tab_container>
+
+ <text
+ height="16"
+ left_delta="5"
+ bottom_delta="30"
+ name="upload_fee"
+ width="300"
+ follows="bottom|right"
+ word_wrap="true"
+ >
+ Upload fee: L$ [FEE]
+ </text>
+
+ <button bottom="540" left="10" follows="bottom|left" height="20" label="Set to defaults"
+ width="100" name="reset_btn" tool_tip="Set to defaults"/>
+ <button left="310" follows="bottom|right" height="20" label="Calculate weights &amp; fee"
+ width="150" name="calculate_btn" tool_tip="Calculate weights &amp; fee" top_delta="0"/>
+ <button bottom="540" left="310" follows="bottom|right" height="20" label="Upload"
+ width="80" name="ok_btn" tool_tip="Upload to simulator" visible="false"/>
+ <button right="-10" follows="right|bottom" height="20" width="80" label="Cancel" name="cancel_btn" top_delta="0"/>
<!--
<button bottom_delta="0" left="10" width="120" name="auto fill" label="Generate LOD" tool_tip="Automatically generate levels of detail"/>
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 92d57b20be..b5a5ff5342 100644
--- a/indra/newview/skins/default/xui/en/floater_model_wizard.xml
+++ b/indra/newview/skins/default/xui/en/floater_model_wizard.xml
@@ -49,24 +49,6 @@
top="32"
left="210"
height="32"
- name="physics2_btn"
- label="3. Physics"
- tab_stop="false"
- enabled="false"
- border="false"
- image_unselected="BreadCrumbBtn_Middle_Off"
- image_selected="BreadCrumbBtn_Middle_Press"
- image_hover_unselected="BreadCrumbBtn_Middle_Over"
- image_disabled="BreadCrumbBtn_Middle_Disabled"
- image_disabled_selected="BreadCrumbBtn_Middle_Disabled"
- width="110">
- <button.commit_callback
- function="Wizard.Physics2"/>
- </button>
- <button
- top="32"
- left="210"
- height="32"
name="physics_btn"
label="3. Physics"
tab_stop="false"
@@ -140,41 +122,50 @@
height="10"
font="SansSerifBig"
layout="topleft">
- Upload Model
+ Choose model file
</text>
</panel>
- <text
- top_pad="14"
- width="460"
- height="20"
- name="description"
- font="SansSerifSmall"
- layout="topleft"
- word_wrap="true"
- left_delta="5">
- This wizard will help you import mesh models to Second Life. First specify a file containing the model you wish to import. Second Life supports COLLADA (.dae) files.
- </text>
<panel
- top_delta="40"
+ top_pad="14"
left="15"
- height="270"
+ height="310"
width="505"
name="content"
bg_opaque_color="DkGray2"
background_visible="true"
background_opaque="true">
+ <text
+ height="32"
+ left="10"
+ name="advanced_users_text"
+ text_color="White"
+ top="15"
+ width="320"
+ word_wrap="true">
+ Advanced users: If you are familiar with 3D content creation tools you may wish to use the Advanced Uploader.
+ </text>
+ <button
+ follows="left|top"
+ height="20"
+ label="Switch to Advanced"
+ layout="topleft"
+ left_delta="0"
+ name="switch_to_advanced"
+ top_pad="5"
+ width="130">
+ </button>
<text
type="string"
length="1"
text_color="White"
follows="left|top"
- top="10"
+ top_pad="30"
height="10"
layout="topleft"
- left_delta="10"
+ left_delta="0"
name="Cache location"
- width="300">
- Filename:
+ width="320">
+ Choose model file to upload
</text>
<line_editor
border_style="line"
@@ -187,7 +178,7 @@
max_length="4096"
name="lod_file"
top_pad="5"
- width="220" />
+ width="230" />
<button
follows="left|top"
height="23"
@@ -200,23 +191,27 @@
width="85">
</button>
<text
- top_delta="-15"
- width="200"
- height="15"
- font="SansSerifSmall"
+ type="string"
+ length="1"
+ text_color="White"
+ follows="left|top"
+ top_pad="5"
+ height="10"
layout="topleft"
- text_color="White"
- left_pad="19">
- Model Preview:
+ left="10"
+ name="Cache location"
+ width="320">
+ Second Life supports COLLADA (.dae) files
</text>
<!-- Placeholder panel for 3D preview render -->
<panel
- left_delta="0"
- top_pad="0"
- name="preview_panel"
+ top="30"
+ right="-10"
+ name="choose_file_preview_panel"
bevel_style="none"
highlight_light_color="0.09 0.09 0.09 1"
border="true"
+ border_style="line"
height="150"
follows="all"
width="150">
@@ -225,7 +220,7 @@
top_pad="10"
width="130"
height="14"
- left="340"
+ left_delta="0"
text_color="White"
word_wrap="true">
Dimensions (meters):
@@ -238,15 +233,7 @@
text_color="White"
name="dimensions"
left_delta="0">
- X: Y: Z:
- </text>
- <text
- top_delta="0"
- width="160"
- height="15"
- name="dimension_dividers"
- left_delta="41">
- | |
+ X Y Z
</text>
<text
top_delta="0"
@@ -266,23 +253,26 @@
height="15"
name="dimension_z"
left="450"/>
- <text
- top="100"
- width="320"
- height="15"
- left="10"
- text_color="White"
- word_wrap="true">
- Note:
- </text>
- <text
- top_pad="0"
- width="320"
- height="40"
- left="10"
- word_wrap="true">
-Advanced users familiar with 3d content creation tools may prefer to use the [secondlife:///app/floater/upload_model Advanced Mesh Import Window] .
- </text>
+ <text
+ height="16"
+ left="10"
+ name="warning_label"
+ text_color="Yellow"
+ top="200"
+ visible="false"
+ width="320">
+ WARNING:
+ </text>
+ <text
+ height="50"
+ left="10"
+ name="warning_text"
+ top_pad="0"
+ visible="false"
+ width="320"
+ word_wrap="true">
+ You will not be able to complete the final step of uploading this model to the Second Life servers. [secondlife:///app/floater/learn_more Find out how] to set up your account for mesh model uploads.
+ </text>
</panel>
</panel>
@@ -291,7 +281,7 @@ Advanced users familiar with 3d content creation tools may prefer to use the [se
height="388"
top_delta="0"
name="optimize_panel"
- visible="false"
+ visible="true"
width="535"
left="0">
<panel
@@ -312,7 +302,7 @@ Advanced users familiar with 3d content creation tools may prefer to use the [se
height="10"
font="SansSerifBig"
layout="topleft">
- Optimize
+ Optimize model
</text>
</panel>
<text
@@ -324,7 +314,7 @@ Advanced users familiar with 3d content creation tools may prefer to use the [se
name="description"
word_wrap="true"
left_delta="5">
- This wizard has optimized your model to improve performance. You may adjust the results of the optimization process bellow or click Next to continue.
+ We have optimized the model for performance. Adjust it further if you wish.
</text>
<panel
top_delta="40"
@@ -411,116 +401,89 @@ Advanced users familiar with 3d content creation tools may prefer to use the [se
bg_opaque_color="DkGray2"
background_visible="true"
background_opaque="true">
- <text top="10" left="10" width="85" text_color="White" follows="left|top" height="15" name="lod_label">
- Model Preview:
- </text>
- <combo_box left_pad="5" top_delta="-5" follows="left|top" list_position="below" height="22"
- name="preview_lod_combo2" width="90" tool_tip="LOD to view in preview render">
- <combo_item name="high">
- High
- </combo_item>
- <combo_item name="medium">
- Medium
- </combo_item>
- <combo_item name="low">
- Low
- </combo_item>
- <combo_item name="lowest">
- Lowest
- </combo_item>
- </combo_box>
- <panel
- left="10"
- top_pad="5"
- name="preview_panel"
- bevel_style="none"
- highlight_light_color="0.09 0.09 0.09 1"
- border_style="line"
- border="true"
- height="185"
- follows="all"
- width="185">
- </panel>
- <text top="45" left="214" text_color="White" font="SansSerifSmallBold" halign="center" width="110" height="30" wrap="true">Higher Performance</text>
- <text top="75" left="204" halign="center" width="130" word_wrap="true" font="SansSerifSmall" height="80">Faster rendering but less detailed; lowers Resource (prim) cost.</text>
- <text top="45" left="378" text_color="White" font="SansSerifSmallBold" halign="center" width="90" height="30" wrap="true">Higher Accuracy</text>
- <text top="75" left="364" halign="center" width="130" word_wrap="true" font="SansSerifSmall" height="80">More detailed model but slower; increases Resource (prim) cost.</text>
+ <text top="69" left="10" text_color="White" font="SansSerifSmallBold" width="120" height="16" wrap="true">Performance</text>
+ <text top="85" left="10" width="120" word_wrap="true" font="SansSerifSmall" height="40">Faster rendering
+Less detail
+Lower prim weight</text>
+ <text top="69" left="184" text_color="White" font="SansSerifSmallBold" width="120" height="16" wrap="true">Accuracy</text>
+ <text top="85" left="184" width="120" word_wrap="true" font="SansSerifSmall" height="40">Slower rendering
+More detail
+Higher prim weight</text>
- <slider
+ <slider
follows="left|top"
height="20"
increment="1"
layout="topleft"
- left="204"
- max_val="3"
- initial_value="2"
+ left="10"
+ max_val="2"
+ initial_value="1"
min_val="0"
name="accuracy_slider"
show_text="false"
top="130"
width="290" />
- <text
+ <text
font="SansSerifSmall"
top_pad="0"
- width="300"
+ width="5"
left_delta="6"
height="4">'
- </text>
-
-
- <icon
- top_pad="14"
- left_delta="0"
- width="280"
- height="2"
- image_name="model_wizard\divider_line.png"/>
-
- <text top_delta="20" width="200" text_color="White" left_delta="50" name="streaming cost" height="20">Resource Cost: [COST]</text>
- <text
- top_pad="15"
- width="130"
- height="14"
- left="10"
- text_color="White"
- word_wrap="true">
- Dimensions (meters):
- </text>
- <text
- top_pad="0"
- width="160"
- height="15"
- font="SansSerifSmallBold"
- text_color="White"
- name="dimensions"
- left_delta="0">
- X: Y: Z:
- </text>
- <text
- top_delta="0"
- width="160"
- height="15"
- name="dimension_dividers"
- left_delta="41">
- | |
+ </text>
+ <text
+ font="SansSerifSmall"
+ top_delta="0"
+ width="5"
+ left_delta="137"
+ height="4">'
+ </text>
+ <text
+ font="SansSerifSmall"
+ top_delta="0"
+ width="5"
+ left_delta="137"
+ height="4">'
+ </text>
+ <button
+ follows="left|top"
+ height="20"
+ label="Recalculate Geometry"
+ layout="topleft"
+ left="80"
+ name="recalculate_geometry_btn"
+ top_pad="15"
+ width="150">
+ </button>
+ <text top="10" right="-10" width="185" text_color="White" follows="left|top" height="15" name="lod_label">
+ Geometry preview
</text>
- <text
- top_delta="0"
- width="160"
- height="15"
- name="dimension_x"
- left_delta="-25"/>
- <text
- top_delta="0"
- width="160"
- height="15"
- name="dimension_y"
- left_delta="46"/>
- <text
- top_delta="0"
- width="160"
- height="15"
- name="dimension_z"
- left_delta="46"/>
+ <panel
+ right="-10"
+ top="32"
+ name="optimize_preview_panel"
+ bevel_style="none"
+ highlight_light_color="0.09 0.09 0.09 1"
+ border_style="line"
+ border="true"
+ height="185"
+ follows="all"
+ width="185">
+ </panel>
+ <combo_box left_delta="75" top_pad="10" follows="left|top" list_position="below" height="22"
+ name="preview_lod_combo" width="110" tool_tip="LOD to view in preview render">
+ <combo_item name="high">
+ High detail
+ </combo_item>
+ <combo_item name="medium">
+ Medium detail
+ </combo_item>
+ <combo_item name="low">
+ Low detail
+ </combo_item>
+ <combo_item name="lowest">
+ Lowest detail
+ </combo_item>
+ </combo_box>
</panel>
</panel>
@@ -549,7 +512,7 @@ Advanced users familiar with 3d content creation tools may prefer to use the [se
font="SansSerifBig"
text_color="White"
layout="topleft">
- Physics
+ Adjust physics
</text>
</panel>
<text
@@ -561,7 +524,7 @@ Advanced users familiar with 3d content creation tools may prefer to use the [se
name="description"
word_wrap="true"
left_delta="5">
- The wizard will create a physical shape, which determines how the object interacts with other objects and avatars. Set the slider to the detail level most appropriate for how your object will be used:
+ 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.
</text>
<panel
top_delta="44"
@@ -572,172 +535,94 @@ Advanced users familiar with 3d content creation tools may prefer to use the [se
bg_opaque_color="DkGray2"
background_visible="true"
background_opaque="true">
- <text top="25" left="30" text_color="White" font="SansSerifSmallBold" width="300" height="4">Performance</text>
- <text top="45" left="10" halign="center" width="130" word_wrap="true" font="SansSerifSmall" height="80">Faster rendering but less detailed; lowers Resource (prim) cost.</text>
- <text top="25" left="390" text_color="White" font="SansSerifSmallBold" width="300" height="4">Accuracy</text>
- <text top="45" left="360" halign="center" width="130" word_wrap="true" font="SansSerifSmall" height="80">More detailed model but slower; increases Resource (prim) cost.</text>
+ <text top="10" left="10" text_color="White" font="SansSerifSmallBold" width="120" halign="right" height="16" wrap="true">Performance</text>
+ <text top="26" left="10" width="120" word_wrap="true" font="SansSerifSmall" halign="right" height="40">Faster rendering
+Less detail
+Lower prim weight</text>
+ <text top="174" left="10" text_color="White" font="SansSerifSmallBold" width="120" halign="right" height="16" wrap="true">Accuracy</text>
+ <text top="190" left="10" width="120" word_wrap="true" font="SansSerifSmall" halign="right" height="40">Slower rendering
+More detail
+Higher prim weight</text>
<slider
follows="left|top"
- height="22"
+ height="190"
increment=".1"
layout="topleft"
- left="20"
+ left="140"
max_val="1"
initial_value="0.5"
min_val="0"
name="physics_slider"
+ orientation="vertical"
show_text="false"
- top="90"
- width="440" />
- <text
- font="SansSerifSmall"
- top_pad="0"
- width="500"
- left_delta="6"
- height="4">' ' ' ' ' ' ' ' ' ' '</text>
- <text top_pad="10" width="110" halign="center" word_wrap="true" left="25" height="40">Recommended for solid objects</text>
- <text top_delta="0" width="110" halign="center" word_wrap="true" left="190" height="40">Recommended for buildings</text>
- <text top_delta="0" width="110" halign="center" word_wrap="true" left="350" height="40">Recommended for vehicles</text>
-
-
- <icon
- top_pad="5"
- left="15"
- width="470"
- height="2"
- image_name="model_wizard\divider_line.png"/>
-
- <text top_delta="30" width="180" text_color="White" left="160" name="streaming cost" height="20">Resource Cost: [COST]</text>
-
- </panel>
- </panel>
-
- <panel
- height="388"
- top_delta="0"
- name="physics2_panel"
- visible="true"
- width="535"
- left="0">
- <panel
- height="22"
- top_pad="15"
- name="header_panel"
- width="505"
- bg_opaque_color="DkGray2"
- background_visible="true"
- background_opaque="true"
- left="15">
- <text
- width="200"
- left="10"
- name="header_text"
- text_color="White"
- top="3"
- height="10"
- font="SansSerifBig"
- layout="topleft">
- Physics
- </text>
- </panel>
- <text
- top_pad="14"
- width="475"
- height="50"
- font="SansSerifSmall"
- layout="topleft"
- name="description"
- word_wrap="true"
- left_delta="5">
- Preview the physics shape below then click Next to continue. To modify the physics shape, click the Back button.
- </text>
- <panel
- top_delta="40"
- left="15"
- height="270"
- width="505"
- name="content"
- bg_opaque_color="DkGray2"
- background_visible="true"
- background_opaque="true">
- <text top="10" left="10" width="85" text_color="White" follows="left|top" height="15" name="lod_label">
- Model Preview:
+ top="25"
+ width="22" />
+ <text top="10" width="120" word_wrap="true" left_pad="10" height="50">Examples:
+Moving objects
+Flying objects
+Vehicles</text>
+ <text top="95" width="120" word_wrap="true" left_delta="0" height="50">Examples:
+Small static objects
+Less detailed objects
+Simple furniture</text>
+ <text top="180" width="120" word_wrap="true" left_delta="0" height="50">Examples:
+Static objects
+Detailed objects
+Buildings</text>
+ <button
+ follows="left|top"
+ height="20"
+ label="Recalculate physics"
+ layout="topleft"
+ left="80"
+ name="recalculate_physics_btn"
+ top_pad="10"
+ width="150">
+ </button>
+ <button
+ enabled="false"
+ follows="left|top"
+ height="20"
+ label="Recalculating..."
+ layout="topleft"
+ left_delta="0"
+ name="recalculating_physics_btn"
+ top_delta="0"
+ visible="false"
+ width="150">
+ </button>
+ <text top="10" right="-10" width="185" text_color="White" follows="left|top" height="15" name="lod_label">
+ Physics preview
</text>
- <combo_box left_pad="5" top_delta="-5" follows="left|top" list_position="below" height="22"
- name="preview_lod_combo3" width="90" tool_tip="LOD to view in preview render">
+ <panel
+ right="-10"
+ top="32"
+ name="physics_preview_panel"
+ bevel_style="none"
+ highlight_light_color="0.09 0.09 0.09 1"
+ border_style="line"
+ border="true"
+ height="185"
+ follows="all"
+ width="185">
+ </panel>
+ <combo_box left_delta="75" top_pad="10" follows="left|top" list_position="below" height="22"
+ name="preview_lod_combo2" width="110" tool_tip="LOD to view in preview render">
<combo_item name="high">
- High
+ High detail
</combo_item>
<combo_item name="medium">
- Medium
+ Medium detail
</combo_item>
<combo_item name="low">
- Low
+ Low detail
</combo_item>
<combo_item name="lowest">
- Lowest
+ Lowest detail
</combo_item>
</combo_box>
- <panel
- left="10"
- top_pad="10"
- name="preview_panel"
- bevel_style="none"
- highlight_light_color="0.09 0.09 0.09 1"
- border_style="line"
- border="true"
- height="190"
- follows="all"
- width="190">
- </panel>
- <text
- top_pad="8"
- width="130"
- height="14"
- left="10"
- text_color="White"
- word_wrap="true">
- Dimensions (meters):
- </text>
- <text
- top_pad="0"
- width="160"
- height="15"
- font="SansSerifSmallBold"
- text_color="White"
- name="dimensions"
- left_delta="0">
- X: Y: Z:
- </text>
- <text
- top_delta="0"
- width="160"
- height="15"
- name="dimension_dividers"
- left_delta="41">
- | |
- </text>
- <text
- top_delta="0"
- width="160"
- height="15"
- name="dimension_x"
- left_delta="-25"/>
- <text
- top_delta="0"
- width="160"
- height="15"
- name="dimension_y"
- left_delta="46"/>
- <text
- top_delta="0"
- width="160"
- height="15"
- name="dimension_z"
- left_delta="46"/>
- <text top="60" width="180" text_color="White" left="225" name="streaming cost" height="20">Resource Cost: [COST]</text>
- </panel>
+ </panel>
</panel>
<panel
@@ -768,162 +653,44 @@ Advanced users familiar with 3d content creation tools may prefer to use the [se
Review
</text>
</panel>
- <text
+ <panel
top_pad="14"
- width="470"
- height="24"
- font="SansSerifSmall"
- layout="topleft"
- name="description"
- word_wrap="true"
- left_delta="5">
- Review the details below then click. Upload to upload your model. Your L$ balance will be charged when you click Upload.
- </text>
- <icon
- top_pad="10"
- left="20"
- width="495"
- height="2"
- image_name="model_wizard\divider_line.png"/>
- <panel
- top_pad="5"
left="15"
- height="270"
+ height="310"
width="505"
- name="content">
- <text top="10" left="10" width="85" text_color="White" follows="left|top" height="15" name="lod_label">
- Model Preview:
- </text>
- <combo_box left_pad="5" top_delta="-5" follows="left|top" list_position="below" height="22"
- name="preview_lod_combo" width="90" tool_tip="LOD to view in preview render">
- <combo_item name="high">
- High
- </combo_item>
- <combo_item name="medium">
- Medium
- </combo_item>
- <combo_item name="low">
- Low
- </combo_item>
- <combo_item name="lowest">
- Lowest
- </combo_item>
- </combo_box>
- <panel
- left="10"
- top_pad="10"
- name="preview_panel"
- bevel_style="none"
- highlight_light_color="0.09 0.09 0.09 1"
- border_style="line"
- border="true"
- height="190"
- follows="all"
- width="190">
- </panel>
- <text
- top_pad="8"
- width="130"
- height="14"
- left="10"
- text_color="White"
- word_wrap="true">
- Dimensions (meters):
- </text>
- <text
- top_pad="0"
- width="160"
- height="15"
- font="SansSerifSmallBold"
- text_color="White"
- name="dimensions"
- left_delta="0">
- X: Y: Z:
- </text>
- <text
- top_delta="0"
- width="160"
- height="15"
- name="dimension_dividers"
- left_delta="41">
- | |
- </text>
- <text
- top_delta="0"
- width="160"
- height="15"
- name="dimension_x"
- left_delta="-25"/>
- <text
- top_delta="0"
- width="160"
- height="15"
- name="dimension_y"
- left_delta="46"/>
- <text
- top_delta="0"
- width="160"
- height="15"
- name="dimension_z"
- left_delta="46"/>
+ name="content"
+ bg_opaque_color="DkGray2"
+ background_visible="true"
+ background_opaque="true">
+ <text
+ top="20"
+ width="485"
+ font="SansSerifMedium"
+ text_color="White"
+ left="10"
+ name="review_prim_equiv"
+ height="16">Impact to parcel/region: [EQUIV] prim equivalents
+ </text>
+ <text
+ top_pad="20"
+ width="485"
+ font="SansSerifMedium"
+ text_color="White"
+ left="10"
+ name="review_fee"
+ height="16">Your account will be charged an upload fee of L$ [FEE].
+ </text>
+ <text
+ top_pad="20"
+ width="485"
+ font="SansSerifMedium"
+ text_color="White"
+ left="10"
+ name="review_confirmation"
+ height="32"
+ word_wrap="true">By clicking the upload button, you confirm that you have the appropriate rights to the material contained in the model.
+ </text>
</panel>
- <text
- width="300"
- height="12"
- top="125"
- name="streaming cost"
- left="230"
- font="SansSerifSmallBold"
- text_color="White">Resource Cost: [COST]</text>
- <text
- width="285"
- height="30"
- top_pad="0"
- left_delta="0"
- word_wrap="true"
- font="SansSerifItalic">This is the cost to your Region's prim/object limit, at default scale</text>
- <text
- width="300"
- height="12"
- name="physics cost"
- top_pad="10"
- left_delta="0"
- font="SansSerifSmallBold"
- text_color="White">Physics Cost: [COST]</text>
- <text
- width="285"
- height="30"
- top_pad="0"
- left_delta="0"
- word_wrap="true"
- font="SansSerifItalic">This is the cost to your Region's prim/object limit, at default scale</text>
- <text
- width="200"
- height="12"
- top_pad="10"
- left_delta="0"
- font="SansSerifSmallBold"
- text_color="White">Upload Fee:</text>
- <text
- width="285"
- height="26"
- top_pad="0"
- left_delta="0"
- word_wrap="true"
- font="SansSerifItalic">This is the amount the upload will cost.</text>
- <check_box
- height="16"
- layout="topleft"
- left_delta="0"
- name="confirm_checkbox"
- top_pad="15"
- width="16" />
- <text
- height="100"
- width="240"
- word_wrap="true"
- left_delta="25"
- top_delta="0">I confirm that I have the appropriate rights to the material contained in this model. [secondlife:///app/floater/learn_more Learn more]</text>
</panel>
@@ -954,46 +721,79 @@ Advanced users familiar with 3d content creation tools may prefer to use the [se
height="10"
font="SansSerifBig"
layout="topleft">
- Upload Complete!
+ Upload complete
</text>
</panel>
<text
top_pad="14"
- width="474"
- height="20"
- font="SansSerifSmall"
+ width="495"
+ height="16"
+ font="SansSerifMedium"
layout="topleft"
- name="description"
+ name="model_uploaded_text"
+ text_color="White"
word_wrap="true"
- left_delta="5">
- Congratulations! Your model has been sucessfully uploaded. You will find the model in the Objects folder in your inventory.
+ left="25">
+ Your model has been uploaded.
+ </text>
+ <text
+ top_pad="5"
+ width="495"
+ height="16"
+ font="SansSerifMedium"
+ layout="topleft"
+ name="inventory_text"
+ text_color="White"
+ word_wrap="true"
+ left="25">
+ You will find it in the Objects folder in your inventory.
+ </text>
+ <text
+ top_pad="20"
+ width="495"
+ font="SansSerifMedium"
+ text_color="White"
+ left="25"
+ name="charged_fee"
+ height="16">Your account has been charged L$ [FEE].
</text>
- <icon
- top_pad="15"
- left_delta="0"
- width="495"
- height="2"
- image_name="model_wizard\divider_line.png"/>
</panel>
<button
top="440"
- right="-245"
+ right="-285"
width="90"
height="22"
name="back"
label="&lt;&lt; Back" />
<button
top_delta="0"
- right="-150"
+ right="-190"
width="90"
height="22"
name="next"
label="Next &gt;&gt; " />
<button
top_delta="0"
+ left_delta="0"
+ width="160"
+ height="22"
+ name="calculate"
+ label="Calculate weights &amp; fee &gt;&gt; " />
+ <button
+ enabled="false"
+ visible="false"
+ top_delta="0"
+ left_delta="0"
+ width="160"
+ height="22"
+ name="calculating"
+ label="Calculating... " />
+ <button
+ enabled="false"
+ top_delta="0"
right="-150"
width="90"
height="22"
@@ -1019,9 +819,11 @@ Advanced users familiar with 3d content creation tools may prefer to use the [se
<spinner visible="false" left="10" height="20" follows="top|left" width="80" top_pad="-50" value="1.0" min_val="0.01" max_val="64.0" name="import_scale"/>
<string name="status_idle">Idle</string>
+ <string name="status_parse_error">Dae parsing issue - see log for details.</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>
+ <string name="status_vertex_number_overflow">Error: Vertex number is more than 65534, aborted!</string>
+ <string name="bad_element">Error: element is invalid</string>
<string name="high">High</string>
<string name="medium">Medium</string>
<string name="low">Low</string>
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 9f6199fada..478ae5f53f 100644
--- a/indra/newview/skins/default/xui/en/floater_preview_gesture.xml
+++ b/indra/newview/skins/default/xui/en/floater_preview_gesture.xml
@@ -50,17 +50,17 @@
name="desc_label"
top_pad="25"
font.style="BOLD"
- width="100">
+ width="105">
Description:
</text>
<line_editor
follows="left|top"
height="20"
layout="topleft"
- left_delta="89"
+ left_delta="94"
name="desc"
top_delta="-4"
- width="175" />
+ width="170" />
<text
type="string"
length="1"
@@ -96,19 +96,19 @@
name="replace_text"
tool_tip="Replace the trigger word(s) with these words. For example, trigger &apos;hello&apos; replace with &apos;howdy&apos; will turn the chat &apos;I wanted to say hello&apos; into &apos;I wanted to say howdy&apos; as well as playing the gesture!"
top_pad="10"
- width="210">
+ width="215">
Replace with:
</text>
<line_editor
follows="left|top"
height="20"
layout="topleft"
- left_delta="99"
+ left_delta="104"
max_length_bytes="31"
name="replace_editor"
tool_tip="Replace the trigger word(s) with these words. For example, trigger &apos;hello&apos; replace with &apos;howdy&apos; will turn the chat &apos;I wanted to say hello&apos; into &apos;I wanted to say howdy&apos; as well as playing the gesture"
top_delta="-4"
- width="165" />
+ width="160" />
<text
type="string"
length="1"
diff --git a/indra/newview/skins/default/xui/en/floater_region_info.xml b/indra/newview/skins/default/xui/en/floater_region_info.xml
index 32fb6f97e7..3b58cd08f6 100644
--- a/indra/newview/skins/default/xui/en/floater_region_info.xml
+++ b/indra/newview/skins/default/xui/en/floater_region_info.xml
@@ -16,5 +16,5 @@
name="region_panels"
right="-1"
tab_position="top"
- top="20" />
+ top="20"/>
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_sell_land.xml b/indra/newview/skins/default/xui/en/floater_sell_land.xml
index 619669d28a..52de9ddd47 100644
--- a/indra/newview/skins/default/xui/en/floater_sell_land.xml
+++ b/indra/newview/skins/default/xui/en/floater_sell_land.xml
@@ -41,14 +41,14 @@
follows="top|left"
left="16"
name="info_parcel_label"
- width="48">
+ width="70">
Parcel:
</text>
<text
top_delta="0"
follows="top|left"
height="16"
- left="56"
+ left="78"
name="info_parcel"
right="-20">
PARCEL NAME
@@ -57,14 +57,14 @@
follows="top|left"
left="16"
name="info_size_label"
- width="48">
+ width="70">
Size:
</text>
<text
follows="top|left"
top_delta="0"
height="32"
- left="56"
+ left="78"
name="info_size"
right="-20">
[AREA] m²
@@ -164,20 +164,21 @@
left_delta="0"
name="sell_to_agent"
top_pad="4"
- width="170" />
+ width="150" />
<button
height="20"
label="Select"
left_pad="5"
name="sell_to_select_agent"
top_delta="0"
- width="60" />
+ width="90" />
<text
follows="top|left"
font="SansSerif"
height="16"
left="30"
- name="sell_objects_label">
+ name="sell_objects_label"
+ width="266">
3. Sell the objects with the land?
</text>
<text
@@ -199,20 +200,20 @@
<radio_item
bottom="40"
height="0"
- left="10"
+ left="2"
name="none"
visible="false" />
<radio_item
top_pad="10"
- height="16"
+ height="18"
label="No, keep ownership of objects"
- left="10"
+ left="2"
name="no" />
<radio_item
top_pad="10"
height="16"
label="Yes, sell objects with land"
- left="10"
+ left="2"
name="yes" />
</radio_group>
<button
@@ -221,7 +222,7 @@
name="show_objects"
left="70"
top_pad="10"
- width="110" />
+ width="140" />
<text
bottom_delta="30"
follows="top|left"
@@ -229,7 +230,7 @@
height="16"
left="16"
name="nag_message_label"
- right="-20">
+ right="-5">
REMEMBER: All sales are final.
</text>
<button
@@ -239,15 +240,15 @@
left_delta="0"
name="sell_btn"
top_pad="10"
- width="130" />
+ width="185" />
<button
follows="bottom|left"
height="20"
label="Cancel"
- left_pad="30"
+ left_pad="5"
name="cancel_btn"
top_delta="0"
- width="90" />
+ width="85" />
</panel>
</scroll_container>
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_snapshot.xml b/indra/newview/skins/default/xui/en/floater_snapshot.xml
index e413228ddc..89a0c4c287 100644
--- a/indra/newview/skins/default/xui/en/floater_snapshot.xml
+++ b/indra/newview/skins/default/xui/en/floater_snapshot.xml
@@ -100,7 +100,7 @@
right="-5"
name="upload_btn"
top_delta="0"
- width="100" />
+ width="110" />
<flyout_button
follows="left|top"
height="23"
@@ -147,7 +147,7 @@
right="-5"
left_pad="5"
name="discard_btn"
- width="100" />
+ width="110" />
<text
type="string"
length="1"
@@ -330,13 +330,13 @@
increment="1"
initial_value="75"
label="Image quality"
- label_width="100"
+ label_width="124"
layout="topleft"
left_delta="0"
max_val="100"
name="image_quality_slider"
top_pad="5"
- width="205" />
+ width="228" />
<text
type="string"
length="1"
diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml
index b99a8b6228..8901583799 100644
--- a/indra/newview/skins/default/xui/en/floater_tools.xml
+++ b/indra/newview/skins/default/xui/en/floater_tools.xml
@@ -47,24 +47,12 @@
Click and drag to select land
</floater.string>
<floater.string
- name="grid_screen_text">
- Screen
+ name="status_selectcount">
+ [OBJ_COUNT] objects ( [PRIM_COUNT] prims[PE_STRING] ) selected
</floater.string>
<floater.string
- name="grid_local_text">
- Local
- </floater.string>
- <floater.string
- name="grid_world_text">
- World
- </floater.string>
- <floater.string
- name="grid_reference_text">
- Reference
- </floater.string>
- <floater.string
- name="grid_attachment_text">
- Attachment
+ name="status_selectprimequiv">
+ , [SEL_WEIGHT] prim equivs
</floater.string>
<button
follows="left|top"
@@ -221,7 +209,7 @@
<radio_group
follows="left|top"
left="5"
- top="59"
+ top="55"
height="70"
layout="topleft"
name="edit_radio_group">
@@ -255,18 +243,18 @@
label="Edit linked"
layout="topleft"
name="checkbox edit linked parts"
- top_pad="-10">
+ top_pad="-18">
<check_box.commit_callback
function="BuildTool.selectComponent"/>
</check_box>
<button
follows="left|top"
- height="23"
+ height="20"
label="Link"
- top_pad="2"
+ top="108"
layout="topleft"
- left="5"
+ left="143"
name="link_btn"
width="50">
<button.commit_callback
@@ -274,27 +262,15 @@
</button>
<button
follows="left|top"
- height="23"
+ height="20"
label="Unlink"
layout="topleft"
left_pad="2"
name="unlink_btn"
- width="50">
+ width="90">
<button.commit_callback
function="BuildTool.UnlinkObjects"/>
</button>
- <text
- text_color="LtGray_50"
- follows="top|left"
- halign="left"
- left_pad="3"
- name="RenderingCost"
- tool_tip="Shows the rendering cost calculated for this object"
- top_delta="11"
- type="string"
- width="100">
- þ: [COUNT]
- </text>
<check_box
control_name="ScaleUniform"
height="19"
@@ -302,7 +278,7 @@
layout="topleft"
left="143"
name="checkbox uniform"
- top="50"
+ top="48"
width="20" />
<text
height="19"
@@ -324,53 +300,29 @@
layout="topleft"
left="143"
name="checkbox stretch textures"
- top_pad="-6"
+ top_pad="-4"
follows="left|top"
width="134" />
<check_box
control_name="SnapEnabled"
height="18"
initial_value="true"
- label="Snap to grid"
+ label="Snap"
layout="topleft"
top_pad="0"
name="checkbox snap to grid"
width="134" />
- <combo_box
- height="23"
- layout="topleft"
- follows="left|top"
- name="combobox grid mode"
- tool_tip="Choose the type of grid ruler for positioning the object"
- top_pad="0"
- width="108">
- <combo_box.item
- label="World grid"
- name="World"
- value="World" />
- <combo_box.item
- label="Local grid"
- name="Local"
- value="Local" />
- <combo_box.item
- label="Reference grid"
- name="Reference"
- value="Reference" />
- <combo_box.commit_callback
- function="BuildTool.gridMode"/>
- </combo_box>
<button
left_pad="0"
- image_selected="ForwardArrow_Press"
- image_unselected="ForwardArrow_Off"
+ label="Options..."
layout="topleft"
follows="top|left"
name="Options..."
tool_tip="See more grid options"
- top_pad="-22"
- right="-10"
- width="18"
- height="23" >
+ top="83"
+ right="-35"
+ width="65"
+ height="21" >
<button.commit_callback
function="BuildTool.gridOptions"/>
</button>
@@ -385,7 +337,7 @@
left="10"
name="ToolCube"
tool_tip="Cube"
- top="51"
+ top="58"
width="20" />
<button
follows="left|top"
@@ -447,10 +399,10 @@
image_selected="Object_Hemi_Cylinder_Selected"
image_unselected="Object_Hemi_Cylinder"
layout="topleft"
- left_delta="29"
+ left="10"
name="ToolHemiCylinder"
tool_tip="Hemicylinder"
- top_delta="0"
+ top="84"
width="20" />
<button
follows="left|top"
@@ -515,7 +467,7 @@
left="10"
name="ToolTorus"
tool_tip="Torus"
- top="77"
+ top="109"
width="20" />
<button
follows="left|top"
@@ -575,9 +527,9 @@
height="19"
label="Keep Tool selected"
layout="topleft"
- left="4"
+ left="155"
name="checkbox sticky"
- top="101"
+ top="55"
width="128" />
<check_box
control_name="CreateToolCopySelection"
@@ -596,7 +548,7 @@
layout="topleft"
left_delta="18"
name="checkbox copy centers"
- top="132"
+ top="85"
width="134" />
<check_box
control_name="CreateToolCopyRotates"
@@ -749,89 +701,49 @@
<button.commit_callback
function="BuildTool.applyToSelection"/>
</button>
+ <text
+ text_color="LtGray_50"
+ type="string"
+ length="1"
+ height="16"
+ follows="left|top"
+ font="SansSerifSmall"
+ layout="topleft"
+ left="10"
+ name="selection_empty"
+ top_pad="0"
+ width="100">
+ Nothing selected.
+ </text>
<text
text_color="LtGray_50"
type="string"
length="1"
- height="10"
+ height="16"
follows="left|top"
- halign="right"
+ font="SansSerifSmall"
layout="topleft"
- right="-10"
- name="obj_count"
- top_pad="5"
- width="143">
- Objects: [COUNT]
+ left="10"
+ name="selection_count"
+ top_delta="0"
+ visible="false"
+ width="280">
</text>
<text
- text_color="LtGray_50"
- type="string"
- length="1"
- height="10"
- follows="left|top"
- halign="right"
- layout="topleft"
- right="-10"
- name="prim_count"
- width="143">
- Prims: [COUNT]
+ text_color="LtGray_50"
+ type="string"
+ length="1"
+ height="16"
+ follows="left|top"
+ font="SansSerifSmall"
+ layout="topleft"
+ left="10"
+ name="selection_weight"
+ top_pad="0"
+ visible="false"
+ width="280">
+ Physics weight [PHYS_WEIGHT], Render Cost [DISP_WEIGHT].
</text>
- <text
- text_color="LtGray_50"
- type="string"
- length="1"
- height="10"
- follows="left|top"
- halign="right"
- layout="topleft"
- right="-120"
- name="linked_set_count"
- top="144"
- width="80">
- L: [COUNT]
- </text>
- <text
- text_color="LtGray_50"
- type="string"
- length="1"
- follows="left|top"
- halign="right"
- layout="topleft"
- top_delta="0"
- right="-100"
- name="object_count"
- width="80">
- O: [COUNT]
- </text>
- <text
- text_color="LtGray_50"
- type="string"
- length="1"
- height="10"
- follows="left|top"
- halign="right"
- layout="topleft"
- top_delta="0"
- right="-8"
- name="linked_set_cost"
- tool_tip="Cost of currently selected linked sets as [prims],[physics complexity]"
- width="80">
- Cost: [COST] / [PHYSICS]
- </text>
- <text
- text_color="LtGray_50"
- type="string"
- length="1"
- follows="left|top"
- halign="right"
- layout="topleft"
- top_pad="5"
- right="-8"
- name="object_cost"
- tool_tip="Cost of currently selected objects as [prims] / [physics complexity]"
- width="80">
- Cost: [COST] / [PHYSICS]
- </text>
<!-- <text -->
<!-- text_color="LtGray_50" -->
<!-- type="string" -->
@@ -858,6 +770,15 @@
<!-- width="143"> -->
<!-- Prims: [COUNT] -->
<!-- </text> -->
+ <view_border
+ bevel_style="none"
+ follows="top|left"
+ height="0"
+ layout="topleft"
+ left="6"
+ name="cost_text_border"
+ top="135"
+ width="282"/>
<tab_container
follows="left|top"
height="410"
@@ -1608,41 +1529,6 @@ even though the user gets a free copy.
name="Sculpted"
value="Sculpted" />
</combo_box>
- <combo_box
- height="19"
- layout="topleft"
- name="material"
- top_pad="5"
- width="150">
- <combo_box.item
- label="Stone"
- name="Stone"
- value="Stone" />
- <combo_box.item
- label="Metal"
- name="Metal"
- value="Metal" />
- <combo_box.item
- label="Glass"
- name="Glass"
- value="Glass" />
- <combo_box.item
- label="Wood"
- name="Wood"
- value="Wood" />
- <combo_box.item
- label="Flesh"
- name="Flesh"
- value="Flesh" />
- <combo_box.item
- label="Plastic"
- name="Plastic"
- value="Plastic" />
- <combo_box.item
- label="Rubber"
- name="Rubber"
- value="Rubber" />
- </combo_box>
<text
type="string"
length="1"
@@ -2133,11 +2019,7 @@ even though the user gets a free copy.
label="Cylinder"
name="Cylinder"
value="Cylinder" />
- <combo_box.item
- label="Mesh"
- name="Mesh"
- value="Mesh" />
- </combo_box>
+ </combo_box>
</panel>
<panel
border="false"
@@ -2426,6 +2308,41 @@ even though the user gets a free copy.
name="Physics Shape Type Combo Ctrl"
tool_tip="Choose the physics shape type"
width="108"/>
+ <combo_box
+ height="19"
+ layout="topleft"
+ name="material"
+ top_pad="5"
+ width="150">
+ <combo_box.item
+ label="Stone"
+ name="Stone"
+ value="Stone" />
+ <combo_box.item
+ label="Metal"
+ name="Metal"
+ value="Metal" />
+ <combo_box.item
+ label="Glass"
+ name="Glass"
+ value="Glass" />
+ <combo_box.item
+ label="Wood"
+ name="Wood"
+ value="Wood" />
+ <combo_box.item
+ label="Flesh"
+ name="Flesh"
+ value="Flesh" />
+ <combo_box.item
+ label="Plastic"
+ name="Plastic"
+ value="Plastic" />
+ <combo_box.item
+ label="Rubber"
+ name="Rubber"
+ value="Rubber" />
+ </combo_box>
<spinner
follows="left|top"
@@ -2441,16 +2358,6 @@ even though the user gets a free copy.
top_pad="10"
width="132" />
- <check_box
- height="19"
- label="Override material"
- layout="topleft"
- left_delta="0"
- name="Physics Material Override"
- tool_tip="Override Material"
- top_pad="10"
- width="132" />
-
<spinner
follows="left|top"
height="19"
@@ -2471,8 +2378,9 @@ even though the user gets a free copy.
height="19"
increment="0.1"
initial_value="0"
- label="Density"
+ label="Density in 100 kg/m^3"
label_width="70"
+ label_wrap="true"
layout="topleft"
left_delta="0"
max_val="22587"
@@ -2493,7 +2401,7 @@ even though the user gets a free copy.
max_val="1"
min_val="0"
name="Physics Restitution"
- top_pad="4"
+ top_pad="8"
width="132" />
</panel>
<panel
diff --git a/indra/newview/skins/default/xui/en/floater_top_objects.xml b/indra/newview/skins/default/xui/en/floater_top_objects.xml
index b06c6dc215..4dfdcd15c7 100644
--- a/indra/newview/skins/default/xui/en/floater_top_objects.xml
+++ b/indra/newview/skins/default/xui/en/floater_top_objects.xml
@@ -105,7 +105,7 @@
left_delta="0"
name="id_text"
top_pad="10"
- width="100">
+ width="107">
Object ID:
</text>
<line_editor
@@ -116,7 +116,7 @@
left_pad="3"
name="id_editor"
top_delta="-3"
- width="575" />
+ width="568" />
<button
follows="bottom|right"
height="23"
@@ -138,7 +138,7 @@
left="10"
top_pad="5"
name="obj_name_text"
- width="100">
+ width="107">
Object name:
</text>
<line_editor
@@ -148,7 +148,7 @@
left_pad="3"
name="object_name_editor"
top_delta="-3"
- width="575" />
+ width="568" />
<button
follows="bottom|right"
height="23"
@@ -170,7 +170,7 @@
left="10"
top_pad="5"
name="owner_name_text"
- width="100">
+ width="107">
Owner:
</text>
<line_editor
@@ -180,7 +180,7 @@
left_pad="3"
name="owner_name_editor"
top_delta="-3"
- width="575" />
+ width="568" />
<button
follows="bottom|right"
height="23"
diff --git a/indra/newview/skins/default/xui/en/floater_water.xml b/indra/newview/skins/default/xui/en/floater_water.xml
deleted file mode 100644
index 3a44ba3763..0000000000
--- a/indra/newview/skins/default/xui/en/floater_water.xml
+++ /dev/null
@@ -1,503 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater
- legacy_header_height="18"
- height="240"
- layout="topleft"
- name="Water Floater"
- help_topic="water_floater"
- save_rect="true"
- title="ADVANCED WATER EDITOR"
- width="700">
- <floater.string
- name="WLDefaultWaterNames">
- Default:Glassy:Pond:Murky:Second Plague:SNAKE!!!:Valdez
- </floater.string>
- <text
- type="string"
- length="1"
- follows="left|top|right"
- height="16"
- layout="topleft"
- left="10"
- name="KeyFramePresetsText"
- top="34"
- font="SansSerif"
- width="85">
- Water Presets:
- </text>
- <combo_box
- height="23"
- layout="topleft"
- left_delta="95"
- name="WaterPresetsCombo"
- top_delta="-4"
- width="150" />
- <button
- height="23"
- label="New"
- label_selected="New"
- layout="topleft"
- left_pad="3"
- name="WaterNewPreset"
- top_delta="0"
- width="70" />
- <button
- height="23"
- label="Save"
- label_selected="Save"
- layout="topleft"
- left_pad="3"
- name="WaterSavePreset"
- top_delta="0"
- width="70" />
- <button
- height="23"
- label="Delete"
- label_selected="Delete"
- layout="topleft"
- left_pad="3"
- name="WaterDeletePreset"
- top_delta="0"
- width="70" />
- <tab_container
- border="false"
- follows="left|top"
- height="180"
- halign="center"
- layout="topleft"
- left="0"
- name="Water Tabs"
- tab_position="top"
- top="60"
- width="700">
- <panel
- border="true"
- follows="all"
- height="180"
- label="SETTINGS"
- layout="topleft"
- left="0"
- mouse_opaque="false"
- help_topic="water_settings_tab"
- name="Settings"
- top="0"
- width="698">
- <text
- type="string"
- length="1"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left="10"
- name="BHText"
- top="4"
- width="200">
- Water Fog Color
- </text>
- <color_swatch
- can_apply_immediately="true"
- color="0.5 0.5 0.5 1"
- follows="left|top"
- height="50"
- layout="topleft"
- left="40"
- name="WaterFogColor"
- tool_tip="Click to open color picker"
- top="30"
- width="40" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left="10"
- name="WaterFogDensText"
- top="84"
- width="200">
- Fog Density Exponent
- </text>
- <slider
- control_name="WaterFogDensity"
- decimal_digits="1"
- follows="left"
- height="10"
- initial_value="16"
- layout="topleft"
- left="24"
- max_val="10"
- name="WaterFogDensity"
- top="124"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left_delta="-14"
- name="WaterUnderWaterFogModText"
- top="124"
- width="200">
- Underwater Fog Modifier
- </text>
- <slider
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="16"
- layout="topleft"
- left="24"
- max_val="2"
- name="WaterUnderWaterFogMod"
- top="164"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left="245"
- name="BDensText"
- top="4"
- width="200">
- Reflection Wavelet Scale
- </text>
- <slider
- control_name="WaterNormalScaleX"
- decimal_digits="1"
- follows="left"
- height="15"
- initial_value="0.7"
- label="1"
- layout="topleft"
- max_val="10"
- name="WaterNormalScaleX"
- top_pad="24"
- width="200" />
- <slider
- control_name="WaterNormalScaleY"
- decimal_digits="1"
- follows="left"
- height="15"
- initial_value="0.7"
- label="2"
- layout="topleft"
- max_val="10"
- name="WaterNormalScaleY"
- top_pad="4"
- width="200" />
- <slider
- control_name="WaterNormalScaleZ"
- decimal_digits="1"
- follows="left"
- height="15"
- initial_value="0.7"
- label="3"
- layout="topleft"
- max_val="10"
- name="WaterNormalScaleZ"
- top_pad="4"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- name="HDText"
- top="84"
- width="200">
- Fresnel Scale
- </text>
- <slider
- control_name="WaterFresnelScale"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.7"
- layout="topleft"
- name="WaterFresnelScale"
- top="124"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- name="FresnelOffsetText"
- top="124"
- width="200">
- Fresnel Offset
- </text>
- <slider
- control_name="WaterFresnelOffset"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.7"
- layout="topleft"
- name="WaterFresnelOffset"
- top="164"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left="480"
- name="DensMultText"
- top="4"
- width="200">
- Refract Scale Above
- </text>
- <slider
- control_name="WaterScaleAbove"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.1"
- layout="topleft"
- left="494"
- name="WaterScaleAbove"
- top="44"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left_delta="-14"
- name="WaterScaleBelowText"
- top="44"
- width="200">
- Refract Scale Below
- </text>
- <slider
- control_name="WaterScaleBelow"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0"
- layout="topleft"
- left="494"
- name="WaterScaleBelow"
- top="84"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left_delta="-14"
- name="MaxAltText"
- top="84"
- width="200">
- Blur Multiplier
- </text>
- <slider
- control_name="WaterBlurMult"
- follows="left"
- height="10"
- increment="0.001"
- initial_value="0"
- layout="topleft"
- left="494"
- max_val="0.16"
- name="WaterBlurMult"
- top="124"
- width="200" />
- </panel>
- <panel
- border="true"
- follows="all"
- height="180"
- label="IMAGE"
- layout="topleft"
- left="0"
- mouse_opaque="false"
- help_topic="water_waves_tab"
- name="Waves"
- top="0"
- width="698">
- <text
- type="string"
- length="1"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left="10"
- name="BHText"
- top="4"
- width="200">
- Big Wave Direction
- </text>
- <text
- type="string"
- length="1"
- follows="left|top|right"
- halign="center"
- height="16"
- layout="topleft"
- left="10"
- name="WaterWave1DirXText"
- top_pad="5"
- width="10">
- X
- </text>
- <slider
- control_name="WaterWave1DirX"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.7"
- layout="topleft"
- left="24"
- max_val="4"
- min_val="-4"
- name="WaterWave1DirX"
- left_pad="3"
- top_pad="6"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- halign="center"
- height="16"
- layout="topleft"
- left_delta="-13"
- name="WaterWave1DirYText"
- top_pad="-15"
- width="10">
- Y
- </text>
- <slider
- control_name="WaterWave1DirY"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.7"
- layout="topleft"
- left_delta="0"
- max_val="4"
- min_val="-4"
- name="WaterWave1DirY"
- left_pad="3"
- top_pad="6"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left_delta="-13"
- name="BHText2"
- top_pad="-10"
- width="355">
- Little Wave Direction
- </text>
- <text
- type="string"
- length="1"
- follows="left|top|right"
- halign="center"
- height="16"
- layout="topleft"
- left="10"
- left_delta="0"
- name="WaterWave2DirXText"
- top_pad="5"
- width="10">
- X
- </text>
- <slider
- control_name="WaterWave2DirX"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.7"
- layout="topleft"
- left="24"
- max_val="4"
- min_val="-4"
- name="WaterWave2DirX"
- left_pad="3"
- top_pad="6"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- halign="center"
- height="16"
- layout="topleft"
- left_delta="-13"
- name="WaterWave2DirYText"
- top_pad="-15"
- width="10">
- Y
- </text>
- <slider
- control_name="WaterWave2DirY"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.7"
- layout="topleft"
- left_delta="0"
- max_val="4"
- min_val="-4"
- name="WaterWave2DirY"
- left_pad="3"
- top_pad="6"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left="240"
- name="BHText3"
- top="4"
- width="200">
- Normal Map
- </text>
- <texture_picker
- height="143"
- layout="topleft"
- left="250"
- name="WaterNormalMap"
- top="22"
- width="128" />
- </panel>
- </tab_container>
-</floater>
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 e04a72cbc0..69e6057556 100644
--- a/indra/newview/skins/default/xui/en/floater_web_content.xml
+++ b/indra/newview/skins/default/xui/en/floater_web_content.xml
@@ -18,6 +18,7 @@
follows="left|right|top|bottom"
layout="topleft"
left="5"
+ animate="false"
name="stack1"
orientation="vertical"
top="20"
@@ -156,14 +157,20 @@
name="external_controls"
top_delta="0"
user_resize="false"
+ auto_resize="true"
width="585">
<web_browser
- bottom="-22"
+ 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"
@@ -174,7 +181,7 @@
name="statusbartext"
parse_urls="false"
text_color="0.4 0.4 0.4 1"
- top_pad="5"
+ top_pad="3"
width="495"/>
<progress_bar
color_bar="0.3 1.0 0.3 1"
diff --git a/indra/newview/skins/default/xui/en/floater_windlight_options.xml b/indra/newview/skins/default/xui/en/floater_windlight_options.xml
deleted file mode 100644
index 249ad95c41..0000000000
--- a/indra/newview/skins/default/xui/en/floater_windlight_options.xml
+++ /dev/null
@@ -1,1288 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater
- legacy_header_height="18"
- height="256"
- layout="topleft"
- name="WindLight floater"
- help_topic="windlight_floater"
- save_rect="true"
- title="ADVANCED SKY EDITOR"
- width="700">
- <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
- type="string"
- length="1"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left="10"
- name="KeyFramePresetsText"
- top="34"
- width="85">
- Sky Presets:
- </text>
- <combo_box
- height="23"
- layout="topleft"
- left_delta="85"
- name="WLPresetsCombo"
- top_delta="-4"
- width="150" />
- <button
- height="23"
- label="New"
- label_selected="New"
- layout="topleft"
- left_pad="3"
- name="WLNewPreset"
- width="70" />
- <button
- height="23"
- label="Save"
- label_selected="Save"
- layout="topleft"
- left_pad="3"
- name="WLSavePreset"
- width="70" />
- <button
- height="23"
- label="Delete"
- label_selected="Delete"
- layout="topleft"
- left_pad="3"
- name="WLDeletePreset"
- width="70" />
- <button
- height="23"
- label="Day Cycle Editor"
- label_selected="Day Cycle Editor"
- layout="topleft"
- right="-10"
- name="WLDayCycleMenuButton"
- top_pad="-23"
- width="120" />
- <tab_container
- follows="left|top"
- height="196"
- halign="center"
- layout="topleft"
- left="0"
- name="WindLight Tabs"
- tab_position="top"
- top="60"
- width="700">
- <panel
- border="true"
- follows="left|top|right|bottom"
- height="196"
- label="ATMOSPHERE"
- layout="topleft"
- left="1"
- mouse_opaque="false"
- help_topic="windlight_atmosphere_tab"
- name="Atmosphere"
- top="60"
- width="698">
- <text
- type="string"
- length="1"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left="10"
- name="BHText"
- top="4"
- width="355">
- Blue Horizon
- </text>
- <text
- type="string"
- length="1"
- follows="left|top|right"
- halign="center"
- height="16"
- layout="topleft"
- left="10"
- name="BHText2"
- top_pad="5"
- width="10">
- R
- </text>
- <slider
- control_name="WLBlueHorizonR"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.7"
- layout="topleft"
- left_pad="3"
- top_pad="6"
- name="WLBlueHorizonR"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- halign="center"
- height="16"
- layout="topleft"
- left="10"
- top_pad="-15"
- name="BHText3"
- width="10">
- G
- </text>
- <slider
- control_name="WLBlueHorizonG"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.7"
- layout="topleft"
- left_delta="0"
- name="WLBlueHorizonG"
- left_pad="3"
- top_pad="6"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- halign="center"
- height="16"
- layout="topleft"
- name="BHText4"
- left="10"
- top_pad="-15"
- width="10">
- B
- </text>
- <slider
- control_name="WLBlueHorizonB"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.7"
- layout="topleft"
- name="WLBlueHorizonB"
- left_pad="3"
- top_pad="6"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- halign="center"
- height="16"
- layout="topleft"
- name="BHText5"
- left="10"
- top_pad="-15"
- width="10">
- I
- </text>
- <slider
- control_name="WLBlueHorizonI"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="1.0"
- layout="topleft"
- name="WLBlueHorizonI"
- left_pad="3"
- top_pad="6"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left="10"
- top_pad="-10"
- name="BDensText"
- width="355">
- Haze Horizon
- </text>
- <slider
- control_name="WLHazeHorizon"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.25"
- layout="topleft"
- left="23"
- top_delta="0"
- top_pad="27"
- name="WLHazeHorizon"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left="245"
- name="BDensText2"
- top="4"
- width="355">
- Blue Density
- </text>
- <text
- type="string"
- length="1"
- follows="left|top|right"
- halign="center"
- height="16"
- layout="topleft"
- left="245"
- name="BHText6"
- top_pad="5"
- width="10">
- R
- </text>
- <slider
- control_name="WLBlueDensityR"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.7"
- layout="topleft"
- left_pad="3"
- top_pad="6"
- name="WLBlueDensityR"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- halign="center"
- height="16"
- layout="topleft"
- left="245"
- name="BHText7"
- top_pad="-15"
- width="10">
- G
- </text>
- <slider
- control_name="WLBlueDensityG"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.7"
- layout="topleft"
- left_delta="0"
- name="WLBlueDensityG"
- left_pad="3"
- top_pad="6"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- halign="center"
- height="16"
- layout="topleft"
- left="245"
- name="BHText8"
- top_pad="-15"
- width="10">
- B
- </text>
- <slider
- control_name="WLBlueDensityB"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.7"
- layout="topleft"
- left_delta="0"
- name="WLBlueDensityB"
- left_pad="3"
- top_pad="6"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- halign="center"
- height="16"
- layout="topleft"
- left="245"
- name="BHText9"
- top_pad="-15"
- width="10">
- I
- </text>
- <slider
- control_name="WLBlueDensityI"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="1"
- layout="topleft"
- left_delta="0"
- name="WLBlueDensityI"
- left_pad="3"
- top_pad="6"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left="245"
- name="HDText"
- top_pad="-10"
- width="355">
- Haze Density
- </text>
- <slider
- control_name="WLHazeDensity"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.7"
- layout="topleft"
- left="258"
- max_val="4"
- name="WLHazeDensity"
- top_pad="27"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left="480"
- name="DensMultText"
- top="4"
- width="355">
- Density Multiplier
- </text>
- <slider
- control_name="WLDensityMult"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.1"
- layout="topleft"
- left_delta="13"
- max_val="0.9"
- name="WLDensityMult"
- top_pad="27"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left_delta="-13"
- name="WLDistanceMultText"
- top_pad="-10"
- width="355">
- Distance Multiplier
- </text>
- <slider
- control_name="WLDistancMult"
- decimal_digits="1"
- follows="left"
- height="10"
- initial_value="1.0"
- layout="topleft"
- left_delta="13"
- max_val="100"
- name="WLDistanceMult"
- top_pad="27"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left_delta="-13"
- name="MaxAltText"
- top_pad="-15"
- width="355">
- Max Altitude
- </text>
- <slider
- control_name="WLMaxAltitude"
- decimal_digits="0"
- follows="left"
- height="10"
- increment="1"
- initial_value="500"
- layout="topleft"
- left_delta="13"
- max_val="4000"
- name="WLMaxAltitude"
- top_pad="27"
- width="200" />
- </panel>
- <panel
- border="true"
- follows="left|top|right|bottom"
- height="196"
- label="LIGHTING"
- layout="topleft"
- left_delta="0"
- help_topic="windlight_lighting_tab"
- name="Lighting"
- top_delta="4"
- width="698">
- <text
- type="string"
- length="1"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left="10"
- name="SLCText"
- top="4"
- width="355">
- Sun/Moon Color
- </text>
- <text
- type="string"
- length="1"
- follows="left|top|right"
- halign="center"
- height="16"
- layout="topleft"
- left_delta="0"
- name="BHText"
- top_pad="5"
- width="10">
- R
- </text>
- <slider
- control_name="WLSunlightR"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.7"
- layout="topleft"
- left_pad="3"
- top_pad="6"
- name="WLSunlightR"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- halign="center"
- height="16"
- layout="topleft"
- left_delta="-13"
- name="BHText2"
- top_pad="-15"
- width="10">
- G
- </text>
- <slider
- control_name="WLSunlightG"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.7"
- layout="topleft"
- left_delta="0"
- name="WLSunlightG"
- left_pad="3"
- top_pad="6"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- halign="center"
- height="16"
- layout="topleft"
- left_delta="-13"
- name="BHText3"
- top_pad="-15"
- width="10">
- B
- </text>
- <slider
- control_name="WLSunlightB"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.7"
- layout="topleft"
- left_delta="0"
- name="WLSunlightB"
- left_pad="3"
- top_pad="6"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- halign="center"
- height="16"
- layout="topleft"
- left_delta="-13"
- name="BHText4"
- top_pad="-15"
- width="10">
- I
- </text>
- <slider
- control_name="WLSunlightI"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="1.0"
- layout="topleft"
- left_delta="0"
- name="WLSunlightI"
- left_pad="3"
- top_pad="6"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left_delta="-13"
- name="TODText"
- top_pad="-10"
- width="355">
- Sun/Moon Position
- </text>
- <icon
- height="20"
- image_name="icon_diurnal.tga"
- layout="topleft"
- left_delta="14"
- top_pad="10"
- name="SkyDayCycle"
- use_draw_context_alpha="false"
- width="148" />
- <slider
- control_name="WLSunAngle"
- follows="left"
- height="10"
- increment="0.001"
- initial_value="0.7"
- layout="topleft"
- left_delta="-8"
- name="WLSunAngle"
- top_pad="20"
- width="207" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left="245"
- name="WLAmbientText"
- top="4"
- width="355">
- Ambient
- </text>
- <text
- type="string"
- length="1"
- follows="left|top|right"
- halign="center"
- height="16"
- layout="topleft"
- left_delta="0"
- name="BHText5"
- top_pad="5"
- width="10">
- R
- </text>
- <slider
- control_name="WLAmbientR"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.7"
- layout="topleft"
- left_pad="3"
- top_pad="6"
- name="WLAmbientR"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- halign="center"
- height="16"
- layout="topleft"
- left_delta="-13"
- name="BHText6"
- top_pad="-15"
- width="10">
- G
- </text>
- <slider
- control_name="WLAmbientG"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.7"
- layout="topleft"
- left_delta="0"
- name="WLAmbientG"
- left_pad="3"
- top_pad="6"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- halign="center"
- height="16"
- layout="topleft"
- left_delta="-13"
- name="BHText7"
- top_pad="-15"
- width="10">
- B
- </text>
- <slider
- control_name="WLAmbientB"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.7"
- layout="topleft"
- left_delta="0"
- name="WLAmbientB"
- left_pad="3"
- top_pad="6"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- halign="center"
- height="16"
- layout="topleft"
- left_delta="-13"
- name="BHText8"
- top_pad="-15"
- width="10">
- I
- </text>
- <slider
- control_name="WLAmbientI"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="1"
- layout="topleft"
- left_delta="0"
- name="WLAmbientI"
- left_pad="3"
- top_pad="6"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left_delta="-13"
- name="WLEastAngleText"
- top_pad="-10"
- width="355">
- East Angle
- </text>
- <slider
- control_name="WLEastAngle"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.0"
- layout="topleft"
- left_delta="13"
- name="WLEastAngle"
- top_pad="27"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left="480"
- name="SunGlowText"
- top="4"
- width="355">
- Sun Glow
- </text>
- <slider
- control_name="WLGlowB"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.1"
- label="Focus "
- layout="topleft"
- left_delta="0"
- max_val="0.5"
- name="WLGlowB"
- top_pad="27"
- width="200" />
- <slider
- control_name="WLGlowR"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.25"
- label="Size "
- layout="topleft"
- left_delta="0"
- max_val="1.99"
- min_val="1"
- name="WLGlowR"
- top_pad="6"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left_delta="0"
- name="SceneGammaText"
- top_pad="-10"
- width="200">
- Scene Gamma
- </text>
- <slider
- control_name="WLGamma"
- decimal_digits="2"
- follows="bottom"
- height="10"
- increment="0.01"
- initial_value="2.0"
- layout="topleft"
- left_delta="0"
- max_val="10"
- name="WLGamma"
- top_pad="27"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left_delta="0"
- name="WLStarText"
- top_pad="-10"
- width="355">
- Star Brightness
- </text>
- <slider
- control_name="WLStarAlpha"
- decimal_digits="2"
- follows="bottom"
- height="10"
- increment="0.01"
- initial_value="0"
- layout="topleft"
- left_delta="0"
- max_val="2"
- name="WLStarAlpha"
- top_pad="27"
- width="200" />
- </panel>
- <panel
- border="true"
- follows="left|top|right|bottom"
- height="196"
- label="CLOUDS"
- layout="topleft"
- left_delta="0"
- mouse_opaque="false"
- help_topic="windlight_clouds_tab"
- name="Clouds"
- top_delta="4"
- width="698">
- <text
- type="string"
- length="1"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left="10"
- name="WLCloudColorText"
- top="4"
- width="355">
- Cloud Color
- </text>
- <text
- type="string"
- length="1"
- follows="left|top|right"
- halign="center"
- height="16"
- layout="topleft"
- left_delta="0"
- name="BHText"
- top_pad="5"
- width="10">
- R
- </text>
- <slider
- control_name="WLCloudColorR"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.7"
- layout="topleft"
- left_pad="3"
- top_pad="6"
- name="WLCloudColorR"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- halign="center"
- height="16"
- layout="topleft"
- left_delta="-13"
- name="BHText2"
- top_pad="-15"
- width="10">
- G
- </text>
- <slider
- control_name="WLCloudColorG"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.7"
- layout="topleft"
- left_delta="0"
- name="WLCloudColorG"
- left_pad="3"
- top_pad="6"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- halign="center"
- height="16"
- layout="topleft"
- left_delta="-13"
- name="BHText3"
- top_pad="-15"
- width="10">
- B
- </text>
- <slider
- control_name="WLCloudColorB"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.7"
- layout="topleft"
- left_delta="0"
- name="WLCloudColorB"
- left_pad="3"
- top_pad="6"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- halign="center"
- height="16"
- layout="topleft"
- left_delta="-13"
- name="BHText4"
- top_pad="-15"
- width="10">
- I
- </text>
- <slider
- control_name="WLCloudColorI"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="1.0"
- layout="topleft"
- left_delta="0"
- name="WLCloudColorI"
- left_pad="3"
- top_pad="6"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left_delta="-13"
- name="WLCloudColorText2"
- top_pad="-10"
- width="355">
- Cloud XY/Density
- </text>
- <text
- type="string"
- length="1"
- follows="left|top|right"
- halign="center"
- height="16"
- layout="topleft"
- left_delta="0"
- name="BHText5"
- top_pad="5"
- width="10">
- X
- </text>
- <slider
- control_name="WLCloudX"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.5"
- layout="topleft"
- left_pad="3"
- top_pad="6"
- name="WLCloudX"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- halign="center"
- height="16"
- layout="topleft"
- left_delta="-13"
- name="BHText6"
- top_pad="-15"
- width="10">
- Y
- </text>
- <slider
- control_name="WLCloudY"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.5"
- layout="topleft"
- left_pad="3"
- top_pad="6"
- name="WLCloudY"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- halign="center"
- height="16"
- layout="topleft"
- left_delta="-13"
- name="BHText7"
- top_pad="-15"
- width="10">
- D
- </text>
- <slider
- control_name="WLCloudDensity"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="1.0"
- layout="topleft"
- left_delta="0"
- name="WLCloudDensity"
- left_pad="3"
- top_pad="6"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left="245"
- name="WLCloudCoverageText"
- top="4"
- width="355">
- Cloud Coverage
- </text>
- <slider
- control_name="WLCloudCoverage"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.5"
- layout="topleft"
- left_delta="13"
- name="WLCloudCoverage"
- top_pad="27"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left_delta="-13"
- name="WLCloudScaleText"
- top_pad="-10"
- width="355">
- Cloud Scale
- </text>
- <slider
- control_name="WLCloudScale"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="1.0"
- layout="topleft"
- left_delta="13"
- min_val="0.01"
- name="WLCloudScale"
- top_pad="27"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left_delta="-13"
- name="WLCloudDetailText"
- top_pad="-10"
- width="355">
- Cloud Detail (XY/Density)
- </text>
- <text
- type="string"
- length="1"
- follows="left|top|right"
- halign="center"
- height="16"
- layout="topleft"
- left_delta="0"
- name="BHText8"
- top_pad="8"
- width="10">
- X
- </text>
- <slider
- control_name="WLCloudDetailX"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.5"
- layout="topleft"
- left_pad="3"
- top_pad="8"
- name="WLCloudDetailX"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- halign="center"
- height="16"
- layout="topleft"
- left_delta="-13"
- name="BHText9"
- top_pad="-15"
- width="10">
- Y
- </text>
- <slider
- control_name="WLCloudDetailY"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.5"
- layout="topleft"
- left_delta="0"
- name="WLCloudDetailY"
- left_pad="3"
- top_pad="6"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- halign="center"
- height="16"
- layout="topleft"
- left_delta="-13"
- name="BHText10"
- top_pad="-15"
- width="10">
- D
- </text>
- <slider
- control_name="WLCloudDetailDensity"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="1.0"
- layout="topleft"
- left_delta="0"
- name="WLCloudDetailDensity"
- left_pad="3"
- top_pad="6"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left="480"
- name="WLCloudScrollXText"
- top="4"
- width="355">
- Cloud Scroll X
- </text>
- <check_box
- control_name="WLCloudLockX"
- follows="left"
- height="16"
- label="Lock"
- layout="topleft"
- left="625"
- name="WLCloudLockX"
- width="200" />
- <slider
- control_name="WLCloudScrollX"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.5"
- layout="topleft"
- left="494"
- max_val="10"
- min_val="-10"
- name="WLCloudScrollX"
- top="45"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left_delta="-14"
- name="WLCloudScrollYText"
- top_delta="-1"
- width="355">
- Cloud Scroll Y
- </text>
- <check_box
- control_name="WLCloudLockY"
- follows="left"
- height="16"
- label="Lock"
- layout="topleft"
- left="625"
- name="WLCloudLockY"
- width="200" />
- <slider
- control_name="WLCloudScrollY"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.5"
- layout="topleft"
- left="494"
- max_val="10"
- min_val="-10"
- name="WLCloudScrollY"
- top="85"
- width="200" />
- <check_box
- control_name="DrawClassicClouds"
- follows="left"
- height="16"
- label="Draw Classic Clouds"
- layout="topleft"
- left="480"
- name="DrawClassicClouds"
- top="104"
- width="200" />
- </panel>
- </tab_container>
-</floater>
diff --git a/indra/newview/skins/default/xui/en/language_settings.xml b/indra/newview/skins/default/xui/en/language_settings.xml
index c8a06fe401..51779e4bfd 100644
--- a/indra/newview/skins/default/xui/en/language_settings.xml
+++ b/indra/newview/skins/default/xui/en/language_settings.xml
@@ -4,6 +4,7 @@
<!-- Locale Information -->
<string name="MicrosoftLocale">english</string>
+ <string name="MacLocale">C</string>
<string name="DarwinLocale">C</string>
<string name="LinuxLocale">C</string>
diff --git a/indra/newview/skins/default/xui/en/main_view.xml b/indra/newview/skins/default/xui/en/main_view.xml
index 3ead67ca57..a7d1aa963c 100644
--- a/indra/newview/skins/default/xui/en/main_view.xml
+++ b/indra/newview/skins/default/xui/en/main_view.xml
@@ -135,6 +135,14 @@
name="login_panel_holder"
width="1024"/>
+ <debug_view follows="all"
+ left="0"
+ top="0"
+ mouse_opaque="false"
+ height="500"
+ name="DebugView"
+ width="1024"/>
+
<panel follows="all"
height="500"
left="0"
@@ -154,13 +162,6 @@
top="0"
width="1024"/>
</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"
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 484af63097..0f42000ae7 100644
--- a/indra/newview/skins/default/xui/en/menu_inventory_add.xml
+++ b/indra/newview/skins/default/xui/en/menu_inventory_add.xml
@@ -42,7 +42,7 @@
<menu_item_call.on_enable
function="File.EnableUpload" />
</menu_item_call>
- <menu_item_call
+ <menu_item_call
label="Model..."
layout="topleft"
name="Upload Model">
@@ -251,4 +251,4 @@
parameter="eyes" />
</menu_item_call>
</menu>
-</menu>
+</menu> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/en/menu_login.xml b/indra/newview/skins/default/xui/en/menu_login.xml
index 0d4a095e14..4c4ff3e5c4 100644
--- a/indra/newview/skins/default/xui/en/menu_login.xml
+++ b/indra/newview/skins/default/xui/en/menu_login.xml
@@ -183,11 +183,11 @@
parameter="http://join.secondlife.com/"/>
</menu_item_call>
<menu_item_call
- label="Web Content Floater Test"
- name="Web Content Floater Test">
+ label="Web Content Floater Debug Test"
+ name="Web Content Floater Debug Test">
<menu_item_call.on_click
function="Advanced.WebContentTest"
- parameter="http://www.google.com"/>
+ parameter="http://google.com"/>
</menu_item_call>
<menu_item_check
label="Show Grid Picker"
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 f9db64b524..65bd2793b6 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
@@ -42,6 +42,14 @@
function="CheckControl"
parameter="NearbyListShowIcons" />
</menu_item_check>
+ <menu_item_check name ="view_map" label="View Map">
+ <menu_item_check.on_check
+ function="CheckControl"
+ parameter="NearbyListShowMap" />
+ <menu_item_check.on_click
+ function="ToggleControl"
+ parameter="NearbyListShowMap" />
+ </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" />
diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index 3b268a1937..caa037576b 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -232,6 +232,16 @@
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>
</menu>
<menu
create_jump_keys="true"
@@ -470,7 +480,7 @@
<menu_item_separator/>
- <menu
+ <menu
create_jump_keys="true"
label="Sun"
name="Environment Settings"
@@ -505,24 +515,105 @@
function="World.EnvSettings"
parameter="midnight" />
</menu_item_call>
- <menu_item_call
- label="Estate Time"
- name="Revert to Region Default">
- <menu_item_call.on_click
- function="World.EnvSettings"
- parameter="default" />
- </menu_item_call>
-
- <menu_item_separator/>
-
- <menu_item_call
- label="Environment Editor"
- name="Environment Editor">
- <menu_item_call.on_click
- function="World.EnvSettings"
- parameter="editor" />
- </menu_item_call>
</menu>
+
+
+ <menu
+ create_jump_keys="true"
+ label="Enviroment Editor"
+ name="Enviroment Editor"
+ tear_off="true">
+
+ <menu_item_call
+ label="Enviroment Settings..."
+ name="Enviroment Settings">
+ <menu_item_call.on_click
+ function="World.EnvSettings"
+ parameter="editor"/>
+ </menu_item_call>
+
+ <menu_item_separator/>
+
+ <menu
+ name="Water Presets"
+ label="Water Presets">
+ <menu_item_call
+ label="New preset..."
+ name="new_water_preset">
+ <menu_item_call.on_click
+ function="World.EnvPreset"
+ parameter="new_water"/>
+ </menu_item_call>
+ <menu_item_call
+ label="Edit preset..."
+ name="edit_water_preset">
+ <menu_item_call.on_click
+ function="World.EnvPreset"
+ parameter="edit_water"/>
+ </menu_item_call>
+ <menu_item_call
+ label="Delete preset..."
+ name="delete_water_preset">
+ <menu_item_call.on_click
+ function="World.EnvPreset"
+ parameter="delete_water"/>
+ </menu_item_call>
+ </menu>
+
+ <menu
+ name="Sky Presets"
+ label="Sky Presets">
+ <menu_item_call
+ label="New preset..."
+ name="new_sky_preset">
+ <menu_item_call.on_click
+ function="World.EnvPreset"
+ parameter="new_sky"/>
+ </menu_item_call>
+ <menu_item_call
+ label="Edit preset..."
+ name="edit_sky_preset">
+ <menu_item_call.on_click
+ function="World.EnvPreset"
+ parameter="edit_sky"/>
+ </menu_item_call>
+ <menu_item_call
+ label="Delete preset..."
+ name="delete_sky_preset">
+ <menu_item_call.on_click
+ function="World.EnvPreset"
+ parameter="delete_sky"/>
+ </menu_item_call>
+ </menu>
+
+ <menu
+ name="Day Presets"
+ label="Day Presets">
+ <menu_item_call
+ label="New preset..."
+ name="new_day_preset">
+ <menu_item_call.on_click
+ function="World.EnvPreset"
+ parameter="new_day_cycle"/>
+ </menu_item_call>
+ <menu_item_call
+ label="Edit preset..."
+ name="edit_day_preset">
+ <menu_item_call.on_click
+ function="World.EnvPreset"
+ parameter="edit_day_cycle"/>
+ </menu_item_call>
+ <menu_item_call
+ label="Delete preset..."
+ name="delete_day_preset">
+ <menu_item_call.on_click
+ function="World.EnvPreset"
+ parameter="delete_day_cycle"/>
+ </menu_item_call>
+ </menu>
+ </menu>
+
+
</menu>
<menu
create_jump_keys="true"
@@ -983,19 +1074,7 @@
<menu_item_call.on_visible
function="File.VisibleUploadModel"/>
</menu_item_call>
- <menu_item_call
- label="Model Wizard..."
- layout="topleft"
- name="Upload Model Wizard">
- <menu_item_call.on_click
- function="Floater.Show"
- parameter="upload_model_wizard" />
- <menu_item_call.on_enable
- function="File.EnableUploadModel" />
- <menu_item_call.on_visible
- function="File.VisibleUploadModel"/>
- </menu_item_call>
- <menu_item_call
+ <menu_item_call
label="Bulk (L$[COST] per file)..."
layout="topleft"
name="Bulk Upload">
@@ -1997,15 +2076,14 @@
</menu_item_check>
<menu_item_check
label="Show Upload Cost"
- layout="topleft"
name="Show Upload Cost">
- <menu_item_check.on_check
+ <menu_item_check.on_check
function="CheckControl"
parameter="DebugShowUploadCost" />
<menu_item_check.on_click
- function="ToggleControl"
- parameter="DebugShowUploadCost" />
- </menu_item_check>
+ function="ToggleControl"
+ parameter="DebugShowUploadCost" />
+ </menu_item_check>
<menu_item_check
label="Show Render Info"
name="Show Render Info">
@@ -2016,7 +2094,7 @@
function="ToggleControl"
parameter="DebugShowRenderInfo" />
</menu_item_check>
- <menu_item_check
+ <menu_item_check
label="Show Texture Info"
name="Show Texture Info">
<menu_item_check.on_check
@@ -2358,6 +2436,16 @@
function="Advanced.ToggleInfoDisplay"
parameter="rendercomplexity" />
</menu_item_check>
+ <menu_item_check
+ label="Sculpt"
+ name="Sculpt">
+ <menu_item_check.on_check
+ function="Advanced.CheckInfoDisplay"
+ parameter="sculpt" />
+ <menu_item_check.on_click
+ function="Advanced.ToggleInfoDisplay"
+ parameter="sculpt" />
+ </menu_item_check>
</menu>
<menu
create_jump_keys="true"
diff --git a/indra/newview/skins/default/xui/en/menu_wearing_gear.xml b/indra/newview/skins/default/xui/en/menu_wearing_gear.xml
index 0ac2c14253..0e858ccf10 100644
--- a/indra/newview/skins/default/xui/en/menu_wearing_gear.xml
+++ b/indra/newview/skins/default/xui/en/menu_wearing_gear.xml
@@ -20,4 +20,11 @@
function="Gear.OnEnable"
parameter="take_off" />
</menu_item_call>
+ <menu_item_call
+ label="Copy outfit list to clipboard"
+ layout="topleft"
+ name="copy">
+ <on_click
+ function="Gear.Copy" />
+ </menu_item_call>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index b3b9e7f502..6e2596a49e 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -3698,6 +3698,19 @@ Join me in [REGION]
<notification
icon="alertmodal.tga"
+ name="TooManyTeleportOffers"
+ type="alertmodal">
+You attempted to make [OFFERS] teleport offers
+which exceeds the limit of [LIMIT].
+ <tag>group</tag>
+ <tag>fail</tag>
+ <usetemplate
+ name="okbutton"
+ yestext="OK"/>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
name="OfferTeleportFromGod"
type="alertmodal">
God summon Resident to your location?
@@ -4763,6 +4776,18 @@ Are you sure you want to delete your travel, web, and search history?
notext="Cancel"
yestext="OK"/>
</notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="ConfirmClearCache"
+ type="alertmodal">
+Are you sure you want to clear your viewer cache?
+ <tag>confirm</tag>
+ <usetemplate
+ name="okcancelbuttons"
+ notext="Cancel"
+ yestext="OK"/>
+ </notification>
<notification
icon="alertmodal.tga"
@@ -4829,18 +4854,6 @@ Do you wish to overwrite the saved preset?
<notification
icon="alertmodal.tga"
- name="WLDeletePresetAlert"
- type="alertmodal">
-Do you wish to delete [SKY]?
- <tag>confirm</tag>
- <usetemplate
- name="okcancelbuttons"
- notext="No"
- yestext="Yes"/>
- </notification>
-
- <notification
- icon="alertmodal.tga"
name="WLNoEditDefault"
type="alertmodal">
You cannot edit or delete a default preset.
@@ -4857,81 +4870,53 @@ This day cycle file references a missing sky file: [SKY].
<notification
icon="alertmodal.tga"
- name="PPSaveEffectAlert"
+ name="WLRegionApplyFail"
type="alertmodal">
-PostProcess Effect exists. Do you still wish overwrite it?
- <usetemplate
- name="okcancelbuttons"
- notext="No"
- yestext="Yes"/>
- </notification>
-
- <notification
- icon="alert.tga"
- name="NewSkyPreset"
- type="alert">
-Give me a name for the new sky.
- <tag>confirm</tag>
- <form name="form">
- <input name="message" type="text">
-New Preset
- </input>
- <button
- default="true"
- index="0"
- name="OK"
- text="OK"/>
- <button
- index="1"
- name="Cancel"
- text="Cancel"/>
- </form>
+Sorry, the settings couldn't be applied to the region. Leaving the region and then returning may help rectify the problem. The reason given was: [FAIL_REASON]
</notification>
<notification
+ functor="GenericAcknowledge"
icon="alertmodal.tga"
- name="ExistsSkyPresetAlert"
+ name="EnvCannotDeleteLastDayCycleKey"
type="alertmodal">
-Preset already exists!
- <tag>fail</tag>
+Unable to delete the last key in this day cycle because you cannot have an empty day cycle. You should modify the last remaining key instead of attempting to delete it and then to create a new one.
+ <usetemplate
+ name="okbutton"
+ yestext="OK"/>
</notification>
<notification
- icon="alert.tga"
- name="NewWaterPreset"
- type="alert">
-Give me a name for the new water preset.
- <tag>confirm</tag>
- <form name="form">
- <input name="message" type="text">
-New Preset
- </input>
- <button
- default="true"
- index="0"
- name="OK"
- text="OK"/>
- <button
- index="1"
- name="Cancel"
- text="Cancel"/>
- </form>
+ functor="GenericAcknowledge"
+ icon="alertmodal.tga"
+ name="DayCycleTooManyKeyframes"
+ type="alertmodal">
+You cannot add any more keyframes to this day cycle. The maximum number of keyframes for day cycles of [SCOPE] scope is [MAX].
+ <usetemplate
+ name="okbutton"
+ yestext="OK"/>
</notification>
<notification
+ functor="GenericAcknowledge"
icon="alertmodal.tga"
- name="ExistsWaterPresetAlert"
+ name="EnvUpdateRate"
type="alertmodal">
-Preset already exists!
- <tag>fail</tag>
+ You may only update region environmental settings every [WAIT] seconds. Wait at least that long and then try again.
+ <usetemplate
+ name="okbutton"
+ yestext="OK"/>
</notification>
<notification
icon="alertmodal.tga"
- name="WaterNoEditDefault"
+ name="PPSaveEffectAlert"
type="alertmodal">
-You cannot edit or delete a default preset.
- <tag>fail</tag>
+PostProcess Effect exists. Do you still wish overwrite it?
+ <usetemplate
+ name="okcancelbuttons"
+ notext="No"
+ yestext="Yes"/>
</notification>
<notification
@@ -5227,6 +5212,20 @@ Insufficient permissions to rez object.
<notification
icon="notifytip.tga"
+ name="IMAcrossParentEstates"
+ type="notifytip">
+Unable to send IM across parent estates.
+ </notification>
+
+ <notification
+ icon="notifytip.tga"
+ name="TransferInventoryAcrossParentEstates"
+ type="notifytip">
+Unable to transfer inventory across parent estates.
+ </notification>
+
+ <notification
+ icon="notifytip.tga"
name="UnableToLoadNotecard"
type="notifytip">
Unable to load notecard.
@@ -5629,6 +5628,15 @@ This area has building disabled. You can&apos;t build or rez objects here.
<notification
icon="notify.tga"
+ name="SeeAvatars"
+ persist="true"
+ type="notify"
+ unique="true">
+This parcel hides avatars and text chat from another parcel. You can&apos;t see other residents outside the parcel, and those outside are not able to see you. Regular text chat on channel 0 is also blocked.
+ </notification>
+
+ <notification
+ icon="notify.tga"
name="ScriptsStopped"
persist="true"
type="notify">
@@ -6797,7 +6805,23 @@ Select residents to share with.
name="MeshUploadError"
icon="alert.tga"
type="alert">
- [LABEL] failed to upload: [MESSAGE] [IDENTIFIER] [INVALIDITY_IDENTIFIER]
+ [LABEL] failed to upload: [MESSAGE] [IDENTIFIER]
+
+See the log file for details.
+ </notification>
+
+ <notification
+ name="MeshUploadPermError"
+ icon="alert.tga"
+ type="alert">
+ Error while requesting mesh upload permissons.
+ </notification>
+
+ <notification
+ name="RegionCapabilityRequestError"
+ icon="alert.tga"
+ type="alert">
+ Could not get region capability &apos;[CAPABILITY]&apos;.
</notification>
<notification
@@ -7317,8 +7341,6 @@ The site at &apos;&lt;nolink&gt;[HOST_NAME]&lt;/nolink&gt;&apos; in realm &apos;
notext="Don't Quit"/>
</notification>
- </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.
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 f438e3d42d..9e70706603 100644
--- a/indra/newview/skins/default/xui/en/panel_cof_wearables.xml
+++ b/indra/newview/skins/default/xui/en/panel_cof_wearables.xml
@@ -52,10 +52,7 @@
multi_select="true"
name="list_attachments"
top="0"
- width="311">
- <flat_list_view.no_items_text
- value="No attachments worn" />
- </flat_list_view>
+ width="311"/>
</accordion_tab>
<accordion_tab
layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/panel_edit_pick.xml b/indra/newview/skins/default/xui/en/panel_edit_pick.xml
index 82dfb445da..2ec2e03e8c 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_pick.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_pick.xml
@@ -220,7 +220,7 @@
height="23"
layout="topleft"
left_pad="4"
- name="layout_panel1"
+ name="layout_panel2"
user_resize="false"
auto_resize="true"
width="146">
diff --git a/indra/newview/skins/default/xui/en/panel_group_notices.xml b/indra/newview/skins/default/xui/en/panel_group_notices.xml
index 600b0e3b71..607e1bb213 100644
--- a/indra/newview/skins/default/xui/en/panel_group_notices.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_notices.xml
@@ -84,7 +84,7 @@ Maximum 200 per group daily
name="create_new_notice"
tool_tip="Create a new notice"
top_delta="0"
- width="93" />
+ width="127" />
<button
follows="top|left"
height="23"
@@ -128,7 +128,7 @@ Maximum 200 per group daily
layout="topleft"
name="lbl3"
top_pad="10"
- width="60">
+ width="62">
Subject:
</text>
<line_editor
@@ -141,7 +141,7 @@ Maximum 200 per group daily
max_length_bytes="63"
name="create_subject"
prevalidate_callback="ascii"
- width="220" />
+ width="218" />
<text
follows="left|top"
type="string"
@@ -151,7 +151,7 @@ Maximum 200 per group daily
left="10"
name="lbl4"
top_pad="5"
- width="60">
+ width="62">
Message:
</text>
<text_editor
@@ -162,7 +162,7 @@ Maximum 200 per group daily
max_length="511"
name="create_message"
top_delta="0"
- width="220"
+ width="218"
word_wrap="true" />
<text
follows="left|top"
diff --git a/indra/newview/skins/default/xui/en/panel_inbox_inventory.xml b/indra/newview/skins/default/xui/en/panel_inbox_inventory.xml
new file mode 100644
index 0000000000..d06190ec54
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_inbox_inventory.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<inbox_inventory_panel
+ name="inventory_inbox"
+ start_folder="Received Items"
+ follows="all" layout="topleft"
+ top="0" left="0" height="165" width="308"
+ top_pad="0"
+ bg_opaque_color="DkGray2"
+ bg_alpha_color="DkGray2"
+ background_visible="true"
+ background_opaque="true"
+ border="false"
+ bevel_style="none"
+ show_item_link_overlays="true"
+ >
+ <scroll reserve_scroll_corner="false" />
+</inbox_inventory_panel>
diff --git a/indra/newview/skins/default/xui/en/panel_media_settings_general.xml b/indra/newview/skins/default/xui/en/panel_media_settings_general.xml
index 38e8b9844f..cdf14572fe 100644
--- a/indra/newview/skins/default/xui/en/panel_media_settings_general.xml
+++ b/indra/newview/skins/default/xui/en/panel_media_settings_general.xml
@@ -196,7 +196,7 @@
initial_val="256"
label=""
label_width="0"
- left_delta="40"
+ left_delta="68"
max_val="2048"
min_val="0"
mouse_opaque="true"
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 9bd60b935f..bfc503f05b 100644
--- a/indra/newview/skins/default/xui/en/panel_nearby_media.xml
+++ b/indra/newview/skins/default/xui/en/panel_nearby_media.xml
@@ -104,12 +104,12 @@
top_pad="15"
left="10"
name="show_text"
- width="40">
+ width="62">
Show:
</text>
<combo_box
height="23"
- left="50"
+ left="72"
width="140"
top_delta="-5"
follows="left|top"
diff --git a/indra/newview/skins/default/xui/en/panel_outbox_inventory.xml b/indra/newview/skins/default/xui/en/panel_outbox_inventory.xml
new file mode 100644
index 0000000000..af32056428
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_outbox_inventory.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<inventory_panel
+ name="inventory_outbox"
+ start_folder="Outbox"
+ follows="all" layout="topleft"
+ top="0" left="0" height="165" width="308"
+ top_pad="0"
+ bg_opaque_color="DkGray2"
+ bg_alpha_color="DkGray2"
+ background_visible="true"
+ background_opaque="true"
+ border="false"
+ bevel_style="none"
+ show_item_link_overlays="true"
+ >
+ <scroll reserve_scroll_corner="false" />
+</inventory_panel>
diff --git a/indra/newview/skins/default/xui/en/panel_outfits_list.xml b/indra/newview/skins/default/xui/en/panel_outfits_list.xml
index 9f98019c94..a0096adc01 100644
--- a/indra/newview/skins/default/xui/en/panel_outfits_list.xml
+++ b/indra/newview/skins/default/xui/en/panel_outfits_list.xml
@@ -14,9 +14,7 @@
background_visible="true"
bg_alpha_color="DkGray2"
bg_opaque_color="DkGray2"
- no_matched_tabs_text.value="Didn't find what you're looking for? Try [secondlife:///app/search/all/[SEARCH_TERM] Search]."
- no_matched_tabs_text.v_pad="10"
- no_visible_tabs_text.value="You don't have any outfits yet. Try [secondlife:///app/search/all/ Search]"
+
follows="all"
height="400"
layout="topleft"
@@ -24,6 +22,13 @@
name="outfits_accordion"
top="0"
width="309">
+ <no_matched_tabs_text
+ name="no_matched_outfits_msg"
+ value="Didn't find what you're looking for? Try [secondlife:///app/search/all/[SEARCH_TERM] Search]."
+ v_pad="10"/>
+ <no_visible_tabs_text
+ name="no_outfits_msg"
+ value="You don't have any outfits yet. Try [secondlife:///app/search/all/ Search]"/>
</accordion>
<panel
background_visible="true"
diff --git a/indra/newview/skins/default/xui/en/panel_people.xml b/indra/newview/skins/default/xui/en/panel_people.xml
index 1a00416b2a..cc4522f944 100644
--- a/indra/newview/skins/default/xui/en/panel_people.xml
+++ b/indra/newview/skins/default/xui/en/panel_people.xml
@@ -87,7 +87,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
width="319">
<panel
background_opaque="true"
- background_visible="true"
+ background_visible="true"
bg_alpha_color="DkGray"
bg_opaque_color="DkGray"
follows="all"
@@ -99,28 +99,55 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
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="305"
- height="140"
- top="5"/>
- <avatar_list
- allow_select="true"
- follows="top|left|bottom|right"
- height="211"
- ignore_online_status="true"
+ <layout_stack
+ clip="false"
+ follows="all"
+ height="355"
+ layout="topleft"
+ mouse_opaque="false"
+ orientation="vertical"
+ width="313">
+ <layout_panel
+ height="142"
layout="topleft"
- left="3"
- multi_select="true"
- name="avatar_list"
- top="145"
- width="306" />
- <panel
+ min_dim="100"
+ mouse_opaque="false"
+ user_resize="true"
+ visibility_control="NearbyListShowMap"
+ width="313">
+ <net_map
+ bg_color="NetMapBackgroundColor"
+ follows="all"
+ height="140"
+ layout="topleft"
+ left="3"
+ mouse_opaque="false"
+ name="Net Map"
+ top="4"
+ width="305"/>
+ </layout_panel>
+ <layout_panel
+ height="213"
+ layout="topleft"
+ min_dim="100"
+ mouse_opaque="false"
+ user_resize="true"
+ width="313">
+ <avatar_list
+ allow_select="true"
+ follows="all"
+ height="211"
+ ignore_online_status="true"
+ layout="topleft"
+ left="3"
+ keep_one_selected="false"
+ multi_select="true"
+ name="avatar_list"
+ top="2"
+ width="306" />
+ </layout_panel>
+ </layout_stack>
+ <panel
background_visible="true"
follows="left|right|bottom"
height="27"
@@ -595,7 +622,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
height="23"
layout="bottomleft"
left_pad="3"
- name="chat_btn_lp"
+ name="im_btn_lp"
user_resize="false"
auto_resize="true"
width="41">
@@ -616,7 +643,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
height="23"
layout="bottomleft"
left_pad="3"
- name="chat_btn_lp"
+ name="call_btn_lp"
user_resize="false"
auto_resize="true"
width="52">
@@ -637,7 +664,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
height="23"
layout="bottomleft"
left_pad="3"
- name="chat_btn_lp"
+ name="share_btn_lp"
user_resize="false"
auto_resize="true"
width="66">
@@ -658,7 +685,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
height="23"
layout="bottomleft"
left_pad="3"
- name="chat_btn_lp"
+ name="teleport_btn_lp"
user_resize="false"
auto_resize="true"
width="77">
diff --git a/indra/newview/skins/default/xui/en/panel_place_profile.xml b/indra/newview/skins/default/xui/en/panel_place_profile.xml
index 774a9e8bbf..e280115bda 100644
--- a/indra/newview/skins/default/xui/en/panel_place_profile.xml
+++ b/indra/newview/skins/default/xui/en/panel_place_profile.xml
@@ -153,6 +153,14 @@
name="icon_DamageNo"
translate="false"
value="Parcel_DamageNo_Dark" />
+ <string
+ name="icon_SeeAVs_Off"
+ translate="false"
+ value="Parcel_SeeAVsOff_Dark" />
+ <string
+ name="icon_SeeAVs_On"
+ translate="false"
+ value="Parcel_SeeAVsOn_Dark" />
<button
follows="top|left"
height="24"
@@ -354,7 +362,7 @@
title="Parcel">
<panel
follows="all"
- height="175"
+ height="200"
layout="topleft"
left="0"
name="parcel_characteristics_panel"
@@ -543,6 +551,31 @@
top_delta="0"
value="Off"
width="60" />
+ <icon
+ follows="top|left"
+ height="18"
+ image_name="Parcel_SeeAVsOff_Dark"
+ layout="topleft"
+ left="10"
+ name="see_avatars_icon"
+ top_pad="7"
+ width="22" />
+ <text
+ follows="left|top"
+ height="14"
+ layout="topleft"
+ left_pad="8"
+ name="see_avatars_label"
+ value="See Avatars:"
+ width="90" />
+ <text
+ follows="left|top"
+ height="14"
+ layout="topleft"
+ left_pad="0"
+ name="see_avatars_value"
+ value="Off"
+ width="60" />
<button
follows="bottom|right"
height="23"
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
index 37aab059a9..2cc9d9c1b0 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
@@ -20,8 +20,112 @@
height="12"
layout="topleft"
left="33"
+ name="Cache:"
+ top_pad="10"
+ width="100">
+ Cache:
+ </text>
+ <spinner
+ control_name="CacheSize"
+ decimal_digits="0"
+ follows="left|top"
+ height="23"
+ increment="64"
+ initial_value="1024"
+ label="Cache size (64 - 9984MB)"
+ label_width="150"
+ layout="topleft"
+ left="80"
+ max_val="9984"
+ min_val="64"
+ top_pad="10"
+ name="cachesizespinner"
+ width="200" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="23"
+ layout="topleft"
+ left_pad="5"
+ mouse_opaque="false"
+ name="text_box5"
+ width="20">
+ MB
+ </text>
+ <button
+ follows="left|top"
+ height="23"
+ label="Clear Cache"
+ label_selected="Clear Cache"
+ layout="topleft"
+ left_pad="30"
+ name="clear_cache"
+ top_delta="0"
+ width="100">
+ <button.commit_callback
+ function="Pref.ClearCache" />
+ </button>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left="80"
+ name="Cache location"
+ top_pad="5"
+ width="300">
+ Cache location:
+ </text>
+ <line_editor
+ control_name="CacheLocationTopFolder"
+ border_style="line"
+ border_thickness="1"
+ follows="left|top"
+ font="SansSerif"
+ height="23"
+ layout="topleft"
+ left="80"
+ max_length="4096"
+ name="cache_location"
+ top_pad="5"
+ width="205" />
+ <button
+ follows="left|top"
+ height="23"
+ label="Browse"
+ label_selected="Browse"
+ layout="topleft"
+ left_pad="5"
+ name="set_cache"
+ top_delta="0"
+ width="100">
+ <button.commit_callback
+ function="Pref.SetCache" />
+ </button>
+ <button
+ follows="left|top"
+ height="23"
+ label="Default Location"
+ label_selected="Default Location"
+ layout="topleft"
+ left_pad="3"
+ name="default_cache_location"
+ top_delta="0"
+ width="100">
+ <button.commit_callback
+ function="Pref.ResetCache" />
+ </button>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="12"
+ layout="topleft"
+ left="33"
name="UI Size:"
- top_pad="25"
+ top_pad="20"
width="100">
UI size:
</text>
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 cdc462109c..ea09286592 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
@@ -180,14 +180,14 @@
increment="1"
initial_value="23"
label="Nearby chat toasts life time:"
- label_width="190"
+ label_width="285"
layout="topleft"
left="45"
max_val="60"
min_val="1"
name="nearby_toasts_lifetime"
top_pad="10"
- width="230" />
+ width="325" />
<spinner
control_name="NearbyToastFadingTime"
decimal_digits="0"
@@ -196,14 +196,14 @@
increment="1"
initial_value="3"
label="Nearby chat toasts fading time:"
- label_width="190"
+ label_width="285"
layout="topleft"
left_delta="0"
max_val="60"
min_val="0"
name="nearby_toasts_fadingtime"
top_pad="3"
- width="230" />
+ width="325" />
<check_box
control_name="TranslateChat"
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_colors.xml b/indra/newview/skins/default/xui/en/panel_preferences_colors.xml
index 8a37822413..2b22f0d6e3 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_colors.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_colors.xml
@@ -47,7 +47,7 @@
height="12"
name="font_colors"
top_pad="20"
- width="120"
+ width="170"
>
Chat font colors:
</text>
@@ -208,6 +208,37 @@
</text>
<color_swatch
can_apply_immediately="true"
+ color="LtOrange"
+ follows="left|top"
+ height="24"
+ label_height="0"
+ layout="topleft"
+ left="360"
+ name="direct"
+ top_pad="-15"
+ width="44" >
+ <color_swatch.init_callback
+ function="Pref.getUIColor"
+ parameter="DirectChatColor" />
+ <color_swatch.commit_callback
+ function="Pref.applyUIColor"
+ parameter="DirectChatColor" />
+ </color_swatch>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left_pad="5"
+ mouse_opaque="false"
+ name="text_box10"
+ top_delta="5"
+ width="95">
+ Direct
+ </text>
+ <color_swatch
+ can_apply_immediately="true"
color="LtYellow"
follows="left|top"
height="24"
@@ -275,7 +306,7 @@
height="12"
name="bubble_chat"
top_pad="20"
- width="450"
+ width="495"
>
Name tag background color (also affects Bubble Chat):
</text>
@@ -320,7 +351,7 @@
height="12"
name="floater_opacity"
top_pad="15"
- width="120"
+ width="200"
>
Floater Opacity:
</text>
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
index 9ecab1a356..f7666bdc4c 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
@@ -204,8 +204,7 @@
name="LocalLights"
top_pad="1"
width="256" />
- width="256" />
- <check_box
+ <check_box
control_name="VertexShaderEnable"
height="16"
initial_value="true"
@@ -724,7 +723,7 @@
follows="left|top"
height="12"
layout="topleft"
- left="358"
+ left="407"
left_pad="-30"
name="TerrainDetailText"
top="250"
@@ -736,7 +735,7 @@
draw_border="false"
height="38"
layout="topleft"
- left_delta="0"
+ left_delta="5"
name="TerrainDetailRadio"
top_pad="5"
width="70">
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 04412bdb9c..1a8aae7f91 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_move.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_move.xml
@@ -195,7 +195,7 @@
left="0"
name="radio_teleport"
top_delta="20"
- width="100" />
+ width="110" />
<radio_item
height="16"
label="Auto-pilot"
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 901a1257e0..e639f0dc9d 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_setup.xml
@@ -93,98 +93,6 @@
name="connection_port"
top_delta="3"
width="170" />
- <text
- type="string"
- length="1"
- follows="left|top"
- height="10"
- layout="topleft"
- left="80"
- mouse_opaque="false"
- name="cache_size_label_l"
- top_pad="20"
- width="200">
- Cache size
- </text>
- <slider
- can_edit_text="true"
- control_name="CacheSize"
- decimal_digits="0"
- follows="left|top"
- height="15"
- increment="16"
- initial_value="512"
- layout="topleft"
- left_delta="150"
- max_val="1024"
- min_val="32"
- name="cache_size"
- top_delta="-2"
- width="180" />
- <text
- type="string"
- length="1"
- follows="left|top"
- height="10"
- layout="topleft"
- left_pad="6"
- mouse_opaque="false"
- name="text_box5"
- top_delta="1"
- width="40">
- MB
- </text>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="10"
- layout="topleft"
- left="80"
- name="Cache location"
- top_delta="20"
- width="300">
- Cache location:
- </text>
- <line_editor
- control_name="CacheLocationTopFolder"
- border_style="line"
- border_thickness="1"
- follows="left|top"
- font="SansSerif"
- height="23"
- layout="topleft"
- left="80"
- max_length="4096"
- name="cache_location"
- top_pad="5"
- width="205" />
- <button
- follows="left|top"
- height="23"
- label="Browse"
- label_selected="Browse"
- layout="topleft"
- left_pad="5"
- name="set_cache"
- top_delta="-1"
- width="100">
- <button.commit_callback
- function="Pref.SetCache" />
- </button>
- <button
- follows="left|top"
- height="23"
- label="Reset"
- label_selected="Reset"
- layout="topleft"
- left_pad="3"
- name="reset_cache"
- top_delta="0"
- width="100">
- <button.commit_callback
- function="Pref.ResetCache" />
- </button>
<text
type="string"
@@ -360,7 +268,7 @@
height="23"
layout="topleft"
left_delta="50"
- top_pad="5"
+ top_pad="5"
name="updater_service_combobox"
width="300">
<combo_box.item
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml
index e374c89f21..1f92244eb9 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml
@@ -123,8 +123,8 @@
function="Pref.setControlFalse"
parameter="MuteAmbient" />
</slider>
- <button
- control_name="MuteAmbient"
+ <button
+ control_name="MuteAmbient"
disabled_control="MuteAudio"
follows="top|left"
height="16"
@@ -157,7 +157,7 @@
function="Pref.setControlFalse"
parameter="MuteSounds" />
</slider>
- <button
+ <button
control_name="MuteSounds"
disabled_control="MuteAudio"
follows="top|left"
@@ -169,7 +169,10 @@
left_pad="5"
name="mute_audio"
tab_stop="false"
- width="16" />
+ width="16">
+ <button.commit_callback
+ function="Pref.SetSounds"/>
+ </button>
<slider
control_name="AudioLevelMusic"
disabled_control="MuteAudio"
@@ -332,7 +335,17 @@
label="Play media attached to other avatars"
left="25"
width="230"/>
-
+ <check_box
+ name="gesture_audio_play_btn"
+ control_name="EnableGestureSounds"
+ disabled_control="MuteAudio"
+ value="true"
+ follows="left|bottom|right"
+ height="15"
+ tool_tip="Check this to hear sounds from gestures"
+ label="Play sounds from gestures"
+ top_pad="1"
+ left="25"/>
<text
type="string"
length="1"
@@ -341,7 +354,7 @@
layout="topleft"
left="25"
name="voice_chat_settings"
- width="180"
+ width="200"
top_pad="7">
Voice Chat Settings
</text>
@@ -372,7 +385,7 @@
height="18"
image_name="Move_Walk_Off"
layout="topleft"
- left_pad="170"
+ left_pad="170"
name="avatar_icon"
mouse_opaque="false"
visible="true"
@@ -483,8 +496,8 @@
filename="panel_sound_devices.xml"
visiblity_control="ShowDeviceSettings"
name="device_settings_panel"
- top="314"
- width="345"
+ top_pad="0"
+ width="480"
left="18"
class="panel_voice_device_settings"/>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_progress.xml b/indra/newview/skins/default/xui/en/panel_progress.xml
index 2868d91cc7..4535c56339 100644
--- a/indra/newview/skins/default/xui/en/panel_progress.xml
+++ b/indra/newview/skins/default/xui/en/panel_progress.xml
@@ -132,4 +132,12 @@
name="cancel_btn"
top="700"
width="90" />
+ <web_browser
+ follows="all"
+ layout="topleft"
+ left="0"
+ name="login_media_panel"
+ width="1024"
+ height="768"
+ top="0"/>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_region_environment.xml b/indra/newview/skins/default/xui/en/panel_region_environment.xml
new file mode 100644
index 0000000000..aa38c49fae
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_region_environment.xml
@@ -0,0 +1,149 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+
+<panel
+ border="true"
+ follows="top|left"
+ height="300"
+ label="Environment"
+ layout="topleft"
+ help_topic="panel_region_environment_tab"
+ name="panel_env_info"
+ width="530">
+ <text
+ name="water_settings_title"
+ follows="top|left"
+ height="30"
+ layout="topleft"
+ left="50"
+ top_pad="20"
+ width="430"
+ wrap="true">
+ Select the Water and Sky/Day Cycle Settings you would like all visitors to your region to see. More info
+ </text>
+ <view_border
+ bevel_style="none"
+ follows="top|left"
+ height="237"
+ layout="topleft"
+ left="50"
+ name="border"
+ top="60"
+ width="430"/>
+ <radio_group
+ follows="top|left"
+ height="45"
+ layout="topleft"
+ left_delta="10"
+ name="region_settings_radio_group"
+ top_delta="20"
+ width="200">
+ <radio_item
+ label="Use Second Life default"
+ layout="topleft"
+ name="use_sl_default_settings"/>
+ <radio_item
+ label="Use the following settings"
+ layout="topleft"
+ name="use_my_settings"
+ top_pad="20"/>
+ </radio_group>
+ <panel
+ follows="top|left"
+ height="150"
+ layout="topleft"
+ left="50"
+ name="user_environment_settings"
+ top_pad="20"
+ width="430">
+ <text
+ name="water_settings_title"
+ follows="top|left"
+ height="16"
+ layout="topleft"
+ left="50"
+ top_pad="0"
+ width="160">
+ Water Setting
+ </text>
+ <combo_box
+ follows="top|left"
+ left_pad="2"
+ name="water_settings_preset_combo"
+ top_delta="-7"
+ width="200">
+ <combo_box.item
+ label="-Select a preset-"
+ name="item0"/>
+ </combo_box>
+ <text
+ name="sky_dayc_settings_title"
+ follows="top|left"
+ height="16"
+ layout="topleft"
+ left="50"
+ top_pad="30"
+ width="100">
+ Sky / Day Cycle
+ </text>
+ <radio_group
+ layout="topleft"
+ left_delta="50"
+ name="sky_dayc_settings_radio_group"
+ top_pad="10"
+ height="50"
+ width="110">
+ <radio_item
+ layout="topleft"
+ label="Fixed sky"
+ name="my_sky_settings"/>
+ <radio_item
+ layout="topleft"
+ label="Day cycle"
+ name="my_dayc_settings"
+ top_pad="25"/>
+ </radio_group>
+ <combo_box
+ follows="top|left"
+ left_pad="2"
+ name="sky_settings_preset_combo"
+ top_delta="-7"
+ width="200">
+ <combo_box.item
+ label="-Select a preset-"
+ name="item0"/>
+ </combo_box>
+ <combo_box
+ follows="top|left"
+ name="dayc_settings_preset_combo"
+ top_delta="36"
+ width="200">
+ <combo_box.item
+ label="-Select a preset-"
+ name="item0"/>
+ </combo_box>
+ </panel>
+ <button
+ follows="left|top"
+ height="23"
+ label="Apply"
+ layout="topleft"
+ right="-160"
+ name="apply_btn"
+ top_pad="10"
+ width="100" />
+ <button
+ follows="left|top"
+ height="23"
+ label="Cancel"
+ layout="topleft"
+ left_pad="10"
+ name="cancel_btn"
+ width="100" />
+ <loading_indicator
+ height="23"
+ left="50"
+ name="progress_indicator"
+ top_delta="0"
+ visible="false"
+ width="23" />
+</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 1307d807e2..6b28639a77 100644
--- a/indra/newview/skins/default/xui/en/panel_region_estate.xml
+++ b/indra/newview/skins/default/xui/en/panel_region_estate.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
- border="false"
+ border="true"
follows="top|left"
height="510"
help_topic="panel_region_estate_tab"
@@ -20,7 +20,7 @@
name="estate_help_text"
top="14"
word_wrap="true"
- width="300">
+ >
Changes to settings on this tab will affect all regions in the estate.
</text>
<text
@@ -30,9 +30,10 @@
font="SansSerif"
height="20"
layout="topleft"
- left_delta="0"
+ right="160"
name="estate_text"
top_pad="2"
+ halign="right"
width="140">
Estate:
</text>
@@ -43,9 +44,9 @@
font="SansSerif"
height="20"
layout="topleft"
- left_delta="0"
+ top_delta="0"
name="estate_name"
- top_delta="16"
+ left_pad="6"
width="150">
(unknown)
</text>
@@ -56,9 +57,10 @@
font="SansSerif"
height="20"
layout="topleft"
- left_delta="0"
+ right="160"
name="owner_text"
- top_pad="2"
+ top_pad="6"
+ halign="right"
width="150">
Estate owner:
</text>
@@ -69,75 +71,68 @@
font="SansSerif"
height="20"
layout="topleft"
- left_delta="0"
+ top_delta="0"
name="estate_owner"
- top_delta="16"
+ left_pad="6"
use_ellipses="true"
width="290">
(unknown)
</text>
+
<view_border
- bevel_style="in"
+ bevel_style="none"
follows="top|left"
- height="270"
+ height="95"
layout="topleft"
- left_delta="-4"
+ left="10"
top_pad="5"
- width="300" />
+ width="470" />
+
<check_box
height="20"
- label="Use Global Time"
+ label="Allow Public Access"
layout="topleft"
- left="12"
- name="use_global_time_check"
- top="132"
+ left="20"
+ name="externally_visible_check"
+ top_delta="5"
width="200" />
+
<check_box
height="20"
- label="Fixed Sun"
- layout="topleft"
- left="12"
- name="fixed_sun_check"
- top="152"
- width="100" />
- <icon
- height="20"
- image_name="icon_day_cycle.tga"
+ label="Allow Voice Chat"
layout="topleft"
- left="47"
- name="daycycle"
- top="177"
- width="165" />
- <slider
- follows="left|top"
- height="20"
- increment="0.001"
- label="Phase"
- layout="topleft"
- left="12"
- max_val="30"
- min_val="6"
- name="sun_hour_slider"
- show_text="false"
- top="202"
+ left="280"
+ name="voice_chat_check"
+ top_delta="0"
width="200" />
<check_box
height="20"
- label="Allow Public Access"
+ label="Allow Direct Teleport"
layout="topleft"
left_delta="0"
- name="externally_visible_check"
- top_pad="6"
- width="200" />
+ name="allow_direct_teleport"
+ top_pad="4"
+ width="80" />
+ <button
+ enabled="false"
+ follows="left|top"
+ height="23"
+ label="Apply"
+ layout="topleft"
+ name="apply_btn"
+ top_pad="15"
+ left_delta="0"
+ width="97" />
+
<text
type="string"
length="1"
follows="top|left"
height="16"
layout="topleft"
- left="32"
+ left="20"
name="Only Allow"
- top="250"
+ top_delta="-30"
width="278">
Restrict Access to accounts verified by:
</text>
@@ -161,50 +156,6 @@
tool_tip="Ban Residents who have not verified their age. See the [SUPPORT_SITE] for more information."
top_pad="2"
width="278" />
- <check_box
- height="20"
- label="Allow Voice Chat"
- layout="topleft"
- left="12"
- name="voice_chat_check"
- top="304"
- width="200" />
- <check_box
- height="20"
- label="Allow Direct Teleport"
- layout="topleft"
- left="12"
- name="allow_direct_teleport"
- top_pad="4"
- width="80" />
- <button
- enabled="false"
- follows="left|top"
- height="23"
- label="Apply"
- layout="topleft"
- name="apply_btn"
- top_pad="10"
- left="110"
- width="97" />
- <button
- follows="left|top"
- height="23"
- label="Send Message To Estate..."
- layout="topleft"
- left="45"
- name="message_estate_btn"
- top_pad="20"
- width="220" />
- <button
- follows="left|top"
- height="23"
- label="Kick Resident from Estate..."
- layout="topleft"
- left="45"
- name="kick_user_from_estate_btn"
- top_pad="5"
- width="220" />
<text
type="string"
@@ -214,16 +165,31 @@
height="20"
layout="topleft"
name="estate_manager_label"
- right="520"
+ top_pad="30"
+ left="10"
width="200">
Estate Managers:
</text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="20"
+ layout="topleft"
+ left="280"
+ name="allow_resident_label"
+ top_delta="0"
+ width="200">
+ Allowed Residents:
+ </text>
+
+ <!-- Estate Managers box -->
<view_border
bevel_style="none"
follows="top|left"
height="71"
layout="topleft"
- right="520"
+ left="10"
top_pad="-5"
width="200" />
<name_list
@@ -235,43 +201,15 @@
name="estate_manager_name_list"
top_delta="0"
width="200" />
- <button
- follows="left|top"
- height="23"
- label="Remove..."
- layout="topleft"
- name="remove_estate_manager_btn"
- right="520"
- top_pad="5"
- width="97" />
- <button
- follows="left|top"
- height="23"
- label="Add..."
- layout="topleft"
- left_delta="-103"
- name="add_estate_manager_btn"
- top_delta="0"
- width="97" />
- <text
- type="string"
- length="1"
- follows="left|top"
- height="20"
- layout="topleft"
- left_delta="0"
- name="allow_resident_label"
- top_pad="10"
- width="200">
- Allowed Residents:
- </text>
+
+ <!-- Allowed Residents box -->
<view_border
bevel_style="none"
follows="top|left"
height="71"
layout="topleft"
- right="520"
- top_pad="-5"
+ left="280"
+ top_delta="0"
width="200" />
<name_list
follows="left|top"
@@ -282,42 +220,78 @@
name="allowed_avatar_name_list"
top_delta="0"
width="200" />
+
+ <!-- Estate Managers buttons -->
+ <button
+ follows="left|top"
+ height="23"
+ label="Add..."
+ layout="topleft"
+ left="10"
+ name="add_estate_manager_btn"
+ top_pad="6"
+ width="97" />
<button
follows="left|top"
height="23"
label="Remove..."
layout="topleft"
- name="remove_allowed_avatar_btn"
- right="520"
- top_pad="5"
+ name="remove_estate_manager_btn"
+ left_pad="6"
width="97" />
+
+ <!-- Allowed Residents buttons -->
<button
follows="left|top"
height="23"
+ left="280"
label="Add..."
layout="topleft"
- left_delta="-103"
name="add_allowed_avatar_btn"
top_delta="0"
width="97" />
+ <button
+ follows="left|top"
+ height="23"
+ label="Remove..."
+ layout="topleft"
+ name="remove_allowed_avatar_btn"
+ left_pad="6"
+ top_delta="0"
+ width="97" />
+
<text
type="string"
length="1"
follows="left|top"
height="20"
layout="topleft"
- left_delta="0"
+ left="10"
name="allow_group_label"
top_pad="10"
width="200">
Allowed Groups:
</text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="20"
+ layout="topleft"
+ left="280"
+ name="ban_resident_label"
+ top_delta="0"
+ width="200">
+ Banned Residents:
+ </text>
+
+ <!-- Allowed Groups box -->
<view_border
bevel_style="none"
follows="top|left"
height="71"
layout="topleft"
- right="520"
+ left="10"
top_pad="-5"
width="200" />
<name_list
@@ -329,43 +303,15 @@
name="allowed_group_name_list"
top_delta="0"
width="200" />
- <button
- follows="left|top"
- height="23"
- label="Remove..."
- layout="topleft"
- name="remove_allowed_group_btn"
- right="520"
- top_pad="5"
- width="97" />
- <button
- follows="left|top"
- height="23"
- label="Add..."
- layout="topleft"
- left_delta="-103"
- name="add_allowed_group_btn"
- top_delta="0"
- width="97" />
- <text
- type="string"
- length="1"
- follows="left|top"
- height="20"
- layout="topleft"
- left_delta="0"
- name="ban_resident_label"
- top_pad="10"
- width="200">
- Banned Residents:
- </text>
+
+ <!-- Banned Residents box -->
<view_border
bevel_style="none"
follows="top|left"
height="71"
layout="topleft"
- right="520"
- top_pad="-5"
+ left="280"
+ top_delta="0"
width="200" />
<name_list
follows="left|top"
@@ -376,22 +322,64 @@
name="banned_avatar_name_list"
top_delta="0"
width="200" />
+
+ <!-- Allowed Groups buttons -->
+ <button
+ follows="left|top"
+ height="23"
+ label="Add..."
+ layout="topleft"
+ left="10"
+ name="add_allowed_group_btn"
+ top_pad="6"
+ width="97" />
<button
follows="left|top"
height="23"
label="Remove..."
layout="topleft"
- name="remove_banned_avatar_btn"
- right="520"
- top_pad="5"
+ name="remove_allowed_group_btn"
+ left_pad="6"
+ top_delta="0"
width="97" />
+
+ <!-- Banned Residents buttons -->
<button
follows="left|top"
height="23"
label="Add..."
layout="topleft"
- left_delta="-103"
+ left="280"
name="add_banned_avatar_btn"
top_delta="0"
width="97" />
+ <button
+ follows="left|top"
+ height="23"
+ label="Remove..."
+ layout="topleft"
+ name="remove_banned_avatar_btn"
+ top_delta="0"
+ left_pad="6"
+ width="97" />
+
+ <button
+ follows="left|top"
+ height="23"
+ label="Send Message To Estate..."
+ layout="topleft"
+ left="10"
+ name="message_estate_btn"
+ top_pad="20"
+ width="220" />
+ <button
+ follows="left|top"
+ height="23"
+ label="Kick Resident from Estate..."
+ layout="topleft"
+ left="280"
+ name="kick_user_from_estate_btn"
+ top_delta="0"
+ width="220" />
+
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_region_general.xml b/indra/newview/skins/default/xui/en/panel_region_general.xml
index e0d9f3f714..3f9195d092 100644
--- a/indra/newview/skins/default/xui/en/panel_region_general.xml
+++ b/indra/newview/skins/default/xui/en/panel_region_general.xml
@@ -134,6 +134,7 @@
top="190"
width="80" />
<check_box
+ visible="FALSE"
height="20"
label="Allow Mesh Objects"
layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/panel_region_terrain.xml b/indra/newview/skins/default/xui/en/panel_region_terrain.xml
index d7a629e543..bbb8b40594 100644
--- a/indra/newview/skins/default/xui/en/panel_region_terrain.xml
+++ b/indra/newview/skins/default/xui/en/panel_region_terrain.xml
@@ -2,7 +2,7 @@
<panel
border="true"
follows="top|left"
- height="320"
+ height="460"
help_topic="panel_region_terrain_tab"
label="Terrain"
layout="topleft"
@@ -50,10 +50,10 @@
label="Terrain Raise Limit"
label_width="120"
layout="topleft"
- left="15"
+ left="240"
max_val="100"
name="terrain_raise_spin"
- top="60"
+ top="40"
width="180" />
<spinner
follows="left|top"
@@ -62,129 +62,336 @@
label="Terrain Lower Limit"
label_width="120"
layout="topleft"
- left="15"
+ left="240"
max_val="0"
min_val="-100"
name="terrain_lower_spin"
- top="80"
+ top="60"
width="180" />
- <check_box
+ <view_border
+ bevel_style="none"
+ follows="top|left"
+ height="60"
+ layout="topleft"
+ left="8"
+ top="30"
+ width="460" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
height="20"
- label="Use Estate Sun"
layout="topleft"
- left="250"
- name="use_estate_sun_check"
- top="35"
+ left="10"
+ name="detail_texture_text"
+ top="110"
+ width="300">
+ Terrain Textures (requires 512x512, 24 bit .tga files)
+ </text>
+ <texture_picker
+ follows="left|top"
+ height="100"
+ layout="topleft"
+ left_delta="0"
+ name="texture_detail_0"
+ top_delta="20"
width="100" />
- <check_box
- height="20"
- label="Fixed Sun"
+ <texture_picker
+ follows="left|top"
+ height="100"
+ layout="topleft"
+ left_pad="10"
+ name="texture_detail_1"
+ top_delta="0"
+ width="100" />
+ <texture_picker
+ follows="left|top"
+ height="100"
layout="topleft"
- left="250"
- name="fixed_sun_check"
- top="55"
+ left_pad="10"
+ name="texture_detail_2"
+ top_delta="0"
+ width="100" />
+ <texture_picker
+ follows="left|top"
+ height="100"
+ layout="topleft"
+ left_pad="10"
+ name="texture_detail_3"
+ top_delta="0"
width="100" />
- <icon
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
height="20"
- image_name="icon_day_cycle.tga"
layout="topleft"
- left="285"
- name="daycycle"
- top="80"
- width="165" />
- <slider
+ left="10"
+ name="height_text_lbl"
+ top_delta="90"
+ width="65">
+ 1 (Low)
+ </text>
+ <text
+ type="string"
+ length="1"
follows="left|top"
height="20"
- increment="0.001"
- label="Phase"
layout="topleft"
- left="250"
- max_val="30"
- min_val="6"
- name="sun_hour_slider"
- show_text="false"
- top="105"
- width="200" />
- <button
- enabled="false"
+ left_pad="45"
+ name="height_text_lbl2"
+ top_delta="0"
+ width="100">
+ 2
+ </text>
+ <text
+ type="string"
+ length="1"
follows="left|top"
height="20"
- label="Apply"
layout="topleft"
- left="350"
- name="apply_btn"
- top="135"
- width="90" />
- <combo_box
- height="23"
- layout="topleft"
- left="50"
- name="SkyPresetsCombo"
- top="165"
- width="150" />
- <combo_box
- height="23"
- layout="topleft"
- left="200"
- name="WaterPresetsCombo"
- top="165"
- width="150" />
- <button
- enabled="false"
+ left_pad="10"
+ name="height_text_lbl3"
+ top_delta="0"
+ width="100">
+ 3
+ </text>
+ <text
+ type="string"
+ length="1"
follows="left|top"
height="20"
- label="Apply"
layout="topleft"
- left="370"
- name="wes_apply_btn"
- top="165"
- width="90" />
- <button
- enabled="false"
+ left_pad="10"
+ name="height_text_lbl4"
+ top_delta="0"
+ width="100">
+ 4 (High)
+ </text>
+ <text
+ type="string"
+ length="1"
follows="left|top"
height="20"
- label="Edit Environment"
layout="topleft"
- left="370"
- name="env_editor_btn"
- top="195"
- width="120" />
- <view_border
- bevel_style="none"
- follows="top|left"
- height="130"
+ left="10"
+ name="height_text_lbl5"
+ top_delta="30"
+ width="300">
+ Texture Elevation Ranges
+ </text>
+ <text
+ follows="left|top"
+ height="20"
layout="topleft"
- left="8"
- top="30"
- width="460" />
+ left="10"
+ name="height_text_lbl10"
+ top_delta="30"
+ width="200"
+ word_wrap="true">
+ These values represent the blend range for the textures above.
+ </text>
+ <text
+ follows="left|top"
+ height="20"
+ layout="topleft"
+ left_delta="0"
+ name="height_text_lbl11"
+ top_delta="32"
+ width="200"
+ word_wrap="true">
+ Measured in meters, the LOW value is the MAXIMUM height of Texture #1, and the HIGH value is the MINIMUM height of Texture #4.
+ </text>
+ <text
+ follows="left|top"
+ height="20"
+ layout="topleft"
+ left="270"
+ name="height_text_lbl6"
+ top="250"
+ width="100">
+ Northwest
+ </text>
+ <text
+ follows="left|top"
+ height="20"
+ layout="topleft"
+ left_pad="10"
+ name="height_text_lbl7"
+ top_delta="0"
+ width="100">
+ Northeast
+ </text>
+<!-- northwest low-->
+ <spinner
+ follows="left|top"
+ height="20"
+ increment="0.5"
+ label="Low"
+ label_width="37"
+ layout="topleft"
+ left="230"
+ max_val="500"
+ min_val="-500"
+ name="height_start_spin_1"
+ top_delta="15"
+ width="100" />
+<!-- northeast low-->
+ <spinner
+ follows="left|top"
+ height="20"
+ increment="0.5"
+ label="Low"
+ label_width="37"
+ layout="topleft"
+ left_pad="10"
+ max_val="500"
+ min_val="-500"
+ name="height_start_spin_3"
+ top_delta="0"
+ width="100" />
+<!-- northwest high-->
+ <spinner
+ follows="left|top"
+ height="20"
+ increment="0.5"
+ label="High"
+ label_width="37"
+ layout="topleft"
+ left="230"
+ max_val="500"
+ min_val="-500"
+ name="height_range_spin_1"
+ top_delta="20"
+ width="100" />
+<!-- northeast high-->
+ <spinner
+ follows="left|top"
+ height="20"
+ increment="0.5"
+ label="High"
+ label_width="37"
+ layout="topleft"
+ left_pad="10"
+ max_val="500"
+ min_val="-500"
+ name="height_range_spin_3"
+ top_delta="0"
+ width="100" />
+ <text
+ follows="left|top"
+ height="20"
+ layout="topleft"
+ left="270"
+ name="height_text_lbl8"
+ top_pad="10"
+ width="100">
+ Southwest
+ </text>
+ <text
+ follows="left|top"
+ height="20"
+ layout="topleft"
+ left_pad="10"
+ name="height_text_lbl9"
+ top_delta="0"
+ width="100">
+ Southeast
+ </text>
+<!-- southwest low-->
+ <spinner
+ follows="left|top"
+ height="20"
+ increment="0.5"
+ label="Low"
+ label_width="37"
+ layout="topleft"
+ left="230"
+ max_val="500"
+ min_val="-500"
+ name="height_start_spin_0"
+ top_delta="15"
+ width="100" />
+<!-- southeast low-->
+ <spinner
+ follows="left|top"
+ height="20"
+ increment="0.5"
+ label="Low"
+ label_width="37"
+ layout="topleft"
+ left_pad="10"
+ max_val="500"
+ min_val="-500"
+ name="height_start_spin_2"
+ top_delta="0"
+ width="100" />
+<!--southwest high-->
+ <spinner
+ follows="left|top"
+ height="20"
+ increment="0.5"
+ label="High"
+ label_width="37"
+ layout="topleft"
+ left="230"
+ max_val="500"
+ min_val="-500"
+ name="height_range_spin_0"
+ top_delta="20"
+ width="100" />
+<!-- southeast high-->
+ <spinner
+ follows="left|top"
+ height="20"
+ increment="0.5"
+ label="High"
+ label_width="37"
+ layout="topleft"
+ left_pad="10"
+ max_val="500"
+ min_val="-500"
+ name="height_range_spin_2"
+ top_delta="0"
+ width="100" />
+<!-- Terrain Download/Upload/Bake buttons -->
<button
follows="left|top"
height="20"
label="Download RAW terrain..."
layout="topleft"
- left_delta="2"
+ left="10"
name="download_raw_btn"
tool_tip="Available only to estate owners, not managers"
- top_pad="60"
- width="170" />
+ top="390"
+ width="160" />
<button
follows="left|top"
height="20"
label="Upload RAW terrain..."
layout="topleft"
- left="10"
+ left_pad="10"
+ top_delta="0"
name="upload_raw_btn"
tool_tip="Available only to estate owners, not managers"
- top="243"
- width="170" />
+ width="160" />
<button
follows="left|top"
height="20"
label="Bake Terrain"
layout="topleft"
- left="10"
+ left_pad="10"
name="bake_terrain_btn"
tool_tip="Set current terrain as mid-point for raise/lower limits"
- top="283"
+ width="100" />
+ <button
+ enabled="true"
+ follows="left|top"
+ height="20"
+ label="Apply"
+ layout="topleft"
+ left_delta="0"
+ name="apply_btn"
+ top="430"
width="100" />
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_region_texture.xml b/indra/newview/skins/default/xui/en/panel_region_texture.xml
deleted file mode 100644
index 5d910ea659..0000000000
--- a/indra/newview/skins/default/xui/en/panel_region_texture.xml
+++ /dev/null
@@ -1,327 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel
- border="true"
- follows="top|left"
- height="320"
- help_topic="panel_region_texture_tab"
- label="Ground Textures"
- layout="topleft"
- left="0"
- name="Textures"
- top="320"
- width="480">
- <text
- type="string"
- length="1"
- follows="left|top"
- font="SansSerif"
- height="20"
- layout="topleft"
- left="10"
- name="region_text_lbl"
- top="10"
- width="100">
- Region:
- </text>
- <text
- type="string"
- length="1"
- follows="left|top"
- font="SansSerif"
- height="20"
- layout="topleft"
- left_delta="50"
- name="region_text"
- top_delta="0"
- width="400">
- unknown
- </text>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="20"
- layout="topleft"
- left="10"
- name="detail_texture_text"
- top="36"
- width="300">
- Terrain Textures (requires 512x512, 24 bit .tga files)
- </text>
- <texture_picker
- follows="left|top"
- height="100"
- layout="topleft"
- left_delta="0"
- name="texture_detail_0"
- top_delta="20"
- width="100" />
- <texture_picker
- follows="left|top"
- height="100"
- layout="topleft"
- left_pad="10"
- name="texture_detail_1"
- top_delta="0"
- width="100" />
- <texture_picker
- follows="left|top"
- height="100"
- layout="topleft"
- left_pad="10"
- name="texture_detail_2"
- top_delta="0"
- width="100" />
- <texture_picker
- follows="left|top"
- height="100"
- layout="topleft"
- left_pad="10"
- name="texture_detail_3"
- top_delta="0"
- width="100" />
- <text
- type="string"
- length="1"
- follows="left|top"
- height="20"
- layout="topleft"
- left="10"
- name="height_text_lbl"
- top="146"
- width="65">
- 1 (Low)
- </text>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="20"
- layout="topleft"
- left_pad="45"
- name="height_text_lbl2"
- top_delta="0"
- width="100">
- 2
- </text>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="20"
- layout="topleft"
- left_pad="10"
- name="height_text_lbl3"
- top_delta="0"
- width="100">
- 3
- </text>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="20"
- layout="topleft"
- left_pad="10"
- name="height_text_lbl4"
- top_delta="0"
- width="100">
- 4 (High)
- </text>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="20"
- layout="topleft"
- left="10"
- name="height_text_lbl5"
- top="170"
- width="300">
- Texture Elevation Ranges
- </text>
- <text
- follows="left|top"
- height="20"
- layout="topleft"
- left="51"
- name="height_text_lbl6"
- top="185"
- width="100">
- Northwest
- </text>
- <text
- follows="left|top"
- height="20"
- layout="topleft"
- left_pad="10"
- name="height_text_lbl7"
- top_delta="0"
- width="100">
- Northeast
- </text>
-<!-- northwest low-->
- <spinner
- follows="left|top"
- height="20"
- increment="0.5"
- label="Low"
- label_width="37"
- layout="topleft"
- left="10"
- max_val="500"
- min_val="-500"
- name="height_start_spin_1"
- top_delta="15"
- width="100" />
-<!-- northeast low-->
- <spinner
- follows="left|top"
- height="20"
- increment="0.5"
- label="Low"
- label_width="37"
- layout="topleft"
- left_pad="10"
- max_val="500"
- min_val="-500"
- name="height_start_spin_3"
- top_delta="0"
- width="100" />
-<!-- northwest high-->
- <spinner
- follows="left|top"
- height="20"
- increment="0.5"
- label="High"
- label_width="37"
- layout="topleft"
- left="10"
- max_val="500"
- min_val="-500"
- name="height_range_spin_1"
- top_delta="20"
- width="100" />
-<!-- northeast high-->
- <spinner
- follows="left|top"
- height="20"
- increment="0.5"
- label="High"
- label_width="37"
- layout="topleft"
- left_pad="10"
- max_val="500"
- min_val="-500"
- name="height_range_spin_3"
- top_delta="0"
- width="100" />
- <text
- follows="left|top"
- height="20"
- layout="topleft"
- left="51"
- name="height_text_lbl8"
- top_pad="10"
- width="100">
- Southwest
- </text>
- <text
- follows="left|top"
- height="20"
- layout="topleft"
- left_pad="10"
- name="height_text_lbl9"
- top_delta="0"
- width="100">
- Southeast
- </text>
-<!-- southwest low-->
- <spinner
- follows="left|top"
- height="20"
- increment="0.5"
- label="Low"
- label_width="37"
- layout="topleft"
- left="10"
- max_val="500"
- min_val="-500"
- name="height_start_spin_0"
- top_delta="15"
- width="100" />
-<!-- southeast low-->
- <spinner
- follows="left|top"
- height="20"
- increment="0.5"
- label="Low"
- label_width="37"
- layout="topleft"
- left_pad="10"
- max_val="500"
- min_val="-500"
- name="height_start_spin_2"
- top_delta="0"
- width="100" />
-<!--southwest high-->
- <spinner
- follows="left|top"
- height="20"
- increment="0.5"
- label="High"
- label_width="37"
- layout="topleft"
- left="10"
- max_val="500"
- min_val="-500"
- name="height_range_spin_0"
- top_delta="20"
- width="100" />
-<!-- southeast high-->
- <spinner
- follows="left|top"
- height="20"
- increment="0.5"
- label="High"
- label_width="37"
- layout="topleft"
- left_pad="10"
- max_val="500"
- min_val="-500"
- name="height_range_spin_2"
- top_delta="0"
- width="100" />
- <text
- follows="left|top"
- height="20"
- layout="topleft"
- left="10"
- name="height_text_lbl10"
- top_delta="30"
- width="400"
- word_wrap="true">
- These values represent the blend range for the textures above.
- </text>
- <text
- follows="left|top"
- height="20"
- layout="topleft"
- left_delta="0"
- name="height_text_lbl11"
- top_delta="32"
- width="400"
- word_wrap="true">
- Measured in meters, the LOW value is the MAXIMUM height of Texture #1, and the HIGH value is the MINIMUM height of Texture #4.
- </text>
- <button
- enabled="false"
- follows="left|bottom"
- height="20"
- label="Apply"
- layout="topleft"
- left="350"
- name="apply_btn"
- top="290"
- width="100" />
-</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_side_tray.xml b/indra/newview/skins/default/xui/en/panel_side_tray.xml
index 6ef93406ec..0f330a7b98 100644
--- a/indra/newview/skins/default/xui/en/panel_side_tray.xml
+++ b/indra/newview/skins/default/xui/en/panel_side_tray.xml
@@ -142,6 +142,7 @@
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"
diff --git a/indra/newview/skins/default/xui/en/panel_sound_devices.xml b/indra/newview/skins/default/xui/en/panel_sound_devices.xml
index ccae7c5350..0a20a4a965 100644
--- a/indra/newview/skins/default/xui/en/panel_sound_devices.xml
+++ b/indra/newview/skins/default/xui/en/panel_sound_devices.xml
@@ -7,33 +7,46 @@
layout="topleft"
name="device_settings_panel"
width="360">
- <panel.string
- name="default_text">
- Default
- </panel.string>
- <icon
- height="18"
- image_name="Microphone_On"
- left_delta="4"
- name="microphone_icon"
- mouse_opaque="false"
- top="7"
- layout="topleft"
- visible="true"
- width="18" />
- <text
+ <panel.string
+ name="default_text">
+ Default
+ </panel.string>
+ <icon
+ follows="left|top"
+ height="18"
+ image_name="Microphone_On"
+ left_delta="-5"
+ name="microphone_icon"
+ mouse_opaque="false"
+ top="7"
+ layout="topleft"
+ visible="true"
+ width="18" />
+ <icon
+ follows="left|top"
+ height="18"
+ image_name="Parcel_Voice_Dark"
+ layout="topleft"
+ left_pad="220"
+ name="speaker_icon"
+ mouse_opaque="false"
+ top_delta="0"
+ visible="true"
+ width="22" />
+ <text
type="string"
length="1"
- font.style="BOLD"
+ font.style="BOLD"
follows="left|top"
height="16"
layout="topleft"
- left_pad="3"
+ left_pad="-240"
+ top_delta="5"
name="Input"
- width="70">
- Input
- </text>
- <combo_box
+ width="60">
+ Input
+ </text>
+ <combo_box
height="23"
control_name="VoiceInputAudioDevice"
follows="left|top"
@@ -42,33 +55,57 @@
max_chars="128"
name="voice_input_device"
top_delta="-5"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top"
- height="16"
- layout="topleft"
- left_delta="-70"
- name="My volume label"
- top_pad="4"
- width="200">
- My volume:
- </text>
- <slider_bar
- control_name="AudioLevelMic"
- follows="top|right|left"
- height="17"
- increment="0.025"
- initial_value="1.0"
- layout="topleft"
- left_delta="-6"
- max_val="2"
- name="mic_volume_slider"
- tool_tip="Change the volume using this slider"
- top_pad="-1"
- width="220" />
- <text
+ width="150" />
+ <text
+ font.style="BOLD"
+ type="string"
+ length="1"
+ follows="left|top"
+ height="15"
+ layout="topleft"
+ left_pad="30"
+ name="Output"
+ top_delta="5"
+ width="60">
+ Output
+ </text>
+ <combo_box
+ control_name="VoiceOutputAudioDevice"
+ height="23"
+ follows="left|top"
+ layout="topleft"
+ left_pad="0"
+ max_chars="128"
+ name="voice_output_device"
+ top_delta="-4"
+ width="150" />
+ <text
+ type="string"
+ halign="left"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left_delta="-300"
+ name="My volume label"
+ top_pad="14"
+ width="200">
+ My volume:
+ </text>
+ <slider_bar
+ control_name="AudioLevelMic"
+ follows="top|right|left"
+ height="17"
+ increment="0.025"
+ initial_value="1.0"
+ layout="topleft"
+ left_delta="95"
+ max_val="2"
+ name="mic_volume_slider"
+ tool_tip="Change the volume using this slider"
+ top_pad="-18"
+ width="110" />
+ <text
type="string"
text_color="EmphasisColor"
length="1"
@@ -79,8 +116,8 @@
name="wait_text"
top_delta="-1"
width="110">
- Please wait
- </text>
+ Please wait
+ </text>
<locate
follows="right|top"
height="20"
@@ -121,35 +158,4 @@
name="bar4"
top_delta="0"
width="20" />
- <icon
- height="18"
- image_name="Parcel_Voice_Light"
- left="5"
- name="speaker_icon"
- mouse_opaque="false"
- top_pad="3"
- visible="true"
- width="22" />
- <text
- font.style="BOLD"
- type="string"
- length="1"
- follows="left|top"
- height="15"
- layout="topleft"
- left_pad="0"
- name="Output"
- width="70">
- Output
- </text>
- <combo_box
- control_name="VoiceOutputAudioDevice"
- height="23"
- follows="left|top"
- layout="topleft"
- left_pad="0"
- max_chars="128"
- name="voice_output_device"
- top_delta="-3"
- width="200" />
-</panel>
+</panel> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/en/panel_topinfo_bar.xml b/indra/newview/skins/default/xui/en/panel_topinfo_bar.xml
index 30d3064e14..79f29777ce 100644
--- a/indra/newview/skins/default/xui/en/panel_topinfo_bar.xml
+++ b/indra/newview/skins/default/xui/en/panel_topinfo_bar.xml
@@ -88,6 +88,16 @@
visible="false"
width="14"
/>
+ <icon
+ follows="right|top"
+ height="13"
+ image_name="Parcel_SeeAVsOff_Light"
+ left="2"
+ name="see_avatars_icon"
+ top="3"
+ visible="false"
+ width="14"
+ />
<text
follows="right|top"
font="SansSerifSmall"
diff --git a/indra/newview/skins/default/xui/en/sidepanel_inventory.xml b/indra/newview/skins/default/xui/en/sidepanel_inventory.xml
index 8997c1a6d7..79a0ec7c72 100644
--- a/indra/newview/skins/default/xui/en/sidepanel_inventory.xml
+++ b/indra/newview/skins/default/xui/en/sidepanel_inventory.xml
@@ -9,7 +9,7 @@
min_width="240"
name="objects panel"
width="333">
- <panel
+ <panel
follows="all"
layout="topleft"
left="0"
@@ -19,24 +19,226 @@
height="570"
visible="true"
width="330">
- <panel
- class="panel_main_inventory"
- filename="panel_main_inventory.xml"
- follows="all"
- layout="topleft"
- left="0"
- name="panel_main_inventory"
- top="0"
- label=""
- height="545"
- width="330" />
+ <layout_stack
+ follows="left|right|top|bottom"
+ layout="topleft"
+ left="0"
+ top="0"
+ orientation="vertical"
+ name="inventory_layout_stack"
+ height="535"
+ width="330">
+ <layout_panel
+ name="main_inventory_layout_panel"
+ min_dim="150"
+ width="330"
+ follows="bottom|left|right"
+ user_resize="false"
+ height="480">
+ <panel
+ class="panel_main_inventory"
+ filename="panel_main_inventory.xml"
+ follows="all"
+ layout="topleft"
+ left="0"
+ name="panel_main_inventory"
+ top="0"
+ label=""
+ height="480"
+ width="330" />
+ </layout_panel>
+ <layout_panel
+ width="330"
+ auto_resize="true"
+ user_resize="false"
+ follows="bottom|left|right"
+ name="inbox_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_inbox"
+ class="panel_marketplace_inbox"
+ top="0"
+ label=""
+ height="200"
+ width="330">
+ <string name="InboxLabelWithArg">Received Items ([NUM])</string>
+ <string name="InboxLabelNoArg">Received Items</string>
+ <button
+ label="Received Items"
+ name="inbox_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" />
+ <text
+ type="string"
+ length="1"
+ follows="right|top"
+ layout="topleft"
+ height="13"
+ top="10"
+ right="-20"
+ name="inbox_fresh_new_count"
+ font="SansSerifMedium"
+ halign="right"
+ text_color="EmphasisColor"
+ top_pad="0"
+ width="300">
+ [NUM] New
+ </text>
+ <panel
+ follows="all"
+ left="10"
+ bottom="200"
+ 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"
+ >
+ <text
+ name="inbox_inventory_placeholder"
+ type="string"
+ follows="all"
+ layout="topleft"
+ top="0"
+ left="0"
+ width="308"
+ height="165"
+ wrap="true"
+ halign="center">
+ Purchases from the marketplace will be delivered here.
+ </text>
+ </panel>
+ </panel>
+ </layout_panel>
+ <layout_panel
+ width="330"
+ auto_resize="true"
+ user_resize="false"
+ follows="bottom|left|right"
+ name="outbox_layout_panel"
+ visible="false"
+ min_dim="35"
+ max_dim="200"
+ expanded_min_dim="90"
+ height="200">
+ <panel
+ follows="all"
+ layout="topleft"
+ left="10"
+ name="marketplace_outbox"
+ class="panel_marketplace_outbox"
+ top="0"
+ label=""
+ height="200"
+ width="310">
+ <button
+ label="Merchant Outbox"
+ is_toggle="true"
+ handle_right_mouse="false"
+ name="outbox_btn"
+ follows="top|left|right"
+ image_unselected="MarketplaceBtn_Off"
+ image_selected="MarketplaceBtn_Selected"
+ height="35"
+ tab_stop="false"
+ width="308"
+ halign="left"
+ pad_left="35"
+ top="0"
+ left="0" />
+ <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"
+ tool_tip="Drag and drop items here to prepare them for sale on your storefront"
+ >
+ <text
+ name="outbox_inventory_placeholder"
+ type="string"
+ follows="all"
+ layout="topleft"
+ top="0"
+ left="0"
+ width="308"
+ height="165"
+ wrap="true"
+ halign="center">
+ Set up your merchant account to use this feature.
+ </text>
+ </panel>
+ </panel>
+ </layout_panel>
+ </layout_stack>
<panel
follows="bottom|left|right"
- height="25"
+ height="30"
layout="topleft"
name="button_panel"
left="9"
- top_pad="-2"
+ top_pad="7"
width="308">
<layout_stack
follows="bottom|left|right"
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index 2eb3cd7397..f4acb08255 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -18,6 +18,7 @@
<string name="StartupClearingCache">Clearing cache...</string>
<string name="StartupInitializingTextureCache">Initializing Texture Cache...</string>
<string name="StartupInitializingVFS">Initializing VFS...</string>
+ <string name="StartupRequireDriverUpdate">Graphics Initialization Failed. Please Update Your Graphics Driver!</string>
<!-- progress -->
<string name="ProgressRestoring">Restoring...</string>
@@ -43,6 +44,8 @@
<string name="LoginInitializingQuicktime">Initializing QuickTime...</string>
<string name="LoginQuicktimeNotFound">QuickTime not found - unable to initialize.</string>
<string name="LoginQuicktimeOK">QuickTime initialized successfully.</string>
+ <string name="LoginRequestSeedCapGrant">Requesting region capabilities...</string>
+ <string name="LoginRetrySeedCapGrant">Requesting region capabilities, attempt [NUMBER]...</string>
<string name="LoginWaitingForRegionHandshake">Waiting for region handshake...</string>
<string name="LoginConnectingToRegion">Connecting to region...</string>
<string name="LoginDownloadingClothing">Downloading clothing...</string>
@@ -58,6 +61,83 @@
<string name="Quit">Quit</string>
<string name="create_account_url">http://join.secondlife.com/</string>
+ <string name="LoginFailedViewerNotPermitted">
+The viewer you are using can no longer access Second Life. Please visit the following page to download a new viewer:
+http://secondlife.com/download
+
+For more information, see our FAQ below:
+http://secondlife.com/viewer-access-faq</string>
+ <string name="LoginIntermediateOptionalUpdateAvailable">Optional viewer update available: [VERSION]</string>
+ <string name="LoginFailedRequiredUpdate">Required viewer update: [VERSION]</string>
+ <string name="LoginFailedAlreadyLoggedIn">This agent is already logged in.
+</string>
+ <string name="LoginFailedAuthenticationFailed">Sorry! We couldn't log you in.
+Please check to make sure you entered the right
+ * Username (like bobsmith12 or steller.sunshine)
+ * Password
+Also, please make sure your Caps Lock key is off.</string>
+ <string name="LoginFailedPasswordChanged">As a security precaution your password has been changed.
+Please go to your account page at http://secondlife.com/password
+and answer the security question to reset your password.
+We are very sorry for the inconvenience.</string>
+ <string name="LoginFailedPasswordReset">We made some changes to our system and you will need to reset your password.
+Please go to your account page at http://secondlife.com/password
+and answer the security question to reset your password.
+We are very sorry for the inconvenience.</string>
+ <string name="LoginFailedEmployeesOnly">Second Life is temporarily closed for maintenance.
+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
+support@secondlife.com.</string>
+ <string name="LoginFailedAcountSuspended">Your account is not accessible until
+[TIME] Pacific Time.</string>
+ <string name="LoginFailedAccountDisabled">We are unable to complete your request at this time.
+Please contact Second Life support for assistance at http://secondlife.com/support.
+If you are unable to change your password, please call (866) 476-9763.</string>
+ <string name="LoginFailedTransformError">Data inconsistency found during login.
+Please contact support@secondlife.com.</string>
+ <string name="LoginFailedAccountMaintenance">Your account is undergoing minor maintenance.
+Your account is not accessible until
+[TIME] Pacific Time.
+If you feel this is an error, please contact support@secondlife.com.</string>
+ <string name="LoginFailedPendingLogoutFault">Request for logout responded with a fault from simulator.</string>
+ <string name="LoginFailedPendingLogout">The system is logging you out right now.
+Your Account will not be available until
+[TIME] Pacific Time.</string>
+ <string name="LoginFailedUnableToCreateSession">Unable to create valid session.</string>
+ <string name="LoginFailedUnableToConnectToSimulator">Unable to connect to a simulator.</string>
+ <string name="LoginFailedRestrictedHours">Your account can only access Second Life
+between [START] and [END] Pacific Time.
+Please come back during those hours.
+If you feel this is an error, please contact support@secondlife.com.</string>
+ <string name="LoginFailedIncorrectParameters">Incorrect parameters.
+If you feel this is an error, please contact support@secondlife.com.</string>
+ <string name="LoginFailedFirstNameNotAlphanumeric">First name parameter must be alphanumeric.
+If you feel this is an error, please contact support@secondlife.com.</string>
+ <string name="LoginFailedLastNameNotAlphanumeric">Last name parameter must be alphanumeric.
+If you feel this is an error, please contact support@secondlife.com.</string>
+ <string name="LogoutFailedRegionGoingOffline">Region is going offline.
+Please try logging in again in a minute.</string>
+ <string name="LogoutFailedAgentNotInRegion">Agent not in region.
+Please try logging in again in a minute.</string>
+ <string name="LogoutFailedPendingLogin">The region was logging in another session.
+Please try logging in again in a minute.</string>
+ <string name="LogoutFailedLoggingOut">The region was logging out the previous session.
+Please try logging in again in a minute.</string>
+ <string name="LogoutFailedStillLoggingOut">The region is still logging out the previous session.
+Please try logging in again in a minute.</string>
+ <string name="LogoutSucceeded">Region has logged out last session.
+Please try logging in again in a minute.</string>
+ <string name="LogoutFailedLogoutBegun">Region has begun the logout process.
+Please try logging in again in a minute.</string>
+ <string name="LoginFailedLoggingOutSession">The system has begun logging out your last session.
+Please try logging in again in a minute.</string>
+
+
<!-- Disconnection -->
<string name="AgentLostConnection">This region may be experiencing trouble. Please check your connection to the Internet.</string>
<string name="SavingSettings">Saving your settings...</string>
@@ -1682,10 +1762,10 @@ integer llGetParcelMaxPrims(vector pos, integer sim_wide)
Returns the maximum number of prims allowed on the parcel at pos
</string>
<string name="LSLTipText_llGetParcelDetails" translate="false">
-list llGetParcelDetails(vector pos, list params)
-Returns the parcel details specified in params for the parcel at pos.
-Params is one or more of: PARCEL_DETAILS_NAME, _DESC, _OWNER, _GROUP, _AREA
- </string>
+ list llGetParcelDetails(vector pos, list params)
+ Returns the parcel details specified in params for the parcel at pos.
+ Params is one or more of: PARCEL_DETAILS_NAME, _DESC, _OWNER, _GROUP, _AREA, _ID, _SEE_AVATARS
+ </string>
<string name="LSLTipText_llSetLinkPrimitiveParams" translate="false">
llSetLinkPrimitiveParams(integer linknumber, list rules)
Sets primitive parameters for linknumber based on rules
@@ -1831,6 +1911,15 @@ Requests single-word username of an avatar. When data is available the dataserv
key llRequestDisplayName(key id)
Requests name of an avatar. When data is available the dataserver event will be raised.
</string>
+<string name="LSLTipText_llRegionSayTo" translate="false">
+llRegionSayTo(key target, integer channel, string msg)
+Sends msg on channel (not DEBUG_CHANNEL) directly to prim or avatar target anywhere within the region
+</string>
+<string name="LSLTipText_llGetEnv" translate="false">
+llGetEnv(string name)
+Returns a string with the requested data about the region
+</string>
+
<!-- Avatar busy/away mode -->
<string name="AvatarSetNotAway">Not Away</string>
@@ -1935,6 +2024,8 @@ Requests name of an avatar. When data is available the dataserver event will be
<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="InventoryOutboxNoItems">Drag items here in preparation for listing on your marketplace storefront.</string>
<!-- use value="" because they have preceding spaces -->
<string name="no_transfer" value=" (no transfer)" />
<string name="no_modify" value=" (no modify)" />
@@ -1981,7 +2072,6 @@ Requests name of an avatar. When data is available the dataserver event will be
<!-- inventory folder -->
<string name="InvFolder My Inventory">My Inventory</string>
- <string name="InvFolder My Favorites">My Favorites</string>
<string name="InvFolder Library">Library</string>
<string name="InvFolder Textures">Textures</string>
<string name="InvFolder Sounds">Sounds</string>
@@ -2001,10 +2091,10 @@ Requests name of an avatar. When data is available the dataserver event will be
<string name="InvFolder Uncompressed Sounds">Uncompressed Sounds</string>
<string name="InvFolder Animations">Animations</string>
<string name="InvFolder Gestures">Gestures</string>
- <string name="InvFolder Favorite">Favorites</string>
+ <string name="InvFolder Favorite">My Favorites</string>
<!-- historically default name of the Favorites folder can start from either "f" or "F" letter.
We should localize both of them with the same value -->
- <string name="InvFolder favorite">Favorites</string>
+ <string name="InvFolder favorite">My Favorites</string>
<string name="InvFolder Current Outfit">Current Outfit</string>
<string name="InvFolder Initial Outfits">Initial Outfits</string>
<string name="InvFolder My Outfits">My Outfits</string>
@@ -2015,6 +2105,8 @@ Requests name of an avatar. When data is available the dataserver event will be
<string name="InvFolder Friends">Friends</string>
<string name="InvFolder All">All</string>
+ <string name="no_attachments">No attachments worn</string>
+
<!-- inventory FVBridge -->
<!-- This is used in llpanelinventory.cpp when constructing a context menu for an item for Sale -->
<string name="Buy">Buy</string>
@@ -2162,6 +2254,9 @@ Requests name of an avatar. When data is available the dataserver event will be
<string name="IMMainland">mainland</string>
<string name="IMTeen">teen</string>
+ <!-- floater about land -->
+ <string name="Anyone">anyone</string>
+
<!-- floater region info -->
<!-- The following will replace variable [ALL_ESTATES] in notifications EstateAllowed*, EstateBanned*, EstateManager* -->
<string name="RegionInfoError">error</string>
@@ -2264,6 +2359,10 @@ Requests name of an avatar. When data is available the dataserver event will be
<string name="GroupOwned">Group Owned</string>
<string name="Public">Public</string>
+ <!-- Environment settings -->
+ <string name="LocalSettings">Local Settings</string>
+ <string name="RegionSettings">Region Settings</string>
+
<!-- panel classified -->
<string name="ClassifiedClicksTxt">Clicks: [TELEPORT] teleport, [MAP] map, [PROFILE] profile</string>
<string name="ClassifiedUpdateAfterPublish">(will update after publish)</string>
@@ -3045,6 +3144,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<string name="LocationCtrlAdultIconTooltip">Adult Region</string>
<string name="LocationCtrlModerateIconTooltip">Moderate Region</string>
<string name="LocationCtrlGeneralIconTooltip">General Region</string>
+ <string name="LocationCtrlSeeAVsTooltip">Avatars visible and chat allowed outside of this parcel</string>
<!-- Strings used by the (currently Linux) auto-updater app -->
<string name="UpdaterWindowTitle">
diff --git a/indra/newview/skins/default/xui/en/widgets/badge.xml b/indra/newview/skins/default/xui/en/widgets/badge.xml
new file mode 100644
index 0000000000..f77c4b7178
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/widgets/badge.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<!-- Additional attributes:
+ -->
+<badge border_image="Badge_Border"
+ border_color="BadgeBorderColor"
+ font="SansSerifSmall"
+ image="Badge_Background"
+ image_color="BadgeImageColor"
+ label_color="BadgeLabelColor"
+ location="top_left"
+ location_percent_hcenter="85"
+ location_percent_vcenter="85"
+ padding_horiz="7"
+ padding_vert="4"
+ requests_front="true"
+ >
+</badge>
diff --git a/indra/newview/skins/default/xui/en/widgets/button.xml b/indra/newview/skins/default/xui/en/widgets/button.xml
index 16241ed84e..302014eb24 100644
--- a/indra/newview/skins/default/xui/en/widgets/button.xml
+++ b/indra/newview/skins/default/xui/en/widgets/button.xml
@@ -25,5 +25,6 @@
pad_bottom="3"
height="23"
scale_image="true"
+ handle_right_mouse="true"
use_draw_context_alpha="true">
</button>
diff --git a/indra/newview/skins/default/xui/en/widgets/inbox_folder_view_folder.xml b/indra/newview/skins/default/xui/en/widgets/inbox_folder_view_folder.xml
new file mode 100644
index 0000000000..2c987b158d
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/widgets/inbox_folder_view_folder.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<inbox_folder_view_folder
+ folder_arrow_image="Folder_Arrow"
+ folder_indentation="8"
+ item_height="20"
+ item_top_pad="4"
+ selection_image="Rounded_Square"
+ >
+ <new_badge label="New" location="right" location_percent_hcenter="70" />
+</inbox_folder_view_folder>
diff --git a/indra/newview/skins/default/xui/en/widgets/inbox_inventory_panel.xml b/indra/newview/skins/default/xui/en/widgets/inbox_inventory_panel.xml
new file mode 100644
index 0000000000..830c27bdac
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/widgets/inbox_inventory_panel.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<inbox_inventory_panel show_load_status="false" />
diff --git a/indra/newview/skins/default/xui/en/widgets/inventory_panel.xml b/indra/newview/skins/default/xui/en/widgets/inventory_panel.xml
index 93875d66e6..00f4c43915 100644
--- a/indra/newview/skins/default/xui/en/widgets/inventory_panel.xml
+++ b/indra/newview/skins/default/xui/en/widgets/inventory_panel.xml
@@ -3,4 +3,12 @@
bg_opaque_color="InventoryBackgroundColor"
background_visible="true"
background_opaque="true"
- />
+ show_load_status="true"
+ >
+ <scroll
+ name="Inventory Scroller"
+ follows="all"
+ reserve_scroll_corner="true"
+ tab_stop="true"
+ />
+</panel>
diff --git a/indra/newview/skins/default/xui/en/widgets/location_input.xml b/indra/newview/skins/default/xui/en/widgets/location_input.xml
index 37d60f1671..44436fb6f2 100644
--- a/indra/newview/skins/default/xui/en/widgets/location_input.xml
+++ b/indra/newview/skins/default/xui/en/widgets/location_input.xml
@@ -123,6 +123,14 @@
font="SansSerifSmall"
text_color="TextFgColor"
/>
+ <see_avatars_icon
+ name="see_avatars_icon"
+ width="22"
+ height="18"
+ top="21"
+ follows="right|top"
+ image_name="Parcel_SeeAVsOff_Light"
+ />
<combo_button
name="Location History"
label=""
diff --git a/indra/newview/skins/default/xui/en/widgets/panel.xml b/indra/newview/skins/default/xui/en/widgets/panel.xml
index 9bf99fa363..47a210d9b7 100644
--- a/indra/newview/skins/default/xui/en/widgets/panel.xml
+++ b/indra/newview/skins/default/xui/en/widgets/panel.xml
@@ -10,4 +10,5 @@
bg_alpha_image_overlay="White"
background_visible="false"
background_opaque="false"
- chrome="false"/> \ No newline at end of file
+ chrome="false"
+ accepts_badge="true"/> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/en/widgets/time.xml b/indra/newview/skins/default/xui/en/widgets/time.xml
new file mode 100644
index 0000000000..b5bdd564a6
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/widgets/time.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<time text_enabled_color="LabelTextColor"
+ text_disabled_color="LabelDisabledColor"
+ font="SansSerifSmall"
+ label_width="40" >
+ <time.up_button name="SpinCtrl Up"
+ image_unselected="Stepper_Up_Off"
+ image_selected="Stepper_Up_Press"
+ tab_stop="false"
+ follows="left|bottom" />
+ <time.down_button name="SpinCtrl Down"
+ image_unselected="Stepper_Down_Off"
+ image_selected="Stepper_Down_Press"
+ tab_stop="false"
+ follows="left|bottom" />
+</time>
diff --git a/indra/newview/skins/default/xui/es/floater_about.xml b/indra/newview/skins/default/xui/es/floater_about.xml
index bb845e1ee0..125eb79d04 100644
--- a/indra/newview/skins/default/xui/es/floater_about.xml
+++ b/indra/newview/skins/default/xui/es/floater_about.xml
@@ -56,26 +56,32 @@ Gracias a estos Residentes por ayudarnos a estar seguros de que, con todo, esta
<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
- 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.
+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.
- Voice chat Audio coding: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)
+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.
+
+Reservados todos los derechos. Consulta las licencias en .txt si deseas obtener más información.
+
+Codificación de sonido 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 3df0f92842..1c4b965f46 100644
--- a/indra/newview/skins/default/xui/es/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/es/floater_about_land.xml
@@ -82,7 +82,7 @@ Vaya al menú Mundo &gt; Acerca del terreno o seleccione otra parcela para ver s
Calificación:
</text>
<text name="ContentRatingText">
- &apos;Adult&apos;
+ Adulto
</text>
<text name="Owner:">
Propietario:
@@ -107,13 +107,13 @@ Vaya al menú Mundo &gt; Acerca del terreno o seleccione otra parcela para ver s
<text name="For sale to">
En venta a: [BUYER]
</text>
- <text name="Sell with landowners objects in parcel." width="216">
- Los objetos se incluyen en la venta.
+ <text name="Sell with landowners objects in parcel.">
+ Objetos incluidos en la venta
</text>
- <text name="Selling with no objects in parcel." width="216">
+ <text name="Selling with no objects in parcel.">
Los objetos no se incluyen en la venta.
</text>
- <button bottom="-245" font="SansSerifSmall" label="Cancelar la venta del terreno" label_selected="Cancelar la venta del terreno" left="275" name="Cancel Land Sale"/>
+ <button label="Cancelar la venta del terreno" label_selected="Cancelar la venta del terreno" name="Cancel Land Sale"/>
<text name="Claimed:">
Reclamada:
</text>
@@ -133,7 +133,7 @@ Vaya al menú Mundo &gt; Acerca del terreno o seleccione otra parcela para ver s
0
</text>
<button label="Comprar terreno" left="130" name="Buy Land..." width="125"/>
- <button label="Información del script" name="Scripts..."/>
+ <button label="Información de scripts" name="Scripts..."/>
<button label="Comprar para el grupo" name="Buy For Group..."/>
<button label="Comprar un pase" left="130" name="Buy Pass..." tool_tip="Un pase le da acceso temporal a este terreno." width="125"/>
<button label="Abandonar el terreno" name="Abandon Land..."/>
@@ -187,7 +187,7 @@ Vaya al menú Mundo &gt; Acerca del terreno o seleccione otra parcela para ver s
Calificación:
</text>
<text name="region_maturity_text">
- &apos;Adult&apos;
+ Adulto
</text>
<text name="resellable_lbl">
Revender:
@@ -288,16 +288,16 @@ Sólo las parcelas más grandes pueden listarse en la búsqueda.
Esta opción no esta activada porque usted no puede modificar las opciones de la parcela.
</panel.string>
<panel.string name="mature_check_mature">
- Contenido &apos;Mature&apos;
+ Contenido Moderado
</panel.string>
<panel.string name="mature_check_adult">
- Contenido &apos;Adult&apos;
+ Contenido Adulto
</panel.string>
<panel.string name="mature_check_mature_tooltip">
- La información o el contenido de su parcela se considera &apos;Mature&apos;.
+ La información o el contenido de su parcela se considera Moderado.
</panel.string>
<panel.string name="mature_check_adult_tooltip">
- La información o el contenido de su parcela se considera &apos;Adult&apos;.
+ La información o el contenido de su parcela se considera Adulto.
</panel.string>
<panel.string name="landing_point_none">
(ninguno)
@@ -337,7 +337,7 @@ Sólo las parcelas más grandes pueden listarse en la búsqueda.
<combo_box name="land category with adult">
<combo_box.item label="Cualquier categoría" name="item0"/>
<combo_box.item label="Localización Linden" name="item1"/>
- <combo_box.item label="&apos;Adult&apos;" name="item2"/>
+ <combo_box.item label="Adulto" name="item2"/>
<combo_box.item label="Arte y Cultura" name="item3"/>
<combo_box.item label="Negocios" name="item4"/>
<combo_box.item label="Educativo" name="item5"/>
@@ -365,7 +365,7 @@ Sólo las parcelas más grandes pueden listarse en la búsqueda.
<combo_box.item label="Terreno en alquiler" name="item13"/>
<combo_box.item label="Otra" name="item12"/>
</combo_box>
- <check_box label="Contenido &apos;Mature&apos;" name="MatureCheck" tool_tip=""/>
+ <check_box label="Contenido Moderado" name="MatureCheck" tool_tip=""/>
<text name="Snapshot:">
Foto:
</text>
diff --git a/indra/newview/skins/default/xui/es/floater_buy_contents.xml b/indra/newview/skins/default/xui/es/floater_buy_contents.xml
index 98604ad5f4..3563d4bd0f 100644
--- a/indra/newview/skins/default/xui/es/floater_buy_contents.xml
+++ b/indra/newview/skins/default/xui/es/floater_buy_contents.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_buy_contents" title="COMPRAR LOS CONTENIDOS">
<text name="contains_text">
- [NAME] contiene:
+ &lt;nolink&gt;[NOMBRE]&lt;/nolink&gt; contiene:
</text>
<text name="buy_text">
¿Comprar por [AMOUNT] L$ a [NAME]?
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 a8fa030846..43bbf0b70f 100644
--- a/indra/newview/skins/default/xui/es/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/es/floater_buy_currency.xml
@@ -18,7 +18,7 @@
<text name="balance_amount">
[AMT] L$
</text>
- <text name="currency_action" width="50">
+ <text name="currency_action">
Quiero comprar
</text>
<text name="currency_label">
@@ -51,8 +51,9 @@
<text name="exchange_rate_note">
Vuelve a escribir la cantidad para ver el tipo de cambio más reciente.
</text>
- <text name="purchase_warning_repurchase" right="-10">
- Confirmando que con esta compra sólo se compran L$, no el objeto.
+ <text name="purchase_warning_repurchase">
+ Confirmando que con esta compra sólo se compran L$,
+no el objeto.
</text>
<text name="purchase_warning_notenough">
No estás comprando suficientes L$. Por favor, aumenta la cantidad.
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 74243a4d06..9d33b69de9 100644
--- a/indra/newview/skins/default/xui/es/floater_buy_land.xml
+++ b/indra/newview/skins/default/xui/es/floater_buy_land.xml
@@ -129,25 +129,25 @@ para cubrir esta parcela.
<text name="region_name_label">
Región:
</text>
- <text left="565" name="region_name_text">
+ <text name="region_name_text">
(desconocida)
</text>
<text name="region_type_label">
Tipo:
</text>
- <text left="565" name="region_type_text">
+ <text name="region_type_text">
(desconocido)
</text>
<text name="estate_name_label">
Estado:
</text>
- <text left="565" name="estate_name_text">
+ <text name="estate_name_text">
(desconocido)
</text>
- <text name="estate_owner_label" right="565" width="115">
+ <text name="estate_owner_label">
Propietario del estado:
</text>
- <text left="565" name="estate_owner_text">
+ <text name="estate_owner_text">
(desconocido)
</text>
<text name="resellable_changeable_label">
diff --git a/indra/newview/skins/default/xui/es/floater_camera.xml b/indra/newview/skins/default/xui/es/floater_camera.xml
index ccf3d4bf91..04f743b659 100644
--- a/indra/newview/skins/default/xui/es/floater_camera.xml
+++ b/indra/newview/skins/default/xui/es/floater_camera.xml
@@ -13,7 +13,7 @@
Modos de cámara
</floater.string>
<floater.string name="pan_mode_title">
- Orbital - Zoom - Panóramica
+ Orbital - Zoom - Panorámica
</floater.string>
<floater.string name="presets_mode_title">
Vistas predefinidas
@@ -42,7 +42,7 @@
<panel name="camera_modes_list">
<panel_camera_item name="object_view">
<panel_camera_item.text name="object_view_text">
- Vista de objeto
+ Vista objetiva
</panel_camera_item.text>
</panel_camera_item>
<panel_camera_item name="mouselook_view">
@@ -59,7 +59,7 @@
</panel>
<panel name="buttons">
<button label="" name="presets_btn" tool_tip="Vistas predefinidas"/>
- <button label="" name="pan_btn" tool_tip="Orbital - Zoom - Panóramica"/>
+ <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/default/xui/es/floater_customize.xml b/indra/newview/skins/default/xui/es/floater_customize.xml
deleted file mode 100644
index 77b670d5f0..0000000000
--- a/indra/newview/skins/default/xui/es/floater_customize.xml
+++ /dev/null
@@ -1,530 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater customize" title="APARIENCIA">
- <tab_container name="customize tab container">
- <text label="Partes del cuerpo" name="body_parts_placeholder">
- Partes del cuerpo
- </text>
- <panel label="Forma" name="Shape">
- <button label="Restablecer" label_selected="Restablecer" name="Revert"/>
- <button label="Cuerpo" label_selected="Cuerpo" name="Body"/>
- <button label="Cabeza" label_selected="Cabeza" name="Head"/>
- <button label="Ojos" label_selected="Ojos" name="Eyes"/>
- <button label="Orejas" label_selected="Orejas" name="Ears"/>
- <button label="Nariz" label_selected="Nariz" name="Nose"/>
- <button label="Boca" label_selected="Boca" name="Mouth"/>
- <button label="Barbilla" label_selected="Barbilla" name="Chin"/>
- <button label="Torso" label_selected="Torso" name="Torso"/>
- <button label="Piernas" label_selected="Piernas" name="Legs"/>
- <radio_group name="sex radio">
- <radio_item label="Mujer" name="radio" value="0"/>
- <radio_item label="Varón" name="radio2" value="1"/>
- </radio_group>
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: no modificable
- </text>
- <text name="title_loading">
- [DESC]: cargando...
- </text>
- <text name="title_not_worn">
- [DESC]: no lleva
- </text>
- <text name="path">
- Situada en [PATH]
- </text>
- <text name="not worn instructions">
- Ponte una anatomía nueva arrastrándola desde tu inventario hasta tu avatar. O bien puedes crear una nueva partiendo de cero.
- </text>
- <text name="no modify instructions">
- No tiene permiso para modificar este ítem.
- </text>
- <text name="Item Action Label">
- Forma:
- </text>
- <button label="Crear una forma nueva" label_selected="Crear una forma nueva" name="Create New"/>
- <button label="Guardar" label_selected="Guardar" name="Save"/>
- <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
- </panel>
- <panel label="Piel" name="Skin">
- <button label="Color de piel" label_selected="Color de piel" name="Skin Color" width="115"/>
- <button label="Detalles faciales" label_selected="Detalles faciales" name="Face Detail" width="115"/>
- <button label="Maquillaje" label_selected="Maquillaje" name="Makeup" width="115"/>
- <button label="Detalles del cuerpo" label_selected="Detalles del cuerpo" name="Body Detail" width="115"/>
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: no modificable
- </text>
- <text name="title_loading">
- [DESC]: cargando...
- </text>
- <text name="title_not_worn">
- [DESC]: no lleva
- </text>
- <text name="path">
- Situada en [PATH]
- </text>
- <text name="not worn instructions">
- Ponte una piel nueva arrastrándola desde tu inventario hasta tu avatar. O bien puedes crear una nueva partiendo de cero.
- </text>
- <text name="no modify instructions">
- No tiene permiso para modificar este ítem.
- </text>
- <text name="Item Action Label" right="107">
- Piel:
- </text>
- <texture_picker label="Tatuaje: cabeza" name="Head Tattoos" tool_tip="Pulse para elegir una imagen" width="90"/>
- <texture_picker label="Tatuaje: superior" name="Upper Tattoos" tool_tip="Pulse para elegir una imagen" width="90"/>
- <texture_picker label="Tatuaje: inferior" name="Lower Tattoos" tool_tip="Pulse para elegir una imagen" width="90"/>
- <button label="Crear una piel nueva" label_selected="Crear una piel nueva" name="Create New"/>
- <button label="Guardar" label_selected="Guardar" left="113" name="Save"/>
- <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
- <button label="Restablecer" label_selected="Restablecer" name="Revert"/>
- </panel>
- <panel label="Pelo" name="Hair">
- <button label="Color" label_selected="Color" name="Color"/>
- <button label="Peinado" label_selected="Peinado" name="Style"/>
- <button label="Cejas" label_selected="Cejas" name="Eyebrows"/>
- <button label="Facial" label_selected="Facial" name="Facial"/>
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: no modificable
- </text>
- <text name="title_loading">
- [DESC]: cargando...
- </text>
- <text name="title_not_worn">
- [DESC]: no lleva
- </text>
- <text name="path">
- Situado en [PATH]
- </text>
- <text name="not worn instructions">
- Ponte un pelo nuevo arrastrándolo desde tu inventario hasta tu avatar. O bien puedes crear uno nuevo partiendo de cero.
- </text>
- <text name="no modify instructions">
- No tiene permiso para modificar este ítem.
- </text>
- <text name="Item Action Label" right="107">
- Pelo:
- </text>
- <texture_picker label="Textura" name="Texture" tool_tip="Pulse para elegir una imagen"/>
- <button label="Crear un pelo nuevo" label_selected="Crear un pelo nuevo" name="Create New"/>
- <button label="Guardar" label_selected="Guardar" left="113" name="Save"/>
- <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
- <button label="Restablecer" label_selected="Restablecer" name="Revert"/>
- </panel>
- <panel label="Ojos" name="Eyes">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: no modificables
- </text>
- <text name="title_loading">
- [DESC]: cargando...
- </text>
- <text name="title_not_worn">
- [DESC]: no lleva
- </text>
- <text name="path">
- Situados en [PATH]
- </text>
- <text name="not worn instructions">
- Ponte unos ojos nuevos arrastrándolos desde tu inventario hasta tu avatar. O bien puedes crear unos nuevos partiendo de cero.
- </text>
- <text name="no modify instructions">
- No tiene permiso para modificar este ítem.
- </text>
- <text name="Item Action Label" right="107">
- Ojos:
- </text>
- <texture_picker label="Iris" name="Iris" tool_tip="Pulse para elegir una imagen"/>
- <button label="Crear unos ojos nuevos" label_selected="Crear unos ojos nuevos" name="Create New"/>
- <button label="Guardar" label_selected="Guardar" left="113" name="Save"/>
- <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
- <button label="Restablecer" label_selected="Restablecer" name="Revert"/>
- </panel>
- <text label="Ropa" name="clothes_placeholder">
- Ropas
- </text>
- <panel label="Camisa" name="Shirt">
- <texture_picker label="Tela" name="Fabric" tool_tip="Pulse para elegir una imagen"/>
- <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/>
- <button label="Quitarla" label_selected="Quitarla" name="Take Off"/>
- <button label="Crear una falda nueva" label_selected="Crear una falda nueva" name="Create New"/>
- <button label="Guardar" label_selected="Guardar" left="113" name="Save"/>
- <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
- <button label="Restablecer" label_selected="Restablecer" name="Revert"/>
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: no modificable
- </text>
- <text name="title_loading">
- [DESC]: cargando...
- </text>
- <text name="title_not_worn">
- [DESC]: no lleva
- </text>
- <text name="path">
- Situada en [PATH]
- </text>
- <text name="not worn instructions">
- Ponte una camisa nueva arrastrándola desde tu inventario hasta tu avatar. O bien puedes crear una nueva partiendo de cero.
- </text>
- <text name="no modify instructions">
- No tiene permiso para modificar este ítem.
- </text>
- <text name="Item Action Label" right="107">
- Camisa:
- </text>
- </panel>
- <panel label="Pantalones" name="Pants">
- <texture_picker label="Tela" name="Fabric" tool_tip="Pulse para elegir una imagen"/>
- <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/>
- <button label="Quitarlos" label_selected="Quitarlos" name="Take Off"/>
- <button label="Crear unos pantalones nuevos" label_selected="Crear unos pantalones nuevos" name="Create New" width="185"/>
- <button label="Guardar" label_selected="Guardar" left="113" name="Save"/>
- <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
- <button label="Restablecer" label_selected="Restablecer" name="Revert"/>
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: no modificables
- </text>
- <text name="title_loading">
- [DESC]: cargando...
- </text>
- <text name="title_not_worn">
- [DESC]: no lleva
- </text>
- <text name="path">
- Situados en [PATH]
- </text>
- <text name="not worn instructions">
- Ponte unos pantalones nuevos arrastrándolos desde tu inventario hasta tu avatar. O bien puedes crear unos nuevos partiendo de cero.
- </text>
- <text name="no modify instructions">
- No tiene permiso para modificar este ítem.
- </text>
- <text name="Item Action Label" right="107">
- Pantalones:
- </text>
- </panel>
- <panel label="Zapatos" name="Shoes">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: no modificables
- </text>
- <text name="title_loading">
- [DESC]: cargando...
- </text>
- <text name="title_not_worn">
- [DESC]: no lleva
- </text>
- <text name="path">
- Situados en [PATH]
- </text>
- <text name="not worn instructions">
- Ponte unos zapatos nuevos arrastrándolos desde tu inventario hasta tu avatar. O bien puedes crear unos nuevos partiendo de cero.
- </text>
- <button label="Crear unos zapatos nuevos" label_selected="Crear unos zapatos nuevos" name="Create New"/>
- <text name="no modify instructions">
- No tiene permiso para modificar este ítem.
- </text>
- <text name="Item Action Label" right="107">
- Zapatos:
- </text>
- <texture_picker label="Tela" name="Fabric" tool_tip="Pulse para elegir una imagen"/>
- <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/>
- <button label="Quitarlos" label_selected="Quitarlos" name="Take Off"/>
- <button label="Guardar" label_selected="Guardar" left="113" name="Save"/>
- <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
- <button label="Restablecer" label_selected="Restablecer" name="Revert"/>
- </panel>
- <panel label="Calcetines" name="Socks">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: no modificables
- </text>
- <text name="title_loading">
- [DESC]: cargando...
- </text>
- <text name="title_not_worn">
- [DESC]: no lleva
- </text>
- <text name="path">
- Situados en [PATH]
- </text>
- <text name="not worn instructions">
- Ponte unos calcetines nuevos arrastrándolos desde tu inventario hasta tu avatar. O bien puedes crear unos nuevos partiendo de cero.
- </text>
- <button label="Crear unos calcetines nuevos" label_selected="Crear unos calcetines nuevos" name="Create New" width="185"/>
- <text name="no modify instructions">
- No tiene permiso para modificar este ítem.
- </text>
- <text name="Item Action Label" right="107">
- Calcetines:
- </text>
- <texture_picker label="Tela" name="Fabric" tool_tip="Pulse para elegir una imagen"/>
- <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/>
- <button label="Quitarlos" label_selected="Quitarlos" name="Take Off"/>
- <button label="Guardar" label_selected="Guardar" left="113" name="Save"/>
- <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
- <button label="Restablecer" label_selected="Restablecer" name="Revert"/>
- </panel>
- <panel label="Chaqueta" name="Jacket">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: no modificable
- </text>
- <text name="title_loading">
- [DESC]: cargando...
- </text>
- <text name="title_not_worn">
- [DESC]: no lleva
- </text>
- <text name="path">
- Situada en [PATH]
- </text>
- <text name="not worn instructions">
- Ponte una chaqueta nueva arrastrándola desde tu inventario hasta tu avatar. O bien puedes crear una nueva partiendo de cero.
- </text>
- <button label="Crear una chaqueta nueva" label_selected="Crear una chaqueta nueva" name="Create New"/>
- <text name="no modify instructions">
- No tiene permiso para modificar este ítem.
- </text>
- <text name="Item Action Label" right="107">
- Chaqueta:
- </text>
- <texture_picker label="Tela superior" name="Upper Fabric" tool_tip="Pulse para elegir una imagen"/>
- <texture_picker label="Tela inferior" name="Lower Fabric" tool_tip="Pulse para elegir una imagen"/>
- <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/>
- <button label="Quitarla" label_selected="Quitarla" name="Take Off"/>
- <button label="Guardar" label_selected="Guardar" left="113" name="Save"/>
- <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
- <button label="Restablecer" label_selected="Restablecer" name="Revert"/>
- </panel>
- <panel label="Guantes" name="Gloves">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: no modificables
- </text>
- <text name="title_loading">
- [DESC]: cargando...
- </text>
- <text name="title_not_worn">
- [DESC]: no lleva
- </text>
- <text name="path">
- Situados en [PATH]
- </text>
- <text name="not worn instructions">
- Ponte unos guantes nuevos arrastrándolos desde tu inventario hasta tu avatar. O bien puedes crear unos nuevos partiendo de cero.
- </text>
- <button label="Crear unos guantes nuevos" label_selected="Crear unos guantes nuevos" name="Create New"/>
- <text name="no modify instructions">
- No tiene permiso para modificar este ítem.
- </text>
- <text name="Item Action Label" right="107">
- Guantes:
- </text>
- <texture_picker label="Tela" name="Fabric" tool_tip="Pulse para elegir una imagen"/>
- <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/>
- <button label="Quitarlos" label_selected="Quitarlos" name="Take Off"/>
- <button label="Guardar" label_selected="Guardar" left="113" name="Save"/>
- <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
- <button label="Restablecer" label_selected="Restablecer" name="Revert"/>
- </panel>
- <panel label="Camiseta" name="Undershirt">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: no modificable
- </text>
- <text name="title_loading">
- [DESC]: cargando...
- </text>
- <text name="title_not_worn">
- [DESC]: no lleva
- </text>
- <text name="path">
- Situada en [PATH]
- </text>
- <text name="not worn instructions">
- Ponte una camiseta nueva arrastrándola desde tu inventario hasta tu avatar. O bien puedes crear una nueva partiendo de cero.
- </text>
- <button label="Crear una camiseta nueva" label_selected="Crear una camiseta nueva" name="Create New"/>
- <text name="no modify instructions">
- No tiene permiso para modificar este ítem.
- </text>
- <text name="Item Action Label" right="107">
- Camiseta:
- </text>
- <texture_picker label="Tela" name="Fabric" tool_tip="Pulse para elegir una imagen"/>
- <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/>
- <button label="Quitarla" label_selected="Quitarla" name="Take Off"/>
- <button label="Guardar" label_selected="Guardar" left="113" name="Save"/>
- <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
- <button label="Restablecer" label_selected="Restablecer" name="Revert"/>
- </panel>
- <panel label="Ropa interior" name="Underpants">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: no modificable
- </text>
- <text name="title_loading">
- [DESC]: cargando...
- </text>
- <text name="title_not_worn">
- [DESC]: no lleva
- </text>
- <text name="path">
- Situada en [PATH]
- </text>
- <text name="not worn instructions">
- Ponte una ropa interior nueva arrastrándola desde tu inventario hasta tu avatar. O bien puedes crear una nueva partiendo de cero.
- </text>
- <button label="Crear una ropa interior nueva" label_selected="Crear una ropa interior nueva" name="Create New" width="185"/>
- <text name="no modify instructions">
- No tiene permiso para modificar este ítem.
- </text>
- <text name="Item Action Label" right="107">
- Ropa interior:
- </text>
- <texture_picker label="Tela" name="Fabric" tool_tip="Pulse para elegir una imagen"/>
- <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/>
- <button label="Quitarla" label_selected="Quitarla" name="Take Off"/>
- <button label="Guardar" label_selected="Guardar" left="113" name="Save"/>
- <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
- <button label="Restablecer" label_selected="Restablecer" name="Revert"/>
- </panel>
- <panel label="Falda" name="Skirt">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: no modificable
- </text>
- <text name="title_loading">
- [DESC]: cargando...
- </text>
- <text name="title_not_worn">
- [DESC]: no lleva
- </text>
- <text name="path">
- Situada en [PATH]
- </text>
- <text name="not worn instructions">
- Ponte una falda nueva arrastrándola desde tu inventario hasta tu avatar. O bien puedes crear una nueva partiendo de cero.
- </text>
- <button label="Crear una falda nueva" label_selected="Crear una falda nueva" name="Create New"/>
- <text name="no modify instructions">
- No tiene permiso para modificar este ítem.
- </text>
- <text name="Item Action Label" right="107">
- Falda:
- </text>
- <texture_picker label="Tela" name="Fabric" tool_tip="Pulse para elegir una imagen"/>
- <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/>
- <button label="Quitarla" label_selected="Quitarla" name="Take Off"/>
- <button label="Guardar" label_selected="Guardar" left="113" name="Save"/>
- <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
- <button label="Restablecer" label_selected="Restablecer" name="Revert"/>
- </panel>
- <panel label="Tatuaje" name="Tattoo">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: no modificable
- </text>
- <text name="title_loading">
- [DESC]: cargando...
- </text>
- <text name="title_not_worn">
- [DESC]: no puesto
- </text>
- <text name="path">
- Situado en [PATH]
- </text>
- <text name="not worn instructions">
- Pon un tatuaje nuevo arrastrándolo desde tu inventario a tu avatar. O bien puedes crear uno nuevo partiendo de cero.
- </text>
- <button label="Crear un tatuaje nuevo" label_selected="Crear un tatuaje nuevo" name="Create New"/>
- <text name="no modify instructions">
- No tienes permiso para modificar este artículo.
- </text>
- <text name="Item Action Label">
- Tatuaje:
- </text>
- <texture_picker label="Tatuaje de la cabeza" name="Head Tattoo" tool_tip="Pulsa para elegir una imagen"/>
- <texture_picker label="Tatuaje superior" name="Upper Tattoo" tool_tip="Pulsa para elegir una imagen"/>
- <texture_picker label="Tatuaje inferior" name="Lower Tattoo" tool_tip="Pulsa para elegir una imagen"/>
- <button label="Quitarme" label_selected="Quitarme" name="Take Off"/>
- <button label="Guardar" label_selected="Guardar" name="Save"/>
- <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
- <button label="Revertir" label_selected="Revertir" name="Revert"/>
- </panel>
- <panel label="Alfa" name="Alpha">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: no modificable
- </text>
- <text name="title_loading">
- [DESC]: cargando...
- </text>
- <text name="title_not_worn">
- [DESC]: no puesto
- </text>
- <text name="path">
- Situado en [PATH]
- </text>
- <text name="not worn instructions">
- Pon una capa Alfa nueva arrastrándola desde tu inventario a tu avatar. O bien puedes crear una nueva partiendo de cero.
- </text>
- <button label="Crear una capa Alfa nueva" label_selected="Crear una capa Alfa nueva" name="Create New"/>
- <text name="no modify instructions">
- No tienes permiso para modificar este artículo.
- </text>
- <text name="Item Action Label">
- Alfa:
- </text>
- <texture_picker label="Alfa inferior" name="Lower Alpha" tool_tip="Pulsa para elegir una imagen"/>
- <texture_picker label="Alfa superior" name="Upper Alpha" tool_tip="Pulsa para elegir una imagen"/>
- <texture_picker label="Alfa de la cabeza" name="Head Alpha" tool_tip="Pulsa para elegir una imagen"/>
- <texture_picker label="Alfa de los ojos" name="Eye Alpha" tool_tip="Pulsa para elegir una imagen"/>
- <texture_picker label="Alfa del pelo" name="Hair Alpha" tool_tip="Pulsa para elegir una imagen"/>
- <button label="Quitarme" label_selected="Quitarme" name="Take Off"/>
- <button label="Guardar" label_selected="Guardar" name="Save"/>
- <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
- <button label="Revertir" label_selected="Revertir" name="Revert"/>
- </panel>
- </tab_container>
- <scroll_container name="panel_container"/>
- <button label="Información del script" label_selected="Información del script" name="script_info" tool_tip="Mostrar los scripts anexados a tu avatar"/>
- <button label="Hacer un vestuario" label_selected="Hacer un vestuario" name="make_outfit_btn"/>
- <button label="Cancelar" label_selected="Cancelar" name="Cancel"/>
- <button label="OK" label_selected="OK" name="Ok"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/es/floater_day_cycle_options.xml
deleted file mode 100644
index 9c3ac1be0e..0000000000
--- a/indra/newview/skins/default/xui/es/floater_day_cycle_options.xml
+++ /dev/null
@@ -1,94 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Day Cycle Floater" title="EDITOR DEL CICLO DE UN DÃA">
- <tab_container name="Day Cycle Tabs">
- <panel label="Ciclo de un día" name="Day Cycle">
- <button label="?" name="WLDayCycleHelp"/>
- <text name="WL12am">
- 12 am
- </text>
- <text name="WL3am">
- 3 am
- </text>
- <text name="WL6am">
- 6 am
- </text>
- <text name="WL9amHash">
- 9 am
- </text>
- <text name="WL12pmHash">
- 12 pm
- </text>
- <text name="WL3pm">
- 3 pm
- </text>
- <text name="WL6pm">
- 6 pm
- </text>
- <text name="WL9pm">
- 9 pm
- </text>
- <text name="WL12am2">
- 12 am
- </text>
- <text name="WL12amHash">
- |
- </text>
- <text name="WL3amHash">
- I
- </text>
- <text name="WL6amHash">
- |
- </text>
- <text name="WL9amHash2">
- I
- </text>
- <text name="WL12pmHash2">
- |
- </text>
- <text name="WL3pmHash">
- I
- </text>
- <text name="WL6pmHash">
- |
- </text>
- <text name="WL9pmHash">
- I
- </text>
- <text name="WL12amHash2">
- |
- </text>
- <button label="Añadir un punto" label_selected="Añadir un punto" name="WLAddKey"/>
- <button label="Quitar un punto" label_selected="Quitar un punto" name="WLDeleteKey"/>
- <text name="WLCurKeyFrameText">
- Configuración del fotograma clave:
- </text>
- <text name="WLCurKeyTimeText">
- Hora clave:
- </text>
- <spinner label="Hora" name="WLCurKeyHour"/>
- <spinner label="Min." name="WLCurKeyMin"/>
- <text name="WLCurKeyTimeText2">
- Modelo predefinido:
- </text>
- <combo_box label="Predefinido" name="WLKeyPresets"/>
- <text name="DayCycleText">
- Intervalo:
- </text>
- <combo_box label="5 min." name="WLSnapOptions"/>
- <text name="DayCycleText2">
- Duración del ciclo:
- </text>
- <spinner label="Hora" name="WLLengthOfDayHour"/>
- <spinner label="Min." name="WLLengthOfDayMin"/>
- <spinner label="Seg." name="WLLengthOfDaySec"/>
- <text name="DayCycleText3">
- Vista previa:
- </text>
- <button label="Probar" label_selected="Probar" name="WLAnimSky"/>
- <button label="Parar" label_selected="Parar" name="WLStopAnimSky"/>
- <button label="Usar el horario del estado" label_selected="Ir al horario del estado" name="WLUseLindenTime"/>
- <button label="Guardar este tipo de día" label_selected="Guardar este tipo de día" name="WLSaveDayCycle"/>
- <button label="Cargar y probar un tipo de día" label_selected="Cargar y probar un tipo de día" name="WLLoadDayCycle"/>
- </panel>
- </tab_container>
-</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_env_settings.xml b/indra/newview/skins/default/xui/es/floater_env_settings.xml
deleted file mode 100644
index 195690f546..0000000000
--- a/indra/newview/skins/default/xui/es/floater_env_settings.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Environment Editor Floater" title="EDITOR DEL ENTORNO">
- <floater.string name="timeStr">
- [hour12,datetime,utc]:[min,datetime,utc] [ampm,datetime,utc]
- </floater.string>
- <text name="EnvTimeText">
- Duración de
-un día
- </text>
- <text name="EnvTimeText2">
- 12:00 PM
- </text>
- <text name="EnvCloudText">
- Nubosidad
- </text>
- <text name="EnvWaterColorText">
- Color del
-agua
- </text>
- <color_swatch label="" name="EnvWaterColor" tool_tip="Pulsa para abrir el selector de color"/>
- <text name="EnvWaterFogText">
- Claridad del
-agua
- </text>
- <button bottom="-144" label="Usar el horario del estado" name="EnvUseEstateTimeButton" width="155"/>
- <button label="Cielo avanzado" left="167" name="EnvAdvancedSkyButton" width="155"/>
- <button label="Agua avanzada" left="326" name="EnvAdvancedWaterButton" width="155"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_help_browser.xml b/indra/newview/skins/default/xui/es/floater_help_browser.xml
index ec3c38e8c7..5ebd7ad6e0 100644
--- a/indra/newview/skins/default/xui/es/floater_help_browser.xml
+++ b/indra/newview/skins/default/xui/es/floater_help_browser.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_help_browser" title="BUSCADOR DE AYUDA">
+<floater name="floater_help_browser" title="BUSCAR EN LA AYUDA">
<floater.string name="loading_text">
Cargando...
</floater.string>
diff --git a/indra/newview/skins/default/xui/es/floater_import_collada.xml b/indra/newview/skins/default/xui/es/floater_import_collada.xml
new file mode 100644
index 0000000000..7e9a00797a
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_import_collada.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Import Collada" title="Importar escena">
+ <text name="mesh count">
+ Redes: [RECUENTO]
+ </text>
+ <text name="texture count">
+ Texturas: [RECUENTO]
+ </text>
+ <text name="status">
+ Estado: [ESTADO]
+ </text>
+ <button label="Cancelar" name="cancel"/>
+ <button label="OK" name="ok"/>
+ <string name="status_idle">
+ Inactivo
+ </string>
+ <string name="status_uploading">
+ Cargando [NOMBRE]
+ </string>
+ <string name="status_creating">
+ Creando objeto [NOMBRE]
+ </string>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/es/floater_inventory_view_finder.xml
index c9d639d8cf..6004034504 100644
--- a/indra/newview/skins/default/xui/es/floater_inventory_view_finder.xml
+++ b/indra/newview/skins/default/xui/es/floater_inventory_view_finder.xml
@@ -5,6 +5,7 @@
<check_box label="Ropa" name="check_clothing"/>
<check_box label="Gestos" name="check_gesture"/>
<check_box label="Hitos" name="check_landmark"/>
+ <check_box label="Redes" name="check_mesh"/>
<check_box label="Notas" name="check_notecard"/>
<check_box label="Objetos" name="check_object"/>
<check_box label="Scripts" name="check_script"/>
@@ -14,11 +15,11 @@
<button label="Todos" label_selected="Todo" name="All"/>
<button label="Ninguno" label_selected="Nada" name="None"/>
<check_box label="Mostrar siempre las carpetas" name="check_show_empty"/>
- <check_box label="Desde el fin de sesión" name="check_since_logoff" bottom_delta="-36"/>
+ <check_box bottom_delta="-36" label="Desde el fin de sesión" name="check_since_logoff"/>
<text name="- OR -">
- o -
</text>
<spinner label="horas atrás" name="spin_hours_ago"/>
<spinner label="días atrás" name="spin_days_ago"/>
- <button label="Cerrar" label_selected="Cerrar" name="Close" bottom_delta="-30"/>
+ <button bottom_delta="-30" label="Cerrar" label_selected="Cerrar" name="Close"/>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_model_preview.xml b/indra/newview/skins/default/xui/es/floater_model_preview.xml
new file mode 100644
index 0000000000..6208db75f9
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_model_preview.xml
@@ -0,0 +1,231 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Model Preview" title="Cargar modelo">
+ <string name="status_idle">
+ Inactivo
+ </string>
+ <string name="status_reading_file">
+ Cargando...
+ </string>
+ <string name="status_generating_meshes">
+ Generando redes...
+ </string>
+ <string name="status_vertex_number_overflow">
+ Error: El número de intersección es superior a 65534. Cancelado.
+ </string>
+ <string name="high">
+ Alto
+ </string>
+ <string name="medium">
+ Media
+ </string>
+ <string name="low">
+ Bajo
+ </string>
+ <string name="lowest">
+ Mínimo
+ </string>
+ <string name="mesh_status_good">
+ Factúralo.
+ </string>
+ <string name="mesh_status_na">
+ N/A
+ </string>
+ <string name="mesh_status_none">
+ Ninguno
+ </string>
+ <string name="mesh_status_submesh_mismatch">
+ Los niveles de detalle poseen un número distinto de caras a las que se pueden aplicar texturas.
+ </string>
+ <string name="mesh_status_mesh_mismatch">
+ Los niveles de detalle poseen un número distinto de ejemplos de red.
+ </string>
+ <string name="mesh_status_too_many_vertices">
+ El nivel de detalle posee demasiadas intersecciones.
+ </string>
+ <string name="mesh_status_missing_lod">
+ Falta un nivel de detalle requerido.
+ </string>
+ <string name="layer_all">
+ Todo
+ </string>
+ <string name="decomposing">
+ Analizando...
+ </string>
+ <string name="simplifying">
+ Simplificando...
+ </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>
+ <panel>
+ <text name="streaming cost">
+ Coste de recursos: [COSTE]
+ </text>
+ <text name="physics cost">
+ Coste físico: [COSTE]
+ </text>
+ <text name="upload fee">
+ Cuota de carga: N/A
+ </text>
+ </panel>
+ <text name="status">
+ [ESTADO]
+ </text>
+ <button label="Valores predeterminados" name="reset_btn" tool_tip="Restablecer valores predeterminados"/>
+ <button label="Subir" name="ok_btn" tool_tip="Cargar al simulador"/>
+ <button label="Cancelar" name="cancel_btn"/>
+ <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:
+ </text>
+ <text name="share_tolderance_text">
+ Tolerancia de uso compartido:
+ </text>
+ <combo_box name="border_mode">
+ <combo_item name="border_unlock">
+ Desbloquear
+ </combo_item>
+ <combo_item name="border_lock">
+ Lock
+ </combo_item>
+ </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"/>
+ </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>
+ <panel name="physics info">
+ <slider label="Ampliación de vista previa:" name="physics_explode"/>
+ <text name="physics_triangles">
+ Triángulos: [TRIÃNGULOS]
+ </text>
+ <text name="physics_points">
+ Intersecciones: [PUNTOS]
+ </text>
+ <text name="physics_hulls">
+ Aspecto exterior: [ASPECTO EXTERIOR]
+ </text>
+ </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
+ </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>
+</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
new file mode 100644
index 0000000000..019c2d3829
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_model_wizard.xml
@@ -0,0 +1,241 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Model Wizard" title="CARGAR ASISTENTE DE MODELO">
+ <button label="5. Subir" name="upload_btn"/>
+ <button label="4. Revisar" name="review_btn"/>
+ <button label="3. Física" name="physics2_btn"/>
+ <button label="3. Física" name="physics_btn"/>
+ <button label="2. Optimizar" name="optimize_btn"/>
+ <button label="1. Seleccionar archivo" name="choose_file_btn"/>
+ <panel name="choose_file_panel">
+ <panel name="header_panel">
+ <text name="header_text">
+ Cargar modelo
+ </text>
+ </panel>
+ <text name="description">
+ Este asistente te ayudará a importar modelos de redes en Second Life. En primer lugar, especifica un archivo que contenga el modelo que desees importar. Second Life es compatible con los archivos de COLLADA (.dae).
+ </text>
+ <panel name="content">
+ <text name="Cache location">
+ Nombre del archivo:
+ </text>
+ <button label="Examinar..." label_selected="Examinar..." name="browse"/>
+ <text name="dimensions">
+ X: Y: Z:
+ </text>
+ <text name="dimension_dividers">
+ | |
+ </text>
+ </panel>
+ </panel>
+ <panel name="optimize_panel">
+ <panel name="header_panel">
+ <text name="header_text">
+ Optimizar
+ </text>
+ </panel>
+ <text name="description">
+ Este asistente ha optimizado tu modelo con el fin de mejorar el rendimiento. Puedes ajustar los resultados del proceso de optimización a continuación o hacer clic en Siguiente para continuar.
+ </text>
+ <panel name="content">
+ <text name="high_detail_text">
+ Generar nivel de detalle: Alto
+ </text>
+ <text name="medium_detail_text">
+ Generar nivel de detalle: Media
+ </text>
+ <text name="low_detail_text">
+ Generar nivel de detalle: Bajo
+ </text>
+ <text name="lowest_detail_text">
+ Generar nivel de detalle: Mínimo
+ </text>
+ </panel>
+ <panel name="content2">
+ <text name="lod_label">
+ Vista previa de modelo:
+ </text>
+ <combo_box name="preview_lod_combo2" tool_tip="Nivel de detalle disponible en la vista previa">
+ <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="streaming cost">
+ Coste de recursos: [COSTE]
+ </text>
+ <text name="dimensions">
+ X: Y: Z:
+ </text>
+ <text name="dimension_dividers">
+ | |
+ </text>
+ </panel>
+ </panel>
+ <panel name="physics_panel">
+ <panel name="header_panel">
+ <text name="header_text">
+ Física
+ </text>
+ </panel>
+ <text name="description">
+ El asistente creará una forma física, que determinará la manera en la que el objeto interactúa con otros objetos y avatares. Selecciona con el controlador deslizante el nivel de detalle más adecuado en función del uso del objeto:
+ </text>
+ <panel name="content">
+ <text name="streaming cost">
+ Coste de recursos: [COSTE]
+ </text>
+ </panel>
+ </panel>
+ <panel name="physics2_panel">
+ <panel name="header_panel">
+ <text name="header_text">
+ Física
+ </text>
+ </panel>
+ <text name="description">
+ Obtén una vista previa de la forma física a continuación y haz clic en Siguiente para continuar. Para modificar la forma física, haz clic en el botón Atrás.
+ </text>
+ <panel name="content">
+ <text name="lod_label">
+ Vista previa de modelo:
+ </text>
+ <combo_box name="preview_lod_combo3" tool_tip="Nivel de detalle disponible en la vista previa">
+ <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="dimensions">
+ X: Y: Z:
+ </text>
+ <text name="dimension_dividers">
+ | |
+ </text>
+ <text name="streaming cost">
+ Coste de recursos: [COSTE]
+ </text>
+ </panel>
+ </panel>
+ <panel name="review_panel">
+ <panel name="header_panel">
+ <text name="header_text">
+ Revisar
+ </text>
+ </panel>
+ <text name="description">
+ Revisa los detalles que aparecen más abajo y, a continuación, haz clic. Selecciona la opción de carga para cargar el modelo. Se realizará el cargo en tu saldo de L$ cuando hagas clic en Cargar.
+ </text>
+ <panel name="content">
+ <text name="lod_label">
+ Vista previa de modelo:
+ </text>
+ <combo_box name="preview_lod_combo" tool_tip="Nivel de detalle disponible en la vista previa">
+ <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="dimensions">
+ X: Y: Z:
+ </text>
+ <text name="dimension_dividers">
+ | |
+ </text>
+ </panel>
+ <text name="streaming cost">
+ Coste de recursos: [COSTE]
+ </text>
+ <text name="physics cost">
+ Coste físico: [COSTE]
+ </text>
+ </panel>
+ <panel name="upload_panel">
+ <panel name="header_panel">
+ <text name="header_text">
+ Carga completa.
+ </text>
+ </panel>
+ <text name="description">
+ ¡Felicidades! Tu modelo se ha cargado correctamente. Encontrarás el modelo en la carpeta Objetos del inventario.
+ </text>
+ </panel>
+ <button label="&lt;&lt; Atrás" name="back"/>
+ <button label="Siguiente &gt;&gt;" name="next"/>
+ <button label="Subir" name="upload" tool_tip="Cargar al simulador"/>
+ <button label="Cancelar" name="cancel"/>
+ <button label="Cerrar" name="close"/>
+ <spinner name="import_scale" value="1.0"/>
+ <string name="status_idle">
+ Inactivo
+ </string>
+ <string name="status_reading_file">
+ Cargando...
+ </string>
+ <string name="status_generating_meshes">
+ Generando redes...
+ </string>
+ <string name="status_vertex_number_overflow">
+ Error: El número de intersección es superior a 65534. Cancelado.
+ </string>
+ <string name="high">
+ Alto
+ </string>
+ <string name="medium">
+ Media
+ </string>
+ <string name="low">
+ Bajo
+ </string>
+ <string name="lowest">
+ Mínimo
+ </string>
+ <string name="mesh_status_good">
+ Factúralo.
+ </string>
+ <string name="mesh_status_na">
+ N/A
+ </string>
+ <string name="mesh_status_none">
+ Ninguno
+ </string>
+ <string name="mesh_status_submesh_mismatch">
+ Los niveles de detalle poseen un número distinto de caras a las que se pueden aplicar texturas.
+ </string>
+ <string name="mesh_status_mesh_mismatch">
+ Los niveles de detalle poseen un número distinto de ejemplos de red.
+ </string>
+ <string name="mesh_status_too_many_vertices">
+ El nivel de detalle posee demasiadas intersecciones.
+ </string>
+ <string name="mesh_status_missing_lod">
+ Falta un nivel de detalle requerido.
+ </string>
+ <string name="layer_all">
+ Todo
+ </string>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_postcard.xml b/indra/newview/skins/default/xui/es/floater_postcard.xml
index df94486c0e..b5b9805fe2 100644
--- a/indra/newview/skins/default/xui/es/floater_postcard.xml
+++ b/indra/newview/skins/default/xui/es/floater_postcard.xml
@@ -1,29 +1,25 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Postcard" title="FOTO POR CORREO">
<text name="to_label">
- Correo electrónico
- del destinatario:
- </text>
- <line_editor bottom_delta="-20" name="to_form"/>
- <text bottom_delta="-12" name="from_label">
- Su correo
- electrónico:
- </text>
- <line_editor bottom_delta="-20" name="from_form"/>
+ Correo del destinatario:
+ </text>
+ <text name="from_label">
+ Su correo:
+ </text>
<text name="name_label">
Su nombre:
- </text>
+ </text>
<text name="subject_label">
Asunto:
</text>
<line_editor label="Escriba aquí el asunto." name="subject_form"/>
- <text bottom_delta="-18" name="msg_label">
+ <text name="msg_label">
Mensaje:
</text>
<text_editor name="msg_form">
Escriba aquí el mensaje.
</text_editor>
- <text bottom_delta="-21" name="fine_print">
+ <text name="fine_print">
Si su destinatario se registra en [SECOND_LIFE],
usted conseguirá un bono de referido.
</text>
diff --git a/indra/newview/skins/default/xui/es/floater_preview_animation.xml b/indra/newview/skins/default/xui/es/floater_preview_animation.xml
index 6b8c8b6ff5..c3f377a71a 100644
--- a/indra/newview/skins/default/xui/es/floater_preview_animation.xml
+++ b/indra/newview/skins/default/xui/es/floater_preview_animation.xml
@@ -6,6 +6,6 @@
<text name="desc txt">
Descripción:
</text>
- <button label="Ver en el mundo" label_selected="Parar" left="12" name="Anim play btn" tool_tip="Ejecutar esta animación de modo que puedan verla los demás" width="142"/>
- <button label="Ejecutarla para usted" label_selected="Parar" left="156" name="Anim audition btn" tool_tip="Ejecutar esta animación de modo que sólo la vea yo" width="136"/>
+ <button label="Ver en el mundo" label_selected="Parar" name="Anim play btn" tool_tip="Ejecutar esta animación de modo que puedan verla los demás" width="130"/>
+ <button label="Ejecutarla para usted" label_selected="Parar" left="135" name="Anim audition btn" tool_tip="Ejecutar esta animación de modo que sólo la vea yo" width="130"/>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_preview_classified.xml b/indra/newview/skins/default/xui/es/floater_preview_classified.xml
deleted file mode 100644
index d9c9c51ba8..0000000000
--- a/indra/newview/skins/default/xui/es/floater_preview_classified.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="classified_preview" title="INFORMACIÓN DEL CLASIFICADO">
- <floater.string name="Title">
- Clasificado: [NAME]
- </floater.string>
-</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_preview_event.xml b/indra/newview/skins/default/xui/es/floater_preview_event.xml
deleted file mode 100644
index 7edd4f9e3f..0000000000
--- a/indra/newview/skins/default/xui/es/floater_preview_event.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="event_preview" title="INFORMACIÓN DEL EVENTO">
- <floater.string name="Title">
- Evento: [NAME]
- </floater.string>
-</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_price_for_listing.xml b/indra/newview/skins/default/xui/es/floater_price_for_listing.xml
new file mode 100644
index 0000000000..8d6cdc86c0
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_price_for_listing.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="price_for_listing" title="PUBLICAR UN ANUNCIO CLASIFICADO">
+ <text name="explanation_text">
+ Tu anuncio clasificado se mostrará durante una semana a partir del día en que se publicó.
+
+La posición de tu anuncio en la lista de clasificados depende de cuánto elijas pagar.
+
+Los anuncios mejor pagados van al principio de la lista, y aparecen más arriba en las búsquedas.
+ </text>
+ <text name="price_text">
+ Precio por el anuncio:
+ </text>
+ <text name="price_symbol">
+ L$
+ </text>
+ <button label="OK" name="set_price_btn"/>
+ <button label="Cancelar" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_report_abuse.xml b/indra/newview/skins/default/xui/es/floater_report_abuse.xml
index 760429e73d..dc5d430375 100644
--- a/indra/newview/skins/default/xui/es/floater_report_abuse.xml
+++ b/indra/newview/skins/default/xui/es/floater_report_abuse.xml
@@ -67,8 +67,8 @@
<combo_box.item label="Acoso &gt; Abuso verbal" name="Harassment__Verbal_abuse"/>
<combo_box.item label="Indecencia &gt; En general, contenido o conducta ofensivos" name="Indecency__Broadly_offensive_content_or_conduct"/>
<combo_box.item label="Indecencia &gt; Nombre inapropiado del avatar" name="Indecency__Inappropriate_avatar_name"/>
- <combo_box.item label="Indecencia &gt; Contenido o conducta inapropiada en una región &apos;PG&apos;" name="Indecency__Mature_content_in_PG_region"/>
- <combo_box.item label="Indecencia &gt; Contenido o conducta inapropiada en una región &apos;Mature&apos;" name="Indecency__Inappropriate_content_in_Mature_region"/>
+ <combo_box.item label="Indecencia &gt; Contenido o conducta inapropiada en una región General" name="Indecency__Mature_content_in_PG_region"/>
+ <combo_box.item label="Indecencia &gt; Contenido o conducta inapropiada en una región Moderado" name="Indecency__Inappropriate_content_in_Mature_region"/>
<combo_box.item label="Infracción de la propiedad intelectual &gt; Eliminación de contenidos" name="Intellectual_property_infringement_Content_Removal"/>
<combo_box.item label="Infracción de la propiedad intelectual &gt; CopyBot o Exploit (programa malicioso) de permisos" name="Intellectual_property_infringement_CopyBot_or_Permissions_Exploit"/>
<combo_box.item label="Intolerancia" name="Intolerance"/>
diff --git a/indra/newview/skins/default/xui/es/floater_sell_land.xml b/indra/newview/skins/default/xui/es/floater_sell_land.xml
index efedb5d689..d883683945 100644
--- a/indra/newview/skins/default/xui/es/floater_sell_land.xml
+++ b/indra/newview/skins/default/xui/es/floater_sell_land.xml
@@ -54,8 +54,8 @@
<radio_item label="No, mantener la propiedad de los objetos" name="no"/>
<radio_item label="Sí, vender los objetos con el terreno" name="yes"/>
</radio_group>
- <button label="Mostrar los objetos" name="show_objects" width="120"/>
- <text name="nag_message_label">
+ <button label="Mostrar los objetos" name="show_objects"/>
+ <text name="nag_message_label" font="SansSerifSmallBold" left="10">
RECUERDA: todas las ventas son definitivas.
</text>
<button label="Poner en venta el terreno" name="sell_btn"/>
diff --git a/indra/newview/skins/default/xui/es/floater_settings_debug.xml b/indra/newview/skins/default/xui/es/floater_settings_debug.xml
index bca1839f09..1da2e491e1 100644
--- a/indra/newview/skins/default/xui/es/floater_settings_debug.xml
+++ b/indra/newview/skins/default/xui/es/floater_settings_debug.xml
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="settings_debug" title="CONFIGURACIONES DEL DEPURADOR">
<radio_group name="boolean_combo">
- <radio_item label="VERDADERO" name="TRUE" value="verdadero"/>
- <radio_item label="FALSO" name="FALSE" value=""/>
+ <radio_item label="VERDADERO" name="TRUE" />
+ <radio_item label="FALSO" name="FALSE" />
</radio_group>
<color_swatch label="Color" name="val_color_swatch"/>
<spinner label="x" name="val_spinner_1"/>
diff --git a/indra/newview/skins/default/xui/es/floater_sound_devices.xml b/indra/newview/skins/default/xui/es/floater_sound_devices.xml
new file mode 100644
index 0000000000..a5ffbd517a
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_sound_devices.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_sound_devices" title="Dispositivos de sonido">
+ <text name="voice_label">
+ Chat de voz
+ </text>
+ <check_box label="Activados" name="enable_voice"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_tools.xml b/indra/newview/skins/default/xui/es/floater_tools.xml
index fba969f267..78f18b745c 100644
--- a/indra/newview/skins/default/xui/es/floater_tools.xml
+++ b/indra/newview/skins/default/xui/es/floater_tools.xml
@@ -58,14 +58,14 @@
<radio_item label="Horizontal (Ctrl+Shift)" name="radio spin"/>
</radio_group>
<radio_group name="edit_radio_group">
- <radio_item label="Moverse" name="radio position"/>
+ <radio_item label="Mover" name="radio position"/>
<radio_item label="Girar (Ctrl)" name="radio rotate"/>
<radio_item label="Estirar (Ctrl+Shift)" name="radio stretch"/>
<radio_item label="Elegir la cara" name="radio select face"/>
</radio_group>
<check_box label="Editar las partes enlazadas" name="checkbox edit linked parts"/>
<button label="Enlazar" name="link_btn"/>
- <button label="Desenlazar" name="unlink_btn"/>
+ <button label="Desenlazar" name="unlink_btn" width="95"/>
<text name="RenderingCost" tool_tip="Muestra cuánto se calcula que cuesta renderizar este objeto">
þ: [COUNT]
</text>
@@ -125,6 +125,18 @@
<text left="134" name="prim_count">
Primitivas: [COUNT]
</text>
+ <text name="linked_set_count">
+ Conjuntos con enlaces: [RECUENTO]
+ </text>
+ <text name="linked_set_cost" tool_tip="Coste de los conjuntos con enlaces actualmente seleccionados como [prims], [complejidad física]">
+ Coste: [COSTE] / [FÃSICO]
+ </text>
+ <text name="object_count">
+ Objetos: [RECUENTO]
+ </text>
+ <text name="object_cost" tool_tip="Coste de los objetos actualmente seleccionados como [prims] / [complejidad física]">
+ Coste: [COSTE] / [FÃSICO]
+ </text>
<tab_container name="Object Info Tabs" tab_max_width="62" tab_min_width="30" width="288">
<panel label="General" name="General">
<panel.string name="text deed continued">
@@ -269,15 +281,6 @@
<combo_box.item label="Cono truncado" name="Ring"/>
<combo_box.item label="Sculpted" name="Sculpted"/>
</combo_box>
- <combo_box name="material">
- <combo_box.item label="Piedra" name="Stone"/>
- <combo_box.item label="Metal" name="Metal"/>
- <combo_box.item label="Vidrio" name="Glass"/>
- <combo_box.item label="Madera" name="Wood"/>
- <combo_box.item label="Carne" name="Flesh"/>
- <combo_box.item label="Plástico" name="Plastic"/>
- <combo_box.item label="Goma" name="Rubber"/>
- </combo_box>
<text name="text cut">
Corte (inicio/fin)
</text>
@@ -350,9 +353,19 @@
<combo_box.item label="Toroide" name="Torus"/>
<combo_box.item label="Plano" name="Plane"/>
<combo_box.item label="Cilindro" name="Cylinder"/>
+ <combo_box.item label="Red" name="Mesh"/>
</combo_box>
</panel>
<panel label="Caracter." name="Features">
+ <panel.string name="None">
+ Ninguno
+ </panel.string>
+ <panel.string name="Prim">
+ Prim
+ </panel.string>
+ <panel.string name="Convex Hull">
+ Apariencia convexa
+ </panel.string>
<text name="select_single">
Selecciona un sólo prim para editarlo.
</text>
@@ -377,6 +390,23 @@
<spinner label="Visión" name="Light Focus"/>
<spinner label="Atenuación" name="Light Falloff"/>
<spinner label="Ambiental" name="Light Ambiance"/>
+ <text name="label physicsshapetype">
+ Tipo de forma física:
+ </text>
+ <combo_box name="Physics Shape Type Combo Ctrl" tool_tip="Selecciona el tipo de forma física"/>
+ <combo_box name="material">
+ <combo_box.item label="Piedra" name="Stone"/>
+ <combo_box.item label="Metal" name="Metal"/>
+ <combo_box.item label="Cristal" name="Glass"/>
+ <combo_box.item label="Madera" name="Wood"/>
+ <combo_box.item label="Carne" name="Flesh"/>
+ <combo_box.item label="Plástico" name="Plastic"/>
+ <combo_box.item label="Goma" name="Rubber"/>
+ </combo_box>
+ <spinner label="Gravedad" name="Physics Gravity"/>
+ <spinner label="Fricción" name="Physics Friction"/>
+ <spinner label="Densidad" name="Physics Density"/>
+ <spinner label="Reemplazo" name="Physics Restitution"/>
</panel>
<panel label="Textura" name="Texture">
<panel.string name="string repeats per meter">
@@ -480,7 +510,7 @@
Modificar la parcela
</text>
<button label="Dividir" label_selected="Dividir" name="button subdivide land"/>
- <button label="Inscribirse" label_selected="Inscribirse" name="button join land"/>
+ <button label="Unir" label_selected="Unir" name="button join land"/>
<text name="label_parcel_trans">
Transacciones de terreno
</text>
diff --git a/indra/newview/skins/default/xui/es/floater_top_objects.xml b/indra/newview/skins/default/xui/es/floater_top_objects.xml
index 7c2522e8a9..033633bd22 100644
--- a/indra/newview/skins/default/xui/es/floater_top_objects.xml
+++ b/indra/newview/skins/default/xui/es/floater_top_objects.xml
@@ -39,19 +39,16 @@
<text name="id_text">
ID del objeto:
</text>
- <line_editor font="SansSerifSmall" left="140" name="id_editor" width="280"/>
- <button label="Mostrar la baliza" name="show_beacon_btn" width="115"/>
+ <button label="Mostrar la baliza" name="show_beacon_btn"/>
<text name="obj_name_text">
Nombre del objeto:
</text>
- <line_editor font="SansSerifSmall" left="140" name="object_name_editor" width="280"/>
- <button label="Filtro" name="filter_object_btn" width="115"/>
- <text name="owner_name_text" width="130">
+ <button label="Filtro" name="filter_object_btn"/>
+ <text name="owner_name_text">
Propietario:
</text>
- <line_editor font="SansSerifSmall" left="140" name="owner_name_editor" width="280"/>
- <button label="Filtro" name="filter_owner_btn" width="115"/>
- <button label="Actualizar" name="refresh_btn" width="115"/>
+ <button label="Filtro" name="filter_owner_btn"/>
+ <button label="Actualizar" name="refresh_btn"/>
<button label="Devolver lo seleccionado" name="return_selected_btn" width="170"/>
<button label="Devolver todo" left="190" name="return_all_btn"/>
<button label="Desactivar lo seleccionado" name="disable_selected_btn" width="170"/>
diff --git a/indra/newview/skins/default/xui/es/floater_water.xml b/indra/newview/skins/default/xui/es/floater_water.xml
deleted file mode 100644
index 2c1f6cfbfb..0000000000
--- a/indra/newview/skins/default/xui/es/floater_water.xml
+++ /dev/null
@@ -1,88 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Water Floater" title="EDITOR AVANZADO DEL AGUA">
- <text name="KeyFramePresetsText">
- Agua predefinida:
- </text>
- <button label="Nueva" label_selected="Nueva" name="WaterNewPreset"/>
- <button label="Guardar" label_selected="Guardar" name="WaterSavePreset"/>
- <button label="Borrar" label_selected="Borrar" name="WaterDeletePreset"/>
- <tab_container name="Water Tabs">
- <panel label="CONFIGURACIÓN" name="Settings">
- <text name="BHText">
- Color del agua
- </text>
- <button label="?" left="175" name="WaterFogColorHelp"/>
- <color_swatch label="" name="WaterFogColor" tool_tip="Pulsa para abrir el selector de color"/>
- <text name="WaterFogDensText">
- Transparencia
- </text>
- <button label="?" left="175" name="WaterFogDensityHelp"/>
- <text name="WaterUnderWaterFogModText">
- Modificar la claridad del agua
- </text>
- <button label="?" left="175" name="WaterUnderWaterFogModHelp"/>
- <text name="BDensText">
- Tamaño de las ondulaciones
- </text>
- <button label="?" left="405" name="WaterNormalScaleHelp"/>
- <text name="BHText2">
- 1
- </text>
- <text name="BHText3">
- 2
- </text>
- <text name="BHText4">
- 3
- </text>
- <text name="HDText">
- Escala de Fresnel
- </text>
- <button label="?" left="405" name="WaterFresnelScaleHelp"/>
- <text name="FresnelOffsetText">
- Coeficiente de reflexión
- </text>
- <button label="?" left="405" name="WaterFresnelOffsetHelp"/>
- <text name="DensMultText">
- Refracción de la superficie
- </text>
- <button label="?" left="640" name="WaterScaleAboveHelp"/>
- <text name="WaterScaleBelowText">
- Refracción bajo la superficie
- </text>
- <button label="?" left="640" name="WaterScaleBelowHelp"/>
- <text name="MaxAltText">
- Desenfoque
- </text>
- <button label="?" left="640" name="WaterBlurMultiplierHelp"/>
- </panel>
- <panel label="IMAGEN" name="Waves">
- <text name="BHText">
- Sentido de la onda grande
- </text>
- <button label="?" left="170" name="WaterWave1Help"/>
- <text name="WaterWave1DirXText">
- X
- </text>
- <text name="WaterWave1DirYText">
- Y
- </text>
- <text name="BHText2">
- Sentido de la onda pequeña
- </text>
- <button label="?" left="170" name="WaterWave2Help"/>
- <text name="WaterWave2DirXText">
- X
- </text>
- <text name="WaterWave2DirYText">
- Y
- </text>
- <text name="BHText3">
- Vista Normal
- </text>
- <button label="?" name="WaterNormalMapHelp"/>
- </panel>
- </tab_container>
- <string name="WLDefaultWaterNames">
- Default:Glassy:Pond:Murky:Second Plague:SNAKE!!!:Valdez
- </string>
-</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_windlight_options.xml b/indra/newview/skins/default/xui/es/floater_windlight_options.xml
deleted file mode 100644
index 585a42e429..0000000000
--- a/indra/newview/skins/default/xui/es/floater_windlight_options.xml
+++ /dev/null
@@ -1,190 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="WindLight floater" title="EDITOR AVANZADO DEL CIELO">
- <text name="KeyFramePresetsText">
- Cielos definidos:
- </text>
- <button label="Nuevo" label_selected="Nuevo" name="WLNewPreset"/>
- <button label="Guardar" label_selected="Guardar" name="WLSavePreset"/>
- <button label="Borrar" label_selected="Borrar" name="WLDeletePreset"/>
- <button font="SansSerifSmall" label="Editor del ciclo de un día" label_selected="Editor del ciclo de un día" left_delta="90" name="WLDayCycleMenuButton" width="150"/>
- <tab_container name="WindLight Tabs">
- <panel label="ATMÓSFERA" name="Atmosphere">
- <text name="BHText">
- Coloración
- </text>
- <button label="?" name="WLBlueHorizonHelp"/>
- <text name="BHText2">
- R
- </text>
- <text name="BHText3">
- V
- </text>
- <text name="BHText4">
- A
- </text>
- <text name="BHText5">
- I
- </text>
- <text name="BDensText">
- Cantidad de bruma
- </text>
- <button label="?" name="WLHazeHorizonHelp"/>
- <text name="BDensText2">
- Saturación
- </text>
- <button label="?" name="WLBlueDensityHelp"/>
- <text name="BHText6">
- R
- </text>
- <text name="BHText7">
- V
- </text>
- <text name="BHText8">
- A
- </text>
- <text name="BHText9">
- I
- </text>
- <text name="HDText">
- Densidad de la bruma
- </text>
- <button label="?" name="WLHazeDensityHelp"/>
- <text name="DensMultText">
- Densidad
- </text>
- <button label="?" name="WLDensityMultHelp"/>
- <text name="WLDistanceMultText">
- Distancia
- </text>
- <button label="?" name="WLDistanceMultHelp"/>
- <text name="MaxAltText">
- Altitud máx.
- </text>
- <button label="?" name="WLMaxAltitudeHelp"/>
- </panel>
- <panel label="LUZ" name="Lighting">
- <text name="SLCText">
- Color del Sol y de la Luna
- </text>
- <button label="?" name="WLSunlightColorHelp"/>
- <text name="BHText">
- R
- </text>
- <text name="BHText2">
- V
- </text>
- <text name="BHText3">
- A
- </text>
- <text name="BHText4">
- I
- </text>
- <text name="TODText">
- Posición del Sol y la Luna
- </text>
- <button label="?" name="WLTimeOfDayHelp"/>
- <text name="WLAmbientText">
- Ambiental
- </text>
- <button label="?" name="WLAmbientHelp"/>
- <text name="BHText5">
- R
- </text>
- <text name="BHText6">
- V
- </text>
- <text name="BHText7">
- A
- </text>
- <text name="BHText8">
- I
- </text>
- <text name="WLEastAngleText">
- Ãngulo de elevación
- </text>
- <button label="?" name="WLEastAngleHelp"/>
- <text name="SunGlowText">
- Resplandor del Sol
- </text>
- <button label="?" name="WLSunGlowHelp"/>
- <slider label="Visión" name="WLGlowB"/>
- <slider label="Tamaño" name="WLGlowR"/>
- <text name="SceneGammaText">
- Gamma de la escena
- </text>
- <button label="?" name="WLSceneGammaHelp"/>
- <text name="WLStarText">
- Brillo de las estrellas
- </text>
- <button label="?" name="WLStarBrightnessHelp"/>
- </panel>
- <panel label="NUBES" name="Clouds">
- <text name="WLCloudColorText">
- Color de las nubes
- </text>
- <button label="?" left="190" name="WLCloudColorHelp"/>
- <text name="BHText">
- R
- </text>
- <text name="BHText2">
- V
- </text>
- <text name="BHText3">
- A
- </text>
- <text name="BHText4">
- I
- </text>
- <text name="WLCloudColorText2">
- Posición/Densidad de las nubes
- </text>
- <button label="?" left="190" name="WLCloudDensityHelp"/>
- <text name="BHText5">
- X
- </text>
- <text name="BHText6">
- Y
- </text>
- <text name="BHText7">
- D
- </text>
- <text name="WLCloudCoverageText">
- Nubosidad
- </text>
- <button label="?" name="WLCloudCoverageHelp"/>
- <text name="WLCloudScaleText">
- Altitud de las nubes
- </text>
- <button label="?" name="WLCloudScaleHelp"/>
- <text font="SansSerifSmall" name="WLCloudDetailText">
- Detalle de las nubes (Posición/Densidad)
- </text>
- <button label="?" name="WLCloudDetailHelp"/>
- <text bottom="-113" name="BHText8">
- X
- </text>
- <text name="BHText9">
- Y
- </text>
- <text name="BHText10">
- D
- </text>
- <slider bottom="-127" name="WLCloudDetailX"/>
- <text name="WLCloudScrollXText">
- Velocidad de X
- </text>
- <button label="?" name="WLCloudScrollXHelp"/>
- <check_box label="Bloquear" name="WLCloudLockX"/>
- <text name="WLCloudScrollYText">
- Velocidad de Y
- </text>
- <button label="?" name="WLCloudScrollYHelp"/>
- <check_box label="Bloquear" name="WLCloudLockY"/>
- <check_box label="Incluir nubes clásicas" name="DrawClassicClouds"/>
- <button label="?" left="618" name="WLClassicCloudsHelp"/>
- </panel>
- </tab_container>
- <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
- </string>
-</floater>
diff --git a/indra/newview/skins/default/xui/es/language_settings.xml b/indra/newview/skins/default/xui/es/language_settings.xml
index f172994077..997293a741 100644
--- a/indra/newview/skins/default/xui/es/language_settings.xml
+++ b/indra/newview/skins/default/xui/es/language_settings.xml
@@ -4,6 +4,7 @@
<!-- Locale Information -->
<string name="MicrosoftLocale">spanish</string>
+ <string name="MacLocale">es_ES.UTF-8</string>
<string name="DarwinLocale">es_ES.UTF-8</string>
<string name="LinuxLocale">es_ES.UTF-8</string>
diff --git a/indra/newview/skins/default/xui/es/menu_inventory_add.xml b/indra/newview/skins/default/xui/es/menu_inventory_add.xml
index 615a1a09b7..f17cfe4ceb 100644
--- a/indra/newview/skins/default/xui/es/menu_inventory_add.xml
+++ b/indra/newview/skins/default/xui/es/menu_inventory_add.xml
@@ -4,6 +4,8 @@
<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="Modelo..." name="Upload Model"/>
+ <menu_item_call label="Asistente de modelo..." name="Upload Model Wizard"/>
<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>
diff --git a/indra/newview/skins/default/xui/es/menu_model_import_gear_default.xml b/indra/newview/skins/default/xui/es/menu_model_import_gear_default.xml
new file mode 100644
index 0000000000..0d4f1314c9
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/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="Mostrar bordes" name="show_edges"/>
+ <menu_item_check label="Mostrar aspectos físicos" name="show_physics"/>
+ <menu_item_check label="Mostrar texturas" name="show_textures"/>
+ <menu_item_check label="Mostrar peso de la piel" name="show_skin_weight"/>
+ <menu_item_check label="Mostrar posturas de las articulaciones" name="show_joint_positions"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_viewer.xml b/indra/newview/skins/default/xui/es/menu_viewer.xml
index 138bbd9412..0824e386d5 100644
--- a/indra/newview/skins/default/xui/es/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/es/menu_viewer.xml
@@ -120,6 +120,8 @@
<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="Modelo..." name="Upload Model"/>
+ <menu_item_call label="Asistente de modelo..." name="Upload Model Wizard"/>
<menu_item_call label="Masivo ([COST] L$ por archivo)..." name="Bulk Upload"/>
</menu>
<menu_item_call label="Deshacer" name="Undo"/>
@@ -146,7 +148,7 @@
<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>
- <menu label="Realzando y Visibilidad" name="Highlighting and Visibility">
+ <menu label="Realzado y Visibilidad" name="Highlighting and Visibility">
<menu_item_check label="Baliza con destellos" name="Cheesy Beacon"/>
<menu_item_check label="Ocultar las partículas" name="Hide Particles"/>
<menu_item_check label="Ocultar lo seleccionado" name="Hide Selected"/>
@@ -159,7 +161,7 @@
<menu_item_check label="Alfa" name="Alpha"/>
<menu_item_check label="Ãrbol" name="Tree"/>
<menu_item_check label="Avatares" name="Character"/>
- <menu_item_check label="Superficie del terreno" name="SurfacePath"/>
+ <menu_item_check label="Parche de superficie" name="Surface Patch"/>
<menu_item_check label="Cielo" name="Sky"/>
<menu_item_check label="Agua" name="Water"/>
<menu_item_check label="Terreno" name="Ground"/>
@@ -217,6 +219,7 @@
<menu_item_check label="Texture Category Console" name="Texture Category"/>
<menu_item_check label="Fast Timers" name="Fast Timers"/>
<menu_item_check label="Memory" name="Memory"/>
+ <menu_item_check label="Datos de la escena" name="Scene Statistics"/>
<menu_item_call label="Region Info to Debug Console" name="Region Info to Debug Console"/>
<menu_item_check label="Camera" name="Camera"/>
<menu_item_check label="Wind" name="Wind"/>
@@ -224,6 +227,7 @@
</menu>
<menu label="Show Info" name="Display Info">
<menu_item_check label="Show Time" name="Show Time"/>
+ <menu_item_check label="Mostrar coste de carga" name="Show Upload Cost"/>
<menu_item_check label="Show Render Info" name="Show Render Info"/>
<menu_item_check label="Mostrar información de textura" name="Show Texture Info"/>
<menu_item_check label="Show Color Under Cursor" name="Show Color Under Cursor"/>
@@ -246,7 +250,12 @@
<menu_item_check label="Frame Test" name="Frame Test"/>
</menu>
<menu label="Render Metadata" name="Render Metadata">
+ <menu_item_check label="Normales" name="Normals"/>
+ <menu_item_check label="Formas del físico" name="Physics Shapes"/>
<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="Esculpir" name="Sculpt"/>
</menu>
<menu label="Rendering" name="Rendering">
<menu_item_check label="Axes" name="Axes"/>
@@ -312,6 +321,7 @@
<menu_item_call label="Debug Avatar Textures" name="Debug Avatar Textures"/>
</menu>
<menu_item_check label="HTTP Textures" name="HTTP Textures"/>
+ <menu_item_check label="Inventario HTTP" name="HTTP Inventory"/>
<menu_item_check label="Console Window on next Run" name="Console Window"/>
<menu_item_call label="Request Admin Status" name="Request Admin Options"/>
<menu_item_call label="Leave Admin Status" name="Leave Admin Options"/>
diff --git a/indra/newview/skins/default/xui/es/notifications.xml b/indra/newview/skins/default/xui/es/notifications.xml
index 91a03023a1..b2131fc038 100644
--- a/indra/newview/skins/default/xui/es/notifications.xml
+++ b/indra/newview/skins/default/xui/es/notifications.xml
@@ -1761,11 +1761,11 @@ Puedes pulsar &apos;Cambiar las Preferencias&apos; para incrementar las preferen
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="SetClassifiedMature">
- ¿Este anuncio tiene contenido &apos;Moderado&apos;?
+ ¿Este anuncio tiene contenido moderado?
<usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="No" yestext="Sí"/>
</notification>
<notification name="SetGroupMature">
- ¿Este grupo tiene contenido &apos;Moderado&apos;?
+ ¿Este grupo tiene contenido moderado?
<usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="No" yestext="Sí"/>
</notification>
<notification label="Confirmar el reinicio" name="ConfirmRestart">
@@ -2166,6 +2166,12 @@ Esto puede influir en tu contraseña.
<notification name="RezItemNoPermissions">
No tienes permisos suficientes para renderizar el objeto.
</notification>
+ <notification name="IMAcrossParentEstates">
+ No se pueden enviar mensajes instantáneos entre propiedades principales.
+ </notification>
+ <notification name="TransferInventoryAcrossParentEstates">
+ No se puede transferir el inventario entre propiedades principales.
+ </notification>
<notification name="UnableToLoadNotecard">
En este momento no se puede cargar la nota.
</notification>
@@ -2244,7 +2250,7 @@ Inténtalo seleccionando un trozo más pequeño de terreno.
Se han excluido algunos términos de tu búsqueda debido a restricciones en el contenido, según se especifica en las Normas de la Comunidad.
</notification>
<notification name="NoContentToSearch">
- Por favor, elige al menos un tipo de contenido a buscar (&apos;PG&apos;, &apos;Mature&apos;, o &apos;Adult&apos;).
+ Por favor, elige al menos un tipo de contenido a buscar (General, Moderado o Adulto;).
</notification>
<notification name="SystemMessage">
[MESSAGE]
@@ -2359,6 +2365,9 @@ Por favor, dirígete a la Base de Conocimientos para más detalles sobre el acce
<notification name="ImproperPaymentStatus">
No tienes el estado de pago adecuado para entrar a esta región.
</notification>
+ <notification name="MustGetAgeRgion">
+ Debes tener verificada la edad para entrar a esta región
+ </notification>
<notification name="MustGetAgeParcel">
Debes haber verificado tu edad para entrar a esta parcela.
</notification>
@@ -2738,6 +2747,10 @@ Por tu seguridad, serán bloqueadas durante unos segundos.
Un moderador ha silenciado tu voz.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
+ <notification name="UploadCostConfirmation">
+ Esta carga te costará [PRECIO] L$. ¿Deseas continuar?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Subir"/>
+ </notification>
<notification name="ConfirmClearTeleportHistory">
¿Estás seguro de que quieres borrar tu historial de teleportes?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
@@ -2749,6 +2762,9 @@ Se mostrará cuando haya suficiente espacio.
<notification name="ShareNotification">
Selecciona los residentes con quienes deseas compartir.
</notification>
+ <notification name="MeshUploadError">
+ No se ha cargado [ETIQUETA]: [MENSAJE] [IDENTIFICADOR] [IDENTIFICADOR_FALTA_VALIDEZ]
+ </notification>
<notification name="ShareItemsConfirmation">
¿Estás seguro de que quieres compartir los elementos siguientes?
@@ -2765,6 +2781,19 @@ Con los siguientes residentes:
<notification name="DeedToGroupFail">
Error de transferencia a grupo.
</notification>
+ <notification name="ReleaseLandThrottled">
+ La parcela [NOMBRE_PARCELA] no se puede abandonar en este momento.
+ </notification>
+ <notification name="ReleasedLandWithReclaim">
+ Ya está disponible la parcela [NOMBRE_PARCELA] de [ÃREA] m².
+
+Dispondrás de [PERÃODO_DE_RECLAMACIÓN] horas para reclamar la cantidad de 0 L$ antes de que se ponga en venta.
+ </notification>
+ <notification name="ReleasedLandNoReclaim">
+ Ya está disponible la parcela [NOMBRE_PARCELA] de [ÃREA] m².
+
+Ya está en venta.
+ </notification>
<notification name="AvatarRezNotification">
( [EXISTENCE] segundos vivo)
El avatar &apos;[NAME]&apos; tardó [TIME] segundos en dejar de aparecer como nube.
@@ -2902,6 +2931,10 @@ Al ocultar el botón Hablar se desactiva la función de voz.
La creación y edición de grupos 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"/>
</notification>
+ <notification label="" name="NoPlaceInfo">
+ La opción de consulta del perfil del lugar solo 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"/>
+ </notification>
<notification label="" name="NoPicks">
La creación y edición de Destacados 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"/>
@@ -2922,9 +2955,18 @@ Al ocultar el botón Hablar se desactiva la función de voz.
El pago a otros residentes sólo está disponible en el modo Avanzado. ¿Quieres cerrar sesión y cambiar de modo?
<usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/>
</notification>
- <global name="UnsupportedCPU">
- - La velocidad de tu CPU no cumple los requerimientos mínimos.
- </global>
+ <notification label="" name="NoInventory">
+ La opción de consulta del inventario solo está disponible en el modo Avanzado. ¿Quieres cerrar sesión y cambiar de modo?
+ <usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/>
+ </notification>
+ <notification label="" name="NoAppearance">
+ El editor de apariencia solo está disponible en el modo Avanzado. ¿Quieres cerrar sesión y cambiar de modo?
+ <usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/>
+ </notification>
+ <notification label="" name="NoSearch">
+ 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>
<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_edit_pick.xml b/indra/newview/skins/default/xui/es/panel_edit_pick.xml
index 9b101ee4ba..cda465da9c 100644
--- a/indra/newview/skins/default/xui/es/panel_edit_pick.xml
+++ b/indra/newview/skins/default/xui/es/panel_edit_pick.xml
@@ -29,7 +29,7 @@
<layout_panel name="layout_panel1">
<button label="Guardar" name="save_changes_btn"/>
</layout_panel>
- <layout_panel name="layout_panel1">
+ <layout_panel name="layout_panel2">
<button label="Cancelar" name="cancel_btn"/>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/es/panel_friends.xml b/indra/newview/skins/default/xui/es/panel_friends.xml
deleted file mode 100644
index e1cac7c2c3..0000000000
--- a/indra/newview/skins/default/xui/es/panel_friends.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="friends">
- <string name="Multiple">
- Varios amigos
- </string>
- <scroll_list name="friend_list" tool_tip="Para seleccionar a varios amigos, mantenga pulsado Ctrl o Mays. mientras les va pulsando.">
- <column name="icon_online_status" tool_tip="Estado de conexión"/>
- <column label="Nombre" name="friend_name" tool_tip="Nombre"/>
- <column name="icon_visible_online" tool_tip="El amigo puede ver cuándo está conectado"/>
- <column name="icon_visible_map" tool_tip="El amigo puede localizarle en el mapa"/>
- <column name="icon_edit_mine" tool_tip="El amigo puede editar, borrar o tomar sus objetos"/>
- <column name="icon_edit_theirs" tool_tip="Puede editar los objetos de este amigo"/>
- </scroll_list>
- <button label="MI/Llamada" name="im_btn" tool_tip="Abrir sesión de mensajes instantáneos"/>
- <button label="Perfil" name="profile_btn" tool_tip="Mostrar la imagen, los grupos, y otra información"/>
- <button label="Teleporte" name="offer_teleport_btn" tool_tip="Ofrecer a este amigo teleportarle hasta su posición"/>
- <button label="Pagar" name="pay_btn" tool_tip="Dar dólares Linden (L$) a este amigo"/>
- <button label="Quitar" name="remove_btn" tool_tip="Quitar a esta persona de su lista de amigos"/>
- <button label="Añadir" name="add_btn" tool_tip="Ofrecer amistad a un Residente"/>
-</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_group_general.xml b/indra/newview/skins/default/xui/es/panel_group_general.xml
index a0f7433d7d..b00c300c85 100644
--- a/indra/newview/skins/default/xui/es/panel_group_general.xml
+++ b/indra/newview/skins/default/xui/es/panel_group_general.xml
@@ -46,12 +46,12 @@ Deja el cursor sobre las opciones para ver más ayuda.
<check_box label="Cualquiera puede entrar" name="open_enrollement" tool_tip="Configura si se permite la entrada de nuevos miembros sin ser invitados."/>
<check_box label="Cuota de entrada" name="check_enrollment_fee" tool_tip="Configura si hay que pagar una cuota para entrar al grupo"/>
<spinner label="L$" left_delta="130" name="spin_enrollment_fee" tool_tip="Si la opción Cuota de entrada está marcada, los nuevos miembros han de pagar esta cuota para entrar al grupo." width="60"/>
- <combo_box bottom_delta="-38" name="group_mature_check" tool_tip="Establece si la información de su grupo es &apos;mature&apos;." width="150">
+ <combo_box bottom_delta="-38" name="group_mature_check" tool_tip="Establece si la información de su grupo es moderado." width="150">
<combo_item name="select_mature">
- Selecciona el nivel de calificación -
</combo_item>
- <combo_box.item label="Contenido &apos;Mature&apos;" name="mature"/>
- <combo_box.item label="Contenido &apos;PG&apos;" name="pg"/>
+ <combo_box.item label="Contenido moderado" name="mature"/>
+ <combo_box.item label="Contenido general" name="pg"/>
</combo_box>
<check_box initial_value="true" label="Mostrar en la búsqueda" name="show_in_group_list" tool_tip="Permite que la gente vea este grupo en los resultados de la búsqueda"/>
</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_im_control_panel.xml b/indra/newview/skins/default/xui/es/panel_im_control_panel.xml
index 7d4db6a630..f218324d50 100644
--- a/indra/newview/skins/default/xui/es/panel_im_control_panel.xml
+++ b/indra/newview/skins/default/xui/es/panel_im_control_panel.xml
@@ -8,7 +8,7 @@
<button label="Añadir como amigo" name="add_friend_btn"/>
</layout_panel>
<layout_panel name="teleport_btn_panel">
- <button label="Teleportarme" name="teleport_btn" tool_tip="Ofrecer teleporte a esta persona"/>
+ <button label="Teleportar" name="teleport_btn" tool_tip="Ofrecer teleporte a esta persona"/>
</layout_panel>
<layout_panel name="share_btn_panel">
<button label="Compartir" name="share_btn"/>
diff --git a/indra/newview/skins/default/xui/es/panel_login.xml b/indra/newview/skins/default/xui/es/panel_login.xml
index eee1844c46..0e94cbe70b 100644
--- a/indra/newview/skins/default/xui/es/panel_login.xml
+++ b/indra/newview/skins/default/xui/es/panel_login.xml
@@ -30,6 +30,7 @@
<combo_box name="start_location_combo">
<combo_box.item label="Mi última posición" name="MyLastLocation"/>
<combo_box.item label="Mi Base" name="MyHome"/>
+ <combo_box.item label="&lt;Escribe en qué región&gt;" name="Typeregionname"/>
</combo_box>
</layout_panel>
<layout_panel name="links">
diff --git a/indra/newview/skins/default/xui/es/panel_media_settings_general.xml b/indra/newview/skins/default/xui/es/panel_media_settings_general.xml
index 46326d1e8b..afc11a4250 100644
--- a/indra/newview/skins/default/xui/es/panel_media_settings_general.xml
+++ b/indra/newview/skins/default/xui/es/panel_media_settings_general.xml
@@ -20,7 +20,8 @@
<check_box initial_value="false" label="Zoom automático" name="auto_zoom"/>
<check_box initial_value="false" label="Ejecutar automáticamente los media" name="auto_play"/>
<text name="media_setting_note">
- Nota: los residentes pueden elegir una configuración distinta de ésta
+ Nota: los residentes pueden elegir una configuración distinta
+de ésta
</text>
<check_box initial_value="false" label="Ajustar automáticamente los media en la cara del objeto" name="auto_scale"/>
<text name="size_label">
diff --git a/indra/newview/skins/default/xui/es/panel_media_settings_security.xml b/indra/newview/skins/default/xui/es/panel_media_settings_security.xml
index c72f562a68..a1a3ec86cf 100644
--- a/indra/newview/skins/default/xui/es/panel_media_settings_security.xml
+++ b/indra/newview/skins/default/xui/es/panel_media_settings_security.xml
@@ -2,7 +2,8 @@
<panel label="Seguridad" name="Media Settings Security">
<check_box initial_value="false" label="Permitir el acceso sólo a los patrones de URL especificados" name="whitelist_enable"/>
<text name="home_url_fails_some_items_in_whitelist">
- Están marcadas las entradas que la página web no admite:
+ Están marcadas las entradas que la página web no
+admite:
</text>
<button label="Añadir" name="whitelist_add"/>
<button label="Borrar" name="whitelist_del"/>
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 e8e95c3bac..293c9ef1d9 100644
--- a/indra/newview/skins/default/xui/es/panel_navigation_bar.xml
+++ b/indra/newview/skins/default/xui/es/panel_navigation_bar.xml
@@ -1,7 +1,7 @@
<?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="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"/>
diff --git a/indra/newview/skins/default/xui/es/panel_people.xml b/indra/newview/skins/default/xui/es/panel_people.xml
index 01149e412d..a9d38dca25 100644
--- a/indra/newview/skins/default/xui/es/panel_people.xml
+++ b/indra/newview/skins/default/xui/es/panel_people.xml
@@ -66,16 +66,16 @@
<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="chat_btn_lp">
+ <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="chat_btn_lp">
+ <layout_panel name="call_btn_lp">
<button label="Llamar" name="call_btn" tool_tip="Llamar a este Residente"/>
</layout_panel>
- <layout_panel name="chat_btn_lp">
+ <layout_panel name="share_btn_lp">
<button label="Compartir" name="share_btn" tool_tip="Compartir un objeto del inventario"/>
</layout_panel>
- <layout_panel name="chat_btn_lp">
+ <layout_panel name="teleport_btn_lp">
<button label="Teleporte" name="teleport_btn" tool_tip="Ofrecer teleporte"/>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/es/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/es/panel_preferences_advanced.xml
index 7c2c9f505e..96e63e6fa0 100644
--- a/indra/newview/skins/default/xui/es/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/es/panel_preferences_advanced.xml
@@ -14,5 +14,5 @@
<check_box label="Permitir el acceso de varios usuarios" name="allow_multiple_viewer_check"/>
<check_box label="Mostrar la selección de cuadrícula al iniciar sesión" name="show_grid_selection_check"/>
<check_box label="Mostrar el menú Avanzado" name="show_advanced_menu_check"/>
- <check_box label="Mostrar el menú Desarrollador" name="show_develop_menu_check"/>
+ <check_box label="Mostrar el menú Develop" name="show_develop_menu_check"/>
</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 f7bc1f6aad..d8fd43469d 100644
--- a/indra/newview/skins/default/xui/es/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/es/panel_preferences_chat.xml
@@ -31,7 +31,7 @@
<spinner label="Tiempo de los otros interlocutores:" name="nearby_toasts_fadingtime"/>
<check_box name="translate_chat_checkbox"/>
<text name="translate_chb_label">
- Utiliza la herramienta de traducción automática mientras utilizas el chat (mediante Google)
+ Usar en el chat el traductor automático de Google
</text>
<text name="translate_language_text">
Traducir el chat al:
diff --git a/indra/newview/skins/default/xui/es/panel_preferences_colors.xml b/indra/newview/skins/default/xui/es/panel_preferences_colors.xml
index a7fb2d9af8..d47a6d718a 100644
--- a/indra/newview/skins/default/xui/es/panel_preferences_colors.xml
+++ b/indra/newview/skins/default/xui/es/panel_preferences_colors.xml
@@ -22,6 +22,9 @@
<text name="text_box5">
Errores
</text>
+ <text name="text_box10">
+ Directo
+ </text>
<text name="text_box7">
Propietario
</text>
@@ -29,13 +32,13 @@
URLs
</text>
<text name="bubble_chat">
- Color de fondo de las etiquetas de nombre (también se aplica a los bocadillos del chat):
+ Color de fondo de la etiqueta del nombre (afectará también a los bocadillos del chat):
</text>
<color_swatch name="background" tool_tip="Elige el color de las etiquetas de nombre"/>
<slider label="Opacidad:" name="bubble_chat_opacity" tool_tip="Elige la opacidad de las etiquetas de nombre"/>
<text name="floater_opacity">
Opacidad de la ventana:
</text>
- <slider label="Activo:" name="active"/>
- <slider label="Inactivo:" name="inactive"/>
+ <slider label="Activa:" name="active"/>
+ <slider label="Inactiva:" name="inactive"/>
</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 790c7be581..e725e4a05a 100644
--- a/indra/newview/skins/default/xui/es/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/es/panel_preferences_general.xml
@@ -24,9 +24,9 @@
</text>
<text name="maturity_desired_textbox"/>
<combo_box name="maturity_desired_combobox">
- <combo_box.item label="&apos;PG&apos;, &apos;Mature&apos; y &apos;Adult&apos;" name="Desired_Adult"/>
- <combo_box.item label="&apos;PG&apos; y &apos;Mature&apos;" name="Desired_Mature"/>
- <combo_box.item label="&apos;PG&apos;" name="Desired_PG"/>
+ <combo_box.item label="General, Moderado y Adulto" name="Desired_Adult"/>
+ <combo_box.item label="General y Moderado" name="Desired_Mature"/>
+ <combo_box.item label="General" name="Desired_PG"/>
</combo_box>
<text name="start_location_textbox">
Localización inicial:
diff --git a/indra/newview/skins/default/xui/es/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/es/panel_preferences_graphics1.xml
index 1ae5d63ace..281b871fed 100644
--- a/indra/newview/skins/default/xui/es/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/es/panel_preferences_graphics1.xml
@@ -27,8 +27,20 @@
</text>
<check_box initial_value="verdadero" label="Agua transparente" name="TransparentWater"/>
<check_box initial_value="true" label="Efecto de relieve y brillo" name="BumpShiny"/>
+ <check_box initial_value="verdadero" label="Luces locales" name="LocalLights"/>
<check_box initial_value="true" label="Shaders básicos" name="BasicShaders" tool_tip="Desactivando esta opción puede prevenir fallos en algunos controladores de la tarjeta gráfica."/>
<check_box initial_value="true" label="Shaders de la atmósfera" name="WindLightUseAtmosShaders"/>
+ <check_box initial_value="verdadero" label="Luces y sombras" name="UseLightShaders"/>
+ <check_box initial_value="verdadero" label="Oclusión del ambiente" name="UseSSAO"/>
+ <check_box initial_value="verdadero" label="Profundidad del campo" name="UseDoF"/>
+ <text name="shadows_label">
+ Sombras:
+ </text>
+ <combo_box name="ShadowDetail">
+ <combo_box.item label="Ninguno" name="0"/>
+ <combo_box.item label="Sol/luna" name="1"/>
+ <combo_box.item label="Sol/luna + proyectores" name="2"/>
+ </combo_box>
<text name="reflection_label">
Reflejos en el agua:
</text>
@@ -48,7 +60,7 @@
m
</text>
<slider label="Núm. máx. de partículas:" name="MaxParticleCount"/>
- <slider label="N.º máximo de avatares no impostores:" name="MaxNumberAvatarDrawn"/>
+ <slider label="Nº máx. de avats. no impostores:" name="MaxNumberAvatarDrawn"/>
<slider label="Calidad de procesamiento:" name="RenderPostProcess"/>
<text name="MeshDetailText">
Detalle de la malla:
@@ -86,7 +98,7 @@
<check_box initial_value="true" label="Avatares simulados" name="AvatarImpostors"/>
<check_box initial_value="true" label="Renderizado por hardware" name="AvatarVertexProgram"/>
<check_box initial_value="true" label="Ropas del avatar" name="AvatarCloth"/>
- <text name="TerrainDetailText">
+ <text left="402" name="TerrainDetailText">
Detalle del terreno:
</text>
<radio_group name="TerrainDetailRadio">
diff --git a/indra/newview/skins/default/xui/es/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/es/panel_preferences_privacy.xml
index adc0862cf1..c162130af6 100644
--- a/indra/newview/skins/default/xui/es/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/es/panel_preferences_privacy.xml
@@ -11,7 +11,7 @@
<check_box label="Sólo saben si estoy conectado mis amigos y grupos" name="online_visibility"/>
<check_box label="Sólo pueden llamarme o mandarme un MI mis amigos y grupos" name="voice_call_friends_only_check"/>
<check_box label="Desconectar el micrófono cuando finalicen las llamadas" name="auto_disengage_mic_check"/>
- <check_box label="Mostrar mis Hitos favoritos al Inicio de sesión (menú desplegable &quot;Empezar en&quot;)" name="favorites_on_login_check"/>
+ <check_box label="Mostrar mis Hitos favoritos al Inicio de sesión (menú desplegable &quot;Empezar &#10;en&quot;)" name="favorites_on_login_check" top_pad="15"/>
<text name="Logs:">
Registros de chat:
</text>
diff --git a/indra/newview/skins/default/xui/es/panel_preferences_sound.xml b/indra/newview/skins/default/xui/es/panel_preferences_sound.xml
index 8ce8e23138..75d175b262 100644
--- a/indra/newview/skins/default/xui/es/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/es/panel_preferences_sound.xml
@@ -12,9 +12,9 @@
<slider label="Ambiental" name="Wind Volume"/>
<slider label="Efectos de sonido" name="SFX Volume"/>
<slider label="Música en streaming" name="Music Volume"/>
- <check_box label="Activados" name="enable_music"/>
+ <check_box label="Activada" name="enable_music"/>
<slider label="Multimedia" name="Media Volume"/>
- <check_box label="Activada" name="enable_media"/>
+ <check_box label="Activados" name="enable_media"/>
<slider label="Chat de voz" name="Voice Volume"/>
<check_box label="Activado" name="enable_voice_check"/>
<check_box label="Permitir la ejecución automática de los media" name="media_auto_play_btn" tool_tip="Marcar esto para permitir la ejecución automática de los media" value="true"/>
diff --git a/indra/newview/skins/default/xui/es/panel_region_covenant.xml b/indra/newview/skins/default/xui/es/panel_region_covenant.xml
index 06f4fffacf..2beacda235 100644
--- a/indra/newview/skins/default/xui/es/panel_region_covenant.xml
+++ b/indra/newview/skins/default/xui/es/panel_region_covenant.xml
@@ -52,7 +52,7 @@ del estado.
Calificación:
</text>
<text name="region_maturity_text">
- &apos;Adult&apos;
+ Adulto
</text>
<text name="resellable_lbl">
Revender:
diff --git a/indra/newview/skins/default/xui/es/panel_region_general.xml b/indra/newview/skins/default/xui/es/panel_region_general.xml
index fe7f51c74e..453d1fe43c 100644
--- a/indra/newview/skins/default/xui/es/panel_region_general.xml
+++ b/indra/newview/skins/default/xui/es/panel_region_general.xml
@@ -25,6 +25,7 @@
<check_box label="Permitir la reventa del terreno" name="allow_land_resell_check"/>
<check_box label="Permitir unir/dividir el terreno" name="allow_parcel_changes_check"/>
<check_box label="Bloquear el mostrar el terreno en la búsqueda" name="block_parcel_search_check" tool_tip="Permitir que la gente vea esta región y sus parcelas en los resultados de la búsqueda."/>
+ <check_box label="Permitir objetos de red" name="mesh_rez_enabled_check" tool_tip="Permitir que los usuarios creen objetos de red en esta región"/>
<spinner label="Nº máximo de avatares" label_width="120" name="agent_limit_spin" width="180"/>
<spinner label="Plus de objetos" label_width="120" name="object_bonus_spin" width="180"/>
<text label="Calificación" name="access_text">
diff --git a/indra/newview/skins/default/xui/es/panel_sound_devices.xml b/indra/newview/skins/default/xui/es/panel_sound_devices.xml
new file mode 100644
index 0000000000..acf5c68cda
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_sound_devices.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<panel label="Configuración del dispositivo" name="device_settings_panel">
+ <panel.string name="default_text">
+ Por defecto
+ </panel.string>
+ <text name="Input">
+ Entrada
+ </text>
+ <text name="My volume label">
+ Mi volumen:
+ </text>
+ <slider_bar initial_value="1.0" name="mic_volume_slider" tool_tip="Cambia el volumen usando este deslizable"/>
+ <text name="wait_text">
+ Por favor, espera
+ </text>
+ <text name="Output">
+ Salida
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/strings.xml b/indra/newview/skins/default/xui/es/strings.xml
index 5a913c4c9d..72d7493a02 100644
--- a/indra/newview/skins/default/xui/es/strings.xml
+++ b/indra/newview/skins/default/xui/es/strings.xml
@@ -118,6 +118,139 @@
<string name="create_account_url">
http://join.secondlife.com/index.php?lang=es-ES
</string>
+ <string name="LoginFailedViewerNotPermitted">
+ Ya no puedes acceder a Second Life con el visor que estás utilizando. Visita la siguiente página para descargar un nuevo visor:
+http://secondlife.com/download.
+
+Si deseas obtener más información, consulta las preguntas frecuentes que aparecen a continuación:
+http://secondlife.com/viewer-access-faq
+ </string>
+ <string name="LoginIntermediateOptionalUpdateAvailable">
+ Actualización opcional del visor disponible: [VERSIÓN]
+ </string>
+ <string name="LoginFailedRequiredUpdate">
+ Actualización necesaria del visor: [VERSIÓN]
+ </string>
+ <string name="LoginFailedAlreadyLoggedIn">
+ El agente ya ha iniciado sesión.
+ </string>
+ <string name="LoginFailedAuthenticationFailed">
+ Lo sentimos. No ha sido posible iniciar sesión.
+Comprueba si has introducido correctamente
+ * El nombre de usuario (como juangarcia12 o estrella.polar)
+ * Contraseña
+Asimismo, asegúrate de que la tecla Mayús esté desactivada.
+ </string>
+ <string name="LoginFailedPasswordChanged">
+ Como precaución de seguridad, se ha modificado tu contraseña.
+Dirígete a la página de tu cuenta en http://secondlife.com/password
+y responde a la pregunta de seguridad para restablecer la contraseña.
+Lamentamos las molestias.
+ </string>
+ <string name="LoginFailedPasswordReset">
+ Hemos realizado unos cambios en nuestro sistema, por lo que deberás restablecer la contraseña.
+Dirígete a la página de tu cuenta en http://secondlife.com/password
+y responde a la pregunta de seguridad para restablecer la contraseña.
+Lamentamos las molestias.
+ </string>
+ <string name="LoginFailedEmployeesOnly">
+ Second Life no está disponible temporalmente debido a tareas de mantenimiento.
+Actualmente, solo se permite iniciar sesión a los empleados.
+Consulta www.secondlife.com/status si deseas obtener actualizaciones.
+ </string>
+ <string name="LoginFailedPremiumOnly">
+ Se ha restringido de manera temporal el inicio de sesión en Second Life con el fin de garantizar una experiencia óptima a nuestros residentes.
+
+Aquellos usuarios que dispongan de cuentas gratuitas no podrán acceder a Second Life durante este período de tiempo, ya que el propósito de esta medida es obtener espacio suficiente para los residentes que hayan pagado por acceder a Second Life.
+ </string>
+ <string name="LoginFailedComputerProhibited">
+ No se puede acceder a Second Life desde este ordenador.
+Si crees que se trata de un error, ponte en contacto con
+support@secondlife.com.
+ </string>
+ <string name="LoginFailedAcountSuspended">
+ No se podrá acceder a tu cuenta hasta las
+[HORA] (horario de la costa del Pacífico).
+ </string>
+ <string name="LoginFailedAccountDisabled">
+ En este momento no podemos completar la solicitud.
+Si deseas obtener asistencia, ponte en contacto con el departamento de soporte de Second Life a través de la página http://secondlife.com/support.
+Si no puedes cambiar la contraseña, llama al número (866) 476-9763.
+ </string>
+ <string name="LoginFailedTransformError">
+ Se han detectado datos incorrectos en el inicio de sesión.
+Ponte en contacto con support@secondlife.com.
+ </string>
+ <string name="LoginFailedAccountMaintenance">
+ Se están realizando tareas rutinarias de mantenimiento en tu cuenta.
+No se podrá acceder a tu cuenta hasta las
+[HORA] (horario de la costa del Pacífico).
+Si crees que se trata de un error, ponte en contacto con support@secondlife.com.
+ </string>
+ <string name="LoginFailedPendingLogoutFault">
+ La solicitud de cierre de sesión ha obtenido como resultado un error del simulador.
+ </string>
+ <string name="LoginFailedPendingLogout">
+ El sistema está cerrando tu sesión en estos momentos.
+Tu cuenta no estará disponible hasta las
+[HORA] (horario de la costa del Pacífico).
+ </string>
+ <string name="LoginFailedUnableToCreateSession">
+ No se ha podido crear una sesión válida.
+ </string>
+ <string name="LoginFailedUnableToConnectToSimulator">
+ No se ha podido establecer la conexión con un simulador.
+ </string>
+ <string name="LoginFailedRestrictedHours">
+ Tu cuenta solo puede acceder a Second Life
+entre las [INICIO] y las [FIN] (horario de la costa del Pacífico).
+Inténtalo de nuevo durante ese horario.
+Si crees que se trata de un error, ponte en contacto con support@secondlife.com.
+ </string>
+ <string name="LoginFailedIncorrectParameters">
+ Parámetros incorrectos.
+Si crees que se trata de un error, ponte en contacto con support@secondlife.com.
+ </string>
+ <string name="LoginFailedFirstNameNotAlphanumeric">
+ El parámetro correspondiente al nombre debe contener caracteres alfanuméricos.
+Si crees que se trata de un error, ponte en contacto con support@secondlife.com.
+ </string>
+ <string name="LoginFailedLastNameNotAlphanumeric">
+ El parámetro correspondiente al apellido debe contener caracteres alfanuméricos.
+Si crees que se trata de un error, ponte en contacto con support@secondlife.com.
+ </string>
+ <string name="LogoutFailedRegionGoingOffline">
+ La región se está desconectando.
+Intenta iniciar sesión de nuevo en unos instantes.
+ </string>
+ <string name="LogoutFailedAgentNotInRegion">
+ El agente no se encuentra en la región.
+Intenta iniciar sesión de nuevo en unos instantes.
+ </string>
+ <string name="LogoutFailedPendingLogin">
+ A esta región ya se ha accedido en otra sesión.
+Intenta iniciar sesión de nuevo en unos instantes.
+ </string>
+ <string name="LogoutFailedLoggingOut">
+ Se ha salido de la región en la sesión anterior.
+Intenta iniciar sesión de nuevo en unos instantes.
+ </string>
+ <string name="LogoutFailedStillLoggingOut">
+ La región aún está cerrando la sesión anterior.
+Intenta iniciar sesión de nuevo en unos instantes.
+ </string>
+ <string name="LogoutSucceeded">
+ Se ha salido de la región en la última sesión.
+Intenta iniciar sesión de nuevo en unos instantes.
+ </string>
+ <string name="LogoutFailedLogoutBegun">
+ La región ha comenzado el proceso de cierre de sesión.
+Intenta iniciar sesión de nuevo en unos instantes.
+ </string>
+ <string name="LoginFailedLoggingOutSession">
+ El sistema ha comenzado a cerrar la última sesión.
+Intenta iniciar sesión de nuevo en unos instantes.
+ </string>
<string name="AgentLostConnection">
Esta región puede estar teniendo problemas. Por favor, comprueba tu conexión a Internet.
</string>
@@ -426,6 +559,9 @@
<string name="symbolic folder link">
enlace de la carpeta
</string>
+ <string name="mesh">
+ red
+ </string>
<string name="AvatarAway">
Ausente
</string>
@@ -724,13 +860,13 @@
Controlar su cámara
</string>
<string name="SIM_ACCESS_PG">
- &apos;PG&apos;
+ General
</string>
<string name="SIM_ACCESS_MATURE">
- &apos;Mature&apos;
+ Moderado
</string>
<string name="SIM_ACCESS_ADULT">
- &apos;Adult&apos;
+ Adulto
</string>
<string name="SIM_ACCESS_DOWN">
Desconectado
@@ -1075,9 +1211,6 @@
<string name="InvFolder My Inventory">
Mi Inventario
</string>
- <string name="InvFolder My Favorites">
- Mis Favoritos
- </string>
<string name="InvFolder Library">
Biblioteca
</string>
@@ -1136,10 +1269,10 @@
Gestos
</string>
<string name="InvFolder Favorite">
- Favoritos
+ Mis Favoritos
</string>
<string name="InvFolder favorite">
- Favoritos
+ Mis Favoritos
</string>
<string name="InvFolder Current Outfit">
Vestuario actual
@@ -1153,6 +1286,9 @@
<string name="InvFolder Accessories">
Accesorios
</string>
+ <string name="InvFolder Meshes">
+ Redes
+ </string>
<string name="InvFolder Friends">
Amigos
</string>
@@ -1466,8 +1602,8 @@
<string name="Unknown">
(Desconocido)
</string>
- <string name="SummaryForTheWeek" value="Resumen de esta semana, empezando el"/>
- <string name="NextStipendDay" value="El próximo día de pago es el"/>
+ <string name="SummaryForTheWeek" value="Resumen de esta semana, empezando el "/>
+ <string name="NextStipendDay" value=". El próximo día de pago es el "/>
<string name="GroupIndividualShare" value="Grupo Aportaciones individuales"/>
<string name="GroupColumn" value="Grupo"/>
<string name="Balance">
@@ -1916,7 +2052,7 @@ Se esperaba .wav, .tga, .bmp, .jpg, .jpeg, o .bvh
Localización Linden
</string>
<string name="Adult">
- &apos;Adult&apos;
+ Adulto
</string>
<string name="Arts&amp;Culture">
Arte y Cultura
@@ -3489,6 +3625,9 @@ Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE].
<string name="LocationCtrlComboBtnTooltip">
Historial de mis localizaciones
</string>
+ <string name="LocationCtrlForSaleTooltip">
+ Comprar este terreno
+ </string>
<string name="LocationCtrlAdultIconTooltip">
Región Adulta
</string>
@@ -3663,6 +3802,9 @@ Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE].
<string name="session_initialization_timed_out_error">
Se ha agotado el tiempo del inicio de sesión
</string>
+ <string name="Home position set.">
+ Posición inicial establecida.
+ </string>
<string name="voice_morphing_url">
http://secondlife.com/landing/voicemorphing
</string>
diff --git a/indra/newview/skins/default/xui/fr/floater_about.xml b/indra/newview/skins/default/xui/fr/floater_about.xml
index f963a40cd3..e3e3169161 100644
--- a/indra/newview/skins/default/xui/fr/floater_about.xml
+++ b/indra/newview/skins/default/xui/fr/floater_about.xml
@@ -56,27 +56,32 @@ Tous nos remerciements aux résidents suivants pour avoir testé cette 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
- cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se)
- expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd.
- FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org).
- GL Copyright (C) 1999-2004 Brian Paul.
- Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited.
- jpeg2000 Copyright (C) 2001, David Taubman, The University of New South
- Wales (UNSW)
- 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 et Mark Adler.
- google-perftools Copyright (c) 2005, Google Inc.
-
- Tous droits réservés. Voir licenses.txt pour plus de détails.
+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.
- Codage Audio du chat vocal : Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1
- Annex C)
+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.
+
+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)
</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 a33c0344f7..bef41bb1ba 100644
--- a/indra/newview/skins/default/xui/fr/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/fr/floater_about_land.xml
@@ -411,11 +411,11 @@ texture :
<text name="replace_texture_help">
Les objets avec cette texture affichent le film ou la page web quand vous cliquez sur la flèche Jouer. Sélectionnez l&apos;image miniature pour choisir une texture différente.
</text>
- <check_box label="Échelle automatique" left="97" name="media_auto_scale" tool_tip="Si vous sélectionnez cette option, le contenu de cette parcelle sera automatiquement mis à l&apos;échelle. La qualité visuelle sera peut-être amoindrie mais vous n&apos;aurez à faire aucune autre mise à l&apos;échelle ou alignement."/>
- <text left="102" name="media_size" tool_tip="Taille du média Web, laisser 0 pour la valeur par défaut." width="105">
+ <check_box label="Échelle automatique" name="media_auto_scale" tool_tip="Si vous sélectionnez cette option, le contenu de cette parcelle sera automatiquement mis à l&apos;échelle. La qualité visuelle sera peut-être amoindrie mais vous n&apos;aurez à faire aucune autre mise à l&apos;échelle ou alignement."/>
+ <text name="media_size" tool_tip="Taille du média Web, laisser 0 pour la valeur par défaut.">
Taille :
</text>
- <spinner left_delta="89" name="media_size_width" tool_tip="Taille du média Web, laisser 0 pour la valeur par défaut."/>
+ <spinner name="media_size_width" tool_tip="Taille du média Web, laisser 0 pour la valeur par défaut."/>
<spinner name="media_size_height" tool_tip="Taille du média Web, laisser 0 pour la valeur par défaut."/>
<text name="pixels">
pixels
diff --git a/indra/newview/skins/default/xui/fr/floater_buy_contents.xml b/indra/newview/skins/default/xui/fr/floater_buy_contents.xml
index 7aa142b13e..0436dc8a91 100644
--- a/indra/newview/skins/default/xui/fr/floater_buy_contents.xml
+++ b/indra/newview/skins/default/xui/fr/floater_buy_contents.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_buy_contents" title="ACHETER DES CONTENUS">
<text name="contains_text">
- [NAME] contient :
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; contient :
</text>
<text name="buy_text">
Acheter [AMOUNT] L$ à [NAME] ?
diff --git a/indra/newview/skins/default/xui/fr/floater_customize.xml b/indra/newview/skins/default/xui/fr/floater_customize.xml
deleted file mode 100644
index ff407b25c1..0000000000
--- a/indra/newview/skins/default/xui/fr/floater_customize.xml
+++ /dev/null
@@ -1,530 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater customize" title="APPARENCE">
- <tab_container name="customize tab container" tab_min_width="150">
- <text label="Parties du corps" name="body_parts_placeholder">
- Parties du corps
- </text>
- <panel label="Silhouette" left="154" name="Shape" width="389">
- <button label="Rétablir" label_selected="Rétablir" name="Revert"/>
- <button label="Corps" label_selected="Corps" name="Body"/>
- <button label="Tête" label_selected="Tête" name="Head"/>
- <button label="Yeux" label_selected="Yeux" name="Eyes"/>
- <button label="Oreilles" label_selected="Oreilles" name="Ears"/>
- <button label="Nez" label_selected="Nez" name="Nose"/>
- <button label="Bouche" label_selected="Bouche" name="Mouth"/>
- <button label="Menton" label_selected="Menton" name="Chin"/>
- <button label="Torse" label_selected="Torse" name="Torso"/>
- <button label="Jambes" label_selected="Jambes" name="Legs"/>
- <radio_group name="sex radio">
- <radio_item label="Femme" name="radio" value="0"/>
- <radio_item label="Homme" name="radio2" value="1"/>
- </radio_group>
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: impossible de modifier
- </text>
- <text name="title_loading">
- [DESC]: en cours de chargement...
- </text>
- <text name="title_not_worn">
- [DESC]: non portée
- </text>
- <text name="path">
- Emplacement : [PATH]
- </text>
- <text name="not worn instructions">
- Pour changer de silhouette, faites-en glisser une de votre inventaire à votre avatar. Vous pouvez aussi en créer une nouvelle et la porter.
- </text>
- <text name="no modify instructions">
- Vous n&apos;avez pas la permission de modifier cet objet.
- </text>
- <text name="Item Action Label" right="92">
- Silhouette :
- </text>
- <button label="Créer une silhouette" label_selected="Créer une silhouette" name="Create New"/>
- <button label="Enregistrer" label_selected="Enregistrer" name="Save"/>
- <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/>
- </panel>
- <panel label="Peau" name="Skin">
- <button label="Couleur" label_selected="Couleur" name="Skin Color" width="84"/>
- <button label="Détails visage" label_selected="Détails visage" name="Face Detail" width="84"/>
- <button label="Maquillage" label_selected="Maquillage" name="Makeup" width="84"/>
- <button label="Détails corps" label_selected="Détails corps" name="Body Detail" width="84"/>
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: impossible de modifier
- </text>
- <text name="title_loading">
- [DESC]: en cours de chargement...
- </text>
- <text name="title_not_worn">
- [DESC]: non portée
- </text>
- <text name="path">
- Emplacement : [PATH]
- </text>
- <text name="not worn instructions">
- Pour changer de peau, faites-en glisser une à partir de votre inventaire. Vous pouvez aussi en créer une nouvelle et la porter.
- </text>
- <text name="no modify instructions">
- Vous n&apos;avez pas la permission de modifier cet objet.
- </text>
- <text name="Item Action Label" right="92">
- Peau :
- </text>
- <texture_picker label="Tatouages tête" name="Head Tattoos" tool_tip="Cliquez pour sélectionner une image" width="78"/>
- <texture_picker label="Tatouages haut" name="Upper Tattoos" tool_tip="Cliquez pour sélectionner une image" width="78"/>
- <texture_picker label="Tatouages bas" name="Lower Tattoos" tool_tip="Cliquez pour sélectionner une image" width="78"/>
- <button label="Créer une peau" label_selected="Créer une peau" name="Create New"/>
- <button label="Enregistrer" label_selected="Enregistrer" name="Save"/>
- <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/>
- <button label="Rétablir" label_selected="Rétablir" name="Revert"/>
- </panel>
- <panel label="Cheveux" name="Hair">
- <button label="Couleur" label_selected="Couleur" name="Color"/>
- <button label="Style" label_selected="Style" name="Style"/>
- <button label="Sourcils" label_selected="Sourcils" name="Eyebrows"/>
- <button label="Pilosité" label_selected="Pilosité" name="Facial"/>
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: impossible de modifier
- </text>
- <text name="title_loading">
- [DESC]: en cours de chargement...
- </text>
- <text name="title_not_worn">
- [DESC]: non portés
- </text>
- <text name="path">
- Emplacement : [PATH]
- </text>
- <text name="not worn instructions">
- Pour changer de cheveux, faites-en glisser à partir de votre inventaire. Vous pouvez aussi en créer de nouveaux et les porter.
- </text>
- <text name="no modify instructions">
- Vous n&apos;avez pas la permission de modifier cet objet.
- </text>
- <text name="Item Action Label" right="92">
- Cheveux :
- </text>
- <texture_picker label="Texture" name="Texture" tool_tip="Cliquez pour sélectionner une image"/>
- <button label="Créer des cheveux" label_selected="Créer des cheveux" name="Create New"/>
- <button label="Enregistrer" label_selected="Enregistrer" name="Save"/>
- <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/>
- <button label="Rétablir" label_selected="Rétablir" name="Revert"/>
- </panel>
- <panel label="Yeux" name="Eyes">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: impossible de modifier
- </text>
- <text name="title_loading">
- [DESC]: en cours de chargement...
- </text>
- <text name="title_not_worn">
- [DESC]: non portés
- </text>
- <text name="path">
- Emplacement : [PATH]
- </text>
- <text name="not worn instructions">
- Pour changer d&apos;yeux, faites-en glisser une paire de votre inventaire à votre avatar. Vous pouvez aussi en créer de nouveaux et les porter.
- </text>
- <text name="no modify instructions">
- Vous n&apos;avez pas la permission de modifier cet objet.
- </text>
- <text name="Item Action Label" right="92">
- Yeux :
- </text>
- <texture_picker label="Iris" name="Iris" tool_tip="Cliquez pour sélectionner une image"/>
- <button label="Créer des yeux" label_selected="Créer des yeux" name="Create New"/>
- <button label="Enregistrer" label_selected="Enregistrer" name="Save"/>
- <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/>
- <button label="Rétablir" label_selected="Rétablir" name="Revert"/>
- </panel>
- <text label="Habits" name="clothes_placeholder">
- Habits
- </text>
- <panel label="Chemise" name="Shirt">
- <texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image" width="74"/>
- <color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/>
- <button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/>
- <button label="Créer une chemise" label_selected="Créer une chemise" name="Create New"/>
- <button label="Enregistrer" label_selected="Enregistrer" name="Save"/>
- <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/>
- <button label="Rétablir" label_selected="Rétablir" name="Revert"/>
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: impossible de modifier
- </text>
- <text name="title_loading">
- [DESC]: en cours de chargement...
- </text>
- <text name="title_not_worn">
- [DESC]: non portée
- </text>
- <text name="path">
- Emplacement : [PATH]
- </text>
- <text name="not worn instructions">
- Pour changer de chemise, faites-en glisser une à partir de votre inventaire. Vous pouvez aussi en créer une nouvelle et la porter.
- </text>
- <text name="no modify instructions">
- Vous n&apos;avez pas la permission de modifier cet objet.
- </text>
- <text name="Item Action Label" right="92">
- Chemise :
- </text>
- </panel>
- <panel label="Pantalon" name="Pants">
- <texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image" width="74"/>
- <color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/>
- <button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/>
- <button label="Créer un pantalon" label_selected="Créer un pantalon" name="Create New"/>
- <button label="Enregistrer" label_selected="Enregistrer" name="Save"/>
- <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/>
- <button label="Rétablir" label_selected="Rétablir" name="Revert"/>
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: impossible de modifier
- </text>
- <text name="title_loading">
- [DESC]: en cours de chargement...
- </text>
- <text name="title_not_worn">
- [DESC]: non porté
- </text>
- <text name="path">
- Emplacement : [PATH]
- </text>
- <text name="not worn instructions">
- Pour changer de pantalon, faites-en glisser un à partir de votre inventaire. Vous pouvez aussi en créer un nouveau et le porter.
- </text>
- <text name="no modify instructions">
- Vous n&apos;avez pas la permission de modifier cet objet.
- </text>
- <text name="Item Action Label" right="92">
- Pantalon :
- </text>
- </panel>
- <panel label="Chaussures" name="Shoes">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: impossible de modifier
- </text>
- <text name="title_loading">
- [DESC]: en cours de chargement...
- </text>
- <text name="title_not_worn">
- [DESC]: non portées
- </text>
- <text name="path">
- Emplacement : [PATH]
- </text>
- <text name="not worn instructions">
- Pour changer de chaussures, faites-en glisser une paire de votre inventaire à votre avatar. Vous pouvez aussi en créer des nouvelles et les porter.
- </text>
- <button label="Créer des chaussures" label_selected="Créer des chaussures" name="Create New"/>
- <text name="no modify instructions">
- Vous n&apos;avez pas la permission de modifier cet objet.
- </text>
- <text name="Item Action Label" right="92">
- Chaussures :
- </text>
- <texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image" width="74"/>
- <color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/>
- <button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/>
- <button label="Enregistrer" label_selected="Enregistrer" name="Save"/>
- <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/>
- <button label="Rétablir" label_selected="Rétablir" name="Revert"/>
- </panel>
- <panel label="Chaussettes" name="Socks">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: impossible de modifier
- </text>
- <text name="title_loading">
- [DESC]: en cours de chargement...
- </text>
- <text name="title_not_worn">
- [DESC]: non portées
- </text>
- <text name="path">
- Emplacement : [PATH]
- </text>
- <text name="not worn instructions">
- Pour changer de chaussettes, faites-en glisser une paire à partir de votre inventaire. Vous pouvez aussi en créer des nouvelles et les porter.
- </text>
- <button label="Créer des chaussettes" label_selected="Créer des chaussettes" name="Create New"/>
- <text name="no modify instructions">
- Vous n&apos;avez pas la permission de modifier cet objet.
- </text>
- <text name="Item Action Label" right="92">
- Chaussettes :
- </text>
- <texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image" width="74"/>
- <color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/>
- <button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/>
- <button label="Enregistrer" label_selected="Enregistrer" name="Save"/>
- <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/>
- <button label="Rétablir" label_selected="Rétablir" name="Revert"/>
- </panel>
- <panel label="Veste" name="Jacket">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: impossible de modifier
- </text>
- <text name="title_loading">
- [DESC]: en cours de chargement...
- </text>
- <text name="title_not_worn">
- [DESC]: non portée
- </text>
- <text name="path">
- Emplacement : [PATH]
- </text>
- <text name="not worn instructions">
- Pour changer de veste, faites-en glisser une à partir de votre inventaire. Vous pouvez aussi en créer une nouvelle et la porter.
- </text>
- <button label="Créer une veste" label_selected="Créer une veste" name="Create New"/>
- <text name="no modify instructions">
- Vous n&apos;avez pas la permission de modifier cet objet.
- </text>
- <text name="Item Action Label" right="92">
- Veste :
- </text>
- <texture_picker label="Tissu (dessus)" name="Upper Fabric" tool_tip="Cliquez pour sélectionner une image" width="81"/>
- <texture_picker label="Tissu (dessous)" name="Lower Fabric" tool_tip="Cliquez pour sélectionner une image" width="81"/>
- <color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="81"/>
- <button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/>
- <button label="Enregistrer" label_selected="Enregistrer" name="Save"/>
- <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/>
- <button label="Rétablir" label_selected="Rétablir" name="Revert"/>
- </panel>
- <panel label="Gants" name="Gloves">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: impossible de modifier
- </text>
- <text name="title_loading">
- [DESC]: en cours de chargement...
- </text>
- <text name="title_not_worn">
- [DESC]: non portés
- </text>
- <text name="path">
- Emplacement : [PATH]
- </text>
- <text name="not worn instructions">
- Pour changer de gants, faites-en glisser une paire à partir de votre inventaire. Vous pouvez aussi en créer de nouveaux et les porter.
- </text>
- <button label="Créer des gants" label_selected="Créer des gants" name="Create New"/>
- <text name="no modify instructions">
- Vous n&apos;avez pas la permission de modifier cet objet.
- </text>
- <text name="Item Action Label" right="92">
- Gants :
- </text>
- <texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image" width="74"/>
- <color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/>
- <button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/>
- <button label="Enregistrer" label_selected="Enregistrer" name="Save"/>
- <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/>
- <button label="Rétablir" label_selected="Rétablir" name="Revert"/>
- </panel>
- <panel label="Débardeur" name="Undershirt">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: impossible de modifier
- </text>
- <text name="title_loading">
- [DESC]: en cours de chargement...
- </text>
- <text name="title_not_worn">
- [DESC]: non porté
- </text>
- <text name="path">
- Emplacement : [PATH]
- </text>
- <text name="not worn instructions">
- Pour changer de débardeur, faites-en glisser un à partir de votre inventaire. Vous pouvez aussi en créer un nouveau et le porter.
- </text>
- <button label="Créer un débardeur" label_selected="Créer un débardeur" name="Create New"/>
- <text name="no modify instructions">
- Vous n&apos;avez pas la permission de modifier cet objet.
- </text>
- <text name="Item Action Label">
- Débardeur :
- </text>
- <texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image" width="74"/>
- <color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/>
- <button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/>
- <button label="Enregistrer" label_selected="Enregistrer" name="Save"/>
- <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/>
- <button label="Rétablir" label_selected="Rétablir" name="Revert"/>
- </panel>
- <panel label="Caleçon" name="Underpants">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: impossible de modifier
- </text>
- <text name="title_loading">
- [DESC]: en cours de chargement...
- </text>
- <text name="title_not_worn">
- [DESC]: non porté
- </text>
- <text name="path">
- Emplacement : [PATH]
- </text>
- <text name="not worn instructions">
- Pour changer de caleçon, faites-en glisser un à partir de votre inventaire. Vous pouvez aussi en créer un nouveau et le porter.
- </text>
- <button label="Créer un caleçon" label_selected="Créer un caleçon" name="Create New"/>
- <text name="no modify instructions">
- Vous n&apos;avez pas la permission de modifier cet objet.
- </text>
- <text name="Item Action Label">
- Caleçon :
- </text>
- <texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image" width="74"/>
- <color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/>
- <button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/>
- <button label="Enregistrer" label_selected="Enregistrer" name="Save"/>
- <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/>
- <button label="Rétablir" label_selected="Rétablir" name="Revert"/>
- </panel>
- <panel label="Jupe" name="Skirt">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: impossible de modifier
- </text>
- <text name="title_loading">
- [DESC]: en cours de chargement...
- </text>
- <text name="title_not_worn">
- [DESC]: non portée
- </text>
- <text name="path">
- Emplacement : [PATH]
- </text>
- <text name="not worn instructions">
- Pour changer de jupe, faites-en glisser une à partir de votre inventaire. Vous pouvez aussi en créer une nouvelle et la porter.
- </text>
- <button label="Créer une jupe" label_selected="Créer une jupe" name="Create New"/>
- <text name="no modify instructions">
- Vous n&apos;avez pas la permission de modifier cet objet.
- </text>
- <text name="Item Action Label" right="92">
- Jupe :
- </text>
- <texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image" width="74"/>
- <color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/>
- <button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/>
- <button label="Enregistrer" label_selected="Enregistrer" name="Save"/>
- <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/>
- <button label="Rétablir" label_selected="Rétablir" name="Revert"/>
- </panel>
- <panel label="Tatouage" name="Tattoo">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: impossible de modifier
- </text>
- <text name="title_loading">
- [DESC]: en cours de chargement...
- </text>
- <text name="title_not_worn">
- [DESC]: non porté
- </text>
- <text name="path">
- Dans [PATH]
- </text>
- <text name="not worn instructions">
- Pour changer de tatouage, faites-en glisser un de votre inventaire à votre avatar. Vous pouvez aussi en créer un nouveau et le porter.
- </text>
- <button label="Créer un nouveau tatouage" label_selected="Créer un nouveau tatouage" name="Create New"/>
- <text name="no modify instructions">
- Vous n&apos;avez pas le droit de modifier cet objet.
- </text>
- <text name="Item Action Label">
- Tatouage :
- </text>
- <texture_picker label="Tatouage tête" name="Head Tattoo" tool_tip="Cliquez pour sélectionner une image"/>
- <texture_picker label="Tatouage haut" name="Upper Tattoo" tool_tip="Cliquez pour sélectionner une image"/>
- <texture_picker label="Tatouage bas" name="Lower Tattoo" tool_tip="Cliquez pour sélectionner une image"/>
- <button label="Enlever" label_selected="Enlever" name="Take Off"/>
- <button label="Enregistrer" label_selected="Enregistrer" name="Save"/>
- <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/>
- <button label="Rétablir" label_selected="Rétablir" name="Revert"/>
- </panel>
- <panel label="Alpha" name="Alpha">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: impossible de modifier
- </text>
- <text name="title_loading">
- [DESC]: en cours de chargement...
- </text>
- <text name="title_not_worn">
- [DESC]: non porté
- </text>
- <text name="path">
- Dans [PATH]
- </text>
- <text name="not worn instructions">
- Pour changer de masque alpha, faites-en glisser un de votre inventaire à votre avatar. Vous pouvez aussi en créer un nouveau et le porter.
- </text>
- <button label="Créer un nouvel alpha" label_selected="Créer un nouvel alpha" name="Create New"/>
- <text name="no modify instructions">
- Vous n&apos;avez pas le droit de modifier cet objet.
- </text>
- <text name="Item Action Label">
- Alpha :
- </text>
- <texture_picker label="Alpha bas" name="Lower Alpha" tool_tip="Cliquez pour sélectionner une image"/>
- <texture_picker label="Alpha haut" name="Upper Alpha" tool_tip="Cliquez pour sélectionner une image"/>
- <texture_picker label="Alpha tête" name="Head Alpha" tool_tip="Cliquez pour sélectionner une image"/>
- <texture_picker label="Alpha yeux" name="Eye Alpha" tool_tip="Cliquez pour sélectionner une image"/>
- <texture_picker label="Alpha cheveux" name="Hair Alpha" tool_tip="Cliquez pour sélectionner une image"/>
- <button label="Enlever" label_selected="Enlever" name="Take Off"/>
- <button label="Enregistrer" label_selected="Enregistrer" name="Save"/>
- <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/>
- <button label="Rétablir" label_selected="Rétablir" name="Revert"/>
- </panel>
- </tab_container>
- <scroll_container left="251" name="panel_container"/>
- <button label="Infos scripts" label_selected="Infos scripts" name="script_info" tool_tip="Afficher les scripts attachés à votre avatar"/>
- <button label="Créer tenue" label_selected="Créer une tenue..." name="make_outfit_btn"/>
- <button label="Annuler" label_selected="Annuler" name="Cancel"/>
- <button label="OK" label_selected="OK" name="Ok"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/fr/floater_day_cycle_options.xml
deleted file mode 100644
index 0ce17b9dc6..0000000000
--- a/indra/newview/skins/default/xui/fr/floater_day_cycle_options.xml
+++ /dev/null
@@ -1,94 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Day Cycle Floater" title="EDITEUR DU CYCLE DU JOUR">
- <tab_container name="Day Cycle Tabs">
- <panel label="Cycle du jour" name="Day Cycle">
- <button label="?" name="WLDayCycleHelp"/>
- <text name="WL12am">
- Min.
- </text>
- <text name="WL3am">
- 3h
- </text>
- <text name="WL6am">
- 6h
- </text>
- <text name="WL9amHash">
- 9h
- </text>
- <text name="WL12pmHash">
- Midi
- </text>
- <text name="WL3pm">
- 15h
- </text>
- <text name="WL6pm">
- 18h
- </text>
- <text name="WL9pm">
- 21h
- </text>
- <text name="WL12am2">
- Min.
- </text>
- <text name="WL12amHash">
- |
- </text>
- <text name="WL3amHash">
- I
- </text>
- <text name="WL6amHash">
- |
- </text>
- <text name="WL9amHash2">
- I
- </text>
- <text name="WL12pmHash2">
- |
- </text>
- <text name="WL3pmHash">
- I
- </text>
- <text name="WL6pmHash">
- |
- </text>
- <text name="WL9pmHash">
- I
- </text>
- <text name="WL12amHash2">
- |
- </text>
- <button label="Ajouter clé" label_selected="Ajouter clé" name="WLAddKey"/>
- <button label="Supprimer clé" label_selected="Supprimer clé" name="WLDeleteKey"/>
- <text name="WLCurKeyFrameText">
- Réglages des images-clés :
- </text>
- <text name="WLCurKeyTimeText">
- Heure de la clé :
- </text>
- <spinner label="Heure" name="WLCurKeyHour"/>
- <spinner label="Min" name="WLCurKeyMin"/>
- <text name="WLCurKeyTimeText2">
- Préréglages clés :
- </text>
- <combo_box label="Préréglage" name="WLKeyPresets"/>
- <text name="DayCycleText">
- Snap :
- </text>
- <combo_box label="5 min" name="WLSnapOptions"/>
- <text name="DayCycleText2">
- Durée du cycle :
- </text>
- <spinner label="Heure" name="WLLengthOfDayHour"/>
- <spinner label="Min" name="WLLengthOfDayMin"/>
- <spinner label="Sec" name="WLLengthOfDaySec"/>
- <text name="DayCycleText3">
- Aperçu :
- </text>
- <button label="Lire" label_selected="Lire" name="WLAnimSky"/>
- <button label="Arrêter" label_selected="Stop" name="WLStopAnimSky"/>
- <button label="Utiliser heure domaine" label_selected="Aller heure domaine" name="WLUseLindenTime"/>
- <button label="Enregistrer jour test" label_selected="Enregistrer jour test" name="WLSaveDayCycle"/>
- <button label="Charger jour test" label_selected="Charger jour test" name="WLLoadDayCycle"/>
- </panel>
- </tab_container>
-</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_env_settings.xml b/indra/newview/skins/default/xui/fr/floater_env_settings.xml
deleted file mode 100644
index dd714e85b6..0000000000
--- a/indra/newview/skins/default/xui/fr/floater_env_settings.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Environment Editor Floater" title="ÉDITEUR D&apos;ENVIRONNEMENT">
- <floater.string name="timeStr">
- [hour12,datetime,utc]:[min,datetime,utc] [ampm,datetime,utc]
- </floater.string>
- <text bottom="-45" name="EnvTimeText" top="29">
- Heure de la
-journée
- </text>
- <text bottom_delta="-36" name="EnvTimeText2">
- Midi
- </text>
- <text name="EnvCloudText">
- Couverture
-nuageuse
- </text>
- <text bottom="-45" name="EnvWaterColorText" top="29">
- Couleur de
-l&apos;eau
- </text>
- <color_swatch name="EnvWaterColor" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs"/>
- <text name="EnvWaterFogText">
- Brouillard
-dans l&apos;eau
- </text>
- <button bottom="-144" label="Utiliser heure du domaine" name="EnvUseEstateTimeButton" width="152"/>
- <button label="Ciel avancé" left="162" name="EnvAdvancedSkyButton" width="145"/>
- <button label="Eau avancée" left="316" name="EnvAdvancedWaterButton" width="145"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_import_collada.xml b/indra/newview/skins/default/xui/fr/floater_import_collada.xml
new file mode 100644
index 0000000000..03804c4bd5
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_import_collada.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Import Collada" title="Importation de scène">
+ <text name="mesh count">
+ Maillages : [COUNT]
+ </text>
+ <text name="texture count">
+ Textures : [COUNT]
+ </text>
+ <text name="status">
+ État : [STATUS]
+ </text>
+ <button label="Annuler" name="cancel"/>
+ <button label="OK" name="ok"/>
+ <string name="status_idle">
+ Inactif
+ </string>
+ <string name="status_uploading">
+ Chargement de [NAME]
+ </string>
+ <string name="status_creating">
+ Création de l&apos;objet [NAME]
+ </string>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/fr/floater_inventory_view_finder.xml
index 1ee85a77ce..7567817f3a 100644
--- a/indra/newview/skins/default/xui/fr/floater_inventory_view_finder.xml
+++ b/indra/newview/skins/default/xui/fr/floater_inventory_view_finder.xml
@@ -5,6 +5,7 @@
<check_box label="Habits" name="check_clothing"/>
<check_box label="Gestes" name="check_gesture"/>
<check_box label="Repères" name="check_landmark"/>
+ <check_box label="Maillages" name="check_mesh"/>
<check_box label="Notes" name="check_notecard"/>
<check_box label="Objets" name="check_object"/>
<check_box label="Scripts" name="check_script"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_model_preview.xml b/indra/newview/skins/default/xui/fr/floater_model_preview.xml
new file mode 100644
index 0000000000..213847bbd0
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_model_preview.xml
@@ -0,0 +1,231 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Model Preview" title="Chargement du modèle">
+ <string name="status_idle">
+ Inactif
+ </string>
+ <string name="status_reading_file">
+ Chargement...
+ </string>
+ <string name="status_generating_meshes">
+ Génération des maillages...
+ </string>
+ <string name="status_vertex_number_overflow">
+ Erreur : valeur de sommet supérieure à 65534. Opération abandonnée.
+ </string>
+ <string name="high">
+ Élevé
+ </string>
+ <string name="medium">
+ Moyen
+ </string>
+ <string name="low">
+ Faible
+ </string>
+ <string name="lowest">
+ Le plus faible
+ </string>
+ <string name="mesh_status_good">
+ Bon à publier !
+ </string>
+ <string name="mesh_status_na">
+ N/A
+ </string>
+ <string name="mesh_status_none">
+ Aucun
+ </string>
+ <string name="mesh_status_submesh_mismatch">
+ Un nombre différent de faces d&apos;application de texture est associé aux niveaux de détail.
+ </string>
+ <string name="mesh_status_mesh_mismatch">
+ Un nombre différent d&apos;instances de maillage est associé aux niveaux de détail.
+ </string>
+ <string name="mesh_status_too_many_vertices">
+ Trop de sommets pour le niveau de détail.
+ </string>
+ <string name="mesh_status_missing_lod">
+ Niveau de détail requis manquant.
+ </string>
+ <string name="layer_all">
+ Tout
+ </string>
+ <string name="decomposing">
+ Analyse...
+ </string>
+ <string name="simplifying">
+ Simplification...
+ </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>
+ <panel>
+ <text name="streaming cost">
+ Coût de la ressource : [COST]
+ </text>
+ <text name="physics cost">
+ Coût des propriétés physiques : [COST]
+ </text>
+ <text name="upload fee">
+ Frais de chargement : N/A
+ </text>
+ </panel>
+ <text name="status">
+ [STATUS]
+ </text>
+ <button label="Valeurs par défaut" name="reset_btn" tool_tip="Rétablir les valeurs par défaut."/>
+ <button label="Charger" name="ok_btn" tool_tip="Charger dans le simulateur."/>
+ <button label="Annuler" name="cancel_btn"/>
+ <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">
+ Limite du triangle
+ </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 fil 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 :
+ </text>
+ <text name="share_tolderance_text">
+ Tolérance partage :
+ </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>
+ <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"/>
+ </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>
+ <panel name="physics info">
+ <slider label="Décomposition de l&apos;aperçu :" name="physics_explode"/>
+ <text name="physics_triangles">
+ Triangles : [TRIANGLES]
+ </text>
+ <text name="physics_points">
+ Sommets : [POINTS]
+ </text>
+ <text name="physics_hulls">
+ Enveloppes : [HULLS]
+ </text>
+ </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
+ </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>
+</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
new file mode 100644
index 0000000000..bb64361959
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_model_wizard.xml
@@ -0,0 +1,241 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Model Wizard" title="ASSISTANT DE CHARGEMENT DE MODÈLE">
+ <button label="5. Chargement" name="upload_btn"/>
+ <button label="4. Vérification" name="review_btn"/>
+ <button label="3. Propriétés physiques" name="physics2_btn"/>
+ <button label="3. Propriétés physiques" name="physics_btn"/>
+ <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="header_panel">
+ <text name="header_text">
+ Charger le modèle
+ </text>
+ </panel>
+ <text name="description">
+ Cet Assistant vous aidera à importer des modèles de maillage dans Second Life. Commencez par spécifier un fichier contenant le modèle à importer. Second Life prend en charge les fichiers COLLADA (.dae).
+ </text>
+ <panel name="content">
+ <text name="Cache location">
+ Nom du fichier :
+ </text>
+ <button label="Parcourir..." label_selected="Parcourir..." name="browse"/>
+ <text name="dimensions">
+ X : Y : Z :
+ </text>
+ <text name="dimension_dividers">
+ | |
+ </text>
+ </panel>
+ </panel>
+ <panel name="optimize_panel">
+ <panel name="header_panel">
+ <text name="header_text">
+ Optimisation
+ </text>
+ </panel>
+ <text name="description">
+ Cet Assistant a optimisé votre modèle afin d&apos;améliorer les performances. Vous pouvez ajuster les résultats du processus d&apos;optimisation ci-dessous ou cliquer sur Suiv. pour continuer.
+ </text>
+ <panel name="content">
+ <text name="high_detail_text">
+ Générer le niveau de détail : Élevé
+ </text>
+ <text name="medium_detail_text">
+ Générer le niveau de détail : Moyen
+ </text>
+ <text name="low_detail_text">
+ Générer le niveau de détail : Faible
+ </text>
+ <text name="lowest_detail_text">
+ Générer le niveau de détail : Le plus faible
+ </text>
+ </panel>
+ <panel name="content2">
+ <text name="lod_label">
+ Aperçu du modèle :
+ </text>
+ <combo_box name="preview_lod_combo2" 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="streaming cost">
+ Coût de la ressource : [COST]
+ </text>
+ <text name="dimensions">
+ X : Y : Z :
+ </text>
+ <text name="dimension_dividers">
+ | |
+ </text>
+ </panel>
+ </panel>
+ <panel name="physics_panel">
+ <panel name="header_panel">
+ <text name="header_text">
+ Propriétés physiques
+ </text>
+ </panel>
+ <text name="description">
+ Cet Assistant créera une forme physique déterminant le mode d&apos;interaction de l&apos;objet avec les autres objets et avatars. Réglez le curseur sur le niveau de détail le plus approprié à l&apos;utilisation de l&apos;objet :
+ </text>
+ <panel name="content">
+ <text name="streaming cost">
+ Coût de la ressource : [COST]
+ </text>
+ </panel>
+ </panel>
+ <panel name="physics2_panel">
+ <panel name="header_panel">
+ <text name="header_text">
+ Propriétés physiques
+ </text>
+ </panel>
+ <text name="description">
+ Prévisualisez la forme physique ci-dessous, puis cliquez sur Suiv. pour continuer. Le bouton Préc. permet de modifier cette forme, le cas échéant.
+ </text>
+ <panel name="content">
+ <text name="lod_label">
+ Aperçu du modèle :
+ </text>
+ <combo_box name="preview_lod_combo3" 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="dimensions">
+ X : Y : Z :
+ </text>
+ <text name="dimension_dividers">
+ | |
+ </text>
+ <text name="streaming cost">
+ Coût de la ressource : [COST]
+ </text>
+ </panel>
+ </panel>
+ <panel name="review_panel">
+ <panel name="header_panel">
+ <text name="header_text">
+ Vérification
+ </text>
+ </panel>
+ <text name="description">
+ Vérifiez les détails ci-dessous, puis cliquez sur Charger pour charger le modèle. Votre solde en L$ sera alors débité.
+ </text>
+ <panel name="content">
+ <text name="lod_label">
+ Aperçu du modèle :
+ </text>
+ <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="dimensions">
+ X : Y : Z :
+ </text>
+ <text name="dimension_dividers">
+ | |
+ </text>
+ </panel>
+ <text name="streaming cost">
+ Coût de la ressource : [COST]
+ </text>
+ <text name="physics cost">
+ Coût des propriétés physiques : [COST]
+ </text>
+ </panel>
+ <panel name="upload_panel">
+ <panel name="header_panel">
+ <text name="header_text">
+ Chargement terminé !
+ </text>
+ </panel>
+ <text name="description">
+ Félicitations ! Votre modèle a été chargé. Il se trouve dans le dossier Objets de votre inventaire.
+ </text>
+ </panel>
+ <button label="&lt;&lt; Préc." name="back"/>
+ <button label="Suiv. &gt;&gt;" name="next"/>
+ <button label="Charger" name="upload" tool_tip="Charger dans le simulateur."/>
+ <button label="Annuler" name="cancel"/>
+ <button label="Fermer" name="close"/>
+ <spinner name="import_scale" value="1.0"/>
+ <string name="status_idle">
+ Inactif
+ </string>
+ <string name="status_reading_file">
+ Chargement...
+ </string>
+ <string name="status_generating_meshes">
+ Génération des maillages...
+ </string>
+ <string name="status_vertex_number_overflow">
+ Erreur : valeur de sommet supérieure à 65534. Opération abandonnée.
+ </string>
+ <string name="high">
+ Élevé
+ </string>
+ <string name="medium">
+ Moyen
+ </string>
+ <string name="low">
+ Faible
+ </string>
+ <string name="lowest">
+ Le plus faible
+ </string>
+ <string name="mesh_status_good">
+ Bon à publier !
+ </string>
+ <string name="mesh_status_na">
+ N/A
+ </string>
+ <string name="mesh_status_none">
+ Aucun
+ </string>
+ <string name="mesh_status_submesh_mismatch">
+ Un nombre différent de faces d&apos;application de texture est associé aux niveaux de détail.
+ </string>
+ <string name="mesh_status_mesh_mismatch">
+ Un nombre différent d&apos;instances de maillage est associé aux niveaux de détail.
+ </string>
+ <string name="mesh_status_too_many_vertices">
+ Trop de sommets pour le niveau de détail.
+ </string>
+ <string name="mesh_status_missing_lod">
+ Niveau de détail requis manquant.
+ </string>
+ <string name="layer_all">
+ Tout
+ </string>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_postcard.xml b/indra/newview/skins/default/xui/fr/floater_postcard.xml
index a4b0675fe4..e65dfb09b4 100644
--- a/indra/newview/skins/default/xui/fr/floater_postcard.xml
+++ b/indra/newview/skins/default/xui/fr/floater_postcard.xml
@@ -1,28 +1,21 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Postcard" title="ENVOYER LA PHOTO PAR E-MAIL">
- <text name="to_label" width="135">
+ <text name="to_label">
E-mail du destinataire :
</text>
- <line_editor left="143" name="to_form" width="130" left_delta="146"/>
<text name="from_label">
Votre e-mail :
</text>
- <line_editor left="143" name="from_form" width="130" left_delta="146"/>
<text name="name_label">
Votre nom :
</text>
- <line_editor left="143" name="name_form" width="130" left_delta="146"/>
<text name="subject_label">
Objet :
</text>
- <line_editor left="143" name="subject_form" width="130" left_delta="146"/>
<line_editor label="Saisir ici votre objet" name="subject_form"/>
<text name="msg_label">
Message :
</text>
- <check_box label="Publier sur le web" name="allow_publish_check" tool_tip="Publiez cette carte postale sur le web."/>
- <check_box label="Contenu adulte" name="mature_check" tool_tip="Cette carte postale est à caractère adulte."/>
- <button label="?" name="publish_help_btn"/>
<text_editor name="msg_form">
Saisir ici votre message
</text_editor>
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 b14aecafbb..a9407abfde 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" left="20" 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="162" name="Anim audition btn" tool_tip="Lire cette animation de façon à ce que vous soyez la seule personne à pouvoir la voir" width="125"/>
+ <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"/>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_price_for_listing.xml b/indra/newview/skins/default/xui/fr/floater_price_for_listing.xml
new file mode 100644
index 0000000000..a6e598dd2b
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_price_for_listing.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="price_for_listing" title="PUBLIER UNE PETITE ANNONCE">
+ <text name="explanation_text">
+ Votre petite annonce sera visible pendant une semaine à partir du jour de sa publication.
+
+La position de votre annonce dans les listes dépend du montant que vous décidez de payer.
+
+Si vous choisissez de payer plus cher, votre publicité sera plus visible dans les résultats de recherche.
+ </text>
+ <text name="price_text">
+ Coût de l&apos;annonce :
+ </text>
+ <text name="price_symbol">
+ L$
+ </text>
+ <button label="OK" name="set_price_btn"/>
+ <button label="Annuler" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_sell_land.xml b/indra/newview/skins/default/xui/fr/floater_sell_land.xml
index b5ffc8f9c7..c5fb0ea0d4 100644
--- a/indra/newview/skins/default/xui/fr/floater_sell_land.xml
+++ b/indra/newview/skins/default/xui/fr/floater_sell_land.xml
@@ -5,16 +5,16 @@
<text name="info_parcel_label">
Parcelle :
</text>
- <text name="info_parcel" left="70">
+ <text name="info_parcel">
NOM DE LA PARCELLE
</text>
<text name="info_size_label">
Taille :
</text>
- <text name="info_size" left="70">
+ <text name="info_size">
[AREA] m²
</text>
- <text bottom_delta="-60" name="info_action">
+ <text name="info_action">
Pour vendre cette parcelle :
</text>
<text name="price_label">
@@ -38,27 +38,27 @@
<text name="sell_to_text">
Vendez votre terrain à n&apos;importe qui ou uniquement à un acheteur spécifique.
</text>
- <combo_box bottom_delta="-32" name="sell_to">
+ <combo_box name="sell_to">
<combo_box.item label="- Sélectionnez -" name="--selectone--"/>
<combo_box.item label="Tout le monde" name="Anyone"/>
<combo_box.item label="Personne spécifique :" name="Specificuser:"/>
</combo_box>
- <button label="Sélectionner" name="sell_to_select_agent" width="100"/>
+ <button label="Sélectionner" name="sell_to_select_agent"/>
<text name="sell_objects_label">
3. Vendre les objets avec ce terrain ?
</text>
<text name="sell_objects_text">
Les objets transférables se trouvant sur la parcelle changeront de propriétaire.
</text>
- <radio_group bottom_delta="-54" name="sell_objects" right="430">
+ <radio_group name="sell_objects">
<radio_item label="Non, rester le propriétaire des objets" name="no"/>
<radio_item label="Oui, vendre les objets avec le terrain" name="yes"/>
</radio_group>
- <button label="Afficher les objets" name="show_objects" right="420" width="120"/>
- <text bottom_delta="-30" name="nag_message_label">
+ <button label="Afficher les objets" name="show_objects"/>
+ <text name="nag_message_label" font="SansSerif">
Rappel : Toutes les ventes sont définitives.
</text>
- <button label="Indiquer le terrain à vendre" name="sell_btn" width="165"/>
+ <button label="Indiquer le terrain à vendre" name="sell_btn"/>
<button label="Annuler" name="cancel_btn"/>
</panel>
</scroll_container>
diff --git a/indra/newview/skins/default/xui/fr/floater_sound_devices.xml b/indra/newview/skins/default/xui/fr/floater_sound_devices.xml
new file mode 100644
index 0000000000..9e2e4333aa
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_sound_devices.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_sound_devices" title="Périphériques audio">
+ <text name="voice_label">
+ Chat vocal
+ </text>
+ <check_box label="Activé" name="enable_voice"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_tools.xml b/indra/newview/skins/default/xui/fr/floater_tools.xml
index fd72e6ac15..09d77a8d34 100644
--- a/indra/newview/skins/default/xui/fr/floater_tools.xml
+++ b/indra/newview/skins/default/xui/fr/floater_tools.xml
@@ -125,6 +125,18 @@
<text name="prim_count">
Prims : [COUNT]
</text>
+ <text name="linked_set_count">
+ Groupes liés : [COUNT]
+ </text>
+ <text name="linked_set_cost" tool_tip="Coût des groupes liés actuellement sélectionnés en tant que [prims],[physics complexity].">
+ Coût : [COST] / [PHYSICS]
+ </text>
+ <text name="object_count">
+ Objets : [COUNT]
+ </text>
+ <text name="object_cost" tool_tip="Coût des objets actuellement sélectionnés en tant que [prims] / [physics complexity].">
+ Coût : [COST] / [PHYSICS]
+ </text>
<tab_container name="Object Info Tabs">
<panel label="Général" name="General">
<panel.string name="text deed continued">
@@ -269,15 +281,6 @@
<combo_box.item label="Anneau" name="Ring"/>
<combo_box.item label="Sculptie" name="Sculpted"/>
</combo_box>
- <combo_box name="material">
- <combo_box.item label="Pierre" name="Stone"/>
- <combo_box.item label="Métal" name="Metal"/>
- <combo_box.item label="Verre" name="Glass"/>
- <combo_box.item label="Bois" name="Wood"/>
- <combo_box.item label="Chair" name="Flesh"/>
- <combo_box.item label="Plastique" name="Plastic"/>
- <combo_box.item label="Caoutchouc" name="Rubber"/>
- </combo_box>
<text name="text cut">
Découpe du tracé (déb./fin)
</text>
@@ -350,9 +353,19 @@
<combo_box.item label="Tore" name="Torus"/>
<combo_box.item label="Plan" name="Plane"/>
<combo_box.item label="Cylindre" name="Cylinder"/>
+ <combo_box.item label="Maillage" name="Mesh"/>
</combo_box>
</panel>
<panel label="Attributs" name="Features">
+ <panel.string name="None">
+ Aucun
+ </panel.string>
+ <panel.string name="Prim">
+ Prim
+ </panel.string>
+ <panel.string name="Convex Hull">
+ Enveloppe convexe
+ </panel.string>
<text name="select_single">
Choisir une prim pour changer les attributs.
</text>
@@ -377,6 +390,23 @@
<spinner label="Point central" name="Light Focus"/>
<spinner label="Atténuation" name="Light Falloff"/>
<spinner label="Ambiance" name="Light Ambiance"/>
+ <text name="label physicsshapetype">
+ Type de forme physique :
+ </text>
+ <combo_box name="Physics Shape Type Combo Ctrl" tool_tip="Choisir un type de forme physique."/>
+ <combo_box name="material">
+ <combo_box.item label="Pierre" name="Stone"/>
+ <combo_box.item label="Métal" name="Metal"/>
+ <combo_box.item label="Verre" name="Glass"/>
+ <combo_box.item label="Bois" name="Wood"/>
+ <combo_box.item label="Chair" name="Flesh"/>
+ <combo_box.item label="Plastique" name="Plastic"/>
+ <combo_box.item label="Caoutchouc" name="Rubber"/>
+ </combo_box>
+ <spinner label="Gravité" name="Physics Gravity"/>
+ <spinner label="Friction" name="Physics Friction"/>
+ <spinner label="Densité" name="Physics Density"/>
+ <spinner label="Restitution" name="Physics Restitution"/>
</panel>
<panel label="Texture" name="Texture">
<panel.string name="string repeats per meter">
diff --git a/indra/newview/skins/default/xui/fr/floater_water.xml b/indra/newview/skins/default/xui/fr/floater_water.xml
deleted file mode 100644
index 7d1e3cd65c..0000000000
--- a/indra/newview/skins/default/xui/fr/floater_water.xml
+++ /dev/null
@@ -1,70 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Water Floater" title="ÉDITEUR D&apos;EAU AVANCÉ">
- <floater.string name="WLDefaultWaterNames">
- Valeur par défaut:Transparente:Bassin:Trouble:Première plaie:SERPENT !!!:Valdez
- </floater.string>
- <text name="KeyFramePresetsText" width="120">
- Préréglages :
- </text>
- <button label="Nouveau" label_selected="Nouveau" name="WaterNewPreset"/>
- <button label="Enregistrer" label_selected="Enregistrer" left_delta="75" name="WaterSavePreset" width="75"/>
- <button label="Supprimer" label_selected="Supprimer" left_delta="80" name="WaterDeletePreset"/>
- <tab_container name="Water Tabs">
- <panel label="PARAMÈTRES" name="Settings">
- <text name="BHText">
- Couleur du brouillard dans l&apos;eau
- </text>
- <color_swatch left="75" name="WaterFogColor" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs"/>
- <text name="WaterFogDensText">
- Densité du brouillard
- </text>
- <text name="WaterUnderWaterFogModText">
- Brouillard sous-marin
- </text>
- <text name="BDensText">
- Échelle des vaguelettes
- </text>
- <slider label="1" name="WaterNormalScaleX"/>
- <slider label="2" name="WaterNormalScaleY"/>
- <slider label="3" name="WaterNormalScaleZ"/>
- <text name="HDText">
- Échelle Fresnel
- </text>
- <text name="FresnelOffsetText">
- Décalage Fresnel
- </text>
- <text name="DensMultText">
- Réfraction au-dessus
- </text>
- <text name="WaterScaleBelowText">
- Réfraction en dessous
- </text>
- <text name="MaxAltText">
- Multiplicateur de flou
- </text>
- </panel>
- <panel label="IMAGE" name="Waves">
- <text name="BHText">
- Direction grande vague
- </text>
- <text name="WaterWave1DirXText">
- X
- </text>
- <text name="WaterWave1DirYText">
- Y
- </text>
- <text name="BHText2">
- Direction petite vague
- </text>
- <text name="WaterWave2DirXText">
- X
- </text>
- <text name="WaterWave2DirYText">
- Y
- </text>
- <text name="BHText3">
- Normal Map
- </text>
- </panel>
- </tab_container>
-</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_wearable_save_as.xml b/indra/newview/skins/default/xui/fr/floater_wearable_save_as.xml
deleted file mode 100644
index 5dda347fcf..0000000000
--- a/indra/newview/skins/default/xui/fr/floater_wearable_save_as.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="modal container">
- <button label="Enregistrer" label_selected="Enregistrer" name="Save"/>
- <button label="Annuler" label_selected="Annuler" name="Cancel"/>
- <text name="Save item as:">
- Enregistrer l&apos;objet dans mon inventaire comme :
- </text>
- <line_editor name="name ed">
- Nouveau [DESC]
- </line_editor>
-</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_windlight_options.xml b/indra/newview/skins/default/xui/fr/floater_windlight_options.xml
deleted file mode 100644
index 657e5f5051..0000000000
--- a/indra/newview/skins/default/xui/fr/floater_windlight_options.xml
+++ /dev/null
@@ -1,189 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="WindLight floater" title="ÉDITEUR DE CIEL AVANCÉ" width="706">
- <text name="KeyFramePresetsText">
- Préréglages :
- </text>
- <button label="Nouveau" label_selected="Nouveau" name="WLNewPreset"/>
- <button label="Enregistrer" label_selected="Enregistrer" left_delta="75" name="WLSavePreset" width="75"/>
- <button label="Supprimer" label_selected="Supprimer" left_delta="80" name="WLDeletePreset"/>
- <button label="Éditeur du cycle du jour" label_selected="Éditeur du cycle du jour" left_delta="95" left_pad="20" name="WLDayCycleMenuButton" width="150"/>
- <tab_container name="WindLight Tabs" width="706">
- <panel label="ATMOSPHÈRE" name="Atmosphere">
- <text name="BHText">
- Bleu de l&apos;horizon
- </text>
- <button label="?" name="WLBlueHorizonHelp"/>
- <text name="BHText2">
- R
- </text>
- <text name="BHText3">
- V
- </text>
- <text name="BHText4">
- B
- </text>
- <text name="BHText5">
- I
- </text>
- <text name="BDensText">
- Quantité de brume
- </text>
- <button label="?" name="WLHazeHorizonHelp"/>
- <text name="BDensText2">
- Densité du bleu
- </text>
- <button label="?" name="WLBlueDensityHelp"/>
- <text name="BHText6">
- R
- </text>
- <text name="BHText7">
- V
- </text>
- <text name="BHText8">
- B
- </text>
- <text name="BHText9">
- I
- </text>
- <text name="HDText">
- Densité de la brume
- </text>
- <button label="?" name="WLHazeDensityHelp"/>
- <text name="DensMultText">
- Multiplicateur de densité
- </text>
- <button label="?" name="WLDensityMultHelp"/>
- <text name="WLDistanceMultText">
- Multiplicateur de distance
- </text>
- <button label="?" name="WLDistanceMultHelp"/>
- <text name="MaxAltText">
- Altitude maximum
- </text>
- <button label="?" name="WLMaxAltitudeHelp"/>
- </panel>
- <panel label="LUMIÈRE" name="Lighting">
- <text name="SLCText">
- Couleur soleil/lune
- </text>
- <button label="?" name="WLSunlightColorHelp"/>
- <text name="BHText">
- R
- </text>
- <text name="BHText2">
- V
- </text>
- <text name="BHText3">
- B
- </text>
- <text name="BHText4">
- I
- </text>
- <text name="TODText">
- Position soleil/lune
- </text>
- <button label="?" name="WLTimeOfDayHelp"/>
- <text name="WLAmbientText">
- Éclairage ambiant
- </text>
- <button label="?" name="WLAmbientHelp"/>
- <text name="BHText5">
- R
- </text>
- <text name="BHText6">
- V
- </text>
- <text name="BHText7">
- B
- </text>
- <text name="BHText8">
- I
- </text>
- <text name="WLEastAngleText">
- Angle du levant
- </text>
- <button label="?" name="WLEastAngleHelp"/>
- <text name="SunGlowText">
- Rayonnement du soleil
- </text>
- <button label="?" name="WLSunGlowHelp"/>
- <slider label="Netteté " name="WLGlowB"/>
- <slider label="Taille " name="WLGlowR"/>
- <text name="SceneGammaText">
- Gamma de la scène
- </text>
- <button label="?" name="WLSceneGammaHelp"/>
- <text name="WLStarText">
- Éclat des étoiles
- </text>
- <button label="?" name="WLStarBrightnessHelp"/>
- </panel>
- <panel label="NUAGES" name="Clouds">
- <text name="WLCloudColorText">
- Couleur des nuages
- </text>
- <button label="?" name="WLCloudColorHelp"/>
- <text name="BHText">
- R
- </text>
- <text name="BHText2">
- V
- </text>
- <text name="BHText3">
- B
- </text>
- <text name="BHText4">
- I
- </text>
- <text name="WLCloudColorText2">
- Nuages XY/densité
- </text>
- <button label="?" name="WLCloudDensityHelp"/>
- <text name="BHText5">
- X
- </text>
- <text name="BHText6">
- Y
- </text>
- <text name="BHText7">
- D
- </text>
- <text name="WLCloudCoverageText">
- Couverture nuageuse
- </text>
- <button label="?" left="407" name="WLCloudCoverageHelp"/>
- <text name="WLCloudScaleText">
- Altitude des nuages
- </text>
- <button label="?" left="407" name="WLCloudScaleHelp"/>
- <text name="WLCloudDetailText">
- Détails nuages (XY/densité)
- </text>
- <button bottom_delta="-2" label="?" left="407" name="WLCloudDetailHelp"/>
- <text name="BHText8">
- X
- </text>
- <text name="BHText9">
- Y
- </text>
- <text name="BHText10">
- D
- </text>
- <text name="WLCloudScrollXText">
- Direction et vitesse X
- </text>
- <button label="?" name="WLCloudScrollXHelp"/>
- <check_box label="Verrouiller" name="WLCloudLockX"/>
- <text name="WLCloudScrollYText">
- Direction et vitesse Y
- </text>
- <button label="?" name="WLCloudScrollYHelp"/>
- <check_box label="Verrouiller" name="WLCloudLockY"/>
- <check_box label="Nuages classiques" name="DrawClassicClouds"/>
- <button label="?" name="WLClassicCloudsHelp"/>
- </panel>
- </tab_container>
- <string name="WLDefaultSkyNames">
- A-Minuit:A-Midi:A-3h:A-15h:A-16h30:A-6h:A-18h:A-9h:A-21h:Barcelone:Blizzard:Bleu mi-journée:Après-midi sur la côte:Coucher de soleil (côte):Valeur par défaut:Coucher de soleil (désert):Belle journée:Gros nuages floconneux:Brumeux:Funky Funky:Funky Funky Funky:Gelatto:Fantôme:Vérités incohérentes:Mi-journée 1:Mi-journée 2:Mi-journée 3:Mi-journée 4:Nuit:Pirate:Mauve:Rêve de navigateur:Sensualité pure
- </string>
-</floater>
diff --git a/indra/newview/skins/default/xui/fr/language_settings.xml b/indra/newview/skins/default/xui/fr/language_settings.xml
index bd272e1f28..fdac9d65a7 100644
--- a/indra/newview/skins/default/xui/fr/language_settings.xml
+++ b/indra/newview/skins/default/xui/fr/language_settings.xml
@@ -4,6 +4,7 @@
<!-- Locale Information -->
<string name="MicrosoftLocale">french</string>
+ <string name="MacLocale">fr_FR.UTF-8</string>
<string name="DarwinLocale">fr_FR.UTF-8</string>
<string name="LinuxLocale">fr_FR.UTF-8</string>
diff --git a/indra/newview/skins/default/xui/fr/menu_inventory_add.xml b/indra/newview/skins/default/xui/fr/menu_inventory_add.xml
index 5d2b554dc3..1076af44d9 100644
--- a/indra/newview/skins/default/xui/fr/menu_inventory_add.xml
+++ b/indra/newview/skins/default/xui/fr/menu_inventory_add.xml
@@ -4,6 +4,8 @@
<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="Modèle..." name="Upload Model"/>
+ <menu_item_call label="Assistant Modèle..." name="Upload Model Wizard"/>
<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>
diff --git a/indra/newview/skins/default/xui/fr/menu_model_import_gear_default.xml b/indra/newview/skins/default/xui/fr/menu_model_import_gear_default.xml
new file mode 100644
index 0000000000..af6bfcd028
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/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="Afficher les arêtes" name="show_edges"/>
+ <menu_item_check label="Afficher les propriétés physiques" name="show_physics"/>
+ <menu_item_check label="Afficher les textures" name="show_textures"/>
+ <menu_item_check label="Afficher la pondération de la peau" name="show_skin_weight"/>
+ <menu_item_check label="Afficher la position des articulations" name="show_joint_positions"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_viewer.xml b/indra/newview/skins/default/xui/fr/menu_viewer.xml
index 1dd6da9d6f..d614cfe00c 100644
--- a/indra/newview/skins/default/xui/fr/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/fr/menu_viewer.xml
@@ -120,6 +120,8 @@
<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="Modèle..." name="Upload Model"/>
+ <menu_item_call label="Assistant Modèle..." name="Upload Model Wizard"/>
<menu_item_call label="Lot ([COST] L$ par fichier)..." name="Bulk Upload"/>
</menu>
<menu_item_call label="Annuler" name="Undo"/>
@@ -159,6 +161,7 @@
<menu_item_check label="Alpha" name="Alpha"/>
<menu_item_check label="Arbre" name="Tree"/>
<menu_item_check label="Avatars" name="Character"/>
+ <menu_item_check label="Patch de surface" name="Surface Patch"/>
<menu_item_check label="Ciel" name="Sky"/>
<menu_item_check label="Eau" name="Water"/>
<menu_item_check label="Sol" name="Ground"/>
@@ -217,6 +220,7 @@
<menu_item_check label="Console des catégories de textures" name="Texture Category"/>
<menu_item_check label="Chronos" name="Fast Timers"/>
<menu_item_check label="Mémoire" name="Memory"/>
+ <menu_item_check label="Statistiques de la scène" name="Scene Statistics"/>
<menu_item_call label="Infos de région vers la console de débogage" name="Region Info to Debug Console"/>
<menu_item_call label="Infos de groupe vers la console de débogage" name="Group Info to Debug Console"/>
<menu_item_call label="Infos de capacités vers la console de débogage" name="Capabilities Info to Debug Console"/>
@@ -227,6 +231,7 @@
</menu>
<menu label="Afficher les infos" name="Display Info">
<menu_item_check label="Afficher l&apos;heure" name="Show Time"/>
+ <menu_item_check label="Afficher le coût du chargement" name="Show Upload Cost"/>
<menu_item_check label="Afficher les infos de rendu" name="Show Render Info"/>
<menu_item_check label="Afficher les infos de texture" name="Show Texture Info"/>
<menu_item_check label="Afficher les matrices" name="Show Matrices"/>
@@ -252,8 +257,10 @@
</menu>
<menu label="Métadonnées de rendu" name="Render Metadata">
<menu_item_check label="Cadres" name="Bounding Boxes"/>
+ <menu_item_check label="Normales" name="Normals"/>
<menu_item_check label="Octree" name="Octree"/>
<menu_item_check label="Shadow Frusta" name="Shadow Frusta"/>
+ <menu_item_check label="Formes physiques" name="Physics Shapes"/>
<menu_item_check label="Occlusion" name="Occlusion"/>
<menu_item_check label="Lots de rendu" name="Render Batches"/>
<menu_item_check label="Type de mise à jour" name="Update Type"/>
@@ -261,9 +268,12 @@
<menu_item_check label="Priorité de la texture" name="Texture Priority"/>
<menu_item_check label="Zone de texture" name="Texture Area"/>
<menu_item_check label="Zone de face" name="Face Area"/>
+ <menu_item_check label="Infos sur le niveau de détail" name="LOD Info"/>
+ <menu_item_check label="File d&apos;attente pour la construction" name="Build Queue"/>
<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="Sculpture" name="Sculpt"/>
</menu>
<menu label="Rendu" name="Rendering">
<menu_item_check label="Axes" name="Axes"/>
@@ -271,7 +281,6 @@
<menu_item_call label="Base des infos de la texture sélectionnée" name="Selected Texture Info Basis"/>
<menu_item_check label="Filaire" name="Wireframe"/>
<menu_item_check label="Occlusion objet-objet" name="Object-Object Occlusion"/>
- <menu_item_check label="Objets de mémoire vidéo" name="Framebuffer Objects"/>
<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"/>
@@ -370,6 +379,7 @@
<menu_item_call label="Dump Local Textures" name="Dump Local Textures"/>
</menu>
<menu_item_check label="Textures HTTP" name="HTTP Textures"/>
+ <menu_item_check label="Inventaire HTTP" name="HTTP Inventory"/>
<menu_item_call label="Compresser les images" name="Compress Images"/>
<menu_item_check label="Output Debug Minidump" name="Output Debug Minidump"/>
<menu_item_check label="Console Window on next Run" name="Console Window"/>
diff --git a/indra/newview/skins/default/xui/fr/notifications.xml b/indra/newview/skins/default/xui/fr/notifications.xml
index 78890caabb..6bfab25087 100644
--- a/indra/newview/skins/default/xui/fr/notifications.xml
+++ b/indra/newview/skins/default/xui/fr/notifications.xml
@@ -2157,6 +2157,12 @@ Cela risque d&apos;impacter votre mot de passe.
<notification name="RezItemNoPermissions">
Droits insuffisants pour rezzer l&apos;objet.
</notification>
+ <notification name="IMAcrossParentEstates">
+ Impossible d&apos;envoyer d&apos;IM entre domaines parents.
+ </notification>
+ <notification name="TransferInventoryAcrossParentEstates">
+ Impossible de transférer l&apos;inventaire entre domaines parents.
+ </notification>
<notification name="UnableToLoadNotecard">
Impossible de lire les données de la note actuellement.
</notification>
@@ -2734,6 +2740,10 @@ Elles vont être bloquées pendant quelques secondes pour votre sécurité.
Le modérateur ignore vos paroles.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
+ <notification name="UploadCostConfirmation">
+ Ce chargement coûtera [PRICE] L$. Continuer ?
+ <usetemplate name="okcancelbuttons" notext="Annuler" yestext="Charger"/>
+ </notification>
<notification name="ConfirmClearTeleportHistory">
Voulez-vous vraiment supprimer votre historique des téléportations ?
<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
@@ -2745,6 +2755,9 @@ Le bouton sera affiché quand il y aura suffisamment de place.
<notification name="ShareNotification">
Sélectionnez les résidents avec lesquels partager l&apos;élément.
</notification>
+ <notification name="MeshUploadError">
+ Échec de chargement de [LABEL] : [MESSAGE] [IDENTIFIER] [INVALIDITY_IDENTIFIER]
+ </notification>
<notification name="ShareItemsConfirmation">
Voulez-vous vraiment partager les articles suivants :
@@ -2761,6 +2774,19 @@ avec les résidents suivants :
<notification name="DeedToGroupFail">
Échec de cession au groupe.
</notification>
+ <notification name="ReleaseLandThrottled">
+ Impossible d&apos;abandonner la parcelle [PARCEL_NAME] actuellement.
+ </notification>
+ <notification name="ReleasedLandWithReclaim">
+ La parcelle [PARCEL_NAME] de [AREA] m² a été libérée.
+
+Vous disposerez d&apos;un délai de récupération à 0 L$ de [RECLAIM_PERIOD] heures avant qu&apos;elle soit mise en vente pour tous.
+ </notification>
+ <notification name="ReleasedLandNoReclaim">
+ La parcelle [PARCEL_NAME] de [AREA] m² a été libérée.
+
+Elle est désormais disponible à l&apos;achat auprès de tous.
+ </notification>
<notification name="AvatarRezNotification">
([EXISTENCE] secondes d&apos;existence)
Nuage de l&apos;avatar [NAME] disparu au bout de [TIME] secondes.
@@ -2901,6 +2927,10 @@ Cliquez sur un point dans le monde et faites glisser votre souris pour faire tou
Pour créer et modifier des groupes, 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"/>
</notification>
+ <notification label="" name="NoPlaceInfo">
+ L&apos;affichage du profil du lieu est uniquement disponible en 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"/>
+ </notification>
<notification label="" name="NoPicks">
Pour créer et modifier des favoris, 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"/>
@@ -2921,9 +2951,18 @@ Cliquez sur un point dans le monde et faites glisser votre souris pour faire tou
Pour pouvoir payer d&apos;autres résidents, vous devez utiliser le mode Avancé. Voulez-vous quitter l&apos;application afin de changer de mode ?
<usetemplate name="okcancelbuttons" notext="Ne pas quitter" yestext="Quitter"/>
</notification>
- <global name="UnsupportedCPU">
- - Votre processeur ne remplit pas les conditions minimum requises.
- </global>
+ <notification label="" name="NoInventory">
+ L&apos;affichage de l&apos;inventaire 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="NoAppearance">
+ L&apos;Éditeur d&apos;apparence 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="NoSearch">
+ 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>
<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_edit_pick.xml b/indra/newview/skins/default/xui/fr/panel_edit_pick.xml
index 2364d9bbb2..247e18da82 100644
--- a/indra/newview/skins/default/xui/fr/panel_edit_pick.xml
+++ b/indra/newview/skins/default/xui/fr/panel_edit_pick.xml
@@ -29,7 +29,7 @@
<layout_panel name="layout_panel1">
<button label="Enregistrer" name="save_changes_btn"/>
</layout_panel>
- <layout_panel name="layout_panel1">
+ <layout_panel name="layout_panel2">
<button label="Annuler" name="cancel_btn"/>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/fr/panel_people.xml b/indra/newview/skins/default/xui/fr/panel_people.xml
index 166f04b3e4..b24c340708 100644
--- a/indra/newview/skins/default/xui/fr/panel_people.xml
+++ b/indra/newview/skins/default/xui/fr/panel_people.xml
@@ -66,16 +66,16 @@ Pour rechercher des résidents avec qui passer du temps, utilisez [secondlife://
<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="chat_btn_lp">
+ <layout_panel name="im_btn_lp">
<button label="IM" name="im_btn" tool_tip="Ouvrir une session IM"/>
</layout_panel>
- <layout_panel name="chat_btn_lp">
+ <layout_panel name="call_btn_lp">
<button label="Appel" name="call_btn" tool_tip="Appeler ce résident"/>
</layout_panel>
- <layout_panel name="chat_btn_lp">
+ <layout_panel name="share_btn_lp">
<button label="Partager" name="share_btn" tool_tip="Partager un article de l&apos;inventaire"/>
</layout_panel>
- <layout_panel name="chat_btn_lp">
+ <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>
diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_colors.xml b/indra/newview/skins/default/xui/fr/panel_preferences_colors.xml
index abdffd232a..e50fd2b6f3 100644
--- a/indra/newview/skins/default/xui/fr/panel_preferences_colors.xml
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_colors.xml
@@ -22,6 +22,9 @@
<text name="text_box5">
Erreurs
</text>
+ <text name="text_box10">
+ Direct
+ </text>
<text name="text_box7">
Propriétaire
</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 025a72a1d2..5bf2ef72f5 100644
--- a/indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml
@@ -27,8 +27,20 @@
</text>
<check_box initial_value="true" label="Eau transparente" name="TransparentWater"/>
<check_box initial_value="true" label="Placage de relief et brillance" name="BumpShiny"/>
+ <check_box initial_value="true" label="Lumières locales" name="LocalLights"/>
<check_box initial_value="true" label="Effets de base" name="BasicShaders" tool_tip="La désactivation de cette option peut éviter le plantage de certains pilotes de cartes graphiques"/>
<check_box initial_value="true" label="Effets atmosphériques" name="WindLightUseAtmosShaders"/>
+ <check_box initial_value="true" label="Éclairage et ombres" name="UseLightShaders"/>
+ <check_box initial_value="true" label="Occlusion ambiante" name="UseSSAO"/>
+ <check_box initial_value="true" label="Profondeur de champ" name="UseDoF"/>
+ <text name="shadows_label">
+ Ombres :
+ </text>
+ <combo_box name="ShadowDetail">
+ <combo_box.item label="Aucune" name="0"/>
+ <combo_box.item label="Soleil/Lune" name="1"/>
+ <combo_box.item label="Soleil/Lune + Projecteurs" name="2"/>
+ </combo_box>
<text name="reflection_label">
Reflets dans l&apos;eau :
</text>
diff --git a/indra/newview/skins/default/xui/fr/panel_region_general.xml b/indra/newview/skins/default/xui/fr/panel_region_general.xml
index ada4583648..b5795bebe2 100644
--- a/indra/newview/skins/default/xui/fr/panel_region_general.xml
+++ b/indra/newview/skins/default/xui/fr/panel_region_general.xml
@@ -25,6 +25,7 @@
<check_box label="Autoriser la revente" name="allow_land_resell_check"/>
<check_box label="Autoriser la fusion/division" name="allow_parcel_changes_check"/>
<check_box label="Ne pas afficher dans la recherche" name="block_parcel_search_check" tool_tip="Afficher cette région et ses parcelles dans les résultats de recherche"/>
+ <check_box label="Autoriser les objets de maillage" name="mesh_rez_enabled_check" tool_tip="Laisser les gens rezzer des objets de maillage dans cette région."/>
<spinner label="Nombre maximum d&apos;avatars" label_width="160" name="agent_limit_spin" width="240"/>
<spinner label="Bonus objet" label_width="160" name="object_bonus_spin" width="240"/>
<text label="Maturité" name="access_text">
diff --git a/indra/newview/skins/default/xui/fr/panel_sound_devices.xml b/indra/newview/skins/default/xui/fr/panel_sound_devices.xml
new file mode 100644
index 0000000000..a9802312dc
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_sound_devices.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<panel label="Paramètres du périphérique" name="device_settings_panel">
+ <panel.string name="default_text">
+ Valeur par défaut
+ </panel.string>
+ <text name="Input">
+ Entrée
+ </text>
+ <text name="My volume label">
+ Mon volume :
+ </text>
+ <slider_bar initial_value="1.0" name="mic_volume_slider" tool_tip="Régler le volume avec le curseur."/>
+ <text name="wait_text">
+ Veuillez patienter
+ </text>
+ <text name="Output">
+ Sortie
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/strings.xml b/indra/newview/skins/default/xui/fr/strings.xml
index a3369e6730..077e545851 100644
--- a/indra/newview/skins/default/xui/fr/strings.xml
+++ b/indra/newview/skins/default/xui/fr/strings.xml
@@ -130,6 +130,139 @@
<string name="create_account_url">
http://join.secondlife.com/index.php?lang=fr-FR
</string>
+ <string name="LoginFailedViewerNotPermitted">
+ Le client que vous utilisez ne permet plus d&apos;accéder à Second Life. Téléchargez un nouveau client à la page suivante :
+http://secondlife.com/download
+
+Pour plus d&apos;informations, consultez la page FAQ ci-dessous :
+http://secondlife.com/viewer-access-faq
+ </string>
+ <string name="LoginIntermediateOptionalUpdateAvailable">
+ Mise à jour facultative du client disponible : [VERSION]
+ </string>
+ <string name="LoginFailedRequiredUpdate">
+ Mise à jour du client requise : [VERSION]
+ </string>
+ <string name="LoginFailedAlreadyLoggedIn">
+ L&apos;agent est déjà connecté.
+ </string>
+ <string name="LoginFailedAuthenticationFailed">
+ Désolé ! La connexion a échoué.
+Veuillez vérifier que les éléments ci-dessous ont été correctement saisis :
+ * Nom d&apos;utilisateur (par exemple, bobsmith12 ou steller.sunshine)
+ * Mot de passe
+Assurez-vous également que la touche Verr. maj n&apos;est pas activée.
+ </string>
+ <string name="LoginFailedPasswordChanged">
+ Votre mot de passe a été modifié pour des raisons de sécurité.
+Veuillez accéder à votre compte à la page http://secondlife.com/password
+et répondre à la question de sécurité afin de réinitialiser votre mot de passe.
+Nous vous prions de nous excuser pour la gêne occasionnée.
+ </string>
+ <string name="LoginFailedPasswordReset">
+ Vous allez devoir réinitialiser votre mot de passe suite à quelques changements effectués sur notre système.
+Pour cela, accédez à votre compte à la page http://secondlife.com/password
+et répondez à la question de sécurité. Votre mot de passe sera réinitialisé.
+Nous vous prions de nous excuser pour la gêne occasionnée.
+ </string>
+ <string name="LoginFailedEmployeesOnly">
+ Second Life est temporairement fermé pour des raisons de maintenance.
+Seuls les employés peuvent actuellement y accéder.
+Consultez la page www.secondlife.com/status pour plus d&apos;informations.
+ </string>
+ <string name="LoginFailedPremiumOnly">
+ Les connexions à Second Life sont temporairement limitées afin de s&apos;assurer que l&apos;expérience des utilisateurs présents dans le monde virtuel soit optimale.
+
+Les personnes disposant de comptes gratuits ne pourront pas accéder à Second Life pendant ce temps afin de permettre à celles qui ont payé pour pouvoir utiliser Second Life puissent le faire.
+ </string>
+ <string name="LoginFailedComputerProhibited">
+ Impossible d&apos;accéder à Second Life depuis cet ordinateur.
+Si vous pensez qu&apos;il s&apos;agit d&apos;une erreur, contactez
+l&apos;Assistance à l&apos;adresse suivante : support@secondlife.com.
+ </string>
+ <string name="LoginFailedAcountSuspended">
+ Votre compte est inaccessible jusqu&apos;à
+[TIME], heure du Pacifique.
+ </string>
+ <string name="LoginFailedAccountDisabled">
+ Nous n&apos;avons pas réussi à traiter votre demande.
+Pour obtenir de l&apos;aide, veuillez contacter l&apos;Assistance Second Life à la page suivante : http://secondlife.com/support.
+Si vous ne parvenez pas à changer de mot de passe, veuillez appeler le (866) 476-9763.
+ </string>
+ <string name="LoginFailedTransformError">
+ Incohérence des données lors de la connexion.
+Veuillez contacter support@secondlife.com.
+ </string>
+ <string name="LoginFailedAccountMaintenance">
+ Des opérations de maintenance mineures sont actuellement effectuées sur votre compte.
+Votre compte est inaccessible jusqu&apos;à
+[TIME], heure du Pacifique.
+Si vous pensez qu&apos;il s&apos;agit d&apos;une erreur, contactez l&apos;Assistance à l&apos;adresse suivante : support@secondlife.com
+ </string>
+ <string name="LoginFailedPendingLogoutFault">
+ Le simulateur a renvoyé une erreur en réponse à la demande de déconnexion.
+ </string>
+ <string name="LoginFailedPendingLogout">
+ Le système est en train de vous déconnecter.
+Votre compte sera indisponible jusqu&apos;à
+[TIME], heure du Pacifique.
+ </string>
+ <string name="LoginFailedUnableToCreateSession">
+ Impossible de créer de session valide.
+ </string>
+ <string name="LoginFailedUnableToConnectToSimulator">
+ Impossible de se connecter à un simulateur.
+ </string>
+ <string name="LoginFailedRestrictedHours">
+ Votre compte permet uniquement d&apos;accéder à Second Life
+entre [START] et [END], heure du Pacifique.
+Veuillez réessayer au cours de la période indiquée.
+Si vous pensez qu&apos;il s&apos;agit d&apos;une erreur, contactez l&apos;Assistance à l&apos;adresse suivante : support@secondlife.com
+ </string>
+ <string name="LoginFailedIncorrectParameters">
+ Paramètres incorrects.
+Si vous pensez qu&apos;il s&apos;agit d&apos;une erreur, contactez l&apos;Assistance à l&apos;adresse suivante : support@secondlife.com
+ </string>
+ <string name="LoginFailedFirstNameNotAlphanumeric">
+ Le paramètre Prénom doit être alphanumérique.
+Si vous pensez qu&apos;il s&apos;agit d&apos;une erreur, contactez l&apos;Assistance à l&apos;adresse suivante : support@secondlife.com
+ </string>
+ <string name="LoginFailedLastNameNotAlphanumeric">
+ Le paramètre Nom doit être alphanumérique.
+Si vous pensez qu&apos;il s&apos;agit d&apos;une erreur, contactez l&apos;Assistance à l&apos;adresse suivante : support@secondlife.com
+ </string>
+ <string name="LogoutFailedRegionGoingOffline">
+ La région est en train d&apos;être mise hors ligne.
+Veuillez réessayer de vous connecter dans une minute.
+ </string>
+ <string name="LogoutFailedAgentNotInRegion">
+ Agent absent de la région.
+Veuillez réessayer de vous connecter dans une minute.
+ </string>
+ <string name="LogoutFailedPendingLogin">
+ Une autre session était en cours d&apos;ouverture au sein de la région.
+Veuillez réessayer de vous connecter dans une minute.
+ </string>
+ <string name="LogoutFailedLoggingOut">
+ La session précédente était en cours de fermeture au sein de la région.
+Veuillez réessayer de vous connecter dans une minute.
+ </string>
+ <string name="LogoutFailedStillLoggingOut">
+ Fermeture de la session précédente toujours en cours pour la région.
+Veuillez réessayer de vous connecter dans une minute.
+ </string>
+ <string name="LogoutSucceeded">
+ Dernière session fermée au sein de la région.
+Veuillez réessayer de vous connecter dans une minute.
+ </string>
+ <string name="LogoutFailedLogoutBegun">
+ Processus de déconnexion commencé pour la région.
+Veuillez réessayer de vous connecter dans une minute.
+ </string>
+ <string name="LoginFailedLoggingOutSession">
+ Le système a commencé à fermer votre dernière session.
+Veuillez réessayer de vous connecter dans une minute.
+ </string>
<string name="AgentLostConnection">
Il y a peut-être des problèmes techniques dans cette région. Veuillez vérifier votre connexion Internet.
</string>
@@ -441,6 +574,9 @@
<string name="symbolic folder link">
lien du dossier
</string>
+ <string name="mesh">
+ maillage
+ </string>
<string name="AvatarEditingAppearance">
(Apparence en cours de modification)
</string>
@@ -1102,9 +1238,6 @@
<string name="InvFolder My Inventory">
Mon inventaire
</string>
- <string name="InvFolder My Favorites">
- Mes Favoris
- </string>
<string name="InvFolder Library">
Bibliothèque
</string>
@@ -1163,10 +1296,10 @@
Gestes
</string>
<string name="InvFolder Favorite">
- Favoris
+ Mes Favoris
</string>
<string name="InvFolder favorite">
- Favoris
+ Mes Favoris
</string>
<string name="InvFolder Current Outfit">
Tenue actuelle
@@ -1180,6 +1313,9 @@
<string name="InvFolder Accessories">
Accessoires
</string>
+ <string name="InvFolder Meshes">
+ Maillages
+ </string>
<string name="InvFolder Friends">
Amis
</string>
@@ -1494,7 +1630,7 @@
(Inconnu)
</string>
<string name="SummaryForTheWeek" value="Récapitulatif de la semaine, début le "/>
- <string name="NextStipendDay" value="Prochaine prime le "/>
+ <string name="NextStipendDay" value=". Prochaine prime le "/>
<string name="GroupIndividualShare" value=" Groupe Part individuelle"/>
<string name="GroupColumn" value="Groupe"/>
<string name="Balance">
@@ -3762,6 +3898,9 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
<string name="session_initialization_timed_out_error">
Expiration du délai d&apos;initialisation de la session
</string>
+ <string name="Home position set.">
+ Emplacement du domicile défini.
+ </string>
<string name="voice_morphing_url">
http://secondlife.com/landing/voicemorphing
</string>
diff --git a/indra/newview/skins/default/xui/it/floater_about.xml b/indra/newview/skins/default/xui/it/floater_about.xml
index 140f7bdc14..214ae96373 100644
--- a/indra/newview/skins/default/xui/it/floater_about.xml
+++ b/indra/newview/skins/default/xui/it/floater_about.xml
@@ -56,26 +56,32 @@ Si ringraziano i seguenti residenti per aver contribuito a rendere questa versio
<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
- 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.
-
- Tutti i diritti riservati. Leggi licenses.txt per maggiori dettagli.
+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.
- Chat vocale Codifica audio: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)
+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.
+
+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)
</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 186ed59e36..a96433d7aa 100644
--- a/indra/newview/skins/default/xui/it/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/it/floater_about_land.xml
@@ -75,64 +75,64 @@ Vai al menu Mondo &gt; Informazioni sul terreno oppure seleziona un altro appezz
<text name="LandType">
Tipo:
</text>
- <text left="119" name="LandTypeText">
+ <text name="LandTypeText">
Mainland / Homestead
</text>
<text name="ContentRating" width="115">
Categoria di accesso:
</text>
- <text left="119" name="ContentRatingText">
+ <text name="ContentRatingText">
Adulti
</text>
<text name="Owner:">
Proprietario:
</text>
- <text left="119" name="OwnerText" width="227"/>
+ <text name="OwnerText" width="227"/>
<text name="Group:">
Gruppo:
</text>
- <text left="119" name="GroupText" width="227"/>
+ <text name="GroupText" width="227"/>
<button label="Imposta" name="Set..."/>
- <check_box label="Permetti cessione al gruppo" left="119" name="check deed" tool_tip="Un funzionario del gruppo può cedere questa terra al gruppo stesso cosicchè essa sarà  supportata dalle terre del gruppo."/>
+ <check_box label="Permetti cessione al gruppo" name="check deed" tool_tip="Un funzionario del gruppo può cedere questa terra al gruppo stesso cosicchè essa sarà  supportata dalle terre del gruppo."/>
<button label="Cedi" name="Deed..." tool_tip="Puoi solo offrire terra se sei un funzionario del gruppo selezionato."/>
- <check_box label="Il proprietario fa un contributo con la cessione" left="119" name="check contrib" tool_tip="Quando la terra è ceduta al gruppo, il proprietario precedente contribuisce con abbastanza allocazione di terra per supportarlo."/>
+ <check_box label="Il proprietario fa un contributo con la cessione" name="check contrib" tool_tip="Quando la terra è ceduta al gruppo, il proprietario precedente contribuisce con abbastanza allocazione di terra per supportarlo."/>
<text name="For Sale:">
In vendita:
</text>
- <text left="119" name="Not for sale.">
+ <text name="Not for sale.">
Non in vendita.
</text>
- <text left="119" name="For Sale: Price L$[PRICE].">
+ <text name="For Sale: Price L$[PRICE].">
Prezzo: [PRICE]L$ ([PRICE_PER_SQM]L$/m²).
</text>
- <text left="119" name="SalePending" width="321"/>
+ <text name="SalePending" width="321"/>
<button bottom="-242" label="Vendi la terra..." label_selected="Vendi la terra..." name="Sell Land..."/>
- <text left="119" name="For sale to">
+ <text name="For sale to">
In vendita a: [BUYER]
</text>
- <text left="119" name="Sell with landowners objects in parcel." width="240">
+ <text name="Sell with landowners objects in parcel.">
Gli oggetti sono inclusi nella vendita.
</text>
- <text left="119" name="Selling with no objects in parcel." width="240">
+ <text name="Selling with no objects in parcel.">
Gli oggetti non sono inclusi nella vendita.
</text>
- <button bottom="-242" font="SansSerifSmall" label="Annulla la vendita del terreno" label_selected="Annulla la vendita del terreno" left="275" name="Cancel Land Sale" width="165"/>
+ <button font="SansSerifSmall" label="Annulla la vendita del terreno" label_selected="Annulla la vendita del terreno" name="Cancel Land Sale"/>
<text name="Claimed:" width="115">
Presa in possesso il:
</text>
- <text left="119" name="DateClaimText">
+ <text name="DateClaimText">
Tue Aug 15 13:47:25 2006
</text>
<text name="PriceLabel">
Area:
</text>
- <text left="119" name="PriceText" width="140">
+ <text name="PriceText" width="140">
4048 m²
</text>
<text name="Traffic:">
Traffico:
</text>
- <text left="119" name="DwellText" width="140">
+ <text name="DwellText" width="140">
0
</text>
<button label="Acquista il terreno..." label_selected="Acquista il terreno..." left="130" name="Buy Land..." width="125"/>
@@ -352,6 +352,7 @@ Solamente terreni più grandi possono essere abilitati nella ricerca.
<combo_box.item label="Parchi &amp; Natura" name="item9"/>
<combo_box.item label="Residenziale" name="item10"/>
<combo_box.item label="Shopping" name="item11"/>
+ <combo_box.item label="Affitto" name="item13"/>
<combo_box.item label="Altro" name="item12"/>
</combo_box>
<combo_box name="land category">
@@ -366,6 +367,7 @@ Solamente terreni più grandi possono essere abilitati nella ricerca.
<combo_box.item label="Parchi &amp; Natura" name="item9"/>
<combo_box.item label="Residenziale" name="item10"/>
<combo_box.item label="Shopping" name="item11"/>
+ <combo_box.item label="Affitto" name="item13"/>
<combo_box.item label="Altro" name="item12"/>
</combo_box>
<check_box label="Contenuti di tipo Moderato" name="MatureCheck" tool_tip=" "/>
@@ -444,7 +446,7 @@ Media:
(Definito dalla proprietà)
</panel.string>
<panel.string name="allow_public_access">
- Consenti accesso pubblico ([MATURITY])
+ Consenti accesso pubblico ([MATURITY]) (Nota: se si rimuove la selezione vengono create linee di espulsione)
</panel.string>
<panel.string name="estate_override">
Una o più di queste impostazioni sono già impostate a livello regionale
diff --git a/indra/newview/skins/default/xui/it/floater_animation_preview.xml b/indra/newview/skins/default/xui/it/floater_animation_preview.xml
index 77341cad63..dc99d287b9 100644
--- a/indra/newview/skins/default/xui/it/floater_animation_preview.xml
+++ b/indra/newview/skins/default/xui/it/floater_animation_preview.xml
@@ -115,14 +115,14 @@ La lunghezza massima è [MAX_LENGTH] secondi.
<text name="description_label">
Descrizione:
</text>
- <spinner label="Priorità" label_width="72" name="priority" tool_tip="Definisce quali altre animazioni possono essere sostituite da questa animazione" width="110"/>
+ <spinner label="Priorità" name="priority" tool_tip="Definisce quali altre animazioni possono essere sostituite da questa animazione"/>
<check_box label="Ciclica" name="loop_check" tool_tip="Riproduce questa animazione in ripetizione"/>
<spinner label="In(%)" name="loop_in_point" tool_tip="Imposta il punto sul quale ritorna l&apos;animazione"/>
<spinner label="Out(%)" name="loop_out_point" tool_tip="Imposta il punto sul quale termina l&apos;animazione"/>
<text name="hand_label">
Postura della mano
</text>
- <combo_box left_delta="100" name="hand_pose_combo" tool_tip="Definisce ciò che fanno le mani durante l&apos;animazione" width="184">
+ <combo_box name="hand_pose_combo" tool_tip="Definisce ciò che fanno le mani durante l&apos;animazione">
<combo_box.item label="Stendi" name="Spread"/>
<combo_box.item label="Rilassato" name="Relaxed"/>
<combo_box.item label="Indica entrambi" name="PointBoth"/>
@@ -140,7 +140,7 @@ La lunghezza massima è [MAX_LENGTH] secondi.
<text name="emote_label">
Espressione
</text>
- <combo_box left_delta="100" name="emote_combo" tool_tip="Definisce ciò che fa il viso durante l&apos;animazione" width="184">
+ <combo_box name="emote_combo" tool_tip="Definisce ciò che fa il viso durante l&apos;animazione">
<item label="(Nessuno)" name="[None]" value=""/>
<item label="Aaaaah" name="Aaaaah" value="Aaaaah"/>
<item label="Spavento" name="Afraid" value="Spavento"/>
@@ -162,18 +162,18 @@ La lunghezza massima è [MAX_LENGTH] secondi.
<item label="Occhiolino" name="Wink" value="Occhiolino"/>
<item label="Preoccupato" name="Worry" value="Preoccupato"/>
</combo_box>
- <text name="preview_label" width="250">
+ <text name="preview_label">
Vedi anteprima mentre
</text>
- <combo_box left_delta="154" name="preview_base_anim" tool_tip="Da usarsi per controllare il comportamento dell&apos;animazione mentre l&apos;avatar svolge azioni abituali." width="130">
+ <combo_box name="preview_base_anim" tool_tip="Da usarsi per controllare il comportamento dell&apos;animazione mentre l&apos;avatar svolge azioni abituali.">
<item label="In piedi" name="Standing" value="In piedi"/>
<item label="Camminando" name="Walking" value="Cammina"/>
<item label="Seduto" name="Sitting" value="Seduto"/>
<item label="Volo" name="Flying" value="Volo"/>
</combo_box>
- <spinner label="Avvio lento (sec)" label_width="125" name="ease_in_time" tool_tip="Durata (in secondi) della fusione in entrata delle animazioni" width="192"/>
- <spinner bottom_delta="-20" label="Arresto lento (sec)" label_width="125" left="10" name="ease_out_time" tool_tip="Durata (in secondi) della fusione in uscita delle animazioni" width="192"/>
- <button bottom_delta="-32" name="play_btn" tool_tip="Riproduci la tua animazione"/>
+ <spinner label="Avvio lento (sec)" name="ease_in_time" tool_tip="Durata (in secondi) della fusione in entrata delle animazioni"/>
+ <spinner label="Arresto lento (sec)" name="ease_out_time" tool_tip="Durata (in secondi) della fusione in uscita delle animazioni"/>
+ <button name="play_btn" tool_tip="Riproduci la tua animazione"/>
<button name="pause_btn" tool_tip="Metti in pausa la tua animazione"/>
<button label="" name="stop_btn" tool_tip="Ferma la riproduzione dell&apos;animazione"/>
<text name="bad_animation_text">
diff --git a/indra/newview/skins/default/xui/it/floater_avatar_picker.xml b/indra/newview/skins/default/xui/it/floater_avatar_picker.xml
index 7c037801e9..5a542d6a27 100644
--- a/indra/newview/skins/default/xui/it/floater_avatar_picker.xml
+++ b/indra/newview/skins/default/xui/it/floater_avatar_picker.xml
@@ -24,6 +24,10 @@
Comincia a digitare il nome della persona:
</text>
<button label="Vai" label_selected="Vai" name="Find"/>
+ <scroll_list name="SearchResults">
+ <columns label="Nome" name="name"/>
+ <columns label="Nome utente" name="username"/>
+ </scroll_list>
</panel>
<panel label="Amici" name="FriendsPanel">
<text name="InstructSelectFriend">
@@ -39,7 +43,10 @@
Metri
</text>
<button font="SansSerifSmall" label="Aggiorna la lista" label_selected="Aggiorna l&apos;elenco" left_delta="6" name="Refresh" width="110"/>
- <scroll_list bottom_delta="-169" height="159" name="NearMe"/>
+ <scroll_list bottom_delta="-169" height="159" name="NearMe">
+ <columns label="Nome" name="name"/>
+ <columns label="Nome utente" name="username"/>
+ </scroll_list>
</panel>
</tab_container>
<button label="OK" label_selected="OK" name="ok_btn"/>
diff --git a/indra/newview/skins/default/xui/it/floater_beacons.xml b/indra/newview/skins/default/xui/it/floater_beacons.xml
index ca6711468d..b7ab265cc2 100644
--- a/indra/newview/skins/default/xui/it/floater_beacons.xml
+++ b/indra/newview/skins/default/xui/it/floater_beacons.xml
@@ -17,5 +17,6 @@
<check_box label="Tocca solo" name="touch_only"/>
<check_box label="Fonti sonore" name="sounds"/>
<check_box label="Fonti delle particelle" name="particles"/>
+ <check_box label="Fonti multimedia" name="moapbeacon"/>
</panel>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_bumps.xml b/indra/newview/skins/default/xui/it/floater_bumps.xml
index 6de2fea67f..ae66148659 100644
--- a/indra/newview/skins/default/xui/it/floater_bumps.xml
+++ b/indra/newview/skins/default/xui/it/floater_bumps.xml
@@ -7,7 +7,7 @@
[TIME] [NAME] ti ha urtato
</floater.string>
<floater.string name="llpushobject">
- [TIME] [NAME] ti ha spinto per mezzo di uno script
+ [TIME] [NAME] ti ha spinto con uno script
</floater.string>
<floater.string name="selected_object_collide">
[TIME] [NAME] ti ha colpito con un oggetto
diff --git a/indra/newview/skins/default/xui/it/floater_buy_contents.xml b/indra/newview/skins/default/xui/it/floater_buy_contents.xml
index a54751e629..84ed85e362 100644
--- a/indra/newview/skins/default/xui/it/floater_buy_contents.xml
+++ b/indra/newview/skins/default/xui/it/floater_buy_contents.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_buy_contents" title="COMPRA I CONTENUTI">
<text name="contains_text">
- [NAME] contiene:
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; contiene:
</text>
<text name="buy_text">
Compra per [AMOUNT]L$ da [NAME]?
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 0a499a6c44..635b56d37a 100644
--- a/indra/newview/skins/default/xui/it/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/it/floater_buy_currency.xml
@@ -52,7 +52,8 @@
Riscrivi l&apos;importo per vedere l&apos;ultimo tasso al cambio.
</text>
<text name="purchase_warning_repurchase">
- La conferma di questo acquisto compra solo L$, non l&apos;oggetto.
+ La conferma di questo acquisto compra solo L$, non
+l&apos;oggetto.
</text>
<text bottom_delta="16" name="purchase_warning_notenough">
Non stai acquistando abbastanza L$. Aumenta l&apos;importo.
diff --git a/indra/newview/skins/default/xui/it/floater_buy_land.xml b/indra/newview/skins/default/xui/it/floater_buy_land.xml
index f3b30f7048..3940c43a3d 100644
--- a/indra/newview/skins/default/xui/it/floater_buy_land.xml
+++ b/indra/newview/skins/default/xui/it/floater_buy_land.xml
@@ -142,10 +142,10 @@ consente [AMOUNT2] oggetti
<text name="estate_name_text">
(sconosciuto)
</text>
- <text name="estate_owner_label" right="575" width="120">
+ <text name="estate_owner_label">
Proprietario della regione:
</text>
- <text left="580" name="estate_owner_text" width="155">
+ <text name="estate_owner_text">
(sconosciuto)
</text>
<text name="resellable_changeable_label">
diff --git a/indra/newview/skins/default/xui/it/floater_buy_object.xml b/indra/newview/skins/default/xui/it/floater_buy_object.xml
index 895d8aa746..e7cbd68b38 100644
--- a/indra/newview/skins/default/xui/it/floater_buy_object.xml
+++ b/indra/newview/skins/default/xui/it/floater_buy_object.xml
@@ -1,26 +1,29 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="contents" title="ACQUISTA COPIA DELL&apos;OGGETTO">
+ <floater.string name="title_buy_text">
+ Compra
+ </floater.string>
+ <floater.string name="title_buy_copy_text">
+ Compra un copia di
+ </floater.string>
+ <floater.string name="no_copy_text">
+ (non copiabile)
+ </floater.string>
+ <floater.string name="no_modify_text">
+ (non modificabile)
+ </floater.string>
+ <floater.string name="no_transfer_text">
+ (non trasferibile)
+ </floater.string>
<text name="contents_text">
Contiene:
</text>
<text name="buy_text">
- Compra per [AMOUNT]L$ da [NAME]?
+ Acquista per L$[AMOUNT] da:
+ </text>
+ <text name="buy_name_text">
+ [NAME]?
</text>
- <button label="Annulla" label_selected="Annulla" name="cancel_btn"/>
<button label="Compra" label_selected="Compra" name="buy_btn"/>
- <string name="title_buy_text">
- Compra
- </string>
- <string name="title_buy_copy_text">
- Compra un copia di
- </string>
- <string name="no_copy_text">
- (non copiabile)
- </string>
- <string name="no_modify_text">
- (non modificabile)
- </string>
- <string name="no_transfer_text">
- (non trasferibile)
- </string>
+ <button label="Annulla" label_selected="Annulla" name="cancel_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/it/floater_day_cycle_options.xml
deleted file mode 100644
index 98c385d29f..0000000000
--- a/indra/newview/skins/default/xui/it/floater_day_cycle_options.xml
+++ /dev/null
@@ -1,94 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Day Cycle Floater" title="EDITOR DELLE CICLO GIORNO/NOTTE">
- <tab_container name="Day Cycle Tabs">
- <panel label="Ciclo giorno/notte" name="Day Cycle">
- <button label="?" name="WLDayCycleHelp"/>
- <text name="WL12am">
- 0:00
- </text>
- <text name="WL3am">
- 3:00
- </text>
- <text name="WL6am">
- 6:00
- </text>
- <text name="WL9amHash">
- 9:00
- </text>
- <text name="WL12pmHash">
- 12:00
- </text>
- <text name="WL3pm">
- 15:00
- </text>
- <text name="WL6pm">
- 18:00
- </text>
- <text name="WL9pm">
- 21:00
- </text>
- <text name="WL12am2">
- 24:00
- </text>
- <text name="WL12amHash">
- |
- </text>
- <text name="WL3amHash">
- I
- </text>
- <text name="WL6amHash">
- |
- </text>
- <text name="WL9amHash2">
- I
- </text>
- <text name="WL12pmHash2">
- |
- </text>
- <text name="WL3pmHash">
- I
- </text>
- <text name="WL6pmHash">
- |
- </text>
- <text name="WL9pmHash">
- I
- </text>
- <text name="WL12amHash2">
- |
- </text>
- <button label="Aggiungi voce" label_selected="Aggiungi voce" name="WLAddKey"/>
- <button label_selected="Cancella voce" name="WLDeleteKey"/>
- <text name="WLCurKeyFrameText">
- Impostazioni del fotogramma chiave:
- </text>
- <text name="WLCurKeyTimeText">
- Tempo:
- </text>
- <spinner label="Ora" name="WLCurKeyHour"/>
- <spinner label="Min" name="WLCurKeyMin"/>
- <text name="WLCurKeyTimeText2">
- Impostazione chiave:
- </text>
- <combo_box label="Programma:" name="WLKeyPresets"/>
- <text name="DayCycleText">
- Raggruppa:
- </text>
- <combo_box label="5 min" name="WLSnapOptions"/>
- <text name="DayCycleText2">
- Lunghezza del ciclo:
- </text>
- <spinner label="Ore" name="WLLengthOfDayHour"/>
- <spinner label="Min" name="WLLengthOfDayMin"/>
- <spinner label="Sec" name="WLLengthOfDaySec"/>
- <text name="DayCycleText3">
- Anteprima:
- </text>
- <button label="Avvia" label_selected="Avvia" name="WLAnimSky"/>
- <button label="Arresta!" label_selected="Arresta" name="WLStopAnimSky"/>
- <button label="Usa l&apos;ora della proprietà" label_selected="Vai all&apos;ora della proprietà" name="WLUseLindenTime"/>
- <button label="Salva il test del giorno" label_selected="Salva il test del giorno" name="WLSaveDayCycle"/>
- <button label="Carica il test del giorno" label_selected="Carica il test del giorno" name="WLLoadDayCycle"/>
- </panel>
- </tab_container>
-</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_display_name.xml b/indra/newview/skins/default/xui/it/floater_display_name.xml
new file mode 100644
index 0000000000..3e0c43e741
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_display_name.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Display Name" title="CAMBIA NOME VISUALIZZATO">
+ <text name="info_text">
+ Il nome che assegni al tuo avatar è il Nome visualizzato. Puoi cambiarlo una volta alla settimana.
+ </text>
+ <text name="lockout_text">
+ Non puoi cambiare il Nome visualizzato fino a: [TIME].
+ </text>
+ <text name="set_name_label">
+ Nuovo Nome visualizzato:
+ </text>
+ <text name="name_confirm_label">
+ Digita nuovamente il nuovo nome per confermare:
+ </text>
+ <button label="Salva" name="save_btn" tool_tip="Salva il tuo nuovo Nome visualizzato"/>
+ <button label="Reimposta" name="reset_btn" tool_tip="Fai corrispondere Nome visualizzato e Nome utente"/>
+ <button label="Annulla" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_env_settings.xml b/indra/newview/skins/default/xui/it/floater_env_settings.xml
deleted file mode 100644
index 1c17c18e84..0000000000
--- a/indra/newview/skins/default/xui/it/floater_env_settings.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Environment Editor Floater" title="EDITOR DELL&apos;AMBIENTE">
- <floater.string name="timeStr">
- [hour12,datetime,utc]:[min,datetime,utc] [ampm,datetime,utc]
- </floater.string>
- <text name="EnvTimeText">
- Ora del
-giorno
- </text>
- <text name="EnvTimeText2">
- 12:00 PM
- </text>
- <text name="EnvCloudText">
- Intensità delle
-Nuvole
- </text>
- <text name="EnvWaterColorText">
- Colore
-dell&apos;Acqua
- </text>
- <color_swatch label="" name="EnvWaterColor" tool_tip="Clicca per aprire il selettore dei colori"/>
- <text name="EnvWaterFogText">
- Nebbiosità
-dell&apos;acqua
- </text>
- <button bottom="-144" label="Usa orario della regione" name="EnvUseEstateTimeButton" width="145"/>
- <button label="Cielo avanzato" name="EnvAdvancedSkyButton"/>
- <button label="Acqua avanzata" name="EnvAdvancedWaterButton"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_event.xml b/indra/newview/skins/default/xui/it/floater_event.xml
index 9a0105a589..b64f429870 100644
--- a/indra/newview/skins/default/xui/it/floater_event.xml
+++ b/indra/newview/skins/default/xui/it/floater_event.xml
@@ -1,40 +1,11 @@
-<?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">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater can_resize="true" follows="all" height="400" 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">
Caricamento in corso...
</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.string name="done_text">
+ Fine
+ </floater.string>
+ <web_browser follows="left|right|top|bottom" height="365" layout="topleft" left="10" name="browser" top="0" trusted_content="true" width="580"/>
+ <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/it/floater_hardware_settings.xml b/indra/newview/skins/default/xui/it/floater_hardware_settings.xml
index 384e7c1272..561f8dbf34 100644
--- a/indra/newview/skins/default/xui/it/floater_hardware_settings.xml
+++ b/indra/newview/skins/default/xui/it/floater_hardware_settings.xml
@@ -14,6 +14,9 @@
<combo_box.item label="8x" name="8x"/>
<combo_box.item label="16x" name="16x"/>
</combo_box>
+ <text name="antialiasing restart">
+ (richiede il riavvio del viewer)
+ </text>
<spinner label="Gamma:" name="gamma"/>
<text name="(brightness, lower is brighter)">
(0 = luminosità default, più basso = più luminoso)
diff --git a/indra/newview/skins/default/xui/it/floater_import_collada.xml b/indra/newview/skins/default/xui/it/floater_import_collada.xml
new file mode 100644
index 0000000000..eb4d0c0fdb
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_import_collada.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Import Collada" title="Importa scena">
+ <text name="mesh count">
+ Reticoli: [COUNT]
+ </text>
+ <text name="texture count">
+ Texture: [COUNT]
+ </text>
+ <text name="status">
+ Stato: [STATUS]
+ </text>
+ <button label="Annulla" name="cancel"/>
+ <button label="OK" name="ok"/>
+ <string name="status_idle">
+ Pausa
+ </string>
+ <string name="status_uploading">
+ Caricamento in corso [NAME]
+ </string>
+ <string name="status_creating">
+ Creazione oggetto [NAME]
+ </string>
+</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_incoming_call.xml b/indra/newview/skins/default/xui/it/floater_incoming_call.xml
index 4d9c1b98dd..a95ed44662 100644
--- a/indra/newview/skins/default/xui/it/floater_incoming_call.xml
+++ b/indra/newview/skins/default/xui/it/floater_incoming_call.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="incoming call" title="UNA PERSONA SCONOSCIUTA STA CHIAMANDO">
+<floater name="incoming call" title="Chiamata in arrivo">
<floater.string name="lifetime">
5
</floater.string>
diff --git a/indra/newview/skins/default/xui/it/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/it/floater_inventory_view_finder.xml
index 49130285f2..cf790ee62e 100644
--- a/indra/newview/skins/default/xui/it/floater_inventory_view_finder.xml
+++ b/indra/newview/skins/default/xui/it/floater_inventory_view_finder.xml
@@ -5,6 +5,7 @@
<check_box label="Abiti" name="check_clothing"/>
<check_box label="Gesture" name="check_gesture"/>
<check_box label="Landmark" name="check_landmark"/>
+ <check_box label="Reticoli" name="check_mesh"/>
<check_box label="Notecard" name="check_notecard"/>
<check_box label="Oggetti" name="check_object"/>
<check_box label="Script" name="check_script"/>
diff --git a/indra/newview/skins/default/xui/it/floater_map.xml b/indra/newview/skins/default/xui/it/floater_map.xml
index 3dcfdd4662..bf19ba6674 100644
--- a/indra/newview/skins/default/xui/it/floater_map.xml
+++ b/indra/newview/skins/default/xui/it/floater_map.xml
@@ -3,6 +3,9 @@
<floater.string name="ToolTipMsg">
[REGION](Fai doppio clic per aprire la Mappa, premi il tasto Maiusc e trascina per la panoramica)
</floater.string>
+ <floater.string name="AltToolTipMsg">
+ [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
</floater.string>
diff --git a/indra/newview/skins/default/xui/it/floater_model_preview.xml b/indra/newview/skins/default/xui/it/floater_model_preview.xml
new file mode 100644
index 0000000000..a17b8b36c2
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_model_preview.xml
@@ -0,0 +1,231 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Model Preview" title="Carica modello">
+ <string name="status_idle">
+ Pausa
+ </string>
+ <string name="status_reading_file">
+ Caricamento in corso...
+ </string>
+ <string name="status_generating_meshes">
+ Generazione reticoli...
+ </string>
+ <string name="status_vertex_number_overflow">
+ Errore: numero di vertici maggiore di 65534, annullato.
+ </string>
+ <string name="high">
+ Alto
+ </string>
+ <string name="medium">
+ Medio
+ </string>
+ <string name="low">
+ Basso
+ </string>
+ <string name="lowest">
+ Bassissimo
+ </string>
+ <string name="mesh_status_good">
+ Invia!
+ </string>
+ <string name="mesh_status_na">
+ N/D
+ </string>
+ <string name="mesh_status_none">
+ Nessuno
+ </string>
+ <string name="mesh_status_submesh_mismatch">
+ Ai vari livelli del dettaglio corrispondono numeri diversi di faccette con texture.
+ </string>
+ <string name="mesh_status_mesh_mismatch">
+ Ai vari livelli del dettaglio corrispondono numeri diversi istanze di reticoli.
+ </string>
+ <string name="mesh_status_too_many_vertices">
+ Troppi vertici per il livello di dettaglio.
+ </string>
+ <string name="mesh_status_missing_lod">
+ Livello di dettaglio minimo mancante.
+ </string>
+ <string name="layer_all">
+ Tutto
+ </string>
+ <string name="decomposing">
+ Analisi in corso...
+ </string>
+ <string name="simplifying">
+ Semplificazione in corso...
+ </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>
+ <panel>
+ <text name="streaming cost">
+ Costo risorsa: [COST]
+ </text>
+ <text name="physics cost">
+ Costo fisica: [COST]
+ </text>
+ <text name="upload fee">
+ Costo caricamento: N/D
+ </text>
+ </panel>
+ <text name="status">
+ [STATUS]
+ </text>
+ <button label="Predefiniti" name="reset_btn" tool_tip="Ripristina predefiniti"/>
+ <button label="Carica sul server" name="ok_btn" tool_tip="Carica al simulatore"/>
+ <button label="Annulla" name="cancel_btn"/>
+ <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:
+ </text>
+ <text name="share_tolderance_text">
+ Tolleranza condivisione:
+ </text>
+ <combo_box name="border_mode">
+ <combo_item name="border_unlock">
+ Sblocca
+ </combo_item>
+ <combo_item name="border_lock">
+ Blocca
+ </combo_item>
+ </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"/>
+ </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>
+ <panel name="physics info">
+ <slider label="Ampiezza anteprima:" name="physics_explode"/>
+ <text name="physics_triangles">
+ Triangoli: [TRIANGLES]
+ </text>
+ <text name="physics_points">
+ Vertici: [POINTS]
+ </text>
+ <text name="physics_hulls">
+ Inviluppi: [HULLS]
+ </text>
+ </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
+ </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>
+</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
new file mode 100644
index 0000000000..b17f731089
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_model_wizard.xml
@@ -0,0 +1,241 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Model Wizard" title="PROCEDURA GUIDATA CARICA MODELLO">
+ <button label="5. Carica sul server" name="upload_btn"/>
+ <button label="4. Rivedi" name="review_btn"/>
+ <button label="3. Fisica" name="physics2_btn"/>
+ <button label="3. Fisica" name="physics_btn"/>
+ <button label="2. Ottimizza" name="optimize_btn"/>
+ <button label="1. Seleziona file" name="choose_file_btn"/>
+ <panel name="choose_file_panel">
+ <panel name="header_panel">
+ <text name="header_text">
+ Carica modello
+ </text>
+ </panel>
+ <text name="description">
+ Questa procedura guidata permette di importare modelli di reticoli in Second Life. Specificare prima un file che contiene il modello da importare. Second Life supporta file COLLADA (.dae).
+ </text>
+ <panel name="content">
+ <text name="Cache location">
+ Nome file:
+ </text>
+ <button label="Sfoglia..." label_selected="Sfoglia..." name="browse"/>
+ <text name="dimensions">
+ X: Y: Z:
+ </text>
+ <text name="dimension_dividers">
+ | |
+ </text>
+ </panel>
+ </panel>
+ <panel name="optimize_panel">
+ <panel name="header_panel">
+ <text name="header_text">
+ Ottimizza
+ </text>
+ </panel>
+ <text name="description">
+ Questa procedura guidata ha ottimizzato il modello per migliorare le prestazioni. Si possono variare i risultati dell&apos;ottimizzazione in basso o fare clic su Avanti per continuare.
+ </text>
+ <panel name="content">
+ <text name="high_detail_text">
+ Genera livello di dettaglio: Alto
+ </text>
+ <text name="medium_detail_text">
+ Genera livello di dettaglio: Medio
+ </text>
+ <text name="low_detail_text">
+ Genera livello di dettaglio: Basso
+ </text>
+ <text name="lowest_detail_text">
+ Genera livello di dettaglio: Bassissimo
+ </text>
+ </panel>
+ <panel name="content2">
+ <text name="lod_label">
+ Anteprima modello:
+ </text>
+ <combo_box name="preview_lod_combo2" 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="streaming cost">
+ Costo risorsa: [COST]
+ </text>
+ <text name="dimensions">
+ X: Y: Z:
+ </text>
+ <text name="dimension_dividers">
+ | |
+ </text>
+ </panel>
+ </panel>
+ <panel name="physics_panel">
+ <panel name="header_panel">
+ <text name="header_text">
+ Fisica
+ </text>
+ </panel>
+ <text name="description">
+ La procedura guidata permette di creare una forma fisica che determina come l&apos;oggetto interagisce con altri oggetti e avatar. Impostare il comando a scorrimento sul livello di dettaglio appropriato per l&apos;uso dell&apos;oggetto:
+ </text>
+ <panel name="content">
+ <text name="streaming cost">
+ Costo risorsa: [COST]
+ </text>
+ </panel>
+ </panel>
+ <panel name="physics2_panel">
+ <panel name="header_panel">
+ <text name="header_text">
+ Fisica
+ </text>
+ </panel>
+ <text name="description">
+ Visualizza in anteprima la forma fisica in basso, quindi fai clic su Avanti per continuare. Per modificare la forma fisica, fare clic su Indietro.
+ </text>
+ <panel name="content">
+ <text name="lod_label">
+ Anteprima modello:
+ </text>
+ <combo_box name="preview_lod_combo3" 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="dimensions">
+ X: Y: Z:
+ </text>
+ <text name="dimension_dividers">
+ | |
+ </text>
+ <text name="streaming cost">
+ Costo risorsa: [COST]
+ </text>
+ </panel>
+ </panel>
+ <panel name="review_panel">
+ <panel name="header_panel">
+ <text name="header_text">
+ Rivedi
+ </text>
+ </panel>
+ <text name="description">
+ Rivedere i dettagli in basso, quindi fare clic su Carica per caricare il modello. Il tuo saldo in L$ verrà addebitato quando fai clic su Carica.
+ </text>
+ <panel name="content">
+ <text name="lod_label">
+ Anteprima modello:
+ </text>
+ <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="dimensions">
+ X: Y: Z:
+ </text>
+ <text name="dimension_dividers">
+ | |
+ </text>
+ </panel>
+ <text name="streaming cost">
+ Costo risorsa: [COST]
+ </text>
+ <text name="physics cost">
+ Costo fisica: [COST]
+ </text>
+ </panel>
+ <panel name="upload_panel">
+ <panel name="header_panel">
+ <text name="header_text">
+ Caricamento completato.
+ </text>
+ </panel>
+ <text name="description">
+ Congratulazioni. Il modello è stato caricato correttamente e ora puoi trovarlo nella cartella Oggetti nel tuo inventario.
+ </text>
+ </panel>
+ <button label="&lt;&lt; Indietro" name="back"/>
+ <button label="Avanti &gt;&gt;" name="next"/>
+ <button label="Carica" name="upload" tool_tip="Carica al simulatore"/>
+ <button label="Annulla" name="cancel"/>
+ <button label="Chiudi" name="close"/>
+ <spinner name="import_scale" value="1.0"/>
+ <string name="status_idle">
+ Pausa
+ </string>
+ <string name="status_reading_file">
+ Caricamento in corso...
+ </string>
+ <string name="status_generating_meshes">
+ Generazione reticoli...
+ </string>
+ <string name="status_vertex_number_overflow">
+ Errore: numero di vertici maggiore di 65534, annullato.
+ </string>
+ <string name="high">
+ Alto
+ </string>
+ <string name="medium">
+ Medio
+ </string>
+ <string name="low">
+ Basso
+ </string>
+ <string name="lowest">
+ Bassissimo
+ </string>
+ <string name="mesh_status_good">
+ Invia!
+ </string>
+ <string name="mesh_status_na">
+ N/D
+ </string>
+ <string name="mesh_status_none">
+ Nessuno
+ </string>
+ <string name="mesh_status_submesh_mismatch">
+ Ai vari livelli del dettaglio corrispondono numeri diversi di faccette con texture.
+ </string>
+ <string name="mesh_status_mesh_mismatch">
+ Ai vari livelli del dettaglio corrispondono numeri diversi istanze di reticoli.
+ </string>
+ <string name="mesh_status_too_many_vertices">
+ Troppi vertici per il livello di dettaglio.
+ </string>
+ <string name="mesh_status_missing_lod">
+ Livello di dettaglio minimo mancante.
+ </string>
+ <string name="layer_all">
+ Tutto
+ </string>
+</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_pay.xml b/indra/newview/skins/default/xui/it/floater_pay.xml
index 6389cbfbf7..5753c8c765 100644
--- a/indra/newview/skins/default/xui/it/floater_pay.xml
+++ b/indra/newview/skins/default/xui/it/floater_pay.xml
@@ -11,7 +11,7 @@
</text>
<icon name="icon_person" tool_tip="Persona"/>
<text left="115" name="payee_name">
- Test Name That Is Extremely Long To Check Clipping
+ Nome di test che è troppo lungo per controllare il taglio
</text>
<button label="1 L$" label_selected="1 L$" left="118" name="fastpay 1" width="80"/>
<button label="5 L$" label_selected="5 L$" left="210" name="fastpay 5"/>
diff --git a/indra/newview/skins/default/xui/it/floater_preferences.xml b/indra/newview/skins/default/xui/it/floater_preferences.xml
index c5b6654a69..7a1d2966ed 100644
--- a/indra/newview/skins/default/xui/it/floater_preferences.xml
+++ b/indra/newview/skins/default/xui/it/floater_preferences.xml
@@ -5,10 +5,12 @@
<tab_container name="pref core" tab_width="100">
<panel label="Generale" name="general"/>
<panel label="Grafica" name="display"/>
- <panel label="Riservatezza" name="im"/>
<panel label="Audio e media" name="audio"/>
<panel label="Chat" name="chat"/>
+ <panel label="Sposta e visualizza" name="move"/>
<panel label="Notifiche" name="msgs"/>
+ <panel label="Colori" name="colors"/>
+ <panel label="Riservatezza" name="im"/>
<panel label="Impostazione" name="input"/>
<panel label="Avanzate" name="advanced1"/>
</tab_container>
diff --git a/indra/newview/skins/default/xui/it/floater_price_for_listing.xml b/indra/newview/skins/default/xui/it/floater_price_for_listing.xml
new file mode 100644
index 0000000000..06c838a981
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_price_for_listing.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="price_for_listing" title="PUBBLICA L&apos;ANNUNCIO PUBBLICITARIO">
+ <text name="explanation_text">
+ La tua inserzione sarà visibile per una settimana dal giorno della sua pubblicazione.
+
+La posizione del tuo annuncio nella lista delle inserzioni è determinata dalla somma pagata.
+
+Le inserzioni con un pagamento più alto saranno più visibili nella lista dei risultati della ricerca.
+ </text>
+ <text name="price_text">
+ Prezzo per inserzione:
+ </text>
+ <text name="price_symbol">
+ L$
+ </text>
+ <button label="OK" name="set_price_btn"/>
+ <button label="Annulla" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_region_debug_console.xml b/indra/newview/skins/default/xui/it/floater_region_debug_console.xml
new file mode 100644
index 0000000000..6efa10290b
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_region_debug_console.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="region_debug_console" title="Debug regione"/>
diff --git a/indra/newview/skins/default/xui/it/floater_sell_land.xml b/indra/newview/skins/default/xui/it/floater_sell_land.xml
index 0f8d24ebbd..106ae0373c 100644
--- a/indra/newview/skins/default/xui/it/floater_sell_land.xml
+++ b/indra/newview/skins/default/xui/it/floater_sell_land.xml
@@ -55,7 +55,7 @@
<radio_item label="Si, vendi gli oggetti con la terra" name="yes"/>
</radio_group>
<button label="Mostra oggetti" name="show_objects"/>
- <text name="nag_message_label">
+ <text name="nag_message_label" font="SansSerifSmallBold" left="9">
RICORDA: Tutte le vendite sono definitive.
</text>
<button label="Imposta terreno come in vendita" name="sell_btn"/>
diff --git a/indra/newview/skins/default/xui/it/floater_settings_debug.xml b/indra/newview/skins/default/xui/it/floater_settings_debug.xml
index aab00a26ce..489d52d3b8 100644
--- a/indra/newview/skins/default/xui/it/floater_settings_debug.xml
+++ b/indra/newview/skins/default/xui/it/floater_settings_debug.xml
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="settings_debug" title="PARAMETRI DI DEBUG">
<radio_group name="boolean_combo">
- <radio_item label="VERO" name="TRUE" value="vero"/>
- <radio_item label="FALSO" name="FALSE" value=""/>
+ <radio_item label="VERO" name="TRUE" />
+ <radio_item label="FALSO" name="FALSE" />
</radio_group>
<color_swatch label="Colore" name="val_color_swatch"/>
<spinner label="x" name="val_spinner_1"/>
diff --git a/indra/newview/skins/default/xui/it/floater_sound_devices.xml b/indra/newview/skins/default/xui/it/floater_sound_devices.xml
new file mode 100644
index 0000000000..df4b8f4878
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_sound_devices.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_sound_devices" title="Dispositivi sonori">
+ <text name="voice_label">
+ Chat vocale
+ </text>
+ <check_box label="Abilitato" name="enable_voice"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_tools.xml b/indra/newview/skins/default/xui/it/floater_tools.xml
index fc13e09d1c..23e01a3943 100644
--- a/indra/newview/skins/default/xui/it/floater_tools.xml
+++ b/indra/newview/skins/default/xui/it/floater_tools.xml
@@ -64,6 +64,8 @@
<radio_item label="Seleziona faccia" name="radio select face"/>
</radio_group>
<check_box label="Modifica parti collegate" name="checkbox edit linked parts"/>
+ <button label="Collegamento" name="link_btn"/>
+ <button label="Scollega" name="unlink_btn"/>
<text name="RenderingCost" tool_tip="Mostra il costo di rendering calcolato per questo oggetto">
þ: [COUNT]
</text>
@@ -124,6 +126,18 @@
<text name="prim_count">
Prim: [COUNT]
</text>
+ <text name="linked_set_count">
+ Set collegati: [COUNT]
+ </text>
+ <text name="linked_set_cost" tool_tip="Costo dei set collegati attualmente selezionati come [prim],[complessità fisica]">
+ Costo: [COST] / [PHYSICS]
+ </text>
+ <text name="object_count">
+ Oggetti: [COUNT]
+ </text>
+ <text name="object_cost" tool_tip="Costo degli oggetti attualmente selezionati come [prim] / [complessità fisica]">
+ Costo: [COST] / [PHYSICS]
+ </text>
<tab_container name="Object Info Tabs">
<panel label="Generale" name="General">
<panel.string name="text deed continued">
@@ -171,9 +185,15 @@
<text name="Creator:">
Creatore:
</text>
+ <text name="Creator Name">
+ Sig.ra Esbee Linden (esbee.linden)
+ </text>
<text name="Owner:">
Proprietario:
</text>
+ <text name="Owner Name">
+ Sig.ra Erica &quot;Moose&quot; Linden (erica.linden)
+ </text>
<text name="Group:">
Gruppo:
</text>
@@ -268,16 +288,7 @@
<combo_box.item label="Anello" name="Ring"/>
<combo_box.item label="Sculpted" name="Sculpted"/>
</combo_box>
- <combo_box name="material">
- <combo_box.item label="Pietra" name="Stone"/>
- <combo_box.item label="Metallo" name="Metal"/>
- <combo_box.item label="Vetro" name="Glass"/>
- <combo_box.item label="Legno" name="Wood"/>
- <combo_box.item label="Carne" name="Flesh"/>
- <combo_box.item label="Plastica" name="Plastic"/>
- <combo_box.item label="Gomma" name="Rubber"/>
- </combo_box>
- <text name="text cut" left_delta="-10" width="170">
+ <text left_delta="-10" name="text cut" width="170">
Riduci una sezione (inizio/fine)
</text>
<spinner label="I" name="cut begin"/>
@@ -349,9 +360,19 @@
<combo_box.item label="Toroidale" name="Torus"/>
<combo_box.item label="Piana" name="Plane"/>
<combo_box.item label="Cilindrica" name="Cylinder"/>
+ <combo_box.item label="Reticolo" name="Mesh"/>
</combo_box>
</panel>
<panel label="Caratteristiche" name="Features">
+ <panel.string name="None">
+ Nessuno
+ </panel.string>
+ <panel.string name="Prim">
+ Prim
+ </panel.string>
+ <panel.string name="Convex Hull">
+ Inviluppo convesso
+ </panel.string>
<text name="select_single">
Seleziona solo un prim per modificarne le caratteristiche.
</text>
@@ -376,6 +397,23 @@
<spinner label="Centro focale" name="Light Focus"/>
<spinner label="Attenuazione" name="Light Falloff"/>
<spinner label="Atmosfera" name="Light Ambiance"/>
+ <text name="label physicsshapetype">
+ Tipo di forma fisica:
+ </text>
+ <combo_box name="Physics Shape Type Combo Ctrl" tool_tip="Selezionare il tipo di forma fisica"/>
+ <combo_box name="material">
+ <combo_box.item label="Pietra" name="Stone"/>
+ <combo_box.item label="Metallo" name="Metal"/>
+ <combo_box.item label="Vetro" name="Glass"/>
+ <combo_box.item label="Legno" name="Wood"/>
+ <combo_box.item label="Carne" name="Flesh"/>
+ <combo_box.item label="Plastica" name="Plastic"/>
+ <combo_box.item label="Gomma" name="Rubber"/>
+ </combo_box>
+ <spinner label="Gravità" name="Physics Gravity"/>
+ <spinner label="Frizione" name="Physics Friction"/>
+ <spinner label="Densità" name="Physics Density"/>
+ <spinner label="Restituzione" name="Physics Restitution"/>
</panel>
<panel label="Texture" name="Texture">
<panel.string name="string repeats per meter">
diff --git a/indra/newview/skins/default/xui/it/floater_top_objects.xml b/indra/newview/skins/default/xui/it/floater_top_objects.xml
index 939c5e83a0..7d062db23b 100644
--- a/indra/newview/skins/default/xui/it/floater_top_objects.xml
+++ b/indra/newview/skins/default/xui/it/floater_top_objects.xml
@@ -39,13 +39,13 @@
<text name="id_text">
ID oggetto:
</text>
- <line_editor font="SansSerifSmall" left="90" name="id_editor" width="280"/>
- <button label="Mostra segnali luminosi" name="show_beacon_btn" width="150"/>
+ <line_editor font="SansSerifSmall" name="id_editor"/>
+ <button label="Mostra segnali luminosi" name="show_beacon_btn"/>
<text name="obj_name_text">
Nome dell&apos;oggetto:
</text>
- <line_editor font="SansSerifSmall" left="90" name="object_name_editor" width="280"/>
- <button label="Filtro" name="filter_object_btn" width="150"/>
+ <line_editor font="SansSerifSmall" name="object_name_editor"/>
+ <button label="Filtro" name="filter_object_btn"/>
<text name="owner_name_text">
Proprietario:
</text>
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 4741d8d32f..0f0467757d 100644
--- a/indra/newview/skins/default/xui/it/floater_voice_controls.xml
+++ b/indra/newview/skins/default/xui/it/floater_voice_controls.xml
@@ -19,12 +19,12 @@
<layout_panel name="my_panel">
<text name="user_text" value="Il mio avatar:"/>
</layout_panel>
- <layout_panel name="leave_call_panel">
- <layout_stack name="voice_effect_and_leave_call_stack">
+ <layout_panel name="leave_call_panel">
+ <layout_stack name="voice_effect_and_leave_call_stack">
<layout_panel name="leave_call_btn_panel">
<button label="Abbandona chiamata" name="leave_call_btn"/>
</layout_panel>
</layout_stack>
- </layout_panel>
+ </layout_panel>
</layout_stack>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_water.xml b/indra/newview/skins/default/xui/it/floater_water.xml
deleted file mode 100644
index c6ab646fbf..0000000000
--- a/indra/newview/skins/default/xui/it/floater_water.xml
+++ /dev/null
@@ -1,95 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Water Floater" title="EDITOR AVANZATO DELL&apos;ACQUA">
- <text name="KeyFramePresetsText" width="224">
- Impostazioni predeterminate dell&apos;acqua:
- </text>
- <combo_box left_delta="230" name="WaterPresetsCombo" width="150"/>
- <button label="Nuovo" label_selected="Nuovo" name="WaterNewPreset"/>
- <button label="Salva" label_selected="Salva" name="WaterSavePreset"/>
- <button label="Cancella" label_selected="Cancella" name="WaterDeletePreset"/>
- <tab_container name="Water Tabs">
- <panel label="IMPOSTAZIONI" name="Settings">
- <text name="BHText">
- Colore della nebbiosità dell&apos;acqua
- </text>
- <button label="?" left="209" name="WaterFogColorHelp"/>
- <color_swatch label="" name="WaterFogColor" tool_tip="Clicca per aprire il selettore dei colori"/>
- <text font="SansSerifSmall" name="WaterFogDensText">
- Esponente di densità della nebbia
- dell&apos;acqua
- </text>
- <slider bottom_delta="-40" name="WaterFogDensity"/>
- <button label="?" left="209" name="WaterFogDensityHelp"/>
- <text bottom="-140" font="SansSerifSmall" name="WaterUnderWaterFogModText">
- Regolatore effetto nebbia subacquea
- </text>
- <button label="?" left="209" name="WaterUnderWaterFogModHelp"/>
- <text name="BDensText">
- Scala di riflessione delle onde
- </text>
- <button label="?" left="415" name="WaterNormalScaleHelp"/>
- <text name="BHText2">
- 1
- </text>
- <text name="BHText3">
- 2
- </text>
- <text name="BHText4">
- 3
- </text>
- <text name="HDText">
- Scala Fresnel
- </text>
- <button label="?" left="415" name="WaterFresnelScaleHelp"/>
- <text name="FresnelOffsetText">
- Offset Fresnel
- </text>
- <button label="?" left="415" name="WaterFresnelOffsetHelp"/>
- <text font="SansSerifSmall" name="DensMultText">
- Scala di rifrazione nell&apos;acqua
- dall&apos;alto
- </text>
- <slider bottom_delta="-40" name="WaterScaleAbove"/>
- <button label="?" left="650" name="WaterScaleAboveHelp"/>
- <text bottom="-70" font="SansSerifSmall" name="WaterScaleBelowText">
- Scala di rifrazione nell&apos;acqua
- dal basso
- </text>
- <slider bottom_delta="-40" name="WaterScaleBelow"/>
- <button label="?" left="650" name="WaterScaleBelowHelp"/>
- <text bottom="-122" name="MaxAltText">
- Moltiplicatore della sfocatura
- </text>
- <button label="?" left="650" name="WaterBlurMultiplierHelp"/>
- </panel>
- <panel label="IMMAGINE" name="Waves">
- <text name="BHText">
- Direzione della grande onda
- </text>
- <button label="?" left="170" name="WaterWave1Help"/>
- <text name="WaterWave1DirXText">
- X
- </text>
- <text name="WaterWave1DirYText">
- Y
- </text>
- <text name="BHText2">
- Direzione della piccola onda
- </text>
- <button label="?" left="170" name="WaterWave2Help"/>
- <text name="WaterWave2DirXText">
- X
- </text>
- <text name="WaterWave2DirYText">
- Y
- </text>
- <text name="BHText3">
- Mappatura normale
- </text>
- <button label="?" name="WaterNormalMapHelp"/>
- </panel>
- </tab_container>
- <string name="WLDefaultWaterNames">
- Default:Glassy:Pond:Murky:Second Plague:SNAKE!!!:Valdez
- </string>
-</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_web_content.xml b/indra/newview/skins/default/xui/it/floater_web_content.xml
new file mode 100644
index 0000000000..5603e85417
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/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="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/default/xui/it/floater_windlight_options.xml b/indra/newview/skins/default/xui/it/floater_windlight_options.xml
deleted file mode 100644
index 1f6f0fab58..0000000000
--- a/indra/newview/skins/default/xui/it/floater_windlight_options.xml
+++ /dev/null
@@ -1,189 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="WindLight floater" title="EDITOR AVANZATO DEL CIELO">
- <text name="KeyFramePresetsText">
- Cieli predefiniti:
- </text>
- <button label="Nuovo" label_selected="Nuovo" name="WLNewPreset"/>
- <button label="Salva" label_selected="Salva" left_delta="72" name="WLSavePreset"/>
- <button label="Elimina" label_selected="Elimina" left_delta="72" name="WLDeletePreset"/>
- <button font="SansSerifSmall" label="Editor del ciclo giorno/notte" label_selected="Editor del ciclo giorno/notte" left_delta="85" name="WLDayCycleMenuButton" width="165"/>
- <tab_container name="WindLight Tabs">
- <panel label="ATMOSFERA" name="Atmosphere">
- <text name="BHText">
- Blu dell&apos;Orizzonte
- </text>
- <button label="?" left="189" name="WLBlueHorizonHelp"/>
- <text name="BHText2">
- R
- </text>
- <text name="BHText3">
- G
- </text>
- <text name="BHText4">
- B
- </text>
- <text name="BHText5">
- I
- </text>
- <text font="SansSerifSmall" name="BDensText">
- Altezza della Foschia all&apos;Orizzonte
- </text>
- <button label="?" left="189" name="WLHazeHorizonHelp"/>
- <text name="BDensText2">
- Densità del Blu
- </text>
- <button label="?" name="WLBlueDensityHelp"/>
- <text name="BHText6">
- R
- </text>
- <text name="BHText7">
- G
- </text>
- <text name="BHText8">
- B
- </text>
- <text name="BHText9">
- I
- </text>
- <text name="HDText">
- Densità  della Foschia
- </text>
- <button label="?" name="WLHazeDensityHelp"/>
- <text name="DensMultText">
- Moltiplicatore di Densità
- </text>
- <button label="?" left="645" name="WLDensityMultHelp"/>
- <text name="WLDistanceMultText">
- Moltiplicatore della Distanza
- </text>
- <button label="?" left="645" name="WLDistanceMultHelp"/>
- <text name="MaxAltText">
- Altitudine Massima
- </text>
- <button label="?" left="645" name="WLMaxAltitudeHelp"/>
- </panel>
- <panel label="ILLUMINAZIONE" name="Lighting">
- <text name="SLCText">
- Colore Sole/Luna
- </text>
- <button label="?" name="WLSunlightColorHelp"/>
- <text name="BHText">
- R
- </text>
- <text name="BHText2">
- G
- </text>
- <text name="BHText3">
- B
- </text>
- <text name="BHText4">
- I
- </text>
- <text name="TODText">
- Posizione Sole/Luna
- </text>
- <button label="?" name="WLTimeOfDayHelp"/>
- <text name="WLAmbientText">
- Ambiente
- </text>
- <button label="?" name="WLAmbientHelp"/>
- <text name="BHText5">
- R
- </text>
- <text name="BHText6">
- G
- </text>
- <text name="BHText7">
- B
- </text>
- <text name="BHText8">
- I
- </text>
- <text name="WLEastAngleText">
- Angolo Est
- </text>
- <button label="?" name="WLEastAngleHelp"/>
- <text name="SunGlowText">
- Corona intorno al sole
- </text>
- <button label="?" name="WLSunGlowHelp"/>
- <slider label="Focus" name="WLGlowB"/>
- <slider label="Grandezza" name="WLGlowR"/>
- <text name="SceneGammaText">
- Gamma della Scena
- </text>
- <button label="?" name="WLSceneGammaHelp"/>
- <text name="WLStarText">
- Luminosità  delle stelle
- </text>
- <button label="?" name="WLStarBrightnessHelp"/>
- </panel>
- <panel label="NUVOLE" name="Clouds">
- <text name="WLCloudColorText">
- Colore delle Nuvole
- </text>
- <button label="?" name="WLCloudColorHelp"/>
- <text name="BHText">
- R
- </text>
- <text name="BHText2">
- G
- </text>
- <text name="BHText3">
- B
- </text>
- <text name="BHText4">
- I
- </text>
- <text name="WLCloudColorText2">
- Nuvole XY/Densità
- </text>
- <button label="?" name="WLCloudDensityHelp"/>
- <text name="BHText5">
- X
- </text>
- <text name="BHText6">
- Y
- </text>
- <text name="BHText7">
- D
- </text>
- <text name="WLCloudCoverageText">
- Copertura delle Nuvole
- </text>
- <button label="?" left="415" name="WLCloudCoverageHelp"/>
- <text name="WLCloudScaleText">
- Altitudine delle Nuvole
- </text>
- <button label="?" left="415" name="WLCloudScaleHelp"/>
- <text name="WLCloudDetailText">
- Dettagli Nuvole (XY/ Densità)
- </text>
- <button label="?" left="415" name="WLCloudDetailHelp"/>
- <text name="BHText8">
- X
- </text>
- <text name="BHText9">
- Y
- </text>
- <text name="BHText10">
- D
- </text>
- <text name="WLCloudScrollXText">
- Scorrimento delle X
- </text>
- <button label="?" name="WLCloudScrollXHelp"/>
- <check_box label="Blocca" name="WLCloudLockX"/>
- <text name="WLCloudScrollYText">
- Scorrimento delle Y
- </text>
- <button label="?" name="WLCloudScrollYHelp"/>
- <check_box label="Blocca" name="WLCloudLockY"/>
- <check_box label="Mostra le Nuvole Classiche" name="DrawClassicClouds"/>
- <button label="?" left="645" name="WLClassicCloudsHelp"/>
- </panel>
- </tab_container>
- <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
- </string>
-</floater>
diff --git a/indra/newview/skins/default/xui/it/inspect_avatar.xml b/indra/newview/skins/default/xui/it/inspect_avatar.xml
index ec5561a5b2..6f52aaef74 100644
--- a/indra/newview/skins/default/xui/it/inspect_avatar.xml
+++ b/indra/newview/skins/default/xui/it/inspect_avatar.xml
@@ -10,6 +10,11 @@
<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"/>
diff --git a/indra/newview/skins/default/xui/it/language_settings.xml b/indra/newview/skins/default/xui/it/language_settings.xml
index 312b8e21aa..5f448fa828 100644
--- a/indra/newview/skins/default/xui/it/language_settings.xml
+++ b/indra/newview/skins/default/xui/it/language_settings.xml
@@ -4,6 +4,7 @@
<!-- Locale Information -->
<string name="MicrosoftLocale">italian</string>
+ <string name="MacLocale">it_IT.UTF-8</string>
<string name="DarwinLocale">it_IT.UTF-8</string>
<string name="LinuxLocale">it_IT.UTF-8</string>
diff --git a/indra/newview/skins/default/xui/it/menu_attachment_self.xml b/indra/newview/skins/default/xui/it/menu_attachment_self.xml
index 489d6af1d7..0b841d591f 100644
--- a/indra/newview/skins/default/xui/it/menu_attachment_self.xml
+++ b/indra/newview/skins/default/xui/it/menu_attachment_self.xml
@@ -5,7 +5,7 @@
<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="Cambia vestiario" name="Change Outfit"/>
+ <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..."/>
diff --git a/indra/newview/skins/default/xui/it/menu_avatar_self.xml b/indra/newview/skins/default/xui/it/menu_avatar_self.xml
index 977503dace..a4dafd7b5f 100644
--- a/indra/newview/skins/default/xui/it/menu_avatar_self.xml
+++ b/indra/newview/skins/default/xui/it/menu_avatar_self.xml
@@ -14,6 +14,7 @@
<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>
@@ -21,7 +22,7 @@
<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="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..."/>
diff --git a/indra/newview/skins/default/xui/it/menu_bottomtray.xml b/indra/newview/skins/default/xui/it/menu_bottomtray.xml
index 8ca5b24b48..ddd6909136 100644
--- a/indra/newview/skins/default/xui/it/menu_bottomtray.xml
+++ b/indra/newview/skins/default/xui/it/menu_bottomtray.xml
@@ -1,10 +1,10 @@
<?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 barra laterale" name="ShowSidebarButton"/>
<menu_item_check label="Pulsante Costruisci" name="ShowBuildButton"/>
<menu_item_check label="Pulsante Cerca" name="ShowSearchButton"/>
<menu_item_check label="Pulsante Mappa" name="ShowWorldMapButton"/>
diff --git a/indra/newview/skins/default/xui/it/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/it/menu_inspect_avatar_gear.xml
index 22a37d7095..1f10734c4a 100644
--- a/indra/newview/skins/default/xui/it/menu_inspect_avatar_gear.xml
+++ b/indra/newview/skins/default/xui/it/menu_inspect_avatar_gear.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
-<menu name="Gear Menu">
+<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"/>
@@ -11,9 +11,11 @@
<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"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/it/menu_inspect_self_gear.xml
index 8b4ed607e7..4f62ccaa9c 100644
--- a/indra/newview/skins/default/xui/it/menu_inspect_self_gear.xml
+++ b/indra/newview/skins/default/xui/it/menu_inspect_self_gear.xml
@@ -1,10 +1,31 @@
-<?xml version="1.0" encoding="utf-8"?>
-<menu name="Gear Menu">
- <menu_item_call label="Siedi" name="sit_down_here"/>
- <menu_item_call label="Alzati" name="stand_up"/>
- <menu_item_call label="Cambia vestiario" name="change_outfit"/>
- <menu_item_call label="Il mio profilo" name="my_profile"/>
- <menu_item_call label="I miei amici..." name="my_friends"/>
- <menu_item_call label="I miei gruppi" name="my_groups"/>
+<?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..."/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_inventory.xml b/indra/newview/skins/default/xui/it/menu_inventory.xml
index f2eb8b1bf7..f18ddb595c 100644
--- a/indra/newview/skins/default/xui/it/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/it/menu_inventory.xml
@@ -25,6 +25,7 @@
<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"/>
diff --git a/indra/newview/skins/default/xui/it/menu_inventory_add.xml b/indra/newview/skins/default/xui/it/menu_inventory_add.xml
index 5e61625f84..62da61cd6b 100644
--- a/indra/newview/skins/default/xui/it/menu_inventory_add.xml
+++ b/indra/newview/skins/default/xui/it/menu_inventory_add.xml
@@ -4,6 +4,8 @@
<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="Modella..." name="Upload Model"/>
+ <menu_item_call label="Procedura guidata modellazione..." name="Upload Model Wizard"/>
<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>
@@ -23,6 +25,7 @@
<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"/>
diff --git a/indra/newview/skins/default/xui/it/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/it/menu_inventory_gear_default.xml
index 9f1b413276..3d64e4da4e 100644
--- a/indra/newview/skins/default/xui/it/menu_inventory_gear_default.xml
+++ b/indra/newview/skins/default/xui/it/menu_inventory_gear_default.xml
@@ -1,8 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_gear_default">
+<toggleable_menu name="menu_gear_default">
<menu_item_call label="Nuova finestra inventario" name="new_window"/>
- <menu_item_call label="Ordina in base al nome" name="sort_by_name"/>
- <menu_item_call label="Mostra prima i più recenti" name="sort_by_recent"/>
+ <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"/>
@@ -12,4 +14,4 @@
<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"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_login.xml b/indra/newview/skins/default/xui/it/menu_login.xml
index 0a6d803058..bdf7d2094f 100644
--- a/indra/newview/skins/default/xui/it/menu_login.xml
+++ b/indra/newview/skins/default/xui/it/menu_login.xml
@@ -16,7 +16,8 @@
<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 Web" name="Web Browser Test"/>
+ <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>
diff --git a/indra/newview/skins/default/xui/it/menu_media_ctrl.xml b/indra/newview/skins/default/xui/it/menu_media_ctrl.xml
new file mode 100644
index 0000000000..a0e7370efd
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/menu_media_ctrl.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="media ctrl context menu">
+ <menu_item_call label="Taglia" name="Cut"/>
+ <menu_item_call label="Copia" name="Copy"/>
+ <menu_item_call label="Incolla" name="Paste"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_mini_map.xml b/indra/newview/skins/default/xui/it/menu_mini_map.xml
index ecc2bef06a..561b80e046 100644
--- a/indra/newview/skins/default/xui/it/menu_mini_map.xml
+++ b/indra/newview/skins/default/xui/it/menu_mini_map.xml
@@ -3,6 +3,7 @@
<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"/>
diff --git a/indra/newview/skins/default/xui/it/menu_model_import_gear_default.xml b/indra/newview/skins/default/xui/it/menu_model_import_gear_default.xml
new file mode 100644
index 0000000000..5012e6450f
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/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="Mostra bordi" name="show_edges"/>
+ <menu_item_check label="Mostra fisica" name="show_physics"/>
+ <menu_item_check label="Mostra texture" name="show_textures"/>
+ <menu_item_check label="Mostra peso pelle" name="show_skin_weight"/>
+ <menu_item_check label="Mostra posizioni giunti" name="show_joint_positions"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_object.xml b/indra/newview/skins/default/xui/it/menu_object.xml
index 4c7402ea08..a172cf3b26 100644
--- a/indra/newview/skins/default/xui/it/menu_object.xml
+++ b/indra/newview/skins/default/xui/it/menu_object.xml
@@ -16,14 +16,14 @@
<context_menu label="Attacca" name="Object Attach"/>
<context_menu label="Attacca HUD" name="Object Attach HUD"/>
</context_menu>
- <context_menu label="Rimuovi" name="Remove">
+ <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..."/>
- <menu_item_call label="Elimina" name="Delete"/>
</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/default/xui/it/menu_outfit_gear.xml b/indra/newview/skins/default/xui/it/menu_outfit_gear.xml
index a02d4ad429..09fc867d7c 100644
--- a/indra/newview/skins/default/xui/it/menu_outfit_gear.xml
+++ b/indra/newview/skins/default/xui/it/menu_outfit_gear.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Gear Outfit">
+<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"/>
@@ -14,6 +14,7 @@
<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">
@@ -24,4 +25,4 @@
</menu>
<menu_item_call label="Cambia nome del vestiario" name="rename"/>
<menu_item_call label="Elimina vestito" name="delete_outfit"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_places_gear_folder.xml b/indra/newview/skins/default/xui/it/menu_places_gear_folder.xml
index 59fbb86ddc..23757d47e0 100644
--- a/indra/newview/skins/default/xui/it/menu_places_gear_folder.xml
+++ b/indra/newview/skins/default/xui/it/menu_places_gear_folder.xml
@@ -1,7 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_folder_gear">
+<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"/>
@@ -12,4 +13,4 @@
<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>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_places_gear_landmark.xml b/indra/newview/skins/default/xui/it/menu_places_gear_landmark.xml
index 32d7abc259..a458b1a768 100644
--- a/indra/newview/skins/default/xui/it/menu_places_gear_landmark.xml
+++ b/indra/newview/skins/default/xui/it/menu_places_gear_landmark.xml
@@ -1,10 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_ladmark_gear">
+<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"/>
@@ -15,4 +16,4 @@
<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"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_viewer.xml b/indra/newview/skins/default/xui/it/menu_viewer.xml
index 72dfbeecb6..e4df0630d9 100644
--- a/indra/newview/skins/default/xui/it/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/it/menu_viewer.xml
@@ -7,11 +7,17 @@
</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="Cambia vestiario" name="ChangeOutfit"/>
+ <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 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_item_call label="Assente" name="Set Away"/>
<menu_item_call label="Non disponibile" name="Set Busy"/>
@@ -29,6 +35,7 @@
<menu label="Mondo" name="World">
<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="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">
@@ -47,6 +54,7 @@
<menu_item_check label="Proprietari di terreno" name="Land Owners"/>
<menu_item_check label="Coordinate" name="Coordinates"/>
<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"/>
@@ -85,6 +93,7 @@
<menu_item_call label="Prendi copia" name="Take Copy"/>
<menu_item_call label="Salva nell&apos;inventario" name="Save Object Back to My Inventory"/>
<menu_item_call label="Salva nei contenuti oggetto" name="Save Object Back to Object Contents"/>
+ <menu_item_call label="Restituisci oggetto" name="Return Object back to Owner"/>
</menu>
<menu label="Script" name="Scripts">
<menu_item_call label="Ricompila script (Mono)" name="Mono"/>
@@ -98,6 +107,7 @@
<menu_item_check label="Seleziona solo i miei oggetti" name="Select Only My Objects"/>
<menu_item_check label="Seleziona solo gli oggetti spostabili" name="Select Only Movable Objects"/>
<menu_item_check label="Seleziona circostante" name="Select By Surrounding"/>
+ <menu_item_check label="Mostra contorni selezione" name="Show Selection Outlines"/>
<menu_item_check label="Seleziona mostra nascosti" name="Show Hidden Selection"/>
<menu_item_check label="Seleziona mostra il raggio luminoso per la selezione" name="Show Light Radius for Selection"/>
<menu_item_check label="Mostra il raggio indicatore" name="Show Selection Beam"/>
@@ -110,17 +120,21 @@
<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="Modella..." name="Upload Model"/>
+ <menu_item_call label="Procedura guidata modellazione..." name="Upload Model Wizard"/>
<menu_item_call label="In blocco ([COST] L$ per file)..." name="Bulk Upload"/>
</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="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"/>
</menu>
<menu label="Avanzate" name="Advanced">
- <menu_item_call label="Ferma animazione" name="Stop Animating My Avatar"/>
<menu_item_call label="Ridisegna le texture" name="Rebake Texture"/>
<menu_item_call label="Imposta dimensioni dell&apos;interfaccia sui valori predefiniti" name="Set UI Size to Default"/>
<menu_item_call label="Imposta dimensioni della finestra..." name="Set Window Size..."/>
@@ -147,7 +161,7 @@
<menu_item_check label="Alpha (Trasparenza)" name="Alpha"/>
<menu_item_check label="Albero" name="Tree"/>
<menu_item_check label="Avatar" name="Character"/>
- <menu_item_check label="Superficie" name="SurfacePath"/>
+ <menu_item_check label="Superficie chiusa" name="Surface Patch"/>
<menu_item_check label="Cielo" name="Sky"/>
<menu_item_check label="Acqua" name="Water"/>
<menu_item_check label="Suolo" name="Ground"/>
@@ -174,8 +188,7 @@
<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="Corri sempre" name="Always Run"/>
- <menu_item_check label="Vola" name="Fly"/>
+ <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"/>
<menu_item_call label="Foto su disco" name="Snapshot to Disk"/>
@@ -193,7 +206,6 @@
<menu_item_call label="Zoom avanti" name="Zoom In"/>
<menu_item_call label="Zoom predefinito" name="Zoom Default"/>
<menu_item_call label="Zoom indietro" name="Zoom Out"/>
- <menu_item_check label="Mostra menu Avanzato" name="Show Advanced Menu"/>
</menu>
<menu_item_call label="Mostra impostazioni di debug" name="Debug Settings"/>
<menu_item_check label="Mostra menu sviluppo" name="Debug Mode"/>
@@ -207,6 +219,7 @@
<menu_item_check label="Console categoria texture" name="Texture Category"/>
<menu_item_check label="Timer veloci" name="Fast Timers"/>
<menu_item_check label="Memoria" name="Memory"/>
+ <menu_item_check label="Statistiche scena" name="Scene Statistics"/>
<menu_item_call label="Informazioni regione sulla console di debug" name="Region Info to Debug Console"/>
<menu_item_check label="Fotocamera" name="Camera"/>
<menu_item_check label="Vento" name="Wind"/>
@@ -214,8 +227,11 @@
</menu>
<menu label="Mostra informazioni" name="Display Info">
<menu_item_check label="Mostra orario" name="Show Time"/>
+ <menu_item_check label="Mostra costo di caricamento" name="Show Upload Cost"/>
<menu_item_check label="Mostra informazioni di rendering" name="Show Render Info"/>
+ <menu_item_check label="Mostra info sulla texture" name="Show Texture Info"/>
<menu_item_check label="Mostra colore sotto il cursore" name="Show Color Under Cursor"/>
+ <menu_item_check label="Mostra memoria" name="Show Memory"/>
<menu_item_check label="Mostra aggiornamenti agli oggetti" name="Show Updates"/>
</menu>
<menu label="Forza un errore" name="Force Errors">
@@ -233,6 +249,14 @@
<menu_item_check label="Veloc. di visualizzazione casuale" name="Randomize Framerate"/>
<menu_item_check label="Test frame" name="Frame Test"/>
</menu>
+ <menu label="Render Metadata" name="Render Metadata">
+ <menu_item_check label="Normali" name="Normals"/>
+ <menu_item_check label="Forme fisica" name="Physics Shapes"/>
+ <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="Scolpisci" name="Sculpt"/>
+ </menu>
<menu label="Rendering" name="Rendering">
<menu_item_check label="Assi" name="Axes"/>
<menu_item_check label="Wireframe" name="Wireframe"/>
@@ -261,21 +285,20 @@
<menu_item_call label="Dump della cache oggetti regione" name="Dump Region Object Cache"/>
</menu>
<menu label="Interfaccia utente" name="UI">
- <menu_item_call label="Test browser Web" name="Web Browser Test"/>
+ <menu_item_call label="Test browser multimedia" name="Web Browser Test"/>
+ <menu_item_call label="Browser contenuto Web" name="Web Content Browser"/>
<menu_item_call label="Stampa informazioni oggetto selezionato" name="Print Selected Object Info"/>
<menu_item_call label="Statistiche memoria" name="Memory Stats"/>
- <menu_item_check label="Doppio clic pilota automatico" name="Double-Click Auto-Pilot"/>
- <menu_item_check label="Doppio clic per teleport" name="DoubleClick Teleport"/>
+ <menu_item_check label="Console di debug regione" name="Region Debug Console"/>
<menu_item_check label="Debug clic" name="Debug Clicks"/>
<menu_item_check label="Debug eventi mouse" name="Debug Mouse Events"/>
</menu>
<menu label="XUI" name="XUI">
<menu_item_call label="Ricarica impostazioni colori" name="Reload Color Settings"/>
<menu_item_call label="Test Mostra Font" name="Show Font Test"/>
- <menu_item_call label="Carica da XML" name="Load from XML"/>
- <menu_item_call label="Salva in XML" name="Save to XML"/>
<menu_item_check label="Mostra nomi XUI" name="Show XUI Names"/>
<menu_item_call label="Manda IM di prova" name="Send Test IMs"/>
+ <menu_item_call label="Svuota cache nomi" name="Flush Names Caches"/>
</menu>
<menu label="Avatar" name="Character">
<menu label="Grab Baked Texture" name="Grab Baked Texture">
@@ -298,10 +321,11 @@
<menu_item_call label="Debug texture dell&apos;avatar" name="Debug Avatar Textures"/>
</menu>
<menu_item_check label="Texture HTTP" name="HTTP Textures"/>
+ <menu_item_check label="Inventario HTTP" name="HTTP Inventory"/>
<menu_item_check label="Finestra Console al prossimo lancio" name="Console Window"/>
- <menu_item_check label="Mostra menu Admin" name="View Admin Options"/>
<menu_item_call label="Richiedi diritti Admin" name="Request Admin Options"/>
<menu_item_call label="Lascia stato Admin" name="Leave Admin Options"/>
+ <menu_item_check label="Mostra menu Admin" name="View Admin Options"/>
</menu>
<menu label="Admin" name="Admin">
<menu label="Object">
@@ -322,4 +346,9 @@
</menu>
<menu_item_call label="Strumenti Admin" name="God Tools"/>
</menu>
+ <menu label="Admin" name="Deprecated">
+ <menu label="Take Off Clothing" name="Take Off Clothing">
+ <menu_item_call label="Fisica" name="Physics"/>
+ </menu>
+ </menu>
</menu_bar>
diff --git a/indra/newview/skins/default/xui/it/notifications.xml b/indra/newview/skins/default/xui/it/notifications.xml
index cce5888598..f50051c004 100644
--- a/indra/newview/skins/default/xui/it/notifications.xml
+++ b/indra/newview/skins/default/xui/it/notifications.xml
@@ -73,7 +73,7 @@ Dettagli errore: La notifica denominata &apos;[_NAME]&apos; non è stata trovata
</notification>
<notification name="LoginFailedNoNetwork">
Non è possibile collegarsi alla [SECOND_LIFE_GRID].
-&apos;[DIAGNOSTIC]&apos;
+ &apos;[DIAGNOSTIC]&apos;
Accertati che la tua connessione Internet stia funzionando correttamente.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
@@ -109,9 +109,13 @@ Scegli solo un oggetto e riprova.
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 [FIRST_NAME] [LAST_NAME]?
+Vuoi concedere i diritti di modifica a [NAME]?
<usetemplate name="okcancelbuttons" notext="No" yestext="Si"/>
</notification>
<notification name="GrantModifyRightsMultiple">
@@ -120,7 +124,7 @@ 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 dati a [FIRST_NAME] [LAST_NAME]?
+ Vuoi revocare i diritti di modifica di [NAME]?
<usetemplate name="okcancelbuttons" notext="No" yestext="Si"/>
</notification>
<notification name="RevokeModifyRightsMultiple">
@@ -317,24 +321,17 @@ Superato il limite di oggetti collegati [MAX_ATTACHMENTS]. Per favore prima stac
Non puoi indossare quell&apos;elemento perchè non è ancora stato caricato. Riprova fra un minuto.
</notification>
<notification name="MustHaveAccountToLogIn">
- Qualcosa è rimasto vuoto.
-Devi inserire sia il nome che il cognome del tuo avatar.
+ Spiacenti. Un campo è vuoto.
+Inserisci il Nome utente del tuo avatar.
-Hai bisogno di un account per entrare in [SECOND_LIFE]. Ne vuoi creare uno adesso?
+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 sia il nome che il cognome del tuo avatar nel campo del nome utente, quindi effettua l&apos;accesso.
- </notification>
- <notification name="AddClassified">
- L&apos;inserzione comparirà nella sezione &apos;Annunci&apos; della Ricerca e su [http://secondlife.com/community/classifieds secondlife.com] per una settimana.
-Compila la tua inserzione, quindi clicca &apos;Pubblica...&apos; per aggiungerla all&apos;elenco degli annunci.
-Quando clicchi su Pubblica, ti verrà chiesto di indicare quale prezzo vuoi pagare.
-Pagando di più, il tuo annuncio comparirà più in alto nella lista delle inserzioni, nonché nei risultati delle ricerche in base a parole chiave.
- <usetemplate ignoretext="Come creare una nuova inserzione" name="okcancelignore" notext="Annulla" yestext="OK"/>
+ 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;?
@@ -388,6 +385,9 @@ Nota: questa operazione cancellerà la cache.
<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"/>
@@ -598,6 +598,10 @@ Attese [VALIDS]
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]
@@ -918,12 +922,6 @@ In genere si tratta di un problema temporaneo. Attendi alcuni minuti per modific
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="AddFriend">
- 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]?
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
- </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.
@@ -942,7 +940,7 @@ Offri l&apos;amicizia a [NAME]?
<input name="message">
[DESC] (nuovo)
</input>
- <button name="Offer" text="OK"/>
+ <button name="OK" text="OK"/>
<button name="Cancel" text="Annulla"/>
</form>
</notification>
@@ -952,7 +950,7 @@ Offri l&apos;amicizia a [NAME]?
<input name="message">
[DESC] (nuovo)
</input>
- <button name="Offer" text="OK"/>
+ <button name="OK" text="OK"/>
<button name="Cancel" text="Annulla"/>
</form>
</notification>
@@ -962,12 +960,12 @@ Offri l&apos;amicizia a [NAME]?
<input name="new_name">
[NAME]
</input>
- <button name="Offer" text="OK"/>
+ <button name="OK" text="OK"/>
<button name="Cancel" text="Annulla"/>
</form>
</notification>
<notification name="RemoveFromFriends">
- Vuoi rimuovere remove [FIRST_NAME] [LAST_NAME] dalla lista dei tuoi amici?
+ Vuoi rimuovere [NAME] dalla lista dei tuoi amici?
<usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
</notification>
<notification name="RemoveMultipleFromFriends">
@@ -1089,12 +1087,11 @@ Cedi questo terreno di [AREA] m² al gruppo &apos;[GROUP_NAME]&apos;?
<usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
</notification>
<notification name="DeedLandToGroupWithContribution">
- Cedendo questo terreno al gruppo sara richiesto hai componenti di avere e di mantenere il terreno con un credito sufficiente.
-La cessione include un contributo simultaneo di terreno al gruppo da &apos;[FIRST_NAME] [LAST_NAME]&apos;.
-Il prezzo di acquisto del terreno non è rifondibile al proprietario.
-Se una terreno ceduto al gruppo viene venduto, il prezzo di vendita viene diviso in parti uguali fra i membri del gruppo.
+ 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.
-Cedi questo terreno di [AREA] m² al gruppo &apos;[GROUP_NAME]&apos;?
+Cedere questi [AREA] m² di terreno al gruppo &apos;[GROUP_NAME]&apos;?
<usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
</notification>
<notification name="DisplaySetToSafe">
@@ -1336,6 +1333,48 @@ Questo aggiornamento non è necessario, ma ti consigliamo di installarlo per mig
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
@@ -1466,6 +1505,46 @@ La chat e gli IM verranno nascosti. Gli IM riceveranno la tua risposta di Non di
<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">
@@ -2084,6 +2163,12 @@ Questo potrebbe incidere sulla tua password.
<notification name="RezItemNoPermissions">
Permessi insufficienti per creare un oggetto.
</notification>
+ <notification name="IMAcrossParentEstates">
+ Impossibile inviare IM tra proprietà principali diverse.
+ </notification>
+ <notification name="TransferInventoryAcrossParentEstates">
+ Impossibile trasferire l&apos;inventario tra proprietà principali diverse.
+ </notification>
<notification name="UnableToLoadNotecard">
Impossibile caricare la notecard in questo momento.
</notification>
@@ -2164,18 +2249,13 @@ Prova a selezionare una parte di terreno più piccola.
<notification name="NoContentToSearch">
Seleziona almeno un tipo di contenuto per la ricerca (Generale, Moderato o Adulti).
</notification>
- <notification name="GroupVote">
- [NAME] ha proposto di votare su:
-[MESSAGE]
- <form name="form">
- <button name="VoteNow" text="Vota ora"/>
- <button name="Later" text="Successivo"/>
- </form>
- </notification>
<notification name="SystemMessage">
[MESSAGE]
</notification>
- <notification name="PaymentRecived">
+ <notification name="PaymentReceived">
+ [MESSAGE]
+ </notification>
+ <notification name="PaymentSent">
[MESSAGE]
</notification>
<notification name="EventNotification">
@@ -2184,7 +2264,7 @@ Prova a selezionare una parte di terreno più piccola.
[NAME]
[DATE]
<form name="form">
- <button name="Details" text="Descrizione"/>
+ <button name="Details" text="Dettagli"/>
<button name="Cancel" text="Cancella"/>
</form>
</notification>
@@ -2220,7 +2300,7 @@ Reinstalla il plugin o contatta il venditore se continui ad avere questi problem
Gli oggetti che possiedi sul terreno selezionato ti sono stati restituiti nell&apos;inventario.
</notification>
<notification name="OtherObjectsReturned">
- Gli oggetti selezionati sul terreno che è di proprietà di [NAME] sono stati restituiti nel suo inventario.
+ 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;.
@@ -2344,7 +2424,7 @@ Riprova tra qualche istante.
Non è stato trovato nessun territorio valido.
</notification>
<notification name="ObjectGiveItem">
- Un oggetto denominato [OBJECTFROMNAME] di proprietà di [NAME_SLURL] ti ha dato questo [OBJECTTYPE]:
+ Un oggetto denominato &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt; di proprietà di [NAME_SLURL] ti ha dato questo [OBJECTTYPE]:
[ITEM_SLURL]
<form name="form">
<button name="Keep" text="Prendi"/>
@@ -2409,9 +2489,9 @@ Riprova tra qualche istante.
Hai offerto l&apos;amicizia a [TO_NAME]
</notification>
<notification name="OfferFriendshipNoMessage">
- [NAME] ti ha offerto la sua amicizia.
+ [NAME_SLURL] ti ha offerto di diventare amici.
-(Di default, potrete vedervi reciprocamente online.)
+(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"/>
@@ -2430,7 +2510,7 @@ Riprova tra qualche istante.
Offerta di amicizia rifiutata.
</notification>
<notification name="OfferCallingCard">
- [NAME] ti offre il suo biglietto da visita.
+ [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"/>
@@ -2446,11 +2526,11 @@ Se rimani qui verrai scollegato da Second Life.
Se rimani qui verrai scollegato da Second Life.
</notification>
<notification name="LoadWebPage">
- Caricare pagina web [URL]?
+ Caricare la pagina Web [URL]?
[MESSAGE]
-Dall&apos;oggetto: [OBJECTNAME], di: [NAME]?
+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"/>
@@ -2466,10 +2546,10 @@ Dall&apos;oggetto: [OBJECTNAME], di: [NAME]?
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;[OBJECTNAME]&apos;, un oggetto di proprietà di &apos;[NAME]&apos;, vorrebbe:
+ &apos;&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;&apos;, un oggetto posseduto da &apos;[NAME]&apos; vorrebbe:
[QUESTIONS]
-Va bene?
+OK?
<form name="form">
<button name="Yes" text="Si"/>
<button name="No" text="No"/>
@@ -2477,7 +2557,7 @@ Va bene?
</form>
</notification>
<notification name="ScriptQuestionCaution">
- Un oggetto di nome &apos;[OBJECTNAME]&apos;, posseduto da &apos;[NAME]&apos; vorrebbe:
+ 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.
@@ -2490,14 +2570,14 @@ Concedi questa richiesta?
</form>
</notification>
<notification name="ScriptDialog">
- [NAME] &apos;&lt;nolink&gt;[TITLE]&lt;/nolink&gt;&apos;
+ &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">
- [GROUPNAME] &apos;[TITLE]&apos;
+ &apos;&lt;nolink&gt;[TITLE]&lt;/nolink&gt;&apos; di [GROUPNAME]
[MESSAGE]
<form name="form">
<button name="Ignore" text="Ignora"/>
@@ -2537,10 +2617,10 @@ Clicca su Accetta per unirti alla chiamata oppure su Declina to declinare l&apos
[NAME] ha ricevuto un IM ed è stato automaticamente sbloccato.
</notification>
<notification name="AutoUnmuteByMoney">
- [NAME] ha ricevuto del denaro e pertanto è stato automaticamente sbloccato.
+ [NAME] ha ricevuto del denaro ed è stato automaticamente sbloccato.
</notification>
<notification name="AutoUnmuteByInventory">
- A [NAME] è stato offerto un elemento dell&apos;Inventario e pertanto è stato automaticamente sbloccato.
+ [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].
@@ -2662,6 +2742,10 @@ Per sicurezza, verranno bloccati per alcuni secondi.
La tua voce è stata interrotta dal moderatore.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
+ <notification name="UploadCostConfirmation">
+ Questo caricamento costerà L$[PRICE]. Continuare con il caricamento?
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="Carica"/>
+ </notification>
<notification name="ConfirmClearTeleportHistory">
Sei sicuro di volere cancellare la cronologia dei tuoi teleport?
<usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
@@ -2673,10 +2757,13 @@ Il pulsante verrà visualizzato quando lo spazio sarà sufficiente.
<notification name="ShareNotification">
Scegli i residenti con i quali condividere.
</notification>
+ <notification name="MeshUploadError">
+ [LABEL] non è stato caricato: [MESSAGE] [IDENTIFIER] [INVALIDITY_IDENTIFIER]
+ </notification>
<notification name="ShareItemsConfirmation">
Sei sicuro di volere condividere gli oggetti
-&lt;nolink&gt;[ITEMS]&lt;/nolink&gt;
+&lt;nolink&gt;[MSG]&lt;/nolink&gt;
Con i seguenti residenti?
@@ -2689,6 +2776,19 @@ Con i seguenti residenti?
<notification name="DeedToGroupFail">
Cessione al gruppo non riuscita.
</notification>
+ <notification name="ReleaseLandThrottled">
+ Il lotto [PARCEL_NAME] non può essere abbandonato in questo momento.
+ </notification>
+ <notification name="ReleasedLandWithReclaim">
+ Il lotto di [AREA] m² &apos;[PARCEL_NAME]&apos; è stato rilasciato.
+
+Hai [RECLAIM_PERIOD] ore per riprendere possesso per L$0 prima che venga messo in vendita a chiunque altro.
+ </notification>
+ <notification name="ReleasedLandNoReclaim">
+ Il lotto di [AREA] m² &apos;[PARCEL_NAME]&apos; è stato rilasciato.
+
+Ora è disponibile per l&apos;acquisto da parte di chiunque.
+ </notification>
<notification name="AvatarRezNotification">
( in esistenza da [EXISTENCE] secondi )
Nuvola avatar &apos;[NAME]&apos; dileguata dopo [TIME] secondi.
@@ -2725,9 +2825,7 @@ Avatar &apos;[NAME]&apos; ha lasciato la modalità aspetto.
<notification name="NoConnect">
Ci sono problemi di connessione tramite [PROTOCOL] [HOSTID].
Ti consigliamo di controllare le tue impostazioni di rete e della firewall.
- <form name="form">
- <button name="OK" text="OK"/>
- </form>
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="NoVoiceConnect">
A causa di problemi di connessione al server vocale
@@ -2736,9 +2834,7 @@ Ti consigliamo di controllare le tue impostazioni di rete e della firewall.
le comunicazioni tramite voce non saranno disponibili.
Ti consigliamo di controllare le tue impostazioni di rete e della firewall.
- <form name="form">
- <button name="OK" text="OK"/>
- </form>
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="AvatarRezLeftNotification">
( presente da [EXISTENCE] secondi )
@@ -2764,9 +2860,111 @@ uniscono alla chiamata in un secondo momento, anche dopo che tu ti fossi scolleg
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>
- <global name="UnsupportedCPU">
- - La velocità della tua CPU non soddisfa i requisiti minimi.
- </global>
+ <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="NoPlaceInfo">
+ La visualizzazione del profilo del luogo è 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="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>
+ <notification label="" name="NoInventory">
+ La visualizzazione dell&apos;inventario è disponibile solo in modalità Avanzata. Eseguire il logout e cambiare la modalità?
+ <usetemplate name="okcancelbuttons" notext="Non uscire" yestext="Esci"/>
+ </notification>
+ <notification label="" name="NoAppearance">
+ L&apos;editor dell&apos;aspetto è disponibile solo in modalità Avanzata. Eseguire il logout e cambiare la modalità?
+ <usetemplate name="okcancelbuttons" notext="Non uscire" yestext="Esci"/>
+ </notification>
+ <notification label="" name="NoSearch">
+ La ricerca è disponibile solo in modalità Avanzata. Eseguire il logout e cambiare la modalità?
+ <usetemplate name="okcancelbuttons" notext="Non uscire" yestext="Esci"/>
+ </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_avatar_list_item.xml b/indra/newview/skins/default/xui/it/panel_avatar_list_item.xml
index 3e604ca775..ede19b9e5a 100644
--- a/indra/newview/skins/default/xui/it/panel_avatar_list_item.xml
+++ b/indra/newview/skins/default/xui/it/panel_avatar_list_item.xml
@@ -21,7 +21,7 @@
<string name="FormatYears">
[COUNT] a
</string>
- <text name="avatar_name" value="Sconosciuto"/>
+ <text name="avatar_name" value="(caricamento in corso)"/>
<icon name="permission_edit_theirs_icon" tool_tip="Puoi modificare gli oggetti di questo amico"/>
<icon name="permission_edit_mine_icon" tool_tip="Questo amico può modificare, cancellare o prendere i tuoi oggetti"/>
<icon name="permission_map_icon" tool_tip="Questo amico può identificarti sulla mappa"/>
diff --git a/indra/newview/skins/default/xui/it/panel_edit_alpha.xml b/indra/newview/skins/default/xui/it/panel_edit_alpha.xml
index 286ee626cf..6daa0cf8fd 100644
--- a/indra/newview/skins/default/xui/it/panel_edit_alpha.xml
+++ b/indra/newview/skins/default/xui/it/panel_edit_alpha.xml
@@ -1,10 +1,12 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_alpha_panel">
- <panel name="avatar_alpha_color_panel">
- <texture_picker label="Alpha inferiore" name="Lower Alpha" tool_tip="Clicca per scegliere una fotografia"/>
- <texture_picker label="Alpha superiore" name="Upper Alpha" tool_tip="Clicca per scegliere una fotografia"/>
- <texture_picker label="Alpha della testa" name="Head Alpha" tool_tip="Clicca per scegliere una fotografia"/>
- <texture_picker label="Alpha dell&apos;occhio" name="Eye Alpha" tool_tip="Clicca per scegliere una fotografia"/>
- <texture_picker label="Alpha dei capelli" name="Hair Alpha" tool_tip="Clicca per scegliere una fotografia"/>
- </panel>
+ <scroll_container name="avatar_alpha_color_panel_scroll">
+ <panel name="avatar_alpha_color_panel">
+ <texture_picker label="Alpha inferiore" name="Lower Alpha" tool_tip="Clicca per scegliere una fotografia"/>
+ <texture_picker label="Alpha superiore" name="Upper Alpha" tool_tip="Clicca per scegliere una fotografia"/>
+ <texture_picker label="Alpha della testa" name="Head Alpha" tool_tip="Clicca per scegliere una fotografia"/>
+ <texture_picker label="Alpha dell&apos;occhio" name="Eye Alpha" tool_tip="Clicca per scegliere una fotografia"/>
+ <texture_picker label="Alpha dei capelli" name="Hair Alpha" tool_tip="Clicca per scegliere una fotografia"/>
+ </panel>
+ </scroll_container>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_edit_gloves.xml b/indra/newview/skins/default/xui/it/panel_edit_gloves.xml
index 48024b8095..366a82f7aa 100644
--- a/indra/newview/skins/default/xui/it/panel_edit_gloves.xml
+++ b/indra/newview/skins/default/xui/it/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="Tessuto" name="Fabric" tool_tip="Clicca per scegliere una fotografia"/>
+ <texture_picker label="Texture" name="Fabric" tool_tip="Clicca per scegliere una fotografia"/>
<color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/it/panel_edit_jacket.xml b/indra/newview/skins/default/xui/it/panel_edit_jacket.xml
index d77c1ec763..337720d068 100644
--- a/indra/newview/skins/default/xui/it/panel_edit_jacket.xml
+++ b/indra/newview/skins/default/xui/it/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="Tessuto superiore" name="Upper Fabric" tool_tip="Clicca per scegliere una fotografia"/>
- <texture_picker label="Tessuto inferiore" name="Lower Fabric" tool_tip="Clicca per scegliere una fotografia"/>
+ <texture_picker label="Texture superiore" name="Upper Fabric" tool_tip="Clicca per scegliere una fotografia"/>
+ <texture_picker label="Texture inferiore" name="Lower Fabric" tool_tip="Clicca per scegliere una fotografia"/>
<color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/it/panel_edit_pants.xml b/indra/newview/skins/default/xui/it/panel_edit_pants.xml
index 83ef274877..21b5b7c026 100644
--- a/indra/newview/skins/default/xui/it/panel_edit_pants.xml
+++ b/indra/newview/skins/default/xui/it/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="Tessuto" name="Fabric" tool_tip="Clicca per scegliere una fotografia"/>
+ <texture_picker label="Texture" name="Fabric" tool_tip="Clicca per scegliere una fotografia"/>
<color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/it/panel_edit_physics.xml b/indra/newview/skins/default/xui/it/panel_edit_physics.xml
new file mode 100644
index 0000000000..669a2c0eab
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/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="Rimbalzo seno"/>
+ <accordion_tab name="physics_breasts_inout_tab" title="Décolleté"/>
+ <accordion_tab name="physics_breasts_leftright_tab" title="Ondeggiamento seno"/>
+ <accordion_tab name="physics_belly_tab" title="Rimbalzo pancia"/>
+ <accordion_tab name="physics_butt_tab" title="Rimbalzo natiche"/>
+ <accordion_tab name="physics_butt_leftright_tab" title="Ondeggiamento natiche"/>
+ <accordion_tab name="physics_advanced_tab" title="Parametri avanzati"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_edit_pick.xml b/indra/newview/skins/default/xui/it/panel_edit_pick.xml
index 8e464ca037..145b8cf4e3 100644
--- a/indra/newview/skins/default/xui/it/panel_edit_pick.xml
+++ b/indra/newview/skins/default/xui/it/panel_edit_pick.xml
@@ -29,7 +29,7 @@
<layout_panel name="layout_panel1">
<button label="Salva luogo preferito" name="save_changes_btn"/>
</layout_panel>
- <layout_panel name="layout_panel1">
+ <layout_panel name="layout_panel2">
<button label="Annulla" name="cancel_btn"/>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/it/panel_edit_profile.xml b/indra/newview/skins/default/xui/it/panel_edit_profile.xml
index 263ae105dc..545e96a8f1 100644
--- a/indra/newview/skins/default/xui/it/panel_edit_profile.xml
+++ b/indra/newview/skins/default/xui/it/panel_edit_profile.xml
@@ -22,6 +22,14 @@
<scroll_container name="profile_scroll">
<panel name="scroll_content_panel">
<panel name="data_panel">
+ <text name="display_name_label" value="Nome visualizzato:"/>
+ <text name="solo_username_label" value="Nome utente:"/>
+ <button name="set_name" tool_tip="Imposta nome visualizzato"/>
+ <text name="solo_user_name" value="Hamilton Hitchings"/>
+ <text name="user_name" value="Hamilton Hitchings"/>
+ <text name="user_name_small" value="Hamilton Hitchings"/>
+ <text name="user_label" value="Nome utente:"/>
+ <text name="user_slid" value="hamilton.linden"/>
<panel name="lifes_images_panel">
<icon label="" name="2nd_life_edit_icon" tool_tip="Clicca per selezionare un&apos;immagine"/>
</panel>
@@ -38,7 +46,7 @@
<text name="my_account_link" value="[[URL] Go to My Dashboard]"/>
<text name="title_partner_text" value="Il mio partner:"/>
<panel name="partner_data_panel">
- <name_box initial_value="(recupero)" name="partner_text"/>
+ <text initial_value="(recupero)" name="partner_text"/>
</panel>
<text name="partner_edit_link" value="[[URL] Edit]"/>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_edit_shirt.xml b/indra/newview/skins/default/xui/it/panel_edit_shirt.xml
index 1f41b28348..1777c0147f 100644
--- a/indra/newview/skins/default/xui/it/panel_edit_shirt.xml
+++ b/indra/newview/skins/default/xui/it/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="Tessuto" name="Fabric" tool_tip="Clicca per scegliere una fotografia"/>
+ <texture_picker label="Texture" name="Fabric" tool_tip="Clicca per scegliere una fotografia"/>
<color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/it/panel_edit_shoes.xml b/indra/newview/skins/default/xui/it/panel_edit_shoes.xml
index 7a82c8e99d..c79408b94a 100644
--- a/indra/newview/skins/default/xui/it/panel_edit_shoes.xml
+++ b/indra/newview/skins/default/xui/it/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="Tessuto" name="Fabric" tool_tip="Clicca per scegliere una fotografia"/>
+ <texture_picker label="Texture" name="Fabric" tool_tip="Clicca per scegliere una fotografia"/>
<color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/it/panel_edit_skirt.xml b/indra/newview/skins/default/xui/it/panel_edit_skirt.xml
index 7080b65737..87cdd16676 100644
--- a/indra/newview/skins/default/xui/it/panel_edit_skirt.xml
+++ b/indra/newview/skins/default/xui/it/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="Tessuto" name="Fabric" tool_tip="Clicca per scegliere una fotografia"/>
+ <texture_picker label="Texture" name="Fabric" tool_tip="Clicca per scegliere una fotografia"/>
<color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/it/panel_edit_socks.xml b/indra/newview/skins/default/xui/it/panel_edit_socks.xml
index 6731511282..f61a72ed76 100644
--- a/indra/newview/skins/default/xui/it/panel_edit_socks.xml
+++ b/indra/newview/skins/default/xui/it/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="Tessuto" name="Fabric" tool_tip="Clicca per scegliere una fotografia"/>
+ <texture_picker label="Texture" name="Fabric" tool_tip="Clicca per scegliere una fotografia"/>
<color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/it/panel_edit_underpants.xml b/indra/newview/skins/default/xui/it/panel_edit_underpants.xml
index 671eb57551..924344e3c0 100644
--- a/indra/newview/skins/default/xui/it/panel_edit_underpants.xml
+++ b/indra/newview/skins/default/xui/it/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="Tessuto" name="Fabric" tool_tip="Clicca per scegliere una fotografia"/>
+ <texture_picker label="Texture" name="Fabric" tool_tip="Clicca per scegliere una fotografia"/>
<color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/it/panel_edit_undershirt.xml b/indra/newview/skins/default/xui/it/panel_edit_undershirt.xml
index fccc86f8fc..2f22c03294 100644
--- a/indra/newview/skins/default/xui/it/panel_edit_undershirt.xml
+++ b/indra/newview/skins/default/xui/it/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="Tessuto" name="Fabric" tool_tip="Clicca per scegliere una fotografia"/>
+ <texture_picker label="Texture" name="Fabric" tool_tip="Clicca per scegliere una fotografia"/>
<color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/it/panel_edit_wearable.xml b/indra/newview/skins/default/xui/it/panel_edit_wearable.xml
index 94bda7b2a6..e54dc26d05 100644
--- a/indra/newview/skins/default/xui/it/panel_edit_wearable.xml
+++ b/indra/newview/skins/default/xui/it/panel_edit_wearable.xml
@@ -45,6 +45,9 @@
<string name="edit_tattoo_title">
Modifica del tatuaggio
</string>
+ <string name="edit_physics_title">
+ Modifica fisica
+ </string>
<string name="shape_desc_text">
Figura corporea:
</string>
@@ -90,6 +93,9 @@
<string name="tattoo_desc_text">
Tatuaggio:
</string>
+ <string name="physics_desc_text">
+ Fisica:
+ </string>
<labeled_back_button label="Salva" name="back_btn" tool_tip="Torna alla modifica del vestiario"/>
<text name="edit_wearable_title" value="Modifica della figura corporea"/>
<panel label="Camicia" name="wearable_type_panel">
diff --git a/indra/newview/skins/default/xui/it/panel_group_land_money.xml b/indra/newview/skins/default/xui/it/panel_group_land_money.xml
index 16cc91cd9d..27675a18f5 100644
--- a/indra/newview/skins/default/xui/it/panel_group_land_money.xml
+++ b/indra/newview/skins/default/xui/it/panel_group_land_money.xml
@@ -24,6 +24,7 @@
<scroll_list.columns label="Regione" name="location"/>
<scroll_list.columns label="Tipo" name="type"/>
<scroll_list.columns label="Superficie" name="area"/>
+ <scroll_list.columns label="Nascosto" name="hidden"/>
</scroll_list>
<text name="total_contributed_land_label">
Contributo totale:
diff --git a/indra/newview/skins/default/xui/it/panel_group_notices.xml b/indra/newview/skins/default/xui/it/panel_group_notices.xml
index 2e2f0dc7b0..524f7d2822 100644
--- a/indra/newview/skins/default/xui/it/panel_group_notices.xml
+++ b/indra/newview/skins/default/xui/it/panel_group_notices.xml
@@ -25,18 +25,15 @@ Massimo 200 per gruppo al giorno
<text name="lbl">
Crea una notice
</text>
- <text left="20" name="lbl3">
+ <text name="lbl3">
Oggetto:
</text>
- <line_editor left_delta="61" name="create_subject" width="251"/>
- <text left="15" name="lbl4" width="60">
+ <text name="lbl4">
Messaggio:
</text>
- <text_editor left_delta="66" name="create_message" width="330"/>
- <text name="lbl5" width="68">
+ <text name="lbl5">
Allega:
</text>
- <line_editor left_delta="74" name="create_inventory_name" width="190"/>
<text name="string">
Trascina e rilascia qui l&apos;oggetto da allegare:
</text>
diff --git a/indra/newview/skins/default/xui/it/panel_login.xml b/indra/newview/skins/default/xui/it/panel_login.xml
index 473bcfa88d..f88230ed11 100644
--- a/indra/newview/skins/default/xui/it/panel_login.xml
+++ b/indra/newview/skins/default/xui/it/panel_login.xml
@@ -11,12 +11,19 @@
<text name="username_text">
Nome utente:
</text>
- <line_editor label="Nome utente" name="username_edit" tool_tip="Nome utente [SECOND_LIFE]"/>
+ <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>
@@ -31,7 +38,7 @@
Iscriviti
</text>
<text name="forgot_password_text">
- Hai dimenticato il nome o la password?
+ Hai dimenticato il nome utente o la password?
</text>
<text name="login_help">
Ti serve aiuto con la fase di accesso?
diff --git a/indra/newview/skins/default/xui/it/panel_media_settings_general.xml b/indra/newview/skins/default/xui/it/panel_media_settings_general.xml
index 5ed7b23679..f11b2415ee 100644
--- a/indra/newview/skins/default/xui/it/panel_media_settings_general.xml
+++ b/indra/newview/skins/default/xui/it/panel_media_settings_general.xml
@@ -22,7 +22,7 @@
<text name="media_setting_note">
Nota: I residenti possono annullare questa impostazione
</text>
- <check_box initial_value="false" label="Messa in scala automatica dell&apos;elemento multimediale sulla faccia dell&apos;oggetto" name="auto_scale"/>
+ <check_box initial_value="false" label="Messa in scala automatica dell&apos;elemento multimediale sulla &#10;faccia dell&apos;oggetto" name="auto_scale"/>
<text name="size_label">
Dimensioni:
</text>
diff --git a/indra/newview/skins/default/xui/it/panel_my_profile.xml b/indra/newview/skins/default/xui/it/panel_my_profile.xml
index 3e6683beb8..094b97962f 100644
--- a/indra/newview/skins/default/xui/it/panel_my_profile.xml
+++ b/indra/newview/skins/default/xui/it/panel_my_profile.xml
@@ -5,30 +5,27 @@
<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">
- <icon label="" name="2nd_life_edit_icon" tool_tip="Clicca sul pulsante Modifica profilo per cambiare l&apos;immagine"/>
- <text name="title_sl_descr_text" value="[SECOND_LIFE]:"/>
- </panel>
- <panel name="first_life_image_panel">
- <icon label="" name="real_world_edit_icon" tool_tip="Clicca sul pulsante Modifica profilo per cambiare l&apos;immagine"/>
- <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">
- <name_box initial_value="(recupero)" name="partner_text"/>
+ <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>
- <text name="title_groups_text" value="Gruppi:"/>
</panel>
</scroll_container>
</layout_panel>
</layout_stack>
- <panel name="profile_me_buttons_panel">
- <button label="Modifica profilo" name="edit_profile_btn" tool_tip="Modifica le tue informazioni personali"/>
- </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_nearby_media.xml b/indra/newview/skins/default/xui/it/panel_nearby_media.xml
index 40312f76b4..03421456f9 100644
--- a/indra/newview/skins/default/xui/it/panel_nearby_media.xml
+++ b/indra/newview/skins/default/xui/it/panel_nearby_media.xml
@@ -19,7 +19,7 @@
<button label="Spegni" name="all_nearby_media_disable_btn" tool_tip="Spegni tutti i media nei dintorni"/>
<button label="Accendi tutto" name="all_nearby_media_enable_btn" tool_tip="Accendi tutti i media nei dintorni"/>
<button name="open_prefs_btn" tool_tip="Accedi alle preferenze del media"/>
- <button label="Più &gt;&gt;" label_selected="Meno &lt;&lt;" name="more_btn" tool_tip="Opzioni avanzate"/>
+ <button label="Più &gt;&gt;" label_selected="&lt;&lt; Meno" name="more_btn" tool_tip="Opzioni avanzate"/>
<button label="Più &gt;&gt;" label_selected="Meno &lt;&lt;" name="less_btn" tool_tip="Opzioni avanzate"/>
</panel>
<panel name="nearby_media_panel">
diff --git a/indra/newview/skins/default/xui/it/panel_notify_textbox.xml b/indra/newview/skins/default/xui/it/panel_notify_textbox.xml
new file mode 100644
index 0000000000..ef27262010
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/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="messaggio"/>
+ </panel>
+ <panel label="control_panel" name="control_panel">
+ <button label="Invia" name="btn_submit"/>
+ <button label="Ignora" name="ignore_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_people.xml b/indra/newview/skins/default/xui/it/panel_people.xml
index a8f60e556e..f903ae6e2c 100644
--- a/indra/newview/skins/default/xui/it/panel_people.xml
+++ b/indra/newview/skins/default/xui/it/panel_people.xml
@@ -18,11 +18,13 @@ Stai cercando persone da frequentare? Prova la [secondlife:///app/worldmap Mappa
<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">
- <button name="nearby_view_sort_btn" tool_tip="Opzioni"/>
+ <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>
@@ -34,27 +36,27 @@ Stai cercando persone da frequentare? Prova la [secondlife:///app/worldmap Mappa
<panel label="bottom_panel" name="bottom_panel">
<layout_stack name="bottom_panel">
<layout_panel name="options_gear_btn_panel">
- <button name="friends_viewsort_btn" tool_tip="Mostra ulteriori opzioni"/>
+ <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="trash_btn" tool_tip="Rimuovi la persona selezionata dalla lista degli amici"/>
+ <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">
- <button name="groups_viewsort_btn" tool_tip="Opzioni"/>
+ <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">
- <button name="recent_viewsort_btn" tool_tip="Opzioni"/>
+ <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>
@@ -64,16 +66,16 @@ Stai cercando persone da frequentare? Prova la [secondlife:///app/worldmap Mappa
<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="chat_btn_lp">
+ <layout_panel name="im_btn_lp">
<button label="IM" name="im_btn" tool_tip="Apri una sessione messaggio istantaneo"/>
</layout_panel>
- <layout_panel name="chat_btn_lp">
+ <layout_panel name="call_btn_lp">
<button label="Chiama" name="call_btn" tool_tip="Chiama questo residente"/>
</layout_panel>
- <layout_panel name="chat_btn_lp">
+ <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="chat_btn_lp">
+ <layout_panel name="teleport_btn_lp">
<button label="Teleport" name="teleport_btn" tool_tip="Offri teleport"/>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/it/panel_place_profile.xml b/indra/newview/skins/default/xui/it/panel_place_profile.xml
index eace6c89ce..c4ffe6af85 100644
--- a/indra/newview/skins/default/xui/it/panel_place_profile.xml
+++ b/indra/newview/skins/default/xui/it/panel_place_profile.xml
@@ -76,7 +76,7 @@
<text name="region_rating_label" value="Categoria:"/>
<text name="region_rating" value="Adulti"/>
<text name="region_owner_label" value="Proprietario:"/>
- <text name="region_owner" value="moose Van Moose"/>
+ <text name="region_owner" value="moose Van Moose nome lunghissimo moose"/>
<text name="region_group_label" value="Gruppo:"/>
<text name="region_group">
The Mighty Moose of mooseville soundvillemoose
@@ -89,6 +89,7 @@
<text name="estate_name_label" value="Proprietà immobiliare:"/>
<text name="estate_rating_label" value="Categoria:"/>
<text name="estate_owner_label" value="Proprietario:"/>
+ <text name="estate_owner" value="Test nome proprietario con nome molto lungo"/>
<text name="covenant_label" value="Regolamento:"/>
</panel>
</accordion_tab>
diff --git a/indra/newview/skins/default/xui/it/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/it/panel_preferences_advanced.xml
index 842daaa331..b628a29206 100644
--- a/indra/newview/skins/default/xui/it/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/it/panel_preferences_advanced.xml
@@ -3,35 +3,16 @@
<panel.string name="aspect_ratio_text">
[NUM]:[DEN]
</panel.string>
- <panel.string name="middle_mouse">
- Pulsante centrale del mouse
- </panel.string>
- <slider label="Angolo di visuale" name="camera_fov"/>
- <slider label="Distanza" name="camera_offset_scale"/>
- <text name="heading2">
- Posizione automatica per:
- </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"/>
- <check_box label="Visualizzami in modalità soggettiva" name="first_person_avatar_visible"/>
- <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="Movimento delle labbra dell&apos;avatar quando parla" name="enable_lip_sync"/>
- <check_box label="Chat a bolla" name="bubble_text_chat"/>
- <slider label="Opacità" name="bubble_chat_opacity"/>
- <color_swatch name="background" tool_tip="Scegli il colore delle vignette della chat"/>
<text name="UI Size:">
- Dimensioni interfaccia utente
+ Dimensioni UI:
</text>
<check_box label="Mostra errori dello script in:" name="show_script_errors"/>
<radio_group name="show_location">
<radio_item label="Chat nei dintorni" name="0"/>
<radio_item label="Finestra separata" name="1"/>
</radio_group>
- <check_box label="Attiva/disattiva la funzione parla quando premo:" name="push_to_talk_toggle_check" tool_tip="In modalità &quot;interruttore ON/OFF&quot; premi il tasto una volta per attivare o disattivare il microfono. Quando non usi questa modalità, il microfono è attivo solo se tieni premuto il tasto di comando."/>
- <line_editor label="Pulsante di comando della funzione Premi per parlare" name="modifier_combo"/>
- <button label="Imposta tasto" name="set_voice_hotkey_button"/>
- <button label="Pulsante centrale del mouse" name="set_voice_middlemouse_button" tool_tip="Reimposta sul pulsante centrale del mouse"/>
- <button label="Altri dispositivi" name="joystick_setup_button"/>
+ <check_box label="Consenti più Viewer" name="allow_multiple_viewer_check"/>
+ <check_box label="Mostra selezione griglia all&apos;accesso" name="show_grid_selection_check"/>
+ <check_box label="Mostra menu Avanzato" name="show_advanced_menu_check"/>
+ <check_box label="Mostra menu Sviluppatore" name="show_develop_menu_check"/>
</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 208dd5ed28..2834d520d1 100644
--- a/indra/newview/skins/default/xui/it/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/it/panel_preferences_chat.xml
@@ -8,44 +8,10 @@
<radio_item label="Media" name="radio2" value="1"/>
<radio_item label="Grande" name="radio3" value="2"/>
</radio_group>
- <text name="font_colors">
- Colori caratteri:
- </text>
- <color_swatch label="Tuo" name="user"/>
- <text name="text_box1">
- Io
- </text>
- <color_swatch label="Altri" name="agent"/>
- <text name="text_box2">
- Altri
- </text>
- <color_swatch label="IM" name="im"/>
- <text name="text_box3">
- IM
- </text>
- <color_swatch label="Sistema" name="system"/>
- <text name="text_box4">
- Sistema
- </text>
- <color_swatch label="Errori script" name="script_error"/>
- <text name="text_box5">
- Errori script
- </text>
- <color_swatch label="Oggetti" name="objects"/>
- <text name="text_box6">
- Oggetti
- </text>
- <color_swatch label="Proprietario" name="owner"/>
- <text name="text_box7">
- Proprietario
- </text>
- <color_swatch label="URLs" name="links"/>
- <text name="text_box9">
- URLs
- </text>
<check_box initial_value="true" label="Simula la battitura tasti quando scrivi" name="play_typing_animation"/>
<check_box label="Quando sono OFF-LINE, spediscimi gli IM in una e-mail" name="send_im_to_email"/>
<check_box label="Attiva IM in testo semplice e cronologia chat" name="plain_text_chat_history"/>
+ <check_box label="Chat a vignetta" name="bubble_text_chat"/>
<text name="show_ims_in_label">
Mostra gli IM in:
</text>
@@ -56,8 +22,17 @@
<radio_item label="Finestre separate" name="radio" value="0"/>
<radio_item label="Schede" name="radio2" value="1"/>
</radio_group>
- <check_box name="translate_chat_checkbox"/>
- <text name="translate_chb_label" >Usa la traduzione meccanica durante le chat (tecnologia Google)</text>
+ <text name="disable_toast_label">
+ Attiva popup per chat in arrivo:
+ </text>
+ <check_box label="Chat di gruppo" name="EnableGroupChatPopups" tool_tip="Seleziona per vedere una finestra popup quando arriva una chat di gruppo"/>
+ <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>
diff --git a/indra/newview/skins/default/xui/it/panel_preferences_colors.xml b/indra/newview/skins/default/xui/it/panel_preferences_colors.xml
new file mode 100644
index 0000000000..016970d9a3
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_preferences_colors.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Colori" name="colors_panel">
+ <text name="effects_color_textbox">
+ I miei effetti (raggio indicatore):
+ </text>
+ <color_swatch name="effect_color_swatch" tool_tip="Clicca per aprire il selettore dei colori"/>
+ <text name="font_colors">
+ Colori font della chat:
+ </text>
+ <text name="text_box1">
+ Io
+ </text>
+ <text name="text_box2">
+ Altri
+ </text>
+ <text name="text_box3">
+ Oggetti
+ </text>
+ <text name="text_box4">
+ Sistema
+ </text>
+ <text name="text_box5">
+ Errori
+ </text>
+ <text name="text_box10">
+ Diretto
+ </text>
+ <text name="text_box7">
+ Proprietario
+ </text>
+ <text name="text_box9">
+ URL
+ </text>
+ <text name="bubble_chat">
+ Colore sfondo etichetta nome (influenza anche Chat a vignetta):
+ </text>
+ <color_swatch name="background" tool_tip="Seleziona colore etichetta nome"/>
+ <slider label="Opacità:" name="bubble_chat_opacity" tool_tip="Seleziona opacità etichetta nome"/>
+ <text name="floater_opacity">
+ Opacità finestra:
+ </text>
+ <slider label="Attiva:" name="active"/>
+ <slider label="Disattivata:" name="inactive"/>
+</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 95c73f482d..c576b5f9d8 100644
--- a/indra/newview/skins/default/xui/it/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/it/panel_preferences_general.xml
@@ -44,16 +44,22 @@
<radio_item label="On" name="radio2" value="1"/>
<radio_item label="Mostra brevemente" name="radio3" value="2"/>
</radio_group>
- <check_box label="Mostra il mio nome" name="show_my_name_checkbox1"/>
- <check_box initial_value="true" label="Nome in piccolo" name="small_avatar_names_checkbox"/>
- <check_box label="Mostra titoli del gruppo" name="show_all_title_checkbox1"/>
- <text name="effects_color_textbox">
- I miei effetti:
+ <check_box label="Il mio nome" name="show_my_name_checkbox1"/>
+ <check_box label="Nomi utente" name="show_slids" tool_tip="Mostra il nome utente, come bobsmith123"/>
+ <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>
+ <radio_group name="inworld_typing_preference">
+ <radio_item label="Avvia chat locale" name="radio_start_chat" value="1"/>
+ <radio_item label="Influenza il movimento (per es. WASD)" name="radio_move" value="0"/>
+ </radio_group>
<text name="title_afk_text">
Pausa assenza:
</text>
- <color_swatch label="" name="effect_color_swatch" tool_tip="Clicca per aprire la tavolozza dei colori"/>
<combo_box label="Pausa assenza:" name="afk">
<combo_box.item label="2 minuti" name="item0"/>
<combo_box.item label="5 minuti" name="item1"/>
diff --git a/indra/newview/skins/default/xui/it/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/it/panel_preferences_graphics1.xml
index 67b3c61a47..1f2b97af45 100644
--- a/indra/newview/skins/default/xui/it/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/it/panel_preferences_graphics1.xml
@@ -25,9 +25,22 @@
<text name="ShadersText">
Effetti grafici:
</text>
+ <check_box initial_value="vero" label="Acqua trasparente" name="TransparentWater"/>
<check_box initial_value="true" label="Piccoli rilievi e scintillii" name="BumpShiny"/>
+ <check_box initial_value="true" label="Luci locali" name="LocalLights"/>
<check_box initial_value="true" label="Effetti grafici base" name="BasicShaders" tool_tip="Disabilitare questa opzione può evitare che qualche scheda grafica vada in crash."/>
<check_box initial_value="true" label="Effetti grafici atmosferici" name="WindLightUseAtmosShaders"/>
+ <check_box initial_value="true" label="Luci e ombre" name="UseLightShaders"/>
+ <check_box initial_value="true" label="Occlusione ambientale" name="UseSSAO"/>
+ <check_box initial_value="true" label="Profondità di campo" name="UseDoF"/>
+ <text name="shadows_label">
+ Ombre:
+ </text>
+ <combo_box name="ShadowDetail">
+ <combo_box.item label="Nessuno" name="0"/>
+ <combo_box.item label="Sole/Luna" name="1"/>
+ <combo_box.item label="Sole/Luna + Proiettori" name="2"/>
+ </combo_box>
<text name="reflection_label">
Riflessi nell’acqua:
</text>
@@ -38,6 +51,10 @@
<combo_box.item label="Tutti gli avatar e gli oggetti" name="3"/>
<combo_box.item label="Tutto" name="4"/>
</combo_box>
+ <slider label="Fisica avatar:" name="AvatarPhysicsDetail"/>
+ <text name="AvatarPhysicsDetailText">
+ Basso
+ </text>
<slider label="Distanza di disegno:" name="DrawDistance"/>
<text name="DrawDistanceMeterText2">
m
@@ -76,7 +93,7 @@
Basso
</text>
<text name="AvatarRenderingText">
- Rendering dell&apos;avatar:
+ Rendering avatar :
</text>
<check_box initial_value="true" label="Avatar bidimensionali (Impostor)" name="AvatarImpostors"/>
<check_box initial_value="true" label="Hardware Skinning" name="AvatarVertexProgram"/>
diff --git a/indra/newview/skins/default/xui/it/panel_preferences_move.xml b/indra/newview/skins/default/xui/it/panel_preferences_move.xml
new file mode 100644
index 0000000000..56d75bb3e3
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_preferences_move.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Movimento" name="move_panel">
+ <slider label="Angolo di visuale" name="camera_fov"/>
+ <slider label="Distanza" name="camera_offset_scale"/>
+ <text name="heading2">
+ Posizione automatica per:
+ </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"/>
+ <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>
+ <button label="Altri dispositivi" name="joystick_setup_button"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/it/panel_preferences_privacy.xml
index 1002195baf..41e7a59139 100644
--- a/indra/newview/skins/default/xui/it/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/it/panel_preferences_privacy.xml
@@ -7,21 +7,25 @@
<text name="cache_size_label_l">
(Luoghi, immagini, web, cronologia ricerche)
</text>
+ <check_box label="Mostrami nei risultati della ricerca" name="online_searchresults"/>
<check_box label="Solo amici e gruppi mi vedono online" name="online_visibility"/>
<check_box label="Solo amici e gruppi possono chiamarmi o mandarmi IM" name="voice_call_friends_only_check"/>
<check_box label="Spegnere il microfono alla chiusura delle chiamate" name="auto_disengage_mic_check"/>
- <check_box label="Accetta cookie" name="cookies_enabled"/>
- <check_box label="Consenti riproduzione multimediale automatica" name="autoplay_enabled"/>
+ <check_box label="Mostra i miei punti di riferimento preferiti all&apos;accesso (nel menu a discesa &apos;Inizia da&apos;)" name="favorites_on_login_check"/>
<text name="Logs:">
- Registri:
+ Registri chat:
</text>
<check_box label="Salva i registri delle conversazioni sul mio computer" name="log_nearby_chat"/>
<check_box label="Salva i registri degli IM nel mio computer" name="log_instant_messages"/>
- <check_box label="Riporta data e ora" name="show_timestamps_check_im"/>
- <line_editor left="288" name="log_path_string" right="-20"/>
+ <check_box label="Aggiungi l&apos;orario a ogni riga nel registro chat" name="show_timestamps_check_im"/>
+ <check_box label="Aggiungi la data al nome del file del registro." name="logfile_name_datestamp"/>
<text name="log_path_desc">
Ubicazione dei registri
</text>
+ <line_editor left="288" name="log_path_string" right="-20"/>
<button label="Sfoglia" label_selected="Sfoglia" name="log_path_button" width="130"/>
<button label="Lista dei bloccati" name="block_list"/>
+ <text name="block_list_label">
+ (Persone e/o Oggetti bloccati)
+ </text>
</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 29618485c2..67fa32a960 100644
--- a/indra/newview/skins/default/xui/it/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/it/panel_preferences_setup.xml
@@ -1,13 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Impostazione" name="Input panel">
- <button bottom_delta="-40" label="Altri dispositivi" name="joystick_setup_button" width="165"/>
- <text name="Mouselook:">
- Soggettiva:
- </text>
- <text name=" Mouse Sensitivity">
- Sensibilità mouse
- </text>
- <check_box label="Inverti" name="invert_mouse"/>
<text name="Network:">
Rete:
</text>
@@ -37,13 +29,21 @@
<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="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 label="Abilita plugin" name="browser_plugins_enabled"/>
- <check_box label="Accetta cookie" name="cookies_enabled"/>
- <check_box label="Abilita Javascript" name="browser_javascript_enabled"/>
- <check_box label="Abilita proxy Web" name="web_proxy_enabled"/>
+ <check_box initial_value="true" label="Abilita plugin" name="browser_plugins_enabled"/>
+ <check_box initial_value="true" label="Accetta cookie" name="cookies_enabled"/>
+ <check_box initial_value="true" label="Abilita Javascript" name="browser_javascript_enabled"/>
+ <check_box initial_value="falso" label="Consenti pop-up nel browser media" name="media_popup_enabled"/>
+ <check_box initial_value="false" label="Abilita proxy Web" name="web_proxy_enabled"/>
<text name="Proxy location">
Ubicazione proxy:
</text>
<line_editor name="web_proxy_editor" tool_tip="Il nome o l&apos;indirizzo IP del proxy che preferisci usare"/>
<spinner label="Numero porta:" name="web_proxy_port"/>
+ <text name="Software updates:">
+ Aggiornamenti software:
+ </text>
+ <combo_box name="updater_service_combobox">
+ <combo_box.item label="Installa automaticamente" name="Install_automatically"/>
+ <combo_box.item label="Scarica e installa manualmente gli aggiornamenti" name="Install_manual"/>
+ </combo_box>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_preferences_sound.xml b/indra/newview/skins/default/xui/it/panel_preferences_sound.xml
index e2332b63d0..bbfae5e9e8 100644
--- a/indra/newview/skins/default/xui/it/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/it/panel_preferences_sound.xml
@@ -1,8 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Suoni" name="Preference Media panel">
+ <panel.string name="middle_mouse">
+ Pulsante centrale del mouse
+ </panel.string>
<slider label="Vol. principale" name="System Volume"/>
<check_box initial_value="true" label="" name="mute_when_minimized"/>
- <text name="mute_chb_label">Disatt. se a icona</text>
+ <text name="mute_chb_label">
+ Disatt. audio se minimizzato
+ </text>
<slider label="Pulsanti" name="UI Volume"/>
<slider label="Ambiente" name="Wind Volume"/>
<slider label="Effetti sonori" name="SFX Volume"/>
@@ -24,6 +29,11 @@
<radio_item label="Posizione della fotocamera" name="0"/>
<radio_item label="Posizione dell&apos;avatar" name="1"/>
</radio_group>
+ <check_box label="Muovi le labbra dell&apos;avatar quando parla" name="enable_lip_sync"/>
+ <check_box label="Attiva/disattiva la funzione parla quando premo:" name="push_to_talk_toggle_check" tool_tip="In modalità &quot;interruttore ON/OFF&quot; premi il tasto una volta per attivare o disattivare il microfono. Quando non usi questa modalità, il microfono è attivo solo se tieni premuto il tasto di comando."/>
+ <line_editor label="Pulsante di comando della funzione Premi per parlare" name="modifier_combo"/>
+ <button label="Imposta tasto" name="set_voice_hotkey_button"/>
+ <button name="set_voice_middlemouse_button" tool_tip="Reimposta sul pulsante centrale del mouse"/>
<button label="Dispositivi di Input/Output" name="device_settings_btn" width="165"/>
<panel label="Impostazioni del dispositivo" name="device_settings_panel">
<panel.string name="default_text">
diff --git a/indra/newview/skins/default/xui/it/panel_profile.xml b/indra/newview/skins/default/xui/it/panel_profile.xml
index c11adeda3d..309937c5a0 100644
--- a/indra/newview/skins/default/xui/it/panel_profile.xml
+++ b/indra/newview/skins/default/xui/it/panel_profile.xml
@@ -16,6 +16,12 @@
<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">
@@ -30,7 +36,7 @@
<text name="title_acc_status_text" value="Stato account:"/>
<text name="title_partner_text" value="Partner:"/>
<panel name="partner_data_panel">
- <name_box initial_value="(recupero)" name="partner_text"/>
+ <text initial_value="(recupero)" name="partner_text"/>
</panel>
<text name="title_groups_text" value="Gruppi:"/>
</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
index cf65aabebc..409eb5d1f4 100644
--- a/indra/newview/skins/default/xui/it/panel_profile_view.xml
+++ b/indra/newview/skins/default/xui/it/panel_profile_view.xml
@@ -6,7 +6,14 @@
<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"/>
diff --git a/indra/newview/skins/default/xui/it/panel_region_general.xml b/indra/newview/skins/default/xui/it/panel_region_general.xml
index 6ca5dd878e..c550e005ae 100644
--- a/indra/newview/skins/default/xui/it/panel_region_general.xml
+++ b/indra/newview/skins/default/xui/it/panel_region_general.xml
@@ -25,6 +25,7 @@
<check_box label="Abilita la rivendita del terreno" name="allow_land_resell_check"/>
<check_box label="Abilita unione/suddivisione del terreno" name="allow_parcel_changes_check"/>
<check_box label="Proibisci che il terreno appaia nelle ricerche" name="block_parcel_search_check" tool_tip="Permetti che le persone vedano questa regione e le sue suddivisioni nei risultati delle ricerche"/>
+ <check_box label="Consenti oggetti con reticolo" name="mesh_rez_enabled_check" tool_tip="Permetti alle persone di rezzare oggetti con reticolo su questa regione"/>
<spinner label="Limite massimo di avatar" label_width="135" name="agent_limit_spin" width="190"/>
<spinner label="Bonus di oggetti" label_width="135" name="object_bonus_spin" width="190"/>
<text label="Maturità" name="access_text" width="120">
diff --git a/indra/newview/skins/default/xui/it/panel_script_ed.xml b/indra/newview/skins/default/xui/it/panel_script_ed.xml
index f550aee98e..950dfacf3a 100644
--- a/indra/newview/skins/default/xui/it/panel_script_ed.xml
+++ b/indra/newview/skins/default/xui/it/panel_script_ed.xml
@@ -15,11 +15,9 @@
<panel.string name="Title">
Script: [NAME]
</panel.string>
- <text_editor name="Script Editor">
- Caricamento in corso...
- </text_editor>
- <button label="Salva" label_selected="Salva" name="Save_btn"/>
- <combo_box label="Inserisci..." name="Insert..."/>
+ <panel.string name="external_editor_not_set">
+ Seleziona un editor impostando la variabile di ambiente LL_SCRIPT_EDITOR o l&apos;impostazione ExternalEditor.
+ </panel.string>
<menu_bar name="script_menu">
<menu label="File" name="File">
<menu_item_call label="Salva" name="Save"/>
@@ -40,4 +38,10 @@
<menu_item_call label="Aiuto con parole chiave..." name="Keyword Help..."/>
</menu>
</menu_bar>
+ <text_editor name="Script Editor">
+ Caricamento in corso...
+ </text_editor>
+ <combo_box label="Inserisci..." name="Insert..."/>
+ <button label="Salva" label_selected="Salva" name="Save_btn"/>
+ <button label="Modifica..." name="Edit_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_scrolling_param_base.xml b/indra/newview/skins/default/xui/it/panel_scrolling_param_base.xml
new file mode 100644
index 0000000000..fa659040ea
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/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/it/panel_sound_devices.xml b/indra/newview/skins/default/xui/it/panel_sound_devices.xml
new file mode 100644
index 0000000000..8e7f0c8dc5
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_sound_devices.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<panel label="Impostazioni dispositivo" name="device_settings_panel">
+ <panel.string name="default_text">
+ Predefinito
+ </panel.string>
+ <text name="Input">
+ Input
+ </text>
+ <text name="My volume label">
+ Il mio volume:
+ </text>
+ <slider_bar initial_value="1.0" name="mic_volume_slider" tool_tip="Cambia il volume utilizzando questa barra"/>
+ <text name="wait_text">
+ Attendi
+ </text>
+ <text name="Output">
+ Output
+ </text>
+</panel>
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 6b1a8aa71b..4353eb9d50 100644
--- a/indra/newview/skins/default/xui/it/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/it/panel_status_bar.xml
@@ -22,7 +22,7 @@
L$ [AMT]
</panel.string>
<panel name="balance_bg">
- <text name="balance" tool_tip="Il mio saldo" value="L$ 20"/>
+ <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$"/>
</panel>
<text name="TimeText" tool_tip="Orario attuale (Pacifico)">
diff --git a/indra/newview/skins/default/xui/it/role_actions.xml b/indra/newview/skins/default/xui/it/role_actions.xml
index e3f95f7f86..300e6cf721 100644
--- a/indra/newview/skins/default/xui/it/role_actions.xml
+++ b/indra/newview/skins/default/xui/it/role_actions.xml
@@ -1,72 +1,73 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<role_actions>
<action_set description="Queste abilità permettono di aggiungere e rimuovere membri dal gruppo e consentono ai nuovi membri di aderire al gruppo senza invito." name="Membership">
- <action description="Invita persone in questo gruppo" longdescription="Invita persone in questo gruppo usando il pulsante Invita nella sezione Ruoli &gt; scheda membri." name="member invite"/>
- <action description="Espelli membri da questo gruppo" longdescription="Espelli membri dal gruppo usando il pulsante Espelli nella sezione Ruoli &gt; scheda membri. Un proprietario può espellere chiunque tranne un altro proprietario. Se non sei un proprietario, un membro può essere espulso da un gruppo soltanto qualora abbia soltanto il ruolo Tutti, e nessun altro ruolo. Per rimuovere membri dai ruoli, devi avere l&apos;Abilità corrispondente." name="member eject"/>
- <action description="Seleziona Iscrizione libera e modifica la Quota d&apos;iscrizione" longdescription="Seleziona Iscrizione libera per permettere ai nuovi membri di aderire senza invito e modifica la quota d&apos;iscrizione nella scheda Generale." name="member options"/>
+ <action description="Invita persone in questo gruppo" longdescription="Invita persone in questo gruppo usando il pulsante Invita nella sezione Ruoli &gt; scheda membri." name="member invite" value="1"/>
+ <action description="Espelli membri da questo gruppo" longdescription="Espelli membri dal gruppo usando il pulsante Espelli nella sezione Ruoli &gt; scheda membri. Un proprietario può espellere chiunque tranne un altro proprietario. Se non sei un proprietario, un membro può essere espulso da un gruppo soltanto qualora abbia soltanto il ruolo Tutti, e nessun altro ruolo. Per rimuovere membri dai ruoli, devi avere l&apos;Abilità corrispondente." name="member eject" value="2"/>
+ <action description="Seleziona Iscrizione libera e modifica la Quota d&apos;iscrizione" longdescription="Seleziona Iscrizione libera per permettere ai nuovi membri di aderire senza invito e modifica la quota d&apos;iscrizione nella scheda Generale." name="member options" value="3"/>
</action_set>
<action_set description="Queste Abilità permettono di aggiungere, rimuovere, cambiare i ruoli del gruppo, aggiungere e rimuovere membri dai ruoli, nonché assegnare abilità ai ruoli." name="Roles">
- <action description="Creare nuovi ruoli" longdescription="Crea nuovi ruoli nella sezione Ruoli &gt; scheda ruoli." name="role create"/>
- <action description="Eliminare ruoli" longdescription="Elimina ruoli nella sezione Ruoli &gt; scheda ruoli." name="role delete"/>
- <action description="Cambia i nomi di ruoli, i titoli, le descrizioni e definisci se i membri in quel ruolo sono resi pubblici" longdescription="Cambia i nomi di ruoli, i titoli, le descrizioni e definisci se i membri in quel ruolo sono resi pubblici Viene fatto nella parte inferiore della sezione Ruoli &gt; scheda Ruoli, dopo avere selezionato un ruolo." name="role properties"/>
- <action description="Assegnare membri a ruoli del responsabile" longdescription="Assegna un ruolo a membri nella lista dei ruoli assegnati (sezione Ruoli &gt; scheda membri). Un utente con questa Abilità può aggiungere membri ad un ruolo nel quale il responsabile è già presente." name="role assign member limited"/>
- <action description="Assegnare membri a qualsiasi ruolo" longdescription="Assegna i membri a qualsiasi ruolo nell&apos;elenco dei ruoli assegnati (sezione Ruoli &gt; scheda membri). *ATTENZIONE* Ogni membro con questo Ruolo e Abilità può assegnarsi -- e assegnare ad altri membri non proprietari -- ruoli con poteri maggiori di quelli normalmente concessi, potenzialmente con poteri analoghi a quelli di proprietario. Sii sicuro della scelta prima di assegnare questa Abilità." name="role assign member"/>
- <action description="Rimuovere membri dai ruoli" longdescription="Rimuovi dai ruoli i membri nell&apos;elenco dei ruoli assegnati (sezione Ruoli &gt; scheda membri). Il proprietario non può essere rimosso." name="role remove member"/>
- <action description="Assegnare e rimuovere abilità nei ruoli" longdescription="Assegna e Rimuovi Abilità per ogni ruolo nell&apos;elenco dei ruoli assegnati (sezione Ruoli &gt; scheda Ruoli). *ATTENZIONE* Ogni membro con questo ruolo e Abilità può assegnarsi -- ed assegnare ad altri membri non proprietari -- tutte le Abilità, che potenzialmente con poteri analoghi a quelli di proprietario. Sii sicuro della scelta prima di assegnare questa Abilità." name="role change actions"/>
+ <action description="Creare nuovi ruoli" longdescription="Crea nuovi ruoli nella sezione Ruoli &gt; scheda ruoli." name="role create" value="4"/>
+ <action description="Eliminare ruoli" longdescription="Elimina ruoli nella sezione Ruoli &gt; scheda ruoli." name="role delete" value="5"/>
+ <action description="Cambia i nomi di ruoli, i titoli, le descrizioni e definisci se i membri in quel ruolo sono resi pubblici" longdescription="Cambia i nomi di ruoli, i titoli, le descrizioni e definisci se i membri in quel ruolo sono resi pubblici Viene fatto nella parte inferiore della sezione Ruoli &gt; scheda Ruoli, dopo avere selezionato un ruolo." name="role properties" value="6"/>
+ <action description="Assegnare membri a ruoli del responsabile" longdescription="Assegna un ruolo a membri nella lista dei ruoli assegnati (sezione Ruoli &gt; scheda membri). Un utente con questa Abilità può aggiungere membri ad un ruolo nel quale il responsabile è già presente." name="role assign member limited" value="7"/>
+ <action description="Assegnare membri a qualsiasi ruolo" longdescription="Assegna i membri a qualsiasi ruolo nell&apos;elenco dei ruoli assegnati (sezione Ruoli &gt; scheda membri). *ATTENZIONE* Ogni membro con questo Ruolo e Abilità può assegnarsi -- e assegnare ad altri membri non proprietari -- ruoli con poteri maggiori di quelli normalmente concessi, potenzialmente con poteri analoghi a quelli di proprietario. Sii sicuro della scelta prima di assegnare questa Abilità." name="role assign member" value="8"/>
+ <action description="Rimuovere membri dai ruoli" longdescription="Rimuovi dai ruoli i membri nell&apos;elenco dei ruoli assegnati (sezione Ruoli &gt; scheda membri). Il proprietario non può essere rimosso." name="role remove member" value="9"/>
+ <action description="Assegnare e rimuovere abilità nei ruoli" longdescription="Assegna e Rimuovi Abilità per ogni ruolo nell&apos;elenco dei ruoli assegnati (sezione Ruoli &gt; scheda Ruoli). *ATTENZIONE* Ogni membro con questo ruolo e Abilità può assegnarsi -- ed assegnare ad altri membri non proprietari -- tutte le Abilità, che potenzialmente con poteri analoghi a quelli di proprietario. Sii sicuro della scelta prima di assegnare questa Abilità." name="role change actions" value="10"/>
</action_set>
<action_set description="Queste abilità autorizzano a modificare l&apos;identità di questo gruppo, come ad esempio la modifica della visibilità pubblica, lo statuto e il logo." name="Group Identity">
- <action description="Cambiare lo statuto, il logo, e &apos;Mostra nella ricerca&apos;" longdescription="Cambia statuto, logo e &apos;Mostra nella ricerca&apos;. Viene fatto nella sezione Generale." name="group change identity"/>
+ <action description="Cambiare lo statuto, il logo, e &apos;Mostra nella ricerca&apos;" longdescription="Cambia statuto, logo e &apos;Mostra nella ricerca&apos;. Viene fatto nella sezione Generale." name="group change identity" value="11"/>
</action_set>
<action_set description="Queste Abilità comprendono il potere di intestare, modificare e vendere terreni di proprietà del gruppo. Per aprire la finestra Informazioni sul terreno, fai clic con il pulsante destro del mouse sul terreno e seleziona Informazioni sul terreno, o clicca sull&apos;icona &apos;i&apos; nella Barra di Navigazione." name="Parcel Management">
- <action description="Cessione di terreno e acquisto di terreno per il gruppo" longdescription="Intesta terreno e acquista terreno per il gruppo. Ciò viene fatto in Informazioni sul terreno &gt; scheda Generale." name="land deed"/>
- <action description="Abbandonare il terreno in favore di Governor Linden" longdescription="Abbandona il terreno in favore di Governor Linden. *ATTENZIONE* Ogni membro con questo ruolo e abilità può abbandonare il terreno di proprietà del gruppo in Informazioni sul terreno &gt; scheda Generale, restituendolo alla proprietà Linden senza effettuare una vendita. Sii sicuro della scelta prima di assegnare questa Abilità." name="land release"/>
- <action description="Informazioni su come impostare il terreno come in vendita" longdescription="Imposta le informazioni per la vendita del terreno. *ATTENZIONE* Ogni Membro con questo ruolo e abilità può vendere il terreno di proprietà del gruppo nella scheda Informazioni sul terreno &gt; scheda Generale. Pertanto sii sicuro della scelta prima di assegnare questa Abilità." name="land set sale info"/>
- <action description="Suddividere e unire lotti" longdescription="Suddividi e unisci lotti. Viene fatto cliccando con il pulsante destro del mouse sul terreno, selezionando Modifica terreno e trascinando il mouse sul terreno per creare una selezione. Per suddividere, seleziona quale parte vuoi dividere e clicca su Suddividi. Per unire, seleziona due o più lotti confinanti e clicca su Unisci." name="land divide join"/>
+ <action description="Cessione di terreno e acquisto di terreno per il gruppo" longdescription="Intesta terreno e acquista terreno per il gruppo. Ciò viene fatto in Informazioni sul terreno &gt; scheda Generale." name="land deed" value="12"/>
+ <action description="Abbandonare il terreno in favore di Governor Linden" longdescription="Abbandona il terreno in favore di Governor Linden. *ATTENZIONE* Ogni membro con questo ruolo e abilità può abbandonare il terreno di proprietà del gruppo in Informazioni sul terreno &gt; scheda Generale, restituendolo alla proprietà Linden senza effettuare una vendita. Sii sicuro della scelta prima di assegnare questa Abilità." name="land release" value="13"/>
+ <action description="Informazioni su come impostare il terreno come in vendita" longdescription="Imposta le informazioni per la vendita del terreno. *ATTENZIONE* Ogni Membro con questo ruolo e abilità può vendere il terreno di proprietà del gruppo nella scheda Informazioni sul terreno &gt; scheda Generale. Pertanto sii sicuro della scelta prima di assegnare questa Abilità." name="land set sale info" value="14"/>
+ <action description="Suddividere e unire lotti" longdescription="Suddividi e unisci lotti. Viene fatto cliccando con il pulsante destro del mouse sul terreno, selezionando Modifica terreno e trascinando il mouse sul terreno per creare una selezione. Per suddividere, seleziona quale parte vuoi dividere e clicca su Suddividi. Per unire, seleziona due o più lotti confinanti e clicca su Unisci." name="land divide join" value="15"/>
</action_set>
<action_set description="Queste abilità permettono di cambiare il nome del lotto, le impostazioni di pubblicazione, la visibilità negli elenchi e il punto di arrivo, nonché opzioni di indirizzamento del Teleport." name="Parcel Identity">
- <action description="Premi Mostra luogo nella ricerca e seleziona una categoria" longdescription="Premi Mostra luogo nella ricerca e seleziona una categoria di lotto in Informazioni sul terreno &gt; scheda Opzioni." name="land find places"/>
- <action description="Cambia il nome del lotto, la descrizione e le impostazioni di Mostra luogo nella ricerca" longdescription="Cambia il nome del lotto, la descrizione e le impostazioni di Mostra luogo nella ricerca. Ciò viene fatto in Informazioni sul terreno &gt; scheda Opzioni." name="land change identity"/>
- <action description="Impostare il punto di arrivo e l&apos;indirizzamento del Teleport" longdescription="In un lotto di proprietà di un gruppo, i membri con questo ruolo e abilità possono impostare un punto di arrivo per i teleport entranti e impostare anche l&apos;indirizzamento del teleport per ulteriore precisione. Viene fatto in Informazioni sul terreno &gt; Opzioni." name="land set landing point"/>
+ <action description="Premi Mostra luogo nella ricerca e seleziona una categoria" longdescription="Premi Mostra luogo nella ricerca e seleziona una categoria di lotto in Informazioni sul terreno &gt; scheda Opzioni." name="land find places" value="17"/>
+ <action description="Cambia il nome del lotto, la descrizione e le impostazioni di Mostra luogo nella ricerca" longdescription="Cambia il nome del lotto, la descrizione e le impostazioni di Mostra luogo nella ricerca. Ciò viene fatto in Informazioni sul terreno &gt; scheda Opzioni." name="land change identity" value="18"/>
+ <action description="Impostare il punto di arrivo e l&apos;indirizzamento del Teleport" longdescription="In un lotto di proprietà di un gruppo, i membri con questo ruolo e abilità possono impostare un punto di arrivo per i teleport entranti e impostare anche l&apos;indirizzamento del teleport per ulteriore precisione. Viene fatto in Informazioni sul terreno &gt; Opzioni." name="land set landing point" value="19"/>
</action_set>
<action_set description="Queste abilità hanno poteri relativi alle opzioni dei lotti, come la creazione di oggetti, la modifica del terreno e le impostazioni per la musica e gli elementi multimediali." name="Parcel Settings">
- <action description="Cambiare impostazioni musica e multimediali" longdescription="Cambia le impostazioni per lo streaming della musica e dei video in Informazioni sul terreno &gt; Media." name="land change media"/>
- <action description="Attiva &apos;Modifica terreno&apos;" longdescription="Attiva &apos;Modifica terreno&apos;. *ATTENZIONE* Informazioni sul terreno &gt; Opzioni &gt; Modifica terreno consente a chiunque di modificare la forma del tuo terreno e di collocare e spostare le piante Linden. Pertanto sii sicuro della scelta prima di assegnare questa Abilità. La funzione di modifica del terreno è attivata in Informazioni sul terreno &gt; Opzioni." name="land edit"/>
- <action description="Attivazione di parametri per Informazioni sul terreno &gt; Opzioni" longdescription="Premi Sicuro (nessun danno), Vola e consenti agli altri residenti di: modificare il terreno, costruire, creare punti di riferimento ed eseguire script nel terreno appartenente ad un gruppo in Informazioni sul terreno &gt; scheda Opzioni." name="land options"/>
+ <action description="Cambiare impostazioni musica e multimediali" longdescription="Cambia le impostazioni per lo streaming della musica e dei video in Informazioni sul terreno &gt; Media." name="land change media" value="20"/>
+ <action description="Attiva &apos;Modifica terreno&apos;" longdescription="Attiva &apos;Modifica terreno&apos;. *ATTENZIONE* Informazioni sul terreno &gt; Opzioni &gt; Modifica terreno consente a chiunque di modificare la forma del tuo terreno e di collocare e spostare le piante Linden. Pertanto sii sicuro della scelta prima di assegnare questa Abilità. La funzione di modifica del terreno è attivata in Informazioni sul terreno &gt; Opzioni." name="land edit" value="21"/>
+ <action description="Attivazione di parametri per Informazioni sul terreno &gt; Opzioni" longdescription="Premi Sicuro (nessun danno), Vola e consenti agli altri residenti di: modificare il terreno, costruire, creare punti di riferimento ed eseguire script nel terreno appartenente ad un gruppo in Informazioni sul terreno &gt; scheda Opzioni." name="land options" value="22"/>
</action_set>
<action_set description="Queste abilità permettono ai membri di non avere restrizioni in un lotto appartenente ad un gruppo." name="Parcel Powers">
- <action description="Consenti sempre la modifica del terreno" longdescription="I membri con questo ruolo e abilità possono modificare il terreno appartenente ad un gruppo, anche se la funzionalità è disattivata in Informazioni sul terreno &gt; Opzioni." name="land allow edit land"/>
- <action description="Consenti sempre il volo" longdescription=" I membri con questo ruolo e abilità possono volare in un terreno appartenente ad un gruppo, anche se la funzionalità è disattivata in Informazioni sul terreno &gt; Opzioni." name="land allow fly"/>
- <action description="Consenti sempre la creazione di oggetti" longdescription="I membri con questo ruolo e abilità possono creare oggetti in un lotto appartenente ad un gruppo, anche se la funzionalità è disattivata in Informazioni sul terreno &gt; Opzioni." name="land allow create"/>
- <action description="Consenti sempre la creazione di punti di riferimento" longdescription="I membri con questo ruolo e abilità possono creare punti di riferimento in un lotto appartenente ad un gruppo, anche se la funzionalità è disattivata in Informazioni sul terreno &gt; Opzioni." name="land allow landmark"/>
- <action description="Consenti la funzione &apos;Imposta come Casa mia&apos; in un lotto di gruppo" longdescription="I membri in un ruolo con questa Abilità possono usare il menu Mondo &gt; Punti di riferimento &gt; Imposta come Casa su un lotto ceduto a questo gruppo." name="land allow set home"/>
+ <action description="Consenti sempre la modifica del terreno" longdescription="I membri con questo ruolo e abilità possono modificare il terreno appartenente ad un gruppo, anche se la funzionalità è disattivata in Informazioni sul terreno &gt; Opzioni." name="land allow edit land" value="23"/>
+ <action description="Consenti sempre il volo" longdescription=" I membri con questo ruolo e abilità possono volare in un terreno appartenente ad un gruppo, anche se la funzionalità è disattivata in Informazioni sul terreno &gt; Opzioni." name="land allow fly" value="24"/>
+ <action description="Consenti sempre la creazione di oggetti" longdescription="I membri con questo ruolo e abilità possono creare oggetti in un lotto appartenente ad un gruppo, anche se la funzionalità è disattivata in Informazioni sul terreno &gt; Opzioni." name="land allow create" value="25"/>
+ <action description="Consenti sempre la creazione di punti di riferimento" longdescription="I membri con questo ruolo e abilità possono creare punti di riferimento in un lotto appartenente ad un gruppo, anche se la funzionalità è disattivata in Informazioni sul terreno &gt; Opzioni." name="land allow landmark" value="26"/>
+ <action description="Consenti la funzione &apos;Imposta come Casa mia&apos; in un lotto di gruppo" longdescription="I membri in un ruolo con questa Abilità possono usare il menu Mondo &gt; Punti di riferimento &gt; Imposta come Casa su un lotto ceduto a questo gruppo." name="land allow set home" value="28"/>
+ <action description="Consentire &apos;Ospitare un evento&apos; su lotti di gruppo" longdescription="Membri in un ruolo con questa Abilità possono selezionare lotti posseduti da un gruppo come sedi in cui ospitare un evento." name="land allow host event" value="41"/>
</action_set>
<action_set description="Queste Abilità consentono di concedere o limitare l&apos;accesso ad un lotto di un gruppo da parte di residenti, con le azioni Congela ed Espelli." name="Parcel Access">
- <action description="Gestire la lista di accesso al lotto" longdescription="Gestisci la lista di accesso al lotto in Informazioni sul terreno &gt; Accesso." name="land manage allowed"/>
- <action description="Gestire la lista dei residenti espulsi dal lotto" longdescription="Gestisci la lista Espulsi dal lotto in Informazioni sul terreno &gt; scheda Accesso." name="land manage banned"/>
- <action description="Cambia le impostazioni del lotto in Vendi pass a" longdescription="Cambia le impostazioni Vendi pass a in Informazioni sul terreno &gt; scheda Accesso." name="land manage passes"/>
- <action description="Espellere e Congelare i Residenti in un lotto" longdescription="Membri in un ruolo con questa Abilità possono occuparsi di un residente indesiderato in un lotto posseduto da un gruppo, facendo clic sul residente con il pulsante destro del mouse e selezionando Espelli o Congela." name="land admin"/>
+ <action description="Gestire la lista di accesso al lotto" longdescription="Gestisci la lista di accesso al lotto in Informazioni sul terreno &gt; Accesso." name="land manage allowed" value="29"/>
+ <action description="Gestire la lista dei residenti espulsi dal lotto" longdescription="Gestisci la lista Espulsi dal lotto in Informazioni sul terreno &gt; scheda Accesso." name="land manage banned" value="30"/>
+ <action description="Cambia le impostazioni del lotto in Vendi pass a" longdescription="Cambia le impostazioni Vendi pass a in Informazioni sul terreno &gt; scheda Accesso." name="land manage passes" value="31"/>
+ <action description="Espellere e Congelare i Residenti in un lotto" longdescription="Membri in un ruolo con questa Abilità possono occuparsi di un residente indesiderato in un lotto posseduto da un gruppo, facendo clic sul residente con il pulsante destro del mouse e selezionando Espelli o Congela." name="land admin" value="32"/>
</action_set>
<action_set description="Queste abilità consentono ai membri di restituire oggetti, collocare e spostare piante Linden. Questo è utile ai membri per ripulire da oggetti indesiderati e creare paesaggi, ma deve essere utilizzato con cura, perchè la restituzione degli oggetti non può essere annullata." name="Parcel Content">
- <action description="Restituire oggetti di proprietà di un gruppo" longdescription="Restituisci gli oggetti di proprietà di un gruppo in un appezzamento di un gruppo in Informazioni sul terreno &gt; Oggetti." name="land return group owned"/>
- <action description="Restituire oggetti assegnati ad un gruppo" longdescription="Restituisci oggetti assegnati ad un gruppo in un lotto di un gruppo in Informazioni sul terreno &gt; Oggetti." name="land return group set"/>
- <action description="Restituire oggetti estranei al gruppo" longdescription="Restituire oggetti estranei al gruppo in un appezzamento di un gruppo in Informazioni sul terreno &gt; Oggetti." name="land return non group"/>
- <action description="Creare un paesaggio utilizzando le piante Linden" longdescription="Abilità di creare paesaggi e posizionare e spostare alberi, piante, erba Linden. Questi oggetti sono presenti nella Libreria del tuo Inventario &gt; cartella Oggetti, o possono essere creati con il menu Crea." name="land gardening"/>
+ <action description="Restituire oggetti di proprietà di un gruppo" longdescription="Restituisci gli oggetti di proprietà di un gruppo in un appezzamento di un gruppo in Informazioni sul terreno &gt; Oggetti." name="land return group owned" value="48"/>
+ <action description="Restituire oggetti assegnati ad un gruppo" longdescription="Restituisci oggetti assegnati ad un gruppo in un lotto di un gruppo in Informazioni sul terreno &gt; Oggetti." name="land return group set" value="33"/>
+ <action description="Restituire oggetti estranei al gruppo" longdescription="Restituire oggetti estranei al gruppo in un appezzamento di un gruppo in Informazioni sul terreno &gt; Oggetti." name="land return non group" value="34"/>
+ <action description="Creare un paesaggio utilizzando le piante Linden" longdescription="Abilità di creare paesaggi e posizionare e spostare alberi, piante, erba Linden. Questi oggetti sono presenti nella Libreria del tuo Inventario &gt; cartella Oggetti, o possono essere creati con il menu Crea." name="land gardening" value="35"/>
</action_set>
<action_set description="Queste Abilità includono il potere di cedere, modificare e vendere oggetti posseduti dal gruppo. Viene fatto negli strumenti Costruisci &gt; scheda Generale. Clic con il pulsante destro del mouse su un oggetto e Modifica per vedere le impostazioni." name="Object Management">
- <action description="Intestare oggetti ad un gruppo" longdescription="Intesta oggetti ad un gruppo in Strumenti per costruzione &gt; scheda Generale." name="object deed"/>
- <action description="Modificare (sposta, copia, modifica) oggetti di un gruppo" longdescription="Gestisci (sposta, copia, modifica) gli oggetti appartenenti ad un gruppo in Build Tools &gt; tabella Generale." name="object manipulate"/>
- <action description="Mettere in vendita oggetti di un gruppo" longdescription="Metti in vendita oggetti posseduti da un Gruppo in Strumenti per costruzione &gt; scheda Generale." name="object set sale"/>
+ <action description="Intestare oggetti ad un gruppo" longdescription="Intesta oggetti ad un gruppo in Strumenti per costruzione &gt; scheda Generale." name="object deed" value="36"/>
+ <action description="Modificare (sposta, copia, modifica) oggetti di un gruppo" longdescription="Gestisci (sposta, copia, modifica) gli oggetti appartenenti ad un gruppo in Build Tools &gt; tabella Generale." name="object manipulate" value="38"/>
+ <action description="Mettere in vendita oggetti di un gruppo" longdescription="Metti in vendita oggetti posseduti da un Gruppo in Strumenti per costruzione &gt; scheda Generale." name="object set sale" value="39"/>
</action_set>
<action_set description="Queste abilità consentono di richiedere ai membri di pagare le passività del gruppo e di ricevere i dividendi del gruppo, nonché di limitare l&apos;accesso alla cronologia finanziaria del gruppo." name="Accounting">
- <action description="Pagare le passività del gruppo e ricevere i dividendi del gruppo" longdescription="I membri con questo ruolo e abilità pagheranno automaticamente le passività del gruppo e riceveranno i dividendi del gruppo. Questo significa che riceveranno una porzione delle vendite di terreni appartenenti al gruppo (che sono distribuite giornalmente) e contribuiranno fondi a spese come le quote di inserzione del lotto. " name="accounting accountable"/>
+ <action description="Pagare le passività del gruppo e ricevere i dividendi del gruppo" longdescription="I membri con questo ruolo e abilità pagheranno automaticamente le passività del gruppo e riceveranno i dividendi del gruppo. Questo significa che riceveranno una porzione delle vendite di terreni appartenenti al gruppo (che sono distribuite giornalmente) e contribuiranno fondi a spese come le quote di inserzione del lotto. " name="accounting accountable" value="40"/>
</action_set>
<action_set description="Queste abilità consentono ai membri di inviare, ricevere e vedere gli avvisi del gruppo." name="Notices">
- <action description="Invia avvisi" longdescription="Membri in un ruolo con questa Abilità possono inviare avvisi tramite la sezione Gruppo &gt; Avvisi." name="notices send"/>
- <action description="Ricevere avvisi e vedere avvisi precedenti" longdescription="Membri in un ruolo con questa Abilità possono ricevere avvisi e vedere avvisi precedenti nella sezione Gruppo &gt; Avvisi." name="notices receive"/>
+ <action description="Invia avvisi" longdescription="Membri in un ruolo con questa Abilità possono inviare avvisi tramite la sezione Gruppo &gt; Avvisi." name="notices send" value="42"/>
+ <action description="Ricevere avvisi e vedere avvisi precedenti" longdescription="Membri in un ruolo con questa Abilità possono ricevere avvisi e vedere avvisi precedenti nella sezione Gruppo &gt; Avvisi." name="notices receive" value="43"/>
</action_set>
<action_set description="Queste Abilità permettono di concedere o limitare l&apos;accesso alle sessioni di chat e di chat vocale nel gruppo." name="Chat">
- <action description="Partecipare alla Chat di gruppo" longdescription="I membri con questo ruolo e abilità possono partecipare alle sessioni di chat, sia scritte che vocale." name="join group chat"/>
- <action description="Partecipa alla Chat vocale di gruppo" longdescription=" I membri con questo ruolo e abilità possono partecipare alle sessioni di Chat vocale nel gruppo. NOTA: per poter partecipare alla Chat di gruppo è necessario accedere alla sessione di chat vocale." name="join voice chat"/>
- <action description="Moderare la Chat di gruppo" longdescription="I membri con questo ruolo e abilità possono gestire l&apos;accesso e la partecipazione alle sessioni di chat scritta e di chat vocale nel gruppo." name="moderate group chat"/>
+ <action description="Partecipare alla Chat di gruppo" longdescription="I membri con questo ruolo e abilità possono partecipare alle sessioni di chat, sia scritte che vocale." name="join group chat" value="16"/>
+ <action description="Partecipa alla Chat vocale di gruppo" longdescription=" I membri con questo ruolo e abilità possono partecipare alle sessioni di Chat vocale nel gruppo. NOTA: per poter partecipare alla Chat di gruppo è necessario accedere alla sessione di chat vocale." name="join voice chat" value="27"/>
+ <action description="Moderare la Chat di gruppo" longdescription="I membri con questo ruolo e abilità possono gestire l&apos;accesso e la partecipazione alle sessioni di chat scritta e di chat vocale nel gruppo." name="moderate group chat" value="37"/>
</action_set>
</role_actions>
diff --git a/indra/newview/skins/default/xui/it/strings.xml b/indra/newview/skins/default/xui/it/strings.xml
index 37dc90d056..6af515d82d 100644
--- a/indra/newview/skins/default/xui/it/strings.xml
+++ b/indra/newview/skins/default/xui/it/strings.xml
@@ -124,6 +124,139 @@
<string name="create_account_url">
http://join.secondlife.com/index.php?lang=it-IT
</string>
+ <string name="LoginFailedViewerNotPermitted">
+ Il viewer utilizzato non è più in grado di accedere a Second Life. Visita la parina seguente per scaricare un nuovo viewer:
+http://secondlife.com/download.
+
+Per maggiori informazioni, consulta le domande frequenti alla pagina seguente:
+http://secondlife.com/viewer-access-faq
+ </string>
+ <string name="LoginIntermediateOptionalUpdateAvailable">
+ Disponibile aggiornamento facoltativo viewer: [VERSION]
+ </string>
+ <string name="LoginFailedRequiredUpdate">
+ Aggernamento viewer richiesto: [VERSION]
+ </string>
+ <string name="LoginFailedAlreadyLoggedIn">
+ Questo agente ha già eseguito il login.
+ </string>
+ <string name="LoginFailedAuthenticationFailed">
+ Siamo spiacenti. Il tentativo di accesso non è riuscito.
+Verifica di avere inserito correttamente
+ * Nome utente (come robby12 o Stella Soleggiato)
+ * Password
+Verifica anche che il blocco delle maiuscole non sia attivato.
+ </string>
+ <string name="LoginFailedPasswordChanged">
+ Come misura precauzionale, la tua password è stata cambiata.
+Visita la pagina del tuo account a http://secondlife.com/password
+e rispondi alla domanda di sicurezza per reimpostare la password.
+Ci scusiamo per l&apos;inconveniente.
+ </string>
+ <string name="LoginFailedPasswordReset">
+ Abbiamo effettuato delle modifiche al sistema che richiedono di reimpostare la password.
+Visita la pagina del tuo account a http://secondlife.com/password
+e rispondi alla domanda di sicurezza per reimpostare la password.
+Ci scusiamo per l&apos;inconveniente.
+ </string>
+ <string name="LoginFailedEmployeesOnly">
+ Second Life è chiuso temporaneamente per manutenzione.
+Al momento, solo i dipendenti possono eseguire l&apos;accesso.
+Visita www.secondlife.com/status per aggiornamenti.
+ </string>
+ <string name="LoginFailedPremiumOnly">
+ L&apos;accesso a Second Life è temporaneamente limitato per garantire che chi è nel mondo virtuale abbia la migliore esperienza possibile.
+
+Le persona con account gratuiti non potrenno accedere a Second Life durante questo periodo, per lasciare spazio alle persone che hanno pagato per Second Life.
+ </string>
+ <string name="LoginFailedComputerProhibited">
+ Non si può accedere a Second Life da questo computer.
+Se ritieni che si tratta di un errore, contatta
+support@secondlife.com.
+ </string>
+ <string name="LoginFailedAcountSuspended">
+ Il tuo account non è accessibile fino alle
+[TIME] fuso orario del Pacifico.
+ </string>
+ <string name="LoginFailedAccountDisabled">
+ Non siamo attualmente in grado di completare la tua richiesta.
+Contatta l&apos;assistenza Second Life alla pagina http://secondlife.com/support.
+Se non sei in grado di cambiare la password, chiama (866) 476-9763.
+ </string>
+ <string name="LoginFailedTransformError">
+ Dati incompatibili rilevati durante l&apos;accesso.
+Contattare support@secondlife.com.
+ </string>
+ <string name="LoginFailedAccountMaintenance">
+ Il tuo account è in fase di leggera manutenzione.
+Il tuo account non è accessibile fino alle
+[TIME] fuso orario del Pacifico.
+Se ritieni che si tratta di un errore, contatta support@secondlife.com.
+ </string>
+ <string name="LoginFailedPendingLogoutFault">
+ Errore del simulatore in seguito alla richiesta di logout.
+ </string>
+ <string name="LoginFailedPendingLogout">
+ Il sistema sta eseguendo il logout in questo momento.
+Il tuo account non sarà disponibile fino alle
+[TIME] fuso orario del Pacifico.
+ </string>
+ <string name="LoginFailedUnableToCreateSession">
+ Non è possibile creare una sessione valida.
+ </string>
+ <string name="LoginFailedUnableToConnectToSimulator">
+ Non è possibile collegarsi a un simulatore.
+ </string>
+ <string name="LoginFailedRestrictedHours">
+ Il tuo account può accedere a Second Life solo
+tra le [START] e le [END] fuso orario del Pacifico.
+Torna durante quell&apos;orario.
+Se ritieni che si tratta di un errore, contatta support@secondlife.com.
+ </string>
+ <string name="LoginFailedIncorrectParameters">
+ Parametri errati.
+Se ritieni che si tratta di un errore, contatta support@secondlife.com.
+ </string>
+ <string name="LoginFailedFirstNameNotAlphanumeric">
+ Il parametro Nome deve includere solo caratteri alfanumerici.
+Se ritieni che si tratta di un errore, contatta support@secondlife.com.
+ </string>
+ <string name="LoginFailedLastNameNotAlphanumeric">
+ Il parametro Cognome deve includere solo caratteri alfanumerici.
+Se ritieni che si tratta di un errore, contatta support@secondlife.com.
+ </string>
+ <string name="LogoutFailedRegionGoingOffline">
+ La regione sta passando allo stato non in linea.
+Prova ad accedere nuovamente tra un minuto.
+ </string>
+ <string name="LogoutFailedAgentNotInRegion">
+ L&apos;agente non è nella regione.
+Prova ad accedere nuovamente tra un minuto.
+ </string>
+ <string name="LogoutFailedPendingLogin">
+ La regione ha eseguito l&apos;accesso in un&apos;altre sessione.
+Prova ad accedere nuovamente tra un minuto.
+ </string>
+ <string name="LogoutFailedLoggingOut">
+ La regione stava eseguendo il logout della sessione precedente.
+Prova ad accedere nuovamente tra un minuto.
+ </string>
+ <string name="LogoutFailedStillLoggingOut">
+ La regione sta ancora eseguendo il logout della sessione precedente.
+Prova ad accedere nuovamente tra un minuto.
+ </string>
+ <string name="LogoutSucceeded">
+ La regione ha eseguito il logout dell&apos;ultima sessione.
+Prova ad accedere nuovamente tra un minuto.
+ </string>
+ <string name="LogoutFailedLogoutBegun">
+ La regione ha iniziato la procedura di logout.
+Prova ad accedere nuovamente tra un minuto.
+ </string>
+ <string name="LoginFailedLoggingOutSession">
+ Il sistema ha iniziato il logout dell&apos;ultima sessione.
+Prova ad accedere nuovamente tra un minuto.
+ </string>
<string name="AgentLostConnection">
Questa regione sta avendo problemi. Verifica la tua connessione a Internet.
</string>
@@ -200,6 +333,9 @@
<string name="TooltipAgentUrl">
Clicca per vedere il profilo di questo residente
</string>
+ <string name="TooltipAgentInspect">
+ Ulteriori informazioni su questo Residente
+ </string>
<string name="TooltipAgentMute">
Clicca per disattivare l&apos;audio di questo residente
</string>
@@ -429,6 +565,9 @@
<string name="symbolic folder link">
link alla cartella
</string>
+ <string name="mesh">
+ reticolo
+ </string>
<string name="AvatarAway">
Assente
</string>
@@ -747,6 +886,12 @@
<string name="Estate / Full Region">
Proprietà immobiliare / Regione completa
</string>
+ <string name="Estate / Homestead">
+ Proprietà immobiliare / Homestead
+ </string>
+ <string name="Mainland / Homestead">
+ Continente / Homestead
+ </string>
<string name="Mainland / Full Region">
Continente / Regione completa
</string>
@@ -852,6 +997,9 @@
<string name="tattoo">
Tatuaggio
</string>
+ <string name="physics">
+ Fisica
+ </string>
<string name="invalid">
non valido
</string>
@@ -891,6 +1039,9 @@
<string name="tattoo_not_worn">
Tatuaggio non portato
</string>
+ <string name="physics_not_worn">
+ Fisica non indossata
+ </string>
<string name="invalid_not_worn">
non valido
</string>
@@ -939,6 +1090,9 @@
<string name="create_new_tattoo">
Crea un nuovo tatuaggio
</string>
+ <string name="create_new_physics">
+ Crea nuova fisica
+ </string>
<string name="create_new_invalid">
non valido
</string>
@@ -1037,7 +1191,7 @@
</string>
<string name="WornOnAttachmentPoint" value="(indossato su [ATTACHMENT_POINT])"/>
<string name="ActiveGesture" value="[GESLABEL] (attivo)"/>
- <string name="Chat" value="Chat :"/>
+ <string name="Chat Message" value="Chat:"/>
<string name="Sound" value="Suono :"/>
<string name="Wait" value="--- Attendi :"/>
<string name="AnimFlagStop" value="Ferma l&apos;animazione :"/>
@@ -1063,9 +1217,6 @@
<string name="InvFolder My Inventory">
Il mio inventario
</string>
- <string name="InvFolder My Favorites">
- I miei preferiti
- </string>
<string name="InvFolder Library">
Libreria
</string>
@@ -1124,10 +1275,10 @@
Gesture
</string>
<string name="InvFolder Favorite">
- Preferiti
+ I miei preferiti
</string>
<string name="InvFolder favorite">
- Preferiti
+ I miei preferiti
</string>
<string name="InvFolder Current Outfit">
Abbigliamento attuale
@@ -1141,6 +1292,9 @@
<string name="InvFolder Accessories">
Accessori
</string>
+ <string name="InvFolder Meshes">
+ Reticoli
+ </string>
<string name="InvFolder Friends">
Amici
</string>
@@ -1454,8 +1608,8 @@
<string name="Unknown">
(Sconosciuto)
</string>
- <string name="SummaryForTheWeek" value="Riassunto della settimana, partendo dal"/>
- <string name="NextStipendDay" value="Il prossimo giorno di stipendio è"/>
+ <string name="SummaryForTheWeek" value="Riassunto della settimana, partendo dal "/>
+ <string name="NextStipendDay" value=". Il prossimo giorno di stipendio è "/>
<string name="GroupIndividualShare" value="Gruppo Dividendi individuali"/>
<string name="GroupColumn" value="Gruppo"/>
<string name="Balance">
@@ -1737,11 +1891,8 @@
<string name="InvOfferGaveYou">
Ti ha offerto
</string>
- <string name="InvOfferYouDecline">
- Rifiuta
- </string>
- <string name="InvOfferFrom">
- da
+ <string name="InvOfferDecline">
+ Non hai accettato [DESC] da &lt;nolink&gt;[NAME]&lt;/nolink&gt;.
</string>
<string name="GroupMoneyTotal">
Totale
@@ -1822,12 +1973,6 @@ Tipi conosciuti .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
<string name="accel-win-shift">
Shift+
</string>
- <string name="Esc">
- Esc
- </string>
- <string name="Home">
- Home
- </string>
<string name="FileSaved">
File salvato
</string>
@@ -1945,6 +2090,9 @@ Tipi conosciuti .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
<string name="Other">
Altro
</string>
+ <string name="Rental">
+ Affitto
+ </string>
<string name="Any">
Tutti
</string>
@@ -2181,6 +2329,114 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
<string name="Bulbous Nose">
Naso bulboso
</string>
+ <string name="Breast Physics Mass">
+ Massa seno
+ </string>
+ <string name="Breast Physics Smoothing">
+ Lisciatura seno
+ </string>
+ <string name="Breast Physics Gravity">
+ Gravità seno
+ </string>
+ <string name="Breast Physics Drag">
+ Resistenza seno
+ </string>
+ <string name="Breast Physics InOut Max Effect">
+ Massimo effetto
+ </string>
+ <string name="Breast Physics InOut Spring">
+ Elasticità
+ </string>
+ <string name="Breast Physics InOut Gain">
+ Guadagno
+ </string>
+ <string name="Breast Physics InOut Damping">
+ Attenuazione
+ </string>
+ <string name="Breast Physics UpDown Max Effect">
+ Massimo effetto
+ </string>
+ <string name="Breast Physics UpDown Spring">
+ Elasticità
+ </string>
+ <string name="Breast Physics UpDown Gain">
+ Guadagno
+ </string>
+ <string name="Breast Physics UpDown Damping">
+ Attenuazione
+ </string>
+ <string name="Breast Physics LeftRight Max Effect">
+ Massimo effetto
+ </string>
+ <string name="Breast Physics LeftRight Spring">
+ Elasticità
+ </string>
+ <string name="Breast Physics LeftRight Gain">
+ Guadagno
+ </string>
+ <string name="Breast Physics LeftRight Damping">
+ Attenuazione
+ </string>
+ <string name="Belly Physics Mass">
+ Massa pancia
+ </string>
+ <string name="Belly Physics Smoothing">
+ Lisciatura pancia
+ </string>
+ <string name="Belly Physics Gravity">
+ Gravità pancia
+ </string>
+ <string name="Belly Physics Drag">
+ Resistenza pancia
+ </string>
+ <string name="Belly Physics UpDown Max Effect">
+ Massimo effetto
+ </string>
+ <string name="Belly Physics UpDown Spring">
+ Elasticità
+ </string>
+ <string name="Belly Physics UpDown Gain">
+ Guadagno
+ </string>
+ <string name="Belly Physics UpDown Damping">
+ Attenuazione
+ </string>
+ <string name="Butt Physics Mass">
+ Massa natiche
+ </string>
+ <string name="Butt Physics Smoothing">
+ Lisciatura natiche
+ </string>
+ <string name="Butt Physics Gravity">
+ Gravità natiche
+ </string>
+ <string name="Butt Physics Drag">
+ Resistenza natiche
+ </string>
+ <string name="Butt Physics UpDown Max Effect">
+ Massimo effetto
+ </string>
+ <string name="Butt Physics UpDown Spring">
+ Elasticità
+ </string>
+ <string name="Butt Physics UpDown Gain">
+ Guadagno
+ </string>
+ <string name="Butt Physics UpDown Damping">
+ Attenuazione
+ </string>
+ <string name="Butt Physics LeftRight Max Effect">
+ Massimo effetto
+ </string>
+ <string name="Butt Physics LeftRight Spring">
+ Elasticità
+ </string>
+ <string name="Butt Physics LeftRight Gain">
+ Guadagno
+ </string>
+ <string name="Butt Physics LeftRight Damping">
+ Attenuazione
+ </string>
<string name="Bushy Eyebrows">
Sopracciglia cespugliose
</string>
@@ -2190,6 +2446,9 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
<string name="Butt Size">
Grandezza del sedere
</string>
+ <string name="Butt Gravity">
+ Gravità natiche
+ </string>
<string name="bustle skirt">
Crinolina
</string>
@@ -3478,7 +3737,7 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
Sei l&apos;unico utente di questa sessione.
</string>
<string name="offline_message">
- [NAME] è offline.
+ [NAME] è offline
</string>
<string name="invite_message">
Clicca il tasto [BUTTON NAME] per accettare/connetterti a questa voice chat.
@@ -3543,10 +3802,16 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
<string name="session_initialization_timed_out_error">
Sessione di inizializzazione scaduta
</string>
+ <string name="Home position set.">
+ Posizione di base impostata.
+ </string>
<string name="voice_morphing_url">
http://secondlife.com/landing/voicemorphing
</string>
<string name="paid_you_ldollars">
+ [NAME] ti ha inviato un pagamento di L$[AMOUNT] [REASON].
+ </string>
+ <string name="paid_you_ldollars_no_reason">
[NAME] ti ha inviato un pagamento di L$[AMOUNT].
</string>
<string name="you_paid_ldollars">
@@ -3561,6 +3826,9 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
<string name="you_paid_ldollars_no_name">
Hai pagato L$ [AMOUNT] [REASON].
</string>
+ <string name="for item">
+ per [ITEM]
+ </string>
<string name="for a parcel of land">
per un lotto di terreno
</string>
@@ -3579,6 +3847,9 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
<string name="to upload">
per caricare
</string>
+ <string name="to publish a classified ad">
+ per pubblicare un annuncio
+ </string>
<string name="giving">
Contributo di L$ [AMOUNT]
</string>
@@ -3656,6 +3927,9 @@ Segnala abuso
<string name="New Tattoo">
Nuovo tatuaggio
</string>
+ <string name="New Physics">
+ Nuova fisica
+ </string>
<string name="Invalid Wearable">
Capo da indossare non valido
</string>
@@ -3855,7 +4129,7 @@ Segnala abuso
<string name="Notices">
Avvisi
</string>
- <string name="Chat">
+ <string name="Chat" value="Chat :">
Chat
</string>
<string name="DeleteItems">
@@ -3867,4 +4141,348 @@ Segnala abuso
<string name="EmptyOutfitText">
Questo vestiario non contiene alcun elemento
</string>
+ <string name="ExternalEditorNotSet">
+ Seleziona un editor usando le impostazioni ExternalEditor.
+ </string>
+ <string name="ExternalEditorNotFound">
+ L&apos;editor esterno specificato non è stato trovato.
+Prova a racchiudere il percorso dell&apos;editor in doppie virgolette.
+(per es. &quot;/percorso per il mio/editor&quot; &quot;%s&quot;)
+ </string>
+ <string name="ExternalEditorCommandParseError">
+ Errore nell&apos;elaborazione del comando dell&apos;editor esterno.
+ </string>
+ <string name="ExternalEditorFailedToRun">
+ L&apos;editor esterno non è stato avviato.
+ </string>
+ <string name="Esc">
+ Esc
+ </string>
+ <string name="Space">
+ Space
+ </string>
+ <string name="Enter">
+ 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="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">
+ Aggiungi
+ </string>
+ <string name="Subtract">
+ Sottrai
+ </string>
+ <string name="Multiply">
+ Moltiplica
+ </string>
+ <string name="Divide">
+ Dividi
+ </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">
+ Visualizzazione marcatori particelle (blu)
+ </string>
+ <string name="BeaconPhysical">
+ Visualizzazione marcatori oggetti fisici (verde)
+ </string>
+ <string name="BeaconScripted">
+ Visualizzazione marcatori oggetti scriptati (rosso)
+ </string>
+ <string name="BeaconScriptedTouch">
+ Visualizzazione marcatori oggetti scriptati con funzione tocco (rosso)
+ </string>
+ <string name="BeaconSound">
+ Visualizzazione marcatori suoni (giallo)
+ </string>
+ <string name="BeaconMedia">
+ Visualizzazione marcatori multimedia (bianco)
+ </string>
+ <string name="ParticleHiding">
+ Particelle nascoste
+ </string>
</strings>
diff --git a/indra/newview/skins/default/xui/ja/floater_about.xml b/indra/newview/skins/default/xui/ja/floater_about.xml
index 61fedede35..56708001c2 100644
--- a/indra/newview/skins/default/xui/ja/floater_about.xml
+++ b/indra/newview/skins/default/xui/ja/floater_about.xml
@@ -56,26 +56,32 @@ Qt Webkit ãƒãƒ¼ã‚¸ãƒ§ãƒ³ï¼š [QT_WEBKIT_VERSION]
<panel label="ライセンス" 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)
- 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.
-
- 無断転写ã€è¤‡è£½ã€è»¢è¼‰ã‚’ç¦ã˜ã¾ã™ã€‚ 詳細ã¯licenses.txtã‚’å‚ç…§ã—ã¦ãã ã•ã„。
+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.
- Voice chat Audio coding: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)
+Second Life ビューワã§ã¯ Havok (TM) Physics ãŒä½¿ç”¨ã•ã‚Œã¦ã„ã¾ã™ã€‚(c)Copyright 1999-2010 Havok.com Inc. (and its Licensors).無断複写・複製・転載をç¦ã˜ã¾ã™ã€‚詳細ã«ã¤ã„ã¦ã¯ www.havok.com ã‚’ã”å‚ç…§ãã ã•ã„。
+
+無断複写・複製・転載をç¦ã˜ã¾ã™ã€‚詳細ã«ã¤ã„ã¦ã¯ licenses.txt ã‚’ã”å‚ç…§ãã ã•ã„。
+
+ボイスãƒãƒ£ãƒƒãƒˆã®ã‚ªãƒ¼ãƒ‡ã‚£ã‚ªã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°ï¼š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/ja/floater_about_land.xml b/indra/newview/skins/default/xui/ja/floater_about_land.xml
index eefe71c9a5..2f578862d3 100644
--- a/indra/newview/skins/default/xui/ja/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/ja/floater_about_land.xml
@@ -349,6 +349,7 @@
<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">
@@ -363,6 +364,7 @@
<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="「Moderateã€ã‚³ãƒ³ãƒ†ãƒ³ãƒ„" name="MatureCheck" tool_tip=""/>
@@ -438,7 +440,7 @@
(エステートã«é™å®šï¼‰
</panel.string>
<panel.string name="allow_public_access">
- ãƒ‘ãƒ–ãƒªãƒƒã‚¯ã‚¢ã‚¯ã‚»ã‚¹ã‚’è¨±å¯ ï¼ˆ[MATURITY])
+ ãƒ‘ãƒ–ãƒªãƒƒã‚¯ã‚¢ã‚¯ã‚»ã‚¹ã‚’è¨±å¯ ï¼ˆ[MATURITY])(注æ„:ã“ã®ã‚ªãƒ—ションをオフã«ã™ã‚‹ã¨ç«‹å…¥ç¦æ­¢ãƒ©ã‚¤ãƒ³ãŒä½œæˆã•ã‚Œã¾ã™ï¼‰
</panel.string>
<panel.string name="estate_override">
1 ã¤ä»¥ä¸Šã®ã‚ªãƒ—ションãŒã€ä¸å‹•ç”£ãƒ¬ãƒ™ãƒ«ã§è¨­å®šã•ã‚Œã¦ã„ã¾ã™ã€‚
diff --git a/indra/newview/skins/default/xui/ja/floater_avatar_picker.xml b/indra/newview/skins/default/xui/ja/floater_avatar_picker.xml
index 7f965e490d..4bd6b4e053 100644
--- a/indra/newview/skins/default/xui/ja/floater_avatar_picker.xml
+++ b/indra/newview/skins/default/xui/ja/floater_avatar_picker.xml
@@ -24,6 +24,10 @@
åå‰ã®ä¸€éƒ¨ã‚’入力:
</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">
@@ -39,6 +43,10 @@
メートル
</text>
<button label="リスト更新" label_selected="リスト更新" name="Refresh"/>
+ <scroll_list name="NearMe">
+ <columns label="åå‰" name="name"/>
+ <columns label="ユーザーå" name="username"/>
+ </scroll_list>
</panel>
</tab_container>
<button label="OK" label_selected="OK" name="ok_btn"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_beacons.xml b/indra/newview/skins/default/xui/ja/floater_beacons.xml
index d2f4798949..a55698e3d0 100644
--- a/indra/newview/skins/default/xui/ja/floater_beacons.xml
+++ b/indra/newview/skins/default/xui/ja/floater_beacons.xml
@@ -17,5 +17,6 @@
<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/ja/floater_bumps.xml b/indra/newview/skins/default/xui/ja/floater_bumps.xml
index c7e4dd348f..fd12a9e69a 100644
--- a/indra/newview/skins/default/xui/ja/floater_bumps.xml
+++ b/indra/newview/skins/default/xui/ja/floater_bumps.xml
@@ -4,19 +4,19 @@
検出ãªã—
</floater.string>
<floater.string name="bump">
- [TIME] [NAME]ãŒã€ã‚ãªãŸã«ã¶ã¤ã‹ã‚Šã¾ã—ãŸã€‚
+ [TIME] [NAME] ãŒã‚ãªãŸã«è¡çªã—ã¾ã—ãŸ
</floater.string>
<floater.string name="llpushobject">
- [TIME] [NAME]ãŒã€ã‚¹ã‚¯ãƒªãƒ—トã§ã‚ãªãŸã‚’プッシュã—ã¾ã—ãŸã€‚
+ [TIME] [NAME] ãŒã‚¹ã‚¯ãƒªãƒ—トã§ã‚ãªãŸã‚’押ã—ã¾ã—ãŸ
</floater.string>
<floater.string name="selected_object_collide">
- [TIME] [NAME]ãŒã€ã‚ªãƒ–ジェクトをã‚ãªãŸã«å½“ã¦ã¾ã—ãŸã€‚
+ [TIME] [NAME] ãŒã‚ªãƒ–ジェクトã§ã‚ãªãŸã‚’ãŸãŸãã¾ã—ãŸ
</floater.string>
<floater.string name="scripted_object_collide">
- [TIME] [NAME]ãŒã€ã‚¹ã‚¯ãƒªãƒ—ト・オブジェクトをã‚ãªãŸã«å½“ã¦ã¾ã—ãŸã€‚
+ [TIME] [NAME] ãŒã‚¹ã‚¯ãƒªãƒ—トã®ã‚ªãƒ–ジェクトã§ã‚ãªãŸã‚’ãŸãŸãã¾ã—ãŸ
</floater.string>
<floater.string name="physical_object_collide">
- [TIME] [NAME]ãŒã€ç‰©ç†ã‚ªãƒ–ジェクトをã‚ãªãŸã«å½“ã¦ã¾ã—ãŸã€‚
+ [TIME] [NAME] ãŒç‰©ç†çš„オブジェクトã§ã‚ãªãŸã‚’ãŸãŸãã¾ã—ãŸ
</floater.string>
<floater.string name="timeStr">
[[hour,datetime,slt]:[min,datetime,slt]]
diff --git a/indra/newview/skins/default/xui/ja/floater_buy_contents.xml b/indra/newview/skins/default/xui/ja/floater_buy_contents.xml
index ed17736eb3..7e4932c78f 100644
--- a/indra/newview/skins/default/xui/ja/floater_buy_contents.xml
+++ b/indra/newview/skins/default/xui/ja/floater_buy_contents.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater min_width="340" name="floater_buy_contents" title="中身ã®è³¼å…¥" width="340">
<text name="contains_text" width="320">
- [NAME] ã®ä¸­èº«ï¼š
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; ã«å«ã¾ã‚Œã‚‹ã‚‚ã®ï¼š
</text>
<scroll_list name="item_list" width="310"/>
<text name="buy_text" width="320">
diff --git a/indra/newview/skins/default/xui/ja/floater_buy_object.xml b/indra/newview/skins/default/xui/ja/floater_buy_object.xml
index f323263699..ce269df6da 100644
--- a/indra/newview/skins/default/xui/ja/floater_buy_object.xml
+++ b/indra/newview/skins/default/xui/ja/floater_buy_object.xml
@@ -1,26 +1,29 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="contents" title="オブジェクトã®ã‚³ãƒ”ーを購入">
- <text name="contents_text">
- 中身:
- </text>
- <text name="buy_text">
- [NAME] ã‹ã‚‰ L$[AMOUNT] ã§è³¼å…¥ã—ã¾ã™ã‹ï¼Ÿ
- </text>
- <button label="å–消" label_selected="å–消" name="cancel_btn"/>
- <button label="購入" label_selected="購入" name="buy_btn"/>
- <text name="title_buy_text">
+ <floater.string name="title_buy_text">
購入
- </text>
- <string name="title_buy_copy_text">
+ </floater.string>
+ <floater.string name="title_buy_copy_text">
次ã®ã‚‚ã®ã‚’購入
- </string>
- <text name="no_copy_text">
+ </floater.string>
+ <floater.string name="no_copy_text">
(コピーä¸å¯ï¼‰
- </text>
- <text name="no_modify_text">
+ </floater.string>
+ <floater.string name="no_modify_text">
(修正ä¸å¯ï¼‰
- </text>
- <text name="no_transfer_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/ja/floater_customize.xml b/indra/newview/skins/default/xui/ja/floater_customize.xml
deleted file mode 100644
index cc0032e1ab..0000000000
--- a/indra/newview/skins/default/xui/ja/floater_customize.xml
+++ /dev/null
@@ -1,529 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater customize" title="容姿">
- <tab_container name="customize tab container">
- <text label="身体部ä½" name="body_parts_placeholder">
- 身体部ä½
- </text>
- <panel label="シェイプ" name="Shape">
- <button label="戻ã™" label_selected="戻ã™" name="Revert"/>
- <button label="身体" label_selected="身体" name="Body"/>
- <button label="é ­" label_selected="é ­" name="Head"/>
- <button label="眼" label_selected="眼" name="Eyes"/>
- <button label="耳" label_selected="耳" name="Ears"/>
- <button label="é¼»" label_selected="é¼»" name="Nose"/>
- <button label="å£" label_selected="å£" name="Mouth"/>
- <button label="ã‚ã”" label_selected="ã‚ã”" name="Chin"/>
- <button label="胴体" label_selected="胴体" name="Torso"/>
- <button label="両脚" label_selected="両脚" name="Legs"/>
- <radio_group name="sex radio">
- <radio_item label="女性" name="radio" value="0"/>
- <radio_item label="男性" name="radio2" value="1"/>
- </radio_group>
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: 修正ã§ãã¾ã›ã‚“。
- </text>
- <text name="title_loading">
- [DESC]: ロード中...
- </text>
- <text name="title_not_worn">
- [DESC]: 未装ç€ã€‚
- </text>
- <text name="path">
- [PATH] ã«æ‰€åœ¨
- </text>
- <text name="not worn instructions">
- æŒã¡ç‰©ã‹ã‚‰ã‚ãªãŸã®ã‚¢ãƒã‚¿ãƒ¼ã« 1 ã¤ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„シェイプをã¤ã‘ã¾ã™ã€‚ 代ã‚ã‚Šã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
- </text>
- <text name="no modify instructions">
- ã‚ãªãŸã¯ã“ã®æœã®ä¿®æ­£ã‚’許ã•ã‚Œã¦ã„ã¾ã›ã‚“。
- </text>
- <text name="Item Action Label">
- シェイプ:
- </text>
- <button label="æ–°ã—ã„シェイプ(体型)を作æˆ" label_selected="æ–°ã—ã„シェイプ(体型)を作æˆ" name="Create New"/>
- <button label="ä¿å­˜" label_selected="ä¿å­˜" name="Save"/>
- <button label="別åã§ä¿å­˜..." label_selected="別åã§ä¿å­˜..." name="Save As"/>
- </panel>
- <panel label="スキン" name="Skin">
- <button label="スキンã®è‰²" label_selected="スキンã®è‰²" name="Skin Color"/>
- <button label="é¡”ã®ç´°éƒ¨" label_selected="é¡”ã®ç´°éƒ¨" name="Face Detail"/>
- <button label="メイク" label_selected="メイク" name="Makeup"/>
- <button label="身体細部" label_selected="身体細部" name="Body Detail"/>
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: 修正ã§ãã¾ã›ã‚“。
- </text>
- <text name="title_loading">
- [DESC]: ロード中...
- </text>
- <text name="title_not_worn">
- [DESC]: 未装ç€ã€‚
- </text>
- <text name="path">
- [PATH] ã«æ‰€åœ¨
- </text>
- <text name="not worn instructions">
- æŒã¡ç‰©ã‹ã‚‰ã‚ãªãŸã®ã‚¢ãƒã‚¿ãƒ¼ã« 1 ã¤ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„スキンをã¤ã‘ã¾ã™ã€‚ 代ã‚ã‚Šã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
- </text>
- <text name="no modify instructions">
- ã‚ãªãŸã¯ã“ã®æœã®ä¿®æ­£ã‚’許ã•ã‚Œã¦ã„ã¾ã›ã‚“。
- </text>
- <text name="Item Action Label">
- スキン:
- </text>
- <texture_picker label="頭部ã®ã‚¿ãƒˆã‚¥ãƒ¼" name="Head Tattoos" tool_tip="写真をクリックã—ã¦é¸æŠž"/>
- <texture_picker label="上åŠèº«ã®ã‚¿ãƒˆã‚¥ãƒ¼" name="Upper Tattoos" tool_tip="写真をクリックã—ã¦é¸æŠž"/>
- <texture_picker label="下部ã®ã‚¿ãƒˆã‚¥ãƒ¼" name="Lower Tattoos" tool_tip="写真をクリックã—ã¦é¸æŠž"/>
- <button label="æ–°ã—ã„スキンを作æˆ" label_selected="æ–°ã—ã„スキンを作æˆ" name="Create New"/>
- <button label="ä¿å­˜" label_selected="ä¿å­˜" name="Save"/>
- <button label="別åã§ä¿å­˜..." label_selected="別åã§ä¿å­˜..." name="Save As"/>
- <button label="戻ã™" label_selected="戻ã™" name="Revert"/>
- </panel>
- <panel label="髪" name="Hair">
- <button label="色" label_selected="色" name="Color"/>
- <button label="スタイル" label_selected="スタイル" name="Style"/>
- <button label="眉毛" label_selected="眉毛" name="Eyebrows"/>
- <button label="é¡”" label_selected="é¡”" name="Facial"/>
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: 修正ã§ãã¾ã›ã‚“。
- </text>
- <text name="title_loading">
- [DESC]: ロード中...
- </text>
- <text name="title_not_worn">
- [DESC]: 未装ç€ã€‚
- </text>
- <text name="path">
- [PATH] ã«æ‰€åœ¨
- </text>
- <text name="not worn instructions">
- æŒã¡ç‰©ã‹ã‚‰ã‚ãªãŸã®ã‚¢ãƒã‚¿ãƒ¼ã« 1 ã¤ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„髪をã¤ã‘ã¾ã™ã€‚ 代ã‚ã‚Šã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
- </text>
- <text name="no modify instructions">
- ã‚ãªãŸã¯ã“ã®æœã®ä¿®æ­£ã‚’許ã•ã‚Œã¦ã„ã¾ã›ã‚“。
- </text>
- <text name="Item Action Label">
- 髪型:
- </text>
- <texture_picker label="テクスãƒãƒ£" name="Texture" tool_tip="写真をクリックã—ã¦é¸æŠž"/>
- <button label="æ–°ã—ã„髪を作æˆ" label_selected="æ–°ã—ã„髪を作æˆ" name="Create New"/>
- <button label="ä¿å­˜" label_selected="ä¿å­˜" name="Save"/>
- <button label="別åã§ä¿å­˜..." label_selected="別åã§ä¿å­˜..." name="Save As"/>
- <button label="戻ã™" label_selected="戻ã™" name="Revert"/>
- </panel>
- <panel label="眼" name="Eyes">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: 修正ã§ãã¾ã›ã‚“。
- </text>
- <text name="title_loading">
- [DESC]: ロード中...
- </text>
- <text name="title_not_worn">
- [DESC]: 未装ç€ã€‚
- </text>
- <text name="path">
- [PATH] ã«æ‰€åœ¨
- </text>
- <text name="not worn instructions">
- ã‚ãªãŸã®æŒã¡ç‰©ã‹ã‚‰ã‚¢ãƒã‚¿ãƒ¼ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„目をã¤ã‘ã¾ã™ã€‚ 代ã‚ã‚Šã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
- </text>
- <text name="no modify instructions">
- ã‚ãªãŸã¯ã“ã®æœã®ä¿®æ­£ã‚’許ã•ã‚Œã¦ã„ã¾ã›ã‚“。
- </text>
- <text name="Item Action Label">
- 目:
- </text>
- <texture_picker label="虹彩" name="Iris" tool_tip="写真をクリックã—ã¦é¸æŠž"/>
- <button label="æ–°ã—ã„眼を作æˆ" label_selected="æ–°ã—ã„眼を作æˆ" name="Create New"/>
- <button label="ä¿å­˜" label_selected="ä¿å­˜" name="Save"/>
- <button label="別åã§ä¿å­˜..." label_selected="別åã§ä¿å­˜..." name="Save As"/>
- <button label="戻ã™" label_selected="戻ã™" name="Revert"/>
- </panel>
- <text label="æœ" name="clothes_placeholder">
- 衣類
- </text>
- <panel label="シャツ" name="Shirt">
- <texture_picker label="生地" name="Fabric" tool_tip="写真をクリックã—ã¦é¸æŠž"/>
- <color_swatch label="色ï¼æ˜Žæš—" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
- <button label="å–り外ã™" label_selected="å–り外ã™" name="Take Off"/>
- <button label="æ–°ã—ã„シャツを作æˆ" label_selected="æ–°ã—ã„シャツを作æˆ" name="Create New"/>
- <button label="ä¿å­˜" label_selected="ä¿å­˜" name="Save"/>
- <button label="別åã§ä¿å­˜..." label_selected="別åã§ä¿å­˜..." name="Save As"/>
- <button label="戻ã™" label_selected="戻ã™" name="Revert"/>
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: 修正ã§ãã¾ã›ã‚“。
- </text>
- <text name="title_loading">
- [DESC]: ロード中...
- </text>
- <text name="title_not_worn">
- [DESC]: 未装ç€ã€‚
- </text>
- <text name="path">
- [PATH] ã«æ‰€åœ¨
- </text>
- <text name="not worn instructions">
- æŒã¡ç‰©ã‹ã‚‰ã‚ãªãŸã®ã‚¢ãƒã‚¿ãƒ¼ã« 1 ã¤ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„シャツをç€ã¾ã™ã€‚ 代ã‚ã‚Šã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
- </text>
- <text name="no modify instructions">
- ã‚ãªãŸã¯ã“ã®æœã®ä¿®æ­£ã‚’許ã•ã‚Œã¦ã„ã¾ã›ã‚“。
- </text>
- <text name="Item Action Label">
- シャツ:
- </text>
- </panel>
- <panel label="パンツ" name="Pants">
- <texture_picker label="生地" name="Fabric" tool_tip="写真をクリックã—ã¦é¸æŠž"/>
- <color_swatch label="色ï¼æ˜Žæš—" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
- <button label="å–り外ã™" label_selected="å–り外ã™" name="Take Off"/>
- <button label="æ–°ã—ã„パンツを作æˆ" label_selected="æ–°ã—ã„パンツを作æˆ" name="Create New"/>
- <button label="ä¿å­˜" label_selected="ä¿å­˜" name="Save"/>
- <button label="別åã§ä¿å­˜..." label_selected="別åã§ä¿å­˜..." name="Save As"/>
- <button label="戻ã™" label_selected="戻ã™" name="Revert"/>
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: 修正ã§ãã¾ã›ã‚“。
- </text>
- <text name="title_loading">
- [DESC]: ロード中...
- </text>
- <text name="title_not_worn">
- [DESC]: 未装ç€ã€‚
- </text>
- <text name="path">
- [PATH] ã«æ‰€åœ¨
- </text>
- <text name="not worn instructions">
- ã‚ãªãŸã®æŒã¡ç‰©ã‹ã‚‰ã‚¢ãƒã‚¿ãƒ¼ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„パンツを履ãã¾ã™ã€‚ 代ã‚ã‚Šã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
- </text>
- <text name="no modify instructions">
- ã‚ãªãŸã¯ã“ã®æœã®ä¿®æ­£ã‚’許ã•ã‚Œã¦ã„ã¾ã›ã‚“。
- </text>
- <text name="Item Action Label">
- パンツ:
- </text>
- </panel>
- <panel label="é´" name="Shoes">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: 修正ã§ãã¾ã›ã‚“。
- </text>
- <text name="title_loading">
- [DESC]: ロード中...
- </text>
- <text name="title_not_worn">
- [DESC]: 未装ç€ã€‚
- </text>
- <text name="path">
- [PATH] ã«æ‰€åœ¨
- </text>
- <text name="not worn instructions">
- ã‚ãªãŸã®æŒã¡ç‰©ã‹ã‚‰ã‚¢ãƒã‚¿ãƒ¼ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„é´ã‚’å±¥ãã¾ã™ã€‚ 代ã‚ã‚Šã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
- </text>
- <button label="æ–°ã—ã„é´ã‚’作æˆ" label_selected="æ–°ã—ã„é´ã‚’作æˆ" name="Create New"/>
- <text name="no modify instructions">
- ã‚ãªãŸã¯ã“ã®æœã®ä¿®æ­£ã‚’許ã•ã‚Œã¦ã„ã¾ã›ã‚“。
- </text>
- <text name="Item Action Label">
- é´ï¼š
- </text>
- <texture_picker label="生地" name="Fabric" tool_tip="写真をクリックã—ã¦é¸æŠž"/>
- <color_swatch label="色ï¼æ˜Žæš—" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
- <button label="å–り外ã™" label_selected="å–り外ã™" name="Take Off"/>
- <button label="ä¿å­˜" label_selected="ä¿å­˜" name="Save"/>
- <button label="別åã§ä¿å­˜..." label_selected="別åã§ä¿å­˜..." name="Save As"/>
- <button label="戻ã™" label_selected="戻ã™" name="Revert"/>
- </panel>
- <panel label="é´ä¸‹" name="Socks">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: 修正ã§ãã¾ã›ã‚“。
- </text>
- <text name="title_loading">
- [DESC]: ロード中...
- </text>
- <text name="title_not_worn">
- [DESC]: 未装ç€ã€‚
- </text>
- <text name="path">
- [PATH] ã«æ‰€åœ¨
- </text>
- <text name="not worn instructions">
- ã‚ãªãŸã®æŒã¡ç‰©ã‹ã‚‰ã‚¢ãƒã‚¿ãƒ¼ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„é´ä¸‹ã‚’å±¥ãã¾ã™ã€‚ 代ã‚ã‚Šã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
- </text>
- <button label="æ–°ã—ã„é´ä¸‹ã‚’作æˆ" label_selected="æ–°ã—ã„é´ä¸‹ã‚’作æˆ" name="Create New"/>
- <text name="no modify instructions">
- ã‚ãªãŸã¯ã“ã®æœã®ä¿®æ­£ã‚’許ã•ã‚Œã¦ã„ã¾ã›ã‚“。
- </text>
- <text name="Item Action Label">
- é´ä¸‹ï¼š
- </text>
- <texture_picker label="生地" name="Fabric" tool_tip="写真をクリックã—ã¦é¸æŠž"/>
- <color_swatch label="色ï¼æ˜Žæš—" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
- <button label="å–り外ã™" label_selected="å–り外ã™" name="Take Off"/>
- <button label="ä¿å­˜" label_selected="ä¿å­˜" name="Save"/>
- <button label="別åã§ä¿å­˜..." label_selected="別åã§ä¿å­˜..." name="Save As"/>
- <button label="戻ã™" label_selected="戻ã™" name="Revert"/>
- </panel>
- <panel label="上ç€" name="Jacket">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: 修正ã§ãã¾ã›ã‚“。
- </text>
- <text name="title_loading">
- [DESC]: ロード中...
- </text>
- <text name="title_not_worn">
- [DESC]: 未装ç€ã€‚
- </text>
- <text name="path">
- [PATH] ã«æ‰€åœ¨
- </text>
- <text name="not worn instructions">
- æŒã¡ç‰©ã‹ã‚‰ã‚ãªãŸã®ã‚¢ãƒã‚¿ãƒ¼ã« 1 ã¤ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„ジャケットをç€ã¾ã™ã€‚ 代ã‚ã‚Šã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
- </text>
- <button label="æ–°ã—ã„上ç€ã‚’作æˆ" label_selected="æ–°ã—ã„上ç€ã‚’作æˆ" name="Create New"/>
- <text name="no modify instructions">
- ã‚ãªãŸã¯ã“ã®æœã®ä¿®æ­£ã‚’許ã•ã‚Œã¦ã„ã¾ã›ã‚“。
- </text>
- <text name="Item Action Label">
- 上ç€ï¼š
- </text>
- <texture_picker label="上åŠèº«ã®ç”Ÿåœ°" name="Upper Fabric" tool_tip="写真をクリックã—ã¦é¸æŠž"/>
- <texture_picker label="下層生地" name="Lower Fabric" tool_tip="写真をクリックã—ã¦é¸æŠž"/>
- <color_swatch label="色ï¼æ˜Žæš—" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
- <button label="å–り外ã™" label_selected="å–り外ã™" name="Take Off"/>
- <button label="ä¿å­˜" label_selected="ä¿å­˜" name="Save"/>
- <button label="別åã§ä¿å­˜..." label_selected="別åã§ä¿å­˜..." name="Save As"/>
- <button label="戻ã™" label_selected="戻ã™" name="Revert"/>
- </panel>
- <panel label="手袋" name="Gloves">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: 修正ã§ãã¾ã›ã‚“。
- </text>
- <text name="title_loading">
- [DESC]: ロード中...
- </text>
- <text name="title_not_worn">
- [DESC]: 未装ç€ã€‚
- </text>
- <text name="path">
- [PATH] ã«æ‰€åœ¨
- </text>
- <text name="not worn instructions">
- ã‚ãªãŸã®æŒã¡ç‰©ã‹ã‚‰ã‚¢ãƒã‚¿ãƒ¼ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„手袋をã¤ã‘ã¾ã™ã€‚ 代ã‚ã‚Šã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
- </text>
- <button label="æ–°ã—ã„手袋を作æˆ" label_selected="æ–°ã—ã„手袋を作æˆ" name="Create New"/>
- <text name="no modify instructions">
- ã‚ãªãŸã¯ã“ã®æœã®ä¿®æ­£ã‚’許ã•ã‚Œã¦ã„ã¾ã›ã‚“。
- </text>
- <text name="Item Action Label">
- 手袋:
- </text>
- <texture_picker label="生地" name="Fabric" tool_tip="写真をクリックã—ã¦é¸æŠž"/>
- <color_swatch label="色ï¼æ˜Žæš—" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
- <button label="å–り外ã™" label_selected="å–り外ã™" name="Take Off"/>
- <button label="ä¿å­˜" label_selected="ä¿å­˜" name="Save"/>
- <button label="別åã§ä¿å­˜..." label_selected="別åã§ä¿å­˜..." name="Save As"/>
- <button label="戻ã™" label_selected="戻ã™" name="Revert"/>
- </panel>
- <panel label="下ç€ã‚·ãƒ£ãƒ„" name="Undershirt">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: 修正ã§ãã¾ã›ã‚“。
- </text>
- <text name="title_loading">
- [DESC]: ロード中...
- </text>
- <text name="title_not_worn">
- [DESC]: 未装ç€ã€‚
- </text>
- <text name="path">
- [PATH] ã«æ‰€åœ¨
- </text>
- <text name="not worn instructions">
- æŒã¡ç‰©ã‹ã‚‰ã‚ãªãŸã®ã‚¢ãƒã‚¿ãƒ¼ã«1ã¤ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„下ç€ï¼ˆä¸Šï¼‰ã‚’ç€ã¾ã™ã€‚ 代ã‚ã‚Šã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
- </text>
- <button label="æ–°ã—ã„下ç€ã‚·ãƒ£ãƒ„を作æˆ" label_selected="æ–°ã—ã„下ç€ã‚·ãƒ£ãƒ„を作æˆ" name="Create New"/>
- <text name="no modify instructions">
- ã‚ãªãŸã¯ã“ã®æœã®ä¿®æ­£ã‚’許ã•ã‚Œã¦ã„ã¾ã›ã‚“。
- </text>
- <text name="Item Action Label">
- 下ç€ã‚·ãƒ£ãƒ„:
- </text>
- <texture_picker label="生地" name="Fabric" tool_tip="写真をクリックã—ã¦é¸æŠž"/>
- <color_swatch label="色ï¼æ˜Žæš—" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
- <button label="å–り外ã™" label_selected="å–り外ã™" name="Take Off"/>
- <button label="ä¿å­˜" label_selected="ä¿å­˜" name="Save"/>
- <button label="別åã§ä¿å­˜..." label_selected="別åã§ä¿å­˜..." name="Save As"/>
- <button label="戻ã™" label_selected="戻ã™" name="Revert"/>
- </panel>
- <panel label="下ç€ãƒ‘ンツ" name="Underpants">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: 修正ã§ãã¾ã›ã‚“。
- </text>
- <text name="title_loading">
- [DESC]: ロード中...
- </text>
- <text name="title_not_worn">
- [DESC]: 未装ç€ã€‚
- </text>
- <text name="path">
- [PATH] ã«æ‰€åœ¨
- </text>
- <text name="not worn instructions">
- ã‚ãªãŸã®æŒã¡ç‰©ã‹ã‚‰ã‚¢ãƒã‚¿ãƒ¼ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„下ç€ï¼ˆä¸‹ï¼‰ã‚’å±¥ãã¾ã™ã€‚ 代ã‚ã‚Šã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
- </text>
- <button label="æ–°ã—ã„パンツを作æˆ" label_selected="æ–°ã—ã„パンツを作æˆ" name="Create New"/>
- <text name="no modify instructions">
- ã‚ãªãŸã¯ã“ã®æœã®ä¿®æ­£ã‚’許ã•ã‚Œã¦ã„ã¾ã›ã‚“。
- </text>
- <text name="Item Action Label">
- 下ç€ãƒ‘ンツ:
- </text>
- <texture_picker label="生地" name="Fabric" tool_tip="写真をクリックã—ã¦é¸æŠž"/>
- <color_swatch label="色ï¼æ˜Žæš—" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
- <button label="å–り外ã™" label_selected="å–り外ã™" name="Take Off"/>
- <button label="ä¿å­˜" label_selected="ä¿å­˜" name="Save"/>
- <button label="別åã§ä¿å­˜..." label_selected="別åã§ä¿å­˜..." name="Save As"/>
- <button label="戻ã™" label_selected="戻ã™" name="Revert"/>
- </panel>
- <panel label="スカート" name="Skirt">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: 修正ã§ãã¾ã›ã‚“。
- </text>
- <text name="title_loading">
- [DESC]: ロード中...
- </text>
- <text name="title_not_worn">
- [DESC]: 未装ç€ã€‚
- </text>
- <text name="path">
- [PATH] ã«æ‰€åœ¨
- </text>
- <text name="not worn instructions">
- æŒã¡ç‰©ã‹ã‚‰ã‚ãªãŸã®ã‚¢ãƒã‚¿ãƒ¼ã« 1 ã¤ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„スカートを履ãã¾ã™ã€‚ 代ã‚ã‚Šã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
- </text>
- <button label="スカートを作æˆ" label_selected="スカートを作æˆ" name="Create New"/>
- <text name="no modify instructions">
- ã‚ãªãŸã¯ã“ã®æœã®ä¿®æ­£ã‚’許ã•ã‚Œã¦ã„ã¾ã›ã‚“。
- </text>
- <text name="Item Action Label">
- スカート:
- </text>
- <texture_picker label="生地" name="Fabric" tool_tip="写真をクリックã—ã¦é¸æŠž"/>
- <color_swatch label="色ï¼æ˜Žæš—" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
- <button label="å–り外ã™" label_selected="å–り外ã™" name="Take Off"/>
- <button label="ä¿å­˜" label_selected="ä¿å­˜" name="Save"/>
- <button label="別åã§ä¿å­˜..." label_selected="別åã§ä¿å­˜..." name="Save As"/>
- <button label="戻ã™" label_selected="戻ã™" name="Revert"/>
- </panel>
- <panel label="タトゥ" name="Tattoo">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: 修正ä¸å¯
- </text>
- <text name="title_loading">
- [DESC]: ローディング...
- </text>
- <text name="title_not_worn">
- [DESC]: 未ç€ç”¨
- </text>
- <text name="path">
- å‚ç…§ [PATH]
- </text>
- <text name="not worn instructions">
- ã‚ãªãŸã®æŒã¡ç‰©ã‹ã‚‰ã‚¢ãƒã‚¿ãƒ¼ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„タトゥをã¤ã‘ã¾ã™ã€‚ 代ã‚ã‚Šã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
- </text>
- <button label="æ–°ã—ã„タトゥを作æˆ" label_selected="æ–°ã—ã„タトゥを作æˆ" name="Create New"/>
- <text name="no modify instructions">
- ã“ã®ç€ç”¨ç‰©ã‚’修正ã™ã‚‹æ¨©é™ãŒã‚ã‚Šã¾ã›ã‚“。
- </text>
- <text name="Item Action Label">
- タトゥ:
- </text>
- <texture_picker label="頭部ã®ã‚¿ãƒˆã‚¥ãƒ¼" name="Head Tattoo" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
- <texture_picker label="上部ã®ã‚¿ãƒˆã‚¥ãƒ¼" name="Upper Tattoo" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
- <texture_picker label="下部ã®ã‚¿ãƒˆã‚¥ãƒ¼" name="Lower Tattoo" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
- <button label="å–り外ã™" label_selected="å–り外ã™" name="Take Off"/>
- <button label="ä¿å­˜" label_selected="ä¿å­˜" name="Save"/>
- <button label="別åã§ä¿å­˜..." label_selected="別åã§ä¿å­˜..." name="Save As"/>
- <button label="å…ƒã«æˆ»ã™" label_selected="å…ƒã«æˆ»ã™" name="Revert"/>
- </panel>
- <panel label="アルファ" name="Alpha">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: 修正ä¸å¯
- </text>
- <text name="title_loading">
- [DESC]: ローディング...
- </text>
- <text name="title_not_worn">
- [DESC]: 未ç€ç”¨
- </text>
- <text name="path">
- å‚ç…§ [PATH]
- </text>
- <text name="not worn instructions">
- ã‚ãªãŸã®æŒã¡ç‰©ã‹ã‚‰ã‚¢ãƒã‚¿ãƒ¼ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„アルファマスクをã¤ã‘ã¾ã™ã€‚ 代ã‚ã‚Šã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
- </text>
- <button label="æ–°ã—ã„アルファを作æˆ" label_selected="æ–°ã—ã„アルファを作æˆ" name="Create New"/>
- <text name="no modify instructions">
- ã“ã®ç€ç”¨ç‰©ã‚’修正ã™ã‚‹æ¨©é™ãŒã‚ã‚Šã¾ã›ã‚“。
- </text>
- <text name="Item Action Label">
- アルファ:
- </text>
- <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="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
- <button label="å–り外ã™" label_selected="å–り外ã™" name="Take Off"/>
- <button label="ä¿å­˜" label_selected="ä¿å­˜" name="Save"/>
- <button label="別åã§ä¿å­˜..." label_selected="別åã§ä¿å­˜..." name="Save As"/>
- <button label="å…ƒã«æˆ»ã™" label_selected="å…ƒã«æˆ»ã™" name="Revert"/>
- </panel>
- </tab_container>
- <button label="スクリプト情報" label_selected="スクリプト情報" name="script_info" tool_tip="ã‚ãªãŸã®ã‚¢ãƒã‚¿ãƒ¼ã«ä»˜ã„ã¦ã„るスクリプトを表示ã—ã¾ã™"/>
- <button label="アウトフィット作æˆ" label_selected="アウトフィット作æˆ" name="make_outfit_btn"/>
- <button label="キャンセル" label_selected="キャンセル" name="Cancel"/>
- <button label="OK" label_selected="OK" name="Ok"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/ja/floater_day_cycle_options.xml
deleted file mode 100644
index b0949cd4e0..0000000000
--- a/indra/newview/skins/default/xui/ja/floater_day_cycle_options.xml
+++ /dev/null
@@ -1,94 +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">
- <button label="?" name="WLDayCycleHelp"/>
- <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>
- <button label="キーã®è¿½åŠ " label_selected="キーã®è¿½åŠ " name="WLAddKey"/>
- <button label="キーã®å‰Šé™¤" label_selected="キーã®å‰Šé™¤" name="WLDeleteKey"/>
- <text name="WLCurKeyFrameText">
- キーフレームã®è¨­å®šï¼š
- </text>
- <text name="WLCurKeyTimeText">
- キータイム:
- </text>
- <spinner label="時間" name="WLCurKeyHour"/>
- <spinner label="分" name="WLCurKeyMin"/>
- <text name="WLCurKeyTimeText2">
- キーã®äº‹å‰è¨­å®šï¼š
- </text>
- <combo_box label="事å‰è¨­å®š" name="WLKeyPresets"/>
- <text name="DayCycleText">
- スナップ:
- </text>
- <combo_box label="5 分" name="WLSnapOptions"/>
- <text name="DayCycleText2">
- サイクルã®é•·ã•ï¼š
- </text>
- <spinner label="時間" name="WLLengthOfDayHour"/>
- <spinner label="分" name="WLLengthOfDayMin"/>
- <spinner label="秒" name="WLLengthOfDaySec"/>
- <text name="DayCycleText3">
- プレビュー:
- </text>
- <button label="å†ç”Ÿ" label_selected="å†ç”Ÿ" name="WLAnimSky"/>
- <button label="åœæ­¢" label_selected="åœæ­¢" name="WLStopAnimSky"/>
- <button label="ä¸å‹•ç”£ã®æ™‚刻を使用" label_selected="ä¸å‹•ç”£ã®æ™‚刻ã«å¤‰æ›´" name="WLUseLindenTime"/>
- <button label="デイテストをä¿å­˜" label_selected="デイテストをä¿å­˜" name="WLSaveDayCycle"/>
- <button label="デイテストをロード" label_selected="デイテストをロード" name="WLLoadDayCycle"/>
- </panel>
- </tab_container>
-</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_display_name.xml b/indra/newview/skins/default/xui/ja/floater_display_name.xml
new file mode 100644
index 0000000000..cc71b1cd9f
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/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/ja/floater_env_settings.xml b/indra/newview/skins/default/xui/ja/floater_env_settings.xml
deleted file mode 100644
index 1d5f26a6eb..0000000000
--- a/indra/newview/skins/default/xui/ja/floater_env_settings.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Environment Editor Floater" title="自然環境エディター">
- <floater.string name="timeStr">
- [hour12,datetime,utc]:[min,datetime,utc] [ampm,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/ja/floater_event.xml b/indra/newview/skins/default/xui/ja/floater_event.xml
index 9e99c4a931..ca50ba8ef8 100644
--- a/indra/newview/skins/default/xui/ja/floater_event.xml
+++ b/indra/newview/skins/default/xui/ja/floater_event.xml
@@ -1,40 +1,11 @@
-<?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">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater can_resize="true" follows="all" height="400" 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">
ローディング...
</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.string name="done_text">
+ 完了
+ </floater.string>
+ <web_browser follows="left|right|top|bottom" height="365" layout="topleft" left="10" name="browser" top="0" trusted_content="true" width="580"/>
+ <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/ja/floater_hardware_settings.xml b/indra/newview/skins/default/xui/ja/floater_hardware_settings.xml
index c5a2800e0e..ffafbaf3b6 100644
--- a/indra/newview/skins/default/xui/ja/floater_hardware_settings.xml
+++ b/indra/newview/skins/default/xui/ja/floater_hardware_settings.xml
@@ -14,6 +14,9 @@
<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 ã§ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã€ä½Žã„ã»ã©æ˜Žã‚‹ã„)
diff --git a/indra/newview/skins/default/xui/ja/floater_import_collada.xml b/indra/newview/skins/default/xui/ja/floater_import_collada.xml
new file mode 100644
index 0000000000..65edafb169
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/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="OK" 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/ja/floater_incoming_call.xml b/indra/newview/skins/default/xui/ja/floater_incoming_call.xml
index 8e5177d6fe..f152fcd738 100644
--- a/indra/newview/skins/default/xui/ja/floater_incoming_call.xml
+++ b/indra/newview/skins/default/xui/ja/floater_incoming_call.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="incoming call" title="ä¸æ˜Žã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‹ã‚‰ã®ã‚³ãƒ¼ãƒ«">
+<floater name="incoming call" title="ç€ä¿¡">
<floater.string name="lifetime">
5
</floater.string>
diff --git a/indra/newview/skins/default/xui/ja/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/ja/floater_inventory_view_finder.xml
index 47a63e5e20..47d57da031 100644
--- a/indra/newview/skins/default/xui/ja/floater_inventory_view_finder.xml
+++ b/indra/newview/skins/default/xui/ja/floater_inventory_view_finder.xml
@@ -5,6 +5,7 @@
<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"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_map.xml b/indra/newview/skins/default/xui/ja/floater_map.xml
index 82b49df221..ff5a25fd7b 100644
--- a/indra/newview/skins/default/xui/ja/floater_map.xml
+++ b/indra/newview/skins/default/xui/ja/floater_map.xml
@@ -1,32 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Map" title="">
- <floater.string name="mini_map_north">
- 北
- </floater.string>
- <floater.string name="mini_map_east">
- æ±
- </floater.string>
- <floater.string name="mini_map_west">
- 西
- </floater.string>
- <floater.string name="mini_map_south">
- å—
- </floater.string>
- <floater.string name="mini_map_southeast">
- å—æ±
- </floater.string>
- <floater.string name="mini_map_northeast">
- 北æ±
- </floater.string>
- <floater.string name="mini_map_southwest">
- å—西
- </floater.string>
- <floater.string name="mini_map_northwest">
- 北西
- </floater.string>
<floater.string name="ToolTipMsg">
[REGION](ダブルクリックã§åœ°å›³ã‚’é–‹ã。Shiftâ€ãƒ‰ãƒ©ãƒƒã‚°ã§æ°´å¹³ãƒ»åž‚直移動)
</floater.string>
+ <floater.string name="AltToolTipMsg">
+ [地域](ダブルクリックã§ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã€‚Shiftâ€ãƒ‰ãƒ©ãƒƒã‚°ã§æ°´å¹³ãƒ»åž‚直移動)
+ </floater.string>
<floater.string name="mini_map_caption">
ミニマップ
</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
new file mode 100644
index 0000000000..5eb141a28c
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_model_preview.xml
@@ -0,0 +1,231 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Model Preview" title="モデルをアップロード">
+ <string name="status_idle">
+ 待機状態
+ </string>
+ <string name="status_reading_file">
+ ローディング...
+ </string>
+ <string name="status_generating_meshes">
+ メッシュを作æˆä¸­
+ </string>
+ <string name="status_vertex_number_overflow">
+ エラー:頂点ã®æ•°ãŒ65534を超éŽã—ãŸã®ã§ä¸­æ­¢ã•ã‚Œã¾ã—ãŸã€‚
+ </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>
+ <string name="decomposing">
+ 分æžä¸­
+ </string>
+ <string name="simplifying">
+ å˜ç´”化
+ </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>
+ <panel>
+ <text name="streaming cost">
+ リソース料金: [COST]
+ </text>
+ <text name="physics cost">
+ 物ç†åŠ¹æžœæ–™é‡‘: [COST]
+ </text>
+ <text name="upload fee">
+ アップロード手数料:該当ãªã—
+ </text>
+ </panel>
+ <text name="status">
+ [STATUS]
+ </text>
+ <button label="デフォルト" name="reset_btn" tool_tip="デフォルトã«ãƒªã‚»ãƒƒãƒˆ"/>
+ <button label="アップロード" name="ok_btn" tool_tip="シミュレーターã«ã‚¢ãƒƒãƒ—ロード"/>
+ <button label="å–り消ã—" name="cancel_btn"/>
+ <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">
+ 境界線モード:
+ </text>
+ <text name="share_tolderance_text">
+ 共有誤差:
+ </text>
+ <combo_box name="border_mode">
+ <combo_item name="border_unlock">
+ ロック解除
+ </combo_item>
+ <combo_item name="border_lock">
+ ロック
+ </combo_item>
+ </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"/>
+ </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>
+ <panel name="physics info">
+ <slider label="プレビュースプレッド:" name="physics_explode"/>
+ <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">
+ <spinner name="import_scale" value="1.0"/>
+ <text name="import_dimensions">
+ [X] x [Y] x [Z] m
+ </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>
+</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
new file mode 100644
index 0000000000..a785172f20
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_model_wizard.xml
@@ -0,0 +1,241 @@
+<?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="physics2_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>
+ <text name="description">
+ ã“ã®ã‚¦ã‚£ã‚¶ãƒ¼ãƒ‰ã‚’使ã†ã¨ã€ãƒ¡ãƒƒã‚·ãƒ¥ãƒ¢ãƒ‡ãƒ«ã‚’ç°¡å˜ã«Second Lifeã«ã‚¤ãƒ³ãƒãƒ¼ãƒˆã§ãã¾ã™ã€‚ã¾ãšã€ã‚¤ãƒ³ãƒãƒ¼ãƒˆã™ã‚‹ãƒ¢ãƒ‡ãƒ«ã‚’å«ã‚€ãƒ•ã‚¡ã‚¤ãƒ«ã‚’指定ã—ã¾ã™ã€‚Second Life 㯠COLLADA (.dae) ファイルをサãƒãƒ¼ãƒˆã—ã¾ã™ã€‚
+ </text>
+ <panel name="content">
+ <text name="Cache location">
+ ファイルå:
+ </text>
+ <button label="å‚ç…§" label_selected="å‚ç…§" name="browse"/>
+ <text name="dimensions">
+ X: Y: Z:
+ </text>
+ <text name="dimension_dividers">
+ | |
+ </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">
+ <text name="lod_label">
+ モデルã®ãƒ—レビュー:
+ </text>
+ <combo_box name="preview_lod_combo2" 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="streaming cost">
+ リソース料金: [COST]
+ </text>
+ <text name="dimensions">
+ X: Y: Z:
+ </text>
+ <text name="dimension_dividers">
+ | |
+ </text>
+ </panel>
+ </panel>
+ <panel name="physics_panel">
+ <panel name="header_panel">
+ <text name="header_text">
+ 物ç†åŠ¹æžœ
+ </text>
+ </panel>
+ <text name="description">
+ ウィザードãŒä½œæˆã™ã‚‹å®Ÿåƒã«ã‚ˆã£ã¦ã€ã‚ªãƒ–ジェクトãŒä»–ã®ã‚ªãƒ–ジェクトやアãƒã‚¿ãƒ¼ã¨ã©ã®ã‚ˆã†ã«ã‚¤ãƒ³ã‚¿ãƒ©ã‚¯ã‚·ãƒ§ãƒ³ã™ã‚‹ã‹ãŒæ±ºã¾ã‚Šã¾ã™ã€‚オブジェクトã®ç”¨é€”ã«æœ€é©ãªæ画詳細度ã«ã‚¹ãƒ©ã‚¤ãƒ€ãƒ¼ã‚’設定ã—ã¦ãã ã•ã„:
+ </text>
+ <panel name="content">
+ <text name="streaming cost">
+ リソース料金: [COST]
+ </text>
+ </panel>
+ </panel>
+ <panel name="physics2_panel">
+ <panel name="header_panel">
+ <text name="header_text">
+ 物ç†åŠ¹æžœ
+ </text>
+ </panel>
+ <text name="description">
+ 下ã®å®Ÿåƒã‚’プレビューã—ã€ã€Œæ¬¡ã¸ã€ã‚’クリックã—ã¦ç¶šã‘ã¾ã™ã€‚実åƒã‚’修正ã™ã‚‹ã«ã¯ã€Œæˆ»ã‚‹ã€ãƒœã‚¿ãƒ³ã‚’クリックã—ã¾ã™ã€‚
+ </text>
+ <panel name="content">
+ <text name="lod_label">
+ モデルã®ãƒ—レビュー:
+ </text>
+ <combo_box name="preview_lod_combo3" 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="dimensions">
+ X: Y: Z:
+ </text>
+ <text name="dimension_dividers">
+ | |
+ </text>
+ <text name="streaming cost">
+ リソース料金: [COST]
+ </text>
+ </panel>
+ </panel>
+ <panel name="review_panel">
+ <panel name="header_panel">
+ <text name="header_text">
+ 確èª
+ </text>
+ </panel>
+ <text name="description">
+ 以下ã®è©³ç´°ã‚’確èªã—ã¦ã‹ã‚‰ã€ã€Œã‚¢ãƒƒãƒ—ロードã€ã‚’クリックã™ã‚‹ã¨ãƒ¢ãƒ‡ãƒ«ãŒã‚¢ãƒƒãƒ—ロードã•ã‚Œã¾ã™ã€‚「アップロードã€ã‚’クリックã—ãŸéš›ã«ã€æ–™é‡‘ãŒã‚ãªãŸã® L$ 残高ã‹ã‚‰å·®ã—引ã‹ã‚Œã¾ã™ã€‚
+ </text>
+ <panel name="content">
+ <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="dimensions">
+ X: Y: Z:
+ </text>
+ <text name="dimension_dividers">
+ | |
+ </text>
+ </panel>
+ <text name="streaming cost">
+ リソース料金: [COST]
+ </text>
+ <text name="physics cost">
+ 物ç†åŠ¹æžœæ–™é‡‘: [COST]
+ </text>
+ </panel>
+ <panel name="upload_panel">
+ <panel name="header_panel">
+ <text name="header_text">
+ アップロード完了ï¼
+ </text>
+ </panel>
+ <text name="description">
+ ãŠã‚ã§ã¨ã†ã”ã–ã„ã¾ã™ï¼ãƒ¢ãƒ‡ãƒ«ãŒã‚¢ãƒƒãƒ—ロードã•ã‚Œã¾ã—ãŸã€‚アップロードã•ã‚ŒãŸãƒ¢ãƒ‡ãƒ«ã¯ã€æŒã¡ç‰©ã®ã€Œã‚ªãƒ–ジェクトã€ãƒ•ã‚©ãƒ«ãƒ€ã«ã‚ã‚Šã¾ã™ã€‚
+ </text>
+ </panel>
+ <button label="&lt;&lt; 戻る" name="back"/>
+ <button label="次ã¸&gt;&gt;" name="next"/>
+ <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_reading_file">
+ ローディング...
+ </string>
+ <string name="status_generating_meshes">
+ メッシュを作æˆä¸­
+ </string>
+ <string name="status_vertex_number_overflow">
+ エラー:頂点ã®æ•°ãŒ65534を超éŽã—ãŸã®ã§ä¸­æ­¢ã•ã‚Œã¾ã—ãŸã€‚
+ </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/ja/floater_pay.xml b/indra/newview/skins/default/xui/ja/floater_pay.xml
index 83a3c641f9..17965fb60a 100644
--- a/indra/newview/skins/default/xui/ja/floater_pay.xml
+++ b/indra/newview/skins/default/xui/ja/floater_pay.xml
@@ -11,7 +11,7 @@
</text>
<icon name="icon_person" tool_tip="ä½äºº"/>
<text name="payee_name">
- Test Name That Is Extremely Long To Check Clipping
+ éžå¸¸ã«é•·ã„åå‰ãŒé€”中ã§åˆ‡ã‚Œã¦ã„ãªã„ã‹ã‚’テストã—ã¦ç¢ºèª
</text>
<button label="L$1" label_selected="L$1" name="fastpay 1"/>
<button label="L$5" label_selected="L$5" name="fastpay 5"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_preferences.xml b/indra/newview/skins/default/xui/ja/floater_preferences.xml
index 6ba27b71a6..d48a8241ec 100644
--- a/indra/newview/skins/default/xui/ja/floater_preferences.xml
+++ b/indra/newview/skins/default/xui/ja/floater_preferences.xml
@@ -5,10 +5,12 @@
<tab_container name="pref core">
<panel label="一般" name="general"/>
<panel label="グラフィック" name="display"/>
- <panel label="プライãƒã‚·ãƒ¼" name="im"/>
<panel label="サウンドã¨ãƒ¡ãƒ‡ã‚£ã‚¢" name="audio"/>
<panel label="ãƒãƒ£ãƒƒãƒˆ" name="chat"/>
+ <panel label="移動 &amp; 表示" name="move"/>
<panel label="メッセージ" name="msgs"/>
+ <panel label="色" name="colors"/>
+ <panel label="プライãƒã‚·ãƒ¼" name="im"/>
<panel label="セットアップ" name="input"/>
<panel label="詳細" name="advanced1"/>
</tab_container>
diff --git a/indra/newview/skins/default/xui/ja/floater_price_for_listing.xml b/indra/newview/skins/default/xui/ja/floater_price_for_listing.xml
new file mode 100644
index 0000000000..10a46247a7
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/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">
+ ã‚ãªãŸã®ã‚¯ãƒ©ã‚·ãƒ•ã‚¡ã‚¤ãƒ‰åºƒå‘Šã¯ã€å…¬é–‹ã•ã‚ŒãŸæ—¥ã‹ã‚‰1週間有効ã§ã™ã€‚
+
+クラシファイドリストã®ã‚ãªãŸã®åºƒå‘Šã®ä½ç½®ã¯ã€åºƒå‘Šè²»ã‚’ã„ãら支払ã†ã‹ã§æ±ºã¾ã‚Šã¾ã™ã€‚
+
+最高金é¡ã‚’支払ã£ãŸåºƒå‘ŠãŒãƒªã‚¹ãƒˆã®ãƒˆãƒƒãƒ—ã«è¼‰ã‚Šã€æ¤œç´¢ã§ä¸Šä½ã«è¡¨ç¤ºã•ã‚Œã¾ã™ã€‚
+ </text>
+ <text name="price_text">
+ 広告費:
+ </text>
+ <text name="price_symbol">
+ L$
+ </text>
+ <button label="OK" name="set_price_btn"/>
+ <button label="å–り消ã—" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_region_debug_console.xml b/indra/newview/skins/default/xui/ja/floater_region_debug_console.xml
new file mode 100644
index 0000000000..4edb4972e4
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/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/ja/floater_sell_land.xml b/indra/newview/skins/default/xui/ja/floater_sell_land.xml
index 1e884af5f2..aa368eef11 100644
--- a/indra/newview/skins/default/xui/ja/floater_sell_land.xml
+++ b/indra/newview/skins/default/xui/ja/floater_sell_land.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater height="496" min_height="496" name="sell land" title="土地ã®è²©å£²">
+<floater name="sell land" title="土地ã®è²©å£²">
<scroll_container name="profile_scroll">
<panel name="scroll_content_panel">
<text name="info_parcel_label">
@@ -14,7 +14,7 @@
<text name="info_size">
[AREA] 平方メートル
</text>
- <text bottom_delta="-57" name="info_action">
+ <text name="info_action">
ã“ã®åŒºç”»ã‚’販売:
</text>
<text name="price_label">
@@ -29,13 +29,13 @@
<line_editor name="price">
0
</line_editor>
- <text left_delta="106" name="price_per_m" width="230">
+ <text name="price_per_m">
(1平方メートルã‚ãŸã‚Š L$[PER_METER])
</text>
<text name="sell_to_label">
2. 特定ã®äººã«è²©å£²ï¼š
</text>
- <text name="sell_to_text" right="-6">
+ <text name="sell_to_text">
販売先ã®æŒ‡å®šãªã—ã‹ã€ç‰¹å®šã®äººã«è²©å£²ã™ã‚‹ã‹ã‚’é¸æŠžã—ã¦ãã ã•ã„。
</text>
<combo_box name="sell_to">
@@ -50,15 +50,15 @@
<text name="sell_objects_text">
区画上ã«ã‚ã‚‹ã€åœŸåœ°æ‰€æœ‰è€…ã®è­²æ¸¡å¯èƒ½ãªã‚ªãƒ–ジェクトã¯ã€æ‰€æœ‰æ¨©ãŒå¤‰æ›´ã•ã‚Œã¾ã™ã€‚
</text>
- <radio_group bottom_delta="-76" height="72" name="sell_objects">
+ <radio_group name="sell_objects">
<radio_item label="ã„ã„ãˆã€ã‚ªãƒ–ジェクトã®æ‰€æœ‰æ¨©ã‚’ä¿æŒã—ã¾ã™" name="no"/>
- <radio_item bottom="-56" label="ã¯ã„ã€ã‚ªãƒ–ジェクトã¨åœŸåœ°ã‚’一緒ã«è²©å£²ã—ã¾ã™" name="yes"/>
+ <radio_item label="ã¯ã„ã€ã‚ªãƒ–ジェクトã¨åœŸåœ°ã‚’一緒ã«è²©å£²ã—ã¾ã™" name="yes"/>
</radio_group>
- <button label="オブジェクトを表示" name="show_objects" width="138"/>
+ <button label="オブジェクトを表示" name="show_objects"/>
<text name="nag_message_label">
注æ„: è¿”å“・交æ›ã¯ã§ãã¾ã›ã‚“。
</text>
- <button bottom="-489" label="土地を販売" name="sell_btn"/>
+ <button label="土地を販売" name="sell_btn"/>
<button label="キャンセル" name="cancel_btn"/>
</panel>
</scroll_container>
diff --git a/indra/newview/skins/default/xui/ja/floater_sound_devices.xml b/indra/newview/skins/default/xui/ja/floater_sound_devices.xml
new file mode 100644
index 0000000000..28d2388bed
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/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/ja/floater_tools.xml b/indra/newview/skins/default/xui/ja/floater_tools.xml
index 2272234d7a..f7d77d351e 100644
--- a/indra/newview/skins/default/xui/ja/floater_tools.xml
+++ b/indra/newview/skins/default/xui/ja/floater_tools.xml
@@ -64,16 +64,18 @@
<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 name="RenderingCost" tool_tip="ã“ã®ã‚ªãƒ–ジェクトã«ã‹ã‹ã‚‹ãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°ã‚³ã‚¹ãƒˆã‚’表示">
þ: [COUNT]
</text>
- <check_box label="" left="116" name="checkbox uniform"/>
+ <check_box label="" name="checkbox uniform"/>
<text label="両å´ã‚’延ã°ã™" name="checkbox uniform label">
両å´ã‚’延ã°ã™
</text>
<check_box initial_value="true" label="テクスãƒãƒ£ã‚’引ã延ã°ã™" name="checkbox stretch textures"/>
- <check_box initial_value="true" label="グリッドã«ã‚¹ãƒŠãƒƒãƒ—" left_delta="27" name="checkbox snap to grid"/>
- <combo_box left_delta="60" name="combobox grid mode" tool_tip="オブジェクトã®é…ç½®ã«ä½¿ã†ã‚°ãƒªãƒƒãƒ‰ãƒ«ãƒ¼ãƒ©ã‚’é¸æŠžã—ã¾ã™" width="76">
+ <check_box initial_value="true" label="グリッドã«ã‚¹ãƒŠãƒƒãƒ—" name="checkbox snap to grid"/>
+ <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"/>
@@ -123,7 +125,19 @@
<text name="prim_count">
プリム: [COUNT]
</text>
- <tab_container name="Object Info Tabs" tab_max_width="150" tab_min_width="30">
+ <text name="linked_set_count">
+ リンクセット:[COUNT]
+ </text>
+ <text name="linked_set_cost" tool_tip="[prims] / [physics complexity] ã¨ã—ã¦ç¾åœ¨é¸æŠžã•ã‚Œã¦ã„るリンクセットã®ã‚³ã‚¹ãƒˆ">
+ 料金: [COST] / [PHYSICS]
+ </text>
+ <text name="object_count">
+ オブジェクト: [COUNT]
+ </text>
+ <text name="object_cost" tool_tip="[prims] / [physics complexity] ã¨ã—ã¦ç¾åœ¨é¸æŠžã•ã‚Œã¦ã„るオブジェクトã®ã‚³ã‚¹ãƒˆ">
+ 料金: [COST] / [PHYSICS]
+ </text>
+ <tab_container name="Object Info Tabs" >
<panel label="一般" name="General">
<panel.string name="text deed continued">
譲渡
@@ -170,9 +184,15 @@
<text name="Creator:">
制作者:
</text>
+ <text name="Creator Name">
+ Mrs. Esbee Linden (esbee.linden)
+ </text>
<text name="Owner:">
所有者:
</text>
+ <text name="Owner Name">
+ Mrs. Erica &quot;Moose&quot; Linden (erica.linden)
+ </text>
<text name="Group:">
グループ:
</text>
@@ -267,15 +287,6 @@
<combo_box.item label="リング" name="Ring"/>
<combo_box.item label="スカルプト" name="Sculpted"/>
</combo_box>
- <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>
<text name="text cut">
パスカット(始点ã¨çµ‚点)
</text>
@@ -348,9 +359,19 @@
<combo_box.item label="トーラス" name="Torus"/>
<combo_box.item label="å¹³é¢" name="Plane"/>
<combo_box.item label="シリンダー" name="Cylinder"/>
+ <combo_box.item label="メッシュ" name="Mesh"/>
</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">
プリムを 1 ã¤ã ã‘é¸æŠžã—ã¦ç·¨é›†ã—ã¦ãã ã•ã„
</text>
@@ -358,23 +379,40 @@
オブジェクトã®ç‰¹å¾´ã‚’編集:
</text>
<check_box label="フレキシブルパス" name="Flexible1D Checkbox Ctrl" tool_tip="Z 軸を中心ã«ã‚ªãƒ–ジェクトã®å±ˆæ›²ã‚’有効ã«ã—ã¾ã™ï¼ˆã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆå´ã®ã¿ï¼‰"/>
- <spinner label="柔軟性" label_width="72" name="FlexNumSections" width="135"/>
- <spinner label="é‡åŠ›" label_width="72" name="FlexGravity" width="135"/>
- <spinner label="ドラッグ" label_width="72" name="FlexFriction" width="135"/>
- <spinner label="風" label_width="72" name="FlexWind" width="135"/>
- <spinner label="ç·Šå¼µ" label_width="72" name="FlexTension" width="135"/>
- <spinner label="X 軸方å‘ã®åŠ›" label_width="72" name="FlexForceX" width="135"/>
- <spinner label="Y 軸方å‘ã®åŠ›" label_width="72" name="FlexForceY" width="135"/>
- <spinner label="Z 軸方å‘ã®åŠ›" label_width="72" name="FlexForceZ" width="135"/>
+ <spinner label="柔軟性" name="FlexNumSections" />
+ <spinner label="é‡åŠ›" name="FlexGravity" />
+ <spinner label="ドラッグ" name="FlexFriction" />
+ <spinner label="風" name="FlexWind" />
+ <spinner label="ç·Šå¼µ" name="FlexTension" />
+ <spinner label="X 軸方å‘ã®åŠ›" name="FlexForceX" />
+ <spinner label="Y 軸方å‘ã®åŠ›" name="FlexForceY" />
+ <spinner label="Z 軸方å‘ã®åŠ›" name="FlexForceZ" />
<check_box label="å…‰" name="Light Checkbox Ctrl" tool_tip="オブジェクトãŒç™ºå…‰ã—ã¾ã™"/>
- <color_swatch label="" left_delta="74" name="colorswatch" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
+ <color_swatch label="" name="colorswatch" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
<texture_picker label="" name="light texture control" tool_tip="クリックã§æŠ•å½±ç”»ã‚’é¸æŠžã—ã¾ã™ï¼ˆé…延レンダリング有効時ã®ã¿ï¼‰"/>
- <spinner label="è¼åº¦" label_width="72" name="Light Intensity" width="135"/>
+ <spinner label="è¼åº¦" name="Light Intensity" />
<spinner label="FOV" name="Light FOV"/>
- <spinner label="åŠå¾„" label_width="72" name="Light Radius" width="135"/>
+ <spinner label="åŠå¾„" name="Light Radius" />
<spinner label="焦点" name="Light Focus"/>
- <spinner label="å¼±ã¾ã‚‹" label_width="72" name="Light Falloff" width="135"/>
+ <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="密度" name="Physics Density"/>
+ <spinner label="復元" name="Physics Restitution"/>
</panel>
<panel label="æ質" name="Texture">
<panel.string name="string repeats per meter">
@@ -458,18 +496,18 @@
</panel>
</panel>
<panel label="中身" name="Contents">
- <button label="æ–°ã—ã„スクリプト" label_selected="æ–°è¦ã‚¹ã‚¯ãƒªãƒ—ト" name="button new script" width="120"/>
- <button label="権é™" left_delta="130" name="button permissions" width="80"/>
+ <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" width="200">
+ <text name="label_area_price" >
価格: [AREA] 平方メートル L$ [PRICE]
</text>
- <text name="label_area" width="200">
+ <text name="label_area" >
é¢ç©ï¼š [AREA] 平方メートル
</text>
<button label="土地情報" label_selected="土地情報" name="button about land"/>
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 0caca22bc1..f12648f208 100644
--- a/indra/newview/skins/default/xui/ja/floater_voice_controls.xml
+++ b/indra/newview/skins/default/xui/ja/floater_voice_controls.xml
@@ -19,7 +19,7 @@
<layout_panel name="my_panel">
<text name="user_text" value="マイ ã‚¢ãƒã‚¿ãƒ¼ï¼š"/>
</layout_panel>
- <layout_panel name="leave_call_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"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_water.xml b/indra/newview/skins/default/xui/ja/floater_water.xml
deleted file mode 100644
index fb64332e79..0000000000
--- a/indra/newview/skins/default/xui/ja/floater_water.xml
+++ /dev/null
@@ -1,70 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Water Floater" title="æ°´ã®é«˜åº¦ãªç·¨é›†">
- <floater.string name="WLDefaultWaterNames">
- Default:Glassy:Pond:Murky: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/ja/floater_wearable_save_as.xml b/indra/newview/skins/default/xui/ja/floater_wearable_save_as.xml
deleted file mode 100644
index de8b590a80..0000000000
--- a/indra/newview/skins/default/xui/ja/floater_wearable_save_as.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?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">
- New [DESC]
- </line_editor>
-</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_web_content.xml b/indra/newview/skins/default/xui/ja/floater_web_content.xml
new file mode 100644
index 0000000000..48fe8aee78
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/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/ja/floater_windlight_options.xml b/indra/newview/skins/default/xui/ja/floater_windlight_options.xml
deleted file mode 100644
index feb94ef73e..0000000000
--- a/indra/newview/skins/default/xui/ja/floater_windlight_options.xml
+++ /dev/null
@@ -1,189 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="WindLight floater" title="空ã®é«˜åº¦ãªç·¨é›†">
- <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>
- <button label="?" name="WLBlueHorizonHelp"/>
- <text name="BHText2">
- R
- </text>
- <text name="BHText3">
- G
- </text>
- <text name="BHText4">
- B
- </text>
- <text name="BHText5">
- I
- </text>
- <text name="BDensText">
- 空ã¨é æ™¯ã®éœ²å…‰
- </text>
- <button label="?" name="WLHazeHorizonHelp"/>
- <text name="BDensText2">
- 空ã®é…色ã¨æ¿ƒåº¦
- </text>
- <button label="?" name="WLBlueDensityHelp"/>
- <text name="BHText6">
- R
- </text>
- <text name="BHText7">
- G
- </text>
- <text name="BHText8">
- B
- </text>
- <text name="BHText9">
- I
- </text>
- <text name="HDText">
- 大気ã®ä¸é€æ˜Žåº¦
- </text>
- <button label="?" name="WLHazeDensityHelp"/>
- <text name="DensMultText">
- 大気ã®ä¸é€æ˜Žåº¦ã®å¢—å¹…
- </text>
- <button label="?" name="WLDensityMultHelp"/>
- <text name="WLDistanceMultText">
- 視界ã®å¢—å¹…
- </text>
- <button label="?" name="WLDistanceMultHelp"/>
- <text name="MaxAltText">
- 最大高度
- </text>
- <button label="?" name="WLMaxAltitudeHelp"/>
- </panel>
- <panel label="ライティング" name="Lighting">
- <text name="SLCText">
- 太陽/月ã®è‰²
- </text>
- <button label="?" name="WLSunlightColorHelp"/>
- <text name="BHText">
- R
- </text>
- <text name="BHText2">
- G
- </text>
- <text name="BHText3">
- B
- </text>
- <text name="BHText4">
- I
- </text>
- <text name="TODText">
- 太陽/月ã®ä½ç½®
- </text>
- <button label="?" name="WLTimeOfDayHelp"/>
- <text name="WLAmbientText">
- アンビエント
- </text>
- <button label="?" name="WLAmbientHelp"/>
- <text name="BHText5">
- R
- </text>
- <text name="BHText6">
- G
- </text>
- <text name="BHText7">
- B
- </text>
- <text name="BHText8">
- I
- </text>
- <text name="WLEastAngleText">
- æ±ã®è§’度
- </text>
- <button label="?" name="WLEastAngleHelp"/>
- <text name="SunGlowText">
- 太陽ã®è¼ã
- </text>
- <button label="?" name="WLSunGlowHelp"/>
- <slider label="フォーカス " name="WLGlowB"/>
- <slider label="サイズ " name="WLGlowR"/>
- <text name="SceneGammaText">
- 風景ガンマ
- </text>
- <button label="?" name="WLSceneGammaHelp"/>
- <text name="WLStarText">
- 星ã®è¼ã
- </text>
- <button label="?" name="WLStarBrightnessHelp"/>
- </panel>
- <panel label="雲" name="Clouds">
- <text name="WLCloudColorText">
- 雲ã®è‰²
- </text>
- <button label="?" name="WLCloudColorHelp"/>
- <text name="BHText">
- R
- </text>
- <text name="BHText2">
- G
- </text>
- <text name="BHText3">
- B
- </text>
- <text name="BHText4">
- I
- </text>
- <text name="WLCloudColorText2">
- 雲㮠XY/密度
- </text>
- <button label="?" name="WLCloudDensityHelp"/>
- <text name="BHText5">
- X
- </text>
- <text name="BHText6">
- Y
- </text>
- <text name="BHText7">
- D
- </text>
- <text name="WLCloudCoverageText">
- 雲ã®é‡
- </text>
- <button label="?" name="WLCloudCoverageHelp"/>
- <text name="WLCloudScaleText">
- 雲ã®ã‚¹ã‚±ãƒ¼ãƒ«
- </text>
- <button label="?" name="WLCloudScaleHelp"/>
- <text name="WLCloudDetailText">
- 雲ã®è©³ç´° (XY/密度)
- </text>
- <button label="?" name="WLCloudDetailHelp"/>
- <text name="BHText8">
- X
- </text>
- <text name="BHText9">
- Y
- </text>
- <text name="BHText10">
- D
- </text>
- <text name="WLCloudScrollXText">
- 雲ã®ç§»å‹•é€Ÿåº¦ (X æ–¹å‘)
- </text>
- <button label="?" name="WLCloudScrollXHelp"/>
- <check_box label="ロック" name="WLCloudLockX"/>
- <text name="WLCloudScrollYText">
- 雲ã®ç§»å‹•é€Ÿåº¦ (Y æ–¹å‘)
- </text>
- <button label="?" name="WLCloudScrollYHelp"/>
- <check_box label="ロック" name="WLCloudLockY"/>
- <check_box label="従æ¥ã®é›²ã‚’æç”»" name="DrawClassicClouds"/>
- <button label="?" name="WLClassicCloudsHelp"/>
- </panel>
- </tab_container>
- <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
- </string>
-</floater>
diff --git a/indra/newview/skins/default/xui/ja/inspect_avatar.xml b/indra/newview/skins/default/xui/ja/inspect_avatar.xml
index f3ea794bc7..42b67cd333 100644
--- a/indra/newview/skins/default/xui/ja/inspect_avatar.xml
+++ b/indra/newview/skins/default/xui/ja/inspect_avatar.xml
@@ -10,9 +10,11 @@
<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.
+ 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"/>
diff --git a/indra/newview/skins/default/xui/ja/language_settings.xml b/indra/newview/skins/default/xui/ja/language_settings.xml
index a6023f9b56..91e8f4be7c 100644
--- a/indra/newview/skins/default/xui/ja/language_settings.xml
+++ b/indra/newview/skins/default/xui/ja/language_settings.xml
@@ -4,6 +4,7 @@
<!-- Locale Information -->
<string name="MicrosoftLocale">japanese</string>
+ <string name="MacLocale">ja_JP.UTF-8</string>
<string name="DarwinLocale">ja_JP.UTF-8</string>
<string name="LinuxLocale">ja_JP.UTF-8</string>
diff --git a/indra/newview/skins/default/xui/ja/menu_attachment_self.xml b/indra/newview/skins/default/xui/ja/menu_attachment_self.xml
index 5d95949189..6036e1075e 100644
--- a/indra/newview/skins/default/xui/ja/menu_attachment_self.xml
+++ b/indra/newview/skins/default/xui/ja/menu_attachment_self.xml
@@ -5,7 +5,7 @@
<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="Change Outfit"/>
<menu_item_call label="アウトフィットã®ç·¨é›†" name="Edit Outfit"/>
<menu_item_call label="シェイプã®ç·¨é›†" name="Edit My Shape"/>
<menu_item_call label="フレンド" name="Friends..."/>
diff --git a/indra/newview/skins/default/xui/ja/menu_avatar_self.xml b/indra/newview/skins/default/xui/ja/menu_avatar_self.xml
index fc9c8caf51..4709522665 100644
--- a/indra/newview/skins/default/xui/ja/menu_avatar_self.xml
+++ b/indra/newview/skins/default/xui/ja/menu_avatar_self.xml
@@ -14,6 +14,7 @@
<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>
@@ -21,7 +22,7 @@
<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="Chenge Outfit"/>
<menu_item_call label="アウトフィットを編集" name="Edit Outfit"/>
<menu_item_call label="シェイプを編集" name="Edit My Shape"/>
<menu_item_call label="フレンド" name="Friends..."/>
diff --git a/indra/newview/skins/default/xui/ja/menu_bottomtray.xml b/indra/newview/skins/default/xui/ja/menu_bottomtray.xml
index e5703c559b..7f106c1ab5 100644
--- a/indra/newview/skins/default/xui/ja/menu_bottomtray.xml
+++ b/indra/newview/skins/default/xui/ja/menu_bottomtray.xml
@@ -1,10 +1,10 @@
<?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="ShowSidebarButton"/>
<menu_item_check label="制作ボタン" name="ShowBuildButton"/>
<menu_item_check label="検索ボタン" name="ShowSearchButton"/>
<menu_item_check label="地図ボタン" name="ShowWorldMapButton"/>
diff --git a/indra/newview/skins/default/xui/ja/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/ja/menu_inspect_avatar_gear.xml
index 5fdaa9ae6b..9d0d0f10a6 100644
--- a/indra/newview/skins/default/xui/ja/menu_inspect_avatar_gear.xml
+++ b/indra/newview/skins/default/xui/ja/menu_inspect_avatar_gear.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
-<menu name="Gear Menu">
+<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"/>
@@ -11,9 +11,11 @@
<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"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/ja/menu_inspect_self_gear.xml
index 90b3efd144..e3e206f3aa 100644
--- a/indra/newview/skins/default/xui/ja/menu_inspect_self_gear.xml
+++ b/indra/newview/skins/default/xui/ja/menu_inspect_self_gear.xml
@@ -1,10 +1,31 @@
-<?xml version="1.0" encoding="utf-8"?>
-<menu name="Gear Menu">
- <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="my_profile"/>
- <menu_item_call label="フレンド" name="my_friends"/>
- <menu_item_call label="グループ" name="my_groups"/>
+<?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..."/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_inventory.xml b/indra/newview/skins/default/xui/ja/menu_inventory.xml
index 6999f9a3f3..f78ec09e5e 100644
--- a/indra/newview/skins/default/xui/ja/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/ja/menu_inventory.xml
@@ -25,6 +25,7 @@
<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"/>
diff --git a/indra/newview/skins/default/xui/ja/menu_inventory_add.xml b/indra/newview/skins/default/xui/ja/menu_inventory_add.xml
index 42dcd06a07..ae5ddbb78f 100644
--- a/indra/newview/skins/default/xui/ja/menu_inventory_add.xml
+++ b/indra/newview/skins/default/xui/ja/menu_inventory_add.xml
@@ -4,6 +4,8 @@
<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>
@@ -23,6 +25,7 @@
<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"/>
diff --git a/indra/newview/skins/default/xui/ja/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/ja/menu_inventory_gear_default.xml
index f0e5e936ca..1f425df83c 100644
--- a/indra/newview/skins/default/xui/ja/menu_inventory_gear_default.xml
+++ b/indra/newview/skins/default/xui/ja/menu_inventory_gear_default.xml
@@ -1,8 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_gear_default">
+<toggleable_menu name="menu_gear_default">
<menu_item_call label="æ–°ã—ã„æŒã¡ç‰©ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦" name="new_window"/>
- <menu_item_call label="åå‰ã§ä¸¦ã¹æ›¿ãˆ" name="sort_by_name"/>
- <menu_item_call label="æ–°ã—ã„é †ã«ä¸¦ã¹æ›¿ãˆ" name="sort_by_recent"/>
+ <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"/>
@@ -12,4 +14,4 @@
<menu_item_call label="オリジナルを表示" name="Find Original"/>
<menu_item_call label="ã™ã¹ã¦ã®ãƒªãƒ³ã‚¯ã‚’表示" name="Find All Links"/>
<menu_item_call label="ã”ã¿ç®±ã‚’空ã«ã™ã‚‹" name="empty_trash"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_login.xml b/indra/newview/skins/default/xui/ja/menu_login.xml
index e2a7f39dfd..265f3ebcd0 100644
--- a/indra/newview/skins/default/xui/ja/menu_login.xml
+++ b/indra/newview/skins/default/xui/ja/menu_login.xml
@@ -17,7 +17,8 @@
<menu_item_call label="ウィンドウã®ã‚µã‚¤ã‚ºã‚’設定..." name="Set Window Size..."/>
<menu_item_call label="利用è¦ç´„を表示" name="TOS"/>
<menu_item_call label="クリティカルメッセージを表示" name="Critical"/>
- <menu_item_call label="Web ブラウザã®ãƒ†ã‚¹ãƒˆ" name="Web Browser Test"/>
+ <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>
diff --git a/indra/newview/skins/default/xui/ja/menu_media_ctrl.xml b/indra/newview/skins/default/xui/ja/menu_media_ctrl.xml
new file mode 100644
index 0000000000..d155dc17e0
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_media_ctrl.xml
@@ -0,0 +1,6 @@
+<?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"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_mini_map.xml b/indra/newview/skins/default/xui/ja/menu_mini_map.xml
index 12ea6e2299..2e733ee24b 100644
--- a/indra/newview/skins/default/xui/ja/menu_mini_map.xml
+++ b/indra/newview/skins/default/xui/ja/menu_mini_map.xml
@@ -3,6 +3,7 @@
<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"/>
diff --git a/indra/newview/skins/default/xui/ja/menu_model_import_gear_default.xml b/indra/newview/skins/default/xui/ja/menu_model_import_gear_default.xml
new file mode 100644
index 0000000000..43f86e84bf
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/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/ja/menu_object.xml b/indra/newview/skins/default/xui/ja/menu_object.xml
index c11dc9bb3e..4cee8089ee 100644
--- a/indra/newview/skins/default/xui/ja/menu_object.xml
+++ b/indra/newview/skins/default/xui/ja/menu_object.xml
@@ -16,14 +16,14 @@
<context_menu label="å–り付ã‘ã‚‹" name="Object Attach"/>
<context_menu label="HUD ã‚’å–り付ã‘ã‚‹" name="Object Attach HUD"/>
</context_menu>
- <context_menu label="å–り外ã™" name="Remove">
+ <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..."/>
- <menu_item_call label="削除" name="Delete"/>
</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/ja/menu_outfit_gear.xml b/indra/newview/skins/default/xui/ja/menu_outfit_gear.xml
index d31b34deeb..2bcbe1915b 100644
--- a/indra/newview/skins/default/xui/ja/menu_outfit_gear.xml
+++ b/indra/newview/skins/default/xui/ja/menu_outfit_gear.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Gear Outfit">
+<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"/>
@@ -14,6 +14,7 @@
<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">
@@ -24,4 +25,4 @@
</menu>
<menu_item_call label="アウトフィットã®åå‰ã‚’変更ã™ã‚‹" name="rename"/>
<menu_item_call label="アウトフィットを削除ã™ã‚‹" name="delete_outfit"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_places_gear_folder.xml b/indra/newview/skins/default/xui/ja/menu_places_gear_folder.xml
index 6f91a3ebf9..e64f97fda5 100644
--- a/indra/newview/skins/default/xui/ja/menu_places_gear_folder.xml
+++ b/indra/newview/skins/default/xui/ja/menu_places_gear_folder.xml
@@ -1,7 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_folder_gear">
+<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"/>
@@ -12,4 +13,4 @@
<menu_item_call label="フォルダをã™ã¹ã¦é–‹ã" name="expand_all"/>
<menu_item_call label="フォルダをã™ã¹ã¦é–‰ã˜ã‚‹" name="collapse_all"/>
<menu_item_check label="日付ã§ä¸¦ã¹æ›¿ãˆ" name="sort_by_date"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_places_gear_landmark.xml b/indra/newview/skins/default/xui/ja/menu_places_gear_landmark.xml
index 5a135e5f56..f416b5b1f6 100644
--- a/indra/newview/skins/default/xui/ja/menu_places_gear_landmark.xml
+++ b/indra/newview/skins/default/xui/ja/menu_places_gear_landmark.xml
@@ -1,10 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_ladmark_gear">
+<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"/>
@@ -15,4 +16,4 @@
<menu_item_call label="フォルダをã™ã¹ã¦é–‰ã˜ã‚‹" name="collapse_all"/>
<menu_item_check label="日付ã§ä¸¦ã¹æ›¿ãˆ" name="sort_by_date"/>
<menu_item_call label="ピックを作æˆ" name="create_pick"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_viewer.xml b/indra/newview/skins/default/xui/ja/menu_viewer.xml
index 85aaf17256..ec9db02522 100644
--- a/indra/newview/skins/default/xui/ja/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/ja/menu_viewer.xml
@@ -7,11 +7,17 @@
</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_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 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"/>
@@ -29,6 +35,7 @@
<menu label="世界" name="World">
<menu_item_check label="ミニマップ" name="Mini-Map"/>
<menu_item_check label="世界地図" name="World Map"/>
+ <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">
@@ -47,6 +54,7 @@
<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_item_call label="ホームã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆ" name="Teleport Home"/>
<menu_item_call label="ç¾åœ¨åœ°ã‚’ホームã«è¨­å®š" name="Set Home to Here"/>
@@ -85,6 +93,7 @@
<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"/>
@@ -98,6 +107,7 @@
<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"/>
@@ -110,17 +120,21 @@
<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>
+ <menu_item_call label="å…ƒã«æˆ»ã™" name="Undo"/>
+ <menu_item_call label="ã‚„ã‚Šç›´ã—" name="Redo"/>
</menu>
<menu label="ヘルプ" name="Help">
<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"/>
</menu>
<menu label="アドãƒãƒ³ã‚¹" name="Advanced">
- <menu_item_call label="自分ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’åœæ­¢ã™ã‚‹" name="Stop Animating My Avatar"/>
<menu_item_call label="テクスãƒãƒ£ã®ãƒªãƒ™ãƒ¼ã‚¯ã‚’ã™ã‚‹" name="Rebake Texture"/>
<menu_item_call label="UI ã®ã‚µã‚¤ã‚ºã‚’デフォルトã«è¨­å®šã™ã‚‹" name="Set UI Size to Default"/>
<menu_item_call label="ウィンドウã®ã‚µã‚¤ã‚ºã‚’設定ã™ã‚‹" name="Set Window Size..."/>
@@ -147,7 +161,7 @@
<menu_item_check label="アルファ" name="Alpha"/>
<menu_item_check label="木" name="Tree"/>
<menu_item_check label="ã‚¢ãƒã‚¿ãƒ¼" name="Character"/>
- <menu_item_check label="地表" name="SurfacePath"/>
+ <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"/>
@@ -175,8 +189,7 @@
<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="Always Run"/>
- <menu_item_check label="飛行ã™ã‚‹" name="Fly"/>
+ <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"/>
@@ -194,7 +207,6 @@
<menu_item_call label="ズームイン" name="Zoom In"/>
<menu_item_call label="ズーム(デフォルト)" name="Zoom Default"/>
<menu_item_call label="ズームアウト" name="Zoom Out"/>
- <menu_item_check label="アドãƒãƒ³ã‚¹ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã‚’表示ã™ã‚‹" name="Show Advanced Menu"/>
</menu>
<menu_item_call label="デãƒãƒƒã‚°è¨­å®šã‚’表示ã™ã‚‹" name="Debug Settings"/>
<menu_item_check label="開発メニューを表示ã™ã‚‹" name="Debug Mode"/>
@@ -208,6 +220,7 @@
<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"/>
@@ -218,9 +231,12 @@
</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 Updates"/>
</menu>
<menu label="エラー実行" name="Force Errors">
@@ -241,17 +257,23 @@
</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="LOD 情報" 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="Sculpt"/>
</menu>
<menu label="レンダリング" name="Rendering">
<menu_item_check label="軸" name="Axes"/>
@@ -259,7 +281,6 @@
<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="Framebuffer Objects"/>
<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"/>
@@ -301,7 +322,8 @@
<menu_item_call label="リージョンオブジェクトã®ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‚’ダンプã™ã‚‹" name="Dump Region Object Cache"/>
</menu>
<menu label="UI" name="UI">
- <menu_item_call label="Web ブラウザã®ãƒ†ã‚¹ãƒˆ" name="Web Browser Test"/>
+ <menu_item_call label="メディアブラウザã®ãƒ†ã‚¹ãƒˆ" name="Web Browser Test"/>
+ <menu_item_call label="Web コンテンツブラウザ" 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"/>
@@ -309,8 +331,7 @@
<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="Double-Click Auto-Pilot"/>
- <menu_item_check label="ダブルクリックã§ãƒ†ãƒ¬ãƒãƒ¼ãƒˆ" name="DoubleClick Teleport"/>
+ <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"/>
@@ -322,10 +343,9 @@
<menu label="XUI" name="XUI">
<menu_item_call label="色ã®è¨­å®šã‚’æ›´æ–°ã™ã‚‹" name="Reload Color Settings"/>
<menu_item_call label="フォントテストを表示ã™ã‚‹" name="Show Font Test"/>
- <menu_item_call label="XML ã‹ã‚‰èª­ã¿è¾¼ã‚€" name="Load from XML"/>
- <menu_item_call label="XML ã§ä¿å­˜ã™ã‚‹" name="Save to XML"/>
<menu_item_check label="XUI ãƒãƒ¼ãƒ ã‚’表示ã™ã‚‹" name="Show XUI Names"/>
<menu_item_call label="テスト用 IM ã‚’é€ä¿¡ã™ã‚‹" name="Send Test IMs"/>
+ <menu_item_call label="åå‰ã®ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‚’フラッシュ" name="Flush Names Caches"/>
</menu>
<menu label="ã‚¢ãƒã‚¿ãƒ¼" name="Character">
<menu label="ベークドテクスãƒãƒ£ã‚’å–å¾—ã™ã‚‹" name="Grab Baked Texture">
@@ -359,12 +379,13 @@
<menu_item_call label="ローカルテクスãƒãƒ£ã‚’ダンプ" name="Dump Local Textures"/>
</menu>
<menu_item_check label="HTTP Texture" 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_check label="管ç†è€…メニューを表示ã™ã‚‹" name="View Admin Options"/>
<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">
@@ -401,6 +422,7 @@
<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">
diff --git a/indra/newview/skins/default/xui/ja/notifications.xml b/indra/newview/skins/default/xui/ja/notifications.xml
index baec8c073c..d63ca84035 100644
--- a/indra/newview/skins/default/xui/ja/notifications.xml
+++ b/indra/newview/skins/default/xui/ja/notifications.xml
@@ -113,9 +113,13 @@
フレンド以外ã‹ã‚‰ã®ã‚³ãƒ¼ãƒ«ã‚„インスタントメッセージを無視ã™ã‚‹è¨­å®šã«ã—ãŸã“ã¨ã‚’ã€ç›¸æ‰‹ã«çŸ¥ã‚‰ã‚Œã‚‹ã“ã¨ã¯ã‚ã‚Šã¾ã›ã‚“。
<usetemplate name="okbutton" yestext="OK"/>
</notification>
+ <notification name="FavoritesOnLogin">
+ 注æ„:ã“ã®ã‚ªãƒ—ションを有効ã«ã™ã‚‹ã¨ã€ã“ã®ãƒ‘ソコンを使ã†ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯èª°ã§ã‚‚ã€ã‚ãªãŸã®ãŠæ°—ã«å…¥ã‚Šã®å ´æ‰€ã‚’見るã“ã¨ãŒã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="GrantModifyRights">
- 他人ã«ä¿®æ­£æ¨©é™ã‚’与ãˆã‚‹ã¨ã€æ¨©é™ã‚’与ãˆã‚‰ã‚ŒãŸäººã¯ã‚ãªãŸãŒæ‰€æœ‰ã™ã‚‹ã‚¤ãƒ³ãƒ¯ãƒ¼ãƒ«ãƒ‰ã®ã‚ªãƒ–ジェクトを変更ã€å‰Šé™¤ã€æŒã¡å¸°ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ ã“ã®æ¨©é™ã‚’与ãˆã‚‹éš›ã«ã¯å分ã«æ³¨æ„ã—ã¦ãã ã•ã„。
-[FIRST_NAME] [LAST_NAME] ã«ä¿®æ­£æ¨©é™ã‚’与ãˆã¾ã™ã‹ï¼Ÿ
+ 他人ã«ä¿®æ­£æ¨©é™ã‚’与ãˆã‚‹ã¨ã€æ¨©é™ã‚’与ãˆã‚‰ã‚ŒãŸäººã¯ã‚ãªãŸãŒæ‰€æœ‰ã™ã‚‹ã‚¤ãƒ³ãƒ¯ãƒ¼ãƒ«ãƒ‰ã®ã‚ªãƒ–ジェクトを変更ã€å‰Šé™¤ã€æŒã¡å¸°ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ã“ã®æ¨©é™ã‚’与ãˆã‚‹éš›ã«ã¯å分ã«æ³¨æ„ã—ã¦ãã ã•ã„。
+[NAME] ã«ä¿®æ­£æ¨©é™ã‚’与ãˆã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
</notification>
<notification name="GrantModifyRightsMultiple">
@@ -124,7 +128,7 @@
<usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
</notification>
<notification name="RevokeModifyRights">
- [FIRST_NAME] [LAST_NAME] ã«å¯¾ã—ã¦å¤‰æ›´æ¨©é™ã‚’å–り消ã—ã¾ã™ã‹ï¼Ÿ
+ [NAME] ã®ä¿®æ­£æ¨©é™ã‚’解約ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
</notification>
<notification name="RevokeModifyRightsMultiple">
@@ -339,24 +343,17 @@ L$ ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚加ã™ã‚‹ã“ã¨ãŒã§ãã
ã¾ã èª­ã¿è¾¼ã¾ã‚Œã¦ã„ãªã„ãŸã‚ã€ãã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’装ç€ã§ãã¾ã›ã‚“。後ã§ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。
</notification>
<notification name="MustHaveAccountToLogIn">
- ãŠã£ã¨ï¼è¨˜å…¥æ¼ã‚ŒãŒã‚ã‚Šã¾ã™ã‚ˆã€‚
-ã‚¢ãƒã‚¿ãƒ¼ã®ãƒ•ã‚¡ãƒ¼ã‚¹ãƒˆãƒãƒ¼ãƒ ã¨ãƒ©ã‚¹ãƒˆãƒãƒ¼ãƒ ã®ä¸¡æ–¹ã‚’入力ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚
+ 注æ„:記入æ¼ã‚Œã®ç®‡æ‰€ãŒã‚ã‚Šã¾ã™ã€‚
+ã‚¢ãƒã‚¿ãƒ¼ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼åを入力ã—ã¦ãã ã•ã„。
-[SECOND_LIFE] ã«å…¥ã‚‹ã«ã¯ã€ã‚¢ã‚«ã‚¦ãƒ³ãƒˆãŒå¿…è¦ã§ã™ã€‚ アカウントを作æˆã—ã¾ã™ã‹ï¼Ÿ
+[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="AddClassified">
- クラシファイド広告ã¯ã€æ¤œç´¢ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã¨ [http://secondlife.com/community/classifieds secondlife.com] ã®ã€Œã‚¯ãƒ©ã‚·ãƒ•ã‚¡ã‚¤ãƒ‰åºƒå‘Šã€ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã«ä¸€é€±é–“掲載ã•ã‚Œã¾ã™ã€‚
-広告を記入ã—ãŸã‚‰ã€ã€ŒæŽ²è¼‰...ã€ã‚’クリックã—ã¦ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã«è¿½åŠ ã—ã¦ãã ã•ã„。
-「掲載ã€ã‚’クリックã™ã‚‹ã¨ã€æ”¯æ‰•ã„ãŸã„金é¡ã‚’å°‹ã­ã‚‰ã‚Œã¾ã™ã€‚
-支払金é¡ãŒå¤šã„ã»ã©ã‚ãªãŸã®åºƒå‘Šã¯ä¸€è¦§ã¨ã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰æ¤œç´¢ã§ä¸Šä½ã«è¡¨ç¤ºã•ã‚Œã¾ã™ã€‚
- <usetemplate ignoretext="æ–°è¦ã‚¯ãƒ©ã‚·ãƒ•ã‚¡ã‚¤ãƒ‰åºƒå‘Šä½œæˆæ–¹æ³•" name="okcancelignore" notext="å–り消ã—" yestext="OK"/>
+ ユーザーåã®ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰ã«ã‚¢ãƒã‚¿ãƒ¼ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼åã‚‚ã—ãã¯æ°åを入力ã—ã¦ã‹ã‚‰ã€å†åº¦ãƒ­ã‚°ã‚¤ãƒ³ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚
</notification>
<notification name="DeleteClassified">
クラシファイド広告 [NAME] を削除ã—ã¾ã™ã‹ï¼Ÿ
@@ -410,6 +407,9 @@ L$ ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚加ã™ã‚‹ã“ã¨ãŒã§ãã
<notification name="ChangeSkin">
æ–°ã—ã„スキン㯠[APP_NAME] ã‚’å†èµ·å‹•å¾Œã«è¡¨ç¤ºã•ã‚Œã¾ã™ã€‚
</notification>
+ <notification name="ChangeLanguage">
+ 言語ã®å¤‰æ›´ã¯ [APP_NAME] ã‚’å†èµ·å‹•å¾Œã«å映ã•ã‚Œã¾ã™ã€‚
+ </notification>
<notification name="GoToAuctionPage">
[SECOND_LIFE]ã® Web ページã«ç§»å‹•ã—ã€å…¥æœ­ã‚ã‚‹ã„ã¯ã‚ªãƒ¼ã‚¯ã‚·ãƒ§ãƒ³ã®è©³ç´°ã‚’確èªã—ã¾ã™ã‹ï¼Ÿ
<url name="url">
@@ -623,6 +623,10 @@ L$ ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚加ã™ã‚‹ã“ã¨ãŒã§ãã
WAV ヘッダーã«ãƒ‡ãƒ¼ã‚¿ãƒãƒ£ãƒ³ã‚¯ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“:
[FILE]
</notification>
+ <notification name="SoundFileInvalidChunkSize">
+ WAV ファイルã®ãƒãƒ£ãƒ³ã‚¯ã‚µã‚¤ã‚ºãŒé–“é•ã£ã¦ã„ã¾ã™ï¼š
+[FILE]
+ </notification>
<notification name="SoundFileInvalidTooLong">
オーディオファイルãŒé•·ã™ãŽã¾ã™ã€‚(最大 10 秒):
[FILE]
@@ -950,12 +954,6 @@ L$ ã¯è¿”金ã•ã‚Œã¾ã›ã‚“。
グループ用ã®åœŸåœ°ã®è³¼å…¥ãŒã§ãã¾ã›ã‚“:
ã‚ãªãŸã«ã¯ã‚¢ã‚¯ãƒ†ã‚£ãƒ–ãªã‚°ãƒ«ãƒ¼ãƒ—ã®ãŸã‚ã«åœŸåœ°ã‚’購入ã™ã‚‹æ¨©é™ãŒã‚ã‚Šã¾ã›ã‚“。
</notification>
- <notification label="フレンド登録" name="AddFriend">
- フレンド登録ã™ã‚‹ã¨ã€ãŠäº’ã„ã®ç¾åœ¨åœ°ã®åœ°å›³ã¸ã®è¡¨ç¤ºè¨±å¯ã€ã‚ªãƒ³ãƒ©ã‚¤ãƒ³çŠ¶æ…‹ã®è¡¨ç¤ºè¨­å®šãŒã§ãã¾ã™ã€‚
-
-[NAME] ã«ãƒ•ãƒ¬ãƒ³ãƒ‰ã‚·ãƒƒãƒ—ã‚’é€ã‚Šã¾ã™ã‹ï¼Ÿ
- <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
- </notification>
<notification label="フレンド登録" name="AddFriendWithMessage">
フレンド登録ã™ã‚‹ã¨ã€ãŠäº’ã„ã®ç¾åœ¨åœ°ã®åœ°å›³ã¸ã®è¡¨ç¤ºè¨±å¯ã€ã‚ªãƒ³ãƒ©ã‚¤ãƒ³çŠ¶æ…‹ã®è¡¨ç¤ºè¨­å®šãŒã§ãã¾ã™ã€‚
@@ -974,7 +972,7 @@ L$ ã¯è¿”金ã•ã‚Œã¾ã›ã‚“。
<input name="message">
[DESC] (新)
</input>
- <button name="Offer" text="OK"/>
+ <button name="OK" text="OK"/>
<button name="Cancel" text="キャンセル"/>
</form>
</notification>
@@ -984,7 +982,7 @@ L$ ã¯è¿”金ã•ã‚Œã¾ã›ã‚“。
<input name="message">
[DESC](新è¦ï¼‰
</input>
- <button name="Offer" text="OK"/>
+ <button name="OK" text="OK"/>
<button name="Cancel" text="å–り消ã—"/>
</form>
</notification>
@@ -994,12 +992,12 @@ L$ ã¯è¿”金ã•ã‚Œã¾ã›ã‚“。
<input name="new_name">
[NAME]
</input>
- <button name="Offer" text="OK"/>
+ <button name="OK" text="OK"/>
<button name="Cancel" text="å–り消ã—"/>
</form>
</notification>
<notification name="RemoveFromFriends">
- [FIRST_NAME] [LAST_NAME] をフレンドリストã‹ã‚‰å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ
+ フレンドリストã‹ã‚‰ [NAME] を削除ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="RemoveMultipleFromFriends">
@@ -1122,14 +1120,11 @@ L$ ã¯è¿”金ã•ã‚Œã¾ã›ã‚“。
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="DeedLandToGroupWithContribution">
- ã“ã®åŒºç”»ã®è­²æ¸¡ã«éš›ã—ã¦ã¯ã€ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ãŒå分ãªåœŸåœ°ã‚¯ãƒ¬ã‚¸ãƒƒãƒˆã‚’ä¿æœ‰ãŠã‚ˆã³ç¶­æŒã—ã¦ã„ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚
-ã“ã®è­²æ¸¡ã«ã‚ˆã‚Šã€
-「 [FIRST_NAME] [LAST_NAME] ã€ã‹ã‚‰
-グループã«å¯¾ã—ã¦åœŸåœ°ãŒåŒæ™‚ã«æä¾›ã•ã‚Œã¾ã™ã€‚
-土地ã®è³¼å…¥ä¾¡æ ¼ã¯ã€æ‰€æœ‰è€…ã«ã¯è¿”金ã•ã‚Œã¾ã›ã‚“。
-譲渡ã•ã‚ŒãŸåŒºç”»ãŒå£²ã‚Œã‚‹ã¨ã€å£²ä¸Šé‡‘é¡ã¯ã‚°ãƒ«ãƒ¼ãƒ—メンãƒãƒ¼ã«å‡ç­‰ã«åˆ†é…ã•ã‚Œã¾ã™ã€‚
-
-ã“ã® [AREA] 平方メートルã®åœŸåœ°ã‚’ã€ã€Œ [GROUP_NAME] ã€ã«è­²æ¸¡ã—ã¾ã™ã‹ï¼Ÿ
+ ã“ã®åŒºç”»ãŒè­²æ¸¡ã•ã‚Œã‚‹ã¨ã€ã‚°ãƒ«ãƒ¼ãƒ—ã¯ãã®åœŸåœ°åˆ©ç”¨æ–™ã¨ã—ã¦å分ãªæ®‹é«˜ã‚’維æŒã—ã¦ã„ãå¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚
+譲渡ã«ã¯åŒæ™‚ã« [NAME] ã‹ã‚‰ã‚°ãƒ«ãƒ¼ãƒ—ã¸ã®åœŸåœ°ã®è²¢çŒ®ãŒå«ã¾ã‚Œã¾ã™ã€‚
+土地ã®è³¼å…¥ä¾¡æ ¼ã¯æ‰€æœ‰è€…ã«è¿”金ã•ã‚Œã¾ã›ã‚“。譲渡ã•ã‚ŒãŸåŒºç”»ãŒå£²å´ã•ã‚Œã‚‹ã¨ã€è²©å£²ä¾¡æ ¼ã¯ã‚°ãƒ«ãƒ¼ãƒ—メンãƒãƒ¼ã®é–“ã§å‡ç­‰ã«åˆ†é…ã•ã‚Œã¾ã™ã€‚
+
+ã“ã® [AREA] m² ã®åœŸåœ°ã‚’ [GROUP_NAME] ã¨ã„ã†ã‚°ãƒ«ãƒ¼ãƒ—ã«è­²æ¸¡ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="DisplaySetToSafe">
@@ -1374,6 +1369,45 @@ SHA1 フィンガープリント: [MD5_DIGEST]
ã‚ãªãŸã®ã‚¢ãƒ—リケーションフォルダã«ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã—ã¾ã™ã‹ï¼Ÿ
<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$ ã‚’å—é ˜ã—ã¾ã™ã€‚
@@ -1506,6 +1540,46 @@ SHA1 フィンガープリント: [MD5_DIGEST]
<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">
@@ -2082,10 +2156,10 @@ Web ページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã
件å: [SUBJECT]ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ï¼š [MESSAGE]
</notification>
<notification name="FriendOnline">
- [NAME] ã¯ã‚ªãƒ³ãƒ©ã‚¤ãƒ³ã§ã™
+ [NAME] ã¯ã‚ªãƒ³ãƒ©ã‚¤ãƒ³ä¸­ã§ã™
</notification>
<notification name="FriendOffline">
- [NAME] ã¯ã‚ªãƒ•ãƒ©ã‚¤ãƒ³ã§ã™
+ [NAME] ã¯ã‚ªãƒ•ãƒ©ã‚¤ãƒ³ä¸­ã§ã™
</notification>
<notification name="AddSelfFriend">
残念ãªãŒã‚‰è‡ªåˆ†è‡ªèº«ã‚’フレンド登録ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。
@@ -2131,6 +2205,12 @@ Web ページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã
<notification name="RezItemNoPermissions">
オブジェクトを Rez ã™ã‚‹ã«ã¯æ¨©é™ãŒä¸è¶³ã—ã¦ã„ã¾ã™ã€‚
</notification>
+ <notification name="IMAcrossParentEstates">
+ 親エステート間ã§ã¯ IM ã‚’é€ä¿¡ã§ãã¾ã›ã‚“。
+ </notification>
+ <notification name="TransferInventoryAcrossParentEstates">
+ 親エステート間ã§æŒã¡ç‰©ã‚’移動ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。
+ </notification>
<notification name="UnableToLoadNotecard">
ノートカードを読ã¿è¾¼ã‚ã¾ã›ã‚“。ã‚ã¨ã§å†åº¦ãŠè©¦ã—ãã ã•ã„。
</notification>
@@ -2212,18 +2292,13 @@ Web ページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã
<notification name="NoContentToSearch">
å°‘ãªãã¨ã‚‚ã©ã‚Œã‹ä¸€ã¤ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®ç¨®é¡žã‚’é¸æŠžã—ã¦æ¤œç´¢ã‚’è¡Œã£ã¦ãã ã•ã„。(Generalã€Moderateã€Adult)
</notification>
- <notification name="GroupVote">
- [NAME] ã¯æŠ•ç¥¨ã®ç”³è«‹ã‚’ã—ã¦ã„ã¾ã™ï¼š
-[MESSAGE]
- <form name="form">
- <button name="VoteNow" text="今ã™ã投票ã™ã‚‹"/>
- <button name="Later" text="ã‚ã¨ã§"/>
- </form>
- </notification>
<notification name="SystemMessage">
[MESSAGE]
</notification>
- <notification name="PaymentRecived">
+ <notification name="PaymentReceived">
+ [MESSAGE]
+ </notification>
+ <notification name="PaymentSent">
[MESSAGE]
</notification>
<notification name="EventNotification">
@@ -2232,7 +2307,7 @@ Web ページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã
[NAME]
[DATE]
<form name="form">
- <button name="Details" text="説明"/>
+ <button name="Details" text="詳細"/>
<button name="Cancel" text="å–り消ã—"/>
</form>
</notification>
@@ -2269,9 +2344,7 @@ Web ページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã
é¸æŠžã—ãŸåœŸåœ°ã®åŒºç”»ä¸Šã«ã‚ã£ãŸã‚ãªãŸã®ã‚ªãƒ–ジェクトã¯ã€ã™ã¹ã¦ã‚ãªãŸã®ã€ŒæŒã¡ç‰©ã€ã«è¿”å´ã•ã‚Œã¾ã—ãŸã€‚
</notification>
<notification name="OtherObjectsReturned">
- é¸æŠžã—ãŸåœŸåœ°ã®åŒºç”»ä¸Šã«ã‚ã£ãŸ
- [NAME]
- ãŒæ‰€æœ‰ã™ã‚‹ã‚ªãƒ–ジェクトã¯ã€ã™ã¹ã¦æ‰€æœ‰è€…ã®ã€ŒæŒã¡ç‰©ã€ã«è¿”å´ã•ã‚Œã¾ã—ãŸã€‚
+ [NAME] ãŒæ‰€æœ‰ã™ã‚‹ã€é¸æŠžã—ãŸåŒºç”»ã«ã‚るオブジェクトã¯ã€æ‰€æœ‰è€…ã®æŒã¡ç‰©ã«è¿”å´ã•ã‚Œã¾ã—ãŸã€‚
</notification>
<notification name="OtherObjectsReturned2">
「 [NAME] ã€ã¨ã„ã†åå‰ã®ä½äººãŒæ‰€æœ‰ã™ã‚‹ã€é¸æŠžã—ãŸåŒºç”»ä¸Šã®ã‚ªãƒ–ジェクトã¯ã€æœ¬äººã«è¿”å´ã•ã‚Œã¾ã—ãŸã€‚
@@ -2398,7 +2471,7 @@ Web ページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã
有効ãªåŒºç”»ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚
</notification>
<notification name="ObjectGiveItem">
- [NAME_SLURL] ãŒæ‰€æœ‰ã™ã‚‹ [OBJECTFROMNAME] ã¨ã„ã†åå‰ã®ã‚ªãƒ–ジェクトãŒã€ã‚ãªãŸã« [OBJECTTYPE] を渡ã—ã¾ã—ãŸï¼š
+ [NAME_SLURL] ãŒæ‰€æœ‰ã™ã‚‹ &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt; ã¨ã„ã†åå‰ã®ã‚ªãƒ–ジェクトãŒã€ã‚ãªãŸã« [OBJECTTYPE] を渡ã—ã¾ã—ãŸï¼š
[ITEM_SLURL]
<form name="form">
<button name="Keep" text="å—ã‘å–ã‚‹"/>
@@ -2463,10 +2536,9 @@ Web ページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã
[TO_NAME] ã«ãƒ•ãƒ¬ãƒ³ãƒ‰ç™»éŒ²ã‚’申ã—出ã¾ã—ãŸã€‚
</notification>
<notification name="OfferFriendshipNoMessage">
- [NAME] ã¯ã€
-フレンド登録を申ã—込んã§ã„ã¾ã™ã€‚
+ [NAME_SLURL] ã¯ãƒ•ãƒ¬ãƒ³ãƒ‰ç™»éŒ²ã‚’申ã—込んã§ã„ã¾ã™ã€‚
-(デフォルトã§ãŠäº’ã„ã®ã‚ªãƒ³ãƒ©ã‚¤ãƒ³çŠ¶æ…‹ã‚’見るã“ã¨ãŒã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚)
+(デフォルト設定ã ã¨ãŠäº’ã„ã®ã‚ªãƒ³ãƒ©ã‚¤ãƒ³çŠ¶æ…‹ã‚’見るã“ã¨ãŒã§ãã¾ã™ï¼‰
<form name="form">
<button name="Accept" text="å—ã‘入れる"/>
<button name="Decline" text="æ‹’å¦"/>
@@ -2486,7 +2558,7 @@ Web ページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã
</notification>
<notification name="OfferCallingCard">
[NAME] ãŒã‚³ãƒ¼ãƒªãƒ³ã‚°ã‚«ãƒ¼ãƒ‰ã‚’渡ãã†ã¨ã—ã¦ã„ã¾ã™ã€‚
-ã‚ãªãŸã®ã€ŒæŒã¡ç‰©ã€ã«ãƒ–ックマークãŒè¿½åŠ ã•ã‚Œã€ã“ã®ä½äººã«ç´ æ—©ã IM ã‚’é€ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
+ã‚ãªãŸã®æŒã¡ç‰©ã«ãƒ–ックマークãŒè¿½åŠ ã•ã‚Œã€ã“ã®ä½äººã«ç´ æ—©ã IM ã‚’é€ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
<form name="form">
<button name="Accept" text="å—ã‘入れる"/>
<button name="Decline" text="辞退"/>
@@ -2501,11 +2573,11 @@ Web ページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã
ã“ã®ã¾ã¾ã“ã“ã«ã„ã‚‹ã¨ãƒ­ã‚°ã‚¢ã‚¦ãƒˆã•ã‚Œã¾ã™ã€‚
</notification>
<notification name="LoadWebPage">
- Web ページ [URL] を読ã¿è¾¼ã¿ã¾ã™ã‹ï¼Ÿ
+ Web ページ [URL] をロードã—ã¾ã™ã‹ï¼Ÿ
[MESSAGE]
-読ã¿è¾¼ã¿å…ƒã®ã‚ªãƒ–ジェクト:[OBJECTNAME]ã€æ‰€æœ‰è€…:[NAME]
+é€ä¿¡å…ƒã®ã‚ªãƒ–ジェクト:&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;ã€æ‰€æœ‰è€…:[NAME]?
<form name="form">
<button name="Gotopage" text="ページã«ç§»å‹•"/>
<button name="Cancel" text="å–り消ã—"/>
@@ -2521,7 +2593,7 @@ Web ページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã
ç€ç”¨ã—よã†ã¨ã—ã¦ã„るアイテムã¯ã‚ãªãŸã®ãƒ“ューワã§ã¯èª­ã¿è¾¼ã‚€ã“ã¨ãŒã§ãã¾ã›ã‚“。 [APP_NAME] ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’アップグレードã—ã¦ã‹ã‚‰ã“ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’ç€ç”¨ã—ã¦ãã ã•ã„。
</notification>
<notification name="ScriptQuestion">
- [NAME] ãŒæ‰€æœ‰ã™ã‚‹ã‚ªãƒ–ジェクト「 [OBJECTNAME] ã€ã‚’:
+ [NAME] ãŒæ‰€æœ‰ã™ã‚‹ã€Œ&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;〠ã¨ã„ã†ã‚ªãƒ–ジェクトãŒã€æ¬¡ã®ã“ã¨ã‚’ã—よã†ã¨ã—ã¦ã„ã¾ã™ï¼š
[QUESTIONS]
よã‚ã—ã„ã§ã™ã‹ï¼Ÿ
@@ -2532,7 +2604,7 @@ Web ページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã
</form>
</notification>
<notification name="ScriptQuestionCaution">
- [NAME] ãŒæ‰€æœ‰ã™ã‚‹ã€Œ [OBJECTNAME] 〠ã¨ã„ã†ã‚ªãƒ–ジェクトãŒã€æ¬¡ã®ã“ã¨ã‚’ã—よã†ã¨ã—ã¦ã„ã¾ã™ï¼š
+ [NAME] ãŒæ‰€æœ‰ã™ã‚‹ã€Œ&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;〠ã¨ã„ã†ã‚ªãƒ–ジェクトãŒã€æ¬¡ã®ã“ã¨ã‚’ã—よã†ã¨ã—ã¦ã„ã¾ã™ï¼š
[QUESTIONS]
ã“ã®ã‚ªãƒ–ジェクトや制作者を信用ã§ããªã„å ´åˆã¯ã€ã“ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’æ‹’å¦ã—ã¦ãã ã•ã„。
@@ -2545,14 +2617,14 @@ Web ページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã
</form>
</notification>
<notification name="ScriptDialog">
- [NAME] ã®ã€Œ &lt;nolink&gt;[TITLE]&lt;/nolink&gt; ã€
+ [NAME] ã®ã€Œ&lt;nolink&gt;[TITLE]&lt;/nolink&gt;ã€
[MESSAGE]
<form name="form">
<button name="Ignore" text="無視ã™ã‚‹"/>
</form>
</notification>
<notification name="ScriptDialogGroup">
- [GROUPNAME] ã®ã€Œ [TITLE] ã€
+ [GROUPNAME] ã®ã€Œ&lt;nolink&gt;[TITLE]&lt;/nolink&gt;ã€
[MESSAGE]
<form name="form">
<button name="Ignore" text="無視ã™ã‚‹"/>
@@ -2595,7 +2667,7 @@ M キーを押ã—ã¦å¤‰æ›´ã—ã¾ã™ã€‚
[NAME] ã¯ãŠé‡‘ã‚’å—ã‘å–ã‚Šã€è‡ªå‹•çš„ã«ãƒ–ロックãŒè§£é™¤ã•ã‚Œã¾ã—ãŸã€‚
</notification>
<notification name="AutoUnmuteByInventory">
- [NAME] ã¯ã‚¢ã‚¤ãƒ†ãƒ ã‚’å—ã‘å–ã‚Šã€è‡ªå‹•çš„ã«ãƒ–ロックãŒè§£é™¤ã•ã‚Œã¾ã—ãŸã€‚
+ [NAME] ã¯æŒã¡ç‰©ã‚’å—ã‘å–ã‚Šã€è‡ªå‹•çš„ã«ãƒ–ロックãŒè§£é™¤ã•ã‚Œã¾ã—ãŸã€‚
</notification>
<notification name="VoiceInviteGroup">
[NAME] 㯠[GROUP] ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã‚³ãƒ¼ãƒ«ã«å‚加ã—ã¾ã—ãŸã€‚
@@ -2714,6 +2786,10 @@ M キーを押ã—ã¦å¤‰æ›´ã—ã¾ã™ã€‚
モデレーターãŒã‚ãªãŸã®ãƒœã‚¤ã‚¹ã‚’ミュートã—ã¾ã—ãŸã€‚
<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"/>
@@ -2725,12 +2801,15 @@ M キーを押ã—ã¦å¤‰æ›´ã—ã¾ã™ã€‚
<notification name="ShareNotification">
共有ã™ã‚‹ä½äººã‚’é¸æŠžã—ã¾ã™ã€‚
</notification>
+ <notification name="MeshUploadError">
+ [LABEL] をアップロードã§ãã¾ã›ã‚“ã§ã—ãŸï¼š [MESSAGE] [IDENTIFIER] [INVALIDITY_IDENTIFIER]
+ </notification>
<notification name="ShareItemsConfirmation">
- 次ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’共有ã—ã¾ã™ã‹ï¼š
+ 次ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’共有ã—ã¾ã™ã‹ï¼Ÿ
&lt;nolink&gt;[ITEMS]&lt;/nolink&gt;
-次ã®ä½äººã¨å…±æœ‰ã—ã¾ã™ã‹ï¼š
+次ã®ä½äººã¨å…±æœ‰ã—ã¾ã™ã‹ï¼Ÿ
[RESIDENTS]
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
@@ -2741,6 +2820,19 @@ M キーを押ã—ã¦å¤‰æ›´ã—ã¾ã™ã€‚
<notification name="DeedToGroupFail">
グループã¸ã®è­²æ¸¡ã«å¤±æ•—ã—ã¾ã—ãŸã€‚
</notification>
+ <notification name="ReleaseLandThrottled">
+ 区画「[PARCEL_NAME]ã€ã¯ç¾åœ¨æ”¾æ£„ã§ãã¾ã›ã‚“。
+ </notification>
+ <notification name="ReleasedLandWithReclaim">
+ [AREA] m² ã®åŒºç”»ã€Œ[PARCEL_NAME]ã€ãŒå…¬é–‹ã•ã‚Œã¾ã—ãŸã€‚
+
+åŒåŒºç”»ãŒä»–ã®ä½äººã«å£²ã‚Šå‡ºã•ã‚Œã‚‹å‰ã® [RECLAIM_PERIOD] 時間内ã§ã‚ã‚Œã°ç„¡å„Ÿã§åœŸåœ°ã‚’å–り戻ã™ã“ã¨ãŒã§ãã¾ã™ã€‚
+ </notification>
+ <notification name="ReleasedLandNoReclaim">
+ [AREA] m² ã®åŒºç”»ã€Œ[PARCEL_NAME]ã€ãŒå…¬é–‹ã•ã‚Œã¾ã—ãŸã€‚
+
+一般ã«å…¬é–‹ã•ã‚ŒãŸã®ã§ã€ä»Šãªã‚‰èª°ã§ã‚‚購入å¯èƒ½ã§ã™ã€‚
+ </notification>
<notification name="AvatarRezNotification">
(作æˆå¾Œ[EXISTENCE]秒経éŽï¼‰
&apos;[NAME]&apos;ã¨ã„ã†ã‚¢ãƒã‚¿ãƒ¼ã¯[TIME]秒後ã«å§¿ã‚’ç¾ã‚ã—ã¾ã—ãŸã€‚
@@ -2777,9 +2869,7 @@ M キーを押ã—ã¦å¤‰æ›´ã—ã¾ã™ã€‚
<notification name="NoConnect">
[PROTOCOL] [HOSTID]を使ã£ã¦æŽ¥ç¶šã§ãã¾ã›ã‚“。
ãŠä½¿ã„ã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚„ファイアウォールã®è¨­å®šã‚’確èªã—ã¦ãã ã•ã„。
- <form name="form">
- <button name="OK" text="OK"/>
- </form>
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="NoVoiceConnect">
ボイスサーãƒãƒ¼ã«æŽ¥ç¶šã§ãã¾ã›ã‚“:
@@ -2788,9 +2878,7 @@ M キーを押ã—ã¦å¤‰æ›´ã—ã¾ã™ã€‚
ボイスãƒãƒ£ãƒƒãƒˆã«ã‚ˆã‚‹ã‚³ãƒŸãƒ¥ãƒ‹ã‚±ãƒ¼ã‚·ãƒ§ãƒ³ãŒåˆ©ç”¨ã§ãã¾ã›ã‚“。
ãŠä½¿ã„ã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚„ファイアウォールã®è¨­å®šã‚’確èªã—ã¦ãã ã•ã„。
- <form name="form">
- <button name="OK" text="OK"/>
- </form>
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="AvatarRezLeftNotification">
( [EXISTENCE] 秒)
@@ -2816,9 +2904,111 @@ M キーを押ã—ã¦å¤‰æ›´ã—ã¾ã™ã€‚
全員をミュートã—ã¾ã™ã‹ï¼Ÿ
<usetemplate ignoretext="グループコールã®å‚加者全員をミュートã™ã‚‹å‰ã®ç¢ºèª" name="okcancelignore" notext="å–り消ã—" yestext="OK"/>
</notification>
- <global name="UnsupportedCPU">
- - ã‚ãªãŸã® CPU ã®é€Ÿåº¦ã¯å¿…須動作環境ã®æ¡ä»¶ã‚’満ãŸã—ã¦ã„ã¾ã›ã‚“。
- </global>
+ <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="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>
<global name="UnsupportedGLRequirements">
[APP_NAME] ã«å¿…è¦ãªãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ãŒãªã„よã†ã§ã™ã€‚ [APP_NAME] ã«ã¯ãƒžãƒ«ãƒãƒ†ã‚¯ã‚¹ãƒãƒ£ã‚’サãƒãƒ¼ãƒˆã™ã‚‹ OpenGL グラフィックカードãŒå¿…è¦ã§ã™ã€‚ ãŠä½¿ã„ã®ã‚°ãƒ©ãƒ•ã‚£ãƒƒã‚¯ã‚«ãƒ¼ãƒ‰ã®æœ€æ–°ãƒ‰ãƒ©ã‚¤ãƒãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•ã‚Œã¦ã„ã‚‹ã‹ã©ã†ã‹ã€ã‚ªãƒšãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°ã‚·ã‚¹ãƒ†ãƒ ã®ã‚µãƒ¼ãƒ“スパックã¨ãƒ‘ッãƒãŒå…¥ã£ã¦ã„ã‚‹ã‹ã‚’ã”確èªãã ã•ã„。
diff --git a/indra/newview/skins/default/xui/ja/panel_avatar_list_item.xml b/indra/newview/skins/default/xui/ja/panel_avatar_list_item.xml
index 25864ec629..70d37c3bad 100644
--- a/indra/newview/skins/default/xui/ja/panel_avatar_list_item.xml
+++ b/indra/newview/skins/default/xui/ja/panel_avatar_list_item.xml
@@ -21,7 +21,7 @@
<string name="FormatYears">
[COUNT] å¹´
</string>
- <text name="avatar_name" value="ä¸æ˜Ž"/>
+ <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="ã“ã®ãƒ•ãƒ¬ãƒ³ãƒ‰ã¯ã€ã‚ãªãŸã®ã‚ªãƒ–ジェクトを編集・削除・å–å¾—ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_alpha.xml b/indra/newview/skins/default/xui/ja/panel_edit_alpha.xml
index f2e3e6e993..7250da69a4 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_alpha.xml
+++ b/indra/newview/skins/default/xui/ja/panel_edit_alpha.xml
@@ -1,10 +1,12 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_alpha_panel">
- <panel name="avatar_alpha_color_panel">
- <texture_picker label="アルファ&#10;(下)" name="Lower Alpha" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
- <texture_picker label="アルファ&#10;(上)" name="Upper Alpha" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
- <texture_picker label="頭部ã®ã‚¢&#10;ルファ" name="Head Alpha" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
- <texture_picker label="ç›®ã®ã‚¢ãƒ«ãƒ•ã‚¡" name="Eye Alpha" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
- <texture_picker label="髪ã®ã‚¢ãƒ«ãƒ•ã‚¡" name="Hair Alpha" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
- </panel>
+ <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/ja/panel_edit_gloves.xml b/indra/newview/skins/default/xui/ja/panel_edit_gloves.xml
index 83e9abca85..72eb120c3d 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_gloves.xml
+++ b/indra/newview/skins/default/xui/ja/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="色・色彩é…åˆ" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_jacket.xml b/indra/newview/skins/default/xui/ja/panel_edit_jacket.xml
index fe95061e57..ee39e9435c 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_jacket.xml
+++ b/indra/newview/skins/default/xui/ja/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="色・色彩é…åˆ" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_pants.xml b/indra/newview/skins/default/xui/ja/panel_edit_pants.xml
index 9f672337aa..6a1789c9f4 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_pants.xml
+++ b/indra/newview/skins/default/xui/ja/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="色・色彩é…åˆ" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_physics.xml b/indra/newview/skins/default/xui/ja/panel_edit_physics.xml
new file mode 100644
index 0000000000..6ebf0062dc
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/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/ja/panel_edit_pick.xml b/indra/newview/skins/default/xui/ja/panel_edit_pick.xml
index 4fb031b677..39ea1df1e3 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_pick.xml
+++ b/indra/newview/skins/default/xui/ja/panel_edit_pick.xml
@@ -29,7 +29,7 @@
<layout_panel name="layout_panel1">
<button label="ピックをä¿å­˜" name="save_changes_btn"/>
</layout_panel>
- <layout_panel name="layout_panel1">
+ <layout_panel name="layout_panel2">
<button label="å–り消ã—" name="cancel_btn"/>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_profile.xml b/indra/newview/skins/default/xui/ja/panel_edit_profile.xml
index 334cf54a4d..4cbd7f793b 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_profile.xml
+++ b/indra/newview/skins/default/xui/ja/panel_edit_profile.xml
@@ -26,6 +26,14 @@
<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="solo_user_name" value="Hamilton Hitchings"/>
+ <text name="user_name" value="Hamilton Hitchings"/>
+ <text name="user_name_small" value="Hamilton Hitchings"/>
+ <text name="user_label" value="ユーザーå:"/>
+ <text name="user_slid" value="hamilton.linden"/>
<panel name="lifes_images_panel">
<panel name="second_life_image_panel">
<text name="second_life_photo_title_text" value="[SECOND_LIFE]:"/>
@@ -46,7 +54,7 @@
<text name="my_account_link" value="[[URL] マイアカウントã«ç§»å‹•]"/>
<text name="title_partner_text" value="マイパートナー:"/>
<panel name="partner_data_panel">
- <name_box initial_value="(å–得中)" name="partner_text"/>
+ <text initial_value="(å–得中)" name="partner_text"/>
</panel>
<text name="partner_edit_link" value="[[URL] 編集]" width="100"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_shirt.xml b/indra/newview/skins/default/xui/ja/panel_edit_shirt.xml
index 457c0bceb8..f33daa4eba 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_shirt.xml
+++ b/indra/newview/skins/default/xui/ja/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="色・色彩é…åˆ" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_shoes.xml b/indra/newview/skins/default/xui/ja/panel_edit_shoes.xml
index 98b4c57fc7..c7626189af 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_shoes.xml
+++ b/indra/newview/skins/default/xui/ja/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/ja/panel_edit_skirt.xml b/indra/newview/skins/default/xui/ja/panel_edit_skirt.xml
index b169bab591..6efc4ce99a 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_skirt.xml
+++ b/indra/newview/skins/default/xui/ja/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="色・色彩é…åˆ" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_socks.xml b/indra/newview/skins/default/xui/ja/panel_edit_socks.xml
index b095257a56..71fc7c5682 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_socks.xml
+++ b/indra/newview/skins/default/xui/ja/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="色・色彩é…åˆ" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_underpants.xml b/indra/newview/skins/default/xui/ja/panel_edit_underpants.xml
index fec34479c3..f345a81922 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_underpants.xml
+++ b/indra/newview/skins/default/xui/ja/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="色・色彩é…åˆ" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_undershirt.xml b/indra/newview/skins/default/xui/ja/panel_edit_undershirt.xml
index bd47d89947..66b2ffa8ba 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_undershirt.xml
+++ b/indra/newview/skins/default/xui/ja/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="色・色彩é…åˆ" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_wearable.xml b/indra/newview/skins/default/xui/ja/panel_edit_wearable.xml
index 6cbed88ebc..000dac7b5b 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_wearable.xml
+++ b/indra/newview/skins/default/xui/ja/panel_edit_wearable.xml
@@ -45,6 +45,9 @@
<string name="edit_tattoo_title">
タトゥーを編集中
</string>
+ <string name="edit_physics_title">
+ 物ç†ä½œç”¨ã®ç·¨é›†ä¸­
+ </string>
<string name="shape_desc_text">
シェイプ:
</string>
@@ -90,6 +93,9 @@
<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">
diff --git a/indra/newview/skins/default/xui/ja/panel_group_land_money.xml b/indra/newview/skins/default/xui/ja/panel_group_land_money.xml
index 016dc97ab6..82be58a0fb 100644
--- a/indra/newview/skins/default/xui/ja/panel_group_land_money.xml
+++ b/indra/newview/skins/default/xui/ja/panel_group_land_money.xml
@@ -24,6 +24,7 @@
<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">
寄付åˆè¨ˆï¼š
diff --git a/indra/newview/skins/default/xui/ja/panel_login.xml b/indra/newview/skins/default/xui/ja/panel_login.xml
index 808f19a16d..ac1fe455c7 100644
--- a/indra/newview/skins/default/xui/ja/panel_login.xml
+++ b/indra/newview/skins/default/xui/ja/panel_login.xml
@@ -11,12 +11,19 @@
<text name="username_text">
ユーザーãƒãƒ¼ãƒ ï¼š
</text>
- <line_editor label="ユーザーãƒãƒ¼ãƒ " name="username_edit" tool_tip="[SECOND_LIFE] ユーザーãƒãƒ¼ãƒ "/>
+ <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>
@@ -31,7 +38,7 @@
ãŠç”³ã—è¾¼ã¿
</text>
<text name="forgot_password_text">
- åå‰ã¾ãŸã¯ãƒ‘スワードをãŠå¿˜ã‚Œã§ã™ã‹ï¼Ÿ
+ ユーザーåã¾ãŸã¯ãƒ‘スワードをãŠå¿˜ã‚Œã§ã™ã‹ï¼Ÿ
</text>
<text name="login_help">
ログインã®æ–¹æ³•
diff --git a/indra/newview/skins/default/xui/ja/panel_my_profile.xml b/indra/newview/skins/default/xui/ja/panel_my_profile.xml
index 94c5a6a4b7..a0d99ba5a8 100644
--- a/indra/newview/skins/default/xui/ja/panel_my_profile.xml
+++ b/indra/newview/skins/default/xui/ja/panel_my_profile.xml
@@ -16,34 +16,27 @@
<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">
- <icon label="" name="2nd_life_edit_icon" tool_tip="下ã®ã€Œãƒ—ロフィールã®ç·¨é›†ã€ãƒœã‚¿ãƒ³ã‚’押ã—ã¦ç”»åƒã‚’変更ã—ã¾ã™"/>
- <text name="title_sl_descr_text" value="[SECOND_LIFE]:"/>
- </panel>
- <panel name="first_life_image_panel">
- <icon label="" name="real_world_edit_icon" tool_tip="下ã®ã€Œãƒ—ロフィールã®ç·¨é›†ã€ãƒœã‚¿ãƒ³ã‚’押ã—ã¦ç”»åƒã‚’変更ã—ã¾ã™"/>
- <text name="title_rw_descr_text" value="ç¾å®Ÿä¸–界:"/>
- </panel>
- <text name="title_member_text" value="メンãƒãƒ¼ç™»éŒ²ï¼š"/>
- <text name="title_acc_status_text" value="アカウントã®çŠ¶æ…‹ï¼š"/>
- <text_editor name="acc_status_text">
- ä½äººã€‚ 支払情報未登録。
- リンデン。
- </text_editor>
- <text name="title_partner_text" value="パートナー:"/>
- <panel name="partner_data_panel">
- <name_box initial_value="(å–得中)" name="partner_text"/>
+ <text name="display_name_descr_text">
+ ユーザーå
+ </text>
+ <text name="name_descr_text">
+ 表示å
+ </text>
+ <button label="プロフィール" name="see_profile_btn" tool_tip="ã“ã®ã‚¢ãƒã‚¿ãƒ¼ã®ãƒ—ロフィールを表示"/>
</panel>
- <text name="title_groups_text" value="グループ:"/>
</panel>
</scroll_container>
</layout_panel>
</layout_stack>
- <panel name="profile_me_buttons_panel">
- <button label="プロフィールã®ç·¨é›†" name="edit_profile_btn" tool_tip="個人的ãªæƒ…報を編集ã—ã¾ã™"/>
- </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_nearby_media.xml b/indra/newview/skins/default/xui/ja/panel_nearby_media.xml
index 07293e6c79..c29ec64304 100644
--- a/indra/newview/skins/default/xui/ja/panel_nearby_media.xml
+++ b/indra/newview/skins/default/xui/ja/panel_nearby_media.xml
@@ -19,7 +19,7 @@
<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="アドãƒãƒ³ã‚¹ã‚³ãƒ³ãƒˆãƒ­ãƒ¼ãƒ«"/>
+ <button label="詳細 &gt;&gt;" label_selected="&lt;&lt; 簡易" name="more_btn" tool_tip="アドãƒãƒ³ã‚¹ã‚³ãƒ³ãƒˆãƒ­ãƒ¼ãƒ«"/>
<button label="詳細 &gt;&gt;" label_selected="簡易 &lt;&lt;" name="less_btn" tool_tip="アドãƒãƒ³ã‚¹ã‚³ãƒ³ãƒˆãƒ­ãƒ¼ãƒ«"/>
</panel>
<panel name="nearby_media_panel">
diff --git a/indra/newview/skins/default/xui/ja/panel_notify_textbox.xml b/indra/newview/skins/default/xui/ja/panel_notify_textbox.xml
new file mode 100644
index 0000000000..8e0cf4bc9d
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/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/ja/panel_people.xml b/indra/newview/skins/default/xui/ja/panel_people.xml
index f2ccddc9de..1c90f7327e 100644
--- a/indra/newview/skins/default/xui/ja/panel_people.xml
+++ b/indra/newview/skins/default/xui/ja/panel_people.xml
@@ -18,11 +18,13 @@
<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">
- <button name="nearby_view_sort_btn" tool_tip="オプション"/>
+ <menu_button name="nearby_view_sort_btn" tool_tip="オプション"/>
<button name="add_friend_btn" tool_tip="é¸æŠžã—ãŸä½äººã‚’フレンドリストã«ç™»éŒ²"/>
</panel>
</panel>
@@ -34,27 +36,27 @@
<panel label="bottom_panel" name="bottom_panel">
<layout_stack name="bottom_panel">
<layout_panel name="options_gear_btn_panel">
- <button name="friends_viewsort_btn" tool_tip="オプションを表示ã—ã¾ã™"/>
+ <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="trash_btn" tool_tip="é¸æŠžã—ãŸäººã‚’フレンドリストã‹ã‚‰å‰Šé™¤"/>
+ <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">
- <button name="groups_viewsort_btn" tool_tip="オプション"/>
+ <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">
- <button name="recent_viewsort_btn" tool_tip="オプション"/>
+ <menu_button name="recent_viewsort_btn" tool_tip="オプション"/>
<button name="add_friend_btn" tool_tip="é¸æŠžã—ãŸä½äººã‚’フレンドリストã«ç™»éŒ²"/>
</panel>
</panel>
@@ -64,16 +66,16 @@
<layout_panel name="view_profile_btn_lp">
<button label="プロフィール" name="view_profile_btn" tool_tip="写真ã€ã‚°ãƒ«ãƒ¼ãƒ—ã€ãã®ä»–ä½äººæƒ…報を表示"/>
</layout_panel>
- <layout_panel name="chat_btn_lp">
+ <layout_panel name="im_btn_lp">
<button label="IM" name="im_btn" tool_tip="インスタントメッセージを開ãã¾ã™"/>
</layout_panel>
- <layout_panel name="chat_btn_lp">
+ <layout_panel name="call_btn_lp">
<button label="コール" name="call_btn" tool_tip="ã“ã®ä½äººã«ã‚³ãƒ¼ãƒ«ã™ã‚‹"/>
</layout_panel>
- <layout_panel name="chat_btn_lp">
+ <layout_panel name="share_btn_lp">
<button label="共有" name="share_btn" tool_tip="「æŒã¡ç‰©ã€ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’共有ã™ã‚‹"/>
</layout_panel>
- <layout_panel name="chat_btn_lp">
+ <layout_panel name="teleport_btn_lp">
<button label="テレãƒãƒ¼ãƒˆ" name="teleport_btn" tool_tip="テレãƒãƒ¼ãƒˆã‚’é€ã‚Šã¾ã™"/>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/ja/panel_place_profile.xml b/indra/newview/skins/default/xui/ja/panel_place_profile.xml
index b897e1d748..8a40d7aa5a 100644
--- a/indra/newview/skins/default/xui/ja/panel_place_profile.xml
+++ b/indra/newview/skins/default/xui/ja/panel_place_profile.xml
@@ -80,7 +80,7 @@
<text name="region_rating_label" value="レーティング:"/>
<text name="region_rating" value="Adult"/>
<text name="region_owner_label" value="所有者:"/>
- <text name="region_owner" value="moose Van Moose"/>
+ <text name="region_owner" value="moose Van Moose extra long name moose"/>
<text name="region_group_label" value="グループ:"/>
<text name="region_group">
The Mighty Moose of mooseville soundvillemoose
@@ -93,6 +93,7 @@
<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>
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/ja/panel_preferences_advanced.xml
index fdf33b5402..ccc5c3908b 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_advanced.xml
@@ -3,35 +3,16 @@
<panel.string name="aspect_ratio_text">
[NUM]:[DEN]
</panel.string>
- <panel.string name="middle_mouse">
- マウスã®ä¸­å¤®
- </panel.string>
- <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="編集モードã«å…¥ã£ãŸã¨ãã«ã€è‡ªå‹•ã‚«ãƒ¡ãƒ©ãƒã‚¸ã‚·ãƒ§ãƒ³ã‚’使ã„ã¾ã™"/>
- <check_box initial_value="true" label="サイドãƒãƒ¼" name="appearance_sidebar_positioning" tool_tip="サイドãƒãƒ¼ã®åˆ‡ã‚Šæ›¿ãˆæ™‚ã«è‡ªå‹•ã‚«ãƒ¡ãƒ©ãƒã‚¸ã‚·ãƒ§ãƒ³ã‚’使ã„ã¾ã™"/>
- <check_box label="一人称視点ã§è¡¨ç¤ºã™ã‚‹" name="first_person_avatar_visible"/>
- <check_box label="常ã«ã‚­ãƒ¼æ“作ã§å‹•ãよã†ã«ã™ã‚‹" name="arrow_keys_move_avatar_check"/>
- <check_box label="上矢å°ã‚­ãƒ¼2度押ã—+長押ã—ã§èµ°ã‚‹" name="tap_tap_hold_to_run"/>
- <check_box label="話ã™ã¨ãã«ã‚¢ãƒã‚¿ãƒ¼ã®å£ã‚’å‹•ã‹ã™" name="enable_lip_sync"/>
- <check_box label="å¹ã出ã—ãƒãƒ£ãƒƒãƒˆ" name="bubble_text_chat"/>
- <slider label="é€æ˜Žåº¦" name="bubble_chat_opacity"/>
- <color_swatch name="background" tool_tip="å¹ã出ã—ãƒãƒ£ãƒƒãƒˆã®è‰²ã‚’é¸æŠžã—ã¾ã™"/>
<text name="UI Size:">
- UI サイズ
+ UI サイズ:
</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="push_to_talk_toggle_check" tool_tip="トグルモードã®æ™‚ã«ãƒˆãƒªã‚¬ãƒ¼ã‚­ãƒ¼ã‚’ 1 度押ã—ã¦æ”¾ã™ã¨ã€ãƒžã‚¤ã‚¯ã®ã‚ªãƒ³ãƒ»ã‚ªãƒ•è¨­å®šã‚’切り替ãˆã¾ã™ã€‚ トグルモードã§ã¯ãªã„ã¨ãã¯ã€ãƒˆãƒªã‚¬ãƒ¼ã‚­ãƒ¼ã‚’押ã—ãŸçŠ¶æ…‹ã®æ™‚ã®ã¿ã‚ãªãŸã®å£°ãŒç›¸æ‰‹ã«èžã“ãˆã¾ã™ã€‚"/>
- <line_editor label="プッシュ・トゥ・スピークã®ãƒˆãƒªã‚¬ãƒ¼" name="modifier_combo"/>
- <button label="キー設定" name="set_voice_hotkey_button"/>
- <button label="マウスã®ä¸­å¤®ãƒœã‚¿ãƒ³" name="set_voice_middlemouse_button" tool_tip="マウスã®ä¸­å¤®ãƒœã‚¿ãƒ³ã«ãƒªã‚»ãƒƒãƒˆã—ã¾ã™"/>
- <button label="ãã®ä»–ã®ãƒ‡ã‚£ãƒã‚¤ã‚¹" name="joystick_setup_button"/>
+ <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/ja/panel_preferences_chat.xml b/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml
index ce2a0f35e4..5038140ce5 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml
@@ -8,44 +8,10 @@
<radio_item label="中" name="radio2" value="1"/>
<radio_item label="大" name="radio3" value="2"/>
</radio_group>
- <text name="font_colors">
- 文字ã®è‰²ï¼š
- </text>
- <color_swatch label="自分" name="user"/>
- <text name="text_box1">
- 自分
- </text>
- <color_swatch label="ãã®ä»–" name="agent"/>
- <text name="text_box2">
- 他人
- </text>
- <color_swatch label="IM" name="im"/>
- <text name="text_box3">
- IM
- </text>
- <color_swatch label="システム" name="system"/>
- <text name="text_box4">
- システム
- </text>
- <color_swatch label="エラー" name="script_error"/>
- <text name="text_box5">
- エラー
- </text>
- <color_swatch label="オブジェクト" name="objects"/>
- <text name="text_box6">
- オブジェクト
- </text>
- <color_swatch label="所有者" name="owner"/>
- <text name="text_box7">
- 所有者
- </text>
- <color_swatch label="URL" name="links"/>
- <text name="text_box9">
- URL
- </text>
<check_box initial_value="true" label="ãƒãƒ£ãƒƒãƒˆä¸­ã«ã‚¿ã‚¤ãƒ”ング動作ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’å†ç”Ÿ" name="play_typing_animation"/>
<check_box label="オフライン時ã«å—ã‘å–ã£ãŸ IM をメールã§å—ä¿¡" name="send_im_to_email"/>
<check_box label="IM ã¨ãƒãƒ£ãƒƒãƒˆå±¥æ­´ã«æ–‡å­—ã ã‘表示ã™ã‚‹" name="plain_text_chat_history"/>
+ <check_box label="å¹ã出ã—ãƒãƒ£ãƒƒãƒˆ" name="bubble_text_chat"/>
<text name="show_ims_in_label">
IM ã®è¡¨ç¤ºæ–¹æ³•ï¼š
</text>
@@ -56,8 +22,17 @@
<radio_item label="別々ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦" name="radio" value="0"/>
<radio_item label="タブ" name="radio2" value="1"/>
</radio_group>
- <check_box name="translate_chat_checkbox"/>
- <text name="translate_chb_label" >ãƒãƒ£ãƒƒãƒˆä¸­ã«å†…容を機械翻訳ã™ã‚‹ï¼ˆGoogle翻訳)</text>
+ <text name="disable_toast_label">
+ å—ä¿¡ãƒãƒ£ãƒƒãƒˆã®ãƒãƒƒãƒ—アップを有効ã«ã™ã‚‹
+ </text>
+ <check_box label="グループãƒãƒ£ãƒƒãƒˆ" name="EnableGroupChatPopups" tool_tip="ã“れをé¸æŠžã™ã‚‹ã¨ã€ã‚°ãƒ«ãƒ¼ãƒ—ãƒãƒ£ãƒƒãƒˆãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å—ä¿¡ã—ãŸéš›ã«ãƒãƒƒãƒ—アップãŒè¡¨ç¤ºã•ã‚Œã¾ã™"/>
+ <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>
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_colors.xml b/indra/newview/skins/default/xui/ja/panel_preferences_colors.xml
new file mode 100644
index 0000000000..9f6abf8fcb
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/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/ja/panel_preferences_general.xml b/indra/newview/skins/default/xui/ja/panel_preferences_general.xml
index 751faff1d8..e4091972d6 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_general.xml
@@ -44,16 +44,22 @@
<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 initial_value="true" label="å°ã•ã„ã‚¢ãƒã‚¿ãƒ¼å" name="small_avatar_names_checkbox"/>
- <check_box label="グループタイトルを表示" name="show_all_title_checkbox1"/>
- <text name="effects_color_textbox">
- ビームã®è‰²ï¼š
+ <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="オフィサーã¾ãŸã¯ãƒ¡ãƒ³ãƒãƒ¼ãªã©ã€ã‚°ãƒ«ãƒ¼ãƒ—タイトルを表示"/>
+ <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>
+ <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>
- <color_swatch label="" name="effect_color_swatch" tool_tip="クリックã§ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
<combo_box label="一時退席ã¾ã§ã®æ™‚間:" name="afk">
<combo_box.item label="2 分" name="item0"/>
<combo_box.item label="5 分" name="item1"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/ja/panel_preferences_graphics1.xml
index 92635182c8..1786b4befc 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_graphics1.xml
@@ -25,9 +25,22 @@
<text name="ShadersText">
シェーダー:
</text>
+ <check_box initial_value="true" label="é€æ˜Žãªæ°´" name="TransparentWater"/>
<check_box initial_value="true" label="ãƒãƒ³ãƒ—マッピングã¨å…‰æ²¢" name="BumpShiny"/>
+ <check_box initial_value="true" label="è¿‘ãã®å…‰" name="LocalLights"/>
<check_box initial_value="true" label="基本シェーダー" name="BasicShaders" tool_tip="ã“ã®ã‚ªãƒ—ションを無効ã«ã™ã‚‹ã¨ã€ã‚°ãƒ©ãƒ•ã‚£ãƒƒã‚¯ã‚«ãƒ¼ãƒ‰ã®ãƒ‰ãƒ©ã‚¤ãƒã®ç¨®é¡žã«ã‚ˆã£ã¦ã¯ã€ã‚¯ãƒ©ãƒƒã‚·ãƒ¥ã™ã‚‹ã®ã‚’防ãŽã¾ã™ã€‚"/>
<check_box initial_value="true" label="周囲(大気)シェーダー" name="WindLightUseAtmosShaders"/>
+ <check_box initial_value="true" label="å…‰ã¨å½±" name="UseLightShaders"/>
+ <check_box initial_value="true" label="アンビエントオクルージョン" name="UseSSAO"/>
+ <check_box initial_value="true" 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>
@@ -38,6 +51,10 @@
<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">
m
@@ -76,7 +93,7 @@
低
</text>
<text name="AvatarRenderingText">
- ã‚¢ãƒã‚¿ãƒ¼è¡¨ç¤ºï¼š
+ ã‚¢ãƒã‚¿ãƒ¼ãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°ï¼š
</text>
<check_box initial_value="true" label="ã‚¢ãƒã‚¿ãƒ¼ã®æ画を簡略化" name="AvatarImpostors"/>
<check_box initial_value="true" label="ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã‚¹ã‚­ãƒ‹ãƒ³ã‚°" name="AvatarVertexProgram"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_move.xml b/indra/newview/skins/default/xui/ja/panel_preferences_move.xml
new file mode 100644
index 0000000000..806bcfc14a
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_move.xml
@@ -0,0 +1,24 @@
+<?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="編集モードã«å…¥ã£ãŸã¨ãã«ã€è‡ªå‹•ã‚«ãƒ¡ãƒ©ãƒã‚¸ã‚·ãƒ§ãƒ³ã‚’使ã„ã¾ã™"/>
+ <check_box initial_value="true" label="サイドãƒãƒ¼" name="appearance_sidebar_positioning" tool_tip="サイドãƒãƒ¼ã«è‡ªå‹•ã‚«ãƒ¡ãƒ©ãƒã‚¸ã‚·ãƒ§ãƒ³ã‚’使ã„ã¾ã™"/>
+ <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>
+ <button label="ãã®ä»–ã®ãƒ‡ã‚£ãƒã‚¤ã‚¹" name="joystick_setup_button"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/ja/panel_preferences_privacy.xml
index b81889b412..420bbed572 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_privacy.xml
@@ -7,19 +7,24 @@
<text name="cache_size_label_l">
(ä½ç½®ã€ç”»åƒã€webã€æ¤œç´¢å±¥æ­´ï¼‰
</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="Cookie ã‚’å—ã‘入れる" name="cookies_enabled"/>
+ <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="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/ja/panel_preferences_setup.xml b/indra/newview/skins/default/xui/ja/panel_preferences_setup.xml
index 653d9fd3b3..18c41cea38 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_setup.xml
@@ -1,13 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="セットアップ" name="Input panel">
- <button label="ãã®ä»–ã®ãƒ‡ã‚£ãƒã‚¤ã‚¹" name="joystick_setup_button"/>
- <text name="Mouselook:">
- 一人称視点:
- </text>
- <text name=" Mouse Sensitivity">
- マウスã®æ„Ÿåº¦
- </text>
- <check_box label="切り替ãˆ" name="invert_mouse"/>
<text name="Network:">
ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ï¼š
</text>
@@ -40,10 +32,18 @@
<check_box initial_value="true" label="プラグインを有効ã«ã™ã‚‹" name="browser_plugins_enabled"/>
<check_box initial_value="true" label="Cookie ã‚’å—ã‘入れる" name="cookies_enabled"/>
<check_box initial_value="true" label="Javascript を有効ã«ã™ã‚‹" name="browser_javascript_enabled"/>
+ <check_box initial_value="false" label="メディアブラウザã®ãƒãƒƒãƒ—アップを有効ã«ã™ã‚‹" name="media_popup_enabled"/>
<check_box initial_value="false" label="Web プロキシを有効ã«ã™ã‚‹" name="web_proxy_enabled"/>
<text name="Proxy location">
プロキシ:
</text>
<line_editor name="web_proxy_editor" tool_tip="使用ã™ã‚‹ãƒ—ロキシã®ãƒ›ã‚¹ãƒˆåã¾ãŸã¯ IP アドレス"/>
<spinner label="ãƒãƒ¼ãƒˆç•ªå·ï¼š" name="web_proxy_port"/>
+ <text name="Software updates:">
+ ソフトウェアアップデート:
+ </text>
+ <combo_box name="updater_service_combobox">
+ <combo_box.item label="自動的ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«" name="Install_automatically"/>
+ <combo_box.item label="手動ã§ã‚¢ãƒƒãƒ—デートをダウンロード&amp;インストール" name="Install_manual"/>
+ </combo_box>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml b/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml
index 74696a3b35..c11e636875 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml
@@ -1,8 +1,13 @@
<?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="true" name="mute_when_minimized"/>
- <text name="mute_chb_label">最å°åŒ–ã§ãƒŸãƒ¥ãƒ¼ãƒˆ</text>
+ <check_box initial_value="true" label="Mute when minimized" 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"/>
@@ -24,6 +29,11 @@
<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="トグルモードã®æ™‚ã«ãƒˆãƒªã‚¬ãƒ¼ã‚­ãƒ¼ã‚’1度押ã—ã¦æ”¾ã™ã¨ã€ãƒžã‚¤ã‚¯ã®ã‚ªãƒ³ãƒ»ã‚ªãƒ•è¨­å®šã‚’切り替ãˆã¾ã™ã€‚トグルモードã§ã¯ãªã„ã¨ãã¯ã€ãƒˆãƒªã‚¬ãƒ¼ã‚­ãƒ¼ã‚’押ã—ãŸçŠ¶æ…‹ã®æ™‚ã®ã¿ã‚ãªãŸã®å£°ãŒç›¸æ‰‹ã«èžã“ãˆã¾ã™ã€‚"/>
+ <line_editor label="プッシュ・トゥ・スピークã®ãƒˆãƒªã‚¬ãƒ¼" 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.string name="default_text">
diff --git a/indra/newview/skins/default/xui/ja/panel_profile.xml b/indra/newview/skins/default/xui/ja/panel_profile.xml
index c2ffd74ec0..1acad9f81a 100644
--- a/indra/newview/skins/default/xui/ja/panel_profile.xml
+++ b/indra/newview/skins/default/xui/ja/panel_profile.xml
@@ -16,6 +16,12 @@
<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">
@@ -34,7 +40,7 @@
</text_editor>
<text name="title_partner_text" value="パートナー:"/>
<panel name="partner_data_panel">
- <name_box initial_value="(å–得中)" name="partner_text"/>
+ <text initial_value="(å–得中)" name="partner_text"/>
</panel>
<text name="title_groups_text" value="グループ:"/>
</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
index 82807bc8fc..5cb6575773 100644
--- a/indra/newview/skins/default/xui/ja/panel_profile_view.xml
+++ b/indra/newview/skins/default/xui/ja/panel_profile_view.xml
@@ -6,7 +6,14 @@
<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"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_region_general.xml b/indra/newview/skins/default/xui/ja/panel_region_general.xml
index 54ec24773f..65148cf1ee 100644
--- a/indra/newview/skins/default/xui/ja/panel_region_general.xml
+++ b/indra/newview/skins/default/xui/ja/panel_region_general.xml
@@ -25,6 +25,7 @@
<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="ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã§ãƒ¡ãƒƒã‚·ãƒ¥ã‚ªãƒ–ジェクト㮠Rez を許å¯ã™ã‚‹"/>
<spinner label="ã‚¢ãƒã‚¿ãƒ¼æ•°ä¸Šé™" name="agent_limit_spin"/>
<spinner label="物体ボーナス" name="object_bonus_spin"/>
<text label="æˆäººæŒ‡å®š" name="access_text">
diff --git a/indra/newview/skins/default/xui/ja/panel_script_ed.xml b/indra/newview/skins/default/xui/ja/panel_script_ed.xml
index a7305fa763..9fdd16d567 100644
--- a/indra/newview/skins/default/xui/ja/panel_script_ed.xml
+++ b/indra/newview/skins/default/xui/ja/panel_script_ed.xml
@@ -15,11 +15,9 @@
<panel.string name="Title">
スクリプト: [NAME]
</panel.string>
- <text_editor name="Script Editor">
- ローディング...
- </text_editor>
- <button label="ä¿å­˜" label_selected="ä¿å­˜" name="Save_btn"/>
- <combo_box label="挿入..." name="Insert..."/>
+ <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"/>
@@ -40,4 +38,10 @@
<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/ja/panel_scrolling_param_base.xml b/indra/newview/skins/default/xui/ja/panel_scrolling_param_base.xml
new file mode 100644
index 0000000000..fa659040ea
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/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/ja/panel_sound_devices.xml b/indra/newview/skins/default/xui/ja/panel_sound_devices.xml
new file mode 100644
index 0000000000..da103a2d60
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_sound_devices.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<panel label="機器ã®è¨­å®š" name="device_settings_panel">
+ <panel.string name="default_text">
+ デフォルト
+ </panel.string>
+ <text name="Input">
+ 入力
+ </text>
+ <text name="My volume label">
+ ç§ã®éŸ³é‡ï¼š
+ </text>
+ <slider_bar initial_value="1.0" name="mic_volume_slider" tool_tip="スライダーを使ã£ã¦éŸ³é‡ã‚’調節ã—ã¾ã™"/>
+ <text name="wait_text">
+ ã—ã°ã‚‰ããŠå¾…ã¡ãã ã•ã„。
+ </text>
+ <text name="Output">
+ 出力
+ </text>
+</panel>
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 c3a5127981..163064484b 100644
--- a/indra/newview/skins/default/xui/ja/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/ja/panel_status_bar.xml
@@ -22,7 +22,7 @@
L$ [AMT]
</panel.string>
<panel name="balance_bg">
- <text name="balance" tool_tip="残高" value="L$20"/>
+ <text name="balance" tool_tip="クリックã—㦠L$ 残高を更新" value="L$20"/>
<button label="L$ ã®è³¼å…¥" name="buyL" tool_tip="クリックã—㦠L$ を購入ã—ã¾ã™"/>
</panel>
<text name="TimeText" tool_tip="ç¾åœ¨æ™‚刻(太平洋)">
diff --git a/indra/newview/skins/default/xui/ja/role_actions.xml b/indra/newview/skins/default/xui/ja/role_actions.xml
index 0a63cedf10..c53ad838f7 100644
--- a/indra/newview/skins/default/xui/ja/role_actions.xml
+++ b/indra/newview/skins/default/xui/ja/role_actions.xml
@@ -39,6 +39,7 @@
<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"/>
@@ -57,20 +58,16 @@
<action description="グループ所有オブジェクトã®æ“作(移動ã€ã‚³ãƒ”ーã€ä¿®æ­£ï¼‰" longdescription="「制作ツール〠&gt; 「一般ã€ã‚¿ãƒ–ã§ã€ã‚°ãƒ«ãƒ¼ãƒ—所有ã®ã‚ªãƒ–ジェクトをæ“作(移動ã€ã‚³ãƒ”ーã€ä¿®æ­£ï¼‰ã—ã¾ã™ã€‚" name="object manipulate" value="38"/>
<action description="グループ所有オブジェクトを販売å¯èƒ½ã«è¨­å®š" longdescription="「制作ツール〠&gt; 「一般ã€ã‚¿ãƒ–ã§ã€ã‚°ãƒ«ãƒ¼ãƒ—所有ã®ã‚ªãƒ–ジェクトを販売対象ã«è¨­å®šã—ã¾ã™ã€‚" name="object set sale" value="39"/>
</action_set>
- <action_set description="ã“れらã®èƒ½åŠ›ã«ã¯ã€ãƒ¡ãƒ³ãƒãƒ¼ã«ã€ã‚°ãƒ«ãƒ¼ãƒ—ã®è² å‚µã®æ”¯æ‰•ã„ã¨åˆ©å­å—ã‘å–ã‚Šã‚’è¦æ±‚ã™ã‚‹æ¨©é™ã€ã‚°ãƒ«ãƒ¼ãƒ—å£åº§å±¥æ­´ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’制é™ã™ã‚‹æ¨©é™ãŒå«ã¾ã‚Œã¾ã™ã€‚" name="Accounting"><action description="グループ負債ã®è¿”済ã¨ã‚°ãƒ«ãƒ¼ãƒ—é…当ã®å—é ˜" longdescription="ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã«ã¤ã„ã¦ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—負債ã®æ”¯æ‰•ã„ã¨ã‚°ãƒ«ãƒ¼ãƒ—é…当ã®å—ã‘å–ã‚ŠãŒè‡ªå‹•çš„ã«è¡Œã‚ã‚Œã¾ã™ã€‚
- ã¤ã¾ã‚Šã€ã“れらã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€æ¯Žæ—¥é…当ã•ã‚Œã‚‹ã‚°ãƒ«ãƒ¼ãƒ—所有地ã®å£²ã‚Šä¸Šã’金ã®ä¸€éƒ¨ã‚’å—ã‘å–ã‚‹ã¨å…±ã«ã€åŒºç”»ã®åºƒå‘Šè²»ãªã©ã‚’è² æ‹…ã™ã‚‹ã“ã¨ã«ãªã‚Šã¾ã™ã€‚" name="accounting accountable" value="40"/>
+ <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="Proposals">
- <action description="æ案を作æˆ" longdescription="ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€æŠ•ç¥¨ã®å¯¾è±¡ã¨ãªã‚‹å•é¡Œæ起を「グループ情報ã€ï¼žã€Œå•é¡Œæèµ·ã€ã‚¿ãƒ–上ã§ä½œæˆã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚" name="proposal start" value="44"/>
- <action description="å•é¡Œæèµ·ã«æŠ•ç¥¨ã™ã‚‹" longdescription="ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—情報>æ案タブã§æ案ã«æŠ•ç¥¨ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚" name="proposal vote" value="45"/>
- </action_set>
<action_set description=" ã“れらã®èƒ½åŠ›ã«ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—ãƒãƒ£ãƒƒãƒˆã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚„グループボイスãƒãƒ£ãƒƒãƒˆã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã®è¨±å¯ã‚„制é™ã®æ¨©é™ãŒå«ã¾ã‚Œã¾ã™ã€‚ " name="Chat">
- <action description="グループãƒãƒ£ãƒƒãƒˆã«å‚加ã™ã‚‹" longdescription=" ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—ãƒãƒ£ãƒƒãƒˆã‚»ãƒƒã‚·ãƒ§ãƒ³ã«ãƒ†ã‚­ã‚¹ãƒˆãŠã‚ˆã³ãƒœã‚¤ã‚¹ã§å‚加ã§ãã¾ã™ã€‚ " name="join group chat"/>
- <action description="グループボイスãƒãƒ£ãƒƒãƒˆã«å‚加ã™ã‚‹" longdescription=" ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—ボイスãƒãƒ£ãƒƒãƒˆã‚»ãƒƒã‚·ãƒ§ãƒ³ã«å‚加ã§ãã¾ã™ã€‚ 注: ボイスãƒãƒ£ãƒƒãƒˆã‚»ãƒƒã‚·ãƒ§ãƒ³ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã«ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—ãƒãƒ£ãƒƒãƒˆã«å‚加ã™ã‚‹èƒ½åŠ›ãŒå¿…è¦ã§ã™ã€‚ " name="join voice chat"/>
- <action description="グループãƒãƒ£ãƒƒãƒˆã‚’管ç†ã™ã‚‹" longdescription=" ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—ボイスãƒãƒ£ãƒƒãƒˆã‚»ãƒƒã‚·ãƒ§ãƒ³ãŠã‚ˆã³ã‚°ãƒ«ãƒ¼ãƒ—テキストãƒãƒ£ãƒƒãƒˆã‚»ãƒƒã‚·ãƒ§ãƒ³ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚„å‚加をコントロールã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ " name="moderate group chat"/>
+ <action description="グループãƒãƒ£ãƒƒãƒˆã«å‚加ã™ã‚‹" longdescription=" ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—ãƒãƒ£ãƒƒãƒˆã‚»ãƒƒã‚·ãƒ§ãƒ³ã«ãƒ†ã‚­ã‚¹ãƒˆãŠã‚ˆã³ãƒœã‚¤ã‚¹ã§å‚加ã§ãã¾ã™ã€‚ " name="join group chat" value="16"/>
+ <action description="グループボイスãƒãƒ£ãƒƒãƒˆã«å‚加ã™ã‚‹" longdescription=" ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—ボイスãƒãƒ£ãƒƒãƒˆã‚»ãƒƒã‚·ãƒ§ãƒ³ã«å‚加ã§ãã¾ã™ã€‚ 注: ボイスãƒãƒ£ãƒƒãƒˆã‚»ãƒƒã‚·ãƒ§ãƒ³ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã«ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—ãƒãƒ£ãƒƒãƒˆã«å‚加ã™ã‚‹èƒ½åŠ›ãŒå¿…è¦ã§ã™ã€‚ " name="join voice chat" value="27"/>
+ <action description="グループãƒãƒ£ãƒƒãƒˆã‚’管ç†ã™ã‚‹" longdescription=" ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—ボイスãƒãƒ£ãƒƒãƒˆã‚»ãƒƒã‚·ãƒ§ãƒ³ãŠã‚ˆã³ã‚°ãƒ«ãƒ¼ãƒ—テキストãƒãƒ£ãƒƒãƒˆã‚»ãƒƒã‚·ãƒ§ãƒ³ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚„å‚加をコントロールã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ " name="moderate group chat" value="37"/>
</action_set>
</role_actions>
diff --git a/indra/newview/skins/default/xui/ja/strings.xml b/indra/newview/skins/default/xui/ja/strings.xml
index 75cb126874..fa6d25d238 100644
--- a/indra/newview/skins/default/xui/ja/strings.xml
+++ b/indra/newview/skins/default/xui/ja/strings.xml
@@ -130,6 +130,139 @@
<string name="create_account_url">
http://join.secondlife.com/index.php?lang=ja-JP
</string>
+ <string name="LoginFailedViewerNotPermitted">
+ ãŠä½¿ã„ã®å¤ã„ビューワã§ã¯ Second Life ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã›ã‚“。以下ã®ãƒšãƒ¼ã‚¸ã‹ã‚‰æ–°ã—ã„ビューワをダウンロードã—ã¦ãã ã•ã„:
+http://secondlife.com/download
+
+詳細ã«ã¤ã„ã¦ã¯ã€FAQ ã‚’å‚ç…§ã—ã¦ãã ã•ã„:
+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">
+ ログアウトをリスクエストã—ãŸã‚‰ã€ã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚¿ãƒ¼ã‹ã‚‰ã€Œfaultã€ãŒè¿”ã•ã‚Œã¾ã—ãŸã€‚
+ </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>
@@ -206,6 +339,9 @@
<string name="TooltipAgentUrl">
クリックã—ã¦ã“ã®ä½äººã®ãƒ—ロフィールを見ã¾ã™
</string>
+ <string name="TooltipAgentInspect">
+ ã“ã®ä½äººã®è©³ç´°ã‚’å‚ç…§
+ </string>
<string name="TooltipAgentMute">
クリックã—ã¦ã“ã®ä½äººã«å¯¾ã—ã¦ç„¡è¦–設定をã—ã¾ã™
</string>
@@ -438,6 +574,9 @@
<string name="symbolic folder link">
フォルダã®ãƒªãƒ³ã‚¯
</string>
+ <string name="mesh">
+ メッシュ
+ </string>
<string name="AvatarEditingAppearance">
(容姿ã®ç·¨é›†ä¸­ï¼‰
</string>
@@ -762,6 +901,12 @@
<string name="Estate / Full Region">
ä¸å‹•ç”£ / フルリージョン
</string>
+ <string name="Estate / Homestead">
+ エステート/ホームステッド
+ </string>
+ <string name="Mainland / Homestead">
+ メインランド/ホームステッド
+ </string>
<string name="Mainland / Full Region">
メインランド / フルリージョン
</string>
@@ -867,6 +1012,9 @@
<string name="tattoo">
タトゥ
</string>
+ <string name="physics">
+ 物ç†ä½œç”¨
+ </string>
<string name="invalid">
無効
</string>
@@ -906,6 +1054,9 @@
<string name="tattoo_not_worn">
タトゥー未ç€ç”¨
</string>
+ <string name="physics_not_worn">
+ 物ç†ä½œç”¨ãªã—
+ </string>
<string name="invalid_not_worn">
無効
</string>
@@ -954,6 +1105,9 @@
<string name="create_new_tattoo">
æ–°ã—ã„タトゥを作æˆ
</string>
+ <string name="create_new_physics">
+ æ–°ã—ã„物ç†ä½œç”¨ã‚’作æˆ
+ </string>
<string name="create_new_invalid">
無効
</string>
@@ -1058,7 +1212,7 @@
<string name="PermNo">
ã„ã„ãˆ
</string>
- <string name="Chat" value=" ãƒãƒ£ãƒƒãƒˆï¼š"/>
+ <string name="Chat Message" value="ãƒãƒ£ãƒƒãƒˆï¼š"/>
<string name="Sound" value=" サウンド:"/>
<string name="Wait" value=" --- 待機::"/>
<string name="AnimFlagStop" value=" アニメーションをåœæ­¢ï¼š"/>
@@ -1084,9 +1238,6 @@
<string name="InvFolder My Inventory">
æŒã¡ç‰©
</string>
- <string name="InvFolder My Favorites">
- ãŠæ°—ã«å…¥ã‚Š
- </string>
<string name="InvFolder Library">
ライブラリ
</string>
@@ -1162,6 +1313,9 @@
<string name="InvFolder Accessories">
アクセサリ
</string>
+ <string name="InvFolder Meshes">
+ メッシュ
+ </string>
<string name="InvFolder Friends">
フレンド
</string>
@@ -1764,11 +1918,8 @@
<string name="InvOfferGaveYou">
ãŒæ¸¡ã—ã¾ã—ãŸ
</string>
- <string name="InvOfferYouDecline">
- æ‹’å¦ï¼š
- </string>
- <string name="InvOfferFrom">
- é€ä¿¡å…ƒï¼š
+ <string name="InvOfferDecline">
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; ã‹ã‚‰ã® [DESC] ã‚’æ‹’å¦ã—ã¾ã—ãŸã€‚
</string>
<string name="GroupMoneyTotal">
åˆè¨ˆ
@@ -1858,12 +2009,6 @@
<string name="accel-win-shift">
Shift+
</string>
- <string name="Esc">
- Esc
- </string>
- <string name="Home">
- ホーム
- </string>
<string name="FileSaved">
ファイルãŒä¿å­˜ã•ã‚Œã¾ã—ãŸ
</string>
@@ -1892,7 +2037,7 @@
å³
</string>
<string name="Direction_Back">
- 後ã‚
+ 戻る
</string>
<string name="Direction_North">
北
@@ -1981,6 +2126,9 @@
<string name="Other">
ãã®ä»–
</string>
+ <string name="Rental">
+ レンタル
+ </string>
<string name="Any">
全員
</string>
@@ -2244,6 +2392,114 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンロードã—ã¦ãã ã
<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>
@@ -2253,6 +2509,9 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンロードã—ã¦ãã ã
<string name="Butt Size">
ãŠå°»ã®å¤§ãã•
</string>
+ <string name="Butt Gravity">
+ ãŠå°»ã®åž‚れ具åˆ
+ </string>
<string name="bustle skirt">
後ã‚ã®è†¨ã‚‰ã¿
</string>
@@ -3559,7 +3818,7 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンロードã—ã¦ãã ã
アドホックコンファレンス
</string>
<string name="conference-title-incoming">
- [AGENT_NAME]ã¨ã‚³ãƒ³ãƒ•ã‚¡ãƒ¬ãƒ³ã‚¹ã™ã‚‹
+ [AGENT_NAME] ã¨ã‚³ãƒ³ãƒ•ã‚¡ãƒ¬ãƒ³ã‚¹ã™ã‚‹
</string>
<string name="inventory_item_offered-im">
æŒã¡ç‰©ã‚¢ã‚¤ãƒ†ãƒ ã‚’é€ã‚Šã¾ã—ãŸ
@@ -3574,7 +3833,7 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンロードã—ã¦ãã ã
ã“ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ã«ã„るユーザーã¯ã‚ãªãŸã ã‘ã§ã™ã€‚
</string>
<string name="offline_message">
- [NAME] ã¯ã‚ªãƒ•ãƒ©ã‚¤ãƒ³ã§ã™ã€‚
+ [NAME] ã¯ã‚ªãƒ•ãƒ©ã‚¤ãƒ³ä¸­ã§ã™ã€‚
</string>
<string name="invite_message">
ã“ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã«å¿œç­”・接続ã™ã‚‹å ´åˆã¯ã€[BUTTON NAME] をクリックã—ã¦ãã ã•ã„。
@@ -3639,11 +3898,17 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンロードã—ã¦ãã ã
<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] 支払ã„ã¾ã—ãŸ
+ [NAME] 㯠[REASON] ã®ãŸã‚ã« L$[AMOUNT] を支払ã„ã¾ã—ãŸã€‚
+ </string>
+ <string name="paid_you_ldollars_no_reason">
+ [NAME] 㯠L$[AMOUNT] を支払ã„ã¾ã—ãŸã€‚
</string>
<string name="you_paid_ldollars">
[NAME] ã« L$ [AMOUNT] を支払ã„ã¾ã—ãŸï¼š[REASON]
@@ -3657,6 +3922,9 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンロードã—ã¦ãã ã
<string name="you_paid_ldollars_no_name">
L$ [AMOUNT] を支払ã„ã¾ã—ãŸï¼š[REASON]
</string>
+ <string name="for item">
+ [ITEM] å‘ã‘
+ </string>
<string name="for a parcel of land">
土地区画ã®ãŸã‚
</string>
@@ -3675,6 +3943,9 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンロードã—ã¦ãã ã
<string name="to upload">
アップロードã™ã‚‹ãŸã‚
</string>
+ <string name="to publish a classified ad">
+ クラシファイド広告を掲載ã™ã‚‹
+ </string>
<string name="giving">
L$[AMOUNT] を渡ã—ã¾ã™
</string>
@@ -3752,6 +4023,9 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンロードã—ã¦ãã ã
<string name="New Tattoo">
æ–°ã—ã„タトゥ
</string>
+ <string name="New Physics">
+ æ–°è¦ã®ç‰©ç†ä½œç”¨
+ </string>
<string name="Invalid Wearable">
無効ãªç€ç”¨ç‰©
</string>
@@ -3951,7 +4225,7 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンロードã—ã¦ãã ã
<string name="Notices">
通知
</string>
- <string name="Chat">
+ <string name="Chat" value=" ãƒãƒ£ãƒƒãƒˆï¼š">
ãƒãƒ£ãƒƒãƒˆ
</string>
<string name="DeleteItems">
@@ -3963,4 +4237,348 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンロードã—ã¦ãã ã
<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="Esc">
+ Esc
+ </string>
+ <string name="Space">
+ Space
+ </string>
+ <string name="Enter">
+ 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="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>
</strings>
diff --git a/indra/newview/skins/default/xui/nl/floater_about.xml b/indra/newview/skins/default/xui/nl/floater_about.xml
index f543ebbbe3..4e22d865fe 100644
--- a/indra/newview/skins/default/xui/nl/floater_about.xml
+++ b/indra/newview/skins/default/xui/nl/floater_about.xml
@@ -8,7 +8,7 @@
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 [HOSTNAME] ([HOSTIP])
+ 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>
diff --git a/indra/newview/skins/default/xui/nl/floater_about_land.xml b/indra/newview/skins/default/xui/nl/floater_about_land.xml
index d51ea1c0f8..f336e53e05 100644
--- a/indra/newview/skins/default/xui/nl/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/nl/floater_about_land.xml
@@ -49,7 +49,7 @@
<text name="Sell with landowners objects in parcel.">
Objecten opgenomen in verkoop
</text>
- <text name="Selling with no objects in parcel." width="196">
+ <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"/>
diff --git a/indra/newview/skins/default/xui/nl/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/nl/floater_day_cycle_options.xml
deleted file mode 100644
index 1f3e045a75..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_day_cycle_options.xml
+++ /dev/null
@@ -1,94 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Day Cycle Floater" title="DAGCYCLUS EDITOR">
- <tab_container name="Day Cycle Tabs">
- <panel label="Dagcyclus" name="Day Cycle">
- <button label="?" name="WLDayCycleHelp"/>
- <text name="WL12am">
- 0:00
- </text>
- <text name="WL3am">
- 3:00
- </text>
- <text name="WL6am">
- 6:00
- </text>
- <text name="WL9amHash">
- 9:00
- </text>
- <text name="WL12pmHash">
- 12:00
- </text>
- <text name="WL3pm">
- 15:00
- </text>
- <text name="WL6pm">
- 18:00
- </text>
- <text name="WL9pm">
- 21:00
- </text>
- <text name="WL12am2">
- 0:00
- </text>
- <text name="WL12amHash">
- |
- </text>
- <text name="WL3amHash">
- I
- </text>
- <text name="WL6amHash">
- |
- </text>
- <text name="WL9amHash2">
- I
- </text>
- <text name="WL12pmHash2">
- |
- </text>
- <text name="WL3pmHash">
- I
- </text>
- <text name="WL6pmHash">
- |
- </text>
- <text name="WL9pmHash">
- I
- </text>
- <text name="WL12amHash2">
- |
- </text>
- <button label="Key toevoegen" label_selected="Key toevoegen" name="WLAddKey"/>
- <button label="Key verwijderen" label_selected="Key verwijderen" name="WLDeleteKey"/>
- <text name="WLCurKeyFrameText">
- Gemarkeerde frame instelling:
- </text>
- <text name="WLCurKeyTimeText">
- Markering tijd:
- </text>
- <spinner label="Uur" name="WLCurKeyHour"/>
- <spinner label="Min" name="WLCurKeyMin"/>
- <text name="WLCurKeyTimeText2">
- Markering voorinstelling:
- </text>
- <combo_box label="Voorinstelling" name="WLKeyPresets"/>
- <text name="DayCycleText">
- Snap:
- </text>
- <combo_box label="5 min" name="WLSnapOptions"/>
- <text name="DayCycleText2">
- Lengte van cyclus:
- </text>
- <spinner label="Uur" name="WLLengthOfDayHour"/>
- <spinner label="Min" name="WLLengthOfDayMin"/>
- <spinner label="Sec" name="WLLengthOfDaySec"/>
- <text name="DayCycleText3">
- Voorbeeld:
- </text>
- <button label="Afspelen" label_selected="Afspelen" name="WLAnimSky"/>
- <button label="Stop!" label_selected="Stop" name="WLStopAnimSky"/>
- <button label="Gebruik estatetijd" label_selected="Ga naar Estate tijd" name="WLUseLindenTime"/>
- <button label="Opslaan testdag" label_selected="Opslaan testdag" name="WLSaveDayCycle"/>
- <button label="Laad testdag" label_selected="Laad testdag" name="WLLoadDayCycle"/>
- </panel>
- </tab_container>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_env_settings.xml b/indra/newview/skins/default/xui/nl/floater_env_settings.xml
deleted file mode 100644
index 3c207040d2..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_env_settings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Environment Editor Floater" title="OMGEVING EDITOR">
- <text bottom="-42" name="EnvTimeText">
- Tijd van de
-dag
- </text>
- <text bottom_delta="-36" name="EnvTimeText2">
- 0:00
- </text>
- <text name="EnvCloudText">
- Wolkendek
- </text>
- <text name="EnvWaterColorText">
- Waterkleur
- </text>
- <color_swatch label="" name="EnvWaterColor" tool_tip="Klik om de kleurkiezer te openen"/>
- <text name="EnvWaterFogText">
- Watermist
- </text>
- <button label="Gebruik estate tijd" name="EnvUseEstateTimeButton"/>
- <button label="Geavanceerde lucht" name="EnvAdvancedSkyButton"/>
- <button label="Geavanceerd water" name="EnvAdvancedWaterButton"/>
- <button label="?" name="EnvSettingsHelpButton"/>
-</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
index 7dd85460a2..c6b301841a 100644
--- a/indra/newview/skins/default/xui/nl/floater_preview_gesture.xml
+++ b/indra/newview/skins/default/xui/nl/floater_preview_gesture.xml
@@ -15,7 +15,7 @@
<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!" left="208">
+ <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."/>
diff --git a/indra/newview/skins/default/xui/nl/floater_water.xml b/indra/newview/skins/default/xui/nl/floater_water.xml
deleted file mode 100644
index 1fb1ca241b..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_water.xml
+++ /dev/null
@@ -1,89 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Water Floater" title="GEAVANCEERDE WATER EDITOR">
- <combo_box bottom="-50" height="18" left_delta="116" name="WaterPresetsCombo" width="150" />
- <text name="KeyFramePresetsText">
- Watervoorinstellingen
- </text>
- <button label="Nieuw" label_selected="Nieuw" name="WaterNewPreset" left_delta="190"/>
- <button label="Opslaan" label_selected="Opslaan" name="WaterSavePreset"/>
- <button label="Verwijderen" label_selected="Verwijderen" name="WaterDeletePreset" width="80"/>
- <tab_container name="Water Tabs">
- <panel label="Instellingen" name="Settings">
- <text name="BHText">
- Watermistkleur
- </text>
- <button label="?" name="WaterFogColorHelp"/>
- <color_swatch label="" name="WaterFogColor" tool_tip="Klik om de kleurkiezer te openen"/>
- <text name="WaterFogDensText">
- Mistdichtheidsexponent
- </text>
- <button label="?" name="WaterFogDensityHelp"/>
- <text name="WaterUnderWaterFogModText">
- Onderwatermist wijziger
- </text>
- <button label="?" name="WaterUnderWaterFogModHelp"/>
- <text name="BDensText">
- Reflectie wavelet schaal
- </text>
- <button label="?" name="WaterNormalScaleHelp"/>
- <text name="BHText2">
- 1
- </text>
- <text name="BHText3">
- 2
- </text>
- <text name="BHText4">
- 3
- </text>
- <text name="HDText">
- Fresnelschaal
- </text>
- <button label="?" name="WaterFresnelScaleHelp"/>
- <text name="FresnelOffsetText">
- Fresnelverplaatsing
- </text>
- <button label="?" name="WaterFresnelOffsetHelp"/>
- <text name="DensMultText">
- Refractieschaal boven
- </text>
- <button label="?" name="WaterScaleAboveHelp"/>
- <text name="WaterScaleBelowText">
- Refractieschaal onder
- </text>
- <button label="?" name="WaterScaleBelowHelp"/>
- <text name="MaxAltText">
- Wazigheidvermeerderaar
- </text>
- <button label="?" name="WaterBlurMultiplierHelp"/>
- </panel>
- <panel label="Afbeelding" name="Waves">
- <text name="BHText">
- Grote golven richting
- </text>
- <button label="?" name="WaterWave1Help"/>
- <text name="WaterWave1DirXText">
- X
- </text>
- <text name="WaterWave1DirYText">
- Y
- </text>
- <text name="BHText2">
- Kleine golf richting
- </text>
- <button label="?" name="WaterWave2Help"/>
- <text name="WaterWave2DirXText">
- X
- </text>
- <text name="WaterWave2DirYText">
- Y
- </text>
- <text name="BHText3">
- Normaalmap
- </text>
- <button label="?" name="WaterNormalMapHelp"/>
- </panel>
- </tab_container>
- <string name="WLDefaultWaterNames">
- Default:Glassy:Pond:Murky:Second Plague:SNAKE!!!:Valdez
- </string>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_windlight_options.xml b/indra/newview/skins/default/xui/nl/floater_windlight_options.xml
deleted file mode 100644
index d97c9679a9..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_windlight_options.xml
+++ /dev/null
@@ -1,192 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="WindLight floater" title="GEAVANCEERDE LUCHT EDITOR">
- <combo_box allow_text_entry="false" bottom="-50" follows="left|top" height="18"
- left_delta="116" max_chars="20" mouse_opaque="true" name="WLPresetsCombo"
- width="150" />
- <text name="KeyFramePresetsText">
- Lucht voorinstellingen
- </text>
- <button label="Nieuw" label_selected="Nieuw" name="WLNewPreset"/>
- <button label="Opslaan" label_selected="Opslaan" name="WLSavePreset"/>
- <button label="Verwijderen" label_selected="Verwijderen" name="WLDeletePreset" width="80"/>
- <button label="Dag cyclus editor" label_selected="Dag cyclus editor" name="WLDayCycleMenuButton"/>
- <tab_container name="WindLight Tabs">
- <panel label="Atmosfeer" name="Atmosphere">
- <text name="BHText">
- Blauw Horizon
- </text>
- <button label="?" name="WLBlueHorizonHelp"/>
- <text name="BHText2">
- R
- </text>
- <text name="BHText3">
- G
- </text>
- <text name="BHText4">
- B
- </text>
- <text name="BHText5">
- I
- </text>
- <text name="BDensText">
- Nevel horizon
- </text>
- <button label="?" name="WLHazeHorizonHelp"/>
- <text name="BDensText2">
- Blauw dichtheid
- </text>
- <button label="?" name="WLBlueDensityHelp"/>
- <text name="BHText6">
- R
- </text>
- <text name="BHText7">
- G
- </text>
- <text name="BHText8">
- B
- </text>
- <text name="BHText9">
- I
- </text>
- <text name="HDText">
- Nevel dichtheid
- </text>
- <button label="?" name="WLHazeDensityHelp"/>
- <text name="DensMultText">
- Dichtheidsfactor
- </text>
- <button label="?" name="WLDensityMultHelp"/>
- <text name="WLDistanceMultText">
- Afstandsfactor
- </text>
- <button label="?" name="WLDistanceMultHelp"/>
- <text name="MaxAltText">
- Max hoogte
- </text>
- <button label="?" name="WLMaxAltitudeHelp"/>
- </panel>
- <panel label="Licht" name="Lighting">
- <text name="SLCText">
- Zon/maan kleur
- </text>
- <button label="?" name="WLSunlightColorHelp"/>
- <text name="BHText">
- R
- </text>
- <text name="BHText2">
- G
- </text>
- <text name="BHText3">
- B
- </text>
- <text name="BHText4">
- I
- </text>
- <text name="TODText">
- Zon/maan positie
- </text>
- <button label="?" name="WLTimeOfDayHelp"/>
- <text name="WLAmbientText">
- Omgeving
- </text>
- <button label="?" name="WLAmbientHelp"/>
- <text name="BHText5">
- R
- </text>
- <text name="BHText6">
- G
- </text>
- <text name="BHText7">
- B
- </text>
- <text name="BHText8">
- I
- </text>
- <text name="WLEastAngleText">
- Oosthoek
- </text>
- <button label="?" name="WLEastAngleHelp"/>
- <text name="SunGlowText">
- Zonnegloed
- </text>
- <button label="?" name="WLSunGlowHelp"/>
- <slider label="Focus " name="WLGlowB"/>
- <slider label="Grootte" name="WLGlowR"/>
- <text name="SceneGammaText">
- Scenegamma
- </text>
- <button label="?" name="WLSceneGammaHelp"/>
- <text name="WLStarText">
- Ster helderheid
- </text>
- <button label="?" name="WLStarBrightnessHelp"/>
- </panel>
- <panel label="Wolken" name="Clouds">
- <text name="WLCloudColorText">
- Wolkenkleur
- </text>
- <button label="?" name="WLCloudColorHelp"/>
- <text name="BHText">
- R
- </text>
- <text name="BHText2">
- G
- </text>
- <text name="BHText3">
- B
- </text>
- <text name="BHText4">
- I
- </text>
- <text name="WLCloudColorText2">
- Wolken (XY/Dichtheid)
- </text>
- <button label="?" name="WLCloudDensityHelp"/>
- <text name="BHText5">
- X
- </text>
- <text name="BHText6">
- Y
- </text>
- <text name="BHText7">
- D
- </text>
- <text name="WLCloudCoverageText">
- Wolkenbedekking
- </text>
- <button label="?" name="WLCloudCoverageHelp"/>
- <text name="WLCloudScaleText">
- Wolkenschaal
- </text>
- <button label="?" name="WLCloudScaleHelp"/>
- <text name="WLCloudDetailText">
- Wolkendetail (XY/Dichtheid)
- </text>
- <button label="?" name="WLCloudDetailHelp" left="404"/>
- <text name="BHText8">
- X
- </text>
- <text name="BHText9">
- Y
- </text>
- <text name="BHText10">
- D
- </text>
- <text name="WLCloudScrollXText">
- Wolk verplaatsing X
- </text>
- <button label="?" name="WLCloudScrollXHelp" left="600"/>
- <check_box label="Vastzetten" name="WLCloudLockX" left="622"/>
- <text name="WLCloudScrollYText">
- Wolk verplaatsing Y
- </text>
- <button label="?" name="WLCloudScrollYHelp" left="600"/>
- <check_box label="Vastzetten" name="WLCloudLockY" left="622"/>
- <check_box label="Teken klassieke wolken" name="DrawClassicClouds"/>
- <button label="?" name="WLClassicCloudsHelp" left="620"/>
- </panel>
- </tab_container>
- <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
- </string>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/language_settings.xml b/indra/newview/skins/default/xui/nl/language_settings.xml
index 53501d5dcb..40f4d9178a 100644
--- a/indra/newview/skins/default/xui/nl/language_settings.xml
+++ b/indra/newview/skins/default/xui/nl/language_settings.xml
@@ -4,6 +4,7 @@
<!-- 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>
diff --git a/indra/newview/skins/default/xui/nl/panel_group_notices.xml b/indra/newview/skins/default/xui/nl/panel_group_notices.xml
index 134261197a..a1929bb5e1 100644
--- a/indra/newview/skins/default/xui/nl/panel_group_notices.xml
+++ b/indra/newview/skins/default/xui/nl/panel_group_notices.xml
@@ -30,16 +30,13 @@
<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 bottom_delta="-79" halign="right" left="10" name="lbl3" width="60">
+ <text name="lbl3">
Onderwerp:
</text>
- <line_editor name="create_subject" width="331" left_delta="71"/>
- <text bottom_delta="-18" halign="right" left="10" name="lbl4" width="60">
+ <text name="lbl4">
Bericht:
</text>
- <text_editor name="create_message" bottom_delta="-90" height="104" left_delta="71" width="330"/>
- <line_editor name="create_inventory_name" width="190" left_delta="71"/>
- <text name="lbl5" left="10">
+ <text name="lbl5">
Bevestig:
</text>
<button label="Verwijder bevestiging" label_selected="Verwijder bevestiging" name="remove_attachment"/>
diff --git a/indra/newview/skins/default/xui/nl/strings.xml b/indra/newview/skins/default/xui/nl/strings.xml
index 87e3638a49..e9db237e82 100644
--- a/indra/newview/skins/default/xui/nl/strings.xml
+++ b/indra/newview/skins/default/xui/nl/strings.xml
@@ -849,9 +849,6 @@
<string name="InvFolder My Inventory">
Mijn Inventaris
</string>
- <string name="InvFolder My Favorites">
- Mijn Favorieten
- </string>
<string name="InvFolder Library">
Bibliotheek
</string>
@@ -910,10 +907,10 @@
Gebaren
</string>
<string name="InvFolder Favorite">
- Favoriten
+ Mijn Favorieten
</string>
<string name="InvFolder favorite">
- Favoriten
+ Mijn Favorieten
</string>
<string name="InvFolder Current Outfit">
Huidige Uitrusting
@@ -1231,8 +1228,8 @@
<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="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
diff --git a/indra/newview/skins/default/xui/pl/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/pl/floater_day_cycle_options.xml
deleted file mode 100644
index f3929df3e3..0000000000
--- a/indra/newview/skins/default/xui/pl/floater_day_cycle_options.xml
+++ /dev/null
@@ -1,96 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Day Cycle Floater" title="EDYTOR CYKLU DNIA">
- <tab_container name="Day Cycle Tabs">
- <panel label="Cykl dnia" name="Day Cycle">
- <button label="?" name="WLDayCycleHelp"/>
- <multi_slider label="" name="WLTimeSlider"/>
- <multi_slider label="" 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="Dodaj" label_selected="Dodaj" name="WLAddKey"/>
- <button label="Usuń" label_selected="Usuń" name="WLDeleteKey"/>
- <text name="WLCurKeyFrameText">
- Preferencje czasu:
- </text>
- <text name="WLCurKeyTimeText">
- Czas:
- </text>
- <spinner label="Godz" name="WLCurKeyHour"/>
- <spinner label="Min" name="WLCurKeyMin"/>
- <text name="WLCurKeyTimeText2">
- Ustawienia:
- </text>
- <combo_box label="Preset" name="WLKeyPresets"/>
- <text name="DayCycleText">
- Przerwij:
- </text>
- <combo_box label="5 min" name="WLSnapOptions"/>
- <text name="DayCycleText2">
- Długość cyklu:
- </text>
- <spinner label="Godz" name="WLLengthOfDayHour"/>
- <spinner label="Min" name="WLLengthOfDayMin"/>
- <spinner label="Sek" name="WLLengthOfDaySec"/>
- <text name="DayCycleText3">
- PrzeglÄ…daj:
- </text>
- <button label="Start" label_selected="Start" name="WLAnimSky"/>
- <button label="Stop" label_selected="Stop" name="WLStopAnimSky"/>
- <button label="Używaj czasu regionu" label_selected="Używaj czasu regionu" name="WLUseLindenTime"/>
- <button label="Zapisz test dnia" label_selected="Zapisz test dnia" name="WLSaveDayCycle"/>
- <button label="Załaduj test dnia" label_selected="Załaduj test dnia" name="WLLoadDayCycle"/>
- </panel>
- </tab_container>
-</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_env_settings.xml b/indra/newview/skins/default/xui/pl/floater_env_settings.xml
deleted file mode 100644
index 3ab854fbbb..0000000000
--- a/indra/newview/skins/default/xui/pl/floater_env_settings.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Environment Editor Floater" title="EDYTOR ÅšRODOWISKA">
- <floater.string name="timeStr">
- [hour12,datetime,utc]:[min,datetime,utc] [ampm,datetime,utc]
- </floater.string>
- <text name="EnvTimeText">
- Czas
- </text>
- <text name="EnvTimeText2">
- 12:00 PM
- </text>
- <slider label="" name="EnvTimeSlider"/>
- <text name="EnvCloudText">
- Chmury:
- </text>
- <slider label="" name="EnvCloudSlider"/>
- <text name="EnvWaterColorText">
- Kolor wody
- </text>
- <color_swatch label="" name="EnvWaterColor" tool_tip="Kliknij aby wybrać kolor"/>
- <text name="EnvWaterFogText">
- Zamglenie:
- </text>
- <slider label="" name="EnvWaterFogSlider"/>
- <button label="Używaj czasu regionu" name="EnvUseEstateTimeButton"/>
- <button label="Zaawansowane niebo" name="EnvAdvancedSkyButton"/>
- <button label="Zaawansowana woda" name="EnvAdvancedWaterButton"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_preview_animation.xml b/indra/newview/skins/default/xui/pl/floater_preview_animation.xml
index 6ce6914771..d276b1f63a 100644
--- a/indra/newview/skins/default/xui/pl/floater_preview_animation.xml
+++ b/indra/newview/skins/default/xui/pl/floater_preview_animation.xml
@@ -6,6 +6,6 @@
<text name="desc txt">
Opis:
</text>
- <button label="Uruchom in-world" label_selected="Stop" left="20" name="Anim play btn" tool_tip="Uruchom animacjÄ™ by widzieli jÄ… pozostali Rezydenci" width="131"/>
- <button label="Używaj lokalnie" label_selected="Stop" left="162" name="Anim audition btn" tool_tip="Uruchom animację widoczną tylko przez Ciebie" width="125"/>
+ <button label="Uruchom in-world" label_selected="Stop" name="Anim play btn" tool_tip="Uruchom animacjÄ™ by widzieli jÄ… pozostali Rezydenci" width="131"/>
+ <button label="Używaj lokalnie" label_selected="Stop" left="162" name="Anim audition btn" tool_tip="Uruchom animację widoczną tylko przez Ciebie" width="120"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_sell_land.xml b/indra/newview/skins/default/xui/pl/floater_sell_land.xml
index 528e5a416b..2201c4b0ad 100644
--- a/indra/newview/skins/default/xui/pl/floater_sell_land.xml
+++ b/indra/newview/skins/default/xui/pl/floater_sell_land.xml
@@ -44,7 +44,7 @@
<combo_box.item label="Wybrany Kupiec:" name="Specificuser:"/>
</combo_box>
<button label="Wybierz" name="sell_to_select_agent"/>
- <text name="sell_objects_label">
+ <text name="sell_objects_label" font="SansSerifSmall">
3. Obiekty sprzedawane razem z posiadłością?
</text>
<text name="sell_objects_text">
diff --git a/indra/newview/skins/default/xui/pl/floater_settings_debug.xml b/indra/newview/skins/default/xui/pl/floater_settings_debug.xml
index 7c29d52e7b..131f92d56f 100644
--- a/indra/newview/skins/default/xui/pl/floater_settings_debug.xml
+++ b/indra/newview/skins/default/xui/pl/floater_settings_debug.xml
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="settings_debug" title="USTAWIENIA DEBUGOWANIA">
<radio_group name="boolean_combo">
- <radio_item label="PRAWDA" name="TRUE" value="prawda"/>
- <radio_item label="NIEPRAWDA" name="FALSE" value=""/>
+ <radio_item label="PRAWDA" name="TRUE" />
+ <radio_item label="NIEPRAWDA" name="FALSE" />
</radio_group>
<color_swatch label="Kolor" name="val_color_swatch"/>
<spinner label="x" name="val_spinner_1"/>
diff --git a/indra/newview/skins/default/xui/pl/floater_water.xml b/indra/newview/skins/default/xui/pl/floater_water.xml
deleted file mode 100644
index 9720dae516..0000000000
--- a/indra/newview/skins/default/xui/pl/floater_water.xml
+++ /dev/null
@@ -1,103 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Water Floater" title="ZAAWANSOWANY EDYTOR WODY">
- <text name="KeyFramePresetsText">
- Ustawienia wody:
- </text>
- <button label="Nowe" label_selected="Nowe" name="WaterNewPreset"/>
- <button label="Zapisz" label_selected="Zapisz" name="WaterSavePreset"/>
- <button label="Usuń" label_selected="Usuń" name="WaterDeletePreset"/>
- <tab_container name="Water Tabs">
- <panel label="USTAWIENIA" name="Settings">
- <text name="BHText">
- Kolor podwodnej mgły
- </text>
- <button label="?" name="WaterFogColorHelp"/>
- <color_swatch label="" name="WaterFogColor" tool_tip="Kliknij aby wybrać kolor"/>
- <text name="WaterFogDensText">
- Wykładnik gęstości mgły
- </text>
- <button label="?" name="WaterFogDensityHelp"/>
- <slider label="" name="WaterFogDensity"/>
- <text name="WaterUnderWaterFogModText">
- Modyfikator mgły
- </text>
- <button label="?" name="WaterUnderWaterFogModHelp"/>
- <slider label="" name="WaterUnderWaterFogMod"/>
- <text name="BDensText">
- Skala zmarszczeń
- </text>
- <button label="?" name="WaterNormalScaleHelp"/>
- <text name="BHText2">
- 1
- </text>
- <text name="BHText3">
- 2
- </text>
- <text name="BHText4">
- 3
- </text>
- <slider label="" name="WaterNormalScaleX"/>
- <slider label="" name="WaterNormalScaleY"/>
- <slider label="" name="WaterNormalScaleZ"/>
- <text name="HDText">
- Skala Fresnela
- </text>
- <button label="?" name="WaterFresnelScaleHelp"/>
- <slider label="" name="WaterFresnelScale"/>
- <text name="FresnelOffsetText">
- Przesunięcie Fresnela
- </text>
- <button label="?" name="WaterFresnelOffsetHelp"/>
- <slider label="" name="WaterFresnelOffset"/>
- <text name="DensMultText">
- Górna refrakcja
- </text>
- <button label="?" name="WaterScaleAboveHelp"/>
- <slider label="" name="WaterScaleAbove"/>
- <text name="WaterScaleBelowText">
- Dolna refrakcja
- </text>
- <button label="?" name="WaterScaleBelowHelp"/>
- <slider label="" name="WaterScaleBelow"/>
- <text name="MaxAltText">
- Mnożnik rozmycia
- </text>
- <button label="?" name="WaterBlurMultiplierHelp"/>
- <slider label="" name="WaterBlurMult"/>
- </panel>
- <panel label="OBRAZ" name="Waves">
- <text name="BHText">
- Kierunek dużych fal
- </text>
- <button label="?" name="WaterWave1Help"/>
- <text name="WaterWave1DirXText">
- X
- </text>
- <text name="WaterWave1DirYText">
- Y
- </text>
- <slider label="" name="WaterWave1DirX"/>
- <slider label="" name="WaterWave1DirY"/>
- <text name="BHText2">
- Kierunek małych fal
- </text>
- <button label="?" name="WaterWave2Help"/>
- <text name="WaterWave2DirXText">
- X
- </text>
- <text name="WaterWave2DirYText">
- Y
- </text>
- <slider label="" name="WaterWave2DirX"/>
- <slider label="" name="WaterWave2DirY"/>
- <text name="BHText3">
- Mapa normalnych
- </text>
- <button label="?" name="WaterNormalMapHelp"/>
- <texture_picker label="" name="WaterNormalMap"/>
- </panel>
- </tab_container>
- <string name="WLDefaultWaterNames">
- Default:Glassy:Pond:Murky:Second Plague:SNAKE!!!:Valdez
- </string>
-</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_windlight_options.xml b/indra/newview/skins/default/xui/pl/floater_windlight_options.xml
deleted file mode 100644
index 930e904464..0000000000
--- a/indra/newview/skins/default/xui/pl/floater_windlight_options.xml
+++ /dev/null
@@ -1,228 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="WindLight floater" title="ZAAWANSOWANY EDYTOR NIEBA">
- <text name="KeyFramePresetsText">
- Ustawienia nieba:
- </text>
- <button label="Nowe" label_selected="Nowe" name="WLNewPreset"/>
- <button label="Zapisz" label_selected="Zapisz" name="WLSavePreset"/>
- <button label="Usuń" label_selected="Usuń" name="WLDeletePreset"/>
- <button label="Edytor cyklu dnia" label_selected="Edytor cyklu dnia" name="WLDayCycleMenuButton"/>
- <tab_container name="WindLight Tabs">
- <panel label="ATMOSFERA" name="Atmosphere">
- <text name="BHText">
- Horyzont błękitu
- </text>
- <button label="?" name="WLBlueHorizonHelp"/>
- <text name="BHText2">
- R
- </text>
- <text name="BHText3">
- G
- </text>
- <text name="BHText4">
- B
- </text>
- <text name="BHText5">
- I
- </text>
- <slider label="" name="WLBlueHorizonR"/>
- <slider label="" name="WLBlueHorizonG"/>
- <slider label="" name="WLBlueHorizonB"/>
- <slider label="" name="WLBlueHorizonI"/>
- <text name="BDensText">
- Horyzont zamglenia
- </text>
- <button label="?" name="WLHazeHorizonHelp"/>
- <slider label="" name="WLHazeHorizon"/>
- <text name="BDensText2">
- Gęstość błękitu
- </text>
- <button label="?" name="WLBlueDensityHelp"/>
- <text name="BHText6">
- R
- </text>
- <text name="BHText7">
- G
- </text>
- <text name="BHText8">
- B
- </text>
- <text name="BHText9">
- I
- </text>
- <slider label="" name="WLBlueDensityR"/>
- <slider label="" name="WLBlueDensityG"/>
- <slider label="" name="WLBlueDensityB"/>
- <slider label="" name="WLBlueDensityI"/>
- <text name="HDText">
- Gęstość zamglenia
- </text>
- <button label="?" name="WLHazeDensityHelp"/>
- <slider label="" name="WLHazeDensity"/>
- <text name="DensMultText">
- Mnożnik gęsości
- </text>
- <button label="?" name="WLDensityMultHelp"/>
- <slider label="" name="WLDensityMult"/>
- <text name="WLDistanceMultText">
- Mnożnik dystansu
- </text>
- <button label="?" name="WLDistanceMultHelp"/>
- <slider label="" name="WLDistanceMult"/>
- <text name="MaxAltText">
- Max wysokość
- </text>
- <button label="?" name="WLMaxAltitudeHelp"/>
- <slider label="" name="WLMaxAltitude"/>
- </panel>
- <panel label="ÅšWIATÅO" name="Lighting">
- <text name="SLCText">
- Kolor Słońca/Księżyca
- </text>
- <button label="?" name="WLSunlightColorHelp"/>
- <text name="BHText">
- R
- </text>
- <text name="BHText2">
- G
- </text>
- <text name="BHText3">
- B
- </text>
- <text name="BHText4">
- I
- </text>
- <slider label="" name="WLSunlightR"/>
- <slider label="" name="WLSunlightG"/>
- <slider label="" name="WLSunlightB"/>
- <slider label="" name="WLSunlightI"/>
- <text name="TODText">
- Pozycja Słońca/Księżyca
- </text>
- <button label="?" name="WLTimeOfDayHelp"/>
- <slider label="" name="WLSunAngle"/>
- <text name="WLAmbientText">
- Otoczenie
- </text>
- <button label="?" name="WLAmbientHelp"/>
- <text name="BHText5">
- R
- </text>
- <text name="BHText6">
- G
- </text>
- <text name="BHText7">
- B
- </text>
- <text name="BHText8">
- I
- </text>
- <slider label="" name="WLAmbientR"/>
- <slider label="" name="WLAmbientG"/>
- <slider label="" name="WLAmbientB"/>
- <slider label="" name="WLAmbientI"/>
- <text name="WLEastAngleText">
- Pozycja wschodu
- </text>
- <button label="?" name="WLEastAngleHelp"/>
- <slider label="" name="WLEastAngle"/>
- <text name="SunGlowText">
- Blask Słońca
- </text>
- <button label="?" name="WLSunGlowHelp"/>
- <slider label="Ostrość" name="WLGlowB"/>
- <slider label="Rozmiar" name="WLGlowR"/>
- <text name="SceneGammaText">
- Jasność obrazu
- </text>
- <button label="?" name="WLSceneGammaHelp"/>
- <slider label="" name="WLGamma"/>
- <text name="WLStarText">
- Blask gwiazd
- </text>
- <button label="?" name="WLStarBrightnessHelp"/>
- <slider label="" name="WLStarAlpha"/>
- </panel>
- <panel label="CHMURY" name="Clouds">
- <text name="WLCloudColorText">
- Kolor chmur
- </text>
- <button label="?" name="WLCloudColorHelp"/>
- <text name="BHText">
- R
- </text>
- <text name="BHText2">
- G
- </text>
- <text name="BHText3">
- B
- </text>
- <text name="BHText4">
- I
- </text>
- <slider label="" name="WLCloudColorR"/>
- <slider label="" name="WLCloudColorG"/>
- <slider label="" name="WLCloudColorB"/>
- <slider label="" name="WLCloudColorI"/>
- <text name="WLCloudColorText2">
- Chmury (XY/Gęstość)
- </text>
- <button label="?" name="WLCloudDensityHelp"/>
- <text name="BHText5">
- X
- </text>
- <text name="BHText6">
- Y
- </text>
- <text name="BHText7">
- G
- </text>
- <slider label="" name="WLCloudX"/>
- <slider label="" name="WLCloudY"/>
- <slider label="" name="WLCloudDensity"/>
- <text name="WLCloudCoverageText">
- Pokrycie chmur
- </text>
- <button label="?" name="WLCloudCoverageHelp"/>
- <slider label="" name="WLCloudCoverage"/>
- <text name="WLCloudScaleText">
- Skala chmur
- </text>
- <button label="?" name="WLCloudScaleHelp"/>
- <slider label="" name="WLCloudScale"/>
- <text name="WLCloudDetailText">
- Szczegóły (XY/gęstość)
- </text>
- <button label="?" name="WLCloudDetailHelp"/>
- <text name="BHText8">
- X
- </text>
- <text name="BHText9">
- Y
- </text>
- <text name="BHText10">
- G
- </text>
- <slider label="" name="WLCloudDetailX"/>
- <slider label="" name="WLCloudDetailY"/>
- <slider label="" name="WLCloudDetailDensity"/>
- <text name="WLCloudScrollXText">
- Przewijanie chmur X
- </text>
- <button label="?" name="WLCloudScrollXHelp"/>
- <check_box label="Zablokuj" name="WLCloudLockX"/>
- <slider label="" name="WLCloudScrollX"/>
- <text name="WLCloudScrollYText">
- Przewijanie chmur Y
- </text>
- <button label="?" name="WLCloudScrollYHelp"/>
- <check_box label="Zablokuj" name="WLCloudLockY"/>
- <slider label="" name="WLCloudScrollY"/>
- <check_box label="Klasyczne chmury" name="DrawClassicClouds"/>
- <button label="?" name="WLClassicCloudsHelp"/>
- </panel>
- </tab_container>
- <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
- </string>
-</floater>
diff --git a/indra/newview/skins/default/xui/pl/language_settings.xml b/indra/newview/skins/default/xui/pl/language_settings.xml
index 681b38e9cf..93051d1317 100644
--- a/indra/newview/skins/default/xui/pl/language_settings.xml
+++ b/indra/newview/skins/default/xui/pl/language_settings.xml
@@ -4,6 +4,7 @@
<!-- Locale Information -->
<string name="MicrosoftLocale">polish</string>
+ <string name="MacLocale">pl_PL.UTF-8</string>
<string name="DarwinLocale">pl_PL.UTF-8</string>
<string name="LinuxLocale">pl_PL.UTF-8</string>
diff --git a/indra/newview/skins/default/xui/pl/panel_edit_pick.xml b/indra/newview/skins/default/xui/pl/panel_edit_pick.xml
index 8a183c00cf..72c162f63d 100644
--- a/indra/newview/skins/default/xui/pl/panel_edit_pick.xml
+++ b/indra/newview/skins/default/xui/pl/panel_edit_pick.xml
@@ -29,7 +29,7 @@
<layout_panel name="layout_panel1">
<button label="Zapisz obrazek" name="save_changes_btn"/>
</layout_panel>
- <layout_panel name="layout_panel1">
+ <layout_panel name="layout_panel2">
<button label="Cofnij" name="cancel_btn"/>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/pl/panel_group_notices.xml b/indra/newview/skins/default/xui/pl/panel_group_notices.xml
index 5b62d13880..a3b0998de3 100644
--- a/indra/newview/skins/default/xui/pl/panel_group_notices.xml
+++ b/indra/newview/skins/default/xui/pl/panel_group_notices.xml
@@ -47,7 +47,7 @@ Limit dzienny ogłoszeń dla grupy wynosi 200.
Ogłoszenia zachowane
</text>
<text name="lbl2">
- W celu wysłania nowego ogłoszenia kliknij przycisk +
+ W celu wysłania nowego ogłoszenia kliknij + Stwórz ogłoszenie
</text>
<text name="lbl3">
Temat:
diff --git a/indra/newview/skins/default/xui/pl/panel_media_settings_security.xml b/indra/newview/skins/default/xui/pl/panel_media_settings_security.xml
index da3142b54e..7e95c4942f 100644
--- a/indra/newview/skins/default/xui/pl/panel_media_settings_security.xml
+++ b/indra/newview/skins/default/xui/pl/panel_media_settings_security.xml
@@ -2,7 +2,8 @@
<panel label="Ochrona" name="Media Settings Security">
<check_box initial_value="false" label="Dostęp dozwolony tylko dla wybranych URL" name="whitelist_enable"/>
<text name="home_url_fails_some_items_in_whitelist">
- Wejścia na stronę WWW, które się nie powiodły są zaznaczone:
+ Wejścia na stronę WWW, które się nie powiodły są
+zaznaczone:
</text>
<button label="Dodaj" name="whitelist_add"/>
<button label="Usuń" name="whitelist_del"/>
diff --git a/indra/newview/skins/default/xui/pl/panel_people.xml b/indra/newview/skins/default/xui/pl/panel_people.xml
index da9f84cb2e..ef52e2148b 100644
--- a/indra/newview/skins/default/xui/pl/panel_people.xml
+++ b/indra/newview/skins/default/xui/pl/panel_people.xml
@@ -66,16 +66,16 @@ Chcesz spotkać ludzi? Spróbuj [secondlife:///app/worldmap Mapa Świata].
<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="chat_btn_lp">
+ <layout_panel name="im_btn_lp">
<button label="IM" name="im_btn" tool_tip="Otwórz wiadomości IM"/>
</layout_panel>
- <layout_panel name="chat_btn_lp">
+ <layout_panel name="call_btn_lp">
<button label="Dzwoń" name="call_btn" tool_tip="Zadzwoń do tego Rezydenta"/>
</layout_panel>
- <layout_panel name="chat_btn_lp">
+ <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="chat_btn_lp">
+ <layout_panel name="teleport_btn_lp">
<button label="Teleportuj" name="teleport_btn" tool_tip="Zaproponuj teleport"/>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/pl/panel_preferences_privacy.xml
index a2f9b4176e..5af2fed142 100644
--- a/indra/newview/skins/default/xui/pl/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/pl/panel_preferences_privacy.xml
@@ -9,7 +9,7 @@
</text>
<check_box label="Pokaż mój profil w wynikach wyszukiwarki" name="online_searchresults"/>
<check_box label="Mój status online jest dostępny tylko dla znajomych i grup do których należę" name="online_visibility"/>
- <check_box label="Możliwość wysyłania wiadomości prywatnej (IM) oraz rozmowy głosowej tylko dla znajomych i grup do których należę" name="voice_call_friends_only_check"/>
+ <check_box label="Możliwość wysyłania wiadomości prywatnej (IM) oraz rozmowy głosowej tylko dla &#10;znajomych i grup do których należę" name="voice_call_friends_only_check" top_pad="15"/>
<check_box label="Wyłącz mikrofon po zakończeniu rozmowy głosowej" name="auto_disengage_mic_check"/>
<check_box label="Pokaż moje ulubione landmarki przy logowaniu (w rozwijanym menu &apos;Rozpocznij w&apos;)" name="favorites_on_login_check"/>
<text name="Logs:">
diff --git a/indra/newview/skins/default/xui/pl/sidepanel_item_info.xml b/indra/newview/skins/default/xui/pl/sidepanel_item_info.xml
index 0c285e6546..9ec3c480b7 100644
--- a/indra/newview/skins/default/xui/pl/sidepanel_item_info.xml
+++ b/indra/newview/skins/default/xui/pl/sidepanel_item_info.xml
@@ -46,7 +46,7 @@
</text>
<check_box label="Modyfikuje" name="CheckOwnerModify"/>
<check_box label="Kopiuje" name="CheckOwnerCopy"/>
- <check_box label="Oddaje/Sprzedaje" name="CheckOwnerTransfer"/>
+ <check_box label="Oddaje/&#10;Sprzedaje" name="CheckOwnerTransfer"/>
<text name="AnyoneLabel">
Każdy:
</text>
@@ -60,7 +60,7 @@
</text>
<check_box label="Modyfikuje" name="CheckNextOwnerModify"/>
<check_box label="Kopiuje" name="CheckNextOwnerCopy"/>
- <check_box label="Sprzedaje/Oddaje" name="CheckNextOwnerTransfer" tool_tip="Następny właściciel może oddawać lub sprzedawać ten obiekt"/>
+ <check_box label="Sprzedaje/&#10;Oddaje" name="CheckNextOwnerTransfer" tool_tip="Następny właściciel może oddawać lub sprzedawać ten obiekt"/>
</panel>
<check_box label="Na sprzedaż" name="CheckPurchase"/>
<combo_box name="combobox sale copy">
diff --git a/indra/newview/skins/default/xui/pl/strings.xml b/indra/newview/skins/default/xui/pl/strings.xml
index 94708ba448..e93da48dc0 100644
--- a/indra/newview/skins/default/xui/pl/strings.xml
+++ b/indra/newview/skins/default/xui/pl/strings.xml
@@ -1072,9 +1072,6 @@
<string name="InvFolder My Inventory">
Moja Szafa
</string>
- <string name="InvFolder My Favorites">
- Moje ulubione
- </string>
<string name="InvFolder Library">
Biblioteka
</string>
@@ -1133,10 +1130,10 @@
Gesturki
</string>
<string name="InvFolder Favorite">
- Ulubione
+ Moje ulubione
</string>
<string name="InvFolder favorite">
- Ulubione
+ Moje ulubione
</string>
<string name="InvFolder Current Outfit">
Obecny strój
@@ -1464,7 +1461,7 @@
(nieznane)
</string>
<string name="SummaryForTheWeek" value="Podsumowanie dla tego tygodnia, poczÄ…wszy od "/>
- <string name="NextStipendDay" value="Następna wypłata będzie w "/>
+ <string name="NextStipendDay" value=". Następna wypłata będzie w "/>
<string name="GroupIndividualShare" value=" Groupa Udziały Indywidualne"/>
<string name="GroupColumn" value="Grupa"/>
<string name="Balance">
diff --git a/indra/newview/skins/default/xui/pt/floater_about.xml b/indra/newview/skins/default/xui/pt/floater_about.xml
index ac365f1702..6ea2daced9 100644
--- a/indra/newview/skins/default/xui/pt/floater_about.xml
+++ b/indra/newview/skins/default/xui/pt/floater_about.xml
@@ -7,7 +7,7 @@
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 [HOSTNAME]&lt;/nolink&gt;([HOSTIP])
+ 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])
[SERVER_VERSION]
[[SERVER_RELEASE_NOTES_URL] [ReleaseNotes]]
</floater.string>
@@ -54,27 +54,13 @@ Agradecemos também aos seguintes residentes por sua colaboração na mais nova
</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
- 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.
-
- Todos os direitos reservados. Veja licenças.txt para detalhes.
+ 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.
- Voice chat Audio coding: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)
+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
+
+Todos os direitos reservados. Mais detalhes em licenses.txt.
+
+Codificação do áudio de bate-papo 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/pt/floater_about_land.xml b/indra/newview/skins/default/xui/pt/floater_about_land.xml
index 7761c79864..e48cac7d1f 100644
--- a/indra/newview/skins/default/xui/pt/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/pt/floater_about_land.xml
@@ -113,7 +113,7 @@ Vá para o menu Mundo &gt; Sobre o terreno ou selecione outro lote para mostrar
<text name="Selling with no objects in parcel.">
À venda (objetos não incluídos).
</text>
- <button label="Cancelar venda do terreno" label_selected="Cancelar venda do terreno" left="275" name="Cancel Land Sale" width="165"/>
+ <button label="Cancelar venda do terreno" label_selected="Cancelar venda do terreno" name="Cancel Land Sale"/>
<text name="Claimed:">
Posse em:
</text>
diff --git a/indra/newview/skins/default/xui/pt/floater_build_options.xml b/indra/newview/skins/default/xui/pt/floater_build_options.xml
index 71a1483dde..666e185819 100644
--- a/indra/newview/skins/default/xui/pt/floater_build_options.xml
+++ b/indra/newview/skins/default/xui/pt/floater_build_options.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="build options floater" title="OPÇÕES DE GRADE">
- <spinner label="Unidade da grade (metros)" label_width="122" name="GridResolution" width="180"/>
- <spinner label="Ext. da Grade (metros)" label_width="122" name="GridDrawSize" width="180"/>
+ <spinner label="Unidade da grade (metros)" name="GridResolution"/>
+ <spinner label="Ext. da Grade (metros)" name="GridDrawSize"/>
<check_box label="Encaixar em sub-unidades" name="GridSubUnit"/>
<check_box label="Ver corte transversal" name="GridCrossSection"/>
<text name="grid_opacity_label" tool_tip="Opacidade da grade">
Opacidade:
</text>
- <slider label="Opacidade da grade" name="GridOpacity" width="220"/>
+ <slider label="Opacidade da grade" name="GridOpacity"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_buy_contents.xml b/indra/newview/skins/default/xui/pt/floater_buy_contents.xml
index c64523ceb3..b9e7a04412 100644
--- a/indra/newview/skins/default/xui/pt/floater_buy_contents.xml
+++ b/indra/newview/skins/default/xui/pt/floater_buy_contents.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_buy_contents" title="COMPRAR CONTEÚDO">
<text name="contains_text">
- [NAME] contém:
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; contains:
</text>
<text name="buy_text">
Comprar por L$[AMOUNT] de(a) [NAME]?
diff --git a/indra/newview/skins/default/xui/pt/floater_buy_land.xml b/indra/newview/skins/default/xui/pt/floater_buy_land.xml
index 5c5ee3b7a0..258c95cc7d 100644
--- a/indra/newview/skins/default/xui/pt/floater_buy_land.xml
+++ b/indra/newview/skins/default/xui/pt/floater_buy_land.xml
@@ -127,25 +127,25 @@ contribuídas para cobrir este lote antes da aquisição se completar.
<text name="region_name_label">
Região:
</text>
- <text left="560" name="region_name_text">
+ <text name="region_name_text">
(desconhecido)
</text>
<text name="region_type_label">
Tipo:
</text>
- <text left="560" name="region_type_text">
+ <text name="region_type_text">
(desconhecido)
</text>
<text name="estate_name_label">
Propriedade:
</text>
- <text left="560" name="estate_name_text">
+ <text name="estate_name_text">
(desconhecido)
</text>
- <text name="estate_owner_label" right="565" width="105">
+ <text name="estate_owner_label">
Dono da propriedade:
</text>
- <text left="560" name="estate_owner_text">
+ <text name="estate_owner_text">
(desconhecido)
</text>
<text name="resellable_changeable_label">
@@ -160,11 +160,11 @@ contribuídas para cobrir este lote antes da aquisição se completar.
<text name="covenant_text">
Você deve concordar com o Corretor da Propriedade:
</text>
- <text left="470" name="covenant_timestamp_text"/>
+ <text name="covenant_timestamp_text"/>
<text_editor name="covenant_editor">
Carregando...
</text_editor>
- <check_box label="Eu concordo com as definições do Corretor feitas acima." name="agree_covenant"/>
+ <check_box label="Eu concordo com as definições do Corretor feitas acima." name="agree_covenant" left="-330"/>
<text name="info_parcel_label">
Lote:
</text>
diff --git a/indra/newview/skins/default/xui/pt/floater_customize.xml b/indra/newview/skins/default/xui/pt/floater_customize.xml
deleted file mode 100644
index a9ec0b9b1f..0000000000
--- a/indra/newview/skins/default/xui/pt/floater_customize.xml
+++ /dev/null
@@ -1,530 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater customize" title="APARÊNCIA">
- <tab_container name="customize tab container" tab_min_width="115">
- <text label="Corpo" name="body_parts_placeholder">
- Partes do corpo
- </text>
- <panel label="Forma" name="Shape">
- <button label="Reverter" label_selected="Reverter" name="Revert"/>
- <button label="Corpo" label_selected="Corpo" name="Body"/>
- <button label="Cabeça" label_selected="Cabeça" name="Head"/>
- <button label="Olhos" label_selected="Olhos" name="Eyes"/>
- <button label="Orelhas" label_selected="Orelhas" name="Ears"/>
- <button label="Nariz" label_selected="Nariz" name="Nose"/>
- <button label="Boca" label_selected="Boca" name="Mouth"/>
- <button label="Queixo" label_selected="Queixo" name="Chin"/>
- <button label="Tórax" label_selected="Tórax" name="Torso"/>
- <button label="Pernas" label_selected="Pernas" name="Legs"/>
- <radio_group name="sex radio">
- <radio_item label="Feminino" name="radio" value="0"/>
- <radio_item label="Masculino" name="radio2" value="1"/>
- </radio_group>
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: não foi possível modificar
- </text>
- <text name="title_loading">
- [DESC]: carregando...
- </text>
- <text name="title_not_worn">
- [DESC]: não vestido
- </text>
- <text name="path">
- Localizado em [PATH]
- </text>
- <text name="not worn instructions">
- Para obter um físico novo, arraste um do inventário para o seu avatar. Ou crie um novo.
- </text>
- <text name="no modify instructions">
- Você não tem permissão para modificar esta vestimenta.
- </text>
- <text name="Item Action Label">
- Forma:
- </text>
- <button label="Nova" label_selected="Nova" name="Create New"/>
- <button label="Salvar" label_selected="Salvar" name="Save"/>
- <button label="Salvar como..." label_selected="Salvar como..." name="Save As"/>
- </panel>
- <panel label="Pele" name="Skin">
- <button label="Cor de pele" label_selected="Cor de pele" name="Skin Color" width="115"/>
- <button label="Detalhes faciais" label_selected="Detalhes faciais" name="Face Detail" width="115"/>
- <button label="Maquilagem" label_selected="Maquilagem" name="Makeup" width="115"/>
- <button label="Detalhes do corpo" label_selected="Detalhes do corpo" name="Body Detail" width="115"/>
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: não foi possível modificar
- </text>
- <text name="title_loading">
- [DESC]: carregando..
- </text>
- <text name="title_not_worn">
- [DESC]: não vestido
- </text>
- <text name="path">
- Localizada em [PATH]
- </text>
- <text name="not worn instructions">
- Para obter uma pele nova, arraste uma do inventário para o seu avatar. Ou crie uma pele nova.
- </text>
- <text name="no modify instructions">
- Você não tem permissão para modificar esta vestimenta.
- </text>
- <text name="Item Action Label">
- Pele:
- </text>
- <texture_picker label="Tattoo: cabeça" name="Head Tattoos" tool_tip="Clique para escolher um desenho" width="86"/>
- <texture_picker label="Tattoo: superior" name="Upper Tattoos" tool_tip="Clique para escolher um desenho" width="86"/>
- <texture_picker label="Tattoo: inferior" name="Lower Tattoos" tool_tip="Clique para escolher um desenho" width="86"/>
- <button label="Novo" label_selected="Novo" name="Create New"/>
- <button label="Salvar" label_selected="Salvar" name="Save"/>
- <button label="Salvar como..." label_selected="Salvar como..." name="Save As"/>
- <button label="Reverter" label_selected="Reverter" name="Revert"/>
- </panel>
- <panel label="Cabelo" name="Hair">
- <button label="Cor" label_selected="Cor" name="Color" width="115"/>
- <button label="Estilo" label_selected="Estilo" name="Style" width="115"/>
- <button label="Sombrancelhas" label_selected="Sombrancelhas" name="Eyebrows" width="115"/>
- <button label="Rosto" label_selected="Rosto" name="Facial" width="115"/>
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: não foi possível modificar
- </text>
- <text name="title_loading">
- [DESC]: carregando...
- </text>
- <text name="title_not_worn">
- [DESC]: não vestido
- </text>
- <text name="path">
- Localizado em [PATH]
- </text>
- <text name="not worn instructions">
- Para obter um cabelo novo, arraste um tipo de cabelo do inventário para o seu avatar. Ou crie um cabelo novo.
- </text>
- <text name="no modify instructions">
- Você não ter permissão para modificar essa vestimenta.
- </text>
- <text name="Item Action Label">
- Cabelo:
- </text>
- <texture_picker label="Texture" name="Texture" tool_tip="Clique para escolher uma imagem"/>
- <button label="Criar novo cabelo" label_selected="Criar novo cabelo" name="Create New"/>
- <button label="Salvar" label_selected="Salvar" name="Save"/>
- <button label="Salvar como..." label_selected="Salvar como..." name="Save As"/>
- <button label="Reverter" label_selected="Reverter" name="Revert"/>
- </panel>
- <panel label="Olhos" name="Eyes">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: não foi possível modificar
- </text>
- <text name="title_loading">
- [DESC]: carregando...
- </text>
- <text name="title_not_worn">
- [DESC]: não vestido
- </text>
- <text name="path">
- Localizado em [PATH]
- </text>
- <text name="not worn instructions">
- Para obter novos olhos, arraste um tipo de olhos do inventário para o seu avatar. Ou crie olhos novos.
- </text>
- <text name="no modify instructions">
- Você não tem permissão para alterar esta vestimenta.
- </text>
- <text name="Item Action Label">
- Olhos:
- </text>
- <texture_picker label="Ãris" name="Iris" tool_tip="Clique para escolher uma imagem"/>
- <button label="Criar novos olhos" label_selected="Criar novos olhos" name="Create New"/>
- <button label="Salvar" label_selected="Salvar" name="Save"/>
- <button label="Salvar como..." label_selected="Salvar como..." name="Save As"/>
- <button label="Reverter" label_selected="Reverter" name="Revert"/>
- </panel>
- <text label="Roupas" name="clothes_placeholder">
- Roupa
- </text>
- <panel label="Camisa" name="Shirt">
- <texture_picker label="Tecido" name="Fabric" tool_tip="Clique para escolher uma imagem"/>
- <color_swatch label="Cor/Tint" name="Color/Tint" tool_tip="Selecionar a cor"/>
- <button label="Remover" label_selected="Remover" name="Take Off"/>
- <button label="Criar nova camisa" label_selected="Criar nova camisa" name="Create New"/>
- <button label="Salvar" label_selected="Salvar" name="Save"/>
- <button label="Salvar como..." label_selected="Salvar como..." name="Save As"/>
- <button label="Reverter" label_selected="Reverter" name="Revert"/>
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: não foi possível modificar
- </text>
- <text name="title_loading">
- [DESC]: carregando...
- </text>
- <text name="title_not_worn">
- [DESC]: não vestido
- </text>
- <text name="path">
- Localizado em [PATH]
- </text>
- <text name="not worn instructions">
- Para obter uma camisa nova, arraste uma do inventário para o seu avatar. Ou crie uma camisa nova.
- </text>
- <text name="no modify instructions">
- Você não ter permissão para modificar esta vestimenta.
- </text>
- <text name="Item Action Label">
- Camisa:
- </text>
- </panel>
- <panel label="Calças" name="Pants">
- <texture_picker label="Tecido" name="Fabric" tool_tip="Clique para escolher uma imagem"/>
- <color_swatch label="Cor/Tint" name="Color/Tint" tool_tip="Selecionar a cor"/>
- <button label="Remover" label_selected="Remover" name="Take Off"/>
- <button label="Criar novas calças" label_selected="Criar novas calças" name="Create New"/>
- <button label="Salvar" label_selected="Salvar" name="Save"/>
- <button label="Salvar como..." label_selected="Salvar como..." name="Save As"/>
- <button label="Reverter" label_selected="Reverter" name="Revert"/>
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: não foi possível modificar
- </text>
- <text name="title_loading">
- [DESC]: carregando...
- </text>
- <text name="title_not_worn">
- [DESC]: não vestindo
- </text>
- <text name="path">
- Localizado em [PATH]
- </text>
- <text name="not worn instructions">
- Para obter calças novas, arraste uma do inventário para o seu avatar. Ou crie calças novas.
- </text>
- <text name="no modify instructions">
- Você não tem permissão para modificar esta vestimenta.
- </text>
- <text name="Item Action Label">
- Calças:
- </text>
- </panel>
- <panel label="Sapatos" name="Shoes">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: não foi possível modificar
- </text>
- <text name="title_loading">
- [DESC]: carregando...
- </text>
- <text name="title_not_worn">
- [DESC]: não vestido
- </text>
- <text name="path">
- Localizado em [PATH]
- </text>
- <text name="not worn instructions">
- Para obter novos olhos, arraste um tipo de olhos do inventário para o seu avatar. Ou crie olhos novos.
- </text>
- <button label="Criar novos sapatos" label_selected="Criar novos sapatos" name="Create New" width="166"/>
- <text name="no modify instructions">
- Você não tem permissão para modificar esta vestimenta.
- </text>
- <text name="Item Action Label">
- Sapatos:
- </text>
- <texture_picker label="Tecido" name="Fabric" tool_tip="Clique para escolher uma imagem"/>
- <color_swatch label="Cor/Tint" name="Color/Tint" tool_tip="Selecionar a cor"/>
- <button label="Remover" label_selected="Remover" name="Take Off"/>
- <button label="Salvar" label_selected="Salvar" name="Save"/>
- <button label="Salvar como..." label_selected="Salvar como..." name="Save As"/>
- <button label="Reverter" label_selected="Reverter" name="Revert"/>
- </panel>
- <panel label="Meias" name="Socks">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: não foi possível modificar
- </text>
- <text name="title_loading">
- [DESC]: carregando...
- </text>
- <text name="title_not_worn">
- [DESC]: não vestido.
- </text>
- <text name="path">
- Localizado em [PATH]
- </text>
- <text name="not worn instructions">
- Para obter meias novas, arraste um par do inventário para o seu avatar. Ou crie meias novas.
- </text>
- <button label="Criar novas meias" label_selected="Criar novas meias" name="Create New"/>
- <text name="no modify instructions">
- Você não tem permissão para modificar essa vestimenta.
- </text>
- <text name="Item Action Label">
- Meias:
- </text>
- <texture_picker label="Tecido" name="Fabric" tool_tip="Clique para escolher uma imagem"/>
- <color_swatch label="Cor/Tint" name="Color/Tint" tool_tip="Selecionar a cor"/>
- <button label="Remover" label_selected="Remover" name="Take Off"/>
- <button label="Salvar" label_selected="Salvar" name="Save"/>
- <button label="Salvar como..." label_selected="Salvar como..." name="Save As"/>
- <button label="Reverter" label_selected="Reverter" name="Revert"/>
- </panel>
- <panel label="Jaqueta" name="Jacket">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: Não foi possível modificar
- </text>
- <text name="title_loading">
- [DESC]: carregando...
- </text>
- <text name="title_not_worn">
- [DESC]: não vestido
- </text>
- <text name="path">
- Localizado em [PATH]
- </text>
- <text name="not worn instructions">
- Para por uma jaqueta nova, arraste uma do inventário para o seu avatar. Ou crie uma jaqueta nova.
- </text>
- <button label="Criar nova jaqueta" label_selected="Criar nova jaqueta" name="Create New"/>
- <text name="no modify instructions">
- Você não tem permissão para modificar esta vestimenta.
- </text>
- <text name="Item Action Label">
- Jaqueta:
- </text>
- <texture_picker label="Tecido superior" name="Upper Fabric" tool_tip="Clique para escolher uma imagem." width="84"/>
- <texture_picker label="Tecido Inferior" name="Lower Fabric" tool_tip="Clique para escolher uma imagem." width="84"/>
- <color_swatch label="Cor/Tint" name="Color/Tint" tool_tip="Selecionar a cor"/>
- <button label="Remover" label_selected="Remover" name="Take Off"/>
- <button label="Salvar" label_selected="Salvar" name="Save"/>
- <button label="Salvar como..." label_selected="Salvar como..." name="Save As"/>
- <button label="Reverter" label_selected="Reverter" name="Revert"/>
- </panel>
- <panel label="Luvas" name="Gloves">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: não foi possível modificar
- </text>
- <text name="title_loading">
- [DESC]: carregando....
- </text>
- <text name="title_not_worn">
- [DESC]: não vestido
- </text>
- <text name="path">
- Localizado em [PATH]
- </text>
- <text name="not worn instructions">
- Para obter luvas novas, arraste um par do inventário para o seu avatar. Ou crie luvas novas.
- </text>
- <button label="Criar novas luvas" label_selected="Criar novas luvas" name="Create New"/>
- <text name="no modify instructions">
- Você não tem permissão para modificar essa vestimenta.
- </text>
- <text name="Item Action Label">
- Luvas:
- </text>
- <texture_picker label="Tecido" name="Fabric" tool_tip="Clique para escolher uma imagem"/>
- <color_swatch label="Cor/Tint" name="Color/Tint" tool_tip="Selecionar a cor"/>
- <button label="Remover" label_selected="Remover" name="Take Off"/>
- <button label="Salvar" label_selected="Salvar" name="Save"/>
- <button label="Salvar como..." label_selected="Salvar como..." name="Save As"/>
- <button label="Reverter" label_selected="Reverter" name="Revert"/>
- </panel>
- <panel label="Camiseta" name="Undershirt">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: não foi possível modificar
- </text>
- <text name="title_loading">
- [DESC]: carregando...
- </text>
- <text name="title_not_worn">
- [DESC]: não vestido
- </text>
- <text name="path">
- Localizado em [PATH]
- </text>
- <text name="not worn instructions">
- Para obter uma camiseta nova, arraste uma do inventário para o seu avatar. Ou crie uma camiseta nova.
- </text>
- <button label="Criar nova camiseta" label_selected="Criar nova camiseta" name="Create New"/>
- <text name="no modify instructions">
- Você não ter permissão para modificar essa vestimenta.
- </text>
- <text name="Item Action Label">
- Camiseta:
- </text>
- <texture_picker label="Tecido" name="Fabric" tool_tip="Clique para escolher uma imagem"/>
- <color_swatch label="Cor/Tint" name="Color/Tint" tool_tip="Selecionar a cor"/>
- <button label="Remover" label_selected="Remover" name="Take Off"/>
- <button label="Salvar" label_selected="Salvar" name="Save"/>
- <button label="Salvar como..." label_selected="Salvar como..." name="Save As"/>
- <button label="Reverter" label_selected="Reverter" name="Revert"/>
- </panel>
- <panel label="Roupas de Baixo" name="Underpants">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: não foi possível modificar
- </text>
- <text name="title_loading">
- [DESC]: carregando...
- </text>
- <text name="title_not_worn">
- [DESC]: não vestido
- </text>
- <text name="path">
- Localizado em [PATH]
- </text>
- <text name="not worn instructions">
- Para obter roupa de baixo nova, arraste um modelo do inventário para o seu avatar. Ou crie uma roupa de baixo nova.
- </text>
- <button label="Criar novas" label_selected="Criar novas" name="Create New" width="180"/>
- <text name="no modify instructions">
- Você não tem permissão para modificar essa vestimenta.
- </text>
- <text name="Item Action Label">
- Roupas de baixo:
- </text>
- <texture_picker label="Tecido" name="Fabric" tool_tip="Clique para escolher uma imagem"/>
- <color_swatch label="Cor/Tint" name="Color/Tint" tool_tip="Selecionar a cor"/>
- <button label="Remover" label_selected="Remover" name="Take Off"/>
- <button label="Salvar" label_selected="Salvar" name="Save"/>
- <button label="Salvar como..." label_selected="Salvar como..." name="Save As"/>
- <button label="Reverter" label_selected="Reverter" name="Revert"/>
- </panel>
- <panel label="Saia" name="Skirt">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: não foi possível modificar
- </text>
- <text name="title_loading">
- [DESC]: carregando...
- </text>
- <text name="title_not_worn">
- [DESC]: não vestido
- </text>
- <text name="path">
- Localizado em [PATH]
- </text>
- <text name="not worn instructions">
- Para obter um saia nova, arraste uma saia do inventário para o seu avatar. Ou crie uma saia nova.
- </text>
- <button label="Criar nova saia" label_selected="Criar nova saia" name="Create New"/>
- <text name="no modify instructions">
- Você não tem permissão para modificar esta vestimenta.
- </text>
- <text name="Item Action Label">
- Saia:
- </text>
- <texture_picker label="Tecido" name="Fabric" tool_tip="Clique para escolher uma imagem"/>
- <color_swatch label="Cor/Tint" name="Color/Tint" tool_tip="Selecionar a cor"/>
- <button label="Remover" label_selected="Remover" name="Take Off"/>
- <button label="Salvar" label_selected="Salvar" name="Save"/>
- <button label="Salvar como..." label_selected="Salvar como..." name="Save As"/>
- <button label="Reverter" label_selected="Reverter" name="Revert"/>
- </panel>
- <panel label="Tatuagem" name="Tattoo">
- <text name="title">
- [DESC]:
- </text>
- <text name="title_no_modify">
- [DESC]: não pode ser modificado
- </text>
- <text name="title_loading">
- [DESC]: Carregando...
- </text>
- <text name="title_not_worn">
- [DESC]: não vestido
- </text>
- <text name="path">
- Localização: [PATH]
- </text>
- <text name="not worn instructions">
- Para por uma tatuagem nova, arraste uma tatuagem do inventário para o seu avatar. Ou crie uma tatuagem nova.
- </text>
- <button label="Criar tatuagem" label_selected="Criar tatuagem" name="Create New"/>
- <text name="no modify instructions">
- Você não está autorizado a modificar este acessório.
- </text>
- <text name="Item Action Label">
- Tatuagem:
- </text>
- <texture_picker label="Tatuagem na cabeça" name="Head Tattoo" tool_tip="Selecionar imagem"/>
- <texture_picker label="Tatuagem parte de cima" name="Upper Tattoo" tool_tip="Selecionar imagem"/>
- <texture_picker label="Tatuagem de baixo" name="Lower Tattoo" tool_tip="Selecionar imagem"/>
- <button label="Tirar" label_selected="Tirar" name="Take Off"/>
- <button label="Salvar" label_selected="Salvar" name="Save"/>
- <button label="Salvar como..." label_selected="Salvar como..." name="Save As"/>
- <button label="Reverter" label_selected="Reverter" name="Revert"/>
- </panel>
- <panel label="Alpha" name="Alpha">
- <text name="title">
- [DESC]:
- </text>
- <text name="title_no_modify">
- [DESC]: não pode ser modificado
- </text>
- <text name="title_loading">
- [DESC]: Carregando...
- </text>
- <text name="title_not_worn">
- [DESC]: não vestido
- </text>
- <text name="path">
- Localização: [PATH]
- </text>
- <text name="not worn instructions">
- Para por uma máscara alpha nova, arraste a máscara do inventário para o seu avatar. Ou crie uma máscara nova.
- </text>
- <button label="Criar Alpha novo" label_selected="Criar Alpha novo" name="Create New"/>
- <text name="no modify instructions">
- Você não está autorizado a modificar este acessório.
- </text>
- <text name="Item Action Label">
- Alpha:
- </text>
- <texture_picker label="Alpha inferior" name="Lower Alpha" tool_tip="Selecionar imagem"/>
- <texture_picker label="Alpha de cima" name="Upper Alpha" tool_tip="Selecionar imagem"/>
- <texture_picker label="Cabeça Alpha" name="Head Alpha" tool_tip="Selecionar imagem"/>
- <texture_picker label="Olhos Alpha" name="Eye Alpha" tool_tip="Selecionar imagem"/>
- <texture_picker label="Cabelo alpha" name="Hair Alpha" tool_tip="Selecionar imagem"/>
- <button label="Tirar" label_selected="Tirar" name="Take Off"/>
- <button label="Salvar" label_selected="Salvar" name="Save"/>
- <button label="Salvar como..." label_selected="Salvar como..." name="Save As"/>
- <button label="Reverter" label_selected="Reverter" name="Revert"/>
- </panel>
- </tab_container>
- <scroll_container left="249" name="panel_container"/>
- <button label="Dados do script" label_selected="Dados do script" name="script_info" tool_tip="Mostrar scripts anexados ao seu avatar"/>
- <button label="Criar look" label_selected="Criar look" name="make_outfit_btn"/>
- <button label="Cancelar" label_selected="Cancelar" name="Cancel"/>
- <button label="OK" label_selected="OK" name="Ok"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/pt/floater_day_cycle_options.xml
deleted file mode 100644
index 9560a3b418..0000000000
--- a/indra/newview/skins/default/xui/pt/floater_day_cycle_options.xml
+++ /dev/null
@@ -1,67 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Day Cycle Floater" title="EDITOR DE CICLO DE DIA">
- <tab_container name="Day Cycle Tabs">
- <panel label="Ciclo do dia" name="Day Cycle">
- <button label="?" name="WLDayCycleHelp"/>
- <text name="WL12am">
- 0:00
- </text>
- <text name="WL3am">
- 3:00
- </text>
- <text name="WL6am">
- 6:00
- </text>
- <text name="WL9amHash">
- 9:00
- </text>
- <text name="WL12pmHash">
- 12:00
- </text>
- <text name="WL3pm">
- 15:00
- </text>
- <text name="WL6pm">
- 18:00
- </text>
- <text name="WL9pm">
- 21:00
- </text>
- <text name="WL12am2">
- 24:00
- </text>
- <button label="Adicionar chave" label_selected="Adicionar chave" name="WLAddKey"/>
- <button label="Apagar chave" label_selected="Apagar chave" name="WLDeleteKey"/>
- <text name="WLCurKeyFrameText">
- Configurações de Quadro-chave:
- </text>
- <text name="WLCurKeyTimeText">
- Tempo-chave:
- </text>
- <spinner label="Hora" name="WLCurKeyHour"/>
- <spinner label="Minutos" name="WLCurKeyMin"/>
- <text name="WLCurKeyTimeText2">
- Ajuste-chave:
- </text>
- <combo_box label="Ajuste" name="WLKeyPresets"/>
- <text name="DayCycleText">
- Grudar:
- </text>
- <combo_box label="5 minutos" name="WLSnapOptions"/>
- <text name="DayCycleText2">
- Duração do Ciclo:
- </text>
- <spinner label="Hora" name="WLLengthOfDayHour"/>
- <spinner label="Min." name="WLLengthOfDayMin"/>
- <spinner label="Seg." name="WLLengthOfDaySec"/>
- <text name="DayCycleText3">
- Visualizar
- </text>
- <button label="Tocar" label_selected="Tocar" name="WLAnimSky"/>
- <button label="Pare!" label_selected="Pare" name="WLStopAnimSky"/>
- <button label="Usar o horário da Propriedade" label_selected="Ir para o horário da Propriedade" name="WLUseLindenTime"/>
- <button label="Salvar o Dia teste" label_selected="Salvar o Dia teste" name="WLSaveDayCycle"/>
- <button label="Carregar o Dia teste" label_selected="Carregar o Dia teste" name="WLLoadDayCycle"/>
- </panel>
- </tab_container>
-</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_device_settings.xml b/indra/newview/skins/default/xui/pt/floater_device_settings.xml
deleted file mode 100644
index 48a4a6ef6f..0000000000
--- a/indra/newview/skins/default/xui/pt/floater_device_settings.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_device_settings" title="CONFIGURAÇÃO DE DISPOSITIVO DE VOZ"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_env_settings.xml b/indra/newview/skins/default/xui/pt/floater_env_settings.xml
deleted file mode 100644
index 3ca8d934c9..0000000000
--- a/indra/newview/skins/default/xui/pt/floater_env_settings.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Environment Editor Floater" title="EDITOR DO AMBIENTE">
- <floater.string name="timeStr">
- [hour12,datetime,utc]:[min,datetime,utc] [ampm,datetime,utc]
- </floater.string>
- <text name="EnvTimeText">
- Hora do Dia
- </text>
- <text name="EnvTimeText2">
- 12:00 PM
- </text>
- <text name="EnvCloudText">
- Cobertura de
-Nuvens
- </text>
- <text name="EnvWaterColorText">
- Cor da água
- </text>
- <color_swatch label="" name="EnvWaterColor" tool_tip="Selecionar a cor"/>
- <text name="EnvWaterFogText">
- Névoa da
-água
- </text>
- <button bottom="-144" label="Usar hora da propriedade" name="EnvUseEstateTimeButton" width="155"/>
- <button label="Céu Avançado" left="167" name="EnvAdvancedSkyButton" width="155"/>
- <button label="Ãgua Avançada" left="326" name="EnvAdvancedWaterButton" width="155"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_image_preview.xml b/indra/newview/skins/default/xui/pt/floater_image_preview.xml
index 3582923ed0..362a553d64 100644
--- a/indra/newview/skins/default/xui/pt/floater_image_preview.xml
+++ b/indra/newview/skins/default/xui/pt/floater_image_preview.xml
@@ -10,7 +10,7 @@
Prévia da
imagem como:
</text>
- <combo_box label="Tipo de Roupas" left="100" name="clothing_type_combo" width="186">
+ <combo_box label="Tipo de Roupas" name="clothing_type_combo">
<item label="Imagem" name="Image" value="Imagem"/>
<item label="Cabelo" name="Hair" value="Cabelo"/>
<item label="Cabeça de mulher" name="FemaleHead" value="Cabeça de mulher"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_import_collada.xml b/indra/newview/skins/default/xui/pt/floater_import_collada.xml
new file mode 100644
index 0000000000..ad55d416c3
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_import_collada.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Import Collada" title="Importar cena">
+ <text name="mesh count">
+ Meshes: [COUNT]
+ </text>
+ <text name="texture count">
+ Texturas: [COUNT]
+ </text>
+ <text name="status">
+ Status: [STATUS]
+ </text>
+ <button label="Cancelar" name="cancel"/>
+ <button label="OK" name="ok"/>
+ <string name="status_idle">
+ Inativo
+ </string>
+ <string name="status_uploading">
+ Carregando [NAME]
+ </string>
+ <string name="status_creating">
+ Criando objeto [NAME]
+ </string>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/pt/floater_inventory_view_finder.xml
index d21e574011..71759abdc2 100644
--- a/indra/newview/skins/default/xui/pt/floater_inventory_view_finder.xml
+++ b/indra/newview/skins/default/xui/pt/floater_inventory_view_finder.xml
@@ -5,6 +5,7 @@
<check_box label="Roupas" name="check_clothing"/>
<check_box label="Gestos" name="check_gesture"/>
<check_box label="Landmarks" name="check_landmark"/>
+ <check_box label="Meshes:" name="check_mesh"/>
<check_box label="Anotações" name="check_notecard"/>
<check_box label="Objetos" name="check_object"/>
<check_box label="Scripts" name="check_script"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_model_preview.xml b/indra/newview/skins/default/xui/pt/floater_model_preview.xml
new file mode 100644
index 0000000000..cdad55bded
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_model_preview.xml
@@ -0,0 +1,231 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Model Preview" title="Carregar modelo">
+ <string name="status_idle">
+ Inativo
+ </string>
+ <string name="status_reading_file">
+ Carregando...
+ </string>
+ <string name="status_generating_meshes">
+ Gerando meshes...
+ </string>
+ <string name="status_vertex_number_overflow">
+ Erro: Número de Vertex acima de 65534. Abortado.
+ </string>
+ <string name="high">
+ Alto
+ </string>
+ <string name="medium">
+ Média
+ </string>
+ <string name="low">
+ Baixo
+ </string>
+ <string name="lowest">
+ Mais baixo
+ </string>
+ <string name="mesh_status_good">
+ Entregar!
+ </string>
+ <string name="mesh_status_na">
+ N/D
+ </string>
+ <string name="mesh_status_none">
+ Nenhum
+ </string>
+ <string name="mesh_status_submesh_mismatch">
+ Cada nível de detalhamento têm um número de faces para textura.
+ </string>
+ <string name="mesh_status_mesh_mismatch">
+ Cada nível de detalhamento têm um número de faces para textura.
+ </string>
+ <string name="mesh_status_too_many_vertices">
+ O nível de detalhamento possui vértices demais.
+ </string>
+ <string name="mesh_status_missing_lod">
+ Falta o nível de detalhamento necessário.
+ </string>
+ <string name="layer_all">
+ Tudo
+ </string>
+ <string name="decomposing">
+ Analisando...
+ </string>
+ <string name="simplifying">
+ Simplificando...
+ </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>
+ <panel>
+ <text name="streaming cost">
+ Custo do recurso: [COST]
+ </text>
+ <text name="physics cost">
+ Custo físico: [COST]
+ </text>
+ <text name="upload fee">
+ Taxa de upload: N/D
+ </text>
+ </panel>
+ <text name="status">
+ [STATUS]
+ </text>
+ <button label="Padrão" name="reset_btn" tool_tip="Valores padrão"/>
+ <button label="Upload" name="ok_btn" tool_tip="Carregar no simulador"/>
+ <button label="Cancelar" name="cancel_btn"/>
+ <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:
+ </text>
+ <text name="share_tolderance_text">
+ Tolerância com compartilhamento:
+ </text>
+ <combo_box name="border_mode">
+ <combo_item name="border_unlock">
+ Desbloquear
+ </combo_item>
+ <combo_item name="border_lock">
+ Bloquear
+ </combo_item>
+ </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"/>
+ </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>
+ <panel name="physics info">
+ <slider label="Visualizar:" name="physics_explode"/>
+ <text name="physics_triangles">
+ Triângulos: [TRIANGLES]
+ </text>
+ <text name="physics_points">
+ Vértices: [POINTS]
+ </text>
+ <text name="physics_hulls">
+ Hulls: [HULLS]
+ </text>
+ </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
+ </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>
+</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
new file mode 100644
index 0000000000..1064e16e83
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_model_wizard.xml
@@ -0,0 +1,241 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Model Wizard" title="CARREGAR ASSISTENTE DE MODELAGEM">
+ <button label="5. Carregar" name="upload_btn"/>
+ <button label="4. Revisar" name="review_btn"/>
+ <button label="3. Física" name="physics2_btn"/>
+ <button label="3. Física" name="physics_btn"/>
+ <button label="2. Otimizar" name="optimize_btn"/>
+ <button label="1. Selecionra arquivo" name="choose_file_btn"/>
+ <panel name="choose_file_panel">
+ <panel name="header_panel">
+ <text name="header_text">
+ Carregar modelo
+ </text>
+ </panel>
+ <text name="description">
+ O assistente ajuda você a importar modelos mesh para o Second Life. Para começar, especifique o arquivo com o modelo a ser importado. O Second Life suporta arquivos COLLADA (.dae).
+ </text>
+ <panel name="content">
+ <text name="Cache location">
+ Nome do arquivo:
+ </text>
+ <button label="Procurar..." label_selected="Procurar..." name="browse"/>
+ <text name="dimensions">
+ X Y: Z:
+ </text>
+ <text name="dimension_dividers">
+ | |
+ </text>
+ </panel>
+ </panel>
+ <panel name="optimize_panel">
+ <panel name="header_panel">
+ <text name="header_text">
+ Otimizar
+ </text>
+ </panel>
+ <text name="description">
+ O assistente otimizou seu modelo para melhorar o desempenho. Ajuste os resultados da otimização abaixou ou clique em Próximo para prosseguir.
+ </text>
+ <panel name="content">
+ <text name="high_detail_text">
+ Gerar nível de detalhamento: Alto
+ </text>
+ <text name="medium_detail_text">
+ Gerar nível de detalhamento: Médio
+ </text>
+ <text name="low_detail_text">
+ Gerar nível de detalhamento: Baixo
+ </text>
+ <text name="lowest_detail_text">
+ Gerar nível de detalhamento: Mais baixo
+ </text>
+ </panel>
+ <panel name="content2">
+ <text name="lod_label">
+ Visualizar modelo:
+ </text>
+ <combo_box name="preview_lod_combo2" tool_tip="LOD para ver no renderizador de pré-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="streaming cost">
+ Custo do recurso: [COST]
+ </text>
+ <text name="dimensions">
+ X Y: Z:
+ </text>
+ <text name="dimension_dividers">
+ | |
+ </text>
+ </panel>
+ </panel>
+ <panel name="physics_panel">
+ <panel name="header_panel">
+ <text name="header_text">
+ Física
+ </text>
+ </panel>
+ <text name="description">
+ O assistente cria uma forma física que determina como o objeto interage com outros objetos e avatares. Ajuste a barra para o nível de detalhamento mais apropriado para a finalidade do seu objeto:
+ </text>
+ <panel name="content">
+ <text name="streaming cost">
+ Custo do recurso: [COST]
+ </text>
+ </panel>
+ </panel>
+ <panel name="physics2_panel">
+ <panel name="header_panel">
+ <text name="header_text">
+ Física
+ </text>
+ </panel>
+ <text name="description">
+ Veja a forma física abaixo e clique em Próximo para prosseguir. Para modificar o formato físico, clique em Anterior.
+ </text>
+ <panel name="content">
+ <text name="lod_label">
+ Visualizar modelo:
+ </text>
+ <combo_box name="preview_lod_combo3" tool_tip="LOD para ver no renderizador de pré-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="dimensions">
+ X Y: Z:
+ </text>
+ <text name="dimension_dividers">
+ | |
+ </text>
+ <text name="streaming cost">
+ Custo do recurso: [COST]
+ </text>
+ </panel>
+ </panel>
+ <panel name="review_panel">
+ <panel name="header_panel">
+ <text name="header_text">
+ Revisar
+ </text>
+ </panel>
+ <text name="description">
+ Veja os detalhes abaixo e clique em Carregar para carregar seu modelo. Seu saldo L$ será cobrado quando você clicar em Carregar.
+ </text>
+ <panel name="content">
+ <text name="lod_label">
+ Visualizar modelo:
+ </text>
+ <combo_box name="preview_lod_combo" tool_tip="LOD para ver no renderizador de pré-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="dimensions">
+ X Y: Z:
+ </text>
+ <text name="dimension_dividers">
+ | |
+ </text>
+ </panel>
+ <text name="streaming cost">
+ Custo do recurso: [COST]
+ </text>
+ <text name="physics cost">
+ Custo físico: [COST]
+ </text>
+ </panel>
+ <panel name="upload_panel">
+ <panel name="header_panel">
+ <text name="header_text">
+ Carregado!
+ </text>
+ </panel>
+ <text name="description">
+ Parabéns! Seu modelo foi carregado com êxito. Procure-o na pasta Objetos de seu inventário.
+ </text>
+ </panel>
+ <button label="&lt;&lt; Voltar" name="back"/>
+ <button label="Próximo &gt;&gt;" name="next"/>
+ <button label="Carregar" name="upload" tool_tip="Carregar no simulador"/>
+ <button label="Cancelar" name="cancel"/>
+ <button label="Fechar" name="close"/>
+ <spinner name="import_scale" value="1.0"/>
+ <string name="status_idle">
+ Inativo
+ </string>
+ <string name="status_reading_file">
+ Carregando...
+ </string>
+ <string name="status_generating_meshes">
+ Gerando meshes...
+ </string>
+ <string name="status_vertex_number_overflow">
+ Erro: Número de Vertex acima de 65534. Abortado.
+ </string>
+ <string name="high">
+ Alto
+ </string>
+ <string name="medium">
+ Médio
+ </string>
+ <string name="low">
+ Baixo
+ </string>
+ <string name="lowest">
+ Mais baixo
+ </string>
+ <string name="mesh_status_good">
+ Entregar!
+ </string>
+ <string name="mesh_status_na">
+ N/D
+ </string>
+ <string name="mesh_status_none">
+ Nenhum
+ </string>
+ <string name="mesh_status_submesh_mismatch">
+ Cada nível de detalhamento têm um número de faces para textura.
+ </string>
+ <string name="mesh_status_mesh_mismatch">
+ Cada nível de detalhamento têm um número de faces para textura.
+ </string>
+ <string name="mesh_status_too_many_vertices">
+ O nível de detalhamento possui vértices demais.
+ </string>
+ <string name="mesh_status_missing_lod">
+ Falta o nível de detalhamento necessário.
+ </string>
+ <string name="layer_all">
+ Tudo
+ </string>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_preview_animation.xml b/indra/newview/skins/default/xui/pt/floater_preview_animation.xml
index b66159354f..b650b7945c 100644
--- a/indra/newview/skins/default/xui/pt/floater_preview_animation.xml
+++ b/indra/newview/skins/default/xui/pt/floater_preview_animation.xml
@@ -6,6 +6,6 @@
<text name="desc txt">
Descrição:
</text>
- <button label="Tocar inworld" label_selected="Parar" left="20" name="Anim play btn" tool_tip="Tocar essa animação de forma que outros possam ver" width="131"/>
- <button label="Executar localmente" label_selected="Parar" left="162" name="Anim audition btn" tool_tip="Tocar essa animação de forma que apenas você possa ver" width="125"/>
+ <button label="Tocar inworld" label_selected="Parar" name="Anim play btn" tool_tip="Tocar essa animação de forma que outros possam ver" width="131"/>
+ <button label="Executar localmente" label_selected="Parar" left="162" name="Anim audition btn" tool_tip="Tocar essa animação de forma que apenas você possa ver" width="120"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_preview_classified.xml b/indra/newview/skins/default/xui/pt/floater_preview_classified.xml
deleted file mode 100644
index bb626430ed..0000000000
--- a/indra/newview/skins/default/xui/pt/floater_preview_classified.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="classified_preview" title="INFORMAÇÕES CLASSIFICADAS">
- <floater.string name="Title">
- Classificados: [NAME]
- </floater.string>
-</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_preview_event.xml b/indra/newview/skins/default/xui/pt/floater_preview_event.xml
deleted file mode 100644
index b422580f3b..0000000000
--- a/indra/newview/skins/default/xui/pt/floater_preview_event.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="event_preview" title="DADOS DO EVENTO">
- <floater.string name="Title">
- Evento: [NAME]
- </floater.string>
-</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_preview_gesture.xml b/indra/newview/skins/default/xui/pt/floater_preview_gesture.xml
index 80bdbb0fb4..089694608b 100644
--- a/indra/newview/skins/default/xui/pt/floater_preview_gesture.xml
+++ b/indra/newview/skins/default/xui/pt/floater_preview_gesture.xml
@@ -37,25 +37,24 @@
<text name="key_label">
Atalho:
</text>
- <combo_box label="Nenhum" left="116" name="modifier_combo" width="76"/>
- <combo_box label="Nenhum" left_delta="80" name="key_combo" width="76"/>
+ <combo_box label="Nenhum" name="modifier_combo" width="68"/>
+ <combo_box label="Nenhum" name="key_combo" width="48"/>
<text name="library_label">
Biblioteca:
</text>
- <scroll_list name="library_list" width="84">
+ <scroll_list name="library_list">
<scroll_list.rows name="action_animation" value="Animação"/>
<scroll_list.rows name="action_sound" value="Som"/>
<scroll_list.rows name="action_chat" value="Bate-papo"/>
<scroll_list.rows name="action_wait" value="Espere"/>
</scroll_list>
- <button label="Incluir" left="118" name="add_btn" width="87"/>
+ <button label="Incluir" name="add_btn"/>
<text name="steps_label">
Passos:
- </text>
- <scroll_list left="226" name="step_list" width="205"/>
- <button label="P/ cima" left_delta="-13" name="up_btn" width="114"/>
- <button label="P/ baixo" name="down_btn" width="114"/>
- <button label="Remover" left_delta="13" name="delete_btn" width="84"/>
+ </text>
+ <button label="P/ cima" name="up_btn" />
+ <button label="P/ baixo" name="down_btn"/>
+ <button label="Remover" name="delete_btn"/>
<text name="options_text">
(opções)
</text>
@@ -63,9 +62,9 @@
<radio_item label="Iniciar" name="start"/>
<radio_item label="Parar" name="stop"/>
</radio_group>
- <check_box bottom_delta="34" label="até que as animações estejam concluídas" name="wait_anim_check"/>
- <check_box bottom_delta="-30" label="segundos:" name="wait_time_check"/>
- <line_editor left_delta="130" name="wait_time_editor"/>
+ <check_box label="até que as animações estejam concluídas" name="wait_anim_check"/>
+ <check_box label="segundos:" name="wait_time_check"/>
+ <line_editor name="wait_time_editor"/>
<text name="help_label">
Se não incluir uma pausa, todas as etapas ocorrem ao mesmo tempo.
</text>
diff --git a/indra/newview/skins/default/xui/pt/floater_price_for_listing.xml b/indra/newview/skins/default/xui/pt/floater_price_for_listing.xml
new file mode 100644
index 0000000000..b078962feb
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_price_for_listing.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="price_for_listing" title="PUBLICAR ANÚNCIO">
+ <text name="explanation_text">
+ Seu anúncio será publicado por uma semana a partir da data de publicação.
+
+A posição do seu anúncio nos classificados depende de quanto você paga.
+
+Os anúncios de maior valor vão para o topo da lista e aparecem mais no topo dos resultados de busca.
+ </text>
+ <text name="price_text">
+ Preço do anúncio:
+ </text>
+ <text name="price_symbol">
+ L$
+ </text>
+ <button label="OK" name="set_price_btn"/>
+ <button label="Cancelar" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_sell_land.xml b/indra/newview/skins/default/xui/pt/floater_sell_land.xml
index e6d4dc7ed6..014ae0845e 100644
--- a/indra/newview/skins/default/xui/pt/floater_sell_land.xml
+++ b/indra/newview/skins/default/xui/pt/floater_sell_land.xml
@@ -55,8 +55,9 @@
<radio_item label="Sim, vender o terreno com os objetos" name="yes"/>
</radio_group>
<button label="Mostrar objetos" name="show_objects"/>
- <text name="nag_message_label">
- LEMBRE-SE: Qualquer transação de compra e venda é irreversível.
+ <text name="nag_message_label" font="SansSerifSmallBold">
+ LEMBRE-SE: Qualquer transação de compra
+e venda é irreversível.
</text>
<button label="Colocar terreno à venda" name="sell_btn"/>
<button label="Cancelar" name="cancel_btn"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_settings_debug.xml b/indra/newview/skins/default/xui/pt/floater_settings_debug.xml
index c6694d13b2..83f7b24572 100644
--- a/indra/newview/skins/default/xui/pt/floater_settings_debug.xml
+++ b/indra/newview/skins/default/xui/pt/floater_settings_debug.xml
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="settings_debug" title="DEBUG SETTINGS">
<radio_group name="boolean_combo">
- <radio_item label="TRUE" name="TRUE" value="verdadeiro"/>
- <radio_item label="FALSE" name="FALSE" value=""/>
+ <radio_item label="TRUE" name="TRUE" />
+ <radio_item label="FALSE" name="FALSE" />
</radio_group>
<color_swatch label="Cor" name="val_color_swatch"/>
<spinner label="x" name="val_spinner_1"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_sound_devices.xml b/indra/newview/skins/default/xui/pt/floater_sound_devices.xml
new file mode 100644
index 0000000000..0e6d923778
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_sound_devices.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_sound_devices" title="Dispositivos de áudio">
+ <text name="voice_label">
+ Bate-papo de voz
+ </text>
+ <check_box label="Ativado" name="enable_voice"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_tools.xml b/indra/newview/skins/default/xui/pt/floater_tools.xml
index 7289b592fd..ed273d9f28 100644
--- a/indra/newview/skins/default/xui/pt/floater_tools.xml
+++ b/indra/newview/skins/default/xui/pt/floater_tools.xml
@@ -125,6 +125,18 @@
<text left="134" name="prim_count">
Prims: [COUNT]
</text>
+ <text name="linked_set_count">
+ Conjuntos linkados: [COUNT]
+ </text>
+ <text name="linked_set_cost" tool_tip="Custo dos conjuntos selecionados [prims],[complexidade física]">
+ Custo: [COST] / [PHYSICS]
+ </text>
+ <text name="object_count">
+ Objetos: [COUNT]
+ </text>
+ <text name="object_cost" tool_tip="Custo dos objetos selecionados [prims] / [complexidade física]">
+ Custo: [COST] / [PHYSICS]
+ </text>
<tab_container name="Object Info Tabs" tab_max_width="60" tab_min_width="30" width="288">
<panel label="Comum" name="General">
<panel.string name="text deed continued">
@@ -269,15 +281,6 @@
<combo_box.item label="Anel" name="Ring"/>
<combo_box.item label="Esculpida" name="Sculpted"/>
</combo_box>
- <combo_box name="material">
- <combo_box.item label="Pedra" name="Stone"/>
- <combo_box.item label="Metal" name="Metal"/>
- <combo_box.item label="Vidro" name="Glass"/>
- <combo_box.item label="Madeira" name="Wood"/>
- <combo_box.item label="Carne" name="Flesh"/>
- <combo_box.item label="Plástico" name="Plastic"/>
- <combo_box.item label="Couro" name="Rubber"/>
- </combo_box>
<text name="text cut">
Path Cut (begin/end)
</text>
@@ -350,9 +353,19 @@
<combo_box.item label="Toróide" name="Torus"/>
<combo_box.item label="Plano" name="Plane"/>
<combo_box.item label="Cilindro" name="Cylinder"/>
+ <combo_box.item label="Mesh" name="Mesh"/>
</combo_box>
</panel>
<panel label="Recursos" name="Features">
+ <panel.string name="None">
+ Nenhum
+ </panel.string>
+ <panel.string name="Prim">
+ Prim
+ </panel.string>
+ <panel.string name="Convex Hull">
+ Hull convexo
+ </panel.string>
<text name="select_single" width="272">
Selecione apenas um prim para editar suas características.
</text>
@@ -377,6 +390,23 @@
<spinner label="Enfocar" name="Light Focus"/>
<spinner label="Queda" name="Light Falloff"/>
<spinner label="Ambiente" name="Light Ambiance"/>
+ <text name="label physicsshapetype">
+ Tipo de formato físico:
+ </text>
+ <combo_box name="Physics Shape Type Combo Ctrl" tool_tip="Selecione o tipo de formato físico"/>
+ <combo_box name="material">
+ <combo_box.item label="Pedra" name="Stone"/>
+ <combo_box.item label="Metal" name="Metal"/>
+ <combo_box.item label="Vidro" name="Glass"/>
+ <combo_box.item label="Madeira" name="Wood"/>
+ <combo_box.item label="Carne" name="Flesh"/>
+ <combo_box.item label="Plástico" name="Plastic"/>
+ <combo_box.item label="Borrracha" name="Rubber"/>
+ </combo_box>
+ <spinner label="Gravidade" name="Physics Gravity"/>
+ <spinner label="Fricção" name="Physics Friction"/>
+ <spinner label="Densidade" name="Physics Density"/>
+ <spinner label="Restituição" name="Physics Restitution"/>
</panel>
<panel label="Textura" name="Texture">
<panel.string name="string repeats per meter">
diff --git a/indra/newview/skins/default/xui/pt/floater_top_objects.xml b/indra/newview/skins/default/xui/pt/floater_top_objects.xml
index dc3bf73818..c3d5820616 100644
--- a/indra/newview/skins/default/xui/pt/floater_top_objects.xml
+++ b/indra/newview/skins/default/xui/pt/floater_top_objects.xml
@@ -39,14 +39,14 @@
<text name="id_text">
ID do Objeto:
</text>
- <line_editor font="SansSerifSmall" left="140" name="id_editor" width="280"/>
+ <line_editor font="SansSerifSmall" name="id_editor"/>
<button label="Mostrar Avisos" name="show_beacon_btn"/>
<text name="obj_name_text">
Nome do objeto:
</text>
- <line_editor font="SansSerifSmall" left="140" name="object_name_editor" width="280"/>
+ <line_editor font="SansSerifSmall" name="object_name_editor"/>
<button label="Filtro" name="filter_object_btn"/>
- <text name="owner_name_text" width="130">
+ <text name="owner_name_text">
Proprietário:
</text>
<line_editor font="SansSerifSmall" left="140" name="owner_name_editor" width="280"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_water.xml b/indra/newview/skins/default/xui/pt/floater_water.xml
deleted file mode 100644
index b4613e0890..0000000000
--- a/indra/newview/skins/default/xui/pt/floater_water.xml
+++ /dev/null
@@ -1,86 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Water Floater" title="EDITOR DE ÃGUA AVANÇADO">
- <text name="KeyFramePresetsText" width="154">
- Pré-configurações da Ãgua:
- </text>
- <combo_box left_delta="160" name="WaterPresetsCombo" width="150"/>
- <button label="Novo" label_selected="Novo" name="WaterNewPreset"/>
- <button label="Salvar" label_selected="Salvar" name="WaterSavePreset"/>
- <button label="Deletar" label_selected="Deletar" name="WaterDeletePreset"/>
- <tab_container name="Water Tabs">
- <panel label="DEFINIÇÕES" name="Settings">
- <text name="BHText">
- Cor da névoa da Ãgua
- </text>
- <button label="?" name="WaterFogColorHelp"/>
- <color_swatch label="" name="WaterFogColor" tool_tip="Selecionar a cor"/>
- <text name="WaterFogDensText">
- Expoente da Densidade de névoa
- </text>
- <button label="?" left="209" name="WaterFogDensityHelp"/>
- <text name="WaterUnderWaterFogModText">
- Modificador da névoa Subaquática
- </text>
- <button label="?" left="209" name="WaterUnderWaterFogModHelp"/>
- <text name="BDensText">
- Escala da Marola de Reflexão
- </text>
- <button label="?" left="415" name="WaterNormalScaleHelp"/>
- <text name="BHText2">
- 1
- </text>
- <text name="BHText3">
- 2
- </text>
- <text name="BHText4">
- 3
- </text>
- <text name="HDText">
- Escala de Fresnel
- </text>
- <button label="?" left="415" name="WaterFresnelScaleHelp"/>
- <text name="FresnelOffsetText">
- Deslocamento de Fresnel
- </text>
- <button label="?" left="415" name="WaterFresnelOffsetHelp"/>
- <text name="DensMultText">
- Refratar a Escala para Cima
- </text>
- <button label="?" left="640" name="WaterScaleAboveHelp"/>
- <text name="WaterScaleBelowText">
- Refratar a Escala para Baixo
- </text>
- <button label="?" left="640" name="WaterScaleBelowHelp"/>
- <text name="MaxAltText">
- Multiplicador de Difusão
- </text>
- <button label="?" left="640" name="WaterBlurMultiplierHelp"/>
- </panel>
- <panel label="IMAGEM" name="Waves">
- <text name="BHText">
- Direção da Onda Maior
- </text>
- <button label="?" left="170" name="WaterWave1Help"/>
- <text name="WaterWave1DirXText">
- X
- </text>
- <text name="WaterWave1DirYText">
- Y
- </text>
- <text name="BHText2">
- Direção da Onda Pequena
- </text>
- <button label="?" left="170" name="WaterWave2Help"/>
- <text name="WaterWave2DirXText">
- X
- </text>
- <text name="WaterWave2DirYText">
- Y
- </text>
- <text name="BHText3">
- Mapa Normal
- </text>
- <button label="?" name="WaterNormalMapHelp"/>
- </panel>
- </tab_container>
-</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_windlight_options.xml b/indra/newview/skins/default/xui/pt/floater_windlight_options.xml
deleted file mode 100644
index 22632a4ef8..0000000000
--- a/indra/newview/skins/default/xui/pt/floater_windlight_options.xml
+++ /dev/null
@@ -1,187 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="WindLight floater" title="EDITOR DE CÉU AVANÇADO">
- <text name="KeyFramePresetsText" width="130">
- Pré-definições de Céu:
- </text>
- <combo_box left_delta="130" name="WLPresetsCombo"/>
- <button label="Novo" label_selected="Novo" name="WLNewPreset"/>
- <button label="Salvar" label_selected="Salvar" left_delta="72" name="WLSavePreset"/>
- <button label="Deletar" label_selected="Deletar" left_delta="72" name="WLDeletePreset"/>
- <button label="Editor de Ciclos do Dia" label_selected="Editor de Ciclos do Dia" left_delta="84" name="WLDayCycleMenuButton" width="150"/>
- <tab_container name="WindLight Tabs">
- <panel label="ATMOSFERA" name="Atmosphere">
- <text name="BHText">
- Horizonte Azul
- </text>
- <button label="?" name="WLBlueHorizonHelp"/>
- <text name="BHText2">
- R
- </text>
- <text name="BHText3">
- G
- </text>
- <text name="BHText4">
- B
- </text>
- <text name="BHText5">
- I
- </text>
- <text name="BDensText">
- Horizonte da Neblina
- </text>
- <button label="?" name="WLHazeHorizonHelp"/>
- <text name="BDensText2">
- Densidade de Azul
- </text>
- <button label="?" name="WLBlueDensityHelp"/>
- <text name="BHText6">
- R
- </text>
- <text name="BHText7">
- G
- </text>
- <text name="BHText8">
- B
- </text>
- <text name="BHText9">
- I
- </text>
- <text name="HDText">
- Densidade da Neblina
- </text>
- <button label="?" name="WLHazeDensityHelp"/>
- <text name="DensMultText">
- Multiplicador de Densidade
- </text>
- <button label="?" left="635" name="WLDensityMultHelp"/>
- <text name="WLDistanceMultText">
- Multiplicador de Distância
- </text>
- <button label="?" left="635" name="WLDistanceMultHelp"/>
- <text name="MaxAltText">
- Altitude Máxima
- </text>
- <button label="?" left="635" name="WLMaxAltitudeHelp"/>
- </panel>
- <panel label="ILUMINAÇÃO" name="Lighting">
- <text name="SLCText">
- Cor do Sol/Lua
- </text>
- <button label="?" name="WLSunlightColorHelp"/>
- <text name="BHText">
- R
- </text>
- <text name="BHText2">
- G
- </text>
- <text name="BHText3">
- B
- </text>
- <text name="BHText4">
- I
- </text>
- <text name="TODText">
- Posição do Sol/Lua
- </text>
- <button label="?" name="WLTimeOfDayHelp"/>
- <text name="WLAmbientText">
- Ambiente
- </text>
- <button label="?" name="WLAmbientHelp"/>
- <text name="BHText5">
- R
- </text>
- <text name="BHText6">
- G
- </text>
- <text name="BHText7">
- B
- </text>
- <text name="BHText8">
- I
- </text>
- <text name="WLEastAngleText">
- Ângulo Leste
- </text>
- <button label="?" name="WLEastAngleHelp"/>
- <text name="SunGlowText">
- Brilho do Sol
- </text>
- <button label="?" name="WLSunGlowHelp"/>
- <slider label="Foco" name="WLGlowB"/>
- <slider label="Tamanho" name="WLGlowR"/>
- <text name="SceneGammaText">
- Gamma da Cena
- </text>
- <button label="?" name="WLSceneGammaHelp"/>
- <text name="WLStarText">
- Brilho da Estrela
- </text>
- <button label="?" name="WLStarBrightnessHelp"/>
- </panel>
- <panel label="NUVENS" name="Clouds">
- <text name="WLCloudColorText">
- Cor da Nuvem
- </text>
- <button label="?" name="WLCloudColorHelp"/>
- <text name="BHText">
- R
- </text>
- <text name="BHText2">
- G
- </text>
- <text name="BHText3">
- B
- </text>
- <text name="BHText4">
- I
- </text>
- <text name="WLCloudColorText2">
- Densidade/ XY da Nuvem
- </text>
- <button label="?" name="WLCloudDensityHelp"/>
- <text name="BHText5">
- X
- </text>
- <text name="BHText6">
- Y
- </text>
- <text name="BHText7">
- D
- </text>
- <text name="WLCloudCoverageText">
- Cobertura da Nuvem
- </text>
- <button label="?" name="WLCloudCoverageHelp"/>
- <text name="WLCloudScaleText">
- Escala da Nuvem
- </text>
- <button label="?" name="WLCloudScaleHelp"/>
- <text font="SansSerifSmall" name="WLCloudDetailText">
- Detalhe da Nuvem (XY/Densidade)
- </text>
- <button label="?" left="421" name="WLCloudDetailHelp"/>
- <text name="BHText8">
- X
- </text>
- <text name="BHText9">
- Y
- </text>
- <text name="BHText10">
- D
- </text>
- <text name="WLCloudScrollXText">
- Rolagem X da Nuvem
- </text>
- <button label="?" name="WLCloudScrollXHelp"/>
- <check_box label="Travar" name="WLCloudLockX"/>
- <text name="WLCloudScrollYText">
- Rolagem Y da Nuvem
- </text>
- <button label="?" name="WLCloudScrollYHelp"/>
- <check_box label="Travar" name="WLCloudLockY"/>
- <check_box label="Desenhar Nuvens Clássicas" name="DrawClassicClouds"/>
- <button label="?" left="645" name="WLClassicCloudsHelp"/>
- </panel>
- </tab_container>
-</floater>
diff --git a/indra/newview/skins/default/xui/pt/language_settings.xml b/indra/newview/skins/default/xui/pt/language_settings.xml
index e1de6ffea7..8799475ace 100644
--- a/indra/newview/skins/default/xui/pt/language_settings.xml
+++ b/indra/newview/skins/default/xui/pt/language_settings.xml
@@ -4,6 +4,7 @@
<!-- Locale Information -->
<string name="MicrosoftLocale">portuguese</string>
+ <string name="MacLocale">pt_PT.UTF-8</string>
<string name="DarwinLocale">pt_PT.UTF-8</string>
<string name="LinuxLocale">pt_PT.UTF-8</string>
diff --git a/indra/newview/skins/default/xui/pt/menu_inventory_add.xml b/indra/newview/skins/default/xui/pt/menu_inventory_add.xml
index 9f345b5b6e..7a7ebc50af 100644
--- a/indra/newview/skins/default/xui/pt/menu_inventory_add.xml
+++ b/indra/newview/skins/default/xui/pt/menu_inventory_add.xml
@@ -4,6 +4,8 @@
<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="Modelar..." name="Upload Model"/>
+ <menu_item_call label="Assistente de modelagem..." name="Upload Model Wizard"/>
<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>
diff --git a/indra/newview/skins/default/xui/pt/menu_model_import_gear_default.xml b/indra/newview/skins/default/xui/pt/menu_model_import_gear_default.xml
new file mode 100644
index 0000000000..079f876add
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/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="Mostrar bordas" name="show_edges"/>
+ <menu_item_check label="Mostrar física" name="show_physics"/>
+ <menu_item_check label="Mostrar texturas" name="show_textures"/>
+ <menu_item_check label="Mostrar peso da pele" name="show_skin_weight"/>
+ <menu_item_check label="Mostrar posição das juntas" name="show_joint_positions"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_viewer.xml b/indra/newview/skins/default/xui/pt/menu_viewer.xml
index 0a2a2994f6..4213db7440 100644
--- a/indra/newview/skins/default/xui/pt/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/pt/menu_viewer.xml
@@ -120,6 +120,8 @@
<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="Modelar..." name="Upload Model"/>
+ <menu_item_call label="Assistente de modelagem..." name="Upload Model Wizard"/>
<menu_item_call label="Volume (L$[COST] por arquivo)..." name="Bulk Upload"/>
</menu>
<menu_item_call label="Desfazer" name="Undo"/>
@@ -159,7 +161,7 @@
<menu_item_check label="Alpha" name="Alpha"/>
<menu_item_check label="Ãrvore" name="Tree"/>
<menu_item_check label="Avatares" name="Character"/>
- <menu_item_check label="SurfacePath" name="SurfacePath"/>
+ <menu_item_check label="Patch de superfície" name="Surface Patch"/>
<menu_item_check label="Céu" name="Sky"/>
<menu_item_check label="Ãgua" name="Water"/>
<menu_item_check label="Chão" name="Ground"/>
@@ -217,6 +219,7 @@
<menu_item_check label="Painel de texturas" name="Texture Category"/>
<menu_item_check label="Tempos" name="Fast Timers"/>
<menu_item_check label="Memória" name="Memory"/>
+ <menu_item_check label="Estatísticas da cena" name="Scene Statistics"/>
<menu_item_call label="Region Info to Debug Console" name="Region Info to Debug Console"/>
<menu_item_check label="Câmera:" name="Camera"/>
<menu_item_check label="Vento" name="Wind"/>
@@ -224,6 +227,7 @@
</menu>
<menu label="Show Info" name="Display Info">
<menu_item_check label="Mostrar hora" name="Show Time"/>
+ <menu_item_check label="Mostar custo do upload" name="Show Upload Cost"/>
<menu_item_check label="Dados de renderização" name="Show Render Info"/>
<menu_item_check label="Mostrar info da textura" name="Show Texture Info"/>
<menu_item_check label="Mostrar cor sob o cursor" name="Show Color Under Cursor"/>
@@ -246,7 +250,12 @@
<menu_item_check label="Frame Test" name="Frame Test"/>
</menu>
<menu label="Render Metadata" name="Render Metadata">
+ <menu_item_check label="Normais" name="Normals"/>
+ <menu_item_check label="Formas físicas" name="Physics Shapes"/>
<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="Esculpir" name="Sculpt"/>
</menu>
<menu label="Rendering" name="Rendering">
<menu_item_check label="Axes" name="Axes"/>
@@ -312,6 +321,7 @@
<menu_item_call label="Depurar texturas do avatar" name="Debug Avatar Textures"/>
</menu>
<menu_item_check label="Texturas HTTP" name="HTTP Textures"/>
+ <menu_item_check label="Inventário HTTP" name="HTTP Inventory"/>
<menu_item_check label="Console Window on next Run" name="Console Window"/>
<menu_item_call label="Request Admin Status" name="Request Admin Options"/>
<menu_item_call label="Sair do modo admin" name="Leave Admin Options"/>
diff --git a/indra/newview/skins/default/xui/pt/notifications.xml b/indra/newview/skins/default/xui/pt/notifications.xml
index 0786a62f13..56a33f51e8 100644
--- a/indra/newview/skins/default/xui/pt/notifications.xml
+++ b/indra/newview/skins/default/xui/pt/notifications.xml
@@ -2148,6 +2148,12 @@ Ela pode afetar a digitação da senha.
<notification name="RezItemNoPermissions">
Sem permissões suficientes para criar objetos.
</notification>
+ <notification name="IMAcrossParentEstates">
+ Não é possível enviar MIs entre propriedades-pai.
+ </notification>
+ <notification name="TransferInventoryAcrossParentEstates">
+ Não é possível transferir o inventário para propriedades-pai.
+ </notification>
<notification name="UnableToLoadNotecard">
Não é possível carregar notas neste momento.
</notification>
@@ -2718,6 +2724,10 @@ Para sua segurança, os SLurls serão bloqueados por alguns instantes.
Sua voz foi silenciada pelo moderador.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
+ <notification name="UploadCostConfirmation">
+ O carregamento custa L$[PRICE]. Deseja prosseguir?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Carregar"/>
+ </notification>
<notification name="ConfirmClearTeleportHistory">
Tem certeza que deseja apagar todo o seu histórico de teletransporte?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
@@ -2729,6 +2739,9 @@ O botão será exibido quando houver espaço suficente.
<notification name="ShareNotification">
Selecione os residentes com quem compartilhar.
</notification>
+ <notification name="MeshUploadError">
+ [LABEL] não foi carregado: [MESSAGE] [IDENTIFIER] [INVALIDITY_IDENTIFIER]
+ </notification>
<notification name="ShareItemsConfirmation">
Tem certeza de que quer compartilhar os itens abaixo?
@@ -2745,6 +2758,19 @@ Com os seguintes residentes:
<notification name="DeedToGroupFail">
Ocorreu uma falha durante a doação ao grupo.
</notification>
+ <notification name="ReleaseLandThrottled">
+ O lote [PARCEL_NAME] não pode ser abandonado.
+ </notification>
+ <notification name="ReleasedLandWithReclaim">
+ O lote de [AREA] m² &apos;[PARCEL_NAME]&apos; foi liberado.
+
+Você tem [RECLAIM_PERIOD] para reivindicá-lo por L$0. Depois o lote será colocado à venda para qualquer interessado.
+ </notification>
+ <notification name="ReleasedLandNoReclaim">
+ O lote de [AREA] m² &apos;[PARCEL_NAME]&apos; foi liberado.
+
+Ele está à venda para qualquer interessado.
+ </notification>
<notification name="AvatarRezNotification">
( [EXISTENCE] segundos de vida )
O avatar de &apos;[NAME]&apos; emergiu em [TIME] segundos.
@@ -2883,6 +2909,10 @@ Se o botão Falar for ocultado, o recurso de voz será desabilitado.
É preciso usar o modo Avançado para criar e editar grupos. Desejar sair para mudar o modo? Selecione o modo na tela de login.
<usetemplate name="okcancelbuttons" notext="Não sair" yestext="Sair"/>
</notification>
+ <notification label="" name="NoPlaceInfo">
+ É preciso estar no modo Avançado para visualizar o perfil de um lugar. Deseja sair para mudar o modo? Selecione o modo na tela de login.
+ <usetemplate name="okcancelbuttons" notext="Não sair" yestext="Sair"/>
+ </notification>
<notification label="" name="NoPicks">
É preciso usar o modo Avançado para criar e editar Destaques. Desejar sair para mudar o modo? Selecione o modo na tela de login.
<usetemplate name="okcancelbuttons" notext="Não sair" yestext="Sair"/>
@@ -2903,9 +2933,18 @@ Se o botão Falar for ocultado, o recurso de voz será desabilitado.
É preciso usar o modo Avançado para fazer pagamentos a outros residentes. Desejar sair para mudar o modo?
<usetemplate name="okcancelbuttons" notext="Não sair" yestext="Sair"/>
</notification>
- <global name="UnsupportedCPU">
- - A velocidade da sua CPU não suporta os requisitos mínimos exigidos.
- </global>
+ <notification label="" name="NoInventory">
+ É preciso estar no modo Avançado para visualizar o inventário. Deseja sair para mudar o modo?
+ <usetemplate name="okcancelbuttons" notext="Não sair" yestext="Sair"/>
+ </notification>
+ <notification label="" name="NoAppearance">
+ É preciso usar o modo Avançado para usar o editor de visual. Deseja sair para mudar o modo?
+ <usetemplate name="okcancelbuttons" notext="Não sair" yestext="Sair"/>
+ </notification>
+ <notification label="" name="NoSearch">
+ É 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>
<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_edit_pick.xml b/indra/newview/skins/default/xui/pt/panel_edit_pick.xml
index 432affcf09..5eb9987e71 100644
--- a/indra/newview/skins/default/xui/pt/panel_edit_pick.xml
+++ b/indra/newview/skins/default/xui/pt/panel_edit_pick.xml
@@ -29,7 +29,7 @@
<layout_panel name="layout_panel1">
<button label="Salvar destaque" name="save_changes_btn"/>
</layout_panel>
- <layout_panel name="layout_panel1">
+ <layout_panel name="layout_panel2">
<button label="Cancelar" name="cancel_btn"/>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/pt/panel_friends.xml b/indra/newview/skins/default/xui/pt/panel_friends.xml
deleted file mode 100644
index 34073f9ce1..0000000000
--- a/indra/newview/skins/default/xui/pt/panel_friends.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="friends">
- <string name="Multiple">
- Diversos amigos
- </string>
- <scroll_list name="friend_list" tool_tip="Aperte shift ou control enquanto clica para selecionar múltiplos amigos">
- <column name="icon_online_status" tool_tip="Status Online"/>
- <column label="Nome" name="friend_name" tool_tip="Nome"/>
- <column name="icon_visible_online" tool_tip="Amigo pode ver quando você está online"/>
- <column name="icon_visible_map" tool_tip="Amigo pode localizá-lo no mapa"/>
- <column name="icon_edit_mine" tool_tip="Amigo pode editar, apagar ou pegar seus objetos"/>
- <column name="icon_edit_theirs" tool_tip="Você pode editar os objetos deste amigo"/>
- </scroll_list>
- <button label="MI/Chamar" name="im_btn" tool_tip="Abrir sessão de Mensagem Instantânea" width="86"/>
- <button label="Perfil" name="profile_btn" tool_tip="Mostrar foto, grupos e outras informações" width="86"/>
- <button label="Teletransportar" name="offer_teleport_btn" tool_tip="Oferecer a este amigo o teletransporte para sua localização atual" width="86"/>
- <button label="Pagar" name="pay_btn" tool_tip="Dar Linden dólares (L$) a este amigo" width="86"/>
- <button label="Tirar" name="remove_btn" tool_tip="Remover esta pessoa de sua lista de amigos" width="86"/>
- <button label="Adicionar" name="add_btn" tool_tip="Oferecer amizade para um residente" width="86"/>
-</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_group_notices.xml b/indra/newview/skins/default/xui/pt/panel_group_notices.xml
index 21136d06fb..3bff1f8fb3 100644
--- a/indra/newview/skins/default/xui/pt/panel_group_notices.xml
+++ b/indra/newview/skins/default/xui/pt/panel_group_notices.xml
@@ -24,18 +24,15 @@ Cada grupo pode enviar no máximo 200 avisos/dia
<text name="lbl">
Criar notícia
</text>
- <text left="20" name="lbl3">
+ <text name="lbl3">
Assunto:
</text>
- <line_editor left_delta="61" name="create_subject" width="251"/>
- <text left="15" name="lbl4" width="60">
+ <text name="lbl4">
Mensagem:
</text>
- <text_editor left_delta="66" name="create_message" width="330"/>
- <text name="lbl5" width="68">
+ <text name="lbl5">
Anexo:
</text>
- <line_editor left_delta="74" name="create_inventory_name" width="190"/>
<text name="string">
Arrastar e soltar o item aqui para anexá-lo:
</text>
diff --git a/indra/newview/skins/default/xui/pt/panel_media_settings_security.xml b/indra/newview/skins/default/xui/pt/panel_media_settings_security.xml
index 646969946c..e38c44d8fe 100644
--- a/indra/newview/skins/default/xui/pt/panel_media_settings_security.xml
+++ b/indra/newview/skins/default/xui/pt/panel_media_settings_security.xml
@@ -2,7 +2,8 @@
<panel label="Segurança" name="Media Settings Security">
<check_box initial_value="false" label="Acesso permitido a URLs com padrão específico" name="whitelist_enable"/>
<text name="home_url_fails_some_items_in_whitelist">
- URLs com falha de acesso na página inicial são indicados com um:
+ URLs com falha de acesso na página inicial são
+indicados com um:
</text>
<button label="Adicionar" name="whitelist_add"/>
<button label="Excluir" name="whitelist_del"/>
diff --git a/indra/newview/skins/default/xui/pt/panel_people.xml b/indra/newview/skins/default/xui/pt/panel_people.xml
index aece30738b..f3af15b991 100644
--- a/indra/newview/skins/default/xui/pt/panel_people.xml
+++ b/indra/newview/skins/default/xui/pt/panel_people.xml
@@ -66,16 +66,16 @@ Em busca de alguém para conversar? Procure no [secondlife:///app/worldmap Mapa-
<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="chat_btn_lp">
+ <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="chat_btn_lp">
+ <layout_panel name="call_btn_lp">
<button label="Ligar" name="call_btn" tool_tip="Ligar para este residente"/>
</layout_panel>
- <layout_panel name="chat_btn_lp">
+ <layout_panel name="share_btn_lp">
<button label="Compartilhar" name="share_btn" tool_tip="Compartilhar item de inventário"/>
</layout_panel>
- <layout_panel name="chat_btn_lp">
+ <layout_panel name="teleport_btn_lp">
<button label="Teletransportar" name="teleport_btn" tool_tip="Oferecer teletransporte"/>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_colors.xml b/indra/newview/skins/default/xui/pt/panel_preferences_colors.xml
index 46d9517a98..d6c6f66e37 100644
--- a/indra/newview/skins/default/xui/pt/panel_preferences_colors.xml
+++ b/indra/newview/skins/default/xui/pt/panel_preferences_colors.xml
@@ -22,6 +22,9 @@
<text name="text_box5">
Erros
</text>
+ <text name="text_box10">
+ Direto
+ </text>
<text name="text_box7">
Proprietário
</text>
diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/pt/panel_preferences_graphics1.xml
index 4b03c79a9e..28e7184326 100644
--- a/indra/newview/skins/default/xui/pt/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/pt/panel_preferences_graphics1.xml
@@ -28,8 +28,20 @@ rápido
</text>
<check_box initial_value="verdadeiro" label="Ãgua transparente" name="TransparentWater"/>
<check_box initial_value="true" label="Bump de Mapeamento e Brilho" name="BumpShiny"/>
+ <check_box initial_value="verdadeiro" label="Luzes locais" name="LocalLights"/>
<check_box initial_value="true" label="Sombreadores básicos" name="BasicShaders" tool_tip="Desabilitar esta opção poderá impedir que alguns drivers de placa de vídeo a travem."/>
<check_box initial_value="true" label="Sombreadores Atmosféricos" name="WindLightUseAtmosShaders"/>
+ <check_box initial_value="verdadeiro" label="Iluminação e sombras" name="UseLightShaders"/>
+ <check_box initial_value="verdadeiro" label="Oclusão ambiental" name="UseSSAO"/>
+ <check_box initial_value="verdadeiro" label="Profundidade" name="UseDoF"/>
+ <text name="shadows_label">
+ Sombras:
+ </text>
+ <combo_box name="ShadowDetail">
+ <combo_box.item label="Nenhum" name="0"/>
+ <combo_box.item label="Sol/Lua" name="1"/>
+ <combo_box.item label="Sol/Lua + Projetores" name="2"/>
+ </combo_box>
<text name="reflection_label">
Reflexo de água:
</text>
diff --git a/indra/newview/skins/default/xui/pt/panel_region_general.xml b/indra/newview/skins/default/xui/pt/panel_region_general.xml
index e06f3c74bf..4be1cd11c0 100644
--- a/indra/newview/skins/default/xui/pt/panel_region_general.xml
+++ b/indra/newview/skins/default/xui/pt/panel_region_general.xml
@@ -25,6 +25,7 @@
<check_box label="Permitir revenda do terreno" name="allow_land_resell_check"/>
<check_box label="Permitir junção/divisão do terreno" name="allow_parcel_changes_check"/>
<check_box label="Bloquear exibição do terreno na busca" name="block_parcel_search_check" tool_tip="Permitir que as pessoas vejam esta região e seus lotes nos resultados de busca"/>
+ <check_box label="Permitir objetos mesh" name="mesh_rez_enabled_check" tool_tip="Permitir que que outras pessoas renderizem objectos mesh nessa região"/>
<spinner label="Limite do agente" name="agent_limit_spin"/>
<spinner label="Bônus de objetos" name="object_bonus_spin"/>
<text label="Maturidade" name="access_text">
diff --git a/indra/newview/skins/default/xui/pt/panel_sound_devices.xml b/indra/newview/skins/default/xui/pt/panel_sound_devices.xml
new file mode 100644
index 0000000000..fb612ca19b
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_sound_devices.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<panel label="Configuração de dispositivos" name="device_settings_panel">
+ <panel.string name="default_text">
+ Padrão
+ </panel.string>
+ <text name="Input">
+ Entrada
+ </text>
+ <text name="My volume label">
+ Meu volume:
+ </text>
+ <slider_bar initial_value="1.0" name="mic_volume_slider" tool_tip="Mude o volume usando o controle deslizante"/>
+ <text name="wait_text">
+ Aguarde
+ </text>
+ <text name="Output">
+ Saída
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/strings.xml b/indra/newview/skins/default/xui/pt/strings.xml
index 1dbbcafb0e..ed93217d59 100644
--- a/indra/newview/skins/default/xui/pt/strings.xml
+++ b/indra/newview/skins/default/xui/pt/strings.xml
@@ -118,6 +118,100 @@
<string name="create_account_url">
http://join.secondlife.com/index.php?lang=pt-BR
</string>
+ <string name="LoginFailedViewerNotPermitted">
+ O visualizador utilizado já não é compatível com o Second Life. Visite a página abaixo para baixar uma versão atual: http://secondlife.com/download
+
+Para saber mais, visite as perguntas frequentes abaixo: http://secondlife.com/viewer-access-faq
+ </string>
+ <string name="LoginIntermediateOptionalUpdateAvailable">
+ Existe uma versão atualizada do seu visualizador: [VERSION]
+ </string>
+ <string name="LoginFailedRequiredUpdate">
+ Atualização de visualizador obrigatória: [VERSION]
+ </string>
+ <string name="LoginFailedAlreadyLoggedIn">
+ Este agente já fez login.
+ </string>
+ <string name="LoginFailedAuthenticationFailed">
+ Desculpe! Não foi possível fazer seu login. Verifique se digitou o nome de usuário correto* (como kiki45 ou astro.física) * e senha. Verifique também que a tecla Maiúscula está desativada.
+ </string>
+ <string name="LoginFailedPasswordChanged">
+ Como medida de precaução, sua senha foi alterada. Visite sua conta em http://secondlife.com/password e responda a pergunta de segurança para mudar sua senha. Lamentamos qualquer inconveniente.
+ </string>
+ <string name="LoginFailedPasswordReset">
+ Fizemos algumas alterações a seu sistema. Você precisa selecionar outra senha. Visite sua conta em http://secondlife.com/password e responda a pergunta de segurança para mudar sua senha. Lamentamos qualquer inconveniente.
+ </string>
+ <string name="LoginFailedEmployeesOnly">
+ O Second Life está fechado para manutenção no momento. Somente funcionários podem acessá-lo. Consulte www.secondlife.com/status para as últimas atualizações.
+ </string>
+ <string name="LoginFailedPremiumOnly">
+ O acesso ao Second Life está sendo restrito por alguns instantes para que todos tenham a melhor experiência possível.
+
+Titulares de contas gratuitas não poderão acessar o Second Life para acomodar os assinantes do Second Life.
+ </string>
+ <string name="LoginFailedComputerProhibited">
+ O Second Life não pode ser acessado deste computador. Se você acredita que houve algum equívoco, contate support@secondlife.com.
+ </string>
+ <string name="LoginFailedAcountSuspended">
+ Sua conta não está disponível para acesso até [TIME], horário do Pacífico nos EUA (GMT-08).
+ </string>
+ <string name="LoginFailedAccountDisabled">
+ Não é possível concluir a solicitação neste momento. Para obter mais ajuda, conte o suporte em http://secondlife.com/support. Caso você não possa mudar sua senha, ligue para (866) 476-9763.
+ </string>
+ <string name="LoginFailedTransformError">
+ Dados discrepantes detectados durante o login. Contate support@secondlife.com.
+ </string>
+ <string name="LoginFailedAccountMaintenance">
+ Sua conta está passando por um breve período de manutenção. Sua conta não está disponível para acesso até [TIME], horário do Pacífico nos EUA (GMT-08). Se você acredita que houve algum equívoco, contate support@secondlife.com.
+ </string>
+ <string name="LoginFailedPendingLogoutFault">
+ Reação à solicitação de saída foi uma falha do simulador.
+ </string>
+ <string name="LoginFailedPendingLogout">
+ O sistema está passando para o modo offline. Sua conta não está disponível para acesso até [TIME], horário do Pacífico nos EUA (GMT-08).
+ </string>
+ <string name="LoginFailedUnableToCreateSession">
+ Impossível criar sessão válida.
+ </string>
+ <string name="LoginFailedUnableToConnectToSimulator">
+ Não foi possível conectar o simulador.
+ </string>
+ <string name="LoginFailedRestrictedHours">
+ Sua conta possui acesso ao Second Life das [START] às [END], horário da costa leste dos EUA. Volte novamente durante seu horário de acesso. Se você acredita que houve algum equívoco, contate support@secondlife.com.
+ </string>
+ <string name="LoginFailedIncorrectParameters">
+ Parâmetros incorretos. Se você acredita que houve algum equívoco, contate support@secondlife.com.
+ </string>
+ <string name="LoginFailedFirstNameNotAlphanumeric">
+ O parâmetro de primeiro nome deve ser alfanumérico. Se você acredita que houve algum equívoco, contate support@secondlife.com.
+ </string>
+ <string name="LoginFailedLastNameNotAlphanumeric">
+ O parâmetro de sobrenome deve ser alfanumérico. Se você acredita que houve algum equívoco, contate support@secondlife.com.
+ </string>
+ <string name="LogoutFailedRegionGoingOffline">
+ Região passando para modo offline. Tente novamente dentro de alguns instantes.
+ </string>
+ <string name="LogoutFailedAgentNotInRegion">
+ Não há agente na região. Tente novamente dentro de alguns instantes.
+ </string>
+ <string name="LogoutFailedPendingLogin">
+ A região estava acessada por outra sessão. Tente novamente dentro de alguns instantes.
+ </string>
+ <string name="LogoutFailedLoggingOut">
+ A região estava passando para o modo offline na sessão anterior. Tente novamente dentro de alguns instantes.
+ </string>
+ <string name="LogoutFailedStillLoggingOut">
+ A região estava passando para o modo offline na sessão anterior. Tente novamente dentro de alguns instantes.
+ </string>
+ <string name="LogoutSucceeded">
+ A região passou para o modo offline na última sessão. Tente novamente dentro de alguns instantes.
+ </string>
+ <string name="LogoutFailedLogoutBegun">
+ A região inicou o modo offline. Tente novamente dentro de alguns instantes.
+ </string>
+ <string name="LoginFailedLoggingOutSession">
+ O sistema iniciou o modo offline em sua sessão anterior. Tente novamente dentro de alguns instantes.
+ </string>
<string name="AgentLostConnection">
Esta região pode estar passando por problemas. Por favor, verifique sua conexão com a internet.
</string>
@@ -426,6 +520,9 @@
<string name="symbolic folder link">
link da pasta
</string>
+ <string name="mesh">
+ mesh
+ </string>
<string name="AvatarAway">
Distante
</string>
@@ -1075,9 +1172,6 @@
<string name="InvFolder My Inventory">
Meu inventário
</string>
- <string name="InvFolder My Favorites">
- Meus favoritos
- </string>
<string name="InvFolder Library">
Biblioteca
</string>
@@ -1136,10 +1230,10 @@
Gestos
</string>
<string name="InvFolder Favorite">
- Favoritos
+ Meus favoritos
</string>
<string name="InvFolder favorite">
- Favoritos
+ Meus favoritos
</string>
<string name="InvFolder Current Outfit">
Look atual
@@ -1153,6 +1247,9 @@
<string name="InvFolder Accessories">
Acessórios
</string>
+ <string name="InvFolder Meshes">
+ Meshes:
+ </string>
<string name="InvFolder Friends">
Amigos
</string>
@@ -1466,8 +1563,8 @@
<string name="Unknown">
(Desconhecido)
</string>
- <string name="SummaryForTheWeek" value="Resumo para esta semana, com início em"/>
- <string name="NextStipendDay" value="Próximo dia de salário é"/>
+ <string name="SummaryForTheWeek" value="Resumo para esta semana, com início em "/>
+ <string name="NextStipendDay" value=". Próximo dia de salário é "/>
<string name="GroupIndividualShare" value="Grupo Divisão individualI"/>
<string name="GroupColumn" value="Grupo"/>
<string name="Balance">
@@ -3662,6 +3759,9 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<string name="session_initialization_timed_out_error">
A inicialização da sessão expirou
</string>
+ <string name="Home position set.">
+ Posição inicial definida.
+ </string>
<string name="voice_morphing_url">
http://secondlife.com/landing/voicemorphing
</string>
diff --git a/indra/newview/skins/default/xui/zh/floater_aaa.xml b/indra/newview/skins/default/xui/zh/floater_aaa.xml
new file mode 100644
index 0000000000..0d110c0456
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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">
+ This string CHANGE2 is extracted.
+ </string>
+ <string name="testing_eli">
+ 這åªæ˜¯æ¸¬è©¦ - 變更。
+ </string>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_about.xml b/indra/newview/skins/default/xui/zh/floater_about.xml
new file mode 100644
index 0000000000..bee940ddc1
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_about.xml
@@ -0,0 +1,84 @@
+<?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">
+ Built with [COMPILER] version [COMPILER_VERSION]
+ </floater.string>
+ <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]]
+ </floater.string>
+ <floater.string name="AboutSystem">
+ CPU:[CPU]
+記憶體:[MEMORY_MB] MB
+作業系統版本:[OS_VERSION]
+顯示å¡ä¾›æ‡‰å•†ï¼š[GRAPHICS_CARD_VENDOR]
+顯示å¡ï¼š[GRAPHICS_CARD]
+ </floater.string>
+ <floater.string name="AboutDriver">
+ Windows Graphics Driver Version: [GRAPHICS_DRIVER_VERSION]
+ </floater.string>
+ <floater.string name="AboutLibs">
+ OpenGL Version: [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: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)
+ </floater.string>
+ <tab_container name="about_tab">
+ <panel label="資訊" name="support_panel">
+ <button label="覆製到剪貼簿" name="copy_btn"/>
+ </panel>
+ <panel label="Credits" name="credits_panel">
+ <text_editor name="credits_editor">
+ Second Life is brought to you by ..., and many others.
+
+Thank you to the following Residents for helping to ensure that this is the best version yet: ..., and many others.
+
+
+
+
+&quot;The work goes on, the cause endures, the hope still lives, and the dreams shall never die&quot; - Edward Kennedy
+ </text_editor>
+ </panel>
+ <panel label="Licenses" 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.
+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.
+Pth Copyright (C) 1999-2006 Ralf S. Engelschall &lt;rse@gnu.org&gt;
+SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
+SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
+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/zh/floater_about_land.xml b/indra/newview/skins/default/xui/zh/floater_about_land.xml
new file mode 100644
index 0000000000..efd8909e67
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_about_land.xml
@@ -0,0 +1,478 @@
+<?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] minutes
+ </floater.string>
+ <floater.string name="Minute">
+ minute
+ </floater.string>
+ <floater.string name="Seconds">
+ [SECONDS] seconds
+ </floater.string>
+ <floater.string name="Remaining">
+ remaining
+ </floater.string>
+ <tab_container name="landtab">
+ <panel label="一般" name="land_general_panel">
+ <panel.string name="new users only">
+ New Residents only
+ </panel.string>
+ <panel.string name="anyone">
+ Anyone
+ </panel.string>
+ <panel.string name="area_text">
+ Area
+ </panel.string>
+ <panel.string name="area_size_text">
+ [AREA] m²
+ </panel.string>
+ <panel.string name="auction_id_text">
+ Auction ID: [ID]
+ </panel.string>
+ <panel.string name="need_tier_to_modify">
+ You must approve your purchase to modify this land.
+ </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">
+ (Sale Pending)
+ </panel.string>
+ <panel.string name="no_selection_text">
+ No parcel selected.
+ </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:">
+ å稱:
+ </text>
+ <text name="Description:">
+ æ述:
+ </text>
+ <text name="LandType">
+ 類型:
+ </text>
+ <text name="LandTypeText">
+ Mainland / Homestead
+ </text>
+ <text name="ContentRating">
+ 分級:
+ </text>
+ <text name="ContentRatingText">
+ æˆäºº
+ </text>
+ <text name="Owner:">
+ æ“有者:
+ </text>
+ <text name="Group:">
+ 社團:
+ </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="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..."/>
+ <text name="For sale to">
+ 出售給:[BUYER]
+ </text>
+ <text name="Sell with landowners objects in parcel.">
+ Objects included in sale
+ </text>
+ <text name="Selling with no objects in parcel.">
+ Objects not included in sale
+ </text>
+ <button label="Cancel Land Sale" label_selected="Cancel Land Sale" name="Cancel Land Sale"/>
+ <text name="Claimed:">
+ Claimed:
+ </text>
+ <text name="DateClaimText">
+ Tue Aug 15 13:47:25 2006
+ </text>
+ <text name="PriceLabel">
+ é¢ç©ï¼š
+ </text>
+ <text name="PriceText">
+ 4048 m²
+ </text>
+ <text name="Traffic:">
+ æµé‡ï¼š
+ </text>
+ <text name="DwellText">
+ 0
+ </text>
+ <button label="購買土地" name="Buy Land..."/>
+ <button label="腳本資訊" name="Scripts..."/>
+ <button label="Buy For Group" name="Buy For Group..."/>
+ <button label="購買通行權" name="Buy Pass..." tool_tip="A pass gives you temporary access to this land."/>
+ <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."/>
+ </panel>
+ <panel label="契約" name="land_covenant_panel">
+ <panel.string name="can_resell">
+ Purchased land in this region may be resold.
+ </panel.string>
+ <panel.string name="can_not_resell">
+ Purchased land in this region may not be resold.
+ </panel.string>
+ <panel.string name="can_change">
+ Purchased land in this region may be joined or subdivided.
+ </panel.string>
+ <panel.string name="can_not_change">
+ Purchased land in this region may not be joined or subdivided.
+ </panel.string>
+ <text name="estate_section_lbl">
+ 領地:
+ </text>
+ <text name="estate_name_text">
+ mainland
+ </text>
+ <text name="estate_owner_lbl">
+ æ“有者:
+ </text>
+ <text name="estate_owner_text">
+ (無)
+ </text>
+ <text_editor name="covenant_editor">
+ There is no Covenant provided for this Estate.
+ </text_editor>
+ <text name="covenant_timestamp_text">
+ Last Modified Wed Dec 31 16:00:00 1969
+ </text>
+ <text name="region_section_lbl">
+ 地å€ï¼š
+ </text>
+ <text name="region_name_text">
+ EricaVille
+ </text>
+ <text name="region_landtype_lbl">
+ 類型:
+ </text>
+ <text name="region_landtype_text">
+ Mainland / Homestead
+ </text>
+ <text name="region_maturity_lbl">
+ 分級:
+ </text>
+ <text name="region_maturity_text">
+ æˆäºº
+ </text>
+ <text name="resellable_lbl">
+ Resale:
+ </text>
+ <text name="resellable_clause">
+ Land in this region may not be resold.
+ </text>
+ <text name="changeable_lbl">
+ Subdivide:
+ </text>
+ <text name="changeable_clause">
+ Land in this region may not be joined/subdivided.
+ </text>
+ </panel>
+ <panel label="物件" name="land_objects_panel">
+ <panel.string name="objects_available_text">
+ [COUNT] out of [MAX] ([AVAILABLE] available)
+ </panel.string>
+ <panel.string name="objects_deleted_text">
+ [COUNT] out of [MAX] ([DELETED] will be deleted)
+ </panel.string>
+ <text name="parcel_object_bonus">
+ Region Object Bonus Factor: [BONUS]
+ </text>
+ <text name="Simulator primitive usage:">
+ Primitive usage:
+ </text>
+ <text name="objects_available">
+ [COUNT] out of [MAX] ([AVAILABLE] 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."/>
+ <text name="Set to group:">
+ Set to group:
+ </text>
+ <text name="group_objects_text">
+ [COUNT]
+ </text>
+ <button label="顯示" label_selected="顯示" name="ShowGroup"/>
+ <button label="退回" name="ReturnGroup..." tool_tip="Return objects to their owners."/>
+ <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."/>
+ <text name="Selected / sat upon:">
+ Selected / sat upon:
+ </text>
+ <text name="selected_objects_text">
+ [COUNT]
+ </text>
+ <text name="Autoreturn">
+ 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 label="退回物件" name="Return objects..."/>
+ <name_list name="owner list">
+ <name_list.columns label="Type" name="type"/>
+ <name_list.columns label="å稱" name="name"/>
+ <name_list.columns label="Count" name="count"/>
+ <name_list.columns label="Most Recent" name="mostrecent"/>
+ </name_list>
+ </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">
+ Moderate Content
+ </panel.string>
+ <panel.string name="mature_check_adult">
+ æˆäººå…§å®¹
+ </panel.string>
+ <panel.string name="mature_check_mature_tooltip">
+ Your parcel information or content is considered moderate.
+ </panel.string>
+ <panel.string name="mature_check_adult_tooltip">
+ Your parcel information or content is considered 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>
+ <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_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"/>
+ <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="Let people see this parcel in search results"/>
+ <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="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="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="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="Rental" name="item13"/>
+ <combo_box.item label="Other" name="item12"/>
+ </combo_box>
+ <check_box label="Moderate Content" name="MatureCheck" tool_tip=" "/>
+ <text name="Snapshot:">
+ 快照:
+ </text>
+ <texture_picker name="snapshot_ctrl" tool_tip="點擊以挑é¸åœ–片"/>
+ <text name="landing_point">
+ 登陸點:[LANDING]
+ </text>
+ <button label="設定" label_selected="設定" name="Set" tool_tip="Sets the landing point where visitors arrive. Sets to your avatar&apos;s location inside this parcel."/>
+ <button label="清除" label_selected="清除" name="Clear" tool_tip="清除登陸點"/>
+ <text name="Teleport Routing: ">
+ 瞬間傳é€è·¯å¾‘:
+ </text>
+ <combo_box name="landing type" tool_tip="Teleport Routing -- select how to handle teleports onto your land">
+ <combo_box.item label="Blocked" name="Blocked"/>
+ <combo_box.item label="Landing Point" name="LandingPoint"/>
+ <combo_box.item label="Anywhere" name="Anywhere"/>
+ </combo_box>
+ </panel>
+ <panel label="MEDIA" name="land_media_panel">
+ <text name="with media:">
+ 類型:
+ </text>
+ <combo_box name="media type" tool_tip="Specify if the URL is a movie, web page, or other media"/>
+ <text name="at URL:">
+ 首é ï¼š
+ </text>
+ <button label="設定" name="set_media_url"/>
+ <text name="Description:">
+ æ述:
+ </text>
+ <line_editor name="url_description" tool_tip="Text displayed next to play/load button"/>
+ <text name="Media texture:">
+ å–代æ質:
+ </text>
+ <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>
+ <check_box label="自動縮放" name="media_auto_scale" tool_tip="Checking this option will scale the content for this parcel automatically. It may be slightly slower and lower quality visually but no other texture scaling or alignment will be required."/>
+ <text name="media_size" tool_tip="Size to render Web media, leave 0 for default.">
+ 尺寸:
+ </text>
+ <spinner name="media_size_width" tool_tip="Size to render Web media, leave 0 for default."/>
+ <spinner name="media_size_height" tool_tip="Size to render Web media, leave 0 for default."/>
+ <text name="pixels">
+ åƒç´ 
+ </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>
+ <panel label="SOUND" name="land_audio_panel">
+ <text name="MusicURL:">
+ Music URL:
+ </text>
+ <text name="Sound:">
+ Sound:
+ </text>
+ <check_box label="Restrict gesture and object sounds to this parcel" name="check sound local"/>
+ <text name="Voice settings:">
+ Voice:
+ </text>
+ <check_box label="Enable Voice" name="parcel_enable_voice_channel"/>
+ <check_box label="Enable Voice (established by the Estate)" name="parcel_enable_voice_channel_is_estate_disabled"/>
+ <check_box label="Restrict Voice to this parcel" name="parcel_enable_voice_channel_local"/>
+ </panel>
+ <panel label="ACCESS" name="land_access_panel">
+ <panel.string 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 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="Allow Group Access: [GROUP]" name="GroupCheck" tool_tip="Set group in the General tab."/>
+ <check_box label="Sell passes to:" name="PassCheck" tool_tip="Allows temporary access to this parcel"/>
+ <combo_box name="pass_combo">
+ <combo_box.item label="Anyone" name="Anyone"/>
+ <combo_box.item label="社團" name="Group"/>
+ </combo_box>
+ <spinner label="Price in L$:" name="PriceSpin"/>
+ <spinner label="Hours of access:" name="HoursSpin"/>
+ <panel name="Allowed_layout_panel">
+ <text label="Always Allow" name="AllowedText">
+ Allowed Residents
+ </text>
+ <name_list name="AccessList" tool_tip="([LISTED] listed, [MAX] max)"/>
+ <button label="Add" name="add_allowed"/>
+ <button label="Remove" label_selected="Remove" name="remove_allowed"/>
+ </panel>
+ <panel name="Banned_layout_panel">
+ <text label="Ban" name="BanCheck">
+ 被å°éŽ–çš„å±…æ°‘
+ </text>
+ <name_list name="BannedList" tool_tip="([LISTED] listed, [MAX] 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/pt/floater_statistics.xml b/indra/newview/skins/default/xui/zh/floater_activeim.xml
index ecbf638157..93017bf5b2 100644
--- a/indra/newview/skins/default/xui/pt/floater_statistics.xml
+++ b/indra/newview/skins/default/xui/zh/floater_activeim.xml
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="stats floater" title="ESTATÃSTICAS"/>
+<floater name="floater_activeim" title="ACTIVE IM"/>
diff --git a/indra/newview/skins/default/xui/zh/floater_animation_preview.xml b/indra/newview/skins/default/xui/zh/floater_animation_preview.xml
new file mode 100644
index 0000000000..b5d65119f7
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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">
+ Failed to initialize motion
+ </floater.string>
+ <floater.string name="anim_too_long">
+ Animation file is [LENGTH] seconds in length.
+
+Maximum animation length is [MAX_LENGTH] seconds.
+ </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">
+ Premature end of file.
+ </floater.string>
+ <floater.string name="E_ST_NO_CONSTRAINT">
+ Cannot read constraint definition.
+ </floater.string>
+ <floater.string name="E_ST_NO_FILE">
+ 無法開啟 BVH 檔案。
+ </floater.string>
+ <floater.string name="E_ST_NO_HIER">
+ Invalid HIERARCHY header.
+ </floater.string>
+ <floater.string name="E_ST_NO_JOINT">
+ Cannot find ROOT or JOINT.
+ </floater.string>
+ <floater.string name="E_ST_NO_NAME">
+ Cannot get JOINT name.
+ </floater.string>
+ <floater.string name="E_ST_NO_OFFSET">
+ Cannot find OFFSET.
+ </floater.string>
+ <floater.string name="E_ST_NO_CHANNELS">
+ Cannot find CHANNELS.
+ </floater.string>
+ <floater.string name="E_ST_NO_ROTATION">
+ Cannot get rotation order.
+ </floater.string>
+ <floater.string name="E_ST_NO_AXIS">
+ Cannot get rotation axis.
+ </floater.string>
+ <floater.string name="E_ST_NO_MOTION">
+ Cannot find MOTION.
+ </floater.string>
+ <floater.string name="E_ST_NO_FRAMES">
+ Cannot get number of frames.
+ </floater.string>
+ <floater.string name="E_ST_NO_FRAME_TIME">
+ Cannot get frame time.
+ </floater.string>
+ <floater.string name="E_ST_NO_POS">
+ Cannot get position values.
+ </floater.string>
+ <floater.string name="E_ST_NO_ROT">
+ Cannot get rotation values.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_FILE">
+ Cannot open translation file.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_HEADER">
+ Cannot read translation header.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_NAME">
+ Cannot read translation names.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_IGNORE">
+ Cannot read translation ignore value.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_RELATIVE">
+ Cannot read translation relative value.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_OUTNAME">
+ Cannot read translation outname value.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_MATRIX">
+ Cannot read translation matrix.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_MERGECHILD">
+ Cannot get mergechild name.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_MERGEPARENT">
+ Cannot get mergeparent name.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_PRIORITY">
+ Cannot get priority value.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_LOOP">
+ Cannot get loop value.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_EASEIN">
+ Cannot get easeIn values.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_EASEOUT">
+ Cannot get easeOut values.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_HAND">
+ Cannot get hand morph value.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_EMOTE">
+ Cannot read emote name.
+ </floater.string>
+ <floater.string name="E_ST_BAD_ROOT">
+ Incorrect root joint name, use &quot;hip&quot;.
+ </floater.string>
+ <text name="name_label">
+ å稱:
+ </text>
+ <text name="description_label">
+ æ述:
+ </text>
+ <spinner label="優先度" name="priority" tool_tip="Controls which other animations can be overridden by this animation"/>
+ <check_box label="Loop" name="loop_check" tool_tip="Makes this animation loop"/>
+ <spinner label="In(%)" name="loop_in_point" tool_tip="Sets point in animation that looping returns to"/>
+ <spinner label="Out(%)" name="loop_out_point" tool_tip="Sets point in animation that ends a loop"/>
+ <text name="hand_label">
+ Hand Pose
+ </text>
+ <combo_box name="hand_pose_combo" tool_tip="Controls what hands do during animation">
+ <combo_box.item label="Spread" name="Spread"/>
+ <combo_box.item label="Relaxed" name="Relaxed"/>
+ <combo_box.item label="Point Both" name="PointBoth"/>
+ <combo_box.item label="Fist" name="Fist"/>
+ <combo_box.item label="Relaxed Left" name="RelaxedLeft"/>
+ <combo_box.item label="Point Left" name="PointLeft"/>
+ <combo_box.item label="Fist Left" name="FistLeft"/>
+ <combo_box.item label="Relaxed Right" name="RelaxedRight"/>
+ <combo_box.item label="Point Right" name="PointRight"/>
+ <combo_box.item label="Fist Right" name="FistRight"/>
+ <combo_box.item label="Salute Right" name="SaluteRight"/>
+ <combo_box.item label="Typing" name="Typing"/>
+ <combo_box.item label="Peace Right" name="PeaceRight"/>
+ </combo_box>
+ <text name="emote_label">
+ Expression
+ </text>
+ <combo_box name="emote_combo" tool_tip="Controls what face does during animation">
+ <item label="(無)" name="[None]" value=""/>
+ <item label="Aaaaah" name="Aaaaah" value="Aaaaah"/>
+ <item label="Afraid" name="Afraid" value="Afraid"/>
+ <item label="Angry" name="Angry" value="Angry"/>
+ <item label="Big Smile" name="BigSmile" value="Big Smile"/>
+ <item label="Bored" name="Bored" value="Bored"/>
+ <item label="Cry" name="Cry" value="Cry"/>
+ <item label="Disdain" name="Disdain" value="Disdain"/>
+ <item label="Embarrassed" name="Embarrassed" value="Embarrassed"/>
+ <item label="Frown" name="Frown" value="Frown"/>
+ <item label="Kiss" name="Kiss" value="Kiss"/>
+ <item label="Laugh" name="Laugh" value="Laugh"/>
+ <item label="Plllppt" name="Plllppt" value="Plllppt"/>
+ <item label="Repulsed" name="Repulsed" value="Repulsed"/>
+ <item label="Sad" name="Sad" value="Sad"/>
+ <item label="Shrug" name="Shrug" value="Shrug"/>
+ <item label="Smile" name="Smile" value="Smile"/>
+ <item label="Surprise" name="Surprise" value="Surprise"/>
+ <item label="Wink" name="Wink" value="Wink"/>
+ <item label="Worry" name="Worry" value="Worry"/>
+ </combo_box>
+ <text name="preview_label">
+ Preview while
+ </text>
+ <combo_box name="preview_base_anim" tool_tip="Use this to test your animation behavior while your avatar performs common actions.">
+ <item label="Standing" name="Standing" value="Standing"/>
+ <item label="Walking" name="Walking" value="Walking"/>
+ <item label="Sitting" name="Sitting" value="Sitting"/>
+ <item label="飛行" name="Flying" value="飛行"/>
+ </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="stop_btn" tool_tip="Stop animation playback"/>
+ <text name="bad_animation_text">
+ Unable to read animation file.
+
+We recommend BVH files exported from Poser 4.
+ </text>
+ <button label="上傳(L$[AMOUNT])" name="ok_btn"/>
+ <button label="å–消" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_auction.xml b/indra/newview/skins/default/xui/zh/floater_auction.xml
new file mode 100644
index 0000000000..eb1c9e55dc
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_auction.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_auction" title="START LINDEN LAND SALE">
+ <floater.string name="already for sale">
+ You cannot auction parcels which are already for sale.
+ </floater.string>
+ <check_box initial_value="true" label="Include yellow selection fence" name="fence_check"/>
+ <button label="Snapshot" label_selected="Snapshot" name="snapshot_btn"/>
+ <button label="Sell to Anyone" label_selected="Sell to Anyone" name="sell_to_anyone_btn"/>
+ <button label="Clear Settings" label_selected="Clear Settings" name="reset_parcel_btn"/>
+ <button label="Start Auction" label_selected="Start Auction" name="start_auction_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_avatar_picker.xml b/indra/newview/skins/default/xui/zh/floater_avatar_picker.xml
new file mode 100644
index 0000000000..27a4199f8c
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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">
+ &apos;[TEXT]&apos; not found
+ </floater.string>
+ <floater.string name="no_one_near">
+ No one near
+ </floater.string>
+ <floater.string name="no_results">
+ 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">
+ Type part of a person&apos;s name:
+ </text>
+ <button label="Go" label_selected="Go" 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/zh/floater_avatar_textures.xml b/indra/newview/skins/default/xui/zh/floater_avatar_textures.xml
new file mode 100644
index 0000000000..b1dc081f04
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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">
+ INVALID AVATAR
+ </floater.string>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <text name="label">
+ Baked
+Textures
+ </text>
+ <text name="composite_label">
+ Composite
+Textures
+ </text>
+ <button label="Dump IDs to Console" label_selected="Dump" name="Dump"/>
+ <panel name="scroll_content_panel">
+ <texture_picker label="é ­é«®" name="hair-baked"/>
+ <texture_picker label="é ­é«®" name="hair_grain"/>
+ <texture_picker label="Hair Alpha" name="hair_alpha"/>
+ <texture_picker label="頭部" name="head-baked"/>
+ <texture_picker label="Makeup" name="head_bodypaint"/>
+ <texture_picker label="Head Alpha" name="head_alpha"/>
+ <texture_picker label="頭部刺é’" name="head_tattoo"/>
+ <texture_picker label="眼ç›" name="eyes-baked"/>
+ <texture_picker label="眼ç›" name="eyes_iris"/>
+ <texture_picker label="Eyes Alpha" name="eyes_alpha"/>
+ <texture_picker label="Upper Body" name="upper-baked"/>
+ <texture_picker label="Upper BodyPaint" name="upper_bodypaint"/>
+ <texture_picker label="內衣" name="upper_undershirt"/>
+ <texture_picker label="手套" name="upper_gloves"/>
+ <texture_picker label="襯衫" name="upper_shirt"/>
+ <texture_picker label="Upper Jacket" name="upper_jacket"/>
+ <texture_picker label="Upper Alpha" name="upper_alpha"/>
+ <texture_picker label="Upper Tattoo" name="upper_tattoo"/>
+ <texture_picker label="Lower Body" name="lower-baked"/>
+ <texture_picker label="Lower BodyPaint" 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="Lower Alpha" name="lower_alpha"/>
+ <texture_picker label="Lower Tattoo" 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/zh/floater_beacons.xml b/indra/newview/skins/default/xui/zh/floater_beacons.xml
new file mode 100644
index 0000000000..1613b23e75
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_beacons.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="beacons" title="BEACONS">
+ <panel name="beacons_panel">
+ <text name="label_show">
+ Show :
+ </text>
+ <check_box label="Beacons" name="beacons"/>
+ <check_box label="Highlights" name="highlights"/>
+ <text name="beacon_width_label" tool_tip="Beacon width">
+ Width:
+ </text>
+ <text name="label_objects">
+ For these objects:
+ </text>
+ <check_box label="Physical" name="physical"/>
+ <check_box label="Scripted" name="scripted"/>
+ <check_box label="Touch only" name="touch_only"/>
+ <check_box label="Sound sources" name="sounds"/>
+ <check_box label="Particle sources" name="particles"/>
+ <check_box label="Media sources" name="moapbeacon"/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_build_options.xml b/indra/newview/skins/default/xui/zh/floater_build_options.xml
new file mode 100644
index 0000000000..95211b746c
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_build_options.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="build options floater" title="格線é¸é …">
+ <spinner label="格線單ä½ï¼ˆå…¬å°ºï¼‰" name="GridResolution"/>
+ <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>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_bulk_perms.xml b/indra/newview/skins/default/xui/zh/floater_bulk_perms.xml
new file mode 100644
index 0000000000..629b0d17d5
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_bulk_perms.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floaterbulkperms" title="EDIT CONTENT PERMISSIONS">
+ <floater.string name="nothing_to_modify_text">
+ Selection contains no editable contents.
+ </floater.string>
+ <floater.string name="status_text">
+ Setting permissions on [NAME]
+ </floater.string>
+ <floater.string name="start_text">
+ Starting permission change requests...
+ </floater.string>
+ <floater.string name="done_text">
+ Finished permission change requests.
+ </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">
+ New Content Permissions
+ </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="true" label="轉移" name="next_owner_transfer" tool_tip="Next owner can give away or resell this object"/>
+ <button label="確定" name="apply"/>
+ <button label="å–消" name="close"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_bumps.xml b/indra/newview/skins/default/xui/zh/floater_bumps.xml
new file mode 100644
index 0000000000..d2b7494b08
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_bumps.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_bumps" title="BUMPS, PUSHES &amp; HITS">
+ <floater.string name="none_detected">
+ None detected
+ </floater.string>
+ <floater.string name="bump">
+ [TIME] [NAME] bumped you
+ </floater.string>
+ <floater.string name="llpushobject">
+ [TIME] [NAME] pushed you with a script
+ </floater.string>
+ <floater.string name="selected_object_collide">
+ [TIME] [NAME] hit you with an object
+ </floater.string>
+ <floater.string name="scripted_object_collide">
+ [TIME] [NAME] hit you with a scripted object
+ </floater.string>
+ <floater.string name="physical_object_collide">
+ [TIME] [NAME] hit you with a physical object
+ </floater.string>
+ <floater.string name="timeStr">
+ [[hour,datetime,slt]:[min,datetime,slt]]
+ </floater.string>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_buy_contents.xml b/indra/newview/skins/default/xui/zh/floater_buy_contents.xml
new file mode 100644
index 0000000000..44d3394a52
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_buy_contents.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_buy_contents" title="BUY CONTENTS">
+ <floater.string name="no_copy_text">
+ (no copy)
+ </floater.string>
+ <floater.string name="no_modify_text">
+ (no modify)
+ </floater.string>
+ <floater.string name="no_transfer_text">
+ (no transfer)
+ </floater.string>
+ <text name="contains_text">
+ [NAME] contains:
+ </text>
+ <text name="buy_text">
+ Buy for L$[AMOUNT] from [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/zh/floater_buy_currency.xml b/indra/newview/skins/default/xui/zh/floater_buy_currency.xml
new file mode 100644
index 0000000000..d8e9fb0ecc
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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">
+ Buy L$ [LINDENS] for approx. [LOCALAMOUNT]
+ </floater.string>
+ <text name="info_need_more">
+ 你需è¦æ›´å¤š L$
+ </text>
+ <text name="contacting">
+ 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">
+ For the price
+ </text>
+ <text name="currency_est">
+ approx. [LOCALAMOUNT]
+ </text>
+ <text name="getting_data">
+ Estimating...
+ </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 payment method] | [http://www.secondlife.com/my/account/currency.php currency] | [http://www.secondlife.com/my/account/exchange_rates.php exchange rate]
+ </text>
+ <text name="exchange_rate_note">
+ Re-enter amount to see the latest exchange rate.
+ </text>
+ <text name="purchase_warning_repurchase">
+ 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"/>
+ <text name="info_cannot_buy">
+ Unable to Buy
+ </text>
+ <button label="Continue to the Web" name="error_web"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_buy_currency_html.xml b/indra/newview/skins/default/xui/zh/floater_buy_currency_html.xml
new file mode 100644
index 0000000000..ec700ad7af
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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/zh/floater_buy_land.xml b/indra/newview/skins/default/xui/zh/floater_buy_land.xml
new file mode 100644
index 0000000000..34401c11d0
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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">
+ May be resold.
+ </floater.string>
+ <floater.string name="can_not_resell">
+ May not be resold.
+ </floater.string>
+ <floater.string name="can_change">
+ May be joined or subdivided.
+ </floater.string>
+ <floater.string name="can_not_change">
+ May not be joined or subdivided.
+ </floater.string>
+ <floater.string name="cant_buy_for_group">
+ You do not have permission to buy land for your active group.
+ </floater.string>
+ <floater.string name="no_land_selected">
+ No land selected.
+ </floater.string>
+ <floater.string name="multiple_parcels_selected">
+ Multiple different parcels selected.
+Try selecting a smaller area.
+ </floater.string>
+ <floater.string name="no_permission">
+ 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">
+ You already own the parcel.
+ </floater.string>
+ <floater.string name="set_to_sell_to_other">
+ The selected parcel is set to sell to another party.
+ </floater.string>
+ <floater.string name="no_public_land">
+ The selected area has no public land.
+ </floater.string>
+ <floater.string name="not_owned_by_you">
+ Land owned by another Resident is selected.
+Try selecting a smaller area.
+ </floater.string>
+ <floater.string name="processing">
+ Processing your purchase...
+
+(This may take a minute or two.)
+ </floater.string>
+ <floater.string name="fetching_error">
+ There has been an error while fetching land buying information.
+ </floater.string>
+ <floater.string name="buying_will">
+ Buying this land will:
+ </floater.string>
+ <floater.string name="buying_for_group">
+ Buying land for group will:
+ </floater.string>
+ <floater.string name="cannot_buy_now">
+ Cannot buy now:
+ </floater.string>
+ <floater.string name="not_for_sale">
+ Not for sale:
+ </floater.string>
+ <floater.string name="none_needed">
+ 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] m² 土地。
+ </floater.string>
+ <floater.string name="pay_to_for_land">
+ Pay L$ [AMOUNT] to [SELLER] for this land
+ </floater.string>
+ <floater.string name="buy_for_US">
+ Buy L$ [AMOUNT] for approx. [LOCAL_AMOUNT],
+ </floater.string>
+ <floater.string name="parcel_meters">
+ 這個地段為 [AMOUNT] m²
+ </floater.string>
+ <floater.string name="premium_land">
+ This land is premium, and will charge as [AMOUNT] m².
+ </floater.string>
+ <floater.string name="discounted_land">
+ This land is discounted, and will charge as [AMOUNT] m².
+ </floater.string>
+ <floater.string name="meters_supports_object">
+ [AMOUNT] m²
+supports [AMOUNT2] objects
+ </floater.string>
+ <floater.string name="sold_with_objects">
+ sold with objects
+ </floater.string>
+ <floater.string name="sold_without_objects">
+ objects not included
+ </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">
+ The group [GROUP] will need sufficient contributed land use credits to cover this parcel before the purchase will complete.
+ </floater.string>
+ <floater.string name="have_enough_lindens">
+ You have L$ [AMOUNT], which is enough to buy this land.
+ </floater.string>
+ <floater.string name="not_enough_lindens">
+ You have only L$ [AMOUNT], and need L$ [AMOUNT2] more.
+ </floater.string>
+ <floater.string name="balance_left">
+ After the purchase, you will have L$ [AMOUNT] left.
+ </floater.string>
+ <floater.string name="balance_needed">
+ You need to buy at least L$ [AMOUNT] to afford this land.
+ </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">
+ Purchased land in this region:
+ </text>
+ <text name="resellable_clause">
+ May or may not be resold.
+ </text>
+ <text name="changeable_clause">
+ May or may not be joined or subdivided.
+ </text>
+ <text name="covenant_text">
+ You must agree to the Estate Covenant:
+ </text>
+ <text_editor name="covenant_editor">
+ 載入中...
+ </text_editor>
+ <check_box label="I Agree to the Covenant Defined Above." 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 m²
+ </text>
+ <text name="info_price_label">
+ 價格:
+ </text>
+ <text name="info_price">
+ L$ 1500
+(L$ 1.1/m²)
+sold with objects
+ </text>
+ <text name="info_action">
+ Buying this land will:
+ </text>
+ <text name="error_message">
+ Something ain&apos;t right.
+ </text>
+ <button label="å‰å¾€ç¶²ç«™" name="error_web"/>
+ <text name="account_action">
+ Upgrade you to premium membership.
+ </text>
+ <text name="account_reason">
+ Only premimum members may own land.
+ </text>
+ <combo_box name="account_level">
+ <combo_box.item label="US$9.95/month, billed monthly" name="US$9.95/month,billedmonthly"/>
+ <combo_box.item label="US$7.50/month, billed quarterly" name="US$7.50/month,billedquarterly"/>
+ <combo_box.item label="US$6.00/month, billed annually" name="US$6.00/month,billedannually"/>
+ </combo_box>
+ <text name="land_use_action">
+ Increase your monthly land use fees to US$ 40/month.
+ </text>
+ <text name="land_use_reason">
+ You hold 1309 m² of land.
+This parcel is 512 m² of land.
+ </text>
+ <text name="purchase_action">
+ Pay Joe Resident L$ 4000 for the land
+ </text>
+ <text name="currency_reason">
+ You have L$ 2,100.
+ </text>
+ <text name="currency_action">
+ Buy additional L$
+ </text>
+ <line_editor name="currency_amt">
+ 1000
+ </line_editor>
+ <text name="currency_est">
+ for approx. [LOCAL_AMOUNT]
+ </text>
+ <text name="currency_balance">
+ You have L$ 2,100.
+ </text>
+ <check_box label="Remove [AMOUNT] m² of contribution from group." name="remove_contribution"/>
+ <button label="Purchase" name="buy_btn"/>
+ <button label="å–消" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_buy_object.xml b/indra/newview/skins/default/xui/zh/floater_buy_object.xml
new file mode 100644
index 0000000000..ef8bc183a4
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_buy_object.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="contents" title="BUY COPY OF OBJECT">
+ <floater.string name="title_buy_text">
+ 購買
+ </floater.string>
+ <floater.string name="title_buy_copy_text">
+ Buy a copy of
+ </floater.string>
+ <floater.string name="no_copy_text">
+ (no copy)
+ </floater.string>
+ <floater.string name="no_modify_text">
+ (no modify)
+ </floater.string>
+ <floater.string name="no_transfer_text">
+ (no transfer)
+ </floater.string>
+ <text name="contents_text">
+ Contains:
+ </text>
+ <text name="buy_text">
+ Buy for L$[AMOUNT] from:
+ </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/zh/floater_camera.xml b/indra/newview/skins/default/xui/zh/floater_camera.xml
new file mode 100644
index 0000000000..65d04583f5
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_camera.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="camera_floater">
+ <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 name="controls">
+ <panel name="preset_views_list">
+ <panel_camera_item name="front_view">
+ <panel_camera_item.text name="front_view_text">
+ Front View
+ </panel_camera_item.text>
+ </panel_camera_item>
+ <panel_camera_item name="group_view">
+ <panel_camera_item.text name="side_view_text">
+ Side View
+ </panel_camera_item.text>
+ </panel_camera_item>
+ <panel_camera_item name="rear_view">
+ <panel_camera_item.text name="rear_view_text">
+ Rear View
+ </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">
+ Object View
+ </panel_camera_item.text>
+ </panel_camera_item>
+ <panel_camera_item name="mouselook_view">
+ <panel_camera_item.text name="mouselook_view_text">
+ Mouselook View
+ </panel_camera_item.text>
+ </panel_camera_item>
+ </panel>
+ <panel name="zoom">
+ <joystick_rotate name="cam_rotate_stick" tool_tip="Orbit camera around focus"/>
+ <slider_bar name="zoom_slider" tool_tip="Zoom camera toward focus"/>
+ <joystick_track name="cam_track_stick" tool_tip="Move camera up and down, left and right"/>
+ </panel>
+ </panel>
+ <panel name="buttons">
+ <button label="" name="presets_btn" tool_tip="Preset Views"/>
+ <button label="" name="pan_btn" tool_tip="Orbit Zoom Pan"/>
+ <button label="" name="avatarview_btn" tool_tip="Camera modes"/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_choose_group.xml b/indra/newview/skins/default/xui/zh/floater_choose_group.xml
new file mode 100644
index 0000000000..9968565bf2
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="確定" label_selected="確定" name="OK"/>
+ <button label="å–消" label_selected="å–消" name="Cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_color_picker.xml b/indra/newview/skins/default/xui/zh/floater_color_picker.xml
new file mode 100644
index 0000000000..a7ac78e419
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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">
+ Hue:
+ </text>
+ <text name="s_val_text">
+ Sat:
+ </text>
+ <text name="l_val_text">
+ Lum:
+ </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.)">
+ (Drag below to save)
+ </text>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_critical.xml b/indra/newview/skins/default/xui/zh/floater_critical.xml
new file mode 100644
index 0000000000..da357bde56
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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">
+ Please read the following message carefully.
+ </text>
+ <text_editor name="tos_text">
+ TOS_TEXT
+ </text_editor>
+</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
new file mode 100644
index 0000000000..e12fc21166
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_display_name.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Display Name" title="CHANGE DISPLAY NAME">
+ <text name="info_text">
+ The name you give your avatar is called your Display Name. You can change it once a week.
+ </text>
+ <text name="lockout_text">
+ 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="Reset" 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_event.xml b/indra/newview/skins/default/xui/zh/floater_event.xml
new file mode 100644
index 0000000000..349b5717f2
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_event.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater label="Event" name="Event" title="EVENT DETAILS">
+ <floater.string name="loading_text">
+ 載入中...
+ </floater.string>
+ <floater.string name="done_text">
+ Done
+ </floater.string>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_font_test.xml b/indra/newview/skins/default/xui/zh/floater_font_test.xml
new file mode 100644
index 0000000000..ec83c51eb3
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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/zh/floater_gesture.xml b/indra/newview/skins/default/xui/zh/floater_gesture.xml
new file mode 100644
index 0000000000..651a976774
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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">
+ (Playing)
+ </floater.string>
+ <floater.string name="copy_name">
+ Copy of [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="Key" 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="製作新姿勢e"/>
+ <button name="activate_btn" tool_tip="Activate/Deactivate selected gesture"/>
+ <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/zh/floater_god_tools.xml b/indra/newview/skins/default/xui/zh/floater_god_tools.xml
new file mode 100644
index 0000000000..fbe89ab2a6
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="Flush This Region&apos;s Map Visibility Caches" label_selected="Flush This Region&apos;s Map Visibility Caches" name="Flush This Region&apos;s Map Visibility Caches"/>
+ </panel>
+ <panel label="地å€" name="region">
+ <text name="Region Name:">
+ 地å€å稱:
+ </text>
+ <check_box label="Prelude" name="check prelude" tool_tip="Set this to make the region a prelude"/>
+ <check_box label="Fixed Sun" name="check fixed sun" tool_tip="Fix the sun position (like in Region/Estate &gt; Terrain"/>
+ <check_box label="Reset Home On Teleport" name="check reset home" tool_tip="When Resident teleports out, reset their home to the destination position."/>
+ <check_box label="Visible" name="check visible" tool_tip="Set this to make the region visible to non-gods"/>
+ <check_box label="Damage" name="check damage" tool_tip="Set this to enable damage in this region"/>
+ <check_box label="Block Traffic Tracking" name="block dwell" tool_tip="Set this to make the region not compute traffic"/>
+ <check_box label="Block Terraform" name="block terraform" tool_tip="Set this to disallow people terraforming their land"/>
+ <check_box label="Sandbox" name="is sandbox" tool_tip="Toggle whether this is a sandbox region"/>
+ <button label="Bake Terrain" label_selected="Bake Terrain" name="Bake Terrain" tool_tip="Save the current terrain as default"/>
+ <button label="Revert Terrain" label_selected="Revert Terrain" name="Revert Terrain" tool_tip="Replace the current terrain with default"/>
+ <button label="Swap Terrain" label_selected="Swap Terrain" name="Swap Terrain" tool_tip="Swap current terrain with default"/>
+ <text name="estate id">
+ Estate ID:
+ </text>
+ <text name="parent id">
+ Parent ID:
+ </text>
+ <line_editor name="parentestate" tool_tip="This is the parent estate for this region"/>
+ <text name="Grid Pos: ">
+ 網格ä½ç½®ï¼š
+ </text>
+ <line_editor name="gridposx" tool_tip="This is the grid x position for this region"/>
+ <line_editor name="gridposy" tool_tip="This is the grid y position for this region"/>
+ <text name="Redirect to Grid: ">
+ Redirect to Grid:
+ </text>
+ <text name="billable factor text">
+ Billable Factor:
+ </text>
+ <text name="land cost text">
+ L$ per m²:
+ </text>
+ <button label="Refresh" label_selected="Refresh" name="Refresh" tool_tip="Click here to refresh the above information"/>
+ <button label="套用" label_selected="套用" name="Apply" tool_tip="Click here to apply any changes from above"/>
+ <button label="é¸æ“‡åœ°å€" label_selected="é¸æ“‡åœ°å€" name="Select Region" tool_tip="Select the whole region with the land tool"/>
+ <button label="ç«‹å³è‡ªå‹•å„²å­˜" label_selected="ç«‹å³è‡ªå‹•å„²å­˜" name="Autosave now" tool_tip="Save gzipped state to autosave directory"/>
+ </panel>
+ <panel label="物件" name="objects">
+ <panel.string name="no_target">
+ (no target)
+ </panel.string>
+ <text name="Region Name:">
+ 地å€å稱:
+ </text>
+ <text name="region name">
+ Welsh
+ </text>
+ <check_box label="關閉腳本" name="disable scripts" tool_tip="關閉這個地å€ç¾åœ¨çš„全部腳本"/>
+ <check_box label="Disable Collisions" name="disable collisions" tool_tip="Set this to disable non-agent collisions in this region"/>
+ <check_box label="Disable Physics" name="disable physics" tool_tip="Set this to disable all physics in this region"/>
+ <button label="套用" label_selected="套用" name="Apply" tool_tip="Click here to apply any changes from above"/>
+ <button label="Set Target" label_selected="Set Target" name="Set Target" tool_tip="Set the target avatar for object deletion"/>
+ <text name="target_avatar_name">
+ (no target)
+ </text>
+ <button label="Delete Target&apos;s Scripted Objects On Others Land" label_selected="Delete Target&apos;s Scripted Objects On Others Land" name="Delete Target&apos;s Scripted Objects On Others Land" tool_tip="Delete all scripted objects owned by the target on land not owned by the target. (no copy) objects will be returned."/>
+ <button label="Delete Target&apos;s Scripted Objects On *Any* Land" label_selected="Delete Target&apos;s Scripted Objects On *Any* Land" name="Delete Target&apos;s Scripted Objects On *Any* Land" tool_tip="Delete all scripted objects owned by the target in this region. (no copy) objects will be returned."/>
+ <button label="Delete *ALL* Of Target&apos;s Objects" label_selected="Delete *ALL* Of Target&apos;s Objects" name="Delete *ALL* Of Target&apos;s Objects" tool_tip="Delete all objects owned by the target in this region. (no copy) objects will be returned."/>
+ <button label="Get Top Colliders" label_selected="Get Top Colliders" name="Get Top Colliders" tool_tip="Gets list of objects experiencing the most narrowphase callbacks"/>
+ <button label="Get Top Scripts" label_selected="Get Top Scripts" name="Get Top Scripts" tool_tip="Gets list of objects spending the most time running scripts"/>
+ <button label="Scripts digest" label_selected="Scripts digest" name="Scripts digest" tool_tip="Gets a list of all scripts and number of occurences of each"/>
+ </panel>
+ <panel label="Request" name="request">
+ <text name="Destination:">
+ Destination:
+ </text>
+ <combo_box name="destination">
+ <combo_box.item label="Selection" name="item1"/>
+ <combo_box.item label="Agent Region" name="item2"/>
+ </combo_box>
+ <text name="Request:">
+ Request:
+ </text>
+ <combo_box name="request">
+ <combo_box.item label="colliders &lt;steps&gt;" name="item1"/>
+ <combo_box.item label="scripts &lt;count&gt;,&lt;optional pattern&gt;" name="item2"/>
+ <combo_box.item label="objects &lt;pattern&gt;" name="item3"/>
+ <combo_box.item label="rez &lt;asset_id&gt;" name="item4"/>
+ </combo_box>
+ <text name="Parameter:">
+ Parameter:
+ </text>
+ <button label="Make Request" label_selected="Make Request" name="Make Request"/>
+ </panel>
+ </tab_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_hardware_settings.xml b/indra/newview/skins/default/xui/zh/floater_hardware_settings.xml
new file mode 100644
index 0000000000..1465dcb256
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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:">
+ Filtering:
+ </text>
+ <check_box label="Anisotropic Filtering (slower when enabled)" name="ani"/>
+ <text name="Antialiasing:">
+ Antialiasing:
+ </text>
+ <combo_box label="Antialiasing" name="fsaa">
+ <combo_box.item label="Disabled" 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="Gamma:" name="gamma"/>
+ <text name="(brightness, lower is brighter)">
+ (0 = default brightness, lower = brighter)
+ </text>
+ <text name="Enable VBO:">
+ Enable VBO:
+ </text>
+ <check_box initial_value="true" label="Enable OpenGL Vertex Buffer Objects" name="vbo" tool_tip="Enabling this on modern hardware gives a performance gain. However, older hardware often has poor implementations of VBOs and you may get crashes when this is enabled."/>
+ <slider label="æ質記憶體(MB):" name="GraphicsCardTextureMemory" tool_tip="Amount of memory to allocate for textures. Defaults to video card memory. Reducing this may improve performance but may also make textures blurry."/>
+ <spinner label="Fog Distance Ratio:" name="fog"/>
+ <button label="確定" label_selected="確定" name="OK"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_help_browser.xml b/indra/newview/skins/default/xui/zh/floater_help_browser.xml
new file mode 100644
index 0000000000..e605d5f19c
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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/zh/floater_hud.xml b/indra/newview/skins/default/xui/zh/floater_hud.xml
new file mode 100644
index 0000000000..a788961e95
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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/zh/floater_im_container.xml b/indra/newview/skins/default/xui/zh/floater_im_container.xml
new file mode 100644
index 0000000000..2d66c659fe
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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/zh/floater_im_session.xml b/indra/newview/skins/default/xui/zh/floater_im_session.xml
new file mode 100644
index 0000000000..e8db97560e
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="To" name="chat_editor"/>
+ </layout_panel>
+ </layout_stack>
+</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
new file mode 100644
index 0000000000..d7e9a7704c
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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">
+ å稱:
+ </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="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="Skirt" value="裙å­"/>
+ <item label="Sculpted Prim" name="SculptedPrim" value="Sculpted Prim"/>
+ </combo_box>
+ <text name="bad_image_text">
+ 無法讀å–圖åƒã€‚
+
+請嘗試儲存圖åƒç‚º 24 ä½å…ƒ Targa(.tga)格å¼ã€‚
+ </text>
+ <check_box label="Use lossless compression" name="lossless_check"/>
+ <button label="å–消" name="cancel_btn"/>
+ <button label="上傳(L$[AMOUNT])" name="ok_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_incoming_call.xml b/indra/newview/skins/default/xui/zh/floater_incoming_call.xml
new file mode 100644
index 0000000000..123cdd9f2c
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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">
+ has joined a Voice Chat call with a conference chat.
+ </floater.string>
+ <floater.string name="VoiceInviteGroup">
+ just joined &apos;[GROUP]&apos; voice channel.
+ </floater.string>
+ <floater.string name="VoiceInviteQuestionGroup">
+ Would you like to leave [CURRENT_CHAT] and join the call with &apos;[GROUP]&apos;?
+ </floater.string>
+ <floater.string name="VoiceInviteQuestionDefault">
+ Do you want to leave [CURRENT_CHAT] and join this voice chat?
+ </floater.string>
+ <text name="question">
+ Do you want to leave [CURRENT_CHAT] and join this voice 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/zh/floater_inspect.xml b/indra/newview/skins/default/xui/zh/floater_inspect.xml
new file mode 100644
index 0000000000..295538f797
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_inspect.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="inspect" title="INSPECT OBJECTS">
+ <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="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>
+ <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"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_inventory.xml b/indra/newview/skins/default/xui/zh/floater_inventory.xml
new file mode 100644
index 0000000000..da4619c964
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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/zh/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/zh/floater_inventory_item_properties.xml
new file mode 100644
index 0000000000..fcd702b16d
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,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">
+ Acquired:
+ </text>
+ <text name="LabelAcquiredDate">
+ Wed May 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/zh/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/zh/floater_inventory_view_finder.xml
new file mode 100644
index 0000000000..a4ede92ab1
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_inventory_view_finder.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Inventory Finder" title="最近_收ç´å€_物å“">
+ <check_box label="動作" name="check_animation"/>
+ <check_box label="Calling Cards" 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="Notecards" name="check_notecard"/>
+ <check_box label="Objects" name="check_object"/>
+ <check_box label="腳本" name="check_script"/>
+ <check_box label="Sounds" name="check_sound"/>
+ <check_box label="æ質" name="check_texture"/>
+ <check_box label="Snapshots" name="check_snapshot"/>
+ <button label="全部" label_selected="全部" name="All"/>
+ <button label="ç„¡" label_selected="ç„¡" name="None"/>
+ <check_box label="Always show folders" name="check_show_empty"/>
+ <check_box label="Since Logoff" 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/zh/floater_joystick.xml b/indra/newview/skins/default/xui/zh/floater_joystick.xml
new file mode 100644
index 0000000000..1721f7cd1e
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_joystick.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Joystick" title="JOYSTICK CONFIGURATION">
+ <floater.string name="NoDevice">
+ 未åµæ¸¬åˆ°è¨­å‚™
+ </floater.string>
+ <check_box label="Enable Joystick:" name="enable_joystick"/>
+ <spinner label="X Axis Mapping" name="JoystickAxis1"/>
+ <spinner label="Y Axis Mapping" name="JoystickAxis2"/>
+ <spinner label="Z Axis Mapping" name="JoystickAxis0"/>
+ <spinner label="Pitch Mapping" name="JoystickAxis4"/>
+ <spinner label="Yaw Mapping" name="JoystickAxis5"/>
+ <spinner label="Roll Mapping" name="JoystickAxis3"/>
+ <spinner label="Zoom Mapping" name="JoystickAxis6"/>
+ <check_box label="Direct Zoom" name="ZoomDirect"/>
+ <check_box label="3D Cursor" name="Cursor3D"/>
+ <check_box label="Auto Level" name="AutoLeveling"/>
+ <text name="Control Modes:">
+ Control Modes:
+ </text>
+ <check_box label="化身" name="JoystickAvatarEnabled"/>
+ <check_box label="建造" name="JoystickBuildEnabled"/>
+ <check_box label="Flycam" name="JoystickFlycamEnabled"/>
+ <stat_view label="Joystick Monitor" name="axis_view">
+ <stat_bar label="Axis 0" name="axis0"/>
+ <stat_bar label="Axis 1" name="axis1"/>
+ <stat_bar label="Axis 2" name="axis2"/>
+ <stat_bar label="Axis 3" name="axis3"/>
+ <stat_bar label="Axis 4" name="axis4"/>
+ <stat_bar label="Axis 5" name="axis5"/>
+ </stat_view>
+ <text name="XScale">
+ X Scale
+ </text>
+ <text name="YScale">
+ Y Scale
+ </text>
+ <text name="ZScale">
+ Z Scale
+ </text>
+ <text name="PitchScale">
+ Pitch Scale
+ </text>
+ <text name="YawScale">
+ Yaw Scale
+ </text>
+ <text name="RollScale">
+ Roll Scale
+ </text>
+ <text name="XDeadZone">
+ X Dead Zone
+ </text>
+ <text name="YDeadZone">
+ Y Dead Zone
+ </text>
+ <text name="ZDeadZone">
+ Z Dead Zone
+ </text>
+ <text name="PitchDeadZone">
+ Pitch Dead Zone
+ </text>
+ <text name="YawDeadZone">
+ Yaw Dead Zone
+ </text>
+ <text name="RollDeadZone">
+ Roll Dead Zone
+ </text>
+ <text name="Feathering">
+ Feathering
+ </text>
+ <text name="ZoomScale2">
+ Zoom Scale
+ </text>
+ <text name="ZoomDeadZone">
+ Zoom Dead Zone
+ </text>
+ <button label="SpaceNavigator Defaults" name="SpaceNavigatorDefaults"/>
+ <button label="確定" label_selected="確定" name="ok_btn"/>
+ <button label="å–消" label_selected="å–消" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_lagmeter.xml b/indra/newview/skins/default/xui/zh/floater_lagmeter.xml
new file mode 100644
index 0000000000..6e58e7332f
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_lagmeter.xml
@@ -0,0 +1,151 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_lagmeter" title="LAG 測é‡å™¨">
+ <floater.string name="max_title_msg">
+ Lag 測é‡å™¨
+ </floater.string>
+ <floater.string name="max_width_px">
+ 360
+ </floater.string>
+ <floater.string name="min_title_msg">
+ Lag
+ </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">
+ Normal, window in background
+ </floater.string>
+ <floater.string name="client_frame_time_critical_msg">
+ Client frame rate below [CLIENT_FRAME_RATE_CRITICAL]
+ </floater.string>
+ <floater.string name="client_frame_time_warning_msg">
+ Client frame rate between [CLIENT_FRAME_RATE_CRITICAL] and [CLIENT_FRAME_RATE_WARNING]
+ </floater.string>
+ <floater.string name="client_frame_time_normal_msg">
+ 正常
+ </floater.string>
+ <floater.string name="client_draw_distance_cause_msg">
+ Possible cause: Draw distance set too high
+ </floater.string>
+ <floater.string name="client_texture_loading_cause_msg">
+ Possible cause: Images loading
+ </floater.string>
+ <floater.string name="client_texture_memory_cause_msg">
+ Possible cause: Too many images in memory
+ </floater.string>
+ <floater.string name="client_complex_objects_cause_msg">
+ Possible cause: Too many complex objects in scene
+ </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">
+ Connection is dropping over [NETWORK_PACKET_LOSS_CRITICAL]% of packets
+ </floater.string>
+ <floater.string name="network_packet_loss_warning_msg">
+ Connection is dropping [NETWORK_PACKET_LOSS_WARNING]%-[NETWORK_PACKET_LOSS_CRITICAL]% of packets
+ </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">
+ Connection ping time is over [NETWORK_PING_CRITICAL] ms
+ </floater.string>
+ <floater.string name="network_ping_warning_msg">
+ Connection ping time is [NETWORK_PING_WARNING]-[NETWORK_PING_CRITICAL] ms
+ </floater.string>
+ <floater.string name="network_packet_loss_cause_msg">
+ Possible bad connection or &apos;Bandwidth&apos; pref too high.
+ </floater.string>
+ <floater.string name="network_ping_cause_msg">
+ Possible bad connection or file-sharing app.
+ </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">
+ 模擬器 framerate 低於 [SERVER_FRAME_RATE_CRITICAL]
+ </floater.string>
+ <floater.string name="server_frame_time_warning_msg">
+ 模擬器 framerate 介於 [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="客戶端 lag 狀態"/>
+ <text name="client">
+ 客戶端
+ </text>
+ <text name="client_text">
+ 正常
+ </text>
+ <button name="network_lagmeter" tool_tip="網路 lag 狀態"/>
+ <text name="network">
+ 網路
+ </text>
+ <text name="network_text">
+ 正常
+ </text>
+ <button name="server_lagmeter" tool_tip="伺æœå™¨ lag 狀態"/>
+ <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/zh/floater_land_holdings.xml b/indra/newview/skins/default/xui/zh/floater_land_holdings.xml
new file mode 100644
index 0000000000..3d9d391a21
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_land_holdings.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="land holdings floater" title="MY LAND">
+ <floater.string name="area_string">
+ [AREA] m²
+ </floater.string>
+ <scroll_list name="parcel list">
+ <scroll_list.columns label="地段" name="name"/>
+ <scroll_list.columns label="地å€" name="location"/>
+ <scroll_list.columns label="Type" name="type"/>
+ <scroll_list.columns label="Area" name="area"/>
+ </scroll_list>
+ <button label="瞬間傳é€" label_selected="瞬間傳é€" name="Teleport" tool_tip="Teleport to the center of this land."/>
+ <button label="地圖" label_selected="地圖" name="Show on Map" tool_tip="Show this land on the world map"/>
+ <text name="contrib_label">
+ Contributions to your groups:
+ </text>
+ <scroll_list name="grant list">
+ <scroll_list.columns label="社團" name="group"/>
+ <scroll_list.columns label="Area" name="area"/>
+ </scroll_list>
+ <text name="allowed_label">
+ Allowed land holdings at current payment plan:
+ </text>
+ <text name="allowed_text">
+ [AREA] m²
+ </text>
+ <text name="current_label">
+ Current land holdings:
+ </text>
+ <text name="current_text">
+ [AREA] m²
+ </text>
+ <text name="available_label">
+ Available for land purchases:
+ </text>
+ <text name="available_text">
+ [AREA] m²
+ </text>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/zh/floater_live_lsleditor.xml
new file mode 100644
index 0000000000..e6f6e32352
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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">
+ You can not view or edit this script, since it has been set as &quot;no copy&quot;. You need full permissions to view or edit a script inside an object.
+ </floater.string>
+ <floater.string name="script_running">
+ 執行中
+ </floater.string>
+ <floater.string name="Title">
+ 腳本:[NAME]
+ </floater.string>
+ <button label="Reset" label_selected="Reset" name="Reset"/>
+ <check_box initial_value="true" label="Running" name="running"/>
+ <check_box initial_value="true" label="Mono" name="mono"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_lsl_guide.xml b/indra/newview/skins/default/xui/zh/floater_lsl_guide.xml
new file mode 100644
index 0000000000..e5c3c47827
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_lsl_guide.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="script ed float" title="LSL REFERENCE">
+ <check_box label="Follow cursor" name="lock_check"/>
+ <combo_box label="Lock" name="history_combo"/>
+ <button label="Back" name="back_btn"/>
+ <button label="Forward" name="fwd_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_map.xml b/indra/newview/skins/default/xui/zh/floater_map.xml
new file mode 100644
index 0000000000..b535ef0074
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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](Double-click to open Map, shift-drag to pan)
+ </floater.string>
+ <floater.string name="AltToolTipMsg">
+ [REGION](Double-click to teleport, shift-drag to pan)
+ </floater.string>
+ <floater.string name="mini_map_caption">
+ MINIMAP
+ </floater.string>
+ <text label="N" name="floater_map_north">
+ N
+ </text>
+ <text label="E" name="floater_map_east">
+ E
+ </text>
+ <text label="W" name="floater_map_west">
+ W
+ </text>
+ <text label="S" name="floater_map_south">
+ S
+ </text>
+ <text label="SE" name="floater_map_southeast">
+ SE
+ </text>
+ <text label="NE" name="floater_map_northeast">
+ NE
+ </text>
+ <text label="SW" name="floater_map_southwest">
+ SW
+ </text>
+ <text label="NW" name="floater_map_northwest">
+ NW
+ </text>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_media_browser.xml b/indra/newview/skins/default/xui/zh/floater_media_browser.xml
new file mode 100644
index 0000000000..6e75016fad
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="Go" name="go"/>
+ </layout_panel>
+ <layout_panel name="time_controls">
+ <button label="rewind" 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/zh/floater_media_settings.xml b/indra/newview/skins/default/xui/zh/floater_media_settings.xml
new file mode 100644
index 0000000000..f42c0af3d9
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_media_settings.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="media_settings" title="MEDIA SETTINGS">
+ <button label="確定" label_selected="確定" name="OK"/>
+ <button label="å–消" label_selected="å–消" name="Cancel"/>
+ <button label="套用" label_selected="套用" name="Apply"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_mem_leaking.xml b/indra/newview/skins/default/xui/zh/floater_mem_leaking.xml
new file mode 100644
index 0000000000..93c1b58df6
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_mem_leaking.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="MemLeak" title="SIMULATE A MEMORY LEAK">
+ <spinner label="Leaking Speed (bytes per frame):" name="leak_speed"/>
+ <spinner label="Max Leaked Memory (MB):" name="max_leak"/>
+ <text name="total_leaked_label">
+ Current leaked memory: [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="åœæ­¢" name="stop_btn"/>
+ <button label="Release" name="release_btn"/>
+ <button label="關閉" name="close_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_moveview.xml b/indra/newview/skins/default/xui/zh/floater_moveview.xml
new file mode 100644
index 0000000000..3e44f458e7
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_moveview.xml
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="move_floater">
+ <string name="walk_forward_tooltip">
+ Walk Forward (press Up Arrow or W)
+ </string>
+ <string name="walk_back_tooltip">
+ Walk Backwards (press Down Arrow or S)
+ </string>
+ <string name="walk_left_tooltip">
+ Walk left (press Shift + Left Arrow or A)
+ </string>
+ <string name="walk_right_tooltip">
+ Walk right (press Shift + Right Arrow or D)
+ </string>
+ <string name="run_forward_tooltip">
+ Run Forward (press Up Arrow or W)
+ </string>
+ <string name="run_back_tooltip">
+ Run Backwards (press Down Arrow or S)
+ </string>
+ <string name="run_left_tooltip">
+ Run left (press Shift + Left Arrow or A)
+ </string>
+ <string name="run_right_tooltip">
+ Run right (press Shift + Right Arrow or 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">
+ Jump (press E)
+ </string>
+ <string name="crouch_tooltip">
+ Crouch (press C)
+ </string>
+ <string name="walk_title">
+ Walk
+ </string>
+ <string name="run_title">
+ Run
+ </string>
+ <string name="fly_title">
+ 飛行
+ </string>
+ <panel name="panel_actions">
+ <button name="turn left btn" tool_tip="Turn left (press Left Arrow or A)"/>
+ <joystick_slide name="move left btn" tool_tip="Walk left (press Shift + Left Arrow or A)"/>
+ <button name="turn right btn" tool_tip="Turn right (press Right Arrow or D)"/>
+ <joystick_slide name="move right btn" tool_tip="Walk right (press Shift + Right Arrow or D)"/>
+ <joystick_turn name="forward btn" tool_tip="Walk forward (press up arrow or W)"/>
+ <joystick_turn name="backward btn" tool_tip="Walk backward (press down arrow or 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="Walking mode"/>
+ <button label="" name="mode_run_btn" tool_tip="Running mode"/>
+ <button label="" name="mode_fly_btn" tool_tip="飛行模å¼"/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_mute_object.xml b/indra/newview/skins/default/xui/zh/floater_mute_object.xml
new file mode 100644
index 0000000000..7d76f4de08
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_mute_object.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="block by name" title="BLOCK OBJECT BY NAME">
+ <text name="message">
+ Block an object:
+ </text>
+ <line_editor name="object_name">
+ Object name
+ </line_editor>
+ <text name="note">
+ * Only blocks object text, not sounds
+ </text>
+ <button label="確定" name="OK"/>
+ <button label="å–消" name="Cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_nearby_chat.xml b/indra/newview/skins/default/xui/zh/floater_nearby_chat.xml
new file mode 100644
index 0000000000..f0c34acb06
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="Translate chat (powered by Google)" name="translate_chat_checkbox"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_notification.xml b/indra/newview/skins/default/xui/zh/floater_notification.xml
new file mode 100644
index 0000000000..1e0e207fb0
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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/zh/floater_notifications_console.xml b/indra/newview/skins/default/xui/zh/floater_notifications_console.xml
new file mode 100644
index 0000000000..3478761b0b
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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/zh/floater_openobject.xml b/indra/newview/skins/default/xui/zh/floater_openobject.xml
new file mode 100644
index 0000000000..61ac3cb1fc
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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/zh/floater_outfit_save_as.xml b/indra/newview/skins/default/xui/zh/floater_outfit_save_as.xml
new file mode 100644
index 0000000000..e33183a0dc
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_outfit_save_as.xml
@@ -0,0 +1,11 @@
+<?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] (new)
+ </line_editor>
+</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
new file mode 100644
index 0000000000..8b15668e3b
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_outgoing_call.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="outgoing call" title="CALLING">
+ <floater.string name="lifetime">
+ 5
+ </floater.string>
+ <floater.string name="localchat">
+ Nearby Voice Chat
+ </floater.string>
+ <floater.string name="anonymous">
+ anonymous
+ </floater.string>
+ <floater.string name="VoiceInviteP2P">
+ 通話中。
+ </floater.string>
+ <floater.string name="VoiceInviteAdHoc">
+ has joined a Voice Chat call with a conference chat.
+ </floater.string>
+ <text name="connecting">
+ Connecting to [CALLEE_NAME]
+ </text>
+ <text name="calling">
+ 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]
+ </text>
+ <text name="nearby_P2P_by_other">
+ Your call has ended. [RECONNECT_NEARBY]
+ </text>
+ <text name="nearby_P2P_by_agent">
+ You have ended the call. [RECONNECT_NEARBY]
+ </text>
+ <text name="leaving">
+ Leaving [CURRENT_CHAT].
+ </text>
+ <button label="å–消" label_selected="å–消" name="Cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_pay.xml b/indra/newview/skins/default/xui/zh/floater_pay.xml
new file mode 100644
index 0000000000..b4841df0ff
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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">
+ Test Name That Is Extremely Long To Check Clipping
+ </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/zh/floater_pay_object.xml b/indra/newview/skins/default/xui/zh/floater_pay_object.xml
new file mode 100644
index 0000000000..2a2aec93b9
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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">
+ My awesome object with a really damn long 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/zh/floater_perm_prefs.xml b/indra/newview/skins/default/xui/zh/floater_perm_prefs.xml
new file mode 100644
index 0000000000..31b8133a18
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="true" 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/zh/floater_post_process.xml b/indra/newview/skins/default/xui/zh/floater_post_process.xml
new file mode 100644
index 0000000000..0972c6dfa6
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_post_process.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Post-Process Floater" title="POST-PROCESS SETTINGS">
+ <tab_container name="Post-Process Tabs">
+ <panel label="Color Filter" name="wmiColorFilterPanel">
+ <check_box label="Enable" name="wmiColorFilterToggle"/>
+ <text name="wmiColorFilterBrightnessText">
+ Brightness
+ </text>
+ <text name="wmiColorFilterSaturationText">
+ Saturation
+ </text>
+ <text name="wmiColorFilterContrastText">
+ Contrast
+ </text>
+ <text name="wmiColorFilterBaseText">
+ Contrast Base Color
+ </text>
+ <slider label="R" name="wmiColorFilterBaseR"/>
+ <slider label="G" name="wmiColorFilterBaseG"/>
+ <slider label="B" name="wmiColorFilterBaseB"/>
+ <slider label="I" name="wmiColorFilterBaseI"/>
+ </panel>
+ <panel label="Night Vision" name="wmiNightVisionPanel">
+ <check_box label="Enable" name="wmiNightVisionToggle"/>
+ <text name="wmiNightVisionBrightMultText">
+ Light Amplification Multiple
+ </text>
+ <text name="wmiNightVisionNoiseSizeText">
+ Noise Size
+ </text>
+ <text name="wmiNightVisionNoiseStrengthText">
+ Noise Strength
+ </text>
+ </panel>
+ <panel label="Bloom" name="wmiBloomPanel">
+ <check_box label="Enable" name="wmiBloomToggle"/>
+ <text name="wmiBloomExtractText">
+ Luminosity Extraction
+ </text>
+ <text name="wmiBloomSizeText">
+ Bloom Size
+ </text>
+ <text name="wmiBloomStrengthText">
+ Bloom Strength
+ </text>
+ </panel>
+ <panel label="Extras" name="Extras">
+ <button label="LoadEffect" label_selected="LoadEffect" name="PPLoadEffect"/>
+ <button label="SaveEffect" label_selected="SaveEffect" name="PPSaveEffect"/>
+ <line_editor label="效果å稱" name="PPEffectNameEditor"/>
+ </panel>
+ </tab_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_postcard.xml b/indra/newview/skins/default/xui/zh/floater_postcard.xml
new file mode 100644
index 0000000000..6f6b75f468
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_postcard.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Postcard" title="EMAIL SNAPSHOT">
+ <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">
+ 傳é€ä¸­...
+ </floater.string>
+ <text name="to_label">
+ 收件人電å­éƒµä»¶åœ°å€ï¼š
+ </text>
+ <text name="from_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"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_preferences.xml b/indra/newview/skins/default/xui/zh/floater_preferences.xml
new file mode 100644
index 0000000000..396a4893e0
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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/zh/floater_preview_animation.xml b/indra/newview/skins/default/xui/zh/floater_preview_animation.xml
new file mode 100644
index 0000000000..ead8dc49a6
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="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"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_preview_gesture.xml b/indra/newview/skins/default/xui/zh/floater_preview_gesture.xml
new file mode 100644
index 0000000000..0649ecb791
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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">
+ Animation to play:
+ </floater.string>
+ <floater.string name="step_sound">
+ Sound to play:
+ </floater.string>
+ <floater.string name="step_chat">
+ Chat to say:
+ </floater.string>
+ <floater.string name="step_wait">
+ 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">
+ Gesture: [NAME]
+ </floater.string>
+ <text name="desc_label">
+ æ述:
+ </text>
+ <text name="trigger_label">
+ Trigger:
+ </text>
+ <text name="replace_text" tool_tip="Replace the trigger word(s) with these words. For example, trigger &apos;hello&apos; replace with &apos;howdy&apos; will turn the chat &apos;I wanted to say hello&apos; into &apos;I wanted to say howdy&apos; as well as playing the gesture!">
+ Replace with:
+ </text>
+ <line_editor name="replace_editor" tool_tip="Replace the trigger word(s) with these words. For example, trigger &apos;hello&apos; replace with &apos;howdy&apos; will turn the chat &apos;I wanted to say hello&apos; into &apos;I wanted to say howdy&apos; as well as playing the gesture"/>
+ <text name="key_label">
+ Shortcut Key:
+ </text>
+ <combo_box label="ç„¡" name="modifier_combo"/>
+ <combo_box label="ç„¡" name="key_combo"/>
+ <text name="library_label">
+ Library:
+ </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="Add &gt;&gt;" name="add_btn"/>
+ <text name="steps_label">
+ Steps:
+ </text>
+ <button label="Up" name="up_btn"/>
+ <button label="Down" 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="time in seconds:" name="wait_time_check"/>
+ <text name="help_label">
+ All steps happen simultaneously, unless you add wait steps.
+ </text>
+ <check_box label="Active" name="active_check" tool_tip="Active gestures can be triggered by chatting their trigger phrases or pressing their hot keys. Gestures usually become inactive when there is a key binding conflict."/>
+ <button label="é è¦½" name="preview_btn"/>
+ <button label="儲存" name="save_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_preview_notecard.xml b/indra/newview/skins/default/xui/zh/floater_preview_notecard.xml
new file mode 100644
index 0000000000..3c2f913a6d
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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">
+ Unable to find object containing this notecard.
+ </floater.string>
+ <floater.string name="not_allowed">
+ You do not have permission to view this notecard.
+ </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/zh/floater_preview_sound.xml b/indra/newview/skins/default/xui/zh/floater_preview_sound.xml
new file mode 100644
index 0000000000..d9854a85b6
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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">
+ Sound: [NAME]
+ </floater.string>
+ <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"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_preview_texture.xml b/indra/newview/skins/default/xui/zh/floater_preview_texture.xml
new file mode 100644
index 0000000000..02e26cea24
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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]px x [HEIGHT]px
+ </text>
+ <text name="aspect_ratio">
+ Preview aspect ratio
+ </text>
+ <combo_box name="combo_aspect_ratio" tool_tip="Preview at a fixed aspect ratio">
+ <combo_item name="Unconstrained">
+ Unconstrained
+ </combo_item>
+ <combo_item name="1:1" tool_tip="Group insignia or Real World profile">
+ 1:1
+ </combo_item>
+ <combo_item name="4:3" tool_tip="[SECOND_LIFE] 檔案">
+ 4:3
+ </combo_item>
+ <combo_item name="10:7" tool_tip="Classifieds and search listings, landmarks">
+ 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="Profile picks">
+ 16:9
+ </combo_item>
+ <combo_item name="2:1">
+ 2:1
+ </combo_item>
+ </combo_box>
+ <button label="確定" name="Keep"/>
+ <button label="Discard" name="Discard"/>
+ <button label="å¦å­˜" name="save_tex_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_publish_classified.xml b/indra/newview/skins/default/xui/zh/floater_publish_classified.xml
new file mode 100644
index 0000000000..acec1efcb0
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_publish_classified.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="publish_classified" title="Publishing Classified">
+ <text name="explanation_text">
+ Your classified ad will run for one week from the date it is published.
+
+Remember, Classified fees are non-refundable.
+ </text>
+ <spinner label="價格: L$" name="price_for_listing" tool_tip="Price for listing." value="50"/>
+ <button label="Publish" name="publish_btn"/>
+ <button label="å–消" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_region_debug_console.xml b/indra/newview/skins/default/xui/zh/floater_region_debug_console.xml
new file mode 100644
index 0000000000..b16a3bd9cc
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_region_debug_console.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="region_debug_console" title="Region Debug"/>
diff --git a/indra/newview/skins/default/xui/zh/floater_region_info.xml b/indra/newview/skins/default/xui/zh/floater_region_info.xml
new file mode 100644
index 0000000000..0e4879f555
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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/zh/floater_report_abuse.xml b/indra/newview/skins/default/xui/zh/floater_report_abuse.xml
new file mode 100644
index 0000000000..436f5cdcc5
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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">
+ Position:
+ </text>
+ <text name="pos_field">
+ {128.1, 128.1, 15.4}
+ </text>
+ <text name="select_object_label">
+ Click the button, then the abusive object:
+ </text>
+ <button name="pick_btn" tool_tip="Object Picker - Identify an object as the subject of this report"/>
+ <text name="object_name_label">
+ 物件:
+ </text>
+ <text name="owner_name_label">
+ æ“有者:
+ </text>
+ <combo_box name="category_combo" tool_tip="Category -- select the category that best describes this report">
+ <combo_box.item label="é¸æ“‡é¡žåˆ¥" name="Select_category"/>
+ <combo_box.item label="Age &gt; Age play" name="Age__Age_play"/>
+ <combo_box.item label="Age &gt; Adult Resident on Teen Second Life" name="Age__Adult_resident_on_Teen_Second_Life"/>
+ <combo_box.item label="Age &gt; Underage Resident outside of Teen Second Life" name="Age__Underage_resident_outside_of_Teen_Second_Life"/>
+ <combo_box.item label="Assault &gt; Combat sandbox / unsafe area" name="Assault__Combat_sandbox___unsafe_area"/>
+ <combo_box.item label="Assault &gt; Safe area" name="Assault__Safe_area"/>
+ <combo_box.item label="Assault &gt; Weapons testing sandbox" name="Assault__Weapons_testing_sandbox"/>
+ <combo_box.item label="Commerce &gt; Failure to deliver product or service" name="Commerce__Failure_to_deliver_product_or_service"/>
+ <combo_box.item label="Disclosure &gt; Real world information" name="Disclosure__Real_world_information"/>
+ <combo_box.item label="Disclosure &gt; Remotely monitoring chat" name="Disclosure__Remotely_monitoring chat"/>
+ <combo_box.item label="Disclosure &gt; Second Life information/chat/IMs" name="Disclosure__Second_Life_information_chat_IMs"/>
+ <combo_box.item label="Disturbing the peace &gt; Unfair use of region resources" name="Disturbing_the_peace__Unfair_use_of_region_resources"/>
+ <combo_box.item label="Disturbing the peace &gt; Excessive scripted objects" name="Disturbing_the_peace__Excessive_scripted_objects"/>
+ <combo_box.item label="Disturbing the peace &gt; Object littering" name="Disturbing_the_peace__Object_littering"/>
+ <combo_box.item label="Disturbing the peace &gt; Repetitive spam" name="Disturbing_the_peace__Repetitive_spam"/>
+ <combo_box.item label="Disturbing the peace &gt; Unwanted advert spam" name="Disturbing_the_peace__Unwanted_advert_spam"/>
+ <combo_box.item label="Fraud &gt; L$" name="Fraud__L$"/>
+ <combo_box.item label="Fraud &gt; Land" name="Fraud__Land"/>
+ <combo_box.item label="Fraud &gt; Pyramid scheme or chain letter" name="Fraud__Pyramid_scheme_or_chain_letter"/>
+ <combo_box.item label="Fraud &gt; US$" name="Fraud__US$"/>
+ <combo_box.item label="Harassment &gt; Advert farms / visual spam" name="Harassment__Advert_farms___visual_spam"/>
+ <combo_box.item label="Harassment &gt; Defaming individuals or groups" name="Harassment__Defaming_individuals_or_groups"/>
+ <combo_box.item label="Harassment &gt; Impeding movement" name="Harassment__Impeding_movement"/>
+ <combo_box.item label="Harassment &gt; Sexual harassment" name="Harassment__Sexual_harassment"/>
+ <combo_box.item label="Harassment &gt; Solicting/inciting others to violate ToS" name="Harassment__Solicting_inciting_others_to_violate_ToS"/>
+ <combo_box.item label="Harassment &gt; Verbal abuse" name="Harassment__Verbal_abuse"/>
+ <combo_box.item label="Indecency &gt; Broadly offensive content or conduct" name="Indecency__Broadly_offensive_content_or_conduct"/>
+ <combo_box.item label="Indecency &gt; Inappropriate avatar name" name="Indecency__Inappropriate_avatar_name"/>
+ <combo_box.item label="Indecency &gt; Inappropriate content or conduct in a PG region" name="Indecency__Mature_content_in_PG_region"/>
+ <combo_box.item label="Indecency &gt; Inappropriate content or conduct in a Moderate region" name="Indecency__Inappropriate_content_in_Mature_region"/>
+ <combo_box.item label="Intellectual property infringement &gt; Content Removal" name="Intellectual_property_infringement_Content_Removal"/>
+ <combo_box.item label="Intellectual property infringement &gt; CopyBot or Permissions Exploit" name="Intellectual_property_infringement_CopyBot_or_Permissions_Exploit"/>
+ <combo_box.item label="Intolerance" name="Intolerance"/>
+ <combo_box.item label="Land &gt; Abuse of sandbox resources" name="Land__Abuse_of_sandbox_resources"/>
+ <combo_box.item label="Land &gt; Encroachment &gt; Objects/textures" name="Land__Encroachment__Objects_textures"/>
+ <combo_box.item label="Land &gt; Encroachment &gt; Particles" name="Land__Encroachment__Particles"/>
+ <combo_box.item label="Land &gt; Encroachment &gt; Trees/plants" name="Land__Encroachment__Trees_plants"/>
+ <combo_box.item label="Wagering/gambling" name="Wagering_gambling"/>
+ <combo_box.item label="其他" name="Other"/>
+ </combo_box>
+ <text name="abuser_name_title">
+ 濫用者å稱:
+ </text>
+ <button label="é¸æ“‡" name="select_abuser" tool_tip="Select the name of the abuser from a list"/>
+ <text name="abuser_name_title2">
+ 濫用ä½ç½®ï¼š
+ </text>
+ <text name="sum_title">
+ 摘è¦ï¼š
+ </text>
+ <text name="dscr_title">
+ 細節:
+ </text>
+ <text name="bug_aviso">
+ Please be as specific as possible
+ </text>
+ <text name="incomplete_title">
+ * Incomplete reports won&apos;t be investigated
+ </text>
+ <button label="舉報濫用" label_selected="舉報濫用" name="send_btn"/>
+ <button label="å–消" label_selected="å–消" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_script_debug.xml b/indra/newview/skins/default/xui/zh/floater_script_debug.xml
new file mode 100644
index 0000000000..5b3500c018
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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/zh/floater_script_debug_panel.xml b/indra/newview/skins/default/xui/zh/floater_script_debug_panel.xml
new file mode 100644
index 0000000000..e70a30fa24
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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/zh/floater_script_limits.xml b/indra/newview/skins/default/xui/zh/floater_script_limits.xml
new file mode 100644
index 0000000000..7cd2c8e6c6
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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/zh/floater_script_preview.xml b/indra/newview/skins/default/xui/zh/floater_script_preview.xml
new file mode 100644
index 0000000000..75ef4ebe73
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_script_preview.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="preview lsl text" title="SCRIPT: ROTATION SCRIPT">
+ <floater.string name="Title">
+ SCRIPT: [NAME]
+ </floater.string>
+ <text name="desc txt">
+ æ述:
+ </text>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_script_queue.xml b/indra/newview/skins/default/xui/zh/floater_script_queue.xml
new file mode 100644
index 0000000000..4062db5014
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_script_queue.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="queue" title="RESET PROGRESS">
+ <floater.string name="Starting">
+ Starting [START] of [COUNT] items.
+ </floater.string>
+ <floater.string name="Done">
+ Done.
+ </floater.string>
+ <floater.string name="Resetting">
+ Resetting
+ </floater.string>
+ <floater.string name="Running">
+ Running
+ </floater.string>
+ <floater.string name="NotRunning">
+ Not running
+ </floater.string>
+ <button label="關閉" label_selected="關閉" name="close"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_script_search.xml b/indra/newview/skins/default/xui/zh/floater_script_search.xml
new file mode 100644
index 0000000000..400ef4be81
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="Case Insensitive" 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/zh/floater_search.xml b/indra/newview/skins/default/xui/zh/floater_search.xml
new file mode 100644
index 0000000000..5b247350b8
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_search.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_search" title="FIND">
+ <floater.string name="loading_text">
+ 載入中...
+ </floater.string>
+ <floater.string name="done_text">
+ Done
+ </floater.string>
+ <layout_stack name="stack1">
+ <layout_panel name="browser_layout">
+ <text name="refresh_search">
+ Redo search to reflect current God level
+ </text>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_select_key.xml b/indra/newview/skins/default/xui/zh/floater_select_key.xml
new file mode 100644
index 0000000000..c1661635f1
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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:">
+ Press a key to set your Speak button trigger.
+ </text>
+ <button label="å–消" label_selected="å–消" name="Cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_sell_land.xml b/indra/newview/skins/default/xui/zh/floater_sell_land.xml
new file mode 100644
index 0000000000..19580c99a1
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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] m²
+ </text>
+ <text name="info_action">
+ To sell this parcel:
+ </text>
+ <text name="price_label">
+ 1. Set a price:
+ </text>
+ <text name="price_text">
+ Choose an appropriate price.
+ </text>
+ <text name="price_ld">
+ L$
+ </text>
+ <line_editor name="price">
+ 0
+ </line_editor>
+ <text name="price_per_m">
+ (L$[PER_METER] per m²)
+ </text>
+ <text name="sell_to_label">
+ 2. Sell the land to:
+ </text>
+ <text name="sell_to_text">
+ Choose whether to sell to anyone or a particular buyer.
+ </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. Sell the objects with the land?
+ </text>
+ <text name="sell_objects_text">
+ Land owner&apos;s transferable objects on parcel will change ownership.
+ </text>
+ <radio_group name="sell_objects">
+ <radio_item label="No, keep ownership of objects" name="no"/>
+ <radio_item label="Yes, sell objects with land" name="yes"/>
+ </radio_group>
+ <button label="顯示物件" name="show_objects"/>
+ <text name="nag_message_label">
+ REMEMBER: All sales are final.
+ </text>
+ <button label="Set Land For Sale" name="sell_btn"/>
+ <button label="å–消" name="cancel_btn"/>
+ </panel>
+ </scroll_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_settings_debug.xml b/indra/newview/skins/default/xui/zh/floater_settings_debug.xml
new file mode 100644
index 0000000000..bba075cf08
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="TRUE" name="TRUE" value="true"/>
+ <radio_item label="FALSE" name="FALSE" value=""/>
+ </radio_group>
+ <color_swatch label="Color" 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="Reset to default" name="default_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_snapshot.xml b/indra/newview/skins/default/xui/zh/floater_snapshot.xml
new file mode 100644
index 0000000000..9edc19969f
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_snapshot.xml
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Snapshot" title="SNAPSHOT PREVIEW">
+ <floater.string name="unknown">
+ 未知
+ </floater.string>
+ <radio_group label="Snapshot type" name="snapshot_type_radio">
+ <radio_item label="Email" name="postcard"/>
+ <radio_item label="我的收ç´å€ï¼ˆL$[AMOUNT])" name="texture"/>
+ <radio_item label="Save to my computer" name="local"/>
+ </radio_group>
+ <text name="file_size_label">
+ [SIZE] KB
+ </text>
+ <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">
+ Format
+ </text>
+ <combo_box label="Resolution" 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="Resolution" name="texture_size_combo">
+ <combo_box.item label="ç›®å‰è¦–窗" name="CurrentWindow"/>
+ <combo_box.item label="Small (128x128)" name="Small(128x128)"/>
+ <combo_box.item label="Medium (256x256)" name="Medium(256x256)"/>
+ <combo_box.item label="Large (512x512)" name="Large(512x512)"/>
+ <combo_box.item label="自訂" name="Custom"/>
+ </combo_box>
+ <combo_box label="Resolution" 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="Custom" 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="Width" name="snapshot_width"/>
+ <spinner label="Height" name="snapshot_height"/>
+ <check_box label="Constrain proportions" name="keep_aspect_check"/>
+ <slider label="圖åƒå“質" name="image_quality_slider"/>
+ <text name="layer_type_label">
+ Capture:
+ </text>
+ <combo_box label="圖層" name="layer_types">
+ <combo_box.item label="Colors" name="Colors"/>
+ <combo_box.item label="Depth" name="Depth"/>
+ </combo_box>
+ <check_box label="Interface" name="ui_check"/>
+ <check_box label="HUDs" name="hud_check"/>
+ <check_box label="Keep open after saving" name="keep_open_check"/>
+ <check_box label="å‡çµæ¡†æž¶ï¼ˆå…¨èž¢å¹•ï¼‰" name="freeze_frame_check"/>
+ <check_box label="Auto-refresh" name="auto_snapshot_check"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_sound_preview.xml b/indra/newview/skins/default/xui/zh/floater_sound_preview.xml
new file mode 100644
index 0000000000..c942ba1cfb
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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/zh/floater_stats.xml b/indra/newview/skins/default/xui/zh/floater_stats.xml
new file mode 100644
index 0000000000..eebd5df3f7
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_stats.xml
@@ -0,0 +1,71 @@
+<?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="FPS" name="fps"/>
+ <stat_bar label="頻寬" name="bandwidth"/>
+ <stat_bar label="å°åŒ…æ失" name="packet_loss"/>
+ <stat_bar label="Ping Sim" name="ping"/>
+ </stat_view>
+ <stat_view label="進階" 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="物件總計" name="objs"/>
+ <stat_bar label="新物件" name="newobjs"/>
+ </stat_view>
+ <stat_view label="æ質" name="texture">
+ <stat_bar label="計數" 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="網路" name="network">
+ <stat_bar label="Packets In" name="packetsinstat"/>
+ <stat_bar label="Packets Out" name="packetsoutstat"/>
+ <stat_bar label="物件" name="objectkbitstat"/>
+ <stat_bar label="æ質" name="texturekbitstat"/>
+ <stat_bar label="資產" name="assetkbitstat"/>
+ <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_view>
+ </stat_view>
+ <stat_view label="模擬器" name="sim">
+ <stat_bar label="Time Dilation" 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="記憶體é…ç½®" name="physicsmemoryallocated"/>
+ </stat_view>
+ <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="物件" 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="擱置下載" name="simpendingdownloads"/>
+ <stat_bar label="擱置上傳" name="simpendinguploads"/>
+ <stat_bar label="Total Unacked Bytes" name="simtotalunackedbytes"/>
+ <stat_view label="Time (ms)" name="simperf">
+ <stat_bar label="Total Frame Time" name="simframemsec"/>
+ <stat_bar label="Net Time" name="simnetmsec"/>
+ <stat_bar label="Physics Time" name="simsimphysicsmsec"/>
+ <stat_bar label="Simulation Time" name="simsimothermsec"/>
+ <stat_bar label="Agent Time" name="simagentmsec"/>
+ <stat_bar label="Images Time" name="simimagesmsec"/>
+ <stat_bar label="腳本時間" name="simscriptmsec"/>
+ </stat_view>
+ </stat_view>
+ </container_view>
+ </scroll_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_sys_well.xml b/indra/newview/skins/default/xui/zh/floater_sys_well.xml
new file mode 100644
index 0000000000..fd27e944ac
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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">
+ CONVERSATIONS
+ </string>
+ <string name="title_notification_well_window">
+ 通知
+ </string>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_telehub.xml b/indra/newview/skins/default/xui/zh/floater_telehub.xml
new file mode 100644
index 0000000000..b4c9f3ab29
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="TELEHUB">
+ <text name="status_text_connected">
+ Telehub connected to object [OBJECT]
+ </text>
+ <text name="status_text_not_connected">
+ No telehub connected.
+ </text>
+ <text name="help_text_connected">
+ To remove, click Disconnect.
+ </text>
+ <text name="help_text_not_connected">
+ Select object and click Connect Telehub.
+ </text>
+ <button label="Connect Telehub" name="connect_btn"/>
+ <button label="Disconnect" name="disconnect_btn"/>
+ <text name="spawn_points_text">
+ Spawn Points (positions, not objects):
+ </text>
+ <button label="Add Spawn" name="add_spawn_point_btn"/>
+ <button label="Remove Spawn" name="remove_spawn_point_btn"/>
+ <text name="spawn_point_help">
+ Select object and click &quot;Add Spawn&quot; to specify position.
+You can then move or delete the object.
+Positions are relative to the telehub center.
+Select an item in list to highlight it inworld.
+ </text>
+</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
new file mode 100644
index 0000000000..fc00b0b4a2
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_texture_ctrl.xml
@@ -0,0 +1,23 @@
+<?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:
+ </floater.string>
+ <text name="Multiple">
+ Multiple textures
+ </text>
+ <text name="unknown">
+ 尺寸:[DIMENSIONS]
+ </text>
+ <button label="é è¨­" label_selected="é è¨­" name="Default"/>
+ <button label="ç„¡" label_selected="ç„¡" name="None"/>
+ <button label="Blank" label_selected="Blank" name="Blank"/>
+ <check_box initial_value="true" label="ç«‹å³å¥—用" name="apply_immediate_check"/>
+ <filter_editor label="æ質éŽæ¿¾å™¨" name="inventory search editor"/>
+ <check_box initial_value="false" 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/zh/floater_tools.xml b/indra/newview/skins/default/xui/zh/floater_tools.xml
new file mode 100644
index 0000000000..300d7ee63b
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_tools.xml
@@ -0,0 +1,499 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="toolbox floater" short_title="建造工具">
+ <floater.string name="status_rotate">
+ Drag colored bands to rotate object
+ </floater.string>
+ <floater.string name="status_scale">
+ Click and drag to stretch selected side
+ </floater.string>
+ <floater.string name="status_move">
+ Drag to move, shift-drag to copy
+ </floater.string>
+ <floater.string name="status_modifyland">
+ Click and hold to modify land
+ </floater.string>
+ <floater.string name="status_camera">
+ Click and drag to move camera
+ </floater.string>
+ <floater.string name="status_grab">
+ Drag to move, Ctrl to lift, Ctrl+Shift to rotate
+ </floater.string>
+ <floater.string name="status_place">
+ Click inworld to build
+ </floater.string>
+ <floater.string name="status_selectland">
+ Click and drag to select land
+ </floater.string>
+ <floater.string name="grid_screen_text">
+ Screen
+ </floater.string>
+ <floater.string name="grid_local_text">
+ Local
+ </floater.string>
+ <floater.string name="grid_world_text">
+ World
+ </floater.string>
+ <floater.string name="grid_reference_text">
+ Reference
+ </floater.string>
+ <floater.string name="grid_attachment_text">
+ Attachment
+ </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">
+ Drag to move, shift-drag to copy
+ </text>
+ <radio_group name="focus_radio_group">
+ <radio_item label="Zoom" name="radio zoom"/>
+ <radio_item label="Orbit (Ctrl)" name="radio orbit"/>
+ <radio_item label="Pan (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="Lift (Ctrl)" name="radio lift"/>
+ <radio_item label="Spin (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 name="RenderingCost" tool_tip="Shows the rendering cost calculated for this object">
+ þ: [COUNT]
+ </text>
+ <text label="åŒæ™‚伸展兩å´" name="checkbox uniform label">
+ åŒæ™‚伸展兩å´
+ </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>
+ <button name="Options..." tool_tip="察看更多格線é¸é …"/>
+ <button name="ToolCube" tool_tip="Cube"/>
+ <button name="ToolPrism" tool_tip="Prism"/>
+ <button name="ToolPyramid" tool_tip="Pyramid"/>
+ <button name="ToolTetrahedron" tool_tip="Tetrahedron"/>
+ <button name="ToolCylinder" tool_tip="Cylinder"/>
+ <button name="ToolHemiCylinder" tool_tip="Hemicylinder"/>
+ <button name="ToolCone" tool_tip="Cone"/>
+ <button name="ToolHemiCone" tool_tip="Hemicone"/>
+ <button name="ToolSphere" tool_tip="Sphere"/>
+ <button name="ToolHemiSphere" tool_tip="Hemisphere"/>
+ <button name="ToolTorus" tool_tip="Torus"/>
+ <button name="ToolTube" tool_tip="Tube"/>
+ <button name="ToolRing" tool_tip="Ring"/>
+ <button name="ToolTree" tool_tip="Tree"/>
+ <button name="ToolGrass" tool_tip="Grass"/>
+ <check_box label="ä¿æŒå·²é¸æ“‡çš„工具" name="checkbox sticky"/>
+ <check_box label="覆製é¸æ“‡" name="checkbox copy selection"/>
+ <check_box initial_value="true" label="Center Copy" name="checkbox copy centers"/>
+ <check_box label="Rotate Copy" 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="obj_count">
+ 物件: [COUNT]
+ </text>
+ <text name="prim_count">
+ Prims: [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">
+ 你能修改這個物件
+ </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">
+ Mixed Price
+ </panel.string>
+ <panel.string name="Sale Mixed">
+ Mixed Sale
+ </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="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."/>
+ <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:">
+ 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="物件" 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="Box" name="Box"/>
+ <combo_box.item label="Cylinder" name="Cylinder"/>
+ <combo_box.item label="Prism" name="Prism"/>
+ <combo_box.item label="Sphere" name="Sphere"/>
+ <combo_box.item label="Torus" name="Torus"/>
+ <combo_box.item label="Tube" name="Tube"/>
+ <combo_box.item label="Ring" name="Ring"/>
+ <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="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>
+ <text name="text cut">
+ Path Cut (begin/end)
+ </text>
+ <spinner label="B" name="cut begin"/>
+ <spinner label="E" name="cut end"/>
+ <text name="text hollow">
+ 中空
+ </text>
+ <text name="text skew">
+ Skew
+ </text>
+ <text name="Hollow Shape">
+ 中空形狀
+ </text>
+ <combo_box name="hole">
+ <combo_box.item label="é è¨­" name="Default"/>
+ <combo_box.item label="Circle" name="Circle"/>
+ <combo_box.item label="Square" name="Square"/>
+ <combo_box.item label="Triangle" name="Triangle"/>
+ </combo_box>
+ <text name="text twist">
+ Twist (begin/end)
+ </text>
+ <spinner label="B" name="Twist Begin"/>
+ <spinner label="E" name="Twist End"/>
+ <text name="scale_taper">
+ 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">
+ Top Shear
+ </text>
+ <spinner label="X" name="Shear X"/>
+ <spinner label="Y" name="Shear Y"/>
+ <text name="advanced_cut">
+ Profile Cut (begin/end)
+ </text>
+ <text name="advanced_dimple">
+ Dimple (begin/end)
+ </text>
+ <text name="advanced_slice">
+ Slice (begin/end)
+ </text>
+ <spinner label="B" name="Path Limit Begin"/>
+ <spinner label="E" name="Path Limit End"/>
+ <text name="text taper2">
+ Taper
+ </text>
+ <spinner label="X" name="Taper X"/>
+ <spinner label="Y" name="Taper Y"/>
+ <text name="text radius delta">
+ Radius
+ </text>
+ <text name="text revolutions">
+ Revolutions
+ </text>
+ <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">
+ Stitching type
+ </text>
+ <combo_box name="sculpt type control">
+ <combo_box.item label="(無)" name="None"/>
+ <combo_box.item label="Sphere" name="Sphere"/>
+ <combo_box.item label="Torus" name="Torus"/>
+ <combo_box.item label="Plane" name="Plane"/>
+ <combo_box.item label="Cylinder" name="Cylinder"/>
+ </combo_box>
+ </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"/>
+ <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="FOV" name="Light FOV"/>
+ <spinner label="Radius" name="Light Radius"/>
+ <spinner label="Focus" name="Light Focus"/>
+ <spinner label="Falloff" name="Light Falloff"/>
+ <spinner label="Ambiance" name="Light Ambiance"/>
+ </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="Brightness" name="Brightness"/>
+ <combo_box.item label="Darkness" name="Darkness"/>
+ <combo_box.item label="woodgrain" name="woodgrain"/>
+ <combo_box.item label="bark" name="bark"/>
+ <combo_box.item label="bricks" name="bricks"/>
+ <combo_box.item label="checker" name="checker"/>
+ <combo_box.item label="concrete" name="concrete"/>
+ <combo_box.item label="crustytile" name="crustytile"/>
+ <combo_box.item label="cutstone" name="cutstone"/>
+ <combo_box.item label="discs" name="discs"/>
+ <combo_box.item label="gravel" name="gravel"/>
+ <combo_box.item label="petridish" name="petridish"/>
+ <combo_box.item label="siding" name="siding"/>
+ <combo_box.item label="stonetile" name="stonetile"/>
+ <combo_box.item label="stucco" name="stucco"/>
+ <combo_box.item label="suction" name="suction"/>
+ <combo_box.item label="weave" name="weave"/>
+ </combo_box>
+ <check_box initial_value="false" 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] m²
+ </text>
+ <text name="label_area">
+ é¢ç©ï¼š [AREA] m²
+ </text>
+ <button label="關於土地" label_selected="關於土地" name="button about land"/>
+ <check_box label="顯示æ“有者" name="checkbox show owners" tool_tip="Colorize the parcels according to the type of owner:
+
+綠色 = 你的土地
+æ°´è— = 你社團的土地
+紅色 = 其他人所有
+黃色 = 出售
+紫色 = æ‹è³£
+ç°è‰² = 公有地"/>
+ <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/zh/floater_top_objects.xml b/indra/newview/skins/default/xui/zh/floater_top_objects.xml
new file mode 100644
index 0000000000..074a4a1881
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_top_objects.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="top_objects" title="Top Objects">
+ <floater.string name="top_scripts_title">
+ Top Scripts
+ </floater.string>
+ <floater.string name="top_scripts_text">
+ [COUNT] scripts taking a total of [TIME] ms
+ </floater.string>
+ <floater.string name="scripts_score_label">
+ Time
+ </floater.string>
+ <floater.string name="scripts_mono_time_label">
+ Mono Time
+ </floater.string>
+ <floater.string name="top_colliders_title">
+ Top Colliders
+ </floater.string>
+ <floater.string name="top_colliders_text">
+ Top [COUNT] objects experiencing many potential collisions
+ </floater.string>
+ <floater.string name="colliders_score_label">
+ ç©åˆ†
+ </floater.string>
+ <floater.string name="none_descriptor">
+ None found.
+ </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="Time" name="time"/>
+ <scroll_list.columns label="Mono Time" name="mono_time"/>
+ <scroll_list.columns label="URLs" name="URLs"/>
+ </scroll_list>
+ <text name="id_text">
+ 物件 ID:
+ </text>
+ <button label="Show Beacon" 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/zh/floater_tos.xml b/indra/newview/skins/default/xui/zh/floater_tos.xml
new file mode 100644
index 0000000000..5f9e16afe1
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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/zh/floater_url_entry.xml b/indra/newview/skins/default/xui/zh/floater_url_entry.xml
new file mode 100644
index 0000000000..65f6a9cb95
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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/zh/floater_voice_controls.xml b/indra/newview/skins/default/xui/zh/floater_voice_controls.xml
new file mode 100644
index 0000000000..4d650eaaee
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_voice_controls.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_voice_controls" title="Voice Controls">
+ <string name="title_nearby">
+ NEARBY VOICE
+ </string>
+ <string name="title_group">
+ Group Call with [GROUP]
+ </string>
+ <string name="title_adhoc">
+ Conference Call
+ </string>
+ <string name="title_peer_2_peer">
+ Call with [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">
+ <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="Leave Call" name="leave_call_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_voice_effect.xml b/indra/newview/skins/default/xui/zh/floater_voice_effect.xml
new file mode 100644
index 0000000000..36efe20b65
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_voice_effect.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater label="地點" name="voice_effects" title="語音變è²">
+ <string name="no_voice_effect">
+ (No Voice Morph)
+ </string>
+ <string name="active_voice_effect">
+ (Active)
+ </string>
+ <string name="unsubscribed_voice_effect">
+ (Unsubscribed)
+ </string>
+ <string name="new_voice_effect">
+ (New!)
+ </string>
+ <text name="preview_text">
+ To Preview
+ </text>
+ <text name="status_text">
+ Record a sample, then click on a voice to hear how it will sound.
+ </text>
+ <button label="Record" name="record_btn" tool_tip="Record a sample of your voice."/>
+ <button label="åœæ­¢" name="record_stop_btn"/>
+ <text name="voice_morphing_link">
+ [[URL] Subscribe Now]
+ </text>
+ <scroll_list name="voice_effect_list" tool_tip="Record a sample of your voice, then click an effect to preview.">
+ <scroll_list.columns label="語音å稱" name="name"/>
+ <scroll_list.columns label="éŽæœŸ" name="expires"/>
+ </scroll_list>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_web_content.xml b/indra/newview/skins/default/xui/zh/floater_web_content.xml
new file mode 100644
index 0000000000..a756498b81
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="Navigate back"/>
+ <button name="forward" tool_tip="Navigate forward"/>
+ <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="Secured Browsing"/>
+ <button name="popexternal" tool_tip="Open current URL in your desktop browser"/>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_whitelist_entry.xml b/indra/newview/skins/default/xui/zh/floater_whitelist_entry.xml
new file mode 100644
index 0000000000..36e00049f0
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_whitelist_entry.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="whitelist_entry" title="WHITELIST ENTRY">
+ <text name="media_label">
+ Enter a URL or URL pattern to add to the list of allowed domains
+ </text>
+ <line_editor name="whitelist_entry" tool_tip="Enter a URL or URL pattern to White List"/>
+ <button label="確定" name="ok_btn"/>
+ <button label="å–消" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_window_size.xml b/indra/newview/skins/default/xui/zh/floater_window_size.xml
new file mode 100644
index 0000000000..54b72afccc
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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/zh/floater_world_map.xml b/indra/newview/skins/default/xui/zh/floater_world_map.xml
new file mode 100644
index 0000000000..552bb02582
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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">
+ Legend
+ </text>
+ </panel>
+ <panel name="layout_panel_2">
+ <button name="Show My Location" tool_tip="Center map on my avatar&apos;s location"/>
+ <text name="me_label">
+ Me
+ </text>
+ <text name="person_label">
+ 人
+ </text>
+ <text name="infohub_label">
+ Infohub
+ </text>
+ <text name="land_sale_label">
+ Land Sale
+ </text>
+ <text name="auction_label">
+ land auction
+ </text>
+ <text name="by_owner_label">
+ by owner
+ </text>
+ <button name="Go Home" tool_tip="瞬間傳é€åˆ°æˆ‘的家ä½ç½®"/>
+ <text name="Home_label">
+ 家
+ </text>
+ <text name="events_label">
+ Events:
+ </text>
+ <text name="pg_label">
+ 一般
+ </text>
+ <check_box initial_value="true" name="events_mature_chk"/>
+ <text name="events_mature_label">
+ Moderate
+ </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="Regions by Name" name="location" tool_tip="輸入一個地å€çš„å稱"/>
+ <button label="Find" name="DoSearch" tool_tip="Search for region"/>
+ <button name="Clear" tool_tip="Clear tracking lines and reset map"/>
+ <text name="events_label">
+ ä½ç½®ï¼š
+ </text>
+ <button label="瞬間傳é€" name="Teleport" tool_tip="瞬間傳é€åˆ°æ‰€é¸çš„ä½ç½®"/>
+ <button label="覆製 SLurl" name="copy_slurl" tool_tip="Copies current location as SLurl to be used on the web."/>
+ <button label="Show Selection" name="Show Destination" tool_tip="Center map on selected location"/>
+ </panel>
+ <panel name="layout_panel_5">
+ <text name="zoom_label">
+ Zoom
+ </text>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/inspect_avatar.xml b/indra/newview/skins/default/xui/zh/inspect_avatar.xml
new file mode 100644
index 0000000000..02e81983a6
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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 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="Voice volume" 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="Disable Voice" name="disable_voice"/>
+ <button label="Enable Voice" name="enable_voice"/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/inspect_group.xml b/indra/newview/skins/default/xui/zh/inspect_group.xml
new file mode 100644
index 0000000000..3583976646
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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] to join
+ </string>
+ <string name="YouAreMember">
+ You are a member
+ </string>
+ <text name="group_subtitle">
+ 123 members
+ </text>
+ <text name="group_details">
+ A group of folks charged with creating a room with a moose.
+Fear the moose! Fear it! And the mongoose too!
+ </text>
+ <text name="group_cost">
+ L$123 to join
+ </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/zh/inspect_object.xml b/indra/newview/skins/default/xui/zh/inspect_object.xml
new file mode 100644
index 0000000000..58091b3aef
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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">
+ 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 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>
+ <icon name="secure_browsing" tool_tip="Secure Browsing"/>
+ <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="Touch" name="touch_btn"/>
+ <button label="Sit" name="sit_btn"/>
+ <button label="Open" name="open_btn"/>
+ <button label="More" name="more_info_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/inspect_remote_object.xml b/indra/newview/skins/default/xui/zh/inspect_remote_object.xml
new file mode 100644
index 0000000000..26f49ce69a
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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">
+ Test Object Name That Is Really Long OMG so long I can&apos;t believe how long the name of this object is, I mean really.
+ </text>
+ <text name="object_owner_label">
+ æ“有者:
+ </text>
+ <text name="object_owner">
+ Longavatarname Johnsonlongstonnammer
+ </text>
+ <text name="object_slurl">
+ http://slurl.com/Ahern/50/50/50
+ </text>
+ <button label="地圖" name="map_btn"/>
+ <button label="Block" name="block_btn"/>
+ <button label="關閉" name="close_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/menu_add_wearable_gear.xml b/indra/newview/skins/default/xui/zh/menu_add_wearable_gear.xml
new file mode 100644
index 0000000000..3c8c3e4a31
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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/zh/menu_attachment_other.xml b/indra/newview/skins/default/xui/zh/menu_attachment_other.xml
new file mode 100644
index 0000000000..a04d59bc81
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="Zoom In" 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/zh/menu_attachment_self.xml b/indra/newview/skins/default/xui/zh/menu_attachment_self.xml
new file mode 100644
index 0000000000..e3a791cde5
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="Touch" 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/zh/menu_avatar_icon.xml b/indra/newview/skins/default/xui/zh/menu_avatar_icon.xml
new file mode 100644
index 0000000000..ef0986a13b
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="é€å‡º 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/default/xui/zh/menu_avatar_other.xml b/indra/newview/skins/default/xui/zh/menu_avatar_other.xml
new file mode 100644
index 0000000000..acf98dfdfa
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="Block" 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="Zoom In" name="Zoom In"/>
+ <menu_item_call label="支付" name="Pay..."/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_avatar_self.xml b/indra/newview/skins/default/xui/zh/menu_avatar_self.xml
new file mode 100644
index 0000000000..646edcf563
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="Physics" name="Self Physics"/>
+ <menu_item_call label="Alpha" 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/default/xui/zh/menu_bottomtray.xml b/indra/newview/skins/default/xui/zh/menu_bottomtray.xml
new file mode 100644
index 0000000000..a00aa7cd35
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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/zh/menu_cof_attachment.xml b/indra/newview/skins/default/xui/zh/menu_cof_attachment.xml
new file mode 100644
index 0000000000..876fef16df
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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/zh/menu_cof_body_part.xml b/indra/newview/skins/default/xui/zh/menu_cof_body_part.xml
new file mode 100644
index 0000000000..d06207b19d
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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/zh/menu_cof_clothing.xml b/indra/newview/skins/default/xui/zh/menu_cof_clothing.xml
new file mode 100644
index 0000000000..300ff47b12
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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/zh/menu_cof_gear.xml b/indra/newview/skins/default/xui/zh/menu_cof_gear.xml
new file mode 100644
index 0000000000..cd069f9601
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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/zh/menu_edit.xml b/indra/newview/skins/default/xui/zh/menu_edit.xml
new file mode 100644
index 0000000000..d6eb87a6b0
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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/zh/menu_favorites.xml b/indra/newview/skins/default/xui/zh/menu_favorites.xml
new file mode 100644
index 0000000000..c60bebd3dc
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="覆製 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/default/xui/zh/menu_gesture_gear.xml b/indra/newview/skins/default/xui/zh/menu_gesture_gear.xml
new file mode 100644
index 0000000000..e053eb2388
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="Add/Remove from Favorites" 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/zh/menu_group_plus.xml b/indra/newview/skins/default/xui/zh/menu_group_plus.xml
new file mode 100644
index 0000000000..77c2c92491
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="Join Group..." name="item_join"/>
+ <menu_item_call label="New Group..." name="item_new"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_hide_navbar.xml b/indra/newview/skins/default/xui/zh/menu_hide_navbar.xml
new file mode 100644
index 0000000000..dbb8ececaa
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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/zh/menu_im_well_button.xml b/indra/newview/skins/default/xui/zh/menu_im_well_button.xml
new file mode 100644
index 0000000000..4b9b4b2758
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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/zh/menu_imchiclet_adhoc.xml b/indra/newview/skins/default/xui/zh/menu_imchiclet_adhoc.xml
new file mode 100644
index 0000000000..85417d554e
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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/zh/menu_imchiclet_group.xml b/indra/newview/skins/default/xui/zh/menu_imchiclet_group.xml
new file mode 100644
index 0000000000..2577c582a7
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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/zh/menu_imchiclet_p2p.xml b/indra/newview/skins/default/xui/zh/menu_imchiclet_p2p.xml
new file mode 100644
index 0000000000..636bdaae09
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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/zh/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/zh/menu_inspect_avatar_gear.xml
new file mode 100644
index 0000000000..0f14057c07
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="Invite to Group" name="invite_to_group"/>
+ <menu_item_call label="Block" name="block"/>
+ <menu_item_call label="Unblock" 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="Find On Map" name="find_on_map"/>
+ <menu_item_call label="Zoom In" 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/zh/menu_inspect_object_gear.xml b/indra/newview/skins/default/xui/zh/menu_inspect_object_gear.xml
new file mode 100644
index 0000000000..94ab82b8a9
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="Pay" 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="Block" name="block"/>
+ <menu_item_call label="Zoom In" 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/zh/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/zh/menu_inspect_self_gear.xml
new file mode 100644
index 0000000000..2d7da70bfc
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="Alpha" 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/default/xui/zh/menu_inv_offer_chiclet.xml b/indra/newview/skins/default/xui/zh/menu_inv_offer_chiclet.xml
new file mode 100644
index 0000000000..577e5988f8
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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/zh/menu_inventory.xml b/indra/newview/skins/default/xui/zh/menu_inventory.xml
new file mode 100644
index 0000000000..a93e8be149
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_inventory.xml
@@ -0,0 +1,87 @@
+<?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="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 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="新資料夾" 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 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="New Alpha Mask" name="New Alpha Mask"/>
+ <menu_item_call label="新刺é’" name="New Tattoo"/>
+ <menu_item_call label="New Physics" 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="Find Original" 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="Open"/>
+ <menu_item_call label="Open Original" name="Open Original"/>
+ <menu_item_call label="Properties" 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="Paste As Link" 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="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="Send Instant Message"/>
+ <menu_item_call label="Offer Teleport..." name="Offer Teleport..."/>
+ <menu_item_call label="Start Conference Chat" name="Conference Chat"/>
+ <menu_item_call label="Activate" name="Activate"/>
+ <menu_item_call label="Deactivate" name="Deactivate"/>
+ <menu_item_call label="å¦å­˜" name="Save As"/>
+ <menu_item_call label="Detach From Yourself" name="Detach From Yourself"/>
+ <menu_item_call label="Wear" name="Wearable And Object Wear"/>
+ <menu label="Attach To" name="Attach To"/>
+ <menu label="Attach To HUD" name="Attach To HUD"/>
+ <menu_item_call label="編輯" name="Wearable Edit"/>
+ <menu_item_call label="Add" name="Wearable Add"/>
+ <menu_item_call label="脫下" name="Take Off"/>
+ <menu_item_call label="-- ç„¡é¸é … --" name="--no options--"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_inventory_add.xml b/indra/newview/skins/default/xui/zh/menu_inventory_add.xml
new file mode 100644
index 0000000000..9199608200
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_inventory_add.xml
@@ -0,0 +1,34 @@
+<?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="New Alpha" name="New Alpha"/>
+ <menu_item_call label="新刺é’" name="New Tattoo"/>
+ <menu_item_call label="New Physics" 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/zh/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/zh/menu_inventory_gear_default.xml
new file mode 100644
index 0000000000..f51b27d9ce
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="Reset Filters" 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"/>
+ <menu_item_call label="分享" name="Share"/>
+ <menu_item_call label="Find Original" name="Find Original"/>
+ <menu_item_call label="Find All Links" name="Find All Links"/>
+ <menu_item_call label="清空垃圾筒" name="empty_trash"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_land.xml b/indra/newview/skins/default/xui/zh/menu_land.xml
new file mode 100644
index 0000000000..84941d138c
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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/zh/menu_landmark.xml b/indra/newview/skins/default/xui/zh/menu_landmark.xml
new file mode 100644
index 0000000000..7372b223cf
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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" 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/zh/menu_login.xml b/indra/newview/skins/default/xui/zh/menu_login.xml
new file mode 100644
index 0000000000..d6bf34c66e
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="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="顯示 TOS" name="TOS"/>
+ <menu_item_call label="顯示嚴é‡è¨Šæ¯" name="Critical"/>
+ <menu_item_call label="媒體ç€è¦½å™¨æ¸¬è©¦" name="Web Browser Test"/>
+ <menu_item_call label="網é å…§å®¹æµ®å‹•è¦–窗測試" 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/default/xui/zh/menu_media_ctrl.xml b/indra/newview/skins/default/xui/zh/menu_media_ctrl.xml
new file mode 100644
index 0000000000..2ec95aa4f9
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_media_ctrl.xml
@@ -0,0 +1,6 @@
+<?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"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_mini_map.xml b/indra/newview/skins/default/xui/zh/menu_mini_map.xml
new file mode 100644
index 0000000000..24bc6355c7
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_mini_map.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Popup">
+ <menu_item_call label="Zoom Close" name="Zoom Close"/>
+ <menu_item_call label="Zoom Medium" name="Zoom Medium"/>
+ <menu_item_call label="Zoom Far" name="Zoom Far"/>
+ <menu_item_call label="Zoom Default" 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/zh/menu_navbar.xml b/indra/newview/skins/default/xui/zh/menu_navbar.xml
new file mode 100644
index 0000000000..69df4929f2
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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/zh/menu_nearby_chat.xml b/indra/newview/skins/default/xui/zh/menu_nearby_chat.xml
new file mode 100644
index 0000000000..cad462eebb
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="Show Blocked Text" name="muted_text"/>
+ <menu_item_check label="Show Buddy Icons" name="show_buddy_icons"/>
+ <menu_item_check label="Show Names" name="show_names"/>
+ <menu_item_check label="Show Icons and Names" name="show_icons_and_names"/>
+ <menu_item_call label="字型尺寸" name="font_size"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_notification_well_button.xml b/indra/newview/skins/default/xui/zh/menu_notification_well_button.xml
new file mode 100644
index 0000000000..b629f73584
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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/zh/menu_object.xml b/indra/newview/skins/default/xui/zh/menu_object.xml
new file mode 100644
index 0000000000..ed41a4f0bf
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="Zoom In" name="Zoom In"/>
+ <context_menu label="穿上" name="Put On">
+ <menu_item_call label="穿上" name="Wear"/>
+ <menu_item_call label="添加" name="Add"/>
+ <context_menu label="Attach" name="Object Attach"/>
+ <context_menu label="Attach 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/zh/menu_object_icon.xml b/indra/newview/skins/default/xui/zh/menu_object_icon.xml
new file mode 100644
index 0000000000..d27e75b830
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="Block..." name="Block"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_outfit_gear.xml b/indra/newview/skins/default/xui/zh/menu_outfit_gear.xml
new file mode 100644
index 0000000000..cf47020bd9
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="New Alpha" name="New Alpha"/>
+ <menu_item_call label="New Physics" 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/zh/menu_outfit_tab.xml b/indra/newview/skins/default/xui/zh/menu_outfit_tab.xml
new file mode 100644
index 0000000000..a4614710f4
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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/zh/menu_participant_list.xml b/indra/newview/skins/default/xui/zh/menu_participant_list.xml
new file mode 100644
index 0000000000..3737e3d041
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="Sort by Recent Speakers" 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="View People Icons" name="View Icons"/>
+ <menu_item_check label="Block Voice" name="Block/Unblock"/>
+ <menu_item_check label="Block Text" name="MuteText"/>
+ <context_menu label="Moderator Options" name="Moderator Options">
+ <menu_item_check label="Allow text chat" name="AllowTextChat"/>
+ <menu_item_call label="Mute this participant" name="ModerateVoiceMuteSelected"/>
+ <menu_item_call label="Unmute this participant" name="ModerateVoiceUnMuteSelected"/>
+ <menu_item_call label="Mute everyone" name="ModerateVoiceMute"/>
+ <menu_item_call label="Unmute everyone" name="ModerateVoiceUnmute"/>
+ </context_menu>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_people_friends_view_sort.xml b/indra/newview/skins/default/xui/zh/menu_people_friends_view_sort.xml
new file mode 100644
index 0000000000..2b0c461312
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="View People Icons" name="view_icons"/>
+ <menu_item_check label="View Permissions Granted" name="view_permissions"/>
+ <menu_item_call label="Show Blocked Residents &amp; Objects" name="show_blocked_list"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_people_groups.xml b/indra/newview/skins/default/xui/zh/menu_people_groups.xml
new file mode 100644
index 0000000000..1d78c1de0a
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="Activate" name="Activate"/>
+ <menu_item_call label="Leave" name="Leave"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_people_groups_view_sort.xml b/indra/newview/skins/default/xui/zh/menu_people_groups_view_sort.xml
new file mode 100644
index 0000000000..cf36507d74
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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/zh/menu_people_nearby.xml b/indra/newview/skins/default/xui/zh/menu_people_nearby.xml
new file mode 100644
index 0000000000..49fa775424
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="Remove Friend" 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="Block/Unblock" name="Block/Unblock"/>
+ <menu_item_call label="Offer Teleport" name="teleport"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_people_nearby_multiselect.xml b/indra/newview/skins/default/xui/zh/menu_people_nearby_multiselect.xml
new file mode 100644
index 0000000000..c7aff48df4
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="Offer Teleport" name="teleport"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_people_nearby_view_sort.xml b/indra/newview/skins/default/xui/zh/menu_people_nearby_view_sort.xml
new file mode 100644
index 0000000000..5cf54b117b
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_people_nearby_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="Sort by Recent Speakers" name="sort_by_recent_speakers"/>
+ <menu_item_check label="ä¾å稱排åº" name="sort_name"/>
+ <menu_item_check label="ä¾è·é›¢æŽ’åº" name="sort_distance"/>
+ <menu_item_check label="View People Icons" name="view_icons"/>
+ <menu_item_call label="Show Blocked Residents &amp; Objects" name="show_blocked_list"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_people_recent_view_sort.xml b/indra/newview/skins/default/xui/zh/menu_people_recent_view_sort.xml
new file mode 100644
index 0000000000..5b6e7335d6
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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/zh/menu_picks.xml b/indra/newview/skins/default/xui/zh/menu_picks.xml
new file mode 100644
index 0000000000..2e88ac2d39
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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/zh/menu_picks_plus.xml b/indra/newview/skins/default/xui/zh/menu_picks_plus.xml
new file mode 100644
index 0000000000..e962bd90d5
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="New Classified" name="create_classified"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_place.xml b/indra/newview/skins/default/xui/zh/menu_place.xml
new file mode 100644
index 0000000000..3733baf119
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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/zh/menu_place_add_button.xml b/indra/newview/skins/default/xui/zh/menu_place_add_button.xml
new file mode 100644
index 0000000000..d0b9438cfc
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="Add Folder" name="add_folder"/>
+ <menu_item_call label="添加地標" name="add_landmark"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_places_gear_folder.xml b/indra/newview/skins/default/xui/zh/menu_places_gear_folder.xml
new file mode 100644
index 0000000000..7f4144d14d
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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/zh/menu_places_gear_landmark.xml b/indra/newview/skins/default/xui/zh/menu_places_gear_landmark.xml
new file mode 100644
index 0000000000..f23d970b78
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="覆製 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/default/xui/zh/menu_profile_overflow.xml b/indra/newview/skins/default/xui/zh/menu_profile_overflow.xml
new file mode 100644
index 0000000000..ca637ae54d
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="Block" name="block"/>
+ <menu_item_call label="Unblock" 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/zh/menu_save_outfit.xml b/indra/newview/skins/default/xui/zh/menu_save_outfit.xml
new file mode 100644
index 0000000000..7884df5b01
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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/zh/menu_script_chiclet.xml b/indra/newview/skins/default/xui/zh/menu_script_chiclet.xml
new file mode 100644
index 0000000000..e9817dd2bc
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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/zh/menu_slurl.xml b/indra/newview/skins/default/xui/zh/menu_slurl.xml
new file mode 100644
index 0000000000..2cea18105a
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_slurl.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Popup">
+ <menu_item_call label="關於 URL" name="about_url"/>
+ <menu_item_call label="瞬間傳é€åˆ° URL" name="teleport_to_url"/>
+ <menu_item_call label="地圖" name="show_on_map"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_teleport_history_gear.xml b/indra/newview/skins/default/xui/zh/menu_teleport_history_gear.xml
new file mode 100644
index 0000000000..d188840588
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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/zh/menu_teleport_history_item.xml b/indra/newview/skins/default/xui/zh/menu_teleport_history_item.xml
new file mode 100644
index 0000000000..c636e108ad
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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/zh/menu_teleport_history_tab.xml b/indra/newview/skins/default/xui/zh/menu_teleport_history_tab.xml
new file mode 100644
index 0000000000..f9107a96ed
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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/zh/menu_text_editor.xml b/indra/newview/skins/default/xui/zh/menu_text_editor.xml
new file mode 100644
index 0000000000..c25f5128c3
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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/zh/menu_topinfobar.xml b/indra/newview/skins/default/xui/zh/menu_topinfobar.xml
new file mode 100644
index 0000000000..debaafaa10
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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/zh/menu_url_agent.xml b/indra/newview/skins/default/xui/zh/menu_url_agent.xml
new file mode 100644
index 0000000000..592bb6561e
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="覆製 SLurl 到剪貼簿" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_url_group.xml b/indra/newview/skins/default/xui/zh/menu_url_group.xml
new file mode 100644
index 0000000000..2cbdd602cb
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="覆製 SLurl 到剪貼簿" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_url_http.xml b/indra/newview/skins/default/xui/zh/menu_url_http.xml
new file mode 100644
index 0000000000..cf953576f3
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="Open in Internal Browser" name="url_open_internal"/>
+ <menu_item_call label="Open in External Browser" name="url_open_external"/>
+ <menu_item_call label="Copy URL to clipboard" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_url_inventory.xml b/indra/newview/skins/default/xui/zh/menu_url_inventory.xml
new file mode 100644
index 0000000000..8eaea68c6f
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="覆製 SLurl 到剪貼簿" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_url_map.xml b/indra/newview/skins/default/xui/zh/menu_url_map.xml
new file mode 100644
index 0000000000..fbda20fd2f
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="覆製 SLurl 到剪貼簿" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_url_objectim.xml b/indra/newview/skins/default/xui/zh/menu_url_objectim.xml
new file mode 100644
index 0000000000..b344b21c62
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="覆製 SLurl 到剪貼簿" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_url_parcel.xml b/indra/newview/skins/default/xui/zh/menu_url_parcel.xml
new file mode 100644
index 0000000000..330c28238f
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="覆製 SLurl 到剪貼簿" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_url_slapp.xml b/indra/newview/skins/default/xui/zh/menu_url_slapp.xml
new file mode 100644
index 0000000000..afc15ce13c
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="Run This Command" name="run_slapp"/>
+ <menu_item_call label="覆製 SLurl 到剪貼簿" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_url_slurl.xml b/indra/newview/skins/default/xui/zh/menu_url_slurl.xml
new file mode 100644
index 0000000000..2fb247f250
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="覆製 SLurl 到剪貼簿" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_url_teleport.xml b/indra/newview/skins/default/xui/zh/menu_url_teleport.xml
new file mode 100644
index 0000000000..e3e4b4716d
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="覆製 SLurl 到剪貼簿" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_viewer.xml b/indra/newview/skins/default/xui/zh/menu_viewer.xml
new file mode 100644
index 0000000000..6d70ac4c1f
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_viewer.xml
@@ -0,0 +1,430 @@
+<?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 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 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="è¦æ±‚ 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">
+ <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="Active Speakers"/>
+ </menu>
+ <menu label="世界" name="World">
+ <menu_item_check label="迷你地圖" name="Mini-Map"/>
+ <menu_item_check label="世界地圖" name="World Map"/>
+ <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_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"/>
+ <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_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="Revert to Region Default"/>
+ <menu_item_call label="環境編輯器" name="Environment Editor"/>
+ </menu>
+ </menu>
+ <menu label="建造" name="BuildTools">
+ <menu_item_check label="建造" name="Show Build Tools"/>
+ <menu label="é¸æ“‡å»ºé€ å·¥å…·" name="Select Tool">
+ <menu_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="Reset Scripts" 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="Select By Surrounding" name="Select By Surrounding"/>
+ <menu_item_check label="Show Selection Outlines" name="Show Selection Outlines"/>
+ <menu_item_check label="Show Hidden Selection" name="Show Hidden Selection"/>
+ <menu_item_check label="Show Light Radius for Selection" name="Show Light Radius for Selection"/>
+ <menu_item_check label="Show Selection Beam" 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="Use Selection for Grid" 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="大é‡ä¸Šå‚³ï¼ˆæ¯æª”案 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="[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"/>
+ </menu>
+ <menu label="進階" name="Advanced">
+ <menu_item_call label="Rebake Textures" 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="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_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="Highlight Transparent"/>
+ <menu_item_check label="顯示 HUD 附件" name="Show HUD Attachments"/>
+ <menu_item_check label="Show Mouselook Crosshairs" name="ShowCrosshairs"/>
+ </menu>
+ <menu label="Rendering Types" name="Rendering Types">
+ <menu_item_check label="Simple" name="Simple"/>
+ <menu_item_check label="Alpha" 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>
+ <menu label="Rendering Features" name="Rendering Features">
+ <menu_item_check label="UI" name="UI"/>
+ <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="Test FRInfo" name="Test FRInfo"/>
+ <menu_item_check label="Flexible Objects" name="Flexible Objects"/>
+ </menu>
+ <menu_item_check label="Use Plugin Read Thread" name="Use Plugin Read Thread"/>
+ <menu_item_call label="Clear Group Cache" name="ClearGroupCache"/>
+ <menu_item_check label="Mouse Smoothing" 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="Show Advanced Menu - legacy shortcut" 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="Snapshot to Disk" name="Snapshot to Disk"/>
+ <menu_item_call label="第一人稱視角" name="Mouselook"/>
+ <menu_item_check label="Joystick Flycam" name="Joystick Flycam"/>
+ <menu_item_call label="Reset View" name="Reset View"/>
+ <menu_item_call label="Look at Last Chatter" 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"/>
+ </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="Texture Category Console" name="Texture Category"/>
+ <menu_item_check label="Fast Timers" 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="Group Info to Debug Console" 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="Wind" name="Wind"/>
+ <menu_item_check label="FOV" name="FOV"/>
+ <menu_item_check label="Badge" name="Badge"/>
+ </menu>
+ <menu label="顯示資訊" name="Display Info">
+ <menu_item_check label="顯示時間" name="Show Time"/>
+ <menu_item_check label="Show Render Info" name="Show Render Info"/>
+ <menu_item_check label="顯示æ質資訊" name="Show Texture Info"/>
+ <menu_item_check label="Show Matrices" name="Show Matrices"/>
+ <menu_item_check label="Show Color Under Cursor" name="Show Color Under Cursor"/>
+ <menu_item_check label="顯示記憶體" name="Show Memory"/>
+ <menu_item_check label="Show Updates to Objects" name="Show Updates"/>
+ </menu>
+ <menu label="Force an Error" name="Force Errors">
+ <menu_item_call label="Force Breakpoint" name="Force Breakpoint"/>
+ <menu_item_call label="Force LLError And Crash" name="Force LLError And Crash"/>
+ <menu_item_call label="Force Bad Memory Access" name="Force Bad Memory Access"/>
+ <menu_item_call label="Force Infinite Loop" name="Force Infinite Loop"/>
+ <menu_item_call label="Force Driver Crash" name="Force Driver Carsh"/>
+ <menu_item_call label="Force Software Exception" name="Force Software Exception"/>
+ <menu_item_call label="Force Disconnect Viewer" name="Force Disconnect Viewer"/>
+ <menu_item_call label="Simulate a Memory Leak" 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="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"/>
+ </menu>
+ <menu label="Render Metadata" name="Render Metadata">
+ <menu_item_check label="Bounding Boxes" name="Bounding Boxes"/>
+ <menu_item_check label="Octree" name="Octree"/>
+ <menu_item_check label="Shadow Frusta" name="Shadow Frusta"/>
+ <menu_item_check label="Occlusion" name="Occlusion"/>
+ <menu_item_check label="Render Batches" name="Render Batches"/>
+ <menu_item_check label="Update Type" name="Update Type"/>
+ <menu_item_check label="Texture Anim" name="Texture Anim"/>
+ <menu_item_check label="Texture Priority" name="Texture Priority"/>
+ <menu_item_check label="Texture Area" name="Texture Area"/>
+ <menu_item_check label="Face Area" name="Face Area"/>
+ <menu_item_check label="Lights" name="Lights"/>
+ <menu_item_check label="Collision Skeleton" name="Collision Skeleton"/>
+ <menu_item_check label="Raycast" name="Raycast"/>
+ </menu>
+ <menu label="Rendering" name="Rendering">
+ <menu_item_check label="Axes" name="Axes"/>
+ <menu_item_check label="Tangent Basis" name="Tangent Basis"/>
+ <menu_item_call label="Selected Texture Info Basis" name="Selected Texture Info Basis"/>
+ <menu_item_check label="Wireframe" name="Wireframe"/>
+ <menu_item_check label="Object-Object Occlusion" name="Object-Object Occlusion"/>
+ <menu_item_check label="Framebuffer Objects" name="Framebuffer Objects"/>
+ <menu_item_check label="Lighting and Shadows" name="Lighting and Shadows"/>
+ <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="Automatic Alpha Masks (deferred)" name="Automatic Alpha Masks (deferred)"/>
+ <menu_item_check label="Automatic Alpha Masks (non-deferred)" 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="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"/>
+ <menu_item_check label="Render Attached Lights" name="Render Attached Lights"/>
+ <menu_item_check label="Render Attached Particles" name="Render Attached Particles"/>
+ <menu_item_check label="Hover Glow Objects" name="Hover Glow Objects"/>
+ </menu>
+ <menu label="網路" name="Network">
+ <menu_item_check label="Pause Agent" name="AgentPause"/>
+ <menu_item_call label="Enable Message Log" name="Enable Message Log"/>
+ <menu_item_call label="Disable Message Log" name="Disable Message Log"/>
+ <menu_item_check label="Velocity Interpolate Objects" name="Velocity Interpolate Objects"/>
+ <menu_item_check label="Ping Interpolate Object Positions" name="Ping Interpolate Object Positions"/>
+ <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="Dump Region Object Cache" 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="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="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_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"/>
+ <menu_item_check label="Debug Views" name="Debug Views"/>
+ <menu_item_check label="Debug Name Tooltips" name="Debug Name Tooltips"/>
+ <menu_item_check label="Debug Mouse Events" name="Debug Mouse Events"/>
+ <menu_item_check label="Debug Keys" name="Debug Keys"/>
+ <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="é€å‡ºæ¸¬è©¦ IMs" name="Send Test IMs"/>
+ <menu_item_call label="Flush Names Caches" 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>
+ <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>
+ <menu_item_call label="Force Params to Default" 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="Debug Joint Updates" name="Debug Joint Updates"/>
+ <menu_item_check label="Disable LOD" name="Disable LOD"/>
+ <menu_item_check label="Debug Character Vis" name="Debug Character Vis"/>
+ <menu_item_check label="Show Collision Skeleton" name="Show Collision Skeleton"/>
+ <menu_item_check label="Display Agent Target" name="Display Agent Target"/>
+ --&gt;
+ <menu_item_call label="Dump Attachments" name="Dump Attachments"/>
+ <menu_item_call label="Debug Avatar Textures" name="Debug Avatar Textures"/>
+ <menu_item_call label="Dump Local Textures" name="Dump Local Textures"/>
+ </menu>
+ <menu_item_check label="HTTP æ質" name="HTTP Textures"/>
+ <menu_item_call label="Compress Images" name="Compress Images"/>
+ <menu_item_check label="Output Debug Minidump" name="Output Debug Minidump"/>
+ <menu_item_check label="Console Window on next Run" name="Console Window"/>
+ <menu_item_call label="Request Admin Status" name="Request Admin Options"/>
+ <menu_item_call label="Leave Admin Status" name="Leave Admin Options"/>
+ <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_item_call label="Force Owner To Me" name="Force Owner To Me"/>
+ <menu_item_call label="Force Owner Permissive" name="Force Owner Permissive"/>
+ <menu_item_call label="刪除" name="Delete"/>
+ <menu_item_call label="Lock" name="Lock"/>
+ <menu_item_call label="Get Assets IDs" name="Get Assets IDs"/>
+ </menu>
+ <menu label="地段" name="Parcel">
+ <menu_item_call label="Force Owner To Me" name="Owner To Me"/>
+ <menu_item_call label="Set to Linden Content" name="Set to Linden Content"/>
+ <menu_item_call label="Claim Public Land" name="Claim Public Land"/>
+ </menu>
+ <menu label="地å€" name="Region">
+ <menu_item_call label="Dump Temp Asset Data" name="Dump Temp Asset Data"/>
+ <menu_item_call label="Save Region State" name="Save Region State"/>
+ </menu>
+ <menu_item_call label="God Tools" name="God Tools"/>
+ </menu>
+ <menu label="Admin" name="Deprecated">
+ <menu label="Attach Object" name="Attach Object"/>
+ <menu label="Detach Object" 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="Alpha" name="Alpha"/>
+ <menu_item_call label="Tattoo" name="Tattoo"/>
+ <menu_item_call label="Physics" name="Physics"/>
+ <menu_item_call label="全部衣æœ" name="All Clothes"/>
+ </menu>
+ <menu label="幫助" name="Help">
+ <menu_item_call label="林登官方部è½æ ¼" name="Official Linden Blog"/>
+ <menu_item_call label="Scripting Portal" name="Scripting Portal"/>
+ <menu label="臭蟲回報" name="Bug Reporting">
+ <menu_item_call label="Public Issue Tracker" name="Public Issue Tracker"/>
+ <menu_item_call label="Public Issue Tracker Help" name="Publc Issue Tracker Help"/>
+ <menu_item_call label="臭蟲回報 101" name="Bug Reporing 101"/>
+ <menu_item_call label="Security Issues" 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/zh/menu_wearable_list_item.xml b/indra/newview/skins/default/xui/zh/menu_wearable_list_item.xml
new file mode 100644
index 0000000000..c5c1f661fb
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="Wear" name="wear_wear"/>
+ <menu_item_call label="Add" name="wear_add"/>
+ <menu_item_call label="Take Off / Detach" name="take_off_or_detach"/>
+ <menu_item_call label="å¸ä¸‹" name="detach"/>
+ <context_menu label="Attach to" name="wearable_attach_to"/>
+ <context_menu label="Attach to 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/default/xui/zh/menu_wearing_gear.xml b/indra/newview/skins/default/xui/zh/menu_wearing_gear.xml
new file mode 100644
index 0000000000..d9f4acb27b
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_wearing_gear.xml
@@ -0,0 +1,5 @@
+<?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"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_wearing_tab.xml b/indra/newview/skins/default/xui/zh/menu_wearing_tab.xml
new file mode 100644
index 0000000000..c7d2853995
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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/zh/mime_types.xml b/indra/newview/skins/default/xui/zh/mime_types.xml
new file mode 100644
index 0000000000..3498942f9b
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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">
+ This location has Web content
+ </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">
+ There is an image at this location
+ </tooltip>
+ <playtip name="image_playtip">
+ View this location&apos;s image
+ </playtip>
+ </widgetset>
+ <widgetset name="audio">
+ <label name="audio_label">
+ Audio
+ </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">
+ <label name="rtsp_label">
+ å³æ™‚串æµ
+ </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">
+ Audio
+ </label>
+ </mimetype>
+ <mimetype name="video/*">
+ <label name="video2_label">
+ Video
+ </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 Audio/Video
+ </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">
+ 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">
+ é¸é …(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">
+ 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">
+ 圖åƒï¼ˆ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/zh/mime_types_linux.xml b/indra/newview/skins/default/xui/zh/mime_types_linux.xml
new file mode 100644
index 0000000000..3498942f9b
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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">
+ This location has Web content
+ </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">
+ There is an image at this location
+ </tooltip>
+ <playtip name="image_playtip">
+ View this location&apos;s image
+ </playtip>
+ </widgetset>
+ <widgetset name="audio">
+ <label name="audio_label">
+ Audio
+ </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">
+ <label name="rtsp_label">
+ å³æ™‚串æµ
+ </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">
+ Audio
+ </label>
+ </mimetype>
+ <mimetype name="video/*">
+ <label name="video2_label">
+ Video
+ </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 Audio/Video
+ </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">
+ 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">
+ é¸é …(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">
+ 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">
+ 圖åƒï¼ˆ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/zh/mime_types_mac.xml b/indra/newview/skins/default/xui/zh/mime_types_mac.xml
new file mode 100644
index 0000000000..3f38c528a6
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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">
+ There is an image at this location
+ </tooltip>
+ <playtip name="image_playtip">
+ View this location&apos;s image
+ </playtip>
+ </widgetset>
+ <widgetset name="audio">
+ <label name="audio_label">
+ Audio
+ </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">
+ <label name="rtsp_label">
+ å³æ™‚串æµ
+ </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">
+ Audio
+ </label>
+ </mimetype>
+ <mimetype name="video/*">
+ <label name="video2_label">
+ Video
+ </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 Audio/Video
+ </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">
+ 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">
+ 網é ï¼ˆ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">
+ 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">
+ 圖åƒï¼ˆ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/zh/notifications.xml b/indra/newview/skins/default/xui/zh/notifications.xml
new file mode 100644
index 0000000000..65bb8ce517
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/notifications.xml
@@ -0,0 +1,2952 @@
+<?xml version="1.0" encoding="utf-8"?>
+<notifications>
+ <global name="skipnexttime">
+ Don&apos;t show me this again
+ </global>
+ <global name="alwayschoose">
+ Always choose this option
+ </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="Unknown Notification Message" name="MissingAlert">
+ Your version of [APP_NAME] does not know how to display the notification it just received. Please verify that you have the latest Viewer installed.
+
+Error details: The notification called &apos;[_NAME]&apos; was not found in notifications.xml.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="FloaterNotFound">
+ Floater error: Could not find the following controls:
+
+[CONTROLS]
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="TutorialNotFound">
+ No tutorial is currently available.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="GenericAlert">
+ [MESSAGE]
+ </notification>
+ <notification name="GenericAlertYesCancel">
+ [MESSAGE]
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="是"/>
+ </notification>
+ <notification name="BadInstallation">
+ An error occurred while updating [APP_NAME]. Please [http://get.secondlife.com download the latest version] of the Viewer.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="LoginFailedNoNetwork">
+ Could not connect to the [SECOND_LIFE_GRID].
+ &apos;[DIAGNOSTIC]&apos;
+Make sure your Internet connection is working properly.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="MessageTemplateNotFound">
+ Message Template [PATH] not found.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="WearableSave">
+ Save changes to current clothing/body part?
+ <usetemplate canceltext="å–消" name="yesnocancelbuttons" notext="ä¸è¦å„²å­˜" yestext="儲存"/>
+ </notification>
+ <notification name="CompileQueueSaveText">
+ There was a problem uploading the text for a script due to the following reason: [REASON]. Please try again later.
+ </notification>
+ <notification name="CompileQueueSaveBytecode">
+ There was a problem uploading the compiled script due to the following reason: [REASON]. Please try again later.
+ </notification>
+ <notification name="WriteAnimationFail">
+ There was a problem writing animation data. Please try again later.
+ </notification>
+ <notification name="UploadAuctionSnapshotFail">
+ There was a problem uploading the auction snapshot due to the following reason: [REASON]
+ </notification>
+ <notification name="UnableToViewContentsMoreThanOne">
+ Unable to view the contents of more than one item at a time.
+Please select only one object and try again.
+ </notification>
+ <notification name="SaveClothingBodyChanges">
+ 儲存全部æœè£æˆ–身體部ä½çš„變更?
+ <usetemplate canceltext="å–消" name="yesnocancelbuttons" notext="ä¸è¦å„²å­˜" yestext="全部儲存"/>
+ </notification>
+ <notification name="FriendsAndGroupsOnly">
+ Non-friends won&apos;t know that you&apos;ve choosen to ignore their calls and instant messages.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="FavoritesOnLogin">
+ Note: When you turn on this option, anyone who uses this computer can see your list of favorite locations.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="GrantModifyRights">
+ Granting modify rights to another Resident allows them to change, delete or take ANY objects you may have in-world. Be VERY careful when handing out this permission.
+Do you want to grant modify rights for [NAME]?
+ <usetemplate name="okcancelbuttons" notext="No" yestext="是"/>
+ </notification>
+ <notification name="GrantModifyRightsMultiple">
+ Granting modify rights to another Resident allows them to change ANY objects you may have in-world. Be VERY careful when handing out this permission.
+Do you want to grant modify rights for the selected Residents?
+ <usetemplate name="okcancelbuttons" notext="å¦" yestext="是"/>
+ </notification>
+ <notification name="RevokeModifyRights">
+ Do you want to revoke modify rights for [NAME]?
+ <usetemplate name="okcancelbuttons" notext="å¦" yestext="是"/>
+ </notification>
+ <notification name="RevokeModifyRightsMultiple">
+ Do you want to revoke modify rights for the selected Residents?
+ <usetemplate name="okcancelbuttons" notext="å¦" yestext="是"/>
+ </notification>
+ <notification name="UnableToCreateGroup">
+ Unable to create group.
+[MESSAGE]
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="PanelGroupApply">
+ [NEEDS_APPLY_MESSAGE]
+[WANT_APPLY_MESSAGE]
+ <usetemplate canceltext="å–消" name="yesnocancelbuttons" notext="忽視變更" yestext="套用變更"/>
+ </notification>
+ <notification name="MustSpecifyGroupNoticeSubject">
+ You must specify a subject to send a group notice.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="AddGroupOwnerWarning">
+ You are about to add group members to the role of [ROLE_NAME].
+Members cannot be removed from that role.
+The members must resign from the role themselves.
+Are you sure you want to continue?
+ <usetemplate ignoretext="Confirm before I add a new group Owner" name="okcancelignore" notext="å¦" yestext="是"/>
+ </notification>
+ <notification name="AssignDangerousActionWarning">
+ You are about to add the Ability &apos;[ACTION_NAME]&apos; to the Role &apos;[ROLE_NAME]&apos;.
+
+ *WARNING*
+ Any Member in a Role with this Ability can assign themselves -- and any other member -- to Roles that have more powers than they currently have, potentially elevating themselves to near-Owner power. Be sure you know what you&apos;re doing before assigning this Ability.
+
+Add this Ability to &apos;[ROLE_NAME]&apos;?
+ <usetemplate name="okcancelbuttons" notext="å¦" yestext="是"/>
+ </notification>
+ <notification name="AssignDangerousAbilityWarning">
+ You are about to add the Ability &apos;[ACTION_NAME]&apos; to the Role &apos;[ROLE_NAME]&apos;.
+
+ *WARNING*
+ Any Member in a Role with this Ability can assign themselves -- and any other member -- all Abilities, elevating themselves to near-Owner power.
+
+Add this Ability to &apos;[ROLE_NAME]&apos;?
+ <usetemplate name="okcancelbuttons" notext="å¦" yestext="是"/>
+ </notification>
+ <notification name="AttachmentDrop">
+ You are about to drop your attachment.
+ Are you sure you want to continue?
+ <usetemplate ignoretext="Confirm before dropping attachments" name="okcancelignore" notext="å¦" yestext="是"/>
+ </notification>
+ <notification name="JoinGroupCanAfford">
+ Joining this group costs L$[COST].
+Do you wish to proceed?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="Join"/>
+ </notification>
+ <notification name="JoinGroupNoCost">
+ You are joining group [NAME].
+Do you wish to proceed?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="Join"/>
+ </notification>
+ <notification name="JoinGroupCannotAfford">
+ Joining this group costs L$[COST].
+You do not have enough L$ to join this group.
+ </notification>
+ <notification name="CreateGroupCost">
+ Creating this group will cost L$100.
+Groups need more than one member, or they are deleted forever.
+Please invite members within 48 hours.
+ <usetemplate canceltext="å–消" name="okcancelbuttons" notext="å–消" yestext="Create group for L$100"/>
+ </notification>
+ <notification name="LandBuyPass">
+ For L$[COST] you can enter this land (&apos;[PARCEL_NAME]&apos;) for [TIME] hours. Buy a pass?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="SalePriceRestriction">
+ Sale price must be set to more than L$0 if selling to anyone.
+Please select an individual to sell to if selling for L$0.
+ </notification>
+ <notification name="ConfirmLandSaleChange">
+ The selected [LAND_SIZE] m² land is being set for sale.
+Your selling price will be L$[SALE_PRICE] and will be authorized for sale to [NAME].
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="ConfirmLandSaleToAnyoneChange">
+ ATTENTION: Clicking &apos;sell to anyone&apos; makes your land available to the entire [SECOND_LIFE] community, even those not in this region.
+
+The selected [LAND_SIZE] m² land is being set for sale.
+Your selling price will be L$[SALE_PRICE] and will be authorized for sale to [NAME].
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="ReturnObjectsDeededToGroup">
+ Are you sure you want to return all objects shared with the group &apos;[NAME]&apos; on this parcel of land back to their previous owner&apos;s inventory?
+
+*WARNING* This will delete the non-transferable objects deeded to the group!
+
+Objects: [N]
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="ReturnObjectsOwnedByUser">
+ Are you sure you want to return all objects owned by the Resident &apos;[NAME]&apos; on this parcel of land back to their inventory?
+
+Objects: [N]
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="ReturnObjectsOwnedBySelf">
+ Are you sure you want to return all objects owned by you on this parcel of land back to your inventory?
+
+Objects: [N]
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="ReturnObjectsNotOwnedBySelf">
+ Are you sure you want to return all objects NOT owned by you on this parcel of land back to their owner&apos;s inventory?
+Transferable objects deeded to a group will be returned to their previous owners.
+
+*WARNING* This will delete the non-transferable objects deeded to the group!
+
+Objects: [N]
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="ReturnObjectsNotOwnedByUser">
+ Are you sure you want to return all objects NOT owned by [NAME] on this parcel of land back to their owner&apos;s inventory?
+Transferable objects deeded to a group will be returned to their previous owners.
+
+*WARNING* This will delete the non-transferable objects deeded to the group!
+
+Objects: [N]
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="ReturnAllTopObjects">
+ Are you sure you want to return all listed objects back to their owner&apos;s inventory?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="DisableAllTopObjects">
+ Are you sure you want to disable all objects in this region?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="ReturnObjectsNotOwnedByGroup">
+ Return the objects on this parcel of land that are NOT shared with the group [NAME] back to their owners?
+
+Objects: [N]
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="UnableToDisableOutsideScripts">
+ Can not disable scripts.
+This entire region is damage enabled.
+Scripts must be allowed to run for weapons to work.
+ </notification>
+ <notification name="MultipleFacesSelected">
+ Multiple faces are currently selected.
+If you continue this action, separate instances of media will be set on multiple faces of the object.
+To place the media on only one face, choose Select Face and click on the desired face of that object then click Add.
+ <usetemplate ignoretext="Media will be set on multiple selected faces" name="okcancelignore" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="MustBeInParcel">
+ You must be standing inside the land parcel to set its Landing Point.
+ </notification>
+ <notification name="PromptRecipientEmail">
+ Please enter a valid email address for the recipient(s).
+ </notification>
+ <notification name="PromptSelfEmail">
+ Please enter your email address.
+ </notification>
+ <notification name="PromptMissingSubjMsg">
+ Email snapshot with the default subject or message?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="ErrorProcessingSnapshot">
+ Error processing snapshot data
+ </notification>
+ <notification name="ErrorEncodingSnapshot">
+ Error encoding snapshot.
+ </notification>
+ <notification name="ErrorUploadingPostcard">
+ There was a problem sending a snapshot due to the following reason: [REASON]
+ </notification>
+ <notification name="ErrorUploadingReportScreenshot">
+ There was a problem uploading a report screenshot due to the following reason: [REASON]
+ </notification>
+ <notification name="MustAgreeToLogIn">
+ You must agree to the Terms of Service to continue logging into [SECOND_LIFE].
+ </notification>
+ <notification name="CouldNotPutOnOutfit">
+ Could not put on outfit.
+The outfit folder contains no clothing, body parts, or attachments.
+ </notification>
+ <notification name="CannotWearTrash">
+ You can not wear clothes or body parts that are in the trash
+ </notification>
+ <notification name="MaxAttachmentsOnOutfit">
+ Could not attach object.
+Exceeds the attachments limit of [MAX_ATTACHMENTS] objects. Please detach another object first.
+ </notification>
+ <notification name="CannotWearInfoNotComplete">
+ You can not wear that item because it has not yet loaded. Please try again in a minute.
+ </notification>
+ <notification name="MustHaveAccountToLogIn">
+ Oops! Something was left blank.
+You need to enter the Username name of your avatar.
+
+You need an account to enter [SECOND_LIFE]. Would you like to create one now?
+ <url name="url">
+ http://join.secondlife.com/
+ </url>
+ <usetemplate name="okcancelbuttons" notext="å†è©¦ä¸€æ¬¡" yestext="創造新帳戶"/>
+ </notification>
+ <notification name="InvalidCredentialFormat">
+ You need to enter either the Username or both the First and Last name of your avatar into the Username field, then login again.
+ </notification>
+ <notification name="DeleteClassified">
+ Delete classified &apos;[NAME]&apos;?
+There is no reimbursement for fees paid.
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="DeleteMedia">
+ You have selected to delete the media associated with this face.
+Are you sure you want to continue?
+ <usetemplate ignoretext="Confirm before I delete media from an object" name="okcancelignore" notext="å¦" yestext="是"/>
+ </notification>
+ <notification name="ClassifiedSave">
+ Save changes to classified [NAME]?
+ <usetemplate canceltext="å–消" name="yesnocancelbuttons" notext="ä¸è¦å„²å­˜" yestext="儲存"/>
+ </notification>
+ <notification name="ClassifiedInsufficientFunds">
+ Insufficient funds to create classified.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="DeleteAvatarPick">
+ Delete pick &lt;nolink&gt;[PICK]&lt;/nolink&gt;?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="DeleteOutfits">
+ 刪除所é¸æ“‡çš„è£æ‰®ï¼Ÿ
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="PromptGoToEventsPage">
+ å‰å¾€ [SECOND_LIFE] 事件網é ï¼Ÿ
+ <url name="url">
+ http://secondlife.com/events/
+ </url>
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="SelectProposalToView">
+ Please select a proposal to view.
+ </notification>
+ <notification name="SelectHistoryItemToView">
+ Please select a history item to view.
+ </notification>
+ <notification name="CacheWillClear">
+ Cache will be cleared after you restart [APP_NAME].
+ </notification>
+ <notification name="CacheWillBeMoved">
+ Cache will be moved after you restart [APP_NAME].
+Note: This will clear the cache.
+ </notification>
+ <notification name="ChangeConnectionPort">
+ Port settings take effect after you restart [APP_NAME].
+ </notification>
+ <notification name="ChangeSkin">
+ The new skin will appear after you restart [APP_NAME].
+ </notification>
+ <notification name="ChangeLanguage">
+ Changing language will take effect after you restart [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="確定"/>
+ </notification>
+ <notification name="SaveChanges">
+ Save Changes?
+ <usetemplate canceltext="å–消" name="yesnocancelbuttons" notext="ä¸è¦å„²å­˜" yestext="儲存"/>
+ </notification>
+ <notification name="GestureSaveFailedTooManySteps">
+ Gesture save failed.
+This gesture has too many steps.
+Try removing some steps, then save again.
+ </notification>
+ <notification name="GestureSaveFailedTryAgain">
+ Gesture save failed. Please try again in a minute.
+ </notification>
+ <notification name="GestureSaveFailedObjectNotFound">
+ Could not save gesture because the object or the associated object inventory could not be found.
+The object may be out of range or may have been deleted.
+ </notification>
+ <notification name="GestureSaveFailedReason">
+ There was a problem saving a gesture due to the following reason: [REASON]. Please try resaving the gesture later.
+ </notification>
+ <notification name="SaveNotecardFailObjectNotFound">
+ Could not save notecard because the object or the associated object inventory could not be found.
+The object may be out of range or may have been deleted.
+ </notification>
+ <notification name="SaveNotecardFailReason">
+ There was a problem saving a notecard due to the following reason: [REASON]. Please try re-saving the notecard later.
+ </notification>
+ <notification name="ScriptCannotUndo">
+ Could not undo all changes in your version of the script.
+Would you like to load the server&apos;s last saved version?
+(**Warning** This operation cannot be undone.)
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="SaveScriptFailReason">
+ There was a problem saving a script due to the following reason: [REASON]. Please try re-saving the script later.
+ </notification>
+ <notification name="SaveScriptFailObjectNotFound">
+ Could not save the script because the object it is in could not be found.
+The object may be out of range or may have been deleted.
+ </notification>
+ <notification name="SaveBytecodeFailReason">
+ There was a problem saving a compiled script due to the following reason: [REASON]. Please try re-saving the script later.
+ </notification>
+ <notification name="StartRegionEmpty">
+ Oops, Your Start Region is not defined.
+Please type the Region name in Start Location box or choose My Last Location or My Home as your Start Location.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="CouldNotStartStopScript">
+ Could not start or stop the script because the object it is on could not be found.
+The object may be out of range or may have been deleted.
+ </notification>
+ <notification name="CannotDownloadFile">
+ Unable to download file
+ </notification>
+ <notification name="CannotWriteFile">
+ Unable to write file [[FILE]]
+ </notification>
+ <notification name="UnsupportedHardware">
+ Just so you know, your computer does not meet [APP_NAME]&apos;s minimum system requirements. You may experience poor performance. Unfortunately, the [SUPPORT_SITE] can&apos;t provide technical support for unsupported system configurations.
+
+Visit [_URL] for more information?
+ <url name="url">
+ http://www.secondlife.com/corporate/sysreqs.php
+ </url>
+ <usetemplate ignoretext="我的電腦硬體並ä¸æ”¯æ´" name="okcancelignore" notext="å¦" yestext="是"/>
+ </notification>
+ <notification name="UnknownGPU">
+ Your system contains a graphics card that [APP_NAME] doesn&apos;t recognize.
+This is often the case with new hardware that hasn&apos;t been tested yet with [APP_NAME]. It will probably be ok, but you may need to adjust your graphics settings.
+(Me &gt; Preferences &gt; Graphics).
+ <form name="form">
+ <ignore name="ignore" text="我的顯示å¡ç„¡æ³•è¾¨è­˜"/>
+ </form>
+ </notification>
+ <notification name="DisplaySettingsNoShaders">
+ [APP_NAME] crashed while initializing graphics drivers.
+Graphics Quality will be set to Low to avoid some common driver errors. This will disable some graphics features.
+We recommend updating your graphics card drivers.
+Graphics Quality can be raised in Preferences &gt; Graphics.
+ </notification>
+ <notification name="RegionNoTerraforming">
+ 這個 [REGION] 地å€ä¸¦ä¸å…許變更地形。
+ </notification>
+ <notification name="CannotCopyWarning">
+ You do not have permission to copy the following items:
+[ITEMS]
+and will lose it from your inventory if you give it away. Do you really want to offer these items?
+ <usetemplate name="okcancelbuttons" notext="å¦" yestext="是"/>
+ </notification>
+ <notification name="CannotGiveItem">
+ 無法給予收ç´å€ç‰©å“。
+ </notification>
+ <notification name="TransactionCancelled">
+ 交易已å–消。
+ </notification>
+ <notification name="TooManyItems">
+ Cannot give more than 42 items in a single inventory transfer.
+ </notification>
+ <notification name="NoItems">
+ You do not have permission to transfer the selected items.
+ </notification>
+ <notification name="CannotCopyCountItems">
+ You do not have permission to copy [COUNT] of the selected items. You will lose these items from your inventory.
+Do you really want to give these items?
+ <usetemplate name="okcancelbuttons" notext="å¦" yestext="是"/>
+ </notification>
+ <notification name="CannotGiveCategory">
+ You do not have permission to transfer the selected folder.
+ </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">
+ ACQUIRE ERROR: Too many objects selected.
+ </notification>
+ <notification name="AcquireErrorObjectSpan">
+ ACQUIRE ERROR: Objects span more than one region.
+Please move all objects to be acquired onto the same region.
+ </notification>
+ <notification name="PromptGoToCurrencyPage">
+ [EXTRA]
+
+Go to [_URL] for information on purchasing L$?
+ <url name="url">
+ http://secondlife.com/app/currency/
+ </url>
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="UnableToLinkObjects">
+ Unable to link these [COUNT] objects.
+You can link a maximum of [MAX] objects.
+ </notification>
+ <notification name="CannotLinkIncompleteSet">
+ You can only link complete sets of objects, and must select more than one object.
+ </notification>
+ <notification name="CannotLinkModify">
+ Unable to link because you don&apos;t have modify permission on all the objects.
+
+Please make sure none are locked, and that you own all of them.
+ </notification>
+ <notification name="CannotLinkDifferentOwners">
+ Unable to link because not all of the objects have the same owner.
+
+Please make sure you own all of the selected objects.
+ </notification>
+ <notification name="NoFileExtension">
+ No file extension for the file: &apos;[FILE]&apos;
+
+Please make sure the file has a correct file extension.
+ </notification>
+ <notification name="InvalidFileExtension">
+ Invalid file extension [EXTENSION]
+Expected [VALIDS]
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="CannotUploadSoundFile">
+ Couldn&apos;t open uploaded sound file for reading:
+[FILE]
+ </notification>
+ <notification name="SoundFileNotRIFF">
+ File does not appear to be a RIFF WAVE file:
+[FILE]
+ </notification>
+ <notification name="SoundFileNotPCM">
+ File does not appear to be a PCM WAVE audio file:
+[FILE]
+ </notification>
+ <notification name="SoundFileInvalidChannelCount">
+ File has invalid number of channels (must be mono or stereo):
+[FILE]
+ </notification>
+ <notification name="SoundFileInvalidSampleRate">
+ File does not appear to be a supported sample rate (must be 44.1k):
+[FILE]
+ </notification>
+ <notification name="SoundFileInvalidWordSize">
+ File does not appear to be a supported word size (must be 8 or 16 bit):
+[FILE]
+ </notification>
+ <notification name="SoundFileInvalidHeader">
+ Could not find &apos;data&apos; chunk in WAV header:
+[FILE]
+ </notification>
+ <notification name="SoundFileInvalidChunkSize">
+ Wrong chunk size in WAV file:
+[FILE]
+ </notification>
+ <notification name="SoundFileInvalidTooLong">
+ Audio file is too long (10 second maximum):
+[FILE]
+ </notification>
+ <notification name="ProblemWithFile">
+ Problem with file [FILE]:
+
+[ERROR]
+ </notification>
+ <notification name="CannotOpenTemporarySoundFile">
+ Couldn&apos;t open temporary compressed sound file for writing: [FILE]
+ </notification>
+ <notification name="UnknownVorbisEncodeFailure">
+ Unknown Vorbis encode failure on: [FILE]
+ </notification>
+ <notification name="CannotEncodeFile">
+ Unable to encode file: [FILE]
+ </notification>
+ <notification name="CorruptedProtectedDataStore">
+ We can&apos;t fill in your username and password. This may happen when you change network setup
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="CorruptResourceFile">
+ Corrupt resource file: [FILE]
+ </notification>
+ <notification name="UnknownResourceFileVersion">
+ Unknown Linden resource file version in file: [FILE]
+ </notification>
+ <notification name="UnableToCreateOutputFile">
+ Unable to create output file: [FILE]
+ </notification>
+ <notification name="DoNotSupportBulkAnimationUpload">
+ [APP_NAME] does not currently support bulk upload of animation files.
+ </notification>
+ <notification name="CannotUploadReason">
+ Unable to upload [FILE] due to the following reason: [REASON]
+Please try again later.
+ </notification>
+ <notification name="LandmarkCreated">
+ 你已經添加 &quot;[LANDMARK_NAME]&quot; 到你的 [FOLDER_NAME] 資料夾。
+ </notification>
+ <notification name="LandmarkAlreadyExists">
+ 你已經有這個ä½ç½®çš„地標。
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="CannotCreateLandmarkNotOwner">
+ ä½ ä¸èƒ½å‰µé€ åœ°æ¨™ï¼Œå› ç‚ºåœ°ä¸»ä¸¦ä¸å…許你這樣åšã€‚
+ </notification>
+ <notification name="CannotRecompileSelectObjectsNoScripts">
+ Not able to perform &apos;recompilation&apos;.
+Select an object with a script.
+ </notification>
+ <notification name="CannotRecompileSelectObjectsNoPermission">
+ Not able to perform &apos;recompilation&apos;.
+
+Select objects with scripts that you have permission to modify.
+ </notification>
+ <notification name="CannotResetSelectObjectsNoScripts">
+ Not able to perform &apos;reset&apos;.
+
+Select objects with scripts.
+ </notification>
+ <notification name="CannotResetSelectObjectsNoPermission">
+ Not able to perform &apos;reset&apos;.
+
+Select objects with scripts that you have permission to modify.
+ </notification>
+ <notification name="CannotOpenScriptObjectNoMod">
+ Unable to open script in object without modify permissions.
+ </notification>
+ <notification name="CannotSetRunningSelectObjectsNoScripts">
+ Not able to set any scripts to &apos;running&apos;.
+
+Select objects with scripts.
+ </notification>
+ <notification name="CannotSetRunningNotSelectObjectsNoScripts">
+ Unable to set any scripts to &apos;not running&apos;.
+
+Select objects with scripts.
+ </notification>
+ <notification name="NoFrontmostFloater">
+ No frontmost floater to save.
+ </notification>
+ <notification name="SeachFilteredOnShortWords">
+ Your search query was modified and the words that were too short were removed.
+
+Searched for: [FINALQUERY]
+ </notification>
+ <notification name="SeachFilteredOnShortWordsEmpty">
+ Your search terms were too short so no search was performed.
+ </notification>
+ <notification name="CouldNotTeleportReason">
+ 瞬間傳é€å¤±æ•—。
+[REASON]
+ </notification>
+ <notification name="invalid_tport">
+ Problem encountered processing your teleport request. You may need to log back in before you can teleport.
+If you continue to get this message, please check the [SUPPORT_SITE].
+ </notification>
+ <notification name="invalid_region_handoff">
+ Problem encountered processing your region crossing. You may need to log back in before you can cross regions.
+If you continue to get this message, please check the [SUPPORT_SITE].
+ </notification>
+ <notification name="blocked_tport">
+ Sorry, teleport is currently blocked. Try again in a moment. If you still cannot teleport, please log out and log back in to resolve the problem.
+ </notification>
+ <notification name="nolandmark_tport">
+ Sorry, but system was unable to locate landmark destination.
+ </notification>
+ <notification name="timeout_tport">
+ Sorry, but system was unable to complete the teleport connection. Try again in a moment.
+ </notification>
+ <notification name="noaccess_tport">
+ Sorry, you do not have access to that teleport destination.
+ </notification>
+ <notification name="missing_attach_tport">
+ Your attachments have not arrived yet. Try waiting for a few more seconds or log out and back in again before attempting to teleport.
+ </notification>
+ <notification name="too_many_uploads_tport">
+ The asset queue in this region is currently clogged so your teleport request will not be able to succeed in a timely manner. Please try again in a few minutes or go to a less busy area.
+ </notification>
+ <notification name="expired_tport">
+ Sorry, but the system was unable to complete your teleport request in a timely fashion. Please try again in a few minutes.
+ </notification>
+ <notification name="expired_region_handoff">
+ Sorry, but the system was unable to complete your region crossing in a timely fashion. Please try again in a few minutes.
+ </notification>
+ <notification name="no_host">
+ Unable to find teleport destination. The destination may be temporarily unavailable or no longer exists. Please try again in a few minutes.
+ </notification>
+ <notification name="no_inventory_host">
+ 收ç´å€åŠŸèƒ½ç›®å‰ç„¡æ³•ä½¿ç”¨ã€‚
+ </notification>
+ <notification name="CannotSetLandOwnerNothingSelected">
+ Unable to set land owner:
+No parcel selected.
+ </notification>
+ <notification name="CannotSetLandOwnerMultipleRegions">
+ Unable to force land ownership because selection spans multiple regions. Please select a smaller area and try again.
+ </notification>
+ <notification name="ForceOwnerAuctionWarning">
+ This parcel is up for auction. Forcing ownership will cancel the auction and potentially make some Residents unhappy if bidding has begun.
+Force ownership?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="CannotContentifyNothingSelected">
+ Unable to contentify:
+No parcel selected.
+ </notification>
+ <notification name="CannotContentifyNoRegion">
+ Unable to contentify:
+No region selected.
+ </notification>
+ <notification name="CannotReleaseLandNothingSelected">
+ Unable to abandon land:
+No parcel selected.
+ </notification>
+ <notification name="CannotReleaseLandNoRegion">
+ Unable to abandon land:
+Cannot find region.
+ </notification>
+ <notification name="CannotBuyLandNothingSelected">
+ Unable to buy land:
+No parcel selected.
+ </notification>
+ <notification name="CannotBuyLandNoRegion">
+ Unable to buy land:
+Cannot find the region this land is in.
+ </notification>
+ <notification name="CannotCloseFloaterBuyLand">
+ You cannot close the Buy Land window until [APP_NAME] estimates the price of this transaction.
+ </notification>
+ <notification name="CannotDeedLandNothingSelected">
+ Unable to deed land:
+No parcel selected.
+ </notification>
+ <notification name="CannotDeedLandNoGroup">
+ Unable to deed land:
+No Group selected.
+ </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.
+ </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.
+ </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$.
+
+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">
+ 覆製這個物å“到你的收ç´å€ï¼Ÿ
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="覆製"/>
+ </notification>
+ <notification name="ResolutionSwitchFail">
+ Failed to switch resolution to [RESX] by [RESY]
+ </notification>
+ <notification name="ErrorUndefinedGrasses">
+ Error: Undefined grasses: [SPECIES]
+ </notification>
+ <notification name="ErrorUndefinedTrees">
+ Error: Undefined trees: [SPECIES]
+ </notification>
+ <notification name="CannotSaveWearableOutOfSpace">
+ Unable to save &apos;[NAME]&apos; to wearable file. You will need to free up some space on your computer and save the wearable again.
+ </notification>
+ <notification name="CannotSaveToAssetStore">
+ Unable to save [NAME] to central asset store.
+This is usually a temporary failure. Please customize and save the wearable again in a few minutes.
+ </notification>
+ <notification name="YouHaveBeenLoggedOut">
+ Darn. You have been logged out of [SECOND_LIFE]
+ [MESSAGE]
+ <usetemplate name="okcancelbuttons" notext="çµæŸé€€å‡º" yestext="View IM &amp; Chat"/>
+ </notification>
+ <notification name="OnlyOfficerCanBuyLand">
+ Unable to buy land for the group:
+You do not have permission to buy land for your active group.
+ </notification>
+ <notification label="加為朋å‹" name="AddFriendWithMessage">
+ Friends can give permissions to track each other on the map and receive online status updates.
+
+Offer friendship to [NAME]?
+ <form name="form">
+ <input name="message">
+ 你願æ„æˆç‚ºæˆ‘的朋å‹å—Žï¼Ÿ
+ </input>
+ <button name="Offer" text="確定"/>
+ <button name="Cancel" text="å–消"/>
+ </form>
+ </notification>
+ <notification label="儲存è£æ‰®" name="SaveOutfitAs">
+ 儲存我正在穿的為新è£æ‰®ï¼š
+ <form name="form">
+ <input name="message">
+ [DESC] (新)
+ </input>
+ <button name="OK" text="確定"/>
+ <button name="Cancel" text="å–消"/>
+ </form>
+ </notification>
+ <notification label="Save Wearable" name="SaveWearableAs">
+ 儲存物å“到我的收ç´å€ç‚ºï¼š
+ <form name="form">
+ <input name="message">
+ [DESC] (新)
+ </input>
+ <button name="OK" text="確定"/>
+ <button name="Cancel" text="å–消"/>
+ </form>
+ </notification>
+ <notification label="è£æ‰®æ›´å" name="RenameOutfit">
+ æ–°è£æ‰®å稱:
+ <form name="form">
+ <input name="new_name">
+ [NAME]
+ </input>
+ <button name="OK" text="確定"/>
+ <button name="Cancel" text="å–消"/>
+ </form>
+ </notification>
+ <notification name="RemoveFromFriends">
+ Do you want to remove [NAME] from your Friends List?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="RemoveMultipleFromFriends">
+ 你確定è¦ç”±æœ‹å‹æ¸…單中移除多個朋å‹å—Žï¼Ÿ
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="GodDeleteAllScriptedPublicObjectsByUser">
+ Are you sure you want to delete all scripted objects owned by
+** [AVATAR_NAME] **
+on all others land in this sim?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="GodDeleteAllScriptedObjectsByUser">
+ Are you sure you want to DELETE ALL scripted objects owned by
+** [AVATAR_NAME] **
+on ALL LAND in this sim?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="GodDeleteAllObjectsByUser">
+ Are you sure you want to DELETE ALL objects (scripted or not) owned by
+** [AVATAR_NAME] **
+on ALL LAND in this sim?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="BlankClassifiedName">
+ You must specify a name for your classified.
+ </notification>
+ <notification name="MinClassifiedPrice">
+ Price to pay for listing must be at least L$[MIN_PRICE].
+
+Please enter a higher price.
+ </notification>
+ <notification name="ConfirmItemDeleteHasLinks">
+ At least one of the items you has link items that point to it. If you delete this item, its links will permanently stop working. It is strongly advised to delete the links first.
+
+Are you sure you want to delete these items?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteLock">
+ At least one of the items you have selected is locked.
+
+Are you sure you want to delete these items?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteNoCopy">
+ At least one of the items you have selected is not copyable.
+
+Are you sure you want to delete these items?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteNoOwn">
+ You do not own least one of the items you have selected.
+
+Are you sure you want to delete these items?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteLockNoCopy">
+ At least one object is locked.
+At least one object is not copyable.
+
+Are you sure you want to delete these items?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteLockNoOwn">
+ At least one object is locked.
+You do not own least one object.
+
+Are you sure you want to delete these items?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteNoCopyNoOwn">
+ At least one object is not copyable.
+You do not own least one object.
+
+Are you sure you want to delete these items?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteLockNoCopyNoOwn">
+ At least one object is locked.
+At least one object is not copyable.
+You do not own least one object.
+
+Are you sure you want to delete these items?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="ConfirmObjectTakeLock">
+ At least one object is locked.
+
+Are you sure you want to take these items?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="ConfirmObjectTakeNoOwn">
+ You do not own all of the objects you are taking.
+If you continue, next owner permissions will be applied and possibly restrict your ability to modify or copy them.
+
+Are you sure you want to take these items?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="ConfirmObjectTakeLockNoOwn">
+ At least one object is locked.
+You do not own all of the objects you are taking.
+If you continue, next owner permissions will be applied and possibly restrict your ability to modify or copy them.
+However, you can take the current selection.
+
+Are you sure you want to take these items?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="CantBuyLandAcrossMultipleRegions">
+ Unable to buy land because selection spans multiple regions.
+
+Please select a smaller area and try again.
+ </notification>
+ <notification name="DeedLandToGroup">
+ By deeding this parcel, the group will be required to have and maintain sufficient land use credits.
+The purchase price of the land is not refunded to the owner. If a deeded parcel is sold, the sale price will be divided evenly among group members.
+
+Deed this [AREA] m² of land to the group &apos;[GROUP_NAME]&apos;?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="DeedLandToGroupWithContribution">
+ By deeding this parcel, the group will be required to have and maintain sufficient land use credits.
+The deed will include a simultaneous land contribution to the group from &apos;[NAME]&apos;.
+The purchase price of the land is not refunded to the owner. If a deeded parcel is sold, the sale price will be divided evenly among group members.
+
+Deed this [AREA] m² of land to the group &apos;[GROUP_NAME]&apos;?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="DisplaySetToSafe">
+ Display settings have been set to safe levels because you have specified the -safe option.
+ </notification>
+ <notification name="DisplaySetToRecommended">
+ Display settings have been set to recommended levels based on your system configuration.
+ </notification>
+ <notification name="ErrorMessage">
+ [ERROR_MESSAGE]
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="AvatarMovedDesired">
+ Your desired location is not currently available.
+You have been moved into a nearby region.
+ </notification>
+ <notification name="AvatarMovedLast">
+ Your last location is not currently available.
+You have been moved into a nearby region.
+ </notification>
+ <notification name="AvatarMovedHome">
+ Your home location is not currently available.
+You have been moved into a nearby region.
+You may want to set a new home location.
+ </notification>
+ <notification name="ClothingLoading">
+ ä½ çš„æœè£ä»åœ¨ä¸‹è¼‰ä¸­ã€‚
+ä½ å¯ä»¥æ­£å¸¸ä½¿ç”¨ [SECOND_LIFE],而且其他人看到你也是正常的。
+ <form name="form">
+ <ignore name="ignore" text="æœè£èŠ±å¤ªå¤šæ™‚間下載"/>
+ </form>
+ </notification>
+ <notification name="FirstRun">
+ [APP_NAME] 安è£å®Œæˆã€‚
+
+If this is your first time using [SECOND_LIFE], you will need to create an account before you can log in.
+Return to [http://join.secondlife.com secondlife.com] to create a new account?
+ <usetemplate name="okcancelbuttons" notext="繼續" yestext="新帳戶..."/>
+ </notification>
+ <notification name="LoginPacketNeverReceived">
+ We&apos;re having trouble connecting. There may be a problem with your Internet connection or the [SECOND_LIFE_GRID].
+
+You can either check your Internet connection and try again in a few minutes, click Help to view the [SUPPORT_SITE], or click Teleport to attempt to teleport home.
+ <url name="url">
+ http://secondlife.com/support/
+ </url>
+ <form name="form">
+ <button name="OK" text="確定"/>
+ <button name="Help" text="幫助"/>
+ <button name="Teleport" text="瞬間傳é€"/>
+ </form>
+ </notification>
+ <notification name="WelcomeChooseSex">
+ Your character will appear in a moment.
+
+Use arrow keys to walk.
+Press the F1 key at any time for help or to learn more about [SECOND_LIFE].
+Please choose the male or female avatar. You can change your mind later.
+ <usetemplate name="okcancelbuttons" notext="女性" yestext="男性"/>
+ </notification>
+ <notification name="CantTeleportToGrid">
+ Could not teleport to [SLURL] as it&apos;s on a different grid ([GRID]) than the current grid ([CURRENT_GRID]). Please close your viewer and try again.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="GeneralCertificateError">
+ 無法連接到伺æœå™¨ã€‚
+[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="確定"/>
+ </notification>
+ <notification name="TrustCertificateError">
+ The certification authority for this server is not known.
+
+Certificate Information:
+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]
+
+Would you like to trust this authority?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="Trust"/>
+ </notification>
+ <notification name="NotEnoughCurrency">
+ [NAME] L$ [PRICE] You don&apos;t have enough L$ to do that.
+ </notification>
+ <notification name="GrantedModifyRights">
+ [NAME] has given you permission to edit their objects.
+ </notification>
+ <notification name="RevokedModifyRights">
+ Your privilege to modify [NAME]&apos;s objects has been revoked
+ </notification>
+ <notification name="FlushMapVisibilityCaches">
+ This will flush the map caches on this region.
+This is really only useful for debugging.
+(In production, wait 5 minutes, then everyone&apos;s map will update after they relog.)
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="BuyOneObjectOnly">
+ Unable to buy more than one object at a time. Please select only one object and try again.
+ </notification>
+ <notification name="OnlyCopyContentsOfSingleItem">
+ Unable to copy the contents of more than one item at a time.
+Please select only one object and try again.
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="KickUsersFromRegion">
+ 確定è¦å¼·åˆ¶çž¬é–“傳é€é€™åœ°å€æ‰€æœ‰å±…民回家?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="EstateObjectReturn">
+ Are you sure you want to return objects owned by [USER_NAME]?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="InvalidTerrainBitDepth">
+ Couldn&apos;t set region textures:
+Terrain texture [TEXTURE_NUM] has an invalid bit depth of [TEXTURE_BIT_DEPTH].
+
+Replace texture [TEXTURE_NUM] with a 24-bit 512x512 or smaller image then click &quot;Apply&quot; again.
+ </notification>
+ <notification name="InvalidTerrainSize">
+ Couldn&apos;t set region textures:
+Terrain texture [TEXTURE_NUM] is too large at [TEXTURE_SIZE_X]x[TEXTURE_SIZE_Y].
+
+Replace texture [TEXTURE_NUM] with a 24-bit 512x512 or smaller image then click &quot;Apply&quot; again.
+ </notification>
+ <notification name="RawUploadStarted">
+ 上傳開始。將會花費約兩分é˜ï¼Œé€™å–決於你的連線速度。
+ </notification>
+ <notification name="ConfirmBakeTerrain">
+ Do you really want to bake the current terrain, make it the center for terrain raise/lower limits and the default for the &apos;Revert&apos; tool?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="MaxAllowedAgentOnRegion">
+ You can only have [MAX_AGENTS] Allowed Residents.
+ </notification>
+ <notification name="MaxBannedAgentsOnRegion">
+ ä½ åªå¯ä»¥æœ‰æœ€å¤š [MAX_BANNED] ä½è¢«å°éŽ–的居民。
+ </notification>
+ <notification name="MaxAgentOnRegionBatch">
+ Failure while attempting to add [NUM_ADDED] agents:
+Exceeds the [MAX_AGENTS] [LIST_TYPE] limit by [NUM_EXCESS].
+ </notification>
+ <notification name="MaxAllowedGroupsOnRegion">
+ You can only have [MAX_GROUPS] Allowed Groups.
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="Bake"/>
+ </notification>
+ <notification name="MaxManagersOnRegion">
+ ä½ åªå¯ä»¥æœ‰æœ€å¤š [MAX_MANAGER] ä½é ˜åœ°ç¶“ç†ã€‚
+ </notification>
+ <notification name="OwnerCanNotBeDenied">
+ 無法添加領地æ“有者到領地的 &apos;被å°éŽ–çš„å±…æ°‘&apos; å單中。
+ </notification>
+ <notification name="CanNotChangeAppearanceUntilLoaded">
+ 無法變更外觀,直到æœè£èˆ‡é«”形下載完畢。
+ </notification>
+ <notification name="ClassifiedMustBeAlphanumeric">
+ The name of your classified must start with a letter from A to Z or a number. No punctuation is allowed.
+ </notification>
+ <notification name="CantSetBuyObject">
+ Can&apos;t set Buy Object, because the object is not for sale.
+Please set the object for sale and try again.
+ </notification>
+ <notification name="FinishedRawDownload">
+ Finished download of raw terrain file to:
+[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">
+ An updated version of [APP_NAME] is available.
+[MESSAGE]
+This update is not required, but we suggest you install it to improve performance and stability.
+ <usetemplate name="okcancelbuttons" notext="繼續" yestext="下載"/>
+ </notification>
+ <notification name="DownloadLinuxMandatory">
+ A new version of [APP_NAME] is available.
+[MESSAGE]
+You must download this update to use [APP_NAME].
+ <usetemplate name="okcancelbuttons" notext="çµæŸé€€å‡º" yestext="下載"/>
+ </notification>
+ <notification name="DownloadLinux">
+ An updated version of [APP_NAME] is available.
+[MESSAGE]
+This update is not required, but we suggest you install it to improve performance and stability.
+ <usetemplate name="okcancelbuttons" notext="繼續" yestext="下載"/>
+ </notification>
+ <notification name="DownloadLinuxReleaseForDownload">
+ An updated version of [APP_NAME] is available.
+[MESSAGE]
+This update is not required, but we suggest you install it to improve performance and stability.
+ <usetemplate name="okcancelbuttons" notext="繼續" yestext="下載"/>
+ </notification>
+ <notification name="DownloadMacMandatory">
+ A new version of [APP_NAME] is available.
+[MESSAGE]
+You must download this update to use [APP_NAME].
+
+Download to your Applications folder?
+ <usetemplate name="okcancelbuttons" notext="çµæŸé€€å‡º" yestext="下載"/>
+ </notification>
+ <notification name="DownloadMac">
+ An updated version of [APP_NAME] is available.
+[MESSAGE]
+This update is not required, but we suggest you install it to improve performance and stability.
+
+Download to your Applications folder?
+ <usetemplate name="okcancelbuttons" notext="繼續" yestext="下載"/>
+ </notification>
+ <notification name="DownloadMacReleaseForDownload">
+ An updated version of [APP_NAME] is available.
+[MESSAGE]
+This update is not required, but we suggest you install it to improve performance and stability.
+
+Download to your Applications folder?
+ <usetemplate name="okcancelbuttons" notext="繼續" yestext="下載"/>
+ </notification>
+ <notification name="FailedUpdateInstall">
+ An error occurred installing the viewer update.
+Please download and install the latest viewer from
+http://secondlife.com/download.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="FailedRequiredUpdateInstall">
+ We were unable to install a required update.
+You will be unable to log in until [APP_NAME] has been updated.
+
+Please download and install the latest viewer from
+http://secondlife.com/download.
+ <usetemplate name="okbutton" yestext="çµæŸé€€å‡º"/>
+ </notification>
+ <notification name="UpdaterServiceNotRunning">
+ There is a required update for your Second Life Installation.
+
+You may download this update from http://www.secondlife.com/downloads
+or you can install it now.
+ <usetemplate name="okcancelbuttons" notext="çµæŸé€€å‡ºç¬¬äºŒäººç”Ÿ" yestext="ç«‹å³ä¸‹è¼‰åŠå®‰è£"/>
+ </notification>
+ <notification name="DownloadBackgroundTip">
+ We have downloaded an update to your [APP_NAME] installation.
+Version [VERSION] [[RELEASE_NOTES_FULL_URL] Information about this update]
+ <usetemplate name="okcancelbuttons" notext="ç¨å€™..." yestext="ç«‹å³å®‰è£åŠé‡æ–°å•Ÿå‹• [APP_NAME]"/>
+ </notification>
+ <notification name="DownloadBackgroundDialog">
+ We have downloaded an update to your [APP_NAME] installation.
+Version [VERSION] [[RELEASE_NOTES_FULL_URL] Information about this update]
+ <usetemplate name="okcancelbuttons" notext="梢候..." yestext="ç«‹å³å®‰è£åŠé‡æ–°å•Ÿå‹• [APP_NAME]"/>
+ </notification>
+ <notification name="RequiredUpdateDownloadedVerboseDialog">
+ We have downloaded a required software update.
+Version [VERSION]
+
+We must restart [APP_NAME] to install the update.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="RequiredUpdateDownloadedDialog">
+ 我門必須é‡æ–°å•Ÿå‹• [APP_NAME] 以安è£æ›´æ–°ã€‚
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="DeedObjectToGroup">
+ Deeding this object will cause the group to:
+* Receive L$ paid into the object
+ <usetemplate ignoretext="Confirm before I deed an object to a group" name="okcancelignore" notext="å–消" yestext="Deed"/>
+ </notification>
+ <notification name="WebLaunchExternalTarget">
+ Do you want to open your Web browser to view this content?
+ <usetemplate ignoretext="Launch my browser to view a web page" name="okcancelignore" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="WebLaunchJoinNow">
+ å‰å¾€ä½ çš„[http://secondlife.com/account/ 塗鴉牆]以進行管ç†ä½ çš„帳戶?
+ <usetemplate ignoretext="啟動我的ç€è¦½å™¨ä»¥ç®¡ç†æˆ‘的帳戶" name="okcancelignore" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="WebLaunchSecurityIssues">
+ Visit the [SECOND_LIFE] Wiki for details of how to report a security issue.
+ <usetemplate ignoretext="Launch my browser to learn how to report a Security Issue" name="okcancelignore" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="WebLaunchQAWiki">
+ Visit the [SECOND_LIFE] QA Wiki.
+ <usetemplate ignoretext="Launch my browser to view the QA Wiki" name="okcancelignore" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="WebLaunchPublicIssue">
+ Visit the [SECOND_LIFE] Public Issue Tracker, where you can report bugs and other issues.
+ <usetemplate ignoretext="Launch my browser to use the Public Issue Tracker" name="okcancelignore" notext="å–消" yestext="å‰å¾€é é¢"/>
+ </notification>
+ <notification name="WebLaunchSupportWiki">
+ å‰å¾€æž—登官方部è½æ ¼ï¼Œä»¥å–得最新的新èžèˆ‡è³‡è¨Šã€‚
+ <usetemplate ignoretext="Launch my browser to view the blog" name="okcancelignore" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="WebLaunchLSLGuide">
+ Do you want to open the Scripting Guide for help with scripting?
+ <usetemplate ignoretext="Launch my browser to view the Scripting Guide" name="okcancelignore" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="WebLaunchLSLWiki">
+ Do you want to visit the LSL Portal for help with scripting?
+ <usetemplate ignoretext="Launch my browser to view the LSL Portal" name="okcancelignore" notext="å–消" yestext="å‰å¾€é é¢"/>
+ </notification>
+ <notification name="ReturnToOwner">
+ Are you sure you want to return the selected objects to their owners? Transferable deeded objects will be returned to their previous owners.
+
+*WARNING* No-transfer deeded objects will be deleted!
+ <usetemplate ignoretext="Confirm before I return objects to their owners" name="okcancelignore" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="GroupLeaveConfirmMember">
+ You are currently a member of the group [GROUP].
+Leave Group?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="ConfirmKick">
+ 你確定è¦è¸¢å‡ºé€™ç¶²æ ¼å…§çš„全部居民?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="踢出全部居民"/>
+ </notification>
+ <notification name="MuteLinden">
+ Sorry, you cannot block a Linden.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="CannotStartAuctionAlreadyForSale">
+ You cannot start an auction on a parcel which is already set for sale. Disable the land sale if you are sure you want to start an auction.
+ </notification>
+ <notification label="Block object by name failed" name="MuteByNameFailed">
+ You already have blocked this name.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="RemoveItemWarn">
+ Though permitted, deleting contents may damage the object. Do you want to delete that item?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="CantOfferCallingCard">
+ Cannot offer a calling card at this time. Please try again in a moment.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="CantOfferFriendship">
+ Cannot offer friendship at this time. Please try again in a moment.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="BusyModeSet">
+ Busy mode is set.
+Chat and instant messages will be hidden. Instant messages will get your Busy mode response. All teleportation offers will be declined. All inventory offers will go to your Trash.
+ <usetemplate ignoretext="I change my status to Busy mode" name="okignore" yestext="確定"/>
+ </notification>
+ <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="Join"/>
+ </notification>
+ <notification name="JoinedTooManyGroups">
+ You have reached your maximum number of groups. Please leave some group before joining or creating a new one.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="KickUser">
+ 踢出這個居民並留給他什麼訊æ¯ï¼Ÿ
+ <form name="form">
+ <input name="message">
+ An administrator has logged you off.
+ </input>
+ <button name="OK" text="確定"/>
+ <button name="Cancel" text="å–消"/>
+ </form>
+ </notification>
+ <notification name="KickAllUsers">
+ Kick everyone currently on the grid with what message?
+ <form name="form">
+ <input name="message">
+ An administrator has logged you off.
+ </input>
+ <button name="OK" text="確定"/>
+ <button name="Cancel" text="å–消"/>
+ </form>
+ </notification>
+ <notification name="FreezeUser">
+ å‡çµé€™ä½å±…民時åŒæ™‚留下什麼訊æ¯ï¼Ÿ
+ <form name="form">
+ <input name="message">
+ 你已經被å‡çµäº†ã€‚ä½ å°‡ä¸èƒ½ç§»å‹•æˆ–èŠå¤©ã€‚管ç†å“¡å°‡æœƒä»¥å³æ™‚訊æ¯è¯ç¹«ä½ ï¼ˆIM)。
+ </input>
+ <button name="OK" text="確定"/>
+ <button name="Cancel" text="å–消"/>
+ </form>
+ </notification>
+ <notification name="UnFreezeUser">
+ 將這ä½å±…民解å‡ä¸¦åŒæ™‚留下什麼訊æ¯ï¼Ÿ
+ <form name="form">
+ <input name="message">
+ You are no longer frozen.
+ </input>
+ <button name="OK" text="確定"/>
+ <button name="Cancel" text="å–消"/>
+ </form>
+ </notification>
+ <notification name="SetDisplayNameSuccess">
+ Hi [DISPLAY_NAME]!
+
+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.
+
+Please try a shorter name.
+ </notification>
+ <notification name="SetDisplayNameFailedGeneric">
+ Sorry, we could not set your display name. Please try again later.
+ </notification>
+ <notification name="SetDisplayNameMismatch">
+ The display names you entered do not match. Please re-enter.
+ </notification>
+ <notification name="AgentDisplayNameUpdateThresholdExceeded">
+ Sorry, you have to wait longer before you can change your display name.
+
+See http://wiki.secondlife.com/wiki/Setting_your_display_name
+
+Please try again later.
+ </notification>
+ <notification name="AgentDisplayNameSetBlocked">
+ Sorry, we could not set your requested name because it contains a banned word.
+
+ Please try a different name.
+ </notification>
+ <notification name="AgentDisplayNameSetInvalidUnicode">
+ The display name you wish to set contains invalid characters.
+ </notification>
+ <notification name="AgentDisplayNameSetOnlyPunctuation">
+ Your display name must contain letters other than punctuation.
+ </notification>
+ <notification name="DisplayNameUpdate">
+ [OLD_NAME] ([SLID]) is now known as [NEW_NAME].
+ </notification>
+ <notification name="OfferTeleport">
+ Offer a teleport to your location with the following message?
+ <form name="form">
+ <input name="message">
+ 加入我到 [REGION]
+ </input>
+ <button name="OK" text="確定"/>
+ <button name="Cancel" text="å–消"/>
+ </form>
+ </notification>
+ <notification name="OfferTeleportFromGod">
+ God summon Resident to your location?
+ <form name="form">
+ <input name="message">
+ Join me in [REGION]
+ </input>
+ <button name="OK" text="確定"/>
+ <button name="Cancel" text="å–消"/>
+ </form>
+ </notification>
+ <notification name="TeleportFromLandmark">
+ Are you sure you want to teleport to &lt;nolink&gt;[LOCATION]&lt;/nolink&gt;?
+ <usetemplate ignoretext="Confirm that I want to teleport to a landmark" 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">
+ Type a short announcement which will be sent to everyone currently in your estate.
+ <form name="form">
+ <button name="OK" text="確定"/>
+ <button name="Cancel" text="å–消"/>
+ </form>
+ </notification>
+ <notification label="Change Linden Estate" name="ChangeLindenEstate">
+ You are about to change a Linden owned estate (mainland, teen grid, orientation, etc.).
+
+This is EXTREMELY DANGEROUS because it can fundamentally affect the Resident experience. On the mainland, it will change thousands of regions and make the spaceserver hiccup.
+
+Proceed?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification label="Change Linden Estate Access" name="ChangeLindenAccess">
+ You are about to change the access list for a Linden owned estate (mainland, teen grid, orientation, etc.).
+
+This is DANGEROUS and should only be done to invoke the hack allowing objects/L$ to be transfered in/out of a grid.
+It will change thousands of regions and make the spaceserver hiccup.
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification label="é¸æ“‡é ˜åœ°" name="EstateAllowedAgentAdd">
+ Add to allowed list for this estate only or for [ALL_ESTATES]?
+ <usetemplate canceltext="å–消" name="yesnocancelbuttons" notext="全部領地" yestext="這個領地"/>
+ </notification>
+ <notification label="é¸æ“‡é ˜åœ°" name="EstateAllowedAgentRemove">
+ Remove from allowed list for this estate only or for [ALL_ESTATES]?
+ <usetemplate canceltext="å–消" name="yesnocancelbuttons" notext="全部領地" yestext="這個領地"/>
+ </notification>
+ <notification label="é¸æ“‡é ˜åœ°" name="EstateAllowedGroupAdd">
+ Add to group allowed list for this estate only or for [ALL_ESTATES]?
+ <usetemplate canceltext="å–消" name="yesnocancelbuttons" notext="全部領地" yestext="這個領地"/>
+ </notification>
+ <notification label="é¸æ“‡é ˜åœ°" name="EstateAllowedGroupRemove">
+ Remove from group allowed list for this estate only or [ALL_ESTATES]?
+ <usetemplate canceltext="å–消" name="yesnocancelbuttons" notext="全部領地" yestext="這個領地"/>
+ </notification>
+ <notification label="é¸æ“‡é ˜åœ°" name="EstateBannedAgentAdd">
+ Deny access for this estate only or for [ALL_ESTATES]?
+ <usetemplate canceltext="å–消" name="yesnocancelbuttons" notext="全部領地" yestext="這個領地"/>
+ </notification>
+ <notification label="é¸æ“‡é ˜åœ°" name="EstateBannedAgentRemove">
+ Remove this Resident from the ban list for access for this estate only or for [ALL_ESTATES]?
+ <usetemplate canceltext="å–消" name="yesnocancelbuttons" notext="全部領地" yestext="這個領地"/>
+ </notification>
+ <notification label="é¸æ“‡é ˜åœ°" name="EstateManagerAdd">
+ Add estate manager for this estate only or for [ALL_ESTATES]?
+ <usetemplate canceltext="å–消" name="yesnocancelbuttons" notext="全部領地" yestext="這個領地"/>
+ </notification>
+ <notification label="é¸æ“‡é ˜åœ°" name="EstateManagerRemove">
+ Remove estate manager for this estate only or for [ALL_ESTATES]?
+ <usetemplate canceltext="å–消" name="yesnocancelbuttons" notext="全部領地" yestext="這個領地"/>
+ </notification>
+ <notification label="確èªè¸¢å‡º" name="EstateKickUser">
+ 將 [EVIL_USER] 由這領地踢出?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="EstateChangeCovenant">
+ Are you sure you want to change the Estate Covenant?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="RegionEntryAccessBlocked">
+ You are not allowed in that Region due to your maturity Rating. This may be a result of a lack of information validating your age.
+
+Please verify you have the latest Viewer installed, and go to the Knowledge Base for details on accessing areas with this maturity rating.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="RegionEntryAccessBlocked_KB">
+ You are not allowed in that region due to your maturity Rating.
+
+Go to the Knowledge Base for more information about maturity Ratings?
+ <url name="url">
+ http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview
+ </url>
+ <usetemplate ignoretext="I can&apos;t enter this Region, due to restrictions of the maturity Rating" name="okcancelignore" notext="關閉" yestext="Go to Knowledge Base"/>
+ </notification>
+ <notification name="RegionEntryAccessBlocked_Notify">
+ You are not allowed in that region due to your maturity Rating.
+ </notification>
+ <notification name="RegionEntryAccessBlocked_Change">
+ You are not allowed in that Region due to your maturity Rating preference.
+
+To enter the desired region, please change your maturity Rating preference. This will allow you to search for and access [REGIONMATURITY] content. To undo any changes, go to Me &gt; Preferences &gt; General.
+ <form name="form">
+ <button name="OK" text="Change Preference"/>
+ <button name="Cancel" text="Close"/>
+ <ignore name="ignore" text="My chosen Rating preference prevents me from entering a Region"/>
+ </form>
+ </notification>
+ <notification name="PreferredMaturityChanged">
+ Your maturity Rating preference is now [RATING].
+ </notification>
+ <notification name="LandClaimAccessBlocked">
+ You cannot claim this land due to your maturity Rating. This may be a result of a lack of information validating your age.
+
+Please verify you have the latest Viewer installed, and go to the Knowledge Base for details on accessing areas with this maturity rating.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="LandClaimAccessBlocked_KB">
+ You cannot claim this land due to your maturity Rating.
+
+Go to the Knowledge Base for more information about maturity Ratings?
+ <url name="url">
+ http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview
+ </url>
+ <usetemplate ignoretext="I can&apos;t claim this Land, due to restrictions of the maturity Rating" name="okcancelignore" notext="關閉" yestext="Go to Knowledge Base"/>
+ </notification>
+ <notification name="LandClaimAccessBlocked_Notify">
+ You cannot claim this land due to your maturity Rating.
+ </notification>
+ <notification name="LandClaimAccessBlocked_Change">
+ You cannot claim this land due to your maturity Rating preference.
+
+You can click &apos;Change Preference&apos; to raise your maturity Rating preference now and allow you to enter. You will be able to search and access [REGIONMATURITY] content from now on. If you later want to change this setting back, go to Me &gt; Preferences &gt; General.
+ <usetemplate ignoretext="My chosen Rating preference prevents me from claiming Land" name="okcancelignore" notext="關閉" yestext="Change Preference"/>
+ </notification>
+ <notification name="LandBuyAccessBlocked">
+ You cannot buy this land due to your maturity Rating. This may be a result of a lack of information validating your age.
+
+Please verify you have the latest Viewer installed, and go to the Knowledge Base for details on accessing areas with this maturity rating.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="LandBuyAccessBlocked_KB">
+ You cannot buy this land due to your maturity Rating.
+
+Go to the Knowledge Base for more information about maturity Ratings?
+ <url name="url">
+ http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview
+ </url>
+ <usetemplate ignoretext="I can&apos;t buy this Land, due to restrictions of the maturity Rating" name="okcancelignore" notext="關閉" yestext="Go to Knowledge Base"/>
+ </notification>
+ <notification name="LandBuyAccessBlocked_Notify">
+ You cannot buy this land due to your maturity Rating.
+ </notification>
+ <notification name="LandBuyAccessBlocked_Change">
+ You cannot buy this land due to your maturity Rating preference.
+
+You can click &apos;Change Preference&apos; to raise your maturity Rating preference now and allow you to enter. You will be able to search and access [REGIONMATURITY] content from now on. If you later want to change this setting back, go to Me &gt; Preferences &gt; General.
+ <usetemplate ignoretext="My chosen Rating preference prevents me from buying Land" name="okcancelignore" notext="關閉" yestext="變更å好設定"/>
+ </notification>
+ <notification name="TooManyPrimsSelected">
+ There are too many prims selected. Please select [MAX_PRIM_COUNT] or fewer prims and try again
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="ProblemImportingEstateCovenant">
+ Problem importing estate covenant.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="ProblemAddingEstateManager">
+ Problems adding a new estate manager. One or more estates may have a full manager list.
+ </notification>
+ <notification name="ProblemAddingEstateGeneric">
+ Problems adding to this estate list. One or more estates may have a full list.
+ </notification>
+ <notification name="UnableToLoadNotecardAsset">
+ Unable to load notecard&apos;s asset at this time.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="NotAllowedToViewNotecard">
+ Insufficient permissions to view notecard associated with asset ID requested.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="MissingNotecardAssetID">
+ Asset ID for notecard is missing from database.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="PublishClassified">
+ Remember: Classified ad fees are non-refundable.
+
+Publish this classified now for L$[AMOUNT]?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="SetClassifiedMature">
+ Does this classified contain Moderate content?
+ <usetemplate canceltext="å–消" name="yesnocancelbuttons" notext="å¦" yestext="是"/>
+ </notification>
+ <notification name="SetGroupMature">
+ Does this group contain Moderate content?
+ <usetemplate canceltext="å–消" name="yesnocancelbuttons" notext="å¦" yestext="是"/>
+ </notification>
+ <notification label="Confirm restart" name="ConfirmRestart">
+ Do you really want to restart this region in 2 minutes?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification label="Message everyone in this region" name="MessageRegion">
+ Type a short announcement which will be sent to everyone in this region.
+ <form name="form">
+ <button name="OK" text="確定"/>
+ <button name="Cancel" text="å–消"/>
+ </form>
+ </notification>
+ <notification label="Changed Region Maturity" name="RegionMaturityChange">
+ The maturity rating for this region has been updated.
+It may take some time for the change to be reflected on the map.
+
+To enter Adult regions, Residents must be Account Verified, either by age-verification or payment-verification.
+ </notification>
+ <notification label="Voice Version Mismatch" name="VoiceVersionMismatch">
+ This version of [APP_NAME] is not compatible with the Voice Chat feature in this region. In order for Voice Chat to function correctly you will need to update [APP_NAME].
+ </notification>
+ <notification label="無法購買物件" name="BuyObjectOneOwner">
+ Cannot buy objects from different owners at the same time.
+Please select only one object and try again.
+ </notification>
+ <notification label="無法購買內容物" name="BuyContentsOneOnly">
+ Unable to buy the contents of more than one object at a time.
+Please select only one object and try again.
+ </notification>
+ <notification label="無法購買內容物" name="BuyContentsOneOwner">
+ Cannot buy objects from different owners at the same time.
+Please select only one object and try again.
+ </notification>
+ <notification name="BuyOriginal">
+ Buy original object from [OWNER] for L$[PRICE]?
+You will become the owner of this object.
+You will be able to:
+ Modify: [MODIFYPERM]
+ Copy: [COPYPERM]
+ Resell or Give Away: [RESELLPERM]
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="BuyOriginalNoOwner">
+ Buy original object for L$[PRICE]?
+You will become the owner of this object.
+You will be able to:
+ Modify: [MODIFYPERM]
+ Copy: [COPYPERM]
+ Resell or Give Away: [RESELLPERM]
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="BuyCopy">
+ Buy a copy from [OWNER] for L$[PRICE]?
+The object will be copied to your inventory.
+You will be able to:
+ Modify: [MODIFYPERM]
+ Copy: [COPYPERM]
+ Resell or Give Away: [RESELLPERM]
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="BuyCopyNoOwner">
+ Buy a copy for L$[PRICE]?
+The object will be copied to your inventory.
+You will be able to:
+ Modify: [MODIFYPERM]
+ Copy: [COPYPERM]
+ Resell or Give Away: [RESELLPERM]
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="BuyContents">
+ Buy contents from [OWNER] for L$[PRICE]?
+They will be copied to your inventory.
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="BuyContentsNoOwner">
+ Buy contents for L$[PRICE]?
+They will be copied to your inventory.
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="ConfirmPurchase">
+ This transaction will:
+[ACTION]
+
+Are you sure you want to proceed with this purchase?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="ConfirmPurchasePassword">
+ This transaction will:
+[ACTION]
+
+Are you sure you want to proceed with this purchase?
+Please re-enter your password and click OK.
+ <form name="form">
+ <button name="ConfirmPurchase" text="確定"/>
+ <button name="Cancel" text="å–消"/>
+ </form>
+ </notification>
+ <notification name="SetPickLocation">
+ Note:
+You have updated the location of this pick but the other details will retain their original values.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="MoveInventoryFromObject">
+ You have selected &apos;no copy&apos; inventory items.
+These items will be moved to your inventory, not copied.
+
+Move the inventory item(s)?
+ <usetemplate ignoretext="Warn me before I move &apos;no-copy&apos; items from an object" name="okcancelignore" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="MoveInventoryFromScriptedObject">
+ You have selected &apos;no copy&apos; inventory items. These items will be moved to your inventory, not copied.
+Because this object is scripted, moving these items to your inventory may cause the script to malfunction.
+
+Move the inventory item(s)?
+ <usetemplate ignoretext="Warn me before I move &apos;no-copy&apos; items which might break a scripted object" name="okcancelignore" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="ClickActionNotPayable">
+ Warning: The &apos;Pay object&apos; click action has been set, but it will only work if a script is added with a money() event.
+ <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="OpenObjectCannotCopy">
+ There are no items in this object that you are allowed to copy.
+ </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="DeleteItems">
+ [QUESTION]
+ <usetemplate ignoretext="Confirm before deleting items" name="okcancelignore" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="HelpReportAbuseEmailLL">
+ 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.
+ </notification>
+ <notification name="HelpReportAbuseSelectCategory">
+ Please select a category for this abuse report.
+Selecting a category helps us file and process abuse reports.
+ </notification>
+ <notification name="HelpReportAbuseAbuserNameEmpty">
+ Please enter the name of the abuser.
+Entering an accurate value helps us file and process abuse reports.
+ </notification>
+ <notification name="HelpReportAbuseAbuserLocationEmpty">
+ Please enter the location where the abuse took place.
+Entering an accurate value helps us file and process abuse reports.
+ </notification>
+ <notification name="HelpReportAbuseSummaryEmpty">
+ Please enter a summary of the abuse that took place.
+Entering an accurate summary helps us file and process abuse reports.
+ </notification>
+ <notification name="HelpReportAbuseDetailsEmpty">
+ Please enter a detailed description of the abuse that took place.
+Be as specific as you can, including names and the details of the incident you are reporting.
+Entering an accurate description helps us file and process abuse reports.
+ </notification>
+ <notification name="HelpReportAbuseContainsCopyright">
+ Dear Resident,
+
+You appear to be reporting intellectual property infringement. Please make sure you are reporting it correctly:
+
+(1) The Abuse Process. You may submit an abuse report if you believe a Resident is exploiting the [SECOND_LIFE] permissions system, for example, by using CopyBot or similar copying tools, to infringe intellectual property rights. The Abuse Team investigates and issues appropriate disciplinary action for behavior that violates the [SECOND_LIFE] [http://secondlife.com/corporate/tos.php Terms of Service] or [http://secondlife.com/corporate/cs.php Community Standards]. However, the Abuse Team does not handle and will not respond to requests to remove content from the [SECOND_LIFE] world.
+
+(2) The DMCA or Content Removal Process. To request removal of content from [SECOND_LIFE], you MUST submit a valid notification of infringement as provided in our [http://secondlife.com/corporate/dmca.php DMCA Policy].
+
+If you still wish to continue with the abuse process, please close this window and finish submitting your report. You may need to select the specific category &apos;CopyBot or Permissions Exploit&apos;.
+
+Thank you,
+
+Linden Lab
+ </notification>
+ <notification name="FailedRequirementsCheck">
+ The following required components are missing from [FLOATER]:
+[COMPONENTS]
+ </notification>
+ <notification label="Replace Existing Attachment" 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"/>
+ <button ignore="自動å–代" name="Yes" text="確定"/>
+ <button ignore="絕ä¸å–代" name="No" text="å–消"/>
+ </form>
+ </notification>
+ <notification label="忙碌模å¼è­¦å‘Š" name="BusyModePay">
+ You are in Busy Mode, which means you will not receive any items offered in exchange for this payment.
+
+Would you like to leave Busy Mode before completing this transaction?
+ <form name="form">
+ <ignore name="ignore" text="I am about to pay a person or object while I am in Busy mode"/>
+ <button ignore="Always leave Busy Mode" name="Yes" text="確定"/>
+ <button ignore="Never leave Busy Mode" name="No" text="å–消"/>
+ </form>
+ </notification>
+ <notification name="ConfirmDeleteProtectedCategory">
+ The folder &apos;[FOLDERNAME]&apos; is a system folder. Deleting system folders can cause instability. Are you sure you want to delete it?
+ <usetemplate ignoretext="Confirm before I delete a system folder" name="okcancelignore" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="ConfirmEmptyTrash">
+ Are you sure you want to permanently delete the contents of your Trash?
+ <usetemplate ignoretext="Confirm before I empty the inventory Trash folder" name="okcancelignore" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="ConfirmClearBrowserCache">
+ Are you sure you want to delete your travel, web, and search history?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="ConfirmClearCookies">
+ Are you sure you want to clear your cookies?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="是"/>
+ </notification>
+ <notification name="ConfirmClearMediaUrlList">
+ Are you sure you want to clear your list of saved URLs?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="是"/>
+ </notification>
+ <notification name="ConfirmEmptyLostAndFound">
+ Are you sure you want to permanently delete the contents of your Lost And Found?
+ <usetemplate ignoretext="Confirm before I empty the inventory Lost And Found folder" name="okcancelignore" notext="å¦" yestext="是"/>
+ </notification>
+ <notification name="CopySLURL">
+ The following SLurl has been copied to your clipboard:
+ [SLURL]
+
+Link to this from a web page to give others easy access to this location, or try it out yourself by pasting it into the address bar of any web browser.
+ <form name="form">
+ <ignore name="ignore" text="SLurl 已經覆製到我的剪貼簿。"/>
+ </form>
+ </notification>
+ <notification name="WLSavePresetAlert">
+ Do you wish to overwrite the saved preset?
+ <usetemplate name="okcancelbuttons" notext="No" yestext="是"/>
+ </notification>
+ <notification name="WLDeletePresetAlert">
+ Do you wish to delete [SKY]?
+ <usetemplate name="okcancelbuttons" notext="å¦" yestext="是"/>
+ </notification>
+ <notification name="WLNoEditDefault">
+ You cannot edit or delete a default preset.
+ </notification>
+ <notification name="WLMissingSky">
+ This day cycle file references a missing sky file: [SKY].
+ </notification>
+ <notification name="PPSaveEffectAlert">
+ PostProcess Effect exists. Do you still wish overwrite it?
+ <usetemplate name="okcancelbuttons" notext="å¦" yestext="是"/>
+ </notification>
+ <notification name="NewSkyPreset">
+ Give me a name for the new sky.
+ <form name="form">
+ <input name="message">
+ New Preset
+ </input>
+ <button name="OK" text="確定"/>
+ <button name="Cancel" text="å–消"/>
+ </form>
+ </notification>
+ <notification name="ExistsSkyPresetAlert">
+ Preset already exists!
+ </notification>
+ <notification name="NewWaterPreset">
+ Give me a name for the new water preset.
+ <form name="form">
+ <input name="message">
+ New Preset
+ </input>
+ <button name="OK" text="確定"/>
+ <button name="Cancel" text="å–消"/>
+ </form>
+ </notification>
+ <notification name="ExistsWaterPresetAlert">
+ Preset already exists!
+ </notification>
+ <notification name="WaterNoEditDefault">
+ You cannot edit or delete a default preset.
+ </notification>
+ <notification name="ChatterBoxSessionStartError">
+ 無法開始一個與 [RECIPIENT] 他的新èŠå¤©æœƒè©±ã€‚
+[REASON]
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="ChatterBoxSessionEventError">
+ [EVENT]
+[REASON]
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="ForceCloseChatterBoxSession">
+ 你與 [NAME] çš„èŠå¤©æœƒè©±å¿…須關閉。
+[REASON]
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="Cannot_Purchase_an_Attachment">
+ You can&apos;t buy an object while it is attached.
+ </notification>
+ <notification label="About Requests for the Debit Permission" name="DebitPermissionDetails">
+ Granting this request gives a script ongoing permission to take Linden dollars (L$) from your account. To revoke this permission, the object owner must delete the object or reset the scripts in the object.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="AutoWearNewClothing">
+ ä½ è¦è‡ªå‹•ç©¿ä¸Šä½ æ‰€å‰µé€ çš„æœè£å—Žï¼Ÿ
+ <usetemplate ignoretext="編輯外觀時能穿上我所創造的æœè£" name="okcancelignore" notext="å¦" yestext="是"/>
+ </notification>
+ <notification name="NotAgeVerified">
+ You must be age-verified to visit this area. Do you want to go to the [SECOND_LIFE] website and verify your age?
+
+[_URL]
+ <url name="url">
+ https://secondlife.com/account/verification.php
+ </url>
+ <usetemplate ignoretext="I have not verified my age" name="okcancelignore" notext="å¦" yestext="是"/>
+ </notification>
+ <notification name="Cannot enter parcel: no payment info on file">
+ You must have payment information on file to visit this area. Do you want to go to the [SECOND_LIFE] website and set this up?
+
+[_URL]
+ <url name="url">
+ https://secondlife.com/account/
+ </url>
+ <usetemplate ignoretext="I lack payment information on file" name="okcancelignore" notext="å¦" yestext="是"/>
+ </notification>
+ <notification name="MissingString">
+ The string [STRING_NAME] is missing from strings.xml
+ </notification>
+ <notification name="SystemMessageTip">
+ [MESSAGE]
+ </notification>
+ <notification name="IMSystemMessageTip">
+ [MESSAGE]
+ </notification>
+ <notification name="Cancelled">
+ Cancelled
+ </notification>
+ <notification name="CancelledSit">
+ Cancelled Sit
+ </notification>
+ <notification name="CancelledAttach">
+ Cancelled Attach
+ </notification>
+ <notification name="ReplacedMissingWearable">
+ Replaced missing clothing/body part with default.
+ </notification>
+ <notification name="GroupNotice">
+ Topic: [SUBJECT], Message: [MESSAGE]
+ </notification>
+ <notification name="FriendOnline">
+ [NAME] is Online
+ </notification>
+ <notification name="FriendOffline">
+ [NAME] is Offline
+ </notification>
+ <notification name="AddSelfFriend">
+ Although you&apos;re very nice, you can&apos;t add yourself as a friend.
+ </notification>
+ <notification name="UploadingAuctionSnapshot">
+ Uploading in-world and web site snapshots...
+(Takes about 5 minutes.)
+ </notification>
+ <notification name="UploadPayment">
+ 你支付 L$[AMOUNT] 上傳。
+ </notification>
+ <notification name="UploadWebSnapshotDone">
+ Web site snapshot upload done.
+ </notification>
+ <notification name="UploadSnapshotDone">
+ In-world snapshot upload done
+ </notification>
+ <notification name="TerrainDownloaded">
+ Terrain.raw downloaded
+ </notification>
+ <notification name="GestureMissing">
+ Hmm. Gesture [NAME] is missing from the database.
+ </notification>
+ <notification name="UnableToLoadGesture">
+ Unable to load gesture [NAME].
+ </notification>
+ <notification name="LandmarkMissing">
+ 資料庫中的地標éºå¤±ã€‚
+ </notification>
+ <notification name="UnableToLoadLandmark">
+ 無法載入地標,請å†è©¦ä¸€æ¬¡ã€‚
+ </notification>
+ <notification name="CapsKeyOn">
+ Your Caps Lock key is on.
+This might affect your password.
+ </notification>
+ <notification name="NotecardMissing">
+ Notecard is missing from database.
+ </notification>
+ <notification name="NotecardNoPermissions">
+ You don&apos;t have permission to view this notecard.
+ </notification>
+ <notification name="RezItemNoPermissions">
+ Insufficient permissions to rez object.
+ </notification>
+ <notification name="UnableToLoadNotecard">
+ Unable to load notecard.
+Please try again.
+ </notification>
+ <notification name="ScriptMissing">
+ Script is missing from database.
+ </notification>
+ <notification name="ScriptNoPermissions">
+ Insufficient permissions to view script.
+ </notification>
+ <notification name="UnableToLoadScript">
+ Unable to load script. Please try again.
+ </notification>
+ <notification name="IncompleteInventory">
+ The complete contents you are offering are not yet locally available. Please try offering those items again in a minute.
+ </notification>
+ <notification name="CannotModifyProtectedCategories">
+ You cannot modify protected categories.
+ </notification>
+ <notification name="CannotRemoveProtectedCategories">
+ You cannot remove protected categories.
+ </notification>
+ <notification name="UnableToBuyWhileDownloading">
+ Unable to buy while downloading object data.
+Please try again.
+ </notification>
+ <notification name="UnableToLinkWhileDownloading">
+ Unable to link while downloading object data.
+Please try again.
+ </notification>
+ <notification name="CannotBuyObjectsFromDifferentOwners">
+ You can only buy objects from one owner at a time.
+Please select a single object.
+ </notification>
+ <notification name="ObjectNotForSale">
+ This object is not for sale.
+ </notification>
+ <notification name="EnteringGodMode">
+ Entering god mode, level [LEVEL]
+ </notification>
+ <notification name="LeavingGodMode">
+ Now leaving god mode, level [LEVEL]
+ </notification>
+ <notification name="CopyFailed">
+ You don&apos;t have permission to copy this.
+ </notification>
+ <notification name="InventoryAccepted">
+ [NAME] received your inventory offer.
+ </notification>
+ <notification name="InventoryDeclined">
+ [NAME] declined your inventory offer.
+ </notification>
+ <notification name="ObjectMessage">
+ [NAME]: [MESSAGE]
+ </notification>
+ <notification name="CallingCardAccepted">
+ Your calling card was accepted.
+ </notification>
+ <notification name="CallingCardDeclined">
+ Your calling card was declined.
+ </notification>
+ <notification name="TeleportToLandmark">
+ 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;.)
+ </notification>
+ <notification name="TeleportToPerson">
+ 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;).
+ </notification>
+ <notification name="CantSelectLandFromMultipleRegions">
+ Can&apos;t select land across server boundaries.
+Try selecting a smaller piece of land.
+ </notification>
+ <notification name="SearchWordBanned">
+ Some terms in your search query were excluded due to content restrictions as clarified in the Community Standards.
+ </notification>
+ <notification name="NoContentToSearch">
+ Please select at least one type of content to search (General, Moderate, or Adult).
+ </notification>
+ <notification name="SystemMessage">
+ [MESSAGE]
+ </notification>
+ <notification name="PaymentReceived">
+ [MESSAGE]
+ </notification>
+ <notification name="PaymentSent">
+ [MESSAGE]
+ </notification>
+ <notification name="EventNotification">
+ Event Notification:
+
+[NAME]
+[DATE]
+ <form name="form">
+ <button name="Details" text="Details"/>
+ <button name="Cancel" text="å–消"/>
+ </form>
+ </notification>
+ <notification name="TransferObjectsHighlighted">
+ All objects on this parcel that will transfer to the purchaser of this parcel are now highlighted.
+
+* Trees and grasses that will transfer are not highlighted.
+ <form name="form">
+ <button name="Done" text="Done"/>
+ </form>
+ </notification>
+ <notification name="DeactivatedGesturesTrigger">
+ Deactivated gestures with same trigger:
+[NAMES]
+ </notification>
+ <notification name="NoQuickTime">
+ Apple&apos;s QuickTime software does not appear to be installed on your system.
+If you want to view streaming media on parcels that support it you should go to the [http://www.apple.com/quicktime QuickTime site] and install the QuickTime Player.
+ </notification>
+ <notification name="NoPlugin">
+ No Media Plugin was found to handle the &quot;[MIME_TYPE]&quot; mime type. Media of this type will be unavailable.
+ </notification>
+ <notification name="MediaPluginFailed">
+ The following Media Plugin has failed:
+ [PLUGIN]
+
+Please re-install the plugin or contact the vendor if you continue to experience problems.
+ <form name="form">
+ <ignore name="ignore" text="A Media Plugin fails to run"/>
+ </form>
+ </notification>
+ <notification name="OwnedObjectsReturned">
+ The objects you own on the selected parcel of land have been returned back to your inventory.
+ </notification>
+ <notification name="OtherObjectsReturned">
+ The objects on the selected parcel of land that is owned by [NAME] have been returned to his or her inventory.
+ </notification>
+ <notification name="OtherObjectsReturned2">
+ The objects on the selected parcel of land owned by the Resident &apos;[NAME]&apos; have been returned to their owner.
+ </notification>
+ <notification name="GroupObjectsReturned">
+ The objects on the selected parcel of land shared with the group [GROUPNAME] have been returned back to their owner&apos;s inventory.
+Transferable deeded objects have been returned to their previous owners.
+Non-transferable objects that are deeded to the group have been deleted.
+ </notification>
+ <notification name="UnOwnedObjectsReturned">
+ The objects on the selected parcel that are NOT owned by you have been returned to their owners.
+ </notification>
+ <notification name="ServerObjectMessage">
+ Message from [NAME]:
+&lt;nolink&gt;[MSG]&lt;/nolink&gt;
+ </notification>
+ <notification name="NotSafe">
+ This land has damage enabled.
+You can be hurt here. If you die, you will be teleported to your home location.
+ </notification>
+ <notification name="NoFly">
+ This area has flying disabled.
+You can&apos;t fly here.
+ </notification>
+ <notification name="PushRestricted">
+ This area does not allow pushing. You can&apos;t push others here unless you own the land.
+ </notification>
+ <notification name="NoVoice">
+ This area has voice chat disabled. You won&apos;t be able to hear anyone talking.
+ </notification>
+ <notification name="NoBuild">
+ This area has building disabled. You can&apos;t build or rez objects here.
+ </notification>
+ <notification name="ScriptsStopped">
+ An administrator has temporarily stopped scripts in this region.
+ </notification>
+ <notification name="ScriptsNotRunning">
+ This region is not running any scripts.
+ </notification>
+ <notification name="NoOutsideScripts">
+ This land has outside scripts disabled.
+
+No scripts will work here except those belonging to the land owner.
+ </notification>
+ <notification name="ClaimPublicLand">
+ You can only claim public land in the Region you&apos;re in.
+ </notification>
+ <notification name="RegionTPAccessBlocked">
+ You aren&apos;t allowed in that Region due to your maturity Rating. You may need to validate your age and/or install the latest Viewer.
+
+Please go to the Knowledge Base for details on accessing areas with this maturity Rating.
+ </notification>
+ <notification name="URBannedFromRegion">
+ You are banned from the region.
+ </notification>
+ <notification name="NoTeenGridAccess">
+ Your account cannot connect to this teen grid region.
+ </notification>
+ <notification name="ImproperPaymentStatus">
+ You do not have proper payment status to enter this region.
+ </notification>
+ <notification name="MustGetAgeRgion">
+ You must be age-verified to enter this region.
+ </notification>
+ <notification name="MustGetAgeParcel">
+ You must be age-verified to enter this parcel.
+ </notification>
+ <notification name="NoDestRegion">
+ No destination region found.
+ </notification>
+ <notification name="NotAllowedInDest">
+ You are not allowed into the destination.
+ </notification>
+ <notification name="RegionParcelBan">
+ Cannot region cross into banned parcel. Try another way.
+ </notification>
+ <notification name="TelehubRedirect">
+ You have been redirected to a telehub.
+ </notification>
+ <notification name="CouldntTPCloser">
+ Could not teleport closer to destination.
+ </notification>
+ <notification name="TPCancelled">
+ 瞬間傳é€å·²å–消。
+ </notification>
+ <notification name="FullRegionTryAgain">
+ The region you are attempting to enter is currently full.
+Please try again in a few moments.
+ </notification>
+ <notification name="GeneralFailure">
+ General failure.
+ </notification>
+ <notification name="RoutedWrongRegion">
+ Routed to wrong region. Please try again.
+ </notification>
+ <notification name="NoValidAgentID">
+ No valid agent id.
+ </notification>
+ <notification name="NoValidSession">
+ No valid session id.
+ </notification>
+ <notification name="NoValidCircuit">
+ No valid circuit code.
+ </notification>
+ <notification name="NoValidTimestamp">
+ No valid timestamp.
+ </notification>
+ <notification name="NoPendingConnection">
+ Unable to create pending connection.
+ </notification>
+ <notification name="InternalUsherError">
+ Internal error attempting to connect agent usher.
+ </notification>
+ <notification name="NoGoodTPDestination">
+ Unable to find a good teleport destination in this region.
+ </notification>
+ <notification name="InternalErrorRegionResolver">
+ Internal error attempting to activate region resolver.
+ </notification>
+ <notification name="NoValidLanding">
+ A valid landing point could not be found.
+ </notification>
+ <notification name="NoValidParcel">
+ No valid parcel could be found.
+ </notification>
+ <notification name="ObjectGiveItem">
+ An object named &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt; owned by [NAME_SLURL] has given you this [OBJECTTYPE]:
+[ITEM_SLURL]
+ <form name="form">
+ <button name="Keep" text="Keep"/>
+ <button name="Discard" text="Discard"/>
+ <button name="Mute" text="Block"/>
+ </form>
+ </notification>
+ <notification name="UserGiveItem">
+ [NAME_SLURL] has given you this [OBJECTTYPE]:
+[ITEM_SLURL]
+ <form name="form">
+ <button name="Show" text="Show"/>
+ <button name="Discard" text="Discard"/>
+ <button name="Mute" text="Block"/>
+ </form>
+ </notification>
+ <notification name="GodMessage">
+ [NAME]
+
+[MESSAGE]
+ </notification>
+ <notification name="JoinGroup">
+ [MESSAGE]
+ <form name="form">
+ <button name="Join" text="Join"/>
+ <button name="Decline" text="Decline"/>
+ <button name="Info" text="資訊"/>
+ </form>
+ </notification>
+ <notification name="TeleportOffered">
+ [NAME_SLURL] has offered to teleport you to their location:
+
+[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">
+ Teleport offer sent to [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] is offering friendship.
+
+[MESSAGE]
+
+(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"/>
+ </form>
+ </notification>
+ <notification name="FriendshipOffered">
+ You have offered friendship to [TO_NAME]
+ </notification>
+ <notification name="OfferFriendshipNoMessage">
+ [NAME_SLURL] is offering friendship.
+
+(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"/>
+ </form>
+ </notification>
+ <notification name="FriendshipAccepted">
+ [NAME] accepted your friendship offer.
+ </notification>
+ <notification name="FriendshipDeclined">
+ [NAME] declined your friendship offer.
+ </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"/>
+ </form>
+ </notification>
+ <notification name="RegionRestartMinutes">
+ This region will restart in [MINUTES] minutes.
+If you stay in this region you will be logged out.
+ </notification>
+ <notification name="RegionRestartSeconds">
+ This region will restart in [SECONDS] seconds.
+If you stay in this region you will be logged out.
+ </notification>
+ <notification name="LoadWebPage">
+ è¼‰å…¥ç¶²é  [URL]?
+
+[MESSAGE]
+
+From object: &lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;, owner: [NAME]?
+ <form name="form">
+ <button name="Gotopage" text="å‰å¾€é é¢"/>
+ <button name="Cancel" text="å–消"/>
+ </form>
+ </notification>
+ <notification name="FailedToFindWearableUnnamed">
+ Failed to find [TYPE] in database.
+ </notification>
+ <notification name="FailedToFindWearable">
+ Failed to find [TYPE] named [DESC] in database.
+ </notification>
+ <notification name="InvalidWearable">
+ The item you are trying to wear uses a feature that your Viewer can&apos;t read. Please upgrade your version of [APP_NAME] to wear this item.
+ </notification>
+ <notification name="ScriptQuestion">
+ &apos;&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;&apos;, an object owned by &apos;[NAME]&apos;, would like to:
+
+[QUESTIONS]
+Is this OK?
+ <form name="form">
+ <button name="Yes" text="是"/>
+ <button name="No" text="å¦"/>
+ <button name="Mute" text="Block"/>
+ </form>
+ </notification>
+ <notification name="ScriptQuestionCaution">
+ An object named &apos;&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;&apos;, owned by &apos;[NAME]&apos; would like to:
+
+[QUESTIONS]
+If you do not trust this object and its creator, you should deny the request.
+
+Grant this request?
+ <form name="form">
+ <button name="Grant" text="Grant"/>
+ <button name="Deny" text="Deny"/>
+ <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="忽視"/>
+ </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="忽視"/>
+ </form>
+ </notification>
+ <notification name="BuyLindenDollarSuccess">
+ Thank you for your payment!
+
+Your L$ balance will be updated when processing completes. If processing takes more than 20 mins, your transaction may be cancelled. In that case, the purchase amount will be credited to your US$ balance.
+
+The status of your payment can be checked on your Transaction History page on your [http://secondlife.com/account/ Dashboard]
+ </notification>
+ <notification name="FirstOverrideKeys">
+ Your movement keys are now being handled by an object.
+Try the arrow keys or AWSD to see what they do.
+Some objects (like guns) require you to go into mouselook to use them.
+Press &apos;M&apos; to do this.
+ </notification>
+ <notification name="FirstSandbox">
+ This is a sandbox area, and is meant to help Residents learn how to build.
+
+Things you build here will be deleted after you leave, so don&apos;t forget to right-click and choose &apos;Take&apos; to move your creation to your Inventory.
+ </notification>
+ <notification name="MaxListSelectMessage">
+ You may only select up to [MAX_SELECT] items from this list.
+ </notification>
+ <notification name="VoiceInviteP2P">
+ [NAME] is inviting you to a Voice Chat call.
+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="Mute" text="Block"/>
+ </form>
+ </notification>
+ <notification name="AutoUnmuteByIM">
+ [NAME] was sent an instant message and has been automatically unblocked.
+ </notification>
+ <notification name="AutoUnmuteByMoney">
+ [NAME] was given money and has been automatically unblocked.
+ </notification>
+ <notification name="AutoUnmuteByInventory">
+ [NAME] was offered inventory and has been automatically unblocked.
+ </notification>
+ <notification name="VoiceInviteGroup">
+ [NAME] has joined a Voice Chat call with the group [GROUP].
+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="Mute" text="Block"/>
+ </form>
+ </notification>
+ <notification name="VoiceInviteAdHoc">
+ [NAME] has joined a voice chat call with a conference chat.
+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="Mute" text="Block"/>
+ </form>
+ </notification>
+ <notification name="InviteAdHoc">
+ [NAME] is inviting you to a conference chat.
+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="Mute" text="Block"/>
+ </form>
+ </notification>
+ <notification name="VoiceChannelFull">
+ The voice call you are trying to join, [VOICE_CHANNEL_NAME], has reached maximum capacity. Please try again later.
+ </notification>
+ <notification name="ProximalVoiceChannelFull">
+ We&apos;re sorry. This area has reached maximum capacity for voice conversations. Please try to use voice in another area.
+ </notification>
+ <notification name="VoiceChannelDisconnected">
+ You have been disconnected from [VOICE_CHANNEL_NAME]. You will now be reconnected to Nearby Voice Chat.
+ </notification>
+ <notification name="VoiceChannelDisconnectedP2P">
+ [VOICE_CHANNEL_NAME] has ended the call. You will now be reconnected to Nearby Voice Chat.
+ </notification>
+ <notification name="P2PCallDeclined">
+ [VOICE_CHANNEL_NAME] has declined your call. You will now be reconnected to Nearby Voice Chat.
+ </notification>
+ <notification name="P2PCallNoAnswer">
+ [VOICE_CHANNEL_NAME] is not available to take your call. You will now be reconnected to Nearby Voice Chat.
+ </notification>
+ <notification name="VoiceChannelJoinFailed">
+ Failed to connect to [VOICE_CHANNEL_NAME], please try again later. You will now be reconnected to Nearby Voice Chat.
+ </notification>
+ <notification name="VoiceLoginRetry">
+ We are creating a voice channel for you. This may take up to one minute.
+ </notification>
+ <notification name="VoiceEffectsExpired">
+ One or more of your subscribed Voice Morphs has expired.
+[[URL] Click here] to renew your subscription.
+ </notification>
+ <notification name="VoiceEffectsExpiredInUse">
+ The active Voice Morph has expired, your normal voice settings have been applied.
+[[URL] Click here] to renew your subscription.
+ </notification>
+ <notification name="VoiceEffectsWillExpire">
+ One or more of your Voice Morphs will expire in less than [INTERVAL] days.
+[[URL] Click here] to renew your subscription.
+ </notification>
+ <notification name="VoiceEffectsNew">
+ New Voice Morphs are available!
+ </notification>
+ <notification name="Cannot enter parcel: not a group member">
+ Only members of a certain group can visit this area.
+ </notification>
+ <notification name="Cannot enter parcel: banned">
+ Cannot enter parcel, you have been banned.
+ </notification>
+ <notification name="Cannot enter parcel: not on access list">
+ Cannot enter parcel, you are not on the access list.
+ </notification>
+ <notification name="VoiceNotAllowed">
+ You do not have permission to connect to voice chat for [VOICE_CHANNEL_NAME].
+ </notification>
+ <notification name="VoiceCallGenericError">
+ An error has occurred while trying to connect to voice chat for [VOICE_CHANNEL_NAME]. Please try again later.
+ </notification>
+ <notification name="UnsupportedCommandSLURL">
+ 你所點擊的 SLurl ä½ç½®ä¸¦ä¸è¢«æ”¯æ´ã€‚
+ </notification>
+ <notification name="BlockedSLURL">
+ A SLurl was received from an untrusted browser and has been blocked for your security.
+ </notification>
+ <notification name="ThrottledSLURL">
+ Multiple SLurls were received from an untrusted browser within a short period.
+They will be blocked for a few seconds for your security.
+ </notification>
+ <notification name="IMToast">
+ [MESSAGE]
+ <form name="form">
+ <button name="respondbutton" text="Respond"/>
+ </form>
+ </notification>
+ <notification name="ConfirmCloseAll">
+ Are you sure you want to close all IMs?
+ <usetemplate ignoretext="Confirm before I close all IMs" name="okcancelignore" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="AttachmentSaved">
+ Attachment has been saved.
+ </notification>
+ <notification name="UnableToFindHelpTopic">
+ Unable to find the help topic for this element.
+ </notification>
+ <notification name="ObjectMediaFailure">
+ Server Error: Media update or get failed.
+&apos;[ERROR]&apos;
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="TextChatIsMutedByModerator">
+ Your text chat has been muted by moderator.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="VoiceIsMutedByModerator">
+ Your voice has been muted by moderator.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="ConfirmClearTeleportHistory">
+ Are you sure you want to delete your teleport history?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="BottomTrayButtonCanNotBeShown">
+ Selected button can not be shown right now.
+The button will be shown when there is enough space for it.
+ </notification>
+ <notification name="ShareNotification">
+ Select residents to share with.
+ </notification>
+ <notification name="ShareItemsConfirmation">
+ Are you sure you want to share the following items:
+
+&lt;nolink&gt;[ITEMS]&lt;/nolink&gt;
+
+With the following Residents:
+
+[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 )
+Avatar &apos;[NAME]&apos; declouded after [TIME] seconds.
+ </notification>
+ <notification name="AvatarRezSelfBakedDoneNotification">
+ ( [EXISTENCE] seconds alive )
+You finished baking your outfit after [TIME] seconds.
+ </notification>
+ <notification name="AvatarRezSelfBakedUpdateNotification">
+ ( [EXISTENCE] seconds alive )
+You sent out an update of your appearance after [TIME] seconds.
+[STATUS]
+ </notification>
+ <notification name="AvatarRezCloudNotification">
+ ( [EXISTENCE] seconds alive )
+Avatar &apos;[NAME]&apos; became cloud.
+ </notification>
+ <notification name="AvatarRezArrivedNotification">
+ ( [EXISTENCE] seconds alive )
+Avatar &apos;[NAME]&apos; appeared.
+ </notification>
+ <notification name="AvatarRezLeftCloudNotification">
+ ( [EXISTENCE] seconds alive )
+Avatar &apos;[NAME]&apos; left after [TIME] seconds as cloud.
+ </notification>
+ <notification name="AvatarRezEnteredAppearanceNotification">
+ ( [EXISTENCE] seconds alive )
+Avatar &apos;[NAME]&apos; entered appearance mode.
+ </notification>
+ <notification name="AvatarRezLeftAppearanceNotification">
+ ( [EXISTENCE] seconds alive )
+Avatar &apos;[NAME]&apos; left appearance mode.
+ </notification>
+ <notification name="NoConnect">
+ We&apos;re having trouble connecting using [PROTOCOL] [HOSTID].
+Please check your network and firewall setup.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="NoVoiceConnect">
+ We&apos;re having trouble connecting to your voice server:
+
+[HOSTID]
+
+Voice communications will not be available.
+Please check your network and firewall setup.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="AvatarRezLeftNotification">
+ ( [EXISTENCE] seconds alive )
+Avatar &apos;[NAME]&apos; left as fully loaded.
+ </notification>
+ <notification name="AvatarRezSelfBakedTextureUploadNotification">
+ ( [EXISTENCE] seconds alive )
+You uploaded a [RESOLUTION] baked texture for &apos;[BODYREGION]&apos; after [TIME] seconds.
+ </notification>
+ <notification name="AvatarRezSelfBakedTextureUpdateNotification">
+ ( [EXISTENCE] seconds alive )
+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">
+ You have selected to mute all participants in a group call.
+This will also cause all residents that later join the call to be
+muted, even after you have left the call.
+
+Mute everyone?
+ <usetemplate ignoretext="Confirm before I mute all participants in a group call" name="okcancelignore" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification label="èŠå¤©" name="HintChat">
+ To join the conversation, type into the chat field below.
+ </notification>
+ <notification label="Stand" name="HintSit">
+ To stand up and exit the sitting position, click the Stand button.
+ </notification>
+ <notification label="Speak" name="HintSpeak">
+ Click the Speak button to turn your microphone on and off.
+
+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">
+ The Destination Guide contains thousands of new places to discover. Select a location and choose Teleport to start exploring.
+ </notification>
+ <notification label="å´é‚Šæ¬„" name="HintSidePanel">
+ Get quick access to your inventory, outfits, profiles and more in the side panel.
+ </notification>
+ <notification label="移動" name="HintMove">
+ 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 label="" name="HintMoveClick">
+ 1. Click to Walk
+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">
+ 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">
+ To change your camera view, use the Orbit and Pan controls. Reset your view by pressing Escape or walking.
+ </notification>
+ <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">
+ Here&apos;s your current balance of L$. Click Buy L$ to purchase more Linden Dollars.
+ </notification>
+ <notification name="PopupAttempt">
+ A pop-up was prevented from opening.
+ <form name="form">
+ <ignore name="ignore" text="Enable all pop-ups"/>
+ <button name="open" text="Open pop-up window"/>
+ </form>
+ </notification>
+ <notification name="AuthRequest">
+ The site at &apos;&lt;nolink&gt;[HOST_NAME]&lt;/nolink&gt;&apos; in realm &apos;[REALM]&apos; requires a user name and password.
+ <form name="form">
+ <input name="username" text="User Name"/>
+ <input name="password" text="Password"/>
+ <button name="ok" text="Submit"/>
+ <button name="cancel" text="å–消"/>
+ </form>
+ </notification>
+ <notification label="" name="ModeChange">
+ 改變劉覽器模å¼è¦æ±‚ä½ å¿…é ˆçµæŸé€€å‡ºä¸¦é‡æ–°å•Ÿå‹•ã€‚
+ <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="çµæŸé€€å‡º"/>
+ </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="çµæŸé€€å‡º"/>
+ </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="çµæŸé€€å‡º"/>
+ </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="çµæŸé€€å‡º"/>
+ </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="çµæŸé€€å‡º"/>
+ </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="çµæŸé€€å‡º"/>
+ </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="çµæŸé€€å‡º"/>
+ </notification>
+ <global name="UnsupportedCPU">
+ - Your CPU speed does not meet the minimum requirements.
+ </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.
+
+If you continue to have problems, please visit the [SUPPORT_SITE].
+ </global>
+ <global name="UnsupportedCPUAmount">
+ 796
+ </global>
+ <global name="UnsupportedRAMAmount">
+ 510
+ </global>
+ <global name="UnsupportedGPU">
+ - 你的顯示å¡æœªé”系統最低é…å‚™è¦æ±‚。
+ </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.">
+ If you own a piece of land, you can make it your home location.
+Otherwise, you can look at the Map and find places marked &quot;Infohub&quot;.
+ </global>
+ <global name="You died and have been teleported to your home location">
+ You died and have been teleported to your home location.
+ </global>
+</notifications>
diff --git a/indra/newview/skins/default/xui/zh/panel_active_object_row.xml b/indra/newview/skins/default/xui/zh/panel_active_object_row.xml
new file mode 100644
index 0000000000..42a4aa9e85
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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/zh/panel_adhoc_control_panel.xml b/indra/newview/skins/default/xui/zh/panel_adhoc_control_panel.xml
new file mode 100644
index 0000000000..7d16ac4129
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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/zh/panel_avatar_list_item.xml b/indra/newview/skins/default/xui/zh/panel_avatar_list_item.xml
new file mode 100644
index 0000000000..eccb938f15
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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]s
+ </string>
+ <string name="FormatMinutes">
+ [COUNT]m
+ </string>
+ <string name="FormatHours">
+ [COUNT]h
+ </string>
+ <string name="FormatDays">
+ [COUNT]d
+ </string>
+ <string name="FormatWeeks">
+ [COUNT]w
+ </string>
+ <string name="FormatMonths">
+ [COUNT]mon
+ </string>
+ <string name="FormatYears">
+ [COUNT]y
+ </string>
+ <text name="avatar_name" value="(載入)"/>
+ <text name="last_interaction" value="0s"/>
+ <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/zh/panel_avatar_tag.xml b/indra/newview/skins/default/xui/zh/panel_avatar_tag.xml
new file mode 100644
index 0000000000..fd91ea97d1
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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">
+ The quick brown fox jumps over the lazy dog.
+ </text_editor>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_block_list_sidetray.xml b/indra/newview/skins/default/xui/zh/panel_block_list_sidetray.xml
new file mode 100644
index 0000000000..9ef4258f0b
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="List of currently blocked Residents"/>
+ <button label="Block person" name="Block resident..." tool_tip="Pick a Resident to block"/>
+ <button label="Block object by name" name="Block object by name..." tool_tip="Pick an object to block by name"/>
+ <button label="Unblock" name="Unblock" tool_tip="Remove Resident or object from blocked list"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_body_parts_list_item.xml b/indra/newview/skins/default/xui/zh/panel_body_parts_list_item.xml
new file mode 100644
index 0000000000..550868e5e5
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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/zh/panel_bodyparts_list_button_bar.xml b/indra/newview/skins/default/xui/zh/panel_bodyparts_list_button_bar.xml
new file mode 100644
index 0000000000..5e269fcd09
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="Switch" name="switch_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_bottomtray.xml b/indra/newview/skins/default/xui/zh/panel_bottomtray.xml
new file mode 100644
index 0000000000..2b0cd7c0a6
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="Turns microphone on/off"/>
+ <string name="VoiceControlBtnToolTip" value="顯示 / éš±è— èªžéŸ³æŽ§åˆ¶æ¿"/>
+ <layout_stack name="toolbar_stack">
+ <layout_panel name="speak_panel">
+ <talk_button name="talk">
+ <speak_button label="Speak" label_selected="Speak" 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="View" 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="Conversations"/>
+ </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/zh/panel_bottomtray_lite.xml b/indra/newview/skins/default/xui/zh/panel_bottomtray_lite.xml
new file mode 100644
index 0000000000..9833e9ef8b
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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/zh/panel_chat_header.xml b/indra/newview/skins/default/xui/zh/panel_chat_header.xml
new file mode 100644
index 0000000000..7916bf5155
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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/zh/panel_classified_info.xml b/indra/newview/skins/default/xui/zh/panel_classified_info.xml
new file mode 100644
index 0000000000..94edb7ab71
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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 Content
+ </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">
+ [mthnum,datetime,slt]/[day,datetime,slt]/[year,datetime,slt]
+ </panel.string>
+ <panel.string name="auto_renew_on">
+ Enabled
+ </panel.string>
+ <panel.string name="auto_renew_off">
+ Disabled
+ </panel.string>
+ <text name="title" value="Classified Info"/>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <text_editor name="classified_name" value="[name]"/>
+ <text name="classified_location_label" value="ä½ç½®ï¼š"/>
+ <text_editor name="classified_location" value="[loading...]"/>
+ <text name="content_type_label" value="Content Type:"/>
+ <text_editor name="content_type" value="[content type]"/>
+ <text name="category_label" value="Category:"/>
+ <text_editor name="category" value="[category]"/>
+ <text name="creation_date_label" value="Creation date:"/>
+ <text_editor name="creation_date" tool_tip="Creation date" value="[date]"/>
+ <text name="price_for_listing_label" value="Price for listing:"/>
+ <text_editor name="price_for_listing" tool_tip="Price for listing." value="[price]"/>
+ <layout_stack name="descr_stack">
+ <layout_panel name="clickthrough_layout_panel">
+ <text name="click_through_label" value="Clicks:"/>
+ <text_editor name="click_through_text" tool_tip="Click through data" value="[clicks]"/>
+ </layout_panel>
+ <layout_panel name="price_layout_panel">
+ <text name="auto_renew_label" value="Auto renew:"/>
+ <text name="auto_renew" value="Enabled"/>
+ </layout_panel>
+ <layout_panel name="descr_layout_panel">
+ <text name="classified_desc_label" value="æ述:"/>
+ <text_editor name="classified_desc" value="[description]"/>
+ </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/zh/panel_clothing_list_button_bar.xml b/indra/newview/skins/default/xui/zh/panel_clothing_list_button_bar.xml
new file mode 100644
index 0000000000..ba63dada76
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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/zh/panel_clothing_list_item.xml b/indra/newview/skins/default/xui/zh/panel_clothing_list_item.xml
new file mode 100644
index 0000000000..1185336a2d
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="Edit this wearable"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_cof_wearables.xml b/indra/newview/skins/default/xui/zh/panel_cof_wearables.xml
new file mode 100644
index 0000000000..309ab1c0d4
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="Attachments"/>
+ <accordion_tab name="tab_body_parts" title="身體部ä½"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_deletable_wearable_list_item.xml b/indra/newview/skins/default/xui/zh/panel_deletable_wearable_list_item.xml
new file mode 100644
index 0000000000..a9e65419c2
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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/zh/panel_dummy_clothing_list_item.xml b/indra/newview/skins/default/xui/zh/panel_dummy_clothing_list_item.xml
new file mode 100644
index 0000000000..6377bf4135
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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/zh/panel_edit_alpha.xml b/indra/newview/skins/default/xui/zh/panel_edit_alpha.xml
new file mode 100644
index 0000000000..73c59d9ae3
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="Lower Alpha" name="Lower Alpha" tool_tip="點擊以挑é¸åœ–片"/>
+ <texture_picker label="Upper Alpha" name="Upper Alpha" tool_tip="點擊以挑é¸åœ–片"/>
+ <texture_picker label="Head Alpha" name="Head Alpha" tool_tip="點擊以挑é¸åœ–片"/>
+ <texture_picker label="Eye Alpha" name="Eye Alpha" tool_tip="點擊以挑é¸åœ–片"/>
+ <texture_picker label="Hair Alpha" name="Hair Alpha" tool_tip="點擊以挑é¸åœ–片"/>
+ </panel>
+ </scroll_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_edit_classified.xml b/indra/newview/skins/default/xui/zh/panel_edit_classified.xml
new file mode 100644
index 0000000000..e749d9e3e7
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_edit_classified.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Edit Classified" name="panel_edit_classified">
+ <panel.string name="location_notice">
+ (儲存後將會更新)
+ </panel.string>
+ <string name="publish_label">
+ Publish
+ </string>
+ <string name="save_label">
+ 儲存
+ </string>
+ <text name="title">
+ Edit Classified
+ </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:">
+ Title:
+ </text>
+ <text name="description_label">
+ æ述:
+ </text>
+ <text name="location_label">
+ ä½ç½®ï¼š
+ </text>
+ <text name="classified_location">
+ 載入中...
+ </text>
+ <button label="Set to Current Location" name="set_to_curr_location_btn"/>
+ <text name="category_label" value="Category:"/>
+ <text name="content_type_label" value="Content type:"/>
+ <icons_combo_box label="General Content" name="content_type">
+ <icons_combo_box.item label="Moderate Content" name="mature_ci" value="Mature"/>
+ <icons_combo_box.item label="General Content" name="pg_ci" value="PG"/>
+ </icons_combo_box>
+ <check_box label="Auto renew each week" name="auto_renew"/>
+ <text name="price_for_listing_label" value="Price for listing:"/>
+ <spinner label="L$" name="price_for_listing" tool_tip="Price for listing." 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/zh/panel_edit_eyes.xml b/indra/newview/skins/default/xui/zh/panel_edit_eyes.xml
new file mode 100644
index 0000000000..99e2874319
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="Iris" 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/zh/panel_edit_gloves.xml b/indra/newview/skins/default/xui/zh/panel_edit_gloves.xml
new file mode 100644
index 0000000000..9c542366bc
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="Color/Tint" name="Color/Tint" tool_tip="Click to open color picker"/>
+ </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/zh/panel_edit_hair.xml b/indra/newview/skins/default/xui/zh/panel_edit_hair.xml
new file mode 100644
index 0000000000..d9ddafac3b
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="Style"/>
+ <accordion_tab name="hair_eyebrows_tab" title="Eyebrows"/>
+ <accordion_tab name="hair_facial_tab" title="Facial"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_edit_jacket.xml b/indra/newview/skins/default/xui/zh/panel_edit_jacket.xml
new file mode 100644
index 0000000000..df85f7deb2
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="Color/Tint" name="Color/Tint" tool_tip="Click to open color picker"/>
+ </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/zh/panel_edit_pants.xml b/indra/newview/skins/default/xui/zh/panel_edit_pants.xml
new file mode 100644
index 0000000000..76560256f7
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="Color/Tint" 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/zh/panel_edit_physics.xml b/indra/newview/skins/default/xui/zh/panel_edit_physics.xml
new file mode 100644
index 0000000000..77ee4fd36d
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="Breasts Bounce"/>
+ <accordion_tab name="physics_breasts_inout_tab" title="Breasts Cleavage"/>
+ <accordion_tab name="physics_breasts_leftright_tab" title="Breasts Sway"/>
+ <accordion_tab name="physics_belly_tab" title="Belly Bounce"/>
+ <accordion_tab name="physics_butt_tab" title="Butt Bounce"/>
+ <accordion_tab name="physics_butt_leftright_tab" title="Butt Sway"/>
+ <accordion_tab name="physics_advanced_tab" title="進階åƒæ•¸"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_edit_pick.xml b/indra/newview/skins/default/xui/zh/panel_edit_pick.xml
new file mode 100644
index 0000000000..a624877ab3
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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/zh/panel_edit_profile.xml b/indra/newview/skins/default/xui/zh/panel_edit_profile.xml
new file mode 100644
index 0000000000..2258e51b85
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="Resident"/>
+ <string name="AcctTypeTrial" value="Trial"/>
+ <string name="AcctTypeCharterMember" value="Charter Member"/>
+ <string name="AcctTypeEmployee" value="Linden Lab Employee"/>
+ <string name="PaymentInfoUsed" value="Payment Info Used"/>
+ <string name="PaymentInfoOnFile" value="Payment Info On File"/>
+ <string name="NoPaymentInfoOnFile" value="No Payment Info On File"/>
+ <string name="AgeVerified" value="Age-verified"/>
+ <string name="NotAgeVerified" value="Not Age-verified"/>
+ <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="Display Name:"/>
+ <text name="solo_username_label" value="使用者å稱:"/>
+ <button name="set_name" tool_tip="Set Display Name"/>
+ <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="Resident. No payment info on file."/>
+ <text name="my_account_link" value="[[URL] å‰å¾€æˆ‘的塗鴉牆]"/>
+ <text name="title_partner_text" value="我的é…å¶ï¼š"/>
+ <panel name="partner_data_panel">
+ <text initial_value="(retrieving)" 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/zh/panel_edit_shape.xml b/indra/newview/skins/default/xui/zh/panel_edit_shape.xml
new file mode 100644
index 0000000000..f249100786
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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/zh/panel_edit_shirt.xml b/indra/newview/skins/default/xui/zh/panel_edit_shirt.xml
new file mode 100644
index 0000000000..ecfc1e2fad
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="Color/Tint" 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/zh/panel_edit_shoes.xml b/indra/newview/skins/default/xui/zh/panel_edit_shoes.xml
new file mode 100644
index 0000000000..7bf923b4ca
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="Color/Tint" name="Color/Tint" tool_tip="Click to open color picker"/>
+ </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/zh/panel_edit_skin.xml b/indra/newview/skins/default/xui/zh/panel_edit_skin.xml
new file mode 100644
index 0000000000..22f0279060
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="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">
+ <accordion_tab name="skin_color_tab" title="Skin Color"/>
+ <accordion_tab name="skin_face_tab" title="Face Detail"/>
+ <accordion_tab name="skin_makeup_tab" title="Makeup"/>
+ <accordion_tab name="skin_body_tab" title="Body Detail"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_edit_skirt.xml b/indra/newview/skins/default/xui/zh/panel_edit_skirt.xml
new file mode 100644
index 0000000000..5c46f94fe9
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="Color/Tint" 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/zh/panel_edit_socks.xml b/indra/newview/skins/default/xui/zh/panel_edit_socks.xml
new file mode 100644
index 0000000000..09c888f226
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="Color/Tint" 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/zh/panel_edit_tattoo.xml b/indra/newview/skins/default/xui/zh/panel_edit_tattoo.xml
new file mode 100644
index 0000000000..946f8b22dc
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="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
new file mode 100644
index 0000000000..82ab70bafc
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="Color/Tint" name="Color/Tint" tool_tip="Click to open color picker"/>
+ </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/zh/panel_edit_undershirt.xml b/indra/newview/skins/default/xui/zh/panel_edit_undershirt.xml
new file mode 100644
index 0000000000..b284668777
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="Color/Tint" name="Color/Tint" tool_tip="Click to open Color Picker"/>
+ </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/zh/panel_edit_wearable.xml b/indra/newview/skins/default/xui/zh/panel_edit_wearable.xml
new file mode 100644
index 0000000000..936a2651ab
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_edit_wearable.xml
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Wearable" name="panel_edit_wearable">
+ <string name="edit_shape_title">
+ Editing Shape
+ </string>
+ <string name="edit_skin_title">
+ Editing Skin
+ </string>
+ <string name="edit_hair_title">
+ Editing Hair
+ </string>
+ <string name="edit_eyes_title">
+ Editing Eyes
+ </string>
+ <string name="edit_shirt_title">
+ Editing Shirt
+ </string>
+ <string name="edit_pants_title">
+ Editing Pants
+ </string>
+ <string name="edit_shoes_title">
+ Editing Shoes
+ </string>
+ <string name="edit_socks_title">
+ Editing Socks
+ </string>
+ <string name="edit_jacket_title">
+ Editing Jacket
+ </string>
+ <string name="edit_skirt_title">
+ Editing Skirt
+ </string>
+ <string name="edit_gloves_title">
+ Editing Gloves
+ </string>
+ <string name="edit_undershirt_title">
+ Editing Undershirt
+ </string>
+ <string name="edit_underpants_title">
+ Editing Underpants
+ </string>
+ <string name="edit_alpha_title">
+ Editing Alpha Mask
+ </string>
+ <string name="edit_tattoo_title">
+ Editing Tattoo
+ </string>
+ <string name="edit_physics_title">
+ Editing Physics
+ </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">
+ Alpha Mask:
+ </string>
+ <string name="tattoo_desc_text">
+ 刺é’:
+ </string>
+ <string name="physics_desc_text">
+ Physics:
+ </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/zh/panel_group_control_panel.xml b/indra/newview/skins/default/xui/zh/panel_group_control_panel.xml
new file mode 100644
index 0000000000..1e3c18f522
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="Call Group" name="call_btn"/>
+ </layout_panel>
+ <layout_panel name="end_call_btn_panel">
+ <button label="Leave Call" name="end_call_btn"/>
+ </layout_panel>
+ <layout_panel name="voice_ctrls_btn_panel">
+ <button label="Open Voice Controls" name="voice_ctrls_btn"/>
+ </layout_panel>
+ </layout_stack>
+</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
new file mode 100644
index 0000000000..a97a35056b
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_group_general.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="一般" name="general_tab">
+ <panel.string name="help_text">
+ The General tab contains general information about this group, a list of members, general Group Preferences and member options.
+
+Hover your mouse over the options for more help.
+ </panel.string>
+ <panel.string name="group_info_unchanged">
+ 一般社團資訊已經被變更
+ </panel.string>
+ <panel.string name="incomplete_member_data_str">
+ Retrieving member data
+ </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">
+ Group 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="Sets the title that appears in your avatar&apos;s name tag when this group is active."/>
+ <check_box label="接å—社團通知" name="receive_notices" tool_tip="Sets whether you want to receive Notices from this group. Uncheck this box if this group is spamming you."/>
+ <check_box label="顯示在我的檔案中" name="list_groups_in_profile" tool_tip="Sets whether you want to show this group in your profile"/>
+ <panel name="preferences_container">
+ <text name="group_settngs_label">
+ 社團
+ </text>
+ <check_box label="任何人都å¯ä»¥åŠ å…¥" name="open_enrollement" tool_tip="Sets whether this group allows new members to join without being invited."/>
+ <check_box label="加入費用" name="check_enrollment_fee" tool_tip="Sets whether to require an enrollment fee to join the group"/>
+ <spinner label="L$" name="spin_enrollment_fee" tool_tip="New members must pay this fee to join the group when Enrollment Fee is checked."/>
+ <combo_box name="group_mature_check" tool_tip="Sets whether your group contains information rated as Moderate">
+ <combo_item name="select_mature">
+ - é¸æ“‡å…§å®¹åˆ†ç´š -
+ </combo_item>
+ <combo_box.item label="Moderate Content" 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"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/zh/panel_group_info_sidetray.xml
new file mode 100644
index 0000000000..320645ea5e
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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">
+ There are unsaved changes
+ </panel.string>
+ <panel.string name="want_apply_text">
+ Do you want to save these changes?
+ </panel.string>
+ <panel.string name="group_join_btn">
+ Join (L$[AMOUNT])
+ </panel.string>
+ <panel.string name="group_join_free">
+ Free
+ </panel.string>
+ <panel name="group_info_top">
+ <text_editor name="group_name" value="(載入中...)"/>
+ <line_editor label="Type your new group name here" 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="Group Call" name="btn_call" tool_tip="Call this group"/>
+ </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/zh/panel_group_invite.xml b/indra/newview/skins/default/xui/zh/panel_group_invite.xml
new file mode 100644
index 0000000000..a1395f454b
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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">
+ Are you sure you want to invite new owner(s)? This action is permanent!
+ </panel.string>
+ <panel.string name="loading">
+ (載入中...)
+ </panel.string>
+ <panel.string name="already_in_group">
+ Some Residents you chose are already in the group, and so were not sent an invitation.
+ </panel.string>
+ <text name="help_text">
+ You can select multiple Residents to invite to your group. Click &apos;Open Resident Chooser&apos; to start.
+ </text>
+ <button label="Open Resident Chooser" name="add_button"/>
+ <name_list name="invitee_list" tool_tip="Hold the Ctrl key and click Resident names to multi-select"/>
+ <button label="Remove Selected from List" name="remove_button" tool_tip="Removes the Residents selected above from the invite list"/>
+ <text name="role_text">
+ Choose what Role to assign them to:
+ </text>
+ <combo_box name="role_name" tool_tip="Choose from the list of Roles you are allowed to assign members to"/>
+ <button label="é€å‡ºé‚€è«‹" name="ok_button"/>
+ <button label="å–消" name="cancel_button"/>
+ <string name="GroupInvitation">
+ 社團邀請
+ </string>
+</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
new file mode 100644
index 0000000000..58022c2279
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_group_land_money.xml
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Land &amp; L$" name="land_money_tab">
+ <panel.string name="help_text">
+ A warning appears until the Total Land in Use is less than or = to the Total Contribution.
+ </panel.string>
+ <panel.string name="cant_view_group_land_text">
+ You don&apos;t have permission to view group owned land
+ </panel.string>
+ <panel.string name="epmty_view_group_land_text">
+ No entries
+ </panel.string>
+ <panel.string name="cant_view_group_accounting_text">
+ You don&apos;t have permission to view the group&apos;s accounting information.
+ </panel.string>
+ <panel.string name="loading_txt">
+ 載入中...
+ </panel.string>
+ <panel.string name="land_contrib_error">
+ Unable to set your land contribution
+ </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">
+ Total contribution:
+ </text>
+ <text name="total_contributed_land_value">
+ [AREA] m²
+ </text>
+ <button label="地圖" label_selected="地圖" name="map_button"/>
+ <text name="total_land_in_use_label">
+ Total land in use:
+ </text>
+ <text name="total_land_in_use_value">
+ [AREA] m²
+ </text>
+ <text name="land_available_label">
+ Land available:
+ </text>
+ <text name="land_available_value">
+ [AREA] m²
+ </text>
+ <text name="your_contribution_label">
+ Your contribution:
+ </text>
+ <text name="your_contribution_units">
+ m²
+ </text>
+ <text name="your_contribution_max_value">
+ ([AMOUNT] max)
+ </text>
+ <text name="group_over_limit_text">
+ More land credits are needed to support land in use
+ </text>
+ <text name="group_money_heading">
+ 社團 L$
+ </text>
+ </panel>
+ <tab_container name="group_money_tab_container">
+ <panel label="PLANNING" name="group_money_planning_tab">
+ <text_editor name="group_money_planning_text">
+ 載入中...
+ </text_editor>
+ </panel>
+ <panel label="DETAILS" 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">
+ <text_editor name="group_money_sales_text">
+ 載入中...
+ </text_editor>
+ <button name="earlier_sales_button" tool_tip="Back"/>
+ <button name="later_sales_button" tool_tip="Next"/>
+ </panel>
+ </tab_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_group_list_item.xml b/indra/newview/skins/default/xui/zh/panel_group_list_item.xml
new file mode 100644
index 0000000000..175293cdf7
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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/zh/panel_group_notices.xml b/indra/newview/skins/default/xui/zh/panel_group_notices.xml
new file mode 100644
index 0000000000..65c07e7137
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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">
+ Notices let you send a message and an optionally attached item.
+Notices only go to group members in Roles with the ability to receive Notices.
+You can turn off Notices on the General tab.
+ </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="Refresh list of notices"/>
+ <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="Drag an inventory item onto this target box to send it with this notice. You must have permission to copy and transfer the item in order to attach it."/>
+ </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/zh/panel_group_notify.xml b/indra/newview/skins/default/xui/zh/panel_group_notify.xml
new file mode 100644
index 0000000000..803f34d5a7
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="header" name="header">
+ <text name="title" value="Sender Name / Group Name"/>
+ </panel>
+ <text_editor name="message" value="message"/>
+ <text name="attachment" value="Attachment"/>
+ <button label="確定" name="btn_ok"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_group_roles.xml b/indra/newview/skins/default/xui/zh/panel_group_roles.xml
new file mode 100644
index 0000000000..fff4383893
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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">
+ There are unsaved changes
+ </panel.string>
+ <panel.string name="want_apply_text">
+ Do you want to save your changes?
+ </panel.string>
+ <tab_container name="roles_tab_container">
+ <panel label="æˆå“¡" name="members_sub_tab" tool_tip="æˆå“¡">
+ <panel.string name="help_text">
+ You can add or remove Roles assigned to Members.
+Select multiple Members by holding the Ctrl key and
+clicking on their names.
+ </panel.string>
+ <panel.string name="donation_area">
+ [AREA] m²
+ </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">
+ Roles have a title and an allowed list of Abilities
+that Members can perform. Members can belong to
+one or more Roles. A group can have up to 10 Roles,
+including the Everyone and Owner Roles.
+ </panel.string>
+ <panel.string name="cant_delete_role">
+ The &apos;Everyone&apos; and &apos;Owners&apos; Roles are special and can&apos;t be deleted.
+ </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="You can view an Ability&apos;s Description and which Roles and Members can execute the Ability.">
+ <panel.string name="help_text">
+ Abilities allow Members in Roles to do specific
+things in this group. There&apos;s a broad variety of Abilities.
+ </panel.string>
+ <filter_editor label="能力éŽæ¿¾å™¨" name="filter_input"/>
+ <scroll_list name="action_list" tool_tip="Select an Ability to view more details"/>
+ </panel>
+ </tab_container>
+ <panel name="members_footer">
+ <text name="static">
+ Assigned Roles
+ </text>
+ <text name="static2">
+ Allowed Abilities
+ </text>
+ <scroll_list name="member_allowed_actions" tool_tip="For details of each allowed ability see the abilities tab"/>
+ </panel>
+ <panel name="roles_footer">
+ <text name="static">
+ 角色å稱
+ </text>
+ <text name="static3">
+ 角色頭銜
+ </text>
+ <text name="static2">
+ æè¿°
+ </text>
+ <text name="static4">
+ Assigned Members
+ </text>
+ <check_box label="Reveal members" name="role_visible_in_list" tool_tip="Sets whether members of this role are visible in the General tab to people outside of the group."/>
+ <text name="static5">
+ Allowed Abilities
+ </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_editor name="action_description">
+ This Ability is &apos;Eject Members from this Group&apos;. Only an Owner can eject another Owner.
+ </text_editor>
+ <text name="static2">
+ Roles with this ability
+ </text>
+ <text name="static3">
+ Members with this ability
+ </text>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_im_control_panel.xml b/indra/newview/skins/default/xui/zh/panel_im_control_panel.xml
new file mode 100644
index 0000000000..703182e04d
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="Offer to teleport this person"/>
+ </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/zh/panel_instant_message.xml b/indra/newview/skins/default/xui/zh/panel_instant_message.xml
new file mode 100644
index 0000000000..cf9bc7fccb
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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/zh/panel_inventory_item.xml b/indra/newview/skins/default/xui/zh/panel_inventory_item.xml
new file mode 100644
index 0000000000..d18047fbcf
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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/zh/panel_landmark_info.xml b/indra/newview/skins/default/xui/zh/panel_landmark_info.xml
new file mode 100644
index 0000000000..d86ba7bc7c
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="(N\A)"/>
+ <string name="unknown" value="(未知)"/>
+ <string name="public" value="(公開)"/>
+ <string name="server_update_text">
+ Place information not available without server update.
+ </string>
+ <string name="server_error_text">
+ Information about this location is unavailable at this time, please try again later.
+ </string>
+ <string name="server_forbidden_text">
+ Information about this location is unavailable due to access restrictions. Please check your permissions with the parcel owner.
+ </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="Back"/>
+ <text name="title" value="地點檔案"/>
+ <scroll_container name="place_scroll">
+ <panel name="scrolling_panel">
+ <text name="region_title" value="SampleRegion"/>
+ <text name="parcel_title" value="SampleParcel, Name Long (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="Title:"/>
+ <text name="notes_label" value="My notes:"/>
+ <text name="folder_label" value="地標ä½ç½®ï¼š"/>
+ </panel>
+ </panel>
+ </scroll_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_landmarks.xml b/indra/newview/skins/default/xui/zh/panel_landmarks.xml
new file mode 100644
index 0000000000..fa907e3d90
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="Library"/>
+ </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="Show additional options"/>
+ </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/zh/panel_login.xml b/indra/newview/skins/default/xui/zh/panel_login.xml
index 9d094ff731..b227fbcfc8 100644
--- a/indra/newview/skins/default/xui/zh/panel_login.xml
+++ b/indra/newview/skins/default/xui/zh/panel_login.xml
@@ -1,29 +1,36 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_login">
+<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>
+ </text>
+ <combo_box name="username_combo" tool_tip="使用者å稱是你註冊時所挑é¸çš„,åƒæ˜¯ bobsmith12 或 Steller Sunshine"/>
<text name="password_text">
密碼:
</text>
- <check_box label="記ä½å¯†ç¢¼" name="remember_check"/>
+ <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 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="MyLastLocation"/>
<combo_box.item label="我的家" name="MyHome"/>
- <combo_box.item label="&lt;輸入å€åŸŸå&gt;" name="Typeregionname"/>
+ <combo_box.item label="&lt; 請輸入地å€å稱 &gt;" name="Typeregionname"/>
</combo_box>
</layout_panel>
<layout_panel name="links">
@@ -31,10 +38,10 @@
註冊
</text>
<text name="forgot_password_text">
- 忘記使用者å稱或密碼?
+ 忘記你的使用者å稱或密碼?
</text>
<text name="login_help">
- 如何登入?
+ 登入時需è¦å¹«åŠ©ï¼Ÿ
</text>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/zh/panel_main_inventory.xml b/indra/newview/skins/default/xui/zh/panel_main_inventory.xml
new file mode 100644
index 0000000000..f7dada226f
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_main_inventory.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Things" name="main inventory panel">
+ <panel.string name="ItemcountFetching">
+ Fetching [ITEM_COUNT] Items... [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/zh/panel_me.xml b/indra/newview/skins/default/xui/zh/panel_me.xml
new file mode 100644
index 0000000000..a236dfc17a
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_me.xml
@@ -0,0 +1,7 @@
+<?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>
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
new file mode 100644
index 0000000000..059a78cf7d
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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">
+ (This page does not pass the specified whitelist)
+ </text>
+ <line_editor name="home_url" tool_tip="The home page for this media source"/>
+ <text name="preview_label">
+ é è¦½
+ </text>
+ <text name="current_url_label">
+ ç›®å‰é é¢ï¼š
+ </text>
+ <text name="current_url" tool_tip="The current page for this media source" value=""/>
+ <button label="Reset" 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"/>
+ <text name="media_setting_note">
+ Note: Residents can override this setting
+ </text>
+ <check_box initial_value="false" label="Auto Scale Media on Face of Object" name="auto_scale"/>
+ <text name="size_label">
+ 尺寸:
+ </text>
+ <text name="X_label">
+ X
+ </text>
+</panel>
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
new file mode 100644
index 0000000000..3645f471ce
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="false" label="Allow Navigation &amp; Interactivity" 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_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_control"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_media_settings_security.xml b/indra/newview/skins/default/xui/zh/panel_media_settings_security.xml
new file mode 100644
index 0000000000..ef56c34b5c
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_media_settings_security.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Security" name="Media Settings Security">
+ <check_box initial_value="false" label="Only Allow Access to Specified URL patterns" name="whitelist_enable"/>
+ <text name="home_url_fails_some_items_in_whitelist">
+ Entries that the home page fails against are marked:
+ </text>
+ <button label="Add" name="whitelist_add"/>
+ <button label="刪除" name="whitelist_del"/>
+ <text name="home_url_fails_whitelist">
+ Warning: the home page specified in the General tab fails to pass this whitelist. It has been disabled until a valid entry has been added.
+ </text>
+</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
new file mode 100644
index 0000000000..e26ccdef73
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_my_profile.xml
@@ -0,0 +1,42 @@
+<?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_navigation_bar.xml b/indra/newview/skins/default/xui/zh/panel_navigation_bar.xml
new file mode 100644
index 0000000000..1748d117f4
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_navigation_bar.xml
@@ -0,0 +1,18 @@
+<?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="Drag Landmarks here for quick access to your favorite places in Second Life!">
+ <label name="favorites_bar_label" tool_tip="Drag Landmarks here for quick access to your favorite places in Second Life!">
+ 最愛列
+ </label>
+ <chevron_button name="&gt;&gt;" tool_tip="顯示更多我的最愛"/>
+ </favorites_bar>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_nearby_chat_bar.xml b/indra/newview/skins/default/xui/zh/panel_nearby_chat_bar.xml
new file mode 100644
index 0000000000..3cabfcfaba
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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/zh/panel_nearby_media.xml b/indra/newview/skins/default/xui/zh/panel_nearby_media.xml
new file mode 100644
index 0000000000..5ab6837569
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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 media items)
+ </string>
+ <string name="empty_item_text">
+ &lt;empty&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="Bring up media prefs"/>
+ <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="In this Parcel" name="WithinParcel"/>
+ <combo_box.item label="Outside this Parcel" name="OutsideParcel"/>
+ <combo_box.item label="On other Avatars" name="OnOthers"/>
+ </combo_box>
+ <scroll_list name="media_list">
+ <scroll_list.columns label="Proximity" name="media_proximity"/>
+ <scroll_list.columns label="Visible" name="media_visibility"/>
+ <scroll_list.columns label="Class" 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="Audio volume for selected media"/>
+ </layout_panel>
+ <layout_panel name="mute">
+ <button name="mute_btn" tool_tip="Mute audio on selected media"/>
+ </layout_panel>
+ <layout_panel name="zoom">
+ <button name="zoom_btn" tool_tip="Zoom into selected media"/>
+ </layout_panel>
+ <layout_panel name="unzoom">
+ <button name="unzoom_btn" tool_tip="Zoom back from selected media"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_notes.xml b/indra/newview/skins/default/xui/zh/panel_notes.xml
new file mode 100644
index 0000000000..f68fd74d1f
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_notes.xml
@@ -0,0 +1,35 @@
+<?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="Offer teleport"/>
+ </layout_panel>
+ </layout_stack>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_notify_textbox.xml b/indra/newview/skins/default/xui/zh/panel_notify_textbox.xml
new file mode 100644
index 0000000000..01a8210338
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_notify_textbox.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="å³æ™‚訊æ¯" 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/zh/panel_online_status_toast.xml b/indra/newview/skins/default/xui/zh/panel_online_status_toast.xml
new file mode 100644
index 0000000000..a5d3afccb9
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_online_status_toast.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="朋å‹_上線_狀態" name="friend_online_status"/>
diff --git a/indra/newview/skins/default/xui/zh/panel_outfit_edit.xml b/indra/newview/skins/default/xui/zh/panel_outfit_edit.xml
new file mode 100644
index 0000000000..263106d13a
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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">
+ (N\A)
+ </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="[Current Outfit]"/>
+ </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="Visit the SL Marketplace. You can also select something you are wearing, then click here to see more things like it"/>
+ </panel>
+ <panel name="add_wearables_button_bar">
+ <button name="shop_btn_2" tool_tip="Visit the SL Marketplace. You can also select something you are wearing, then click here to see more things like it"/>
+ </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="Revert to last saved version"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</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
new file mode 100644
index 0000000000..dfd81a85cc
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_outfits_inventory.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Things" name="Outfits">
+ <panel.string name="wear_outfit_tooltip">
+ 穿上所é¸æ“‡çš„è£æ‰®
+ </panel.string>
+ <panel.string name="wear_items_tooltip">
+ Wear selected items
+ </panel.string>
+ <tab_container name="appearance_tabs">
+ <panel label="我的è£æ‰®" name="outfitslist_tab"/>
+ <panel label="WEARING" 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="Wear" name="wear_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_outfits_inventory_gear_default.xml b/indra/newview/skins/default/xui/zh/panel_outfits_inventory_gear_default.xml
new file mode 100644
index 0000000000..92ec774f9b
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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/zh/panel_outfits_list.xml b/indra/newview/skins/default/xui/zh/panel_outfits_list.xml
new file mode 100644
index 0000000000..a4b041469b
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_outfits_list.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="Outfits">
+ <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/zh/panel_outfits_wearing.xml b/indra/newview/skins/default/xui/zh/panel_outfits_wearing.xml
new file mode 100644
index 0000000000..39a9bcb848
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="Show additional options"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_people.xml b/indra/newview/skins/default/xui/zh/panel_people.xml
new file mode 100644
index 0000000000..4c6d6c76be
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_people.xml
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Side tray panel -->
+<panel label="People" 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]."/>
+ <string name="no_one_filtered_near" value="Didn&apos;t find what you&apos;re looking for? Try [secondlife:///app/search/people/[SEARCH_TERM] Search]."/>
+ <string name="no_friends_online" value="無朋å‹ä¸Šç·š"/>
+ <string name="no_friends" value="無朋å‹"/>
+ <string name="no_friends_msg">
+ Find friends using [secondlife:///app/search/people Search] or right-click on a Resident to add them as a friend.
+Looking for people to hang out with? Try the [secondlife:///app/worldmap World Map].
+ </string>
+ <string name="no_filtered_friends_msg">
+ Didn&apos;t find what you&apos;re looking for? Try [secondlife:///app/search/people/[SEARCH_TERM] Search].
+ </string>
+ <string name="people_filter_label" value="Filter People"/>
+ <string name="groups_filter_label" value="Filter Groups"/>
+ <string name="no_filtered_groups_msg" value="Didn&apos;t find what you&apos;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 label="Filter" 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="Add selected Resident to your friends List"/>
+ </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="Offer friendship to a Resident"/>
+ </layout_panel>
+ <layout_panel name="trash_btn_panel">
+ <dnd_button name="del_btn" tool_tip="Remove selected person from your Friends list"/>
+ </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="Join group/Create new group"/>
+ <button name="activate_btn" tool_tip="Activate selected group"/>
+ </panel>
+ </panel>
+ <panel label="RECENT" 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="Add selected Resident to your friends List"/>
+ </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="Show picture, groups, and other Residents information"/>
+ </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="Call this Resident"/>
+ </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="Offer teleport"/>
+ </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="Group Chat" name="chat_btn" tool_tip="é–‹å•ŸèŠå¤©æœƒè©±"/>
+ </layout_panel>
+ <layout_panel name="group_call_btn_lp">
+ <button label="Group Call" name="group_call_btn" tool_tip="Call this group"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_pick_info.xml b/indra/newview/skins/default/xui/zh/panel_pick_info.xml
new file mode 100644
index 0000000000..cd4cdbf999
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="[name]"/>
+ <text_editor name="pick_location" value="[loading...]"/>
+ <text_editor name="pick_desc" value="[description]"/>
+ </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/zh/panel_picks.xml b/indra/newview/skins/default/xui/zh/panel_picks.xml
new file mode 100644
index 0000000000..a233092dc2
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="No Classifieds"/>
+ <accordion name="accordion">
+ <accordion_tab name="tab_picks" title="ç²¾é¸åœ°é»ž"/>
+ <accordion_tab name="tab_classifieds" title="Classifieds"/>
+ </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/zh/panel_place_profile.xml b/indra/newview/skins/default/xui/zh/panel_place_profile.xml
new file mode 100644
index 0000000000..aa7b036398
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_place_profile.xml
@@ -0,0 +1,116 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="place_profile">
+ <string name="on" value="On"/>
+ <string name="off" value="Off"/>
+ <string name="anyone" value="Anyone"/>
+ <string name="available" value="available"/>
+ <string name="allocated" value="allocated"/>
+ <string name="title_place" value="地點檔案"/>
+ <string name="title_teleport_history" value="瞬間傳é€æ­·å²ç´€éŒ„"/>
+ <string name="not_available" value="(N\A)"/>
+ <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="m²"/>
+ <string name="all_residents_text" value="全部居民"/>
+ <string name="group_text" value="社團"/>
+ <string name="can_resell">
+ Purchased land in this region may be resold.
+ </string>
+ <string name="can_not_resell">
+ Purchased land in this region may not be resold.
+ </string>
+ <string name="can_change">
+ Purchased land in this region may be joined or subdivided.
+ </string>
+ <string name="can_not_change">
+ Purchased land in this region may not be joined or subdivided.
+ </string>
+ <string name="server_update_text">
+ Place information not available without server update.
+ </string>
+ <string name="server_error_text">
+ Information about this location is unavailable at this time, please try again later.
+ </string>
+ <string name="server_forbidden_text">
+ Information about this location is unavailable due to access restrictions. Please check your permissions with the parcel owner.
+ </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="Back"/>
+ <text name="title" value="地點檔案"/>
+ <scroll_container name="place_scroll">
+ <panel name="scrolling_panel">
+ <text name="region_title" value="SampleRegion"/>
+ <text name="parcel_title" value="SampleParcel, Name Long (145, 228, 26)"/>
+ <expandable_text name="description" value="Du waltz die spritz"/>
+ <text name="owner_label" value="æ“有者:"/>
+ <text name="owner_value" value="Alex Superduperlongenamenton"/>
+ <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="Voice:"/>
+ <text name="voice_value" value="On"/>
+ <text name="fly_label" value="飛行:"/>
+ <text name="fly_value" value="On"/>
+ <text name="push_label" value="推撞:"/>
+ <text name="push_value" value="Off"/>
+ <text name="build_label" value="建造:"/>
+ <text name="build_value" value="On"/>
+ <text name="scripts_label" value="腳本:"/>
+ <text name="scripts_value" value="On"/>
+ <text name="damage_label" value="Damage:"/>
+ <text name="damage_value" value="Off"/>
+ <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="Mooseland"/>
+ <text name="region_type_label" value="類型:"/>
+ <text name="region_type" value="Moose"/>
+ <text name="region_rating_label" value="分級:"/>
+ <text name="region_rating" value="æˆäºº"/>
+ <text name="region_owner_label" value="æ“有者:"/>
+ <text name="region_owner" value="moose Van Moose extra long name moose"/>
+ <text name="region_group_label" value="社團:"/>
+ <text name="region_group">
+ The Mighty Moose of mooseville soundvillemoose
+ </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="Testing owner name length with long name"/>
+ <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="Primitives:"/>
+ <text name="parcel_scripts_label" value="腳本:"/>
+ <text name="terraform_limits_label" value="Terraform limits:"/>
+ <text name="subdivide_label" value="Subdivide/Join ability:"/>
+ <text name="resale_label" value="ReSale ability:"/>
+ <text name="sale_to_label" value="出售給:"/>
+ </panel>
+ </accordion_tab>
+ </accordion>
+ </panel>
+ </scroll_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_places.xml b/indra/newview/skins/default/xui/zh/panel_places.xml
new file mode 100644
index 0000000000..c141201ab2
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="Show the corresponding area on the World Map"/>
+ </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_ls3">
+ <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/zh/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/zh/panel_preferences_advanced.xml
new file mode 100644
index 0000000000..c5dce10d63
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_preferences_advanced.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<panel label="進階" name="advanced">
+ <panel.string name="aspect_ratio_text">
+ [NUM]:[DEN]
+ </panel.string>
+ <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/zh/panel_preferences_alerts.xml b/indra/newview/skins/default/xui/zh/panel_preferences_alerts.xml
new file mode 100644
index 0000000000..94eb3c1389
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="當我花費或å–å¾— L$" 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/zh/panel_preferences_chat.xml b/indra/newview/skins/default/xui/zh/panel_preferences_chat.xml
new file mode 100644
index 0000000000..c691edb11c
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_preferences_chat.xml
@@ -0,0 +1,57 @@
+<?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="true" label="èŠå¤©æ™‚播放打字動作" name="play_typing_animation"/>
+ <check_box label="當我離線時將收到的 IM 訊æ¯éƒµå¯„給我" name="send_im_to_email"/>
+ <check_box label="Enable plain text IM and chat history" name="plain_text_chat_history"/>
+ <check_box label="èŠå¤©æ³¡æ³¡" name="bubble_text_chat"/>
+ <text name="show_ims_in_label">
+ 顯示 IMs 於:
+ </text>
+ <text name="requires_restart_label">
+ (須é‡æ–°å•Ÿå‹•ï¼‰
+ </text>
+ <radio_group name="chat_window" tool_tip="顯示你的å³æ™‚訊æ¯åœ¨åˆ†é–‹çš„浮動視窗,或是使用很多é ç±¤çš„單一浮動視窗(須é‡æ–°å•Ÿå‹•ï¼‰">
+ <radio_item label="分開視窗" name="radio" value="0"/>
+ <radio_item label="é ç±¤" name="radio2" value="1"/>
+ </radio_group>
+ <text name="disable_toast_label">
+ Enable incoming chat popups:
+ </text>
+ <check_box label="Group Chats" name="EnableGroupChatPopups" tool_tip="Check to see popups when a Group Chat message arrives"/>
+ <check_box label="IM èŠå¤©" name="EnableIMChatPopups" tool_tip="Check to see popups when an instant message arrives"/>
+ <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">
+ Use machine translation while chatting (powered by 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 (Danish)" name="Danish"/>
+ <combo_box.item label="Deutsch (German)" name="German"/>
+ <combo_box.item label="Español (Spanish)" name="Spanish"/>
+ <combo_box.item label="Français (French)" name="French"/>
+ <combo_box.item label="Italiano (Italian)" name="Italian"/>
+ <combo_box.item label="Magyar (Hungarian)" name="Hungarian"/>
+ <combo_box.item label="Nederlands (Dutch)" name="Dutch"/>
+ <combo_box.item label="Polski (Polish)" name="Polish"/>
+ <combo_box.item label="Português (Portuguese)" name="Portugese"/>
+ <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="日本語 (Japanese)" name="Japanese"/>
+ <combo_box.item label="한국어 (Korean)" name="Korean"/>
+ </combo_box>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_preferences_colors.xml b/indra/newview/skins/default/xui/zh/panel_preferences_colors.xml
new file mode 100644
index 0000000000..8d92eadd20
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_preferences_colors.xml
@@ -0,0 +1,41 @@
+<?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_box7">
+ æ“有者
+ </text>
+ <text name="text_box9">
+ URLs
+ </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/zh/panel_preferences_general.xml b/indra/newview/skins/default/xui/zh/panel_preferences_general.xml
new file mode 100644
index 0000000000..b7449dad10
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_preferences_general.xml
@@ -0,0 +1,74 @@
+<?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="英語" 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>
+ <text name="language_textbox2">
+ (須é‡æ–°å•Ÿå‹•ï¼‰
+ </text>
+ <text name="maturity_desired_prompt">
+ 我想è¦èƒ½é€²å‡ºå…§å®¹åˆ†ç´šçš„地å€ç‚ºï¼š
+ </text>
+ <combo_box name="maturity_desired_combobox">
+ <combo_box.item label="General, Moderate, Adult" name="Desired_Adult"/>
+ <combo_box.item label="General and Moderate" 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="true" label="登入時顯示" name="show_location_checkbox"/>
+ <text name="name_tags_textbox">
+ å稱標籤:
+ </text>
+ <radio_group name="Name_Tag_Preference">
+ <radio_item label="Off" name="radio" value="0"/>
+ <radio_item label="On" 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 或æˆå“¡"/>
+ <check_box label="高亮顯示朋å‹" name="show_friends" tool_tip="高亮顯示你朋å‹çš„å稱標籤"/>
+ <check_box label="View Display Names" name="display_names_check" tool_tip="Check to use display names in chat, IM, name tags, etc."/>
+ <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/zh/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/zh/panel_preferences_graphics1.xml
new file mode 100644
index 0000000000..8c728bf779
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_preferences_graphics1.xml
@@ -0,0 +1,102 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="圖形" name="Display panel">
+ <text name="QualitySpeed">
+ Quality and speed:
+ </text>
+ <text name="FasterText">
+ Faster
+ </text>
+ <text name="BetterText">
+ Better
+ </text>
+ <text name="ShadersPrefText">
+ Low
+ </text>
+ <text name="ShadersPrefText2">
+ Mid
+ </text>
+ <text name="ShadersPrefText3">
+ High
+ </text>
+ <text name="ShadersPrefText4">
+ Ultra
+ </text>
+ <panel label="自訂圖形" name="CustomGraphics Panel">
+ <text name="ShadersText">
+ Shaders:
+ </text>
+ <check_box initial_value="true" label="Transparent Water" name="TransparentWater"/>
+ <check_box initial_value="true" label="Bump mapping and shiny" name="BumpShiny"/>
+ <check_box initial_value="true" label="Basic shaders" name="BasicShaders" tool_tip="Disabling this option may prevent some graphics card drivers from crashing"/>
+ <check_box initial_value="true" label="Atmospheric shaders" name="WindLightUseAtmosShaders"/>
+ <text name="reflection_label">
+ Water Reflections:
+ </text>
+ <combo_box name="Reflections">
+ <combo_box.item label="Minimal" name="0"/>
+ <combo_box.item label="Terrain and trees" name="1"/>
+ <combo_box.item label="全部éœæ…‹ç‰©ä»¶" name="2"/>
+ <combo_box.item label="全部化身與物件" name="3"/>
+ <combo_box.item label="Everything" name="4"/>
+ </combo_box>
+ <slider label="Avatar Physics:" name="AvatarPhysicsDetail"/>
+ <text name="AvatarPhysicsDetailText">
+ Low
+ </text>
+ <slider label="æ繪è·é›¢ï¼š" name="DrawDistance"/>
+ <text name="DrawDistanceMeterText2">
+ m
+ </text>
+ <slider label="Max. particle count:" name="MaxParticleCount"/>
+ <slider label="Max. # of non-impostor avatars:" name="MaxNumberAvatarDrawn"/>
+ <slider label="Post process quality:" name="RenderPostProcess"/>
+ <text name="MeshDetailText">
+ Mesh detail:
+ </text>
+ <slider label="Objects:" name="ObjectMeshDetail"/>
+ <slider label="Flexiprims:" name="FlexibleMeshDetail"/>
+ <slider label="Trees:" name="TreeMeshDetail"/>
+ <slider label="Avatars:" name="AvatarMeshDetail"/>
+ <slider label="Terrain:" name="TerrainMeshDetail"/>
+ <slider label="Sky:" name="SkyMeshDetail"/>
+ <text name="PostProcessText">
+ Low
+ </text>
+ <text name="ObjectMeshDetailText">
+ Low
+ </text>
+ <text name="FlexibleMeshDetailText">
+ Low
+ </text>
+ <text name="TreeMeshDetailText">
+ Low
+ </text>
+ <text name="AvatarMeshDetailText">
+ Low
+ </text>
+ <text name="TerrainMeshDetailText">
+ Low
+ </text>
+ <text name="SkyMeshDetailText">
+ Low
+ </text>
+ <text name="AvatarRenderingText">
+ Avatar Rendering:
+ </text>
+ <check_box initial_value="true" label="Avatar impostors" name="AvatarImpostors"/>
+ <check_box initial_value="true" label="Hardware skinning" name="AvatarVertexProgram"/>
+ <check_box initial_value="true" label="Avatar cloth" name="AvatarCloth"/>
+ <text name="TerrainDetailText">
+ Terrain detail:
+ </text>
+ <radio_group name="TerrainDetailRadio">
+ <radio_item label="Low" name="0"/>
+ <radio_item label="High" name="2"/>
+ </radio_group>
+ --&gt;
+ </panel>
+ <button label="套用" label_selected="套用" name="Apply"/>
+ <button label="Reset" name="Defaults"/>
+ <button label="進階" name="Advanced"/>
+ <button label="硬體" label_selected="硬體" name="GraphicsHardwareButton"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_preferences_move.xml b/indra/newview/skins/default/xui/zh/panel_preferences_move.xml
new file mode 100644
index 0000000000..de296f72f3
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_preferences_move.xml
@@ -0,0 +1,24 @@
+<?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="Use automatic camera positioning when entering and exiting edit mode"/>
+ <check_box label="編輯外觀" name="appearance_camera_movement" tool_tip="Use automatic camera positioning while in edit mode"/>
+ <check_box initial_value="true" label="å´é‚Šæ¬„" name="appearance_sidebar_positioning" tool_tip="Use automatic camera positioning for sidebar"/>
+ <check_box label="將我顯示於第一人稱視角中" name="first_person_avatar_visible"/>
+ <text name=" Mouse Sensitivity">
+ Mouselook mouse sensitivity:
+ </text>
+ <check_box label="å轉" name="invert_mouse"/>
+ <check_box label="總是使用方å‘éµç§»å‹•" name="arrow_keys_move_avatar_check"/>
+ <check_box label="Tap-tap-hold to run" name="tap_tap_hold_to_run"/>
+ <check_box label="雙擊以D:" name="double_click_chkbox"/>
+ <radio_group name="double_click_action">
+ <radio_item label="瞬間傳é€" name="radio_teleport"/>
+ <radio_item label="Auto-pilot" name="radio_autopilot"/>
+ </radio_group>
+ <button label="其他設備" name="joystick_setup_button"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/zh/panel_preferences_privacy.xml
new file mode 100644
index 0000000000..89a1a48abf
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="登入時顯示我最愛的地標ä½ç½®ï¼ˆç¶“ç”± &apos;開始於&apos; 的下拉å¼é¸å–®ï¼‰" 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/zh/panel_preferences_setup.xml b/indra/newview/skins/default/xui/zh/panel_preferences_setup.xml
new file mode 100644
index 0000000000..e7a934c5cc
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_preferences_setup.xml
@@ -0,0 +1,49 @@
+<?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">
+ kbps
+ </text>
+ <check_box label="自訂埠" name="connection_port_enabled"/>
+ <spinner label="埠號:" name="connection_port"/>
+ <text name="cache_size_label_l">
+ å¿«å–尺寸
+ </text>
+ <text name="text_box5">
+ MB
+ </text>
+ <text name="Cache location">
+ å¿«å–ä½ç½®ï¼š
+ </text>
+ <button label="ç€è¦½" label_selected="ç€è¦½" name="set_cache"/>
+ <button label="é‡è¨­" label_selected="é‡è¨­" name="reset_cache"/>
+ <text name="Web:">
+ 網é ï¼š
+ </text>
+ <radio_group name="use_external_browser">
+ <radio_item label="使用我的網é ç€è¦½å™¨ï¼ˆä¾‹å¦‚ IE, Firefox, Safari)" name="external" tool_tip="Use the default system web browser for help, web links, etc. Not recommended if running full screen." value="1"/>
+ <radio_item label="使用內建網é ç€è¦½å™¨" name="internal" tool_tip="Use the built-in web browser for help, web links, etc. This browser opens as a new window inside [APP_NAME]." value=""/>
+ </radio_group>
+ <check_box initial_value="true" label="啟用外掛" name="browser_plugins_enabled"/>
+ <check_box initial_value="true" label="æŽ¥å— cookies" name="cookies_enabled"/>
+ <check_box initial_value="true" label="啟用 Javascript" name="browser_javascript_enabled"/>
+ <check_box initial_value="false" label="啟用媒體ç€è¦½çš„çªé¡¯å¼è¦–窗" name="media_popup_enabled"/>
+ <check_box initial_value="false" label="啟用網é ä»£ç†ä¼ºæœå™¨" name="web_proxy_enabled"/>
+ <text name="Proxy location">
+ 代ç†ä¼ºæœå™¨ä½ç½®ï¼š
+ </text>
+ <line_editor name="web_proxy_editor" tool_tip="The name or IP address of the proxy you would like to use"/>
+ <spinner label="埠號:" name="web_proxy_port"/>
+ <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>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_preferences_sound.xml b/indra/newview/skins/default/xui/zh/panel_preferences_sound.xml
new file mode 100644
index 0000000000..305d1e2ac9
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_preferences_sound.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="è²éŸ³" name="Preference Media panel">
+ <panel.string name="middle_mouse">
+ Middle Mouse
+ </panel.string>
+ <slider label="主音é‡" name="System Volume"/>
+ <check_box initial_value="true" name="mute_when_minimized"/>
+ <text name="mute_chb_label">
+ 最å°åŒ–時éœéŸ³
+ </text>
+ <slider label="按éµéŸ³" name="UI Volume"/>
+ <slider label="Ambient" 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="true"/>
+ <check_box label="播放附加到其他化身身上的媒體" name="media_show_on_others_btn" tool_tip="Uncheck this to hide media attached to other avatars nearby" value="true"/>
+ <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="Toggle speak on/off when I press:" name="push_to_talk_toggle_check" tool_tip="When in toggle mode, press and release the trigger key ONCE to switch your microphone on or off. When not in toggle mode, the microphone broadcasts your voice only while the trigger is being held down."/>
+ <line_editor label="Push-to-Speak trigger" name="modifier_combo"/>
+ <button label="設定按éµ" name="set_voice_hotkey_button"/>
+ <button name="set_voice_middlemouse_button" tool_tip="Reset to Middle Mouse Button"/>
+ <button label="輸入 / 輸出設備" name="device_settings_btn"/>
+ <panel label="設備設定" name="device_settings_panel">
+ <panel.string name="default_text">
+ é è¨­
+ </panel.string>
+ <panel.string name="default system device">
+ é è¨­ç³»çµ±è¨­å‚™
+ </panel.string>
+ <panel.string name="no device">
+ 無設備
+ </panel.string>
+ <text name="Input">
+ 輸入
+ </text>
+ <text name="My volume label">
+ 我的音é‡ï¼š
+ </text>
+ <slider_bar initial_value="1.0" name="mic_volume_slider" tool_tip="Change the volume using this slider"/>
+ <text name="wait_text">
+ è«‹ç¨å€™
+ </text>
+ <text name="Output">
+ 輸出
+ </text>
+ </panel>
+</panel>
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
new file mode 100644
index 0000000000..8d0e2a6355
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="Media is Loading"/>
+ </layout_panel>
+ </layout_stack>
+ <layout_stack name="media_controls">
+ <layout_panel name="back">
+ <button name="back_btn" tool_tip="Navigate back"/>
+ </layout_panel>
+ <layout_panel name="fwd">
+ <button name="fwd_btn" tool_tip="Navigate forward"/>
+ </layout_panel>
+ <layout_panel name="home">
+ <button name="home_btn" tool_tip="Home page"/>
+ </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"/>
+ </layout_panel>
+ <layout_panel name="stop">
+ <button name="stop_btn" tool_tip="Stop loading"/>
+ </layout_panel>
+ <layout_panel name="play">
+ <button name="play_btn" tool_tip="Play media"/>
+ </layout_panel>
+ <layout_panel name="pause">
+ <button name="pause_btn" tool_tip="Pause media"/>
+ </layout_panel>
+ <layout_panel name="media_address">
+ <line_editor name="media_address_url" tool_tip="Media URL"/>
+ <layout_stack name="media_address_url_icons">
+ <layout_panel>
+ <icon name="media_whitelist_flag" tool_tip="White List enabled"/>
+ </layout_panel>
+ <layout_panel>
+ <icon name="media_secure_lock_flag" tool_tip="Secured Browsing"/>
+ </layout_panel>
+ </layout_stack>
+ </layout_panel>
+ <layout_panel name="media_play_position">
+ <slider_bar initial_value="0.5" name="media_play_slider" tool_tip="Movie play progress"/>
+ </layout_panel>
+ <layout_panel name="skip_back">
+ <button name="skip_back_btn" tool_tip="Step back"/>
+ </layout_panel>
+ <layout_panel name="skip_forward">
+ <button name="skip_forward_btn" tool_tip="Step forward"/>
+ </layout_panel>
+ <layout_panel name="media_volume">
+ <button name="media_mute_button" tool_tip="Mute This Media"/>
+ <slider name="volume_slider" tool_tip="Media Volume"/>
+ </layout_panel>
+ <layout_panel name="zoom_frame">
+ <button name="zoom_frame_btn" tool_tip="Zoom into media"/>
+ </layout_panel>
+ <layout_panel name="close">
+ <button name="close_btn" tool_tip="Zoom Back"/>
+ </layout_panel>
+ <layout_panel name="new_window">
+ <button name="new_window_btn" tool_tip="Open URL in browser"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_profile.xml b/indra/newview/skins/default/xui/zh/panel_profile.xml
new file mode 100644
index 0000000000..fcf7bb64db
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_profile.xml
@@ -0,0 +1,67 @@
+<?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="(retrieving)" 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="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="chat_btn_lp">
+ <button label="瞬間傳é€" name="teleport" tool_tip="Offer teleport"/>
+ </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
new file mode 100644
index 0000000000..12fe776e45
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_profile_view.xml
@@ -0,0 +1,20 @@
+<?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_covenant.xml b/indra/newview/skins/default/xui/zh/panel_region_covenant.xml
new file mode 100644
index 0000000000..315bc0ac8e
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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">
+ Purchased land in this region may be resold.
+ </panel.string>
+ <panel.string name="can_not_resell">
+ Purchased land in this region may not be resold.
+ </panel.string>
+ <panel.string name="can_change">
+ Purchased land in this region may be joined or subdivided.
+ </panel.string>
+ <panel.string name="can_not_change">
+ Purchased land in this region may not be joined or subdivided.
+ </panel.string>
+ <text name="estate_section_lbl">
+ 領地
+ </text>
+ <text name="estate_name_lbl">
+ å稱:
+ </text>
+ <text name="estate_name_text">
+ mainland
+ </text>
+ <text name="estate_owner_lbl">
+ æ“有者:
+ </text>
+ <text name="estate_owner_text">
+ (無)
+ </text>
+ <text name="estate_cov_lbl">
+ 契約:
+ </text>
+ <text name="covenant_timestamp_text">
+ Last Modified Wed Dec 31 16:00:00 1969
+ </text>
+ <text_editor name="covenant_editor">
+ There is no Covenant provided for this Estate.
+ </text_editor>
+ <button label="Reset" name="reset_covenant"/>
+ <text name="covenant_help_text">
+ Changes to the covenant will show on all parcels in the estate.
+ </text>
+ <text name="covenant_instructions">
+ Drag and drop a notecard to change the Covenant for this estate.
+ </text>
+ <text name="region_section_lbl">
+ 地å€
+ </text>
+ <text name="region_name_lbl">
+ å稱:
+ </text>
+ <text name="region_name_text">
+ Erica
+ </text>
+ <text name="region_landtype_lbl">
+ 類型:
+ </text>
+ <text name="region_landtype_text">
+ Mainland / Homestead
+ </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/zh/panel_region_debug.xml b/indra/newview/skins/default/xui/zh/panel_region_debug.xml
new file mode 100644
index 0000000000..1ffbcbf8fd
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="Disable Collisions" name="disable_collisions_check" tool_tip="Disable non-avatar collisions in this region"/>
+ <check_box label="Disable Physics" name="disable_physics_check" tool_tip="Disable all physics in this region"/>
+ <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="With scripts" name="return_scripts" tool_tip="åªé€€å›žR包å«è…³æœ¬çš„物件"/>
+ <check_box label="On someone else&apos;s land" name="return_other_land" tool_tip="Return only objects which are on land belonging to someone else"/>
+ <check_box label="In every region of this estate" name="return_estate_wide" tool_tip="Return objects in all of the regions that make up this estate"/>
+ <button label="退回" name="return_btn"/>
+ <button label="Get Top Colliders..." name="top_colliders_btn" tool_tip="List of objects experiencing the most potential collisions"/>
+ <button label="Get Top Scripts..." name="top_scripts_btn" tool_tip="List of objects spending the most time running scripts"/>
+ <button label="地å€é‡æ–°å•Ÿå‹•" name="restart_btn" tool_tip="給予兩分é˜å€’數計時並é‡æ–°å•Ÿå‹•"/>
+ <button label="延é²é‡æ–°å•Ÿå‹•" name="cancel_restart_btn" tool_tip="延é²åœ°å€é‡æ–°å•Ÿå‹•ä¸€å°æ™‚"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_region_estate.xml b/indra/newview/skins/default/xui/zh/panel_region_estate.xml
new file mode 100644
index 0000000000..1f1676167b
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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">
+ Changes to settings on this tab will affect all regions in the estate.
+ </text>
+ <text name="estate_text">
+ 領地:
+ </text>
+ <text name="estate_name">
+ (未知)
+ </text>
+ <text name="owner_text">
+ 領地æ“有者:
+ </text>
+ <text name="estate_owner">
+ (未知)
+ </text>
+ <check_box label="Use Global Time" name="use_global_time_check"/>
+ <check_box label="Fixed Sun" name="fixed_sun_check"/>
+ <slider label="Phase" name="sun_hour_slider"/>
+ <check_box label="Allow Public Access" name="externally_visible_check"/>
+ <text name="Only Allow">
+ Restrict Access to accounts verified by:
+ </text>
+ <check_box label="Payment Information on File" name="limit_payment" tool_tip="Ban unidentified Residents"/>
+ <check_box label="年齡驗證" name="limit_age_verified" tool_tip="Ban Residents who have not verified their age. See the [SUPPORT_SITE] for more information."/>
+ <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/zh/panel_region_general.xml b/indra/newview/skins/default/xui/zh/panel_region_general.xml
new file mode 100644
index 0000000000..dce75c997d
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_region_general.xml
@@ -0,0 +1,43 @@
+<?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="Block Terraform" name="block_terraform_check"/>
+ <check_box label="Block Fly" name="block_fly_check"/>
+ <check_box label="Allow Damage" name="allow_damage_check"/>
+ <check_box label="Restrict Pushing" 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"/>
+ <spinner label="人數上é™" name="agent_limit_spin"/>
+ <spinner label="Object Bonus" name="object_bonus_spin"/>
+ <text label="Maturity" name="access_text">
+ 分級:
+ </text>
+ <icons_combo_box label="Moderate" name="access_combo">
+ <icons_combo_box.item label="æˆäºº" name="Adult" value="42"/>
+ <icons_combo_box.item label="Moderate" 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/zh/panel_region_terrain.xml b/indra/newview/skins/default/xui/zh/panel_region_terrain.xml
new file mode 100644
index 0000000000..0622cb4e73
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_region_terrain.xml
@@ -0,0 +1,19 @@
+<?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="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"/>
+ <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="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_region_texture.xml b/indra/newview/skins/default/xui/zh/panel_region_texture.xml
new file mode 100644
index 0000000000..7b6152121f
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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 (Low)
+ </text>
+ <text name="height_text_lbl2">
+ 2
+ </text>
+ <text name="height_text_lbl3">
+ 3
+ </text>
+ <text name="height_text_lbl4">
+ 4 (High)
+ </text>
+ <text name="height_text_lbl5">
+ Texture Elevation Ranges
+ </text>
+ <text name="height_text_lbl6">
+ Northwest
+ </text>
+ <text name="height_text_lbl7">
+ Northeast
+ </text>
+ <spinner label="Low" name="height_start_spin_1"/>
+ <spinner label="Low" name="height_start_spin_3"/>
+ <spinner label="High" name="height_range_spin_1"/>
+ <spinner label="High" name="height_range_spin_3"/>
+ <text name="height_text_lbl8">
+ Southwest
+ </text>
+ <text name="height_text_lbl9">
+ Southeast
+ </text>
+ <spinner label="Low" name="height_start_spin_0"/>
+ <spinner label="Low" name="height_start_spin_2"/>
+ <spinner label="High" name="height_range_spin_0"/>
+ <spinner label="High" name="height_range_spin_2"/>
+ <text name="height_text_lbl10">
+ These values represent the blend range for the textures above.
+ </text>
+ <text name="height_text_lbl11">
+ Measured in meters, the LOW value is the MAXIMUM height of Texture #1, and the HIGH value is the MINIMUM height of Texture #4.
+ </text>
+ <button label="套用" name="apply_btn"/>
+</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
new file mode 100644
index 0000000000..e42d904f32
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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">
+ You can not view or edit this script, since it has been set as &quot;no copy&quot;. You need full permissions to view or edit a script inside an object.
+ </panel.string>
+ <panel.string name="public_objects_can_not_run">
+ Public Objects cannot run scripts
+ </panel.string>
+ <panel.string name="script_running">
+ 執行中
+ </panel.string>
+ <panel.string name="Title">
+ 腳本:[NAME]
+ </panel.string>
+ <panel.string name="external_editor_not_set">
+ Select an editor by setting the environment variable LL_SCRIPT_EDITOR or the ExternalEditor setting.
+ </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/zh/panel_script_limits_my_avatar.xml b/indra/newview/skins/default/xui/zh/panel_script_limits_my_avatar.xml
new file mode 100644
index 0000000000..32cc2f9a5d
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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">
+ Avatar Script Usage
+ </text>
+ <text name="loading_text">
+ 載入中...
+ </text>
+ <scroll_list name="scripts_list">
+ <scroll_list.columns label="尺寸(kb)" name="size"/>
+ <scroll_list.columns label="URLs" name="urls"/>
+ <scroll_list.columns label="物件å稱" name="name"/>
+ <scroll_list.columns label="ä½ç½®" name="location"/>
+ </scroll_list>
+ <button label="Refresh List" name="refresh_list_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_script_limits_region_memory.xml b/indra/newview/skins/default/xui/zh/panel_script_limits_region_memory.xml
new file mode 100644
index 0000000000..950abbfb4c
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="尺寸(kb)" name="size"/>
+ <scroll_list.columns label="URLs" 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="Refresh List" name="refresh_list_btn"/>
+ <button label="Highlight" name="highlight_btn"/>
+ <button label="退回" name="return_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_scrolling_param.xml b/indra/newview/skins/default/xui/zh/panel_scrolling_param.xml
new file mode 100644
index 0000000000..bc29058f77
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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/zh/panel_scrolling_param_base.xml b/indra/newview/skins/default/xui/zh/panel_scrolling_param_base.xml
new file mode 100644
index 0000000000..fa659040ea
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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/zh/panel_side_tray.xml b/indra/newview/skins/default/xui/zh/panel_side_tray.xml
new file mode 100644
index 0000000000..625213e376
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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="Find your friends, contacts and people nearby." name="sidebar_people" tab_title="People">
+ <panel_container name="panel_container">
+ <panel label="社團檔案" name="panel_group_info_sidetray"/>
+ <panel label="Blocked Residents &amp; Objects" name="panel_block_list_sidetray"/>
+ </panel_container>
+ </sidetray_tab>
+ <sidetray_tab description="Find places to go and places you&apos;ve visited before." 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/zh/panel_side_tray_tab_caption.xml b/indra/newview/skins/default/xui/zh/panel_side_tray_tab_caption.xml
new file mode 100644
index 0000000000..cdd79da30c
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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/zh/panel_stand_stop_flying.xml b/indra/newview/skins/default/xui/zh/panel_stand_stop_flying.xml
new file mode 100644
index 0000000000..1dd3acef5d
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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/zh/panel_status_bar.xml b/indra/newview/skins/default/xui/zh/panel_status_bar.xml
new file mode 100644
index 0000000000..9a59d627d0
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_status_bar.xml
@@ -0,0 +1,27 @@
+<?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">
+ [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="Click to refresh your L$ balance" value="L$20"/>
+ <button label="購買 L$" name="buyL" tool_tip="點擊以購買更多 L$"/>
+ </panel>
+ <text name="TimeText" tool_tip="ç›®å‰æ™‚å€ï¼ˆå¤ªå¹³æ´‹ï¼‰">
+ 24:00 AM PST
+ </text>
+ <button name="media_toggle_btn" tool_tip="開始 / åœæ­¢å…¨éƒ¨åª’體(音樂ã€å½±ç‰‡ã€ç¶²é ï¼‰"/>
+ <button name="volume_btn" tool_tip="Global Volume Control"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_teleport_history.xml b/indra/newview/skins/default/xui/zh/panel_teleport_history.xml
new file mode 100644
index 0000000000..a2a63db000
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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/ Search]。"/>
+ <accordion_tab name="today" title="今天"/>
+ <accordion_tab name="yesterday" title="昨天"/>
+ <accordion_tab name="2_days_ago" title="å‰å¤©"/>
+ <accordion_tab name="3_days_ago" title="三天å‰"/>
+ <accordion_tab name="4_days_ago" title="四天å‰"/>
+ <accordion_tab name="5_days_ago" title="五天å‰"/>
+ <accordion_tab name="6_days_and_older" title="六天å‰æˆ–æ›´ä¹…"/>
+ <accordion_tab name="1_month_and_older" title="一個月或更久"/>
+ <accordion_tab name="6_months_and_older" title="åŠå¹´å‰æˆ–æ›´ä¹…"/>
+ </accordion>
+ <panel name="bottom_panel">
+ <menu_button name="gear_btn" tool_tip="顯示é¡å¤–é¸é …"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_teleport_history_item.xml b/indra/newview/skins/default/xui/zh/panel_teleport_history_item.xml
new file mode 100644
index 0000000000..c251994906
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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/zh/panel_voice_effect.xml b/indra/newview/skins/default/xui/zh/panel_voice_effect.xml
new file mode 100644
index 0000000000..6c8a452014
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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/zh/panel_world_map.xml b/indra/newview/skins/default/xui/zh/panel_world_map.xml
new file mode 100644
index 0000000000..ad28361a7f
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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">
+ Invalid Location
+ </panel.string>
+ <panel.string name="world_map_north">
+ N
+ </panel.string>
+ <panel.string name="world_map_east">
+ E
+ </panel.string>
+ <panel.string name="world_map_west">
+ W
+ </panel.string>
+ <panel.string name="world_map_south">
+ S
+ </panel.string>
+ <panel.string name="world_map_southeast">
+ SE
+ </panel.string>
+ <panel.string name="world_map_northeast">
+ NE
+ </panel.string>
+ <panel.string name="world_map_southwest">
+ SW
+ </panel.string>
+ <panel.string name="world_map_northwest">
+ NW
+ </panel.string>
+ <panel.string name="world_map_person">
+ 1 person
+ </panel.string>
+ <panel.string name="world_map_people">
+ [NUMBER] people
+ </panel.string>
+ <text label="N" name="floater_map_north">
+ N
+ </text>
+ <text label="E" name="floater_map_east">
+ E
+ </text>
+ <text label="W" name="floater_map_west">
+ W
+ </text>
+ <text label="S" name="floater_map_south">
+ S
+ </text>
+ <text label="SE" name="floater_map_southeast">
+ SE
+ </text>
+ <text label="NE" name="floater_map_northeast">
+ NE
+ </text>
+ <text label="SW" name="floater_map_southwest">
+ SW
+ </text>
+ <text label="NW" name="floater_map_northwest">
+ NW
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/role_actions.xml b/indra/newview/skins/default/xui/zh/role_actions.xml
new file mode 100644
index 0000000000..534c0f39fc
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/role_actions.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<role_actions>
+ <action_set description="These Abilities include powers to add and remove group Members, and allow new Members to join without an invitation." name="Membership">
+ <action description="Invite People to this Group" longdescription="Invite People to this Group using the &apos;Invite&apos; button in the Roles section &gt; Members tab." name="member invite" value="1"/>
+ <action description="將會員由這個社團中踢出" longdescription="Eject Members from this Group using the &apos;Eject&apos; button in the Roles section &gt; Members tab. An Owner can eject anyone except another Owner. If you&apos;re not an Owner, a Member can be ejected from a group if, and only if, they&apos;re only in the Everyone Role, and NO other Roles. To remove Members from Roles, you need to have the &apos;Remove Members from Roles&apos; Ability." name="member eject" value="2"/>
+ <action description="Toggle &apos;Open Enrollment&apos; and change &apos;Enrollment fee&apos;" longdescription="Toggle &apos;Open Enrollment&apos; to let new Members join without an invitation, and change the &apos;Enrollment fee&apos; in the General section." name="member options" value="3"/>
+ </action_set>
+ <action_set description="These Abilities include powers to add, remove, and change group Roles, add and remove Members in Roles, and assign Abilities to Roles." name="Roles">
+ <action description="Create new Roles" longdescription="Create new Roles in the Roles section &gt; Roles tab." name="role create" value="4"/>
+ <action description="刪除角色" longdescription="Delete Roles in the Roles section &gt; Roles tab." name="role delete" value="5"/>
+ <action description="Change Role names, titles, descriptions, and whether Role members are publicly revealed" longdescription="Change Role names, titles, descriptions, and whether Role members are publicly revealed. This is done at the bottom of the the Roles section &gt; Roles tab after selecting a Role." name="role properties" value="6"/>
+ <action description="Assign Members to Assigner&apos;s Roles" longdescription="Assign Members to Roles in the list of Assigned Roles (Roles section &gt; Members tab). A Member with this Ability can only add Members to a Role that the assigner is already in." name="role assign member limited" value="7"/>
+ <action description="Assign Members to Any Role" longdescription="Assign Members to Any Role in the list of Assigned Roles (Roles section &gt; Members tab). *WARNING* Any Member in a Role with this Ability can assign themselves--and any other non-Owner Member--to Roles that have more powers than they currently have, potentially elevating themselves to near-Owner power. Be sure you know what you&apos;re doing before assigning this Ability." name="role assign member" value="8"/>
+ <action description="由角色中移除æˆå“¡" longdescription="Remove Members from Roles in the list of Assigned Roles (Roles section &gt; Members tab). Owners can&apos;t be removed." name="role remove member" value="9"/>
+ <action description="Assign and Remove Abilities in Roles" longdescription="Assign and Remove Abilities for each Role in the list of Allowed Abilities (Roles section &gt; Roles tab). *WARNING* Any Member in a Role with this Ability can assign themselves--and any other non-Owner Member--all Abilities, potentially elevating themselves to near-Owner power. Be sure you know what you&apos;re doing before assigning this Ability." name="role change actions" value="10"/>
+ </action_set>
+ <action_set description="These Abilities include powers to modify this group&apos;s identity, such as changing public visibility, charter, and insignia." name="Group Identity">
+ <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="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"/>
+ </action_set>
+ <action_set description="These Abilities include powers to change the parcel name and publish settings, Find directory visibility, and landing point &amp; TP routing options." name="Parcel Identity">
+ <action description="Toggle &apos;Show Place in Search&apos; and set category" longdescription="Toggle &apos;Show Place in Search&apos; and setting a parcel&apos;s category in About Land &gt; Options tab." name="land find places" value="17"/>
+ <action description="Change parcel name, description, and &apos;Show Place in Search&apos; settings" longdescription="Change parcel name, description, and &apos;Show Place in Search&apos; settings. This is done in About Land &gt; Options tab." name="land change identity" value="18"/>
+ <action description="Set landing point and set teleport routing" longdescription="On a group-owned parcel, Members in a Role with this Ability can set a landing point to specify where incoming teleports arrive, and also set teleport routing for further control. This is done in About Land &gt; Options tab." name="land set landing point" value="19"/>
+ </action_set>
+ <action_set description="These Abilities include powers which affect parcel options, such as &apos;Create Objects&apos;, &apos;Edit Terrain&apos;, and music &amp; media settings." name="Parcel Settings">
+ <action description="Change music &amp; media settings" longdescription="Change streaming music and movie settings in About Land &gt; Media tab." name="land change media" value="20"/>
+ <action description="Toggle &apos;Edit Terrain&apos;" longdescription="Toggle &apos;Edit Terrain&apos;. *WARNING* About Land &gt; Options tab &gt; Edit Terrain allows anyone to terraform your land&apos;s shape, and place and move Linden plants. Be sure you know what you&apos;re doing before assigning this Ability. Editing terrain is toggled in About Land &gt; Options tab." name="land edit" value="21"/>
+ <action description="Toggle various About Land &gt; Options settings" longdescription="Toggle &apos;Safe (no damage)&apos;, &apos;Fly&apos;, and allow other Residents to: &apos;Edit Terrain&apos;, &apos;Build&apos;, &apos;Create Landmarks&apos;, and &apos;Run Scripts&apos; on group-owned land in About Land &gt; Options tab." name="land options" value="22"/>
+ </action_set>
+ <action_set description="These Abilities include powers which allow Members to bypass restrictions on group-owned parcels." name="Parcel Powers">
+ <action description="Always allow &apos;Edit Terrain&apos;" longdescription="Members in a Role with this Ability can edit terrain on a group-owned parcel, even if it&apos;s turned off in About Land &gt; Options tab." name="land allow edit land" value="23"/>
+ <action description="Always allow &apos;Fly&apos;" longdescription="Members in a Role with this Ability can fly on a group-owned parcel, even if it&apos;s turned off in About Land &gt; Options tab." name="land allow fly" value="24"/>
+ <action description="Always allow &apos;Create Objects&apos;" longdescription="Members in a Role with this Ability can create objects on a group-owned parcel, even if it&apos;s turned off in About Land &gt; Options tab." name="land allow create" value="25"/>
+ <action description="總是å…許 &apos;創造地標&apos;" longdescription="Members in a Role with this Ability can landmark a group-owned parcel, even if it&apos;s turned off in About Land &gt; Options tab." name="land allow landmark" value="26"/>
+ <action description="Allow &apos;Set Home to Here&apos; on group land" longdescription="Members in a Role with this Ability can use World menu &gt; Landmarks &gt; Set Home to Here on a parcel deeded to this group." name="land allow set home" value="28"/>
+ <action description="Allow &apos;Event Hosting&apos; on group land" longdescription="Members in a Role with this Ability can select group owned parcels as venus when hosting an event." name="land allow host event" value="41"/>
+ </action_set>
+ <action_set description="These Abilities include powers to allow or restrict access to group-owned parcels, including freezing and ejecting Residents." name="Parcel Access">
+ <action description="Manage parcel Access lists" longdescription="Manage parcel Access lists in About Land &gt; Access tab." name="land manage allowed" value="29"/>
+ <action description="Manage parcel Ban lists" longdescription="Manage parcel Ban lists in About Land &gt; Access tab." name="land manage banned" value="30"/>
+ <action description="Change parcel &apos;Sell passes to&apos; settings" longdescription="Change parcel &apos;Sell passes to&apos; settings in About Land &gt; Access tab." name="land manage passes" value="31"/>
+ <action description="將地段內的居民踢出åŠå‡çµ" longdescription="Members in a Role with this Ability can handle an unwelcome Resident on a group-owned parcel by right-clicking them, then selecting &apos;Eject&apos; or &apos;Freeze&apos;." name="land admin" value="32"/>
+ </action_set>
+ <action_set description="These Abilities include powers to allow members to return objects and place and move Linden plants. This is useful for Members to clean up litter and do landscaping, but it should also be used with care, because there&apos;s no undo for returning objects." name="Parcel Content">
+ <action description="Return objects owned by group" longdescription="Return objects on group-owned parcels that are owned by the group in About Land &gt; Objects tab." name="land return group owned" value="48"/>
+ <action description="Return objects set to group" longdescription="Return objects on group-owned parcels that are set to the group in About Land &gt; Objects tab." name="land return group set" value="33"/>
+ <action description="Return non-group objects" longdescription="Return objects on group-owned parcels that are non-group in About Land &gt; Objects tab." name="land return non group" value="34"/>
+ <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="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>
+ <action_set description="These Abilities include powers which require Members to pay group liabilities and receive group dividends, and restrict access to group account history." name="Accounting">
+ <action description="Pay group liabilities and receive group dividends" longdescription="Members in a Role with this Ability will automatically pay group liabilities and receive group dividends. This means they will receive a portion of group-owned land sales which are distributed daily, as well as contribute towards things like parcel listing fees." name="accounting accountable" value="40"/>
+ </action_set>
+ <action_set description="These Abilities include powers to allow Members to send, receive, and view group Notices." name="Notices">
+ <action description="é€å‡ºé€šçŸ¥" longdescription="Members in a Role with this Ability can send Notices via the Group &gt; Notices section." name="notices send" value="42"/>
+ <action description="接收通知與察看éŽåŽ»é€šçŸ¥" longdescription="Members in a Role with this Ability can receive Notices and view past Notices in Group &gt; Notices section." name="notices receive" value="43"/>
+ </action_set>
+ <action_set description="These Abilities include powers to allow or restrict access to group chat sessions and group voice chat." name="Chat">
+ <action description="Join Group Chat" longdescription="Members in a Role with this Ability can join group chat sessions, for text and voice." name="join group chat" value="16"/>
+ <action description="Join Group Voice Chat" longdescription="Members in a Role with this Ability can join group voice chat sessions. NOTE: The Join Group Chat ability is required to access the voice chat session." name="join voice chat" value="27"/>
+ <action description="Moderate Group Chat" longdescription="Members in a Role with this Ability can control access and participation in group voice and text chat sessions." name="moderate group chat" value="37"/>
+ </action_set>
+</role_actions>
diff --git a/indra/newview/skins/default/xui/zh/sidepanel_appearance.xml b/indra/newview/skins/default/xui/zh/sidepanel_appearance.xml
new file mode 100644
index 0000000000..7d8a502594
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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">
+ MyOutfit With a really Long Name like MOOSE
+ </text>
+ <button label="" name="edit_outfit_btn" tool_tip="編輯這è£æ‰®"/>
+ </panel>
+ <filter_editor label="è£æ‰®éŽæ¿¾å™¨" name="Filter"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/sidepanel_inventory.xml b/indra/newview/skins/default/xui/zh/sidepanel_inventory.xml
new file mode 100644
index 0000000000..4cc16ed250
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/sidepanel_inventory.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Things" name="objects panel">
+ <panel label="" name="sidepanel__inventory_panel">
+ <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="Share an inventory item"/>
+ </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="teleport_btn" tool_tip="瞬間傳é€åˆ°æ‰€é¸çš„å€åŸŸ"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/sidepanel_item_info.xml b/indra/newview/skins/default/xui/zh/sidepanel_item_info.xml
new file mode 100644
index 0000000000..f28638d93d
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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] [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">
+ (收ç´å€ï¼‰
+ </panel.string>
+ <panel.string name="origin_inworld">
+ (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="Allow all members of the set group to share your modify permissions for this object. You must Deed to enable role restrictions."/>
+ <text name="NextOwnerLabel">
+ 下一個æ“有者:
+ </text>
+ <check_box label="修改" name="CheckNextOwnerModify"/>
+ <check_box label="覆製" name="CheckNextOwnerCopy"/>
+ <check_box label="轉移" name="CheckNextOwnerTransfer" tool_tip="Next owner can give away or resell this object"/>
+ </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/zh/sidepanel_task_info.xml b/indra/newview/skins/default/xui/zh/sidepanel_task_info.xml
new file mode 100644
index 0000000000..f308f2d4d0
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/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">
+ Deed
+ </panel.string>
+ <panel.string name="text deed">
+ Deed
+ </panel.string>
+ <panel.string name="text modify info 1">
+ You can modify this object
+ </panel.string>
+ <panel.string name="text modify info 2">
+ You can modify these objects
+ </panel.string>
+ <panel.string name="text modify info 3">
+ You can&apos;t modify this object
+ </panel.string>
+ <panel.string name="text modify info 4">
+ You can&apos;t modify these objects
+ </panel.string>
+ <panel.string name="text modify warning">
+ This object has linked parts
+ </panel.string>
+ <panel.string name="Cost Default">
+ 價格: L$
+ </panel.string>
+ <panel.string name="Cost Total">
+ 總價: L$
+ </panel.string>
+ <panel.string name="Cost Per Unit">
+ Price Per: L$
+ </panel.string>
+ <panel.string name="Cost Mixed">
+ Mixed Price
+ </panel.string>
+ <panel.string name="Sale Mixed">
+ Mixed Sale
+ </panel.string>
+ <text name="title" value="物件檔案"/>
+ <text name="where" value="(Inworld)"/>
+ <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="Choose a group to share this object&apos;s permissions"/>
+ <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."/>
+ <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="Allow all members of the set group to share your modify permissions for this object. You must Deed to enable role restrictions."/>
+ <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="Next owner can give away or resell this object"/>
+ </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>
+ <spinner label="價格: L$" name="Edit Cost"/>
+ <check_box label="顯示在æœå°‹ä¸­" name="search_check" tool_tip="Let people see this object in search results"/>
+ <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="é–‹å•Ÿ" 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/zh/strings.xml b/indra/newview/skins/default/xui/zh/strings.xml
new file mode 100644
index 0000000000..28b8cce5b2
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/strings.xml
@@ -0,0 +1,4451 @@
+<?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">
+ 第二人生
+ </string>
+ <string name="APP_NAME">
+ 第二人生
+ </string>
+ <string name="CAPITALIZED_APP_NAME">
+ 第二人生
+ </string>
+ <string name="SECOND_LIFE_GRID">
+ 第二人生網格
+ </string>
+ <string name="SUPPORT_SITE">
+ 第二人生支æ´å…¥å£
+ </string>
+ <string name="StartupDetectingHardware">
+ 硬體åµæ¸¬ä¸­...
+ </string>
+ <string name="StartupLoading">
+ [APP_NAME] 載入中...
+ </string>
+ <string name="StartupClearingCache">
+ å¿«å–清除中...
+ </string>
+ <string name="StartupInitializingTextureCache">
+ æ質快å–åˆå§‹åŒ–中...
+ </string>
+ <string name="StartupInitializingVFS">
+ VFS åˆå§‹åŒ–中...
+ </string>
+ <string name="ProgressRestoring">
+ 回存中...
+ </string>
+ <string name="ProgressChangingResolution">
+ Changing Resolution...
+ </string>
+ <string name="Fullbright">
+ Fullbright (Legacy)
+ </string>
+ <string name="LoginInProgress">
+ Logging in. [APP_NAME] may appear frozen. Please wait.
+ </string>
+ <string name="LoginInProgressNoFrozen">
+ Logging in...
+ </string>
+ <string name="LoginAuthenticating">
+ Authenticating
+ </string>
+ <string name="LoginMaintenance">
+ Performing account maintenance...
+ </string>
+ <string name="LoginAttempt">
+ Previous login attempt failed. Logging in, attempt [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="LoginWaitingForRegionHandshake">
+ 地å€äº¤æ¡ç­‰å¾…中...
+ </string>
+ <string name="LoginConnectingToRegion">
+ 地å€è¯çµä¸­...
+ </string>
+ <string name="LoginDownloadingClothing">
+ æœè£ä¸‹è¼‰ä¸­...
+ </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">
+ 登入失敗。
+ </string>
+ <string name="Quit">
+ çµæŸé€€å‡º
+ </string>
+ <string name="create_account_url">
+ http://join.secondlife.com/
+ </string>
+ <string name="AgentLostConnection">
+ 這個地å€å¯èƒ½é­é‡å•é¡Œï¼Œè«‹æª¢æŸ¥ä½ çš„網路連線。
+ </string>
+ <string name="SavingSettings">
+ 你的設定儲存中...
+ </string>
+ <string name="LoggingOut">
+ 登出中...
+ </string>
+ <string name="ShuttingDown">
+ 關閉中...
+ </string>
+ <string name="YouHaveBeenDisconnected">
+ 你已經被所在的地å€ä¸­æ–·è¯çµã€‚
+ </string>
+ <string name="SentToInvalidRegion">
+ You were sent to an invalid region.
+ </string>
+ <string name="TestingDisconnect">
+ 測試ç€è¦½å™¨æ–·ç·š
+ </string>
+ <string name="TooltipPerson">
+ 人
+ </string>
+ <string name="TooltipNoName">
+ (no name)
+ </string>
+ <string name="TooltipOwner">
+ æ“有者:
+ </string>
+ <string name="TooltipPublic">
+ Public
+ </string>
+ <string name="TooltipIsGroup">
+ (社團)
+ </string>
+ <string name="TooltipForSaleL$">
+ 出售: L$[AMOUNT]
+ </string>
+ <string name="TooltipFlagGroupBuild">
+ Group Build
+ </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="TooltipHttpUrl">
+ 點擊以察看這個網é 
+ </string>
+ <string name="TooltipSLURL">
+ 點擊以察看這個ä½ç½®è³‡è¨Š
+ </string>
+ <string name="TooltipAgentUrl">
+ 點擊以察看這個居民檔案
+ </string>
+ <string name="TooltipAgentInspect">
+ 瞭解更多有關這個居民
+ </string>
+ <string name="TooltipAgentMute">
+ Click to mute this Resident
+ </string>
+ <string name="TooltipAgentUnmute">
+ Click to unmute this Resident
+ </string>
+ <string name="TooltipAgentIM">
+ 點擊開始 IM 這ä½å±…æ°‘
+ </string>
+ <string name="TooltipAgentPay">
+ 點擊以支付這ä½å±…æ°‘
+ </string>
+ <string name="TooltipAgentOfferTeleport">
+ Click to offer a teleport request to this Resident
+ </string>
+ <string name="TooltipAgentRequestFriend">
+ Click to send a friend request to this Resident
+ </string>
+ <string name="TooltipGroupUrl">
+ Click to view this group&apos;s description
+ </string>
+ <string name="TooltipEventUrl">
+ Click to view this event&apos;s description
+ </string>
+ <string name="TooltipClassifiedUrl">
+ Click to view this classified
+ </string>
+ <string name="TooltipParcelUrl">
+ Click to view this parcel&apos;s description
+ </string>
+ <string name="TooltipTeleportUrl">
+ Click to teleport to this location
+ </string>
+ <string name="TooltipObjectIMUrl">
+ Click to view this object&apos;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="SLurlLabelTeleport">
+ 瞬間傳é€åˆ°
+ </string>
+ <string name="SLurlLabelShowOnMap">
+ Show Map for
+ </string>
+ <string name="SLappAgentMute">
+ Mute
+ </string>
+ <string name="SLappAgentUnmute">
+ Unmute
+ </string>
+ <string name="SLappAgentIM">
+ IM
+ </string>
+ <string name="SLappAgentPay">
+ 支付
+ </string>
+ <string name="SLappAgentOfferTeleport">
+ Offer Teleport to
+ </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">
+ Dock
+ </string>
+ <string name="BUTTON_HELP">
+ 顯示幫助
+ </string>
+ <string name="Searching">
+ æœå°‹ä¸­...
+ </string>
+ <string name="NoneFound">
+ 未發ç¾ã€‚
+ </string>
+ <string name="RetrievingData">
+ Retrieving...
+ </string>
+ <string name="ReleaseNotes">
+ Release Notes
+ </string>
+ <string name="LoadingData">
+ 載入中...
+ </string>
+ <string name="AvatarNameNobody">
+ (nobody)
+ </string>
+ <string name="AvatarNameWaiting">
+ (waiting)
+ </string>
+ <string name="AvatarNameMultiple">
+ (multiple)
+ </string>
+ <string name="GroupNameNone">
+ (無)
+ </string>
+ <string name="AvalineCaller">
+ Avaline Caller [ORDER]
+ </string>
+ <string name="AssetErrorNone">
+ 無錯誤
+ </string>
+ <string name="AssetErrorRequestFailed">
+ Asset request: failed
+ </string>
+ <string name="AssetErrorNonexistentFile">
+ Asset request: non-existent file
+ </string>
+ <string name="AssetErrorNotInDatabase">
+ Asset request: asset not found in database
+ </string>
+ <string name="AssetErrorEOF">
+ End of file
+ </string>
+ <string name="AssetErrorCannotOpenFile">
+ Cannot open file
+ </string>
+ <string name="AssetErrorFileNotFound">
+ File not found
+ </string>
+ <string name="AssetErrorTCPTimeout">
+ File transfer timeout
+ </string>
+ <string name="AssetErrorCircuitGone">
+ Circuit gone
+ </string>
+ <string name="AssetErrorPriceMismatch">
+ Viewer and server do not agree on price
+ </string>
+ <string name="AssetErrorUnknownStatus">
+ 未知狀態
+ </string>
+ <string name="texture">
+ æ質
+ </string>
+ <string name="sound">
+ è²éŸ³
+ </string>
+ <string name="calling card">
+ calling card
+ </string>
+ <string name="landmark">
+ 地標
+ </string>
+ <string name="legacy script">
+ legacy script
+ </string>
+ <string name="clothing">
+ æœè£
+ </string>
+ <string name="object">
+ 物件
+ </string>
+ <string name="note card">
+ 記事å¡
+ </string>
+ <string name="folder">
+ 資料夾
+ </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 æ質
+ </string>
+ <string name="body part">
+ 身體部ä½
+ </string>
+ <string name="snapshot">
+ å¿«ç…§
+ </string>
+ <string name="lost and found">
+ Lost and Found
+ </string>
+ <string name="targa image">
+ targa 圖åƒ
+ </string>
+ <string name="trash">
+ 垃圾桶
+ </string>
+ <string name="jpeg image">
+ jpeg 圖åƒ
+ </string>
+ <string name="animation">
+ 動作
+ </string>
+ <string name="gesture">
+ 姿勢
+ </string>
+ <string name="simstate">
+ simstate
+ </string>
+ <string name="favorite">
+ favorite
+ </string>
+ <string name="symbolic link">
+ link
+ </string>
+ <string name="symbolic folder link">
+ folder link
+ </string>
+ <string name="AvatarEditingAppearance">
+ (外觀編輯中)
+ </string>
+ <string name="AvatarAway">
+ 離開
+ </string>
+ <string name="AvatarBusy">
+ 忙碌
+ </string>
+ <string name="AvatarMuted">
+ Blocked
+ </string>
+ <string name="anim_express_afraid">
+ Afraid
+ </string>
+ <string name="anim_express_anger">
+ Angry
+ </string>
+ <string name="anim_away">
+ Away
+ </string>
+ <string name="anim_backflip">
+ Backflip
+ </string>
+ <string name="anim_express_laugh">
+ Belly Laugh
+ </string>
+ <string name="anim_express_toothsmile">
+ BigSmile
+ </string>
+ <string name="anim_blowkiss">
+ Blow Kiss
+ </string>
+ <string name="anim_express_bored">
+ Bored
+ </string>
+ <string name="anim_bow">
+ Bow
+ </string>
+ <string name="anim_clap">
+ Clap
+ </string>
+ <string name="anim_courtbow">
+ Court Bow
+ </string>
+ <string name="anim_express_cry">
+ Cry
+ </string>
+ <string name="anim_dance1">
+ Dance 1
+ </string>
+ <string name="anim_dance2">
+ Dance 2
+ </string>
+ <string name="anim_dance3">
+ Dance 3
+ </string>
+ <string name="anim_dance4">
+ Dance 4
+ </string>
+ <string name="anim_dance5">
+ Dance 5
+ </string>
+ <string name="anim_dance6">
+ Dance 6
+ </string>
+ <string name="anim_dance7">
+ Dance 7
+ </string>
+ <string name="anim_dance8">
+ Dance 8
+ </string>
+ <string name="anim_express_disdain">
+ Disdain
+ </string>
+ <string name="anim_drink">
+ Drink
+ </string>
+ <string name="anim_express_embarrased">
+ Embarrassed
+ </string>
+ <string name="anim_angry_fingerwag">
+ Finger Wag
+ </string>
+ <string name="anim_fist_pump">
+ Fist Pump
+ </string>
+ <string name="anim_yoga_float">
+ Floating Yoga
+ </string>
+ <string name="anim_express_frown">
+ Frown
+ </string>
+ <string name="anim_impatient">
+ Impatient
+ </string>
+ <string name="anim_jumpforjoy">
+ Jump For Joy
+ </string>
+ <string name="anim_kissmybutt">
+ Kiss My Butt
+ </string>
+ <string name="anim_express_kiss">
+ Kiss
+ </string>
+ <string name="anim_laugh_short">
+ Laugh
+ </string>
+ <string name="anim_musclebeach">
+ Muscle Beach
+ </string>
+ <string name="anim_no_unhappy">
+ No (Unhappy)
+ </string>
+ <string name="anim_no_head">
+ No
+ </string>
+ <string name="anim_nyanya">
+ Nya-nya-nya
+ </string>
+ <string name="anim_punch_onetwo">
+ One-Two Punch
+ </string>
+ <string name="anim_express_open_mouth">
+ Open Mouth
+ </string>
+ <string name="anim_peace">
+ Peace
+ </string>
+ <string name="anim_point_you">
+ Point at Other
+ </string>
+ <string name="anim_point_me">
+ Point at Self
+ </string>
+ <string name="anim_punch_l">
+ Punch Left
+ </string>
+ <string name="anim_punch_r">
+ Punch Right
+ </string>
+ <string name="anim_rps_countdown">
+ RPS count
+ </string>
+ <string name="anim_rps_paper">
+ RPS paper
+ </string>
+ <string name="anim_rps_rock">
+ RPS rock
+ </string>
+ <string name="anim_rps_scissors">
+ RPS scissors
+ </string>
+ <string name="anim_express_repulsed">
+ Repulsed
+ </string>
+ <string name="anim_kick_roundhouse_r">
+ Roundhouse Kick
+ </string>
+ <string name="anim_express_sad">
+ Sad
+ </string>
+ <string name="anim_salute">
+ Salute
+ </string>
+ <string name="anim_shout">
+ Shout
+ </string>
+ <string name="anim_express_shrug">
+ Shrug
+ </string>
+ <string name="anim_express_smile">
+ Smile
+ </string>
+ <string name="anim_smoke_idle">
+ Smoke Idle
+ </string>
+ <string name="anim_smoke_inhale">
+ Smoke Inhale
+ </string>
+ <string name="anim_smoke_throw_down">
+ Smoke Throw Down
+ </string>
+ <string name="anim_express_surprise">
+ Surprise
+ </string>
+ <string name="anim_sword_strike_r">
+ Sword Strike
+ </string>
+ <string name="anim_angry_tantrum">
+ Tantrum
+ </string>
+ <string name="anim_express_tongue_out">
+ TongueOut
+ </string>
+ <string name="anim_hello">
+ Wave
+ </string>
+ <string name="anim_whisper">
+ Whisper
+ </string>
+ <string name="anim_whistle">
+ Whistle
+ </string>
+ <string name="anim_express_wink">
+ Wink
+ </string>
+ <string name="anim_wink_hollywood">
+ Wink (Hollywood)
+ </string>
+ <string name="anim_express_worry">
+ Worry
+ </string>
+ <string name="anim_yes_happy">
+ 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] m² L$[PRICE]
+ </string>
+ <string name="worldmap_results_none_found">
+ 沒有發ç¾ã€‚
+ </string>
+ <string name="Ok">
+ 確定
+ </string>
+ <string name="Premature end of file">
+ Premature end of file
+ </string>
+ <string name="ST_NO_JOINT">
+ Can&apos;t find ROOT or JOINT.
+ </string>
+ <string name="whisper">
+ whispers:
+ </string>
+ <string name="shout">
+ shouts:
+ </string>
+ <string name="ringing">
+ Connecting to in-world Voice Chat...
+ </string>
+ <string name="connected">
+ Connected
+ </string>
+ <string name="unavailable">
+ Voice not available at your current location
+ </string>
+ <string name="hang_up">
+ Disconnected from in-world Voice Chat
+ </string>
+ <string name="reconnect_nearby">
+ You will now be reconnected to Nearby Voice Chat
+ </string>
+ <string name="ScriptQuestionCautionChatGranted">
+ &apos;[OBJECTNAME]&apos;, an object owned by &apos;[OWNERNAME]&apos;, located in [REGIONNAME] at [REGIONPOS], has been granted permission to: [PERMISSIONS].
+ </string>
+ <string name="ScriptQuestionCautionChatDenied">
+ &apos;[OBJECTNAME]&apos;, an object owned by &apos;[OWNERNAME]&apos;, located in [REGIONNAME] at [REGIONPOS], has been denied permission to: [PERMISSIONS].
+ </string>
+ <string name="ScriptTakeMoney">
+ Take Linden dollars (L$) from you
+ </string>
+ <string name="ActOnControlInputs">
+ Act on your control inputs
+ </string>
+ <string name="RemapControlInputs">
+ Remap your control inputs
+ </string>
+ <string name="AnimateYourAvatar">
+ Animate your avatar
+ </string>
+ <string name="AttachToYourAvatar">
+ Attach to your avatar
+ </string>
+ <string name="ReleaseOwnership">
+ Release ownership and become public
+ </string>
+ <string name="LinkAndDelink">
+ Link and delink from other objects
+ </string>
+ <string name="AddAndRemoveJoints">
+ Add and remove joints with other objects
+ </string>
+ <string name="ChangePermissions">
+ Change its permissions
+ </string>
+ <string name="TrackYourCamera">
+ Track your camera
+ </string>
+ <string name="ControlYourCamera">
+ Control your camera
+ </string>
+ <string name="NotConnected">
+ Not Connected
+ </string>
+ <string name="SIM_ACCESS_PG">
+ 一般
+ </string>
+ <string name="SIM_ACCESS_MATURE">
+ Moderate
+ </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">
+ Targa 圖åƒ
+ </string>
+ <string name="bitmap_image_files">
+ Bitmap 圖åƒ
+ </string>
+ <string name="avi_movie_file">
+ AVI 影片檔案
+ </string>
+ <string name="xaf_animation_file">
+ XAF Anim File
+ </string>
+ <string name="xml_file">
+ XML File
+ </string>
+ <string name="raw_file">
+ RAW File
+ </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">
+ Alpha
+ </string>
+ <string name="tattoo">
+ 刺é’
+ </string>
+ <string name="physics">
+ 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">
+ Alpha not worn
+ </string>
+ <string name="tattoo_not_worn">
+ 刺é’未穿
+ </string>
+ <string name="physics_not_worn">
+ 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">
+ Create new alpha
+ </string>
+ <string name="create_new_tattoo">
+ 創造新刺é’
+ </string>
+ <string name="create_new_physics">
+ 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">
+ Attached:
+ </string>
+ <string name="GroupNotifyViewPastNotices">
+ View past notices or opt-out of receiving these messages here.
+ </string>
+ <string name="GroupNotifyOpenAttachment">
+ Open Attachment
+ </string>
+ <string name="GroupNotifySaveAttachment">
+ Save Attachment
+ </string>
+ <string name="TeleportOffer">
+ Teleport offering
+ </string>
+ <string name="StartUpNotifications">
+ 當你離開時有新的通知é€é”。
+ </string>
+ <string name="OverflowInfoChannelString">
+ 你有約 %d 通知
+ </string>
+ <string name="BodyPartsRightArm">
+ Right Arm
+ </string>
+ <string name="BodyPartsHead">
+ 頭部
+ </string>
+ <string name="BodyPartsLeftArm">
+ Left Arm
+ </string>
+ <string name="BodyPartsLeftLeg">
+ Left Leg
+ </string>
+ <string name="BodyPartsTorso">
+ 軀幹
+ </string>
+ <string name="BodyPartsRightLeg">
+ Right Leg
+ </string>
+ <string name="GraphicsQualityLow">
+ Low
+ </string>
+ <string name="GraphicsQualityMid">
+ Mid
+ </string>
+ <string name="GraphicsQualityHigh">
+ High
+ </string>
+ <string name="LeaveMouselook">
+ Press ESC to return to World View
+ </string>
+ <string name="InventoryNoMatchingItems">
+ Didn&apos;t find what you&apos;re looking for? Try [secondlife:///app/search/all/[SEARCH_TERM] Search].
+ </string>
+ <string name="PlacesNoMatchingItems">
+ Didn&apos;t find what you&apos;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="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)"/>
+ <string name="LoadingContents">
+ 內容載入中...
+ </string>
+ <string name="NoContents">
+ No contents
+ </string>
+ <string name="WornOnAttachmentPoint" value="(worn on [ATTACHMENT_POINT])"/>
+ <string name="ActiveGesture" value="[GESLABEL] (active)"/>
+ <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="Wave"/>
+ <string name="GestureActionNone" value="ç„¡"/>
+ <string name="HelloAvatar" value="Hello, avatar!"/>
+ <string name="ViewAllGestures" value="察看全部 &gt;&gt;"/>
+ <string name="GetMoreGestures" value="å–得更多 &gt;&gt;"/>
+ <string name="Animations" value="動作,"/>
+ <string name="Calling Cards" value="Calling Cards,"/>
+ <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="Snapshots,"/>
+ <string name="No Filters" value="No"/>
+ <string name="Since Logoff" value="- 自上次登出"/>
+ <string name="InvFolder My Inventory">
+ 我的收ç´å€
+ </string>
+ <string name="InvFolder Library">
+ Library
+ </string>
+ <string name="InvFolder Textures">
+ æ質
+ </string>
+ <string name="InvFolder Sounds">
+ è²éŸ³
+ </string>
+ <string name="InvFolder Calling Cards">
+ 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">
+ 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">
+ Lost And Found
+ </string>
+ <string name="InvFolder Uncompressed Sounds">
+ Uncompressed Sounds
+ </string>
+ <string name="InvFolder Animations">
+ 動作
+ </string>
+ <string name="InvFolder Gestures">
+ 姿勢
+ </string>
+ <string name="InvFolder Favorite">
+ My Favorites
+ </string>
+ <string name="InvFolder favorite">
+ My Favorites
+ </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 Friends">
+ 朋å‹
+ </string>
+ <string name="InvFolder All">
+ 全部
+ </string>
+ <string name="Buy">
+ 購買
+ </string>
+ <string name="BuyforL$">
+ 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
+ </string>
+ <string name="KBShift">
+ Shift
+ </string>
+ <string name="KBCtrl">
+ Ctrl
+ </string>
+ <string name="Chest">
+ Chest
+ </string>
+ <string name="Skull">
+ Skull
+ </string>
+ <string name="Left Shoulder">
+ Left Shoulder
+ </string>
+ <string name="Right Shoulder">
+ Right Shoulder
+ </string>
+ <string name="Left Hand">
+ Left Hand
+ </string>
+ <string name="Right Hand">
+ Right Hand
+ </string>
+ <string name="Left Foot">
+ Left Foot
+ </string>
+ <string name="Right Foot">
+ Right Foot
+ </string>
+ <string name="Spine">
+ Spine
+ </string>
+ <string name="Pelvis">
+ 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">
+ R Upper Arm
+ </string>
+ <string name="R Forearm">
+ R Forearm
+ </string>
+ <string name="L Upper Arm">
+ L Upper Arm
+ </string>
+ <string name="L Forearm">
+ L Forearm
+ </string>
+ <string name="Right Hip">
+ Right Hip
+ </string>
+ <string name="R Upper Leg">
+ R Upper Leg
+ </string>
+ <string name="R Lower Leg">
+ R Lower Leg
+ </string>
+ <string name="Left Hip">
+ Left Hip
+ </string>
+ <string name="L Upper Leg">
+ L Upper Leg
+ </string>
+ <string name="L Lower Leg">
+ L Lower Leg
+ </string>
+ <string name="Stomach">
+ Stomach
+ </string>
+ <string name="Left Pec">
+ Left Pec
+ </string>
+ <string name="Right Pec">
+ Right Pec
+ </string>
+ <string name="Invalid Attachment">
+ Invalid Attachment Point
+ </string>
+ <string name="YearsMonthsOld">
+ [AGEYEARS] [AGEMONTHS] old
+ </string>
+ <string name="YearsOld">
+ [AGEYEARS] old
+ </string>
+ <string name="MonthsOld">
+ [AGEMONTHS] old
+ </string>
+ <string name="WeeksOld">
+ [AGEWEEKS] old
+ </string>
+ <string name="DaysOld">
+ [AGEDAYS] old
+ </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">
+ Trial
+ </string>
+ <string name="AcctTypeCharterMember">
+ Charter Member
+ </string>
+ <string name="AcctTypeEmployee">
+ Linden Lab Employee
+ </string>
+ <string name="PaymentInfoUsed">
+ Payment Info Used
+ </string>
+ <string name="PaymentInfoOnFile">
+ Payment Info On File
+ </string>
+ <string name="NoPaymentInfoOnFile">
+ No Payment Info On File
+ </string>
+ <string name="AgeVerified">
+ Age-verified
+ </string>
+ <string name="NotAgeVerified">
+ Not Age-verified
+ </string>
+ <string name="Center 2">
+ Center 2
+ </string>
+ <string name="Top Right">
+ Top Right
+ </string>
+ <string name="Top">
+ Top
+ </string>
+ <string name="Top Left">
+ Top Left
+ </string>
+ <string name="Center">
+ Center
+ </string>
+ <string name="Bottom Left">
+ Bottom Left
+ </string>
+ <string name="Bottom">
+ Bottom
+ </string>
+ <string name="Bottom Right">
+ Bottom Right
+ </string>
+ <string name="CompileQueueDownloadedCompiling">
+ Downloaded, now compiling
+ </string>
+ <string name="CompileQueueScriptNotFound">
+ Script not found on server.
+ </string>
+ <string name="CompileQueueProblemDownloading">
+ Problem downloading
+ </string>
+ <string name="CompileQueueInsufficientPermDownload">
+ Insufficient permissions to download a script.
+ </string>
+ <string name="CompileQueueInsufficientPermFor">
+ Insufficient permissions for
+ </string>
+ <string name="CompileQueueUnknownFailure">
+ Unknown failure to download
+ </string>
+ <string name="CompileQueueTitle">
+ Recompilation Progress
+ </string>
+ <string name="CompileQueueStart">
+ recompile
+ </string>
+ <string name="ResetQueueTitle">
+ Reset Progress
+ </string>
+ <string name="ResetQueueStart">
+ reset
+ </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 [OBJECT] owned by [OWNER]
+ </string>
+ <string name="GroupsNone">
+ ç„¡
+ </string>
+ <string name="Group" value="(社團)"/>
+ <string name="Unknown">
+ (未知)
+ </string>
+ <string name="SummaryForTheWeek" value="Summary for this week, beginning on"/>
+ <string name="NextStipendDay" value="The next stipend day is"/>
+ <string name="GroupIndividualShare" value="Group Individual Share"/>
+ <string name="GroupColumn" value="社團"/>
+ <string name="Balance">
+ Balance
+ </string>
+ <string name="Credits">
+ Credits
+ </string>
+ <string name="Debits">
+ Debits
+ </string>
+ <string name="Total">
+ Total
+ </string>
+ <string name="NoGroupDataFound">
+ No group data found for group
+ </string>
+ <string name="IMParentEstate">
+ parent estate
+ </string>
+ <string name="IMMainland">
+ mainland
+ </string>
+ <string name="IMTeen">
+ teen
+ </string>
+ <string name="RegionInfoError">
+ error
+ </string>
+ <string name="RegionInfoAllEstatesOwnedBy">
+ [OWNER] 所æ“有的的全部領地
+ </string>
+ <string name="RegionInfoAllEstatesYouOwn">
+ 你所æ“有的全部領地
+ </string>
+ <string name="RegionInfoAllEstatesYouManage">
+ all estates that you manage for [OWNER]
+ </string>
+ <string name="RegionInfoAllowedResidents">
+ Allowed Residents: ([ALLOWEDAGENTS], max [MAXACCESS])
+ </string>
+ <string name="RegionInfoAllowedGroups">
+ Allowed groups: ([ALLOWEDGROUPS], max [MAXACCESS])
+ </string>
+ <string name="ScriptLimitsParcelScriptMemory">
+ 地段腳本記憶體
+ </string>
+ <string name="ScriptLimitsParcelsOwned">
+ Parcels Listed: [PARCELS]
+ </string>
+ <string name="ScriptLimitsMemoryUsed">
+ Memory used: [COUNT] kb out of [MAX] kb; [AVAILABLE] kb available
+ </string>
+ <string name="ScriptLimitsMemoryUsedSimple">
+ Memory used: [COUNT] kb
+ </string>
+ <string name="ScriptLimitsParcelScriptURLs">
+ Parcel Script URLs
+ </string>
+ <string name="ScriptLimitsURLsUsed">
+ URLs used: [COUNT] out of [MAX]; [AVAILABLE] available
+ </string>
+ <string name="ScriptLimitsURLsUsedSimple">
+ URLs used: [COUNT]
+ </string>
+ <string name="ScriptLimitsRequestError">
+ Error requesting information
+ </string>
+ <string name="ScriptLimitsRequestNoParcelSelected">
+ No Parcel Selected
+ </string>
+ <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">
+ 頭部
+ </string>
+ <string name="ATTACH_LSHOULDER">
+ Left Shoulder
+ </string>
+ <string name="ATTACH_RSHOULDER">
+ Right Shoulder
+ </string>
+ <string name="ATTACH_LHAND">
+ Left Hand
+ </string>
+ <string name="ATTACH_RHAND">
+ Right Hand
+ </string>
+ <string name="ATTACH_LFOOT">
+ Left Foot
+ </string>
+ <string name="ATTACH_RFOOT">
+ Right Foot
+ </string>
+ <string name="ATTACH_BACK">
+ Back
+ </string>
+ <string name="ATTACH_PELVIS">
+ Pelvis
+ </string>
+ <string name="ATTACH_MOUTH">
+ Mouth
+ </string>
+ <string name="ATTACH_CHIN">
+ 下巴
+ </string>
+ <string name="ATTACH_LEAR">
+ Left Ear
+ </string>
+ <string name="ATTACH_REAR">
+ Right Ear
+ </string>
+ <string name="ATTACH_LEYE">
+ 左眼
+ </string>
+ <string name="ATTACH_REYE">
+ å³çœ¼
+ </string>
+ <string name="ATTACH_NOSE">
+ é¼»å­
+ </string>
+ <string name="ATTACH_RUARM">
+ Right Upper Arm
+ </string>
+ <string name="ATTACH_RLARM">
+ Right Lower Arm
+ </string>
+ <string name="ATTACH_LUARM">
+ Left Upper Arm
+ </string>
+ <string name="ATTACH_LLARM">
+ Left Lower Arm
+ </string>
+ <string name="ATTACH_RHIP">
+ Right Hip
+ </string>
+ <string name="ATTACH_RULEG">
+ Right Upper Leg
+ </string>
+ <string name="ATTACH_RLLEG">
+ Right Lower Leg
+ </string>
+ <string name="ATTACH_LHIP">
+ Left Hip
+ </string>
+ <string name="ATTACH_LULEG">
+ Left Upper Leg
+ </string>
+ <string name="ATTACH_LLLEG">
+ Left Lower Leg
+ </string>
+ <string name="ATTACH_BELLY">
+ Belly
+ </string>
+ <string name="ATTACH_RPEC">
+ Right Pec
+ </string>
+ <string name="ATTACH_LPEC">
+ Left Pec
+ </string>
+ <string name="ATTACH_HUD_CENTER_2">
+ HUD Center 2
+ </string>
+ <string name="ATTACH_HUD_TOP_RIGHT">
+ HUD Top Right
+ </string>
+ <string name="ATTACH_HUD_TOP_CENTER">
+ HUD Top Center
+ </string>
+ <string name="ATTACH_HUD_TOP_LEFT">
+ HUD Top Left
+ </string>
+ <string name="ATTACH_HUD_CENTER_1">
+ HUD Center 1
+ </string>
+ <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>
+ <string name="CursorPos">
+ Line [LINE], Column [COLUMN]
+ </string>
+ <string name="PanelDirCountFound">
+ [COUNT] found
+ </string>
+ <string name="PanelDirTimeStr">
+ [hour12,datetime,slt]:[min,datetime,slt] [ampm,datetime,slt]
+ </string>
+ <string name="PanelDirEventsDateText">
+ [mthnum,datetime,slt]/[day,datetime,slt]
+ </string>
+ <string name="PanelContentsTooltip">
+ Content of object
+ </string>
+ <string name="PanelContentsNewScript">
+ New Script
+ </string>
+ <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>
+ <string name="MuteByName">
+ (由å稱)
+ </string>
+ <string name="MuteAgent">
+ (居民)
+ </string>
+ <string name="MuteObject">
+ (物件)
+ </string>
+ <string name="MuteGroup">
+ (社團)
+ </string>
+ <string name="MuteExternal">
+ (External)
+ </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="Last Modified:"/>
+ <string name="none_text" value="(無)"/>
+ <string name="never_text" value="(絕ä¸ï¼‰"/>
+ <string name="GroupOwned">
+ 社團所æ“有
+ </string>
+ <string name="Public">
+ 公開
+ </string>
+ <string name="ClassifiedClicksTxt">
+ Clicks: [TELEPORT] teleport, [MAP] map, [PROFILE] profile
+ </string>
+ <string name="ClassifiedUpdateAfterPublish">
+ (will update after publish)
+ </string>
+ <string name="NoPicksClassifiedsText">
+ You haven&apos;t created any Picks or Classifieds. Click the Plus button below to create a Pick or Classified.
+ </string>
+ <string name="NoAvatarPicksClassifiedsText">
+ 使用者無精é¸åœ°é»žæˆ–個人廣告
+ </string>
+ <string name="PicksClassifiedsLoadingText">
+ 載入中...
+ </string>
+ <string name="MultiPreviewTitle">
+ é è¦½
+ </string>
+ <string name="MultiPropertiesTitle">
+ Properties
+ </string>
+ <string name="InvOfferAnObjectNamed">
+ An object named
+ </string>
+ <string name="InvOfferOwnedByGroup">
+ owned by the group
+ </string>
+ <string name="InvOfferOwnedByUnknownGroup">
+ owned by an unknown group
+ </string>
+ <string name="InvOfferOwnedBy">
+ owned by
+ </string>
+ <string name="InvOfferOwnedByUnknownUser">
+ owned by an unknown user
+ </string>
+ <string name="InvOfferGaveYou">
+ gave you
+ </string>
+ <string name="InvOfferDecline">
+ You decline [DESC] from &lt;nolink&gt;[NAME]&lt;/nolink&gt;.
+ </string>
+ <string name="GroupMoneyTotal">
+ Total
+ </string>
+ <string name="GroupMoneyBought">
+ bought
+ </string>
+ <string name="GroupMoneyPaidYou">
+ paid you
+ </string>
+ <string name="GroupMoneyPaidInto">
+ paid into
+ </string>
+ <string name="GroupMoneyBoughtPassTo">
+ bought pass to
+ </string>
+ <string name="GroupMoneyPaidFeeForEvent">
+ paid fee for event
+ </string>
+ <string name="GroupMoneyPaidPrizeForEvent">
+ paid prize for event
+ </string>
+ <string name="GroupMoneyBalance">
+ Balance
+ </string>
+ <string name="GroupMoneyCredits">
+ Credits
+ </string>
+ <string name="GroupMoneyDebits">
+ Debits
+ </string>
+ <string name="ViewerObjectContents">
+ Contents
+ </string>
+ <string name="AcquiredItems">
+ Acquired Items
+ </string>
+ <string name="Cancel">
+ å–消
+ </string>
+ <string name="UploadingCosts">
+ 花費 L$ [AMOUNT] 上傳 [NAME]
+ </string>
+ <string name="BuyingCosts">
+ 花費 L$ [AMOUNT] 購買這個
+ </string>
+ <string name="UnknownFileExtension">
+ 未知的副檔å .%s
+é æœŸç‚º .wav, .tga, .bmp, .jpg, .jpeg, or .bvh 類型
+ </string>
+ <string name="MuteObject2">
+ Block
+ </string>
+ <string name="MuteAvatar">
+ Block
+ </string>
+ <string name="UnmuteObject">
+ Unblock
+ </string>
+ <string name="UnmuteAvatar">
+ Unblock
+ </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">
+ AM
+ </string>
+ <string name="PM">
+ PM
+ </string>
+ <string name="PST">
+ PST
+ </string>
+ <string name="PDT">
+ 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
+ </string>
+ <string name="Property Rental">
+ Property Rental
+ </string>
+ <string name="Special Attraction">
+ Special Attraction
+ </string>
+ <string name="New Products">
+ New Products
+ </string>
+ <string name="Employment">
+ Employment
+ </string>
+ <string name="Wanted">
+ Wanted
+ </string>
+ <string name="Service">
+ Service
+ </string>
+ <string name="Personal">
+ Personal
+ </string>
+ <string name="None">
+ ç„¡
+ </string>
+ <string name="Linden Location">
+ Linden Location
+ </string>
+ <string name="Adult">
+ æˆäºº
+ </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
+ </string>
+ <string name="Other">
+ Other
+ </string>
+ <string name="Rental">
+ Rental
+ </string>
+ <string name="Any">
+ 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">
+ 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:
+ </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">
+ Notification
+ </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">
+ 5 O&apos;Clock Shadow
+ </string>
+ <string name="All White">
+ 全白
+ </string>
+ <string name="Anime Eyes">
+ Anime Eyes
+ </string>
+ <string name="Arced">
+ Arced
+ </string>
+ <string name="Arm Length">
+ Arm Length
+ </string>
+ <string name="Attached">
+ Attached
+ </string>
+ <string name="Attached Earlobes">
+ Attached Earlobes
+ </string>
+ <string name="Back Fringe">
+ Back Fringe
+ </string>
+ <string name="Baggy">
+ Baggy
+ </string>
+ <string name="Bangs">
+ Bangs
+ </string>
+ <string name="Beady Eyes">
+ Beady Eyes
+ </string>
+ <string name="Belly Size">
+ Belly Size
+ </string>
+ <string name="Big">
+ Big
+ </string>
+ <string name="Big Butt">
+ Big Butt
+ </string>
+ <string name="Big Hair Back">
+ Big Hair: Back
+ </string>
+ <string name="Big Hair Front">
+ Big Hair: Front
+ </string>
+ <string name="Big Hair Top">
+ Big Hair: Top
+ </string>
+ <string name="Big Head">
+ Big Head
+ </string>
+ <string name="Big Pectorals">
+ Big Pectorals
+ </string>
+ <string name="Big Spikes">
+ Big Spikes
+ </string>
+ <string name="Black">
+ Black
+ </string>
+ <string name="Blonde">
+ Blonde
+ </string>
+ <string name="Blonde Hair">
+ Blonde Hair
+ </string>
+ <string name="Blush">
+ Blush
+ </string>
+ <string name="Blush Color">
+ Blush Color
+ </string>
+ <string name="Blush Opacity">
+ Blush Opacity
+ </string>
+ <string name="Body Definition">
+ Body Definition
+ </string>
+ <string name="Body Fat">
+ Body Fat
+ </string>
+ <string name="Body Freckles">
+ Body Freckles
+ </string>
+ <string name="Body Thick">
+ Body Thick
+ </string>
+ <string name="Body Thickness">
+ Body Thickness
+ </string>
+ <string name="Body Thin">
+ Body Thin
+ </string>
+ <string name="Bow Legged">
+ Bow Legged
+ </string>
+ <string name="Breast Buoyancy">
+ Breast Buoyancy
+ </string>
+ <string name="Breast Cleavage">
+ Breast Cleavage
+ </string>
+ <string name="Breast Size">
+ Breast Size
+ </string>
+ <string name="Bridge Width">
+ Bridge Width
+ </string>
+ <string name="Broad">
+ Broad
+ </string>
+ <string name="Brow Size">
+ Brow Size
+ </string>
+ <string name="Bug Eyes">
+ Bug Eyes
+ </string>
+ <string name="Bugged Eyes">
+ Bugged Eyes
+ </string>
+ <string name="Bulbous">
+ Bulbous
+ </string>
+ <string name="Bulbous Nose">
+ Bulbous Nose
+ </string>
+ <string name="Breast Physics Mass">
+ Breast Mass
+ </string>
+ <string name="Breast Physics Smoothing">
+ Breast Smoothing
+ </string>
+ <string name="Breast Physics Gravity">
+ Breast Gravity
+ </string>
+ <string name="Breast Physics Drag">
+ Breast Drag
+ </string>
+ <string name="Breast Physics InOut Max Effect">
+ Max Effect
+ </string>
+ <string name="Breast Physics InOut Spring">
+ Spring
+ </string>
+ <string name="Breast Physics InOut Gain">
+ Gain
+ </string>
+ <string name="Breast Physics InOut Damping">
+ Damping
+ </string>
+ <string name="Breast Physics UpDown Max Effect">
+ Max Effect
+ </string>
+ <string name="Breast Physics UpDown Spring">
+ Spring
+ </string>
+ <string name="Breast Physics UpDown Gain">
+ Gain
+ </string>
+ <string name="Breast Physics UpDown Damping">
+ Damping
+ </string>
+ <string name="Breast Physics LeftRight Max Effect">
+ Max Effect
+ </string>
+ <string name="Breast Physics LeftRight Spring">
+ Spring
+ </string>
+ <string name="Breast Physics LeftRight Gain">
+ Gain
+ </string>
+ <string name="Breast Physics LeftRight Damping">
+ Damping
+ </string>
+ <string name="Belly Physics Mass">
+ Belly Mass
+ </string>
+ <string name="Belly Physics Smoothing">
+ Belly Smoothing
+ </string>
+ <string name="Belly Physics Gravity">
+ Belly Gravity
+ </string>
+ <string name="Belly Physics Drag">
+ Belly Drag
+ </string>
+ <string name="Belly Physics UpDown Max Effect">
+ Max Effect
+ </string>
+ <string name="Belly Physics UpDown Spring">
+ Spring
+ </string>
+ <string name="Belly Physics UpDown Gain">
+ Gain
+ </string>
+ <string name="Belly Physics UpDown Damping">
+ Damping
+ </string>
+ <string name="Butt Physics Mass">
+ Butt Mass
+ </string>
+ <string name="Butt Physics Smoothing">
+ Butt Smoothing
+ </string>
+ <string name="Butt Physics Gravity">
+ Butt Gravity
+ </string>
+ <string name="Butt Physics Drag">
+ Butt Drag
+ </string>
+ <string name="Butt Physics UpDown Max Effect">
+ Max Effect
+ </string>
+ <string name="Butt Physics UpDown Spring">
+ Spring
+ </string>
+ <string name="Butt Physics UpDown Gain">
+ Gain
+ </string>
+ <string name="Butt Physics UpDown Damping">
+ Damping
+ </string>
+ <string name="Butt Physics LeftRight Max Effect">
+ Max Effect
+ </string>
+ <string name="Butt Physics LeftRight Spring">
+ Spring
+ </string>
+ <string name="Butt Physics LeftRight Gain">
+ Gain
+ </string>
+ <string name="Butt Physics LeftRight Damping">
+ Damping
+ </string>
+ <string name="Bushy Eyebrows">
+ Bushy Eyebrows
+ </string>
+ <string name="Bushy Hair">
+ Bushy Hair
+ </string>
+ <string name="Butt Size">
+ Butt Size
+ </string>
+ <string name="Butt Gravity">
+ Butt Gravity
+ </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">
+ Chaplin
+ </string>
+ <string name="Cheek Bones">
+ Cheek Bones
+ </string>
+ <string name="Chest Size">
+ Chest Size
+ </string>
+ <string name="Chin Angle">
+ 下巴角度
+ </string>
+ <string name="Chin Cleft">
+ Chin Cleft
+ </string>
+ <string name="Chin Curtains">
+ Chin Curtains
+ </string>
+ <string name="Chin Depth">
+ Chin Depth
+ </string>
+ <string name="Chin Heavy">
+ Chin Heavy
+ </string>
+ <string name="Chin In">
+ Chin In
+ </string>
+ <string name="Chin Out">
+ Chin Out
+ </string>
+ <string name="Chin-Neck">
+ Chin-Neck
+ </string>
+ <string name="Clear">
+ 清除
+ </string>
+ <string name="Cleft">
+ Cleft
+ </string>
+ <string name="Close Set Eyes">
+ Close Set Eyes
+ </string>
+ <string name="Closed">
+ Closed
+ </string>
+ <string name="Closed Back">
+ Closed Back
+ </string>
+ <string name="Closed Front">
+ Closed Front
+ </string>
+ <string name="Closed Left">
+ Closed Left
+ </string>
+ <string name="Closed Right">
+ Closed Right
+ </string>
+ <string name="Coin Purse">
+ Coin Purse
+ </string>
+ <string name="Collar Back">
+ Collar Back
+ </string>
+ <string name="Collar Front">
+ Collar Front
+ </string>
+ <string name="Corner Down">
+ Corner Down
+ </string>
+ <string name="Corner Up">
+ Corner Up
+ </string>
+ <string name="Creased">
+ Creased
+ </string>
+ <string name="Crooked Nose">
+ Crooked Nose
+ </string>
+ <string name="Cuff Flare">
+ Cuff Flare
+ </string>
+ <string name="Dark">
+ Dark
+ </string>
+ <string name="Dark Green">
+ Dark Green
+ </string>
+ <string name="Darker">
+ Darker
+ </string>
+ <string name="Deep">
+ Deep
+ </string>
+ <string name="Default Heels">
+ Default Heels
+ </string>
+ <string name="Dense">
+ Dense
+ </string>
+ <string name="Double Chin">
+ Double Chin
+ </string>
+ <string name="Downturned">
+ Downturned
+ </string>
+ <string name="Duffle Bag">
+ Duffle Bag
+ </string>
+ <string name="Ear Angle">
+ Ear Angle
+ </string>
+ <string name="Ear Size">
+ Ear Size
+ </string>
+ <string name="Ear Tips">
+ Ear Tips
+ </string>
+ <string name="Egg Head">
+ Egg Head
+ </string>
+ <string name="Eye Bags">
+ Eye Bags
+ </string>
+ <string name="Eye Color">
+ Eye Color
+ </string>
+ <string name="Eye Depth">
+ Eye Depth
+ </string>
+ <string name="Eye Lightness">
+ Eye Lightness
+ </string>
+ <string name="Eye Opening">
+ Eye Opening
+ </string>
+ <string name="Eye Pop">
+ Eye Pop
+ </string>
+ <string name="Eye Size">
+ Eye Size
+ </string>
+ <string name="Eye Spacing">
+ Eye Spacing
+ </string>
+ <string name="Eyebrow Arc">
+ Eyebrow Arc
+ </string>
+ <string name="Eyebrow Density">
+ Eyebrow Density
+ </string>
+ <string name="Eyebrow Height">
+ Eyebrow Height
+ </string>
+ <string name="Eyebrow Points">
+ Eyebrow Points
+ </string>
+ <string name="Eyebrow Size">
+ Eyebrow Size
+ </string>
+ <string name="Eyelash Length">
+ Eyelash Length
+ </string>
+ <string name="Eyeliner">
+ Eyeliner
+ </string>
+ <string name="Eyeliner Color">
+ Eyeliner Color
+ </string>
+ <string name="Eyes Bugged">
+ Eyes Bugged
+ </string>
+ <string name="Face Shear">
+ Face Shear
+ </string>
+ <string name="Facial Definition">
+ Facial Definition
+ </string>
+ <string name="Far Set Eyes">
+ Far Set Eyes
+ </string>
+ <string name="Fat Lips">
+ Fat Lips
+ </string>
+ <string name="Female">
+ Female
+ </string>
+ <string name="Fingerless">
+ Fingerless
+ </string>
+ <string name="Fingers">
+ Fingers
+ </string>
+ <string name="Flared Cuffs">
+ Flared Cuffs
+ </string>
+ <string name="Flat">
+ Flat
+ </string>
+ <string name="Flat Butt">
+ Flat Butt
+ </string>
+ <string name="Flat Head">
+ Flat Head
+ </string>
+ <string name="Flat Toe">
+ Flat Toe
+ </string>
+ <string name="Foot Size">
+ Foot Size
+ </string>
+ <string name="Forehead Angle">
+ Forehead Angle
+ </string>
+ <string name="Forehead Heavy">
+ Forehead Heavy
+ </string>
+ <string name="Freckles">
+ Freckles
+ </string>
+ <string name="Front Fringe">
+ Front Fringe
+ </string>
+ <string name="Full Back">
+ Full Back
+ </string>
+ <string name="Full Eyeliner">
+ Full Eyeliner
+ </string>
+ <string name="Full Front">
+ Full Front
+ </string>
+ <string name="Full Hair Sides">
+ Full Hair Sides
+ </string>
+ <string name="Full Sides">
+ Full Sides
+ </string>
+ <string name="Glossy">
+ Glossy
+ </string>
+ <string name="Glove Fingers">
+ Glove Fingers
+ </string>
+ <string name="Glove Length">
+ Glove Length
+ </string>
+ <string name="Hair">
+ é ­é«®
+ </string>
+ <string name="Hair Back">
+ Hair: Back
+ </string>
+ <string name="Hair Front">
+ Hair: Front
+ </string>
+ <string name="Hair Sides">
+ Hair: Sides
+ </string>
+ <string name="Hair Sweep">
+ Hair Sweep
+ </string>
+ <string name="Hair Thickess">
+ Hair Thickness
+ </string>
+ <string name="Hair Thickness">
+ Hair Thickness
+ </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">
+ Hair: Volume
+ </string>
+ <string name="Hand Size">
+ Hand Size
+ </string>
+ <string name="Handlebars">
+ Handlebars
+ </string>
+ <string name="Head Length">
+ Head Length
+ </string>
+ <string name="Head Shape">
+ Head Shape
+ </string>
+ <string name="Head Size">
+ Head Size
+ </string>
+ <string name="Head Stretch">
+ Head Stretch
+ </string>
+ <string name="Heel Height">
+ Heel Height
+ </string>
+ <string name="Heel Shape">
+ Heel Shape
+ </string>
+ <string name="Height">
+ Height
+ </string>
+ <string name="High">
+ High
+ </string>
+ <string name="High Heels">
+ High Heels
+ </string>
+ <string name="High Jaw">
+ High Jaw
+ </string>
+ <string name="High Platforms">
+ High Platforms
+ </string>
+ <string name="High and Tight">
+ High and Tight
+ </string>
+ <string name="Higher">
+ Higher
+ </string>
+ <string name="Hip Length">
+ Hip Length
+ </string>
+ <string name="Hip Width">
+ Hip Width
+ </string>
+ <string name="In">
+ In
+ </string>
+ <string name="In Shdw Color">
+ Inner Shadow Color
+ </string>
+ <string name="In Shdw Opacity">
+ Inner Shadow Opacity
+ </string>
+ <string name="Inner Eye Corner">
+ Inner Eye Corner
+ </string>
+ <string name="Inner Eye Shadow">
+ Inner Eye Shadow
+ </string>
+ <string name="Inner Shadow">
+ Inner Shadow
+ </string>
+ <string name="Jacket Length">
+ Jacket Length
+ </string>
+ <string name="Jacket Wrinkles">
+ Jacket Wrinkles
+ </string>
+ <string name="Jaw Angle">
+ Jaw Angle
+ </string>
+ <string name="Jaw Jut">
+ Jaw Jut
+ </string>
+ <string name="Jaw Shape">
+ Jaw Shape
+ </string>
+ <string name="Join">
+ Join
+ </string>
+ <string name="Jowls">
+ Jowls
+ </string>
+ <string name="Knee Angle">
+ Knee Angle
+ </string>
+ <string name="Knock Kneed">
+ Knock Kneed
+ </string>
+ <string name="Large">
+ Large
+ </string>
+ <string name="Large Hands">
+ Large Hands
+ </string>
+ <string name="Left Part">
+ Left Part
+ </string>
+ <string name="Leg Length">
+ Leg Length
+ </string>
+ <string name="Leg Muscles">
+ Leg Muscles
+ </string>
+ <string name="Less">
+ Less
+ </string>
+ <string name="Less Body Fat">
+ Less Body Fat
+ </string>
+ <string name="Less Curtains">
+ Less Curtains
+ </string>
+ <string name="Less Freckles">
+ Less Freckles
+ </string>
+ <string name="Less Full">
+ Less Full
+ </string>
+ <string name="Less Gravity">
+ Less Gravity
+ </string>
+ <string name="Less Love">
+ Less Love
+ </string>
+ <string name="Less Muscles">
+ Less Muscles
+ </string>
+ <string name="Less Muscular">
+ Less Muscular
+ </string>
+ <string name="Less Rosy">
+ Less Rosy
+ </string>
+ <string name="Less Round">
+ Less Round
+ </string>
+ <string name="Less Saddle">
+ Less Saddle
+ </string>
+ <string name="Less Square">
+ Less Square
+ </string>
+ <string name="Less Volume">
+ Less Volume
+ </string>
+ <string name="Less soul">
+ Less soul
+ </string>
+ <string name="Lighter">
+ Lighter
+ </string>
+ <string name="Lip Cleft">
+ Lip Cleft
+ </string>
+ <string name="Lip Cleft Depth">
+ Lip Cleft Depth
+ </string>
+ <string name="Lip Fullness">
+ Lip Fullness
+ </string>
+ <string name="Lip Pinkness">
+ Lip Pinkness
+ </string>
+ <string name="Lip Ratio">
+ Lip Ratio
+ </string>
+ <string name="Lip Thickness">
+ Lip Thickness
+ </string>
+ <string name="Lip Width">
+ Lip Width
+ </string>
+ <string name="Lipgloss">
+ Lipgloss
+ </string>
+ <string name="Lipstick">
+ Lipstick
+ </string>
+ <string name="Lipstick Color">
+ Lipstick Color
+ </string>
+ <string name="Long">
+ Long
+ </string>
+ <string name="Long Head">
+ Long Head
+ </string>
+ <string name="Long Hips">
+ Long Hips
+ </string>
+ <string name="Long Legs">
+ Long Legs
+ </string>
+ <string name="Long Neck">
+ Long Neck
+ </string>
+ <string name="Long Pigtails">
+ Long Pigtails
+ </string>
+ <string name="Long Ponytail">
+ Long Ponytail
+ </string>
+ <string name="Long Torso">
+ Long Torso
+ </string>
+ <string name="Long arms">
+ Long arms
+ </string>
+ <string name="Loose Pants">
+ Loose Pants
+ </string>
+ <string name="Loose Shirt">
+ Loose Shirt
+ </string>
+ <string name="Loose Sleeves">
+ Loose Sleeves
+ </string>
+ <string name="Love Handles">
+ Love Handles
+ </string>
+ <string name="Low">
+ Low
+ </string>
+ <string name="Low Heels">
+ Low Heels
+ </string>
+ <string name="Low Jaw">
+ Low Jaw
+ </string>
+ <string name="Low Platforms">
+ Low Platforms
+ </string>
+ <string name="Low and Loose">
+ Low and Loose
+ </string>
+ <string name="Lower">
+ Lower
+ </string>
+ <string name="Lower Bridge">
+ Lower Bridge
+ </string>
+ <string name="Lower Cheeks">
+ Lower Cheeks
+ </string>
+ <string name="Male">
+ 男性
+ </string>
+ <string name="Middle Part">
+ Middle Part
+ </string>
+ <string name="More">
+ More
+ </string>
+ <string name="More Blush">
+ More Blush
+ </string>
+ <string name="More Body Fat">
+ More Body Fat
+ </string>
+ <string name="More Curtains">
+ More Curtains
+ </string>
+ <string name="More Eyeshadow">
+ More Eyeshadow
+ </string>
+ <string name="More Freckles">
+ More Freckles
+ </string>
+ <string name="More Full">
+ More Full
+ </string>
+ <string name="More Gravity">
+ More Gravity
+ </string>
+ <string name="More Lipstick">
+ More Lipstick
+ </string>
+ <string name="More Love">
+ More Love
+ </string>
+ <string name="More Lower Lip">
+ More Lower Lip
+ </string>
+ <string name="More Muscles">
+ More Muscles
+ </string>
+ <string name="More Muscular">
+ More Muscular
+ </string>
+ <string name="More Rosy">
+ More Rosy
+ </string>
+ <string name="More Round">
+ More Round
+ </string>
+ <string name="More Saddle">
+ More Saddle
+ </string>
+ <string name="More Sloped">
+ More Sloped
+ </string>
+ <string name="More Square">
+ More Square
+ </string>
+ <string name="More Upper Lip">
+ More Upper Lip
+ </string>
+ <string name="More Vertical">
+ More Vertical
+ </string>
+ <string name="More Volume">
+ More Volume
+ </string>
+ <string name="More soul">
+ More soul
+ </string>
+ <string name="Moustache">
+ Moustache
+ </string>
+ <string name="Mouth Corner">
+ Mouth Corner
+ </string>
+ <string name="Mouth Position">
+ Mouth Position
+ </string>
+ <string name="Mowhawk">
+ Mowhawk
+ </string>
+ <string name="Muscular">
+ Muscular
+ </string>
+ <string name="Mutton Chops">
+ Mutton Chops
+ </string>
+ <string name="Nail Polish">
+ Nail Polish
+ </string>
+ <string name="Nail Polish Color">
+ Nail Polish Color
+ </string>
+ <string name="Narrow">
+ Narrow
+ </string>
+ <string name="Narrow Back">
+ Narrow Back
+ </string>
+ <string name="Narrow Front">
+ Narrow Front
+ </string>
+ <string name="Narrow Lips">
+ Narrow Lips
+ </string>
+ <string name="Natural">
+ Natural
+ </string>
+ <string name="Neck Length">
+ Neck Length
+ </string>
+ <string name="Neck Thickness">
+ Neck Thickness
+ </string>
+ <string name="No Blush">
+ No Blush
+ </string>
+ <string name="No Eyeliner">
+ No Eyeliner
+ </string>
+ <string name="No Eyeshadow">
+ No Eyeshadow
+ </string>
+ <string name="No Lipgloss">
+ No Lipgloss
+ </string>
+ <string name="No Lipstick">
+ No Lipstick
+ </string>
+ <string name="No Part">
+ No Part
+ </string>
+ <string name="No Polish">
+ No Polish
+ </string>
+ <string name="No Red">
+ No Red
+ </string>
+ <string name="No Spikes">
+ No Spikes
+ </string>
+ <string name="No White">
+ No White
+ </string>
+ <string name="No Wrinkles">
+ No Wrinkles
+ </string>
+ <string name="Normal Lower">
+ Normal Lower
+ </string>
+ <string name="Normal Upper">
+ Normal Upper
+ </string>
+ <string name="Nose Left">
+ Nose Left
+ </string>
+ <string name="Nose Right">
+ Nose Right
+ </string>
+ <string name="Nose Size">
+ Nose Size
+ </string>
+ <string name="Nose Thickness">
+ Nose Thickness
+ </string>
+ <string name="Nose Tip Angle">
+ Nose Tip Angle
+ </string>
+ <string name="Nose Tip Shape">
+ Nose Tip Shape
+ </string>
+ <string name="Nose Width">
+ Nose Width
+ </string>
+ <string name="Nostril Division">
+ Nostril Division
+ </string>
+ <string name="Nostril Width">
+ Nostril Width
+ </string>
+ <string name="Opaque">
+ Opaque
+ </string>
+ <string name="Open">
+ Open
+ </string>
+ <string name="Open Back">
+ Open Back
+ </string>
+ <string name="Open Front">
+ Open Front
+ </string>
+ <string name="Open Left">
+ Open Left
+ </string>
+ <string name="Open Right">
+ Open Right
+ </string>
+ <string name="Orange">
+ Orange
+ </string>
+ <string name="Out">
+ Out
+ </string>
+ <string name="Out Shdw Color">
+ Outer Shadow Color
+ </string>
+ <string name="Out Shdw Opacity">
+ Outer Shadow Opacity
+ </string>
+ <string name="Outer Eye Corner">
+ Outer Eye Corner
+ </string>
+ <string name="Outer Eye Shadow">
+ Outer Eye Shadow
+ </string>
+ <string name="Outer Shadow">
+ Outer Shadow
+ </string>
+ <string name="Overbite">
+ Overbite
+ </string>
+ <string name="Package">
+ Package
+ </string>
+ <string name="Painted Nails">
+ Painted Nails
+ </string>
+ <string name="Pale">
+ Pale
+ </string>
+ <string name="Pants Crotch">
+ Pants Crotch
+ </string>
+ <string name="Pants Fit">
+ Pants Fit
+ </string>
+ <string name="Pants Length">
+ Pants Length
+ </string>
+ <string name="Pants Waist">
+ Pants Waist
+ </string>
+ <string name="Pants Wrinkles">
+ Pants Wrinkles
+ </string>
+ <string name="Part">
+ Part
+ </string>
+ <string name="Part Bangs">
+ Part Bangs
+ </string>
+ <string name="Pectorals">
+ Pectorals
+ </string>
+ <string name="Pigment">
+ Pigment
+ </string>
+ <string name="Pigtails">
+ Pigtails
+ </string>
+ <string name="Pink">
+ Pink
+ </string>
+ <string name="Pinker">
+ Pinker
+ </string>
+ <string name="Platform Height">
+ Platform Height
+ </string>
+ <string name="Platform Width">
+ Platform Width
+ </string>
+ <string name="Pointy">
+ Pointy
+ </string>
+ <string name="Pointy Heels">
+ Pointy Heels
+ </string>
+ <string name="Ponytail">
+ Ponytail
+ </string>
+ <string name="Poofy Skirt">
+ Poofy Skirt
+ </string>
+ <string name="Pop Left Eye">
+ Pop Left Eye
+ </string>
+ <string name="Pop Right Eye">
+ Pop Right Eye
+ </string>
+ <string name="Puffy">
+ Puffy
+ </string>
+ <string name="Puffy Eyelids">
+ Puffy Eyelids
+ </string>
+ <string name="Rainbow Color">
+ Rainbow Color
+ </string>
+ <string name="Red Hair">
+ Red Hair
+ </string>
+ <string name="Regular">
+ Regular
+ </string>
+ <string name="Right Part">
+ Right Part
+ </string>
+ <string name="Rosy Complexion">
+ Rosy Complexion
+ </string>
+ <string name="Round">
+ Round
+ </string>
+ <string name="Ruddiness">
+ Ruddiness
+ </string>
+ <string name="Ruddy">
+ Ruddy
+ </string>
+ <string name="Rumpled Hair">
+ Rumpled Hair
+ </string>
+ <string name="Saddle Bags">
+ Saddle Bags
+ </string>
+ <string name="Scrawny Leg">
+ Scrawny Leg
+ </string>
+ <string name="Separate">
+ Separate
+ </string>
+ <string name="Shallow">
+ Shallow
+ </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 Up">
+ Shear Left Up
+ </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">
+ Shift Left
+ </string>
+ <string name="Shift Mouth">
+ Shift Mouth
+ </string>
+ <string name="Shift Right">
+ Shift Right
+ </string>
+ <string name="Shirt Bottom">
+ Shirt Bottom
+ </string>
+ <string name="Shirt Fit">
+ Shirt Fit
+ </string>
+ <string name="Shirt Wrinkles">
+ Shirt Wrinkles
+ </string>
+ <string name="Shoe Height">
+ Shoe Height
+ </string>
+ <string name="Short">
+ Short
+ </string>
+ <string name="Short Arms">
+ Short Arms
+ </string>
+ <string name="Short Legs">
+ Short Legs
+ </string>
+ <string name="Short Neck">
+ Short Neck
+ </string>
+ <string name="Short Pigtails">
+ Short Pigtails
+ </string>
+ <string name="Short Ponytail">
+ Short Ponytail
+ </string>
+ <string name="Short Sideburns">
+ Short Sideburns
+ </string>
+ <string name="Short Torso">
+ Short Torso
+ </string>
+ <string name="Short hips">
+ Short hips
+ </string>
+ <string name="Shoulders">
+ Shoulders
+ </string>
+ <string name="Side Fringe">
+ Side Fringe
+ </string>
+ <string name="Sideburns">
+ Sideburns
+ </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 Neck">
+ Skinny Neck
+ </string>
+ <string name="Skirt Fit">
+ Skirt Fit
+ </string>
+ <string name="Skirt Length">
+ Skirt Length
+ </string>
+ <string name="Slanted Forehead">
+ Slanted Forehead
+ </string>
+ <string name="Sleeve Length">
+ Sleeve Length
+ </string>
+ <string name="Sleeve Looseness">
+ Sleeve Looseness
+ </string>
+ <string name="Slit Back">
+ Slit: Back
+ </string>
+ <string name="Slit Front">
+ Slit: Front
+ </string>
+ <string name="Slit Left">
+ Slit: Left
+ </string>
+ <string name="Slit Right">
+ Slit: Right
+ </string>
+ <string name="Small">
+ Small
+ </string>
+ <string name="Small Hands">
+ Small Hands
+ </string>
+ <string name="Small Head">
+ Small Head
+ </string>
+ <string name="Smooth">
+ Smooth
+ </string>
+ <string name="Smooth Hair">
+ Smooth Hair
+ </string>
+ <string name="Socks Length">
+ Socks Length
+ </string>
+ <string name="Soulpatch">
+ Soulpatch
+ </string>
+ <string name="Sparse">
+ Sparse
+ </string>
+ <string name="Spiked Hair">
+ Spiked Hair
+ </string>
+ <string name="Square">
+ Square
+ </string>
+ <string name="Square Toe">
+ Square Toe
+ </string>
+ <string name="Squash Head">
+ Squash Head
+ </string>
+ <string name="Stretch Head">
+ Stretch Head
+ </string>
+ <string name="Sunken">
+ Sunken
+ </string>
+ <string name="Sunken Chest">
+ Sunken Chest
+ </string>
+ <string name="Sunken Eyes">
+ Sunken Eyes
+ </string>
+ <string name="Sweep Back">
+ Sweep Back
+ </string>
+ <string name="Sweep Forward">
+ Sweep Forward
+ </string>
+ <string name="Tall">
+ Tall
+ </string>
+ <string name="Taper Back">
+ Taper Back
+ </string>
+ <string name="Taper Front">
+ Taper Front
+ </string>
+ <string name="Thick Heels">
+ Thick Heels
+ </string>
+ <string name="Thick Neck">
+ Thick Neck
+ </string>
+ <string name="Thick Toe">
+ Thick Toe
+ </string>
+ <string name="Thin">
+ Thin
+ </string>
+ <string name="Thin Eyebrows">
+ Thin Eyebrows
+ </string>
+ <string name="Thin Lips">
+ Thin Lips
+ </string>
+ <string name="Thin Nose">
+ Thin Nose
+ </string>
+ <string name="Tight Chin">
+ Tight Chin
+ </string>
+ <string name="Tight Cuffs">
+ Tight Cuffs
+ </string>
+ <string name="Tight Pants">
+ Tight Pants
+ </string>
+ <string name="Tight Shirt">
+ Tight Shirt
+ </string>
+ <string name="Tight Skirt">
+ Tight Skirt
+ </string>
+ <string name="Tight Sleeves">
+ Tight Sleeves
+ </string>
+ <string name="Toe Shape">
+ Toe Shape
+ </string>
+ <string name="Toe Thickness">
+ Toe Thickness
+ </string>
+ <string name="Torso Length">
+ Torso Length
+ </string>
+ <string name="Torso Muscles">
+ Torso Muscles
+ </string>
+ <string name="Torso Scrawny">
+ Torso Scrawny
+ </string>
+ <string name="Unattached">
+ Unattached
+ </string>
+ <string name="Uncreased">
+ Uncreased
+ </string>
+ <string name="Underbite">
+ Underbite
+ </string>
+ <string name="Unnatural">
+ Unnatural
+ </string>
+ <string name="Upper Bridge">
+ Upper Bridge
+ </string>
+ <string name="Upper Cheeks">
+ Upper Cheeks
+ </string>
+ <string name="Upper Chin Cleft">
+ Upper Chin Cleft
+ </string>
+ <string name="Upper Eyelid Fold">
+ Upper Eyelid Fold
+ </string>
+ <string name="Upturned">
+ Upturned
+ </string>
+ <string name="Very Red">
+ Very Red
+ </string>
+ <string name="Waist Height">
+ Waist Height
+ </string>
+ <string name="Well-Fed">
+ Well-Fed
+ </string>
+ <string name="White Hair">
+ White Hair
+ </string>
+ <string name="Wide">
+ Wide
+ </string>
+ <string name="Wide Back">
+ Wide Back
+ </string>
+ <string name="Wide Front">
+ Wide Front
+ </string>
+ <string name="Wide Lips">
+ Wide Lips
+ </string>
+ <string name="Wild">
+ Wild
+ </string>
+ <string name="Wrinkles">
+ 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">
+ Voice not available here
+ </string>
+ <string name="LocationCtrlFlyTooltip">
+ ä¸å…許飛行
+ </string>
+ <string name="LocationCtrlPushTooltip">
+ ç¦æ­¢æŽ¨æ’ž
+ </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">
+ æˆäººåœ°å€
+ </string>
+ <string name="LocationCtrlModerateIconTooltip">
+ Moderate Region
+ </string>
+ <string name="LocationCtrlGeneralIconTooltip">
+ 一般地å€
+ </string>
+ <string name="UpdaterWindowTitle">
+ [APP_NAME] æ›´æ–°
+ </string>
+ <string name="UpdaterNowUpdating">
+ [APP_NAME] ç¾æ›´æ–°ä¸­...
+ </string>
+ <string name="UpdaterNowInstalling">
+ [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">
+ 更新下載中...
+ </string>
+ <string name="UpdaterProgressBarText">
+ 更新下載
+ </string>
+ <string name="UpdaterFailDownloadTitle">
+ å¤è¼‰æ›´æ–°å¤±æ•—
+ </string>
+ <string name="UpdaterFailUpdateDescriptive">
+ An error occurred while updating [APP_NAME]. Please download the latest version from www.secondlife.com.
+ </string>
+ <string name="UpdaterFailInstallTitle">
+ 安è£æ›´æ–°å¤±æ•—
+ </string>
+ <string name="UpdaterFailStartTitle">
+ å•Ÿå‹•ç€è¦½å™¨å¤±æ•—
+ </string>
+ <string name="ItemsComingInTooFastFrom">
+ [APP_NAME]: Items coming in too fast from [FROM_NAME], automatic preview disabled for [TIME] seconds
+ </string>
+ <string name="ItemsComingInTooFast">
+ [APP_NAME]: Items coming in too fast, automatic preview disabled for [TIME] seconds
+ </string>
+ <string name="IM_logging_string">
+ -- Instant message logging enabled --
+ </string>
+ <string name="IM_typing_start_string">
+ [NAME] 正在輸入...
+ </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="Saved_message">
+ (Saved [LONG_TIMESTAMP])
+ </string>
+ <string name="answered_call">
+ Your call has been answered
+ </string>
+ <string name="you_started_call">
+ You started a voice call
+ </string>
+ <string name="you_joined_call">
+ You joined the voice call
+ </string>
+ <string name="name_started_call">
+ [NAME] started a voice call
+ </string>
+ <string name="ringing-im">
+ 加入語音通話...
+ </string>
+ <string name="connected-im">
+ 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
+ </string>
+ <string name="conference-title-incoming">
+ Conference with [AGENT_NAME]
+ </string>
+ <string name="inventory_item_offered-im">
+ Inventory item offered
+ </string>
+ <string name="share_alert">
+ Drag items from inventory here
+ </string>
+ <string name="no_session_message">
+ (IM 會話ä¸å­˜åœ¨ï¼‰
+ </string>
+ <string name="only_user_message">
+ You are the only user in this session.
+ </string>
+ <string name="offline_message">
+ [NAME] 離線。
+ </string>
+ <string name="invite_message">
+ Click the [BUTTON NAME] button to accept/connect to this voice chat.
+ </string>
+ <string name="muted_message">
+ You have blocked this Resident. Sending a message will automatically unblock them.
+ </string>
+ <string name="generic">
+ Error making request, please try again later.
+ </string>
+ <string name="generic_request_error">
+ Error making request, please try again later.
+ </string>
+ <string name="insufficient_perms_error">
+ You do not have sufficient permissions.
+ </string>
+ <string name="session_does_not_exist_error">
+ 此會話ä¸å†å­˜åœ¨
+ </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.
+ </string>
+ <string name="muted">
+ A group moderator disabled your text chat.
+ </string>
+ <string name="muted_error">
+ A group moderator disabled your text chat.
+ </string>
+ <string name="add_session_event">
+ Unable to add users to chat session with [RECIPIENT].
+ </string>
+ <string name="message">
+ Unable to send your message to the chat session with [RECIPIENT].
+ </string>
+ <string name="message_session_event">
+ Unable to send your message to the chat session with [RECIPIENT].
+ </string>
+ <string name="mute">
+ Error while moderating.
+ </string>
+ <string name="removed">
+ You have been removed from the group.
+ </string>
+ <string name="removed_from_group">
+ You have been removed from the group.
+ </string>
+ <string name="close_on_no_ability">
+ You no longer have the ability to be in the chat session.
+ </string>
+ <string name="unread_chat_single">
+ [SOURCES] has said something new
+ </string>
+ <string name="unread_chat_multiple">
+ [SOURCES] have said something new
+ </string>
+ <string name="session_initialization_timed_out_error">
+ The session initialization is timed out
+ </string>
+ <string name="voice_morphing_url">
+ http://secondlife.com/landing/voicemorphing
+ </string>
+ <string name="paid_you_ldollars">
+ [NAME] paid you L$[AMOUNT] [REASON].
+ </string>
+ <string name="paid_you_ldollars_no_reason">
+ [NAME] paid you L$[AMOUNT].
+ </string>
+ <string name="you_paid_ldollars">
+ You paid [NAME] L$[AMOUNT] [REASON].
+ </string>
+ <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="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>
+ <string name="for deeding land">
+ 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">
+ to publish a classified ad
+ </string>
+ <string name="giving">
+ Giving L$ [AMOUNT]
+ </string>
+ <string name="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">
+ 任何人
+ </string>
+ <string name="group_role_officers">
+ Officers
+ </string>
+ <string name="group_role_owners">
+ 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">
+ New Alpha
+ </string>
+ <string name="New Tattoo">
+ 新刺é’
+ </string>
+ <string name="New Physics">
+ New Physics
+ </string>
+ <string name="Invalid Wearable">
+ 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">
+ 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">
+ Male - Excuse me
+ </string>
+ <string name="Male - Get lost">
+ Male - Get lost
+ </string>
+ <string name="Male - Blow kiss">
+ Male - Blow kiss
+ </string>
+ <string name="Male - Boo">
+ Male - Boo
+ </string>
+ <string name="Male - Bored">
+ Male - Bored
+ </string>
+ <string name="Male - Hey">
+ Male - Hey
+ </string>
+ <string name="Male - Laugh">
+ Male - Laugh
+ </string>
+ <string name="Male - Repulsed">
+ Male - Repulsed
+ </string>
+ <string name="Male - Shrug">
+ Male - Shrug
+ </string>
+ <string name="Male - Stick tougue out">
+ Male - Stick tougue out
+ </string>
+ <string name="Male - Wow">
+ Male - Wow
+ </string>
+ <string name="Female - Chuckle">
+ Female - Chuckle
+ </string>
+ <string name="Female - Cry">
+ Female - Cry
+ </string>
+ <string name="Female - Embarrassed">
+ Female - Embarrassed
+ </string>
+ <string name="Female - Excuse me">
+ Female - Excuse me
+ </string>
+ <string name="Female - Get lost">
+ Female - Get lost
+ </string>
+ <string name="Female - Blow kiss">
+ Female - Blow kiss
+ </string>
+ <string name="Female - Boo">
+ Female - Boo
+ </string>
+ <string name="Female - Bored">
+ Female - Bored
+ </string>
+ <string name="Female - Hey">
+ Female - Hey
+ </string>
+ <string name="Female - Hey baby">
+ Female - Hey baby
+ </string>
+ <string name="Female - Laugh">
+ Female - Laugh
+ </string>
+ <string name="Female - Looking good">
+ Female - Looking good
+ </string>
+ <string name="Female - Over here">
+ Female - Over here
+ </string>
+ <string name="Female - Please">
+ Female - Please
+ </string>
+ <string name="Female - Repulsed">
+ Female - Repulsed
+ </string>
+ <string name="Female - Shrug">
+ Female - Shrug
+ </string>
+ <string name="Female - Stick tougue out">
+ Female - Stick tougue out
+ </string>
+ <string name="Female - Wow">
+ Female - Wow
+ </string>
+ <string name="AvatarBirthDateFormat">
+ [mthnum,datetime,slt]/[day,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">
+ 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.
+ If you continue to experience problems, please check your network and firewall setup.
+ </string>
+ <string name="dateTimeWeekdaysNames">
+ Sunday:Monday:Tuesday:Wednesday:Thursday:Friday:Saturday
+ </string>
+ <string name="dateTimeWeekdaysShortNames">
+ Sun:Mon:Tue:Wed:Thu:Fri:Sat
+ </string>
+ <string name="dateTimeMonthNames">
+ January:February:March:April:May:June:July:August:September:October:November:December
+ </string>
+ <string name="dateTimeMonthShortNames">
+ Jan:Feb:Mar:Apr:May:Jun:Jul:Aug:Sep:Oct:Nov:Dec
+ </string>
+ <string name="dateTimeDayFormat">
+ [MDAY]
+ </string>
+ <string name="dateTimeAM">
+ AM
+ </string>
+ <string name="dateTimePM">
+ PM
+ </string>
+ <string name="LocalEstimateUSD">
+ US$ [AMOUNT]
+ </string>
+ <string name="Membership">
+ Membership
+ </string>
+ <string name="Roles">
+ 角色
+ </string>
+ <string name="Group Identity">
+ 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
+ </string>
+ <string name="Parcel Access">
+ Parcel Access
+ </string>
+ <string name="Parcel Content">
+ Parcel Content
+ </string>
+ <string name="Object Management">
+ Object Management
+ </string>
+ <string name="Accounting">
+ Accounting
+ </string>
+ <string name="Notices">
+ 通知
+ </string>
+ <string name="Chat">
+ èŠå¤©
+ </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.
+ </string>
+ <string name="ExternalEditorNotFound">
+ Cannot find the external editor you specified.
+Try enclosing path to the editor with double quotes.
+(e.g. &quot;/path to my/editor&quot; &quot;%s&quot;)
+ </string>
+ <string name="ExternalEditorCommandParseError">
+ Error parsing the external editor command.
+ </string>
+ <string name="ExternalEditorFailedToRun">
+ External editor failed to run.
+ </string>
+ <string name="Esc">
+ Esc
+ </string>
+ <string name="Space">
+ Space
+ </string>
+ <string name="Enter">
+ 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">
+ Left
+ </string>
+ <string name="Right">
+ Right
+ </string>
+ <string name="Up">
+ Up
+ </string>
+ <string name="Down">
+ 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">
+ Add
+ </string>
+ <string name="Subtract">
+ Subtract
+ </string>
+ <string name="Multiply">
+ Multiply
+ </string>
+ <string name="Divide">
+ 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">
+ Viewing particle beacons (blue)
+ </string>
+ <string name="BeaconPhysical">
+ Viewing physical object beacons (green)
+ </string>
+ <string name="BeaconScripted">
+ Viewing scripted object beacons (red)
+ </string>
+ <string name="BeaconScriptedTouch">
+ Viewing scripted object with touch function beacons (red)
+ </string>
+ <string name="BeaconSound">
+ Viewing sound beacons (yellow)
+ </string>
+ <string name="BeaconMedia">
+ Viewing media beacons (white)
+ </string>
+ <string name="ParticleHiding">
+ Hiding Particles
+ </string>
+</strings>
diff --git a/indra/newview/skins/default/xui/zh/teleport_strings.xml b/indra/newview/skins/default/xui/zh/teleport_strings.xml
new file mode 100644
index 0000000000..b18eb4a390
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/teleport_strings.xml
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<teleport_messages>
+ <message_set name="errors">
+ <message name="invalid_tport">
+ Problem encountered processing your teleport request. You may need to log back in before you can teleport.
+If you continue to get this message, please check the [SUPPORT_SITE].
+ </message>
+ <message name="invalid_region_handoff">
+ Problem encountered processing your region crossing. You may need to log back in before you can cross regions.
+If you continue to get this message, please check the [SUPPORT_SITE].
+ </message>
+ <message name="blocked_tport">
+ Sorry, teleport is currently blocked. Try again in a moment.
+If you still cannot teleport, please log out and log back in to resolve the problem.
+ </message>
+ <message name="nolandmark_tport">
+ Sorry, but system was unable to locate landmark destination.
+ </message>
+ <message name="timeout_tport">
+ Sorry, but system was unable to complete the teleport connection.
+Try again in a moment.
+ </message>
+ <message name="noaccess_tport">
+ Sorry, you do not have access to that teleport destination.
+ </message>
+ <message name="missing_attach_tport">
+ Your attachments have not arrived yet. Try waiting for a few more seconds or log out and back in again before attempting to teleport.
+ </message>
+ <message name="too_many_uploads_tport">
+ The asset queue in this region is currently clogged so your teleport request will not be able to succeed in a timely manner. Please try again in a few minutes or go to a less busy area.
+ </message>
+ <message name="expired_tport">
+ Sorry, but the system was unable to complete your teleport request in a timely fashion. Please try again in a few minutes.
+ </message>
+ <message name="expired_region_handoff">
+ Sorry, but the system was unable to complete your region crossing in a timely fashion. Please try again in a few minutes.
+ </message>
+ <message name="no_host">
+ Unable to find teleport destination. The destination may be temporarily unavailable or no longer exists. Please try again in a few minutes.
+ </message>
+ <message name="no_inventory_host">
+ 收ç´å€åŠŸèƒ½ç›®å‰ç„¡æ³•ä½¿ç”¨ã€‚
+ </message>
+ </message_set>
+ <message_set name="progress">
+ <message name="sending_dest">
+ Sending to destination.
+ </message>
+ <message name="redirecting">
+ Redirecting to different location.
+ </message>
+ <message name="relaying">
+ Relaying to destination.
+ </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/minimal/xui/da/floater_camera.xml b/indra/newview/skins/minimal/xui/da/floater_camera.xml
new file mode 100644
index 0000000000..5b7ef6db54
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/floater_camera.xml
@@ -0,0 +1,65 @@
+<?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
new file mode 100644
index 0000000000..0e2918e4e2
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/floater_help_browser.xml
@@ -0,0 +1,9 @@
+<?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
new file mode 100644
index 0000000000..42fbdeaa9e
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/floater_media_browser.xml
@@ -0,0 +1,30 @@
+<?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
new file mode 100644
index 0000000000..bd17224259
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/floater_nearby_chat.xml
@@ -0,0 +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"/>
+</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
new file mode 100644
index 0000000000..0410f74324
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/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="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
new file mode 100644
index 0000000000..dc1ed562eb
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/inspect_avatar.xml
@@ -0,0 +1,24 @@
+<?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
new file mode 100644
index 0000000000..78ccc5b869
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/inspect_object.xml
@@ -0,0 +1,41 @@
+<?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
new file mode 100644
index 0000000000..1e8301dc4c
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/menu_add_wearable_gear.xml
@@ -0,0 +1,6 @@
+<?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
new file mode 100644
index 0000000000..ca7b184942
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/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="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
new file mode 100644
index 0000000000..35ba27f9e2
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/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="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
new file mode 100644
index 0000000000..26b58ce1ab
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/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="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
new file mode 100644
index 0000000000..a778dedf0b
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/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="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
new file mode 100644
index 0000000000..0080f7a59e
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/menu_avatar_self.xml
@@ -0,0 +1,31 @@
+<?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
new file mode 100644
index 0000000000..9ac296904a
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/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="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
new file mode 100644
index 0000000000..9d7fc0f223
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/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="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
new file mode 100644
index 0000000000..0e90d5a3ae
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/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="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
new file mode 100644
index 0000000000..16c225b7d9
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/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="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
new file mode 100644
index 0000000000..f44369fd84
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/menu_cof_gear.xml
@@ -0,0 +1,5 @@
+<?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
new file mode 100644
index 0000000000..3752f42b1c
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/menu_edit.xml
@@ -0,0 +1,12 @@
+<?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
new file mode 100644
index 0000000000..a4793e294c
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/menu_favorites.xml
@@ -0,0 +1,10 @@
+<?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
new file mode 100644
index 0000000000..a9010e99b6
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/menu_gesture_gear.xml
@@ -0,0 +1,10 @@
+<?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
new file mode 100644
index 0000000000..97fbec1ed1
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/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="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
new file mode 100644
index 0000000000..d96a8a8a17
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/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="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
new file mode 100644
index 0000000000..4889230919
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/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="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
new file mode 100644
index 0000000000..f64a6ad455
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/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="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
new file mode 100644
index 0000000000..b89d9a5789
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/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="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
new file mode 100644
index 0000000000..6ebc40a8dd
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/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="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
new file mode 100644
index 0000000000..8da35adb1b
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/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="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
new file mode 100644
index 0000000000..e28842836d
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/menu_inspect_object_gear.xml
@@ -0,0 +1,18 @@
+<?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
new file mode 100644
index 0000000000..887c6484bc
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/menu_inspect_self_gear.xml
@@ -0,0 +1,31 @@
+<?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
new file mode 100644
index 0000000000..c3b03232bf
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/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="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
new file mode 100644
index 0000000000..35551318d1
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/menu_inventory.xml
@@ -0,0 +1,84 @@
+<?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
new file mode 100644
index 0000000000..07f70d7190
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/menu_inventory_add.xml
@@ -0,0 +1,33 @@
+<?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
new file mode 100644
index 0000000000..4809b24463
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/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="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
new file mode 100644
index 0000000000..1548f18f89
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/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="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
new file mode 100644
index 0000000000..3cf2ffe375
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/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="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
new file mode 100644
index 0000000000..0b7a5040ae
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/menu_login.xml
@@ -0,0 +1,24 @@
+<?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
new file mode 100644
index 0000000000..186dbd476a
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/menu_mini_map.xml
@@ -0,0 +1,11 @@
+<?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
new file mode 100644
index 0000000000..c04206824a
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/menu_navbar.xml
@@ -0,0 +1,11 @@
+<?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
new file mode 100644
index 0000000000..be532ad406
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/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="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
new file mode 100644
index 0000000000..40b35b5fdd
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/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="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
new file mode 100644
index 0000000000..ba62ccf90c
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/menu_object.xml
@@ -0,0 +1,29 @@
+<?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
new file mode 100644
index 0000000000..08aeb633b6
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/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="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
new file mode 100644
index 0000000000..8b4c776496
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/menu_outfit_gear.xml
@@ -0,0 +1,27 @@
+<?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
new file mode 100644
index 0000000000..d6a6f2724f
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/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="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
new file mode 100644
index 0000000000..5951d3ffb9
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/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="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
new file mode 100644
index 0000000000..32c5e6a6c7
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/menu_people_friends_view_sort.xml
@@ -0,0 +1,8 @@
+<?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
new file mode 100644
index 0000000000..841f58b619
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/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="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
new file mode 100644
index 0000000000..0b9a791530
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/menu_people_groups_view_sort.xml
@@ -0,0 +1,5 @@
+<?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
new file mode 100644
index 0000000000..220ab8724f
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/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="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
new file mode 100644
index 0000000000..9318a0e340
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/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="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
new file mode 100644
index 0000000000..2f35ff3c92
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/menu_people_nearby_view_sort.xml
@@ -0,0 +1,8 @@
+<?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
new file mode 100644
index 0000000000..d081f637f2
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/menu_people_recent_view_sort.xml
@@ -0,0 +1,7 @@
+<?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
new file mode 100644
index 0000000000..81ee900773
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/menu_picks.xml
@@ -0,0 +1,8 @@
+<?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
new file mode 100644
index 0000000000..d95071fbbb
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/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="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
new file mode 100644
index 0000000000..b87964ac14
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/menu_place.xml
@@ -0,0 +1,7 @@
+<?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
new file mode 100644
index 0000000000..7ad2253550
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/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="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
new file mode 100644
index 0000000000..5f573c2363
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/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="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
new file mode 100644
index 0000000000..13dbcdd42e
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/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="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
new file mode 100644
index 0000000000..6745007c99
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/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="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
new file mode 100644
index 0000000000..188229b586
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/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="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
new file mode 100644
index 0000000000..cdd3212373
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/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="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
new file mode 100644
index 0000000000..a9302e111e
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/menu_slurl.xml
@@ -0,0 +1,6 @@
+<?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
new file mode 100644
index 0000000000..a1c25fea69
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/menu_teleport_history_gear.xml
@@ -0,0 +1,6 @@
+<?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
new file mode 100644
index 0000000000..dbaec62087
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/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="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
new file mode 100644
index 0000000000..c4d4bb4b5b
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/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="Ã…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
new file mode 100644
index 0000000000..3ff31ea232
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/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="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
new file mode 100644
index 0000000000..08d1c25d6f
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/menu_topinfobar.xml
@@ -0,0 +1,7 @@
+<?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
new file mode 100644
index 0000000000..491586f3b4
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/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="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
new file mode 100644
index 0000000000..c776159b0a
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/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="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
new file mode 100644
index 0000000000..4398777a39
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/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="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
new file mode 100644
index 0000000000..9a7de23e06
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/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="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
new file mode 100644
index 0000000000..ff4a4d5174
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/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="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
new file mode 100644
index 0000000000..e27cf84959
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/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="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
new file mode 100644
index 0000000000..0f21e14f66
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/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="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
new file mode 100644
index 0000000000..dd25db2aa7
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/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="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
new file mode 100644
index 0000000000..8d84a138bb
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/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="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
new file mode 100644
index 0000000000..e0ca7b920d
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/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="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
new file mode 100644
index 0000000000..93b247f841
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/menu_viewer.xml
@@ -0,0 +1,14 @@
+<?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
new file mode 100644
index 0000000000..63f4b0b388
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/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="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
new file mode 100644
index 0000000000..515a15b287
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/menu_wearing_gear.xml
@@ -0,0 +1,5 @@
+<?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
new file mode 100644
index 0000000000..c0db7b6842
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/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="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
new file mode 100644
index 0000000000..e77eeee8df
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/notifications.xml
@@ -0,0 +1,1831 @@
+<?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 [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="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
new file mode 100644
index 0000000000..14250453eb
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/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="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
new file mode 100644
index 0000000000..bd20ece764
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/panel_bottomtray.xml
@@ -0,0 +1,45 @@
+<?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
new file mode 100644
index 0000000000..23a5e79e22
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/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="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
new file mode 100644
index 0000000000..b8a7ec0b34
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/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="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
new file mode 100644
index 0000000000..2e0f726e1a
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/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">
+ 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
new file mode 100644
index 0000000000..2ee87433a4
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/panel_navigation_bar.xml
@@ -0,0 +1,18 @@
+<?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
new file mode 100644
index 0000000000..49cd2c71f2
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/panel_people.xml
@@ -0,0 +1,94 @@
+<?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="chat_btn_lp">
+ <button label="IM" name="im_btn" tool_tip="Ã…ben session med privat besked (IM)"/>
+ </layout_panel>
+ <layout_panel name="chat_btn_lp">
+ <button label="Opkald" name="call_btn" tool_tip="Kald til denne beboer"/>
+ </layout_panel>
+ <layout_panel name="chat_btn_lp">
+ <button label="Del" name="share_btn" tool_tip="Del en genstand fra beholdning"/>
+ </layout_panel>
+ <layout_panel name="chat_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
new file mode 100644
index 0000000000..ce3a1d8b4e
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/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="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
new file mode 100644
index 0000000000..6e7bdfc188
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/panel_status_bar.xml
@@ -0,0 +1,33 @@
+<?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/menu_inspect_avatar_gear.xml b/indra/newview/skins/minimal/xui/de/menu_inspect_avatar_gear.xml
index fbc119c483..72ba7fe41d 100644
--- a/indra/newview/skins/minimal/xui/de/menu_inspect_avatar_gear.xml
+++ b/indra/newview/skins/minimal/xui/de/menu_inspect_avatar_gear.xml
@@ -3,6 +3,7 @@
<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"/>
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
new file mode 100644
index 0000000000..cc45f42169
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/panel_adhoc_control_panel.xml
@@ -0,0 +1,11 @@
+<?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
index a4d80921ec..2278bfb699 100644
--- a/indra/newview/skins/minimal/xui/de/panel_bottomtray.xml
+++ b/indra/newview/skins/minimal/xui/de/panel_bottomtray.xml
@@ -4,26 +4,32 @@
<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="Gesten anzeigen/ausblenden"/>
+ <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="Kamerasteuerung anzeigen/ausblenden"/>
+ <bottomtray_button label="Ansicht" name="camera_btn" tool_tip="Kamerawinkel steuern"/>
</layout_panel>
- <layout_panel name="avatar_and_destinations_panel">
- <bottomtray_button label="Ziele" name="destination_btn" tool_tip="Zeigt Leutefenster an"/>
+ <layout_panel name="destinations_panel">
+ <bottomtray_button label="Ziele" name="destination_btn" tool_tip="Durch Second Life reisen"/>
</layout_panel>
- <layout_panel name="avatar_and_destinations_panel">
- <bottomtray_button label="Mein Avatar" name="avatar_btn"/>
+ <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="Zeigt Leutefenster an"/>
+ <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="Zeigt Profilfenster an"/>
+ <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="Second Life-Anweisungsthemen öffnen"/>
+ <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">
diff --git a/indra/newview/skins/minimal/xui/de/panel_im_control_panel.xml b/indra/newview/skins/minimal/xui/de/panel_im_control_panel.xml
index abf8011d9d..0ef2234fec 100644
--- a/indra/newview/skins/minimal/xui/de/panel_im_control_panel.xml
+++ b/indra/newview/skins/minimal/xui/de/panel_im_control_panel.xml
@@ -9,7 +9,7 @@
<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."/>
+ <button label="Teleportieren" name="teleport_btn" tool_tip="Dieser Person einen Teleport anbieten"/>
</layout_panel>
<layout_panel name="share_btn_panel">
<button label="Teilen" name="share_btn"/>
diff --git a/indra/newview/skins/minimal/xui/de/panel_people.xml b/indra/newview/skins/minimal/xui/de/panel_people.xml
index c6253e17de..4f8f70ad17 100644
--- a/indra/newview/skins/minimal/xui/de/panel_people.xml
+++ b/indra/newview/skins/minimal/xui/de/panel_people.xml
@@ -52,6 +52,9 @@
<button label="IM" name="im_btn" tool_tip="Instant Messenger öffnen"/>
</layout_panel>
<layout_panel name="chat_btn_lp">
+ <button label="Anrufen" name="call_btn" tool_tip="Diesen Einwohner anrufen"/>
+ </layout_panel>
+ <layout_panel name="chat_btn_lp">
<button label="Teleportieren" name="teleport_btn" tool_tip="Teleport anbieten"/>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/minimal/xui/en/floater_help_browser.xml b/indra/newview/skins/minimal/xui/en/floater_help_browser.xml
index cc551f7d58..477f210352 100644
--- a/indra/newview/skins/minimal/xui/en/floater_help_browser.xml
+++ b/indra/newview/skins/minimal/xui/en/floater_help_browser.xml
@@ -3,14 +3,13 @@
legacy_header_height="18"
can_resize="true"
can_minimize="false"
- height="360"
+ height="460"
layout="topleft"
min_height="360"
- left="645"
+ left="10000"
top="10"
- min_width="345"
+ min_width="335"
name="floater_help_browser"
- save_rect="true"
single_instance="true"
title="HOW TO"
width="335">
@@ -22,7 +21,7 @@
name="done_text">
</floater.string>
<layout_stack
- bottom="360"
+ bottom="460"
follows="left|right|top|bottom"
layout="topleft"
left="5"
@@ -38,7 +37,7 @@
user_resize="false"
width="325">
<web_browser
- trusted_content="true"
+ trusted_content="true"
bottom="-5"
follows="left|right|top|bottom"
layout="topleft"
diff --git a/indra/newview/skins/minimal/xui/en/floater_web_content.xml b/indra/newview/skins/minimal/xui/en/floater_web_content.xml
index 50cb5b14ce..1d9a967d5a 100644
--- a/indra/newview/skins/minimal/xui/en/floater_web_content.xml
+++ b/indra/newview/skins/minimal/xui/en/floater_web_content.xml
@@ -17,6 +17,7 @@
follows="left|right|top|bottom"
layout="topleft"
left="5"
+ animate="false"
name="stack1"
orientation="vertical"
top="20"
@@ -155,14 +156,20 @@
name="external_controls"
top_delta="0"
user_resize="false"
+ auto_resize="true"
width="585">
<web_browser
- bottom="-22"
+ 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"
@@ -173,7 +180,7 @@
name="statusbartext"
parse_urls="false"
text_color="0.4 0.4 0.4 1"
- top_pad="5"
+ top_pad="3"
width="495"/>
<progress_bar
color_bar="0.3 1.0 0.3 1"
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
index be13bc1bb7..2cb77bcdf3 100644
--- a/indra/newview/skins/minimal/xui/en/panel_im_control_panel.xml
+++ b/indra/newview/skins/minimal/xui/en/panel_im_control_panel.xml
@@ -23,102 +23,172 @@
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"
+ <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"
- 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"
+ 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="Teleport"
- name="teleport_btn"
- tool_tip = "Offer to teleport this person"
+ label="Add Friend"
+ name="add_friend_btn"
+ top="5"
width="140" />
- </layout_panel>
- <layout_panel
+ </layout_panel>
+ <layout_panel
auto_resize="false"
follows="top|left|right"
height="25"
layout="topleft"
min_height="25"
width="140"
- name="call_btn_panel"
+ name="teleport_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
- mouse_opaque="false"
- auto_resize="true"
- follows="top|left"
- height="0"
- layout="topleft"
- min_height="0"
- width="140"
- name="spacer"
- 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/widgets/location_input.xml b/indra/newview/skins/minimal/xui/en/widgets/location_input.xml
index fe06a2d816..ba148cf421 100644
--- a/indra/newview/skins/minimal/xui/en/widgets/location_input.xml
+++ b/indra/newview/skins/minimal/xui/en/widgets/location_input.xml
@@ -113,6 +113,14 @@
font="SansSerifSmall"
text_color="TextFgColor"
/>
+ <see_avatars_icon
+ name="see_avatars_icon"
+ width="0"
+ height="0"
+ visible="false"
+ top="21"
+ follows="right|top"
+ />
<combo_button
name="Location History"
label=""
diff --git a/indra/newview/skins/minimal/xui/es/floater_camera.xml b/indra/newview/skins/minimal/xui/es/floater_camera.xml
index ccf3d4bf91..87177e285c 100644
--- a/indra/newview/skins/minimal/xui/es/floater_camera.xml
+++ b/indra/newview/skins/minimal/xui/es/floater_camera.xml
@@ -13,7 +13,7 @@
Modos de cámara
</floater.string>
<floater.string name="pan_mode_title">
- Orbital - Zoom - Panóramica
+ Orbital - Zoom - Panorámica
</floater.string>
<floater.string name="presets_mode_title">
Vistas predefinidas
@@ -59,7 +59,7 @@
</panel>
<panel name="buttons">
<button label="" name="presets_btn" tool_tip="Vistas predefinidas"/>
- <button label="" name="pan_btn" tool_tip="Orbital - Zoom - Panóramica"/>
+ <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/menu_attachment_other.xml b/indra/newview/skins/minimal/xui/es/menu_attachment_other.xml
index 00bdb74881..b8ae93afd2 100644
--- a/indra/newview/skins/minimal/xui/es/menu_attachment_other.xml
+++ b/indra/newview/skins/minimal/xui/es/menu_attachment_other.xml
@@ -4,7 +4,7 @@
<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="Llamada" name="Call"/>
+ <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"/>
diff --git a/indra/newview/skins/minimal/xui/es/menu_avatar_other.xml b/indra/newview/skins/minimal/xui/es/menu_avatar_other.xml
index 7df2d7c4e0..5fb3e51575 100644
--- a/indra/newview/skins/minimal/xui/es/menu_avatar_other.xml
+++ b/indra/newview/skins/minimal/xui/es/menu_avatar_other.xml
@@ -4,7 +4,7 @@
<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="Llamada" name="Call"/>
+ <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"/>
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
index b4b964d096..728637de78 100644
--- a/indra/newview/skins/minimal/xui/es/menu_inspect_avatar_gear.xml
+++ b/indra/newview/skins/minimal/xui/es/menu_inspect_avatar_gear.xml
@@ -3,6 +3,7 @@
<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"/>
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
new file mode 100644
index 0000000000..254cf58437
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/panel_adhoc_control_panel.xml
@@ -0,0 +1,11 @@
+<?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
index f782d66ae7..0989a3d0a1 100644
--- a/indra/newview/skins/minimal/xui/es/panel_bottomtray.xml
+++ b/indra/newview/skins/minimal/xui/es/panel_bottomtray.xml
@@ -4,26 +4,32 @@
<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="Muestra/Oculta los gestos"/>
+ <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="Muestra/Oculta los controles de la cámara"/>
+ <bottomtray_button label="Visión" name="camera_btn" tool_tip="Controlar el ángulo de tu cámara"/>
</layout_panel>
- <layout_panel name="avatar_and_destinations_panel">
- <bottomtray_button label="Destinos" name="destination_btn" tool_tip="Muestra la ventana de gente"/>
+ <layout_panel name="destinations_panel">
+ <bottomtray_button label="Destinos" name="destination_btn" tool_tip="Viajar por Second Life"/>
</layout_panel>
- <layout_panel name="avatar_and_destinations_panel">
- <bottomtray_button label="Mi avatar" name="avatar_btn"/>
+ <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="Muestra la ventana de gente"/>
+ <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="Muestra la ventana del perfil"/>
+ <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="Abrir los temas sobre indicaciones de Second Life"/>
+ <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">
diff --git a/indra/newview/skins/minimal/xui/es/panel_im_control_panel.xml b/indra/newview/skins/minimal/xui/es/panel_im_control_panel.xml
index 7d4db6a630..1be6997813 100644
--- a/indra/newview/skins/minimal/xui/es/panel_im_control_panel.xml
+++ b/indra/newview/skins/minimal/xui/es/panel_im_control_panel.xml
@@ -8,7 +8,7 @@
<button label="Añadir como amigo" name="add_friend_btn"/>
</layout_panel>
<layout_panel name="teleport_btn_panel">
- <button label="Teleportarme" name="teleport_btn" tool_tip="Ofrecer teleporte a esta persona"/>
+ <button label="Teleportarte" name="teleport_btn" tool_tip="Ofrecer teleporte a esta persona"/>
</layout_panel>
<layout_panel name="share_btn_panel">
<button label="Compartir" name="share_btn"/>
diff --git a/indra/newview/skins/minimal/xui/es/panel_people.xml b/indra/newview/skins/minimal/xui/es/panel_people.xml
index 7d3157ef45..1e1c3411ae 100644
--- a/indra/newview/skins/minimal/xui/es/panel_people.xml
+++ b/indra/newview/skins/minimal/xui/es/panel_people.xml
@@ -53,6 +53,9 @@
<button label="MI" name="im_btn" tool_tip="Abrir una sesión de mensajes instantáneos"/>
</layout_panel>
<layout_panel name="chat_btn_lp">
+ <button label="Llamar" name="call_btn" tool_tip="Llamar a este Residente"/>
+ </layout_panel>
+ <layout_panel name="chat_btn_lp">
<button label="Teleporte" name="teleport_btn" tool_tip="Ofrecer teleporte"/>
</layout_panel>
</layout_stack>
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
index 231a175ee5..c3240fa541 100644
--- a/indra/newview/skins/minimal/xui/fr/menu_inspect_avatar_gear.xml
+++ b/indra/newview/skins/minimal/xui/fr/menu_inspect_avatar_gear.xml
@@ -3,6 +3,7 @@
<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"/>
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
new file mode 100644
index 0000000000..376a7d2b72
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/panel_adhoc_control_panel.xml
@@ -0,0 +1,11 @@
+<?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
index ef62901e99..094d3e66de 100644
--- a/indra/newview/skins/minimal/xui/fr/panel_bottomtray.xml
+++ b/indra/newview/skins/minimal/xui/fr/panel_bottomtray.xml
@@ -4,26 +4,32 @@
<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="Affiche/Masque les gestes"/>
+ <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="Affiche/Masque le contrôle de la caméra"/>
+ <bottomtray_button label="Affichage" name="camera_btn" tool_tip="Contrôler l&apos;angle de la caméra."/>
</layout_panel>
- <layout_panel name="avatar_and_destinations_panel">
- <bottomtray_button label="Destinations" name="destination_btn" tool_tip="Afficher la fenêtre des personnes."/>
+ <layout_panel name="destinations_panel">
+ <bottomtray_button label="Destinations" name="destination_btn" tool_tip="Voyager à travers Second Life."/>
</layout_panel>
- <layout_panel name="avatar_and_destinations_panel">
- <bottomtray_button label="Mon avatar" name="avatar_btn"/>
+ <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="Afficher la fenêtre des personnes."/>
+ <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 la fenêtre de profil."/>
+ <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="Ouvrir les rubriques d&apos;aide rapide Second Life."/>
+ <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">
diff --git a/indra/newview/skins/minimal/xui/fr/panel_im_control_panel.xml b/indra/newview/skins/minimal/xui/fr/panel_im_control_panel.xml
index 1f2169e22c..fdc5aeca49 100644
--- a/indra/newview/skins/minimal/xui/fr/panel_im_control_panel.xml
+++ b/indra/newview/skins/minimal/xui/fr/panel_im_control_panel.xml
@@ -9,7 +9,7 @@
<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"/>
+ <button label="Téléporter" name="teleport_btn" tool_tip="Proposer de téléporter cette personne."/>
</layout_panel>
<layout_panel name="share_btn_panel">
<button label="Partager" name="share_btn"/>
diff --git a/indra/newview/skins/minimal/xui/fr/panel_people.xml b/indra/newview/skins/minimal/xui/fr/panel_people.xml
index 88409a2a86..72fb4d807f 100644
--- a/indra/newview/skins/minimal/xui/fr/panel_people.xml
+++ b/indra/newview/skins/minimal/xui/fr/panel_people.xml
@@ -53,6 +53,9 @@ Vous recherchez des résidents avec qui passer du temps ? Essayez avec le bouto
<button label="IM" name="im_btn" tool_tip="Ouvrir une session IM"/>
</layout_panel>
<layout_panel name="chat_btn_lp">
+ <button label="Appeler" name="call_btn" tool_tip="Appeler ce résident."/>
+ </layout_panel>
+ <layout_panel name="chat_btn_lp">
<button label="Téléporter" name="teleport_btn" tool_tip="Proposer une téléportation"/>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/minimal/xui/it/floater_camera.xml b/indra/newview/skins/minimal/xui/it/floater_camera.xml
new file mode 100644
index 0000000000..3fdf4f48a2
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/floater_camera.xml
@@ -0,0 +1,65 @@
+<?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
new file mode 100644
index 0000000000..18264cdd17
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/floater_help_browser.xml
@@ -0,0 +1,9 @@
+<?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
new file mode 100644
index 0000000000..b1e87290d2
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/floater_media_browser.xml
@@ -0,0 +1,31 @@
+<?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
new file mode 100644
index 0000000000..4c41df8a62
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/floater_nearby_chat.xml
@@ -0,0 +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"/>
+</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
new file mode 100644
index 0000000000..5603e85417
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/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="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
new file mode 100644
index 0000000000..6f52aaef74
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/inspect_avatar.xml
@@ -0,0 +1,26 @@
+<?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
new file mode 100644
index 0000000000..d8ab10cfda
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/inspect_object.xml
@@ -0,0 +1,41 @@
+<?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
new file mode 100644
index 0000000000..46abd7deed
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_add_wearable_gear.xml
@@ -0,0 +1,6 @@
+<?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
new file mode 100644
index 0000000000..d4d6fd68d0
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/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="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
new file mode 100644
index 0000000000..0b841d591f
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/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="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
new file mode 100644
index 0000000000..b93b695300
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/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="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
new file mode 100644
index 0000000000..c2edc32a49
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/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="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
new file mode 100644
index 0000000000..a4dafd7b5f
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/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="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
new file mode 100644
index 0000000000..ddd6909136
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/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="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
new file mode 100644
index 0000000000..699490c8f1
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/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="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
new file mode 100644
index 0000000000..1e3658ef45
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/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="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
new file mode 100644
index 0000000000..1e16ce8ed1
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/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="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
new file mode 100644
index 0000000000..10524ba92d
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_cof_gear.xml
@@ -0,0 +1,5 @@
+<?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
new file mode 100644
index 0000000000..ffb20a02e9
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_edit.xml
@@ -0,0 +1,12 @@
+<?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
new file mode 100644
index 0000000000..7813ef44b5
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_favorites.xml
@@ -0,0 +1,10 @@
+<?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
new file mode 100644
index 0000000000..7cfcc6287e
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_gesture_gear.xml
@@ -0,0 +1,10 @@
+<?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
new file mode 100644
index 0000000000..3b76fb94a9
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/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="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
new file mode 100644
index 0000000000..2c2c6c4bc5
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/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="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
new file mode 100644
index 0000000000..9e471b771c
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/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="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
new file mode 100644
index 0000000000..f78ed8489f
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/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="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
new file mode 100644
index 0000000000..baa4e671b0
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/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="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
new file mode 100644
index 0000000000..2eacbb09ad
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/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="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
new file mode 100644
index 0000000000..1f10734c4a
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/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="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
new file mode 100644
index 0000000000..ede4a507c0
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_inspect_object_gear.xml
@@ -0,0 +1,18 @@
+<?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
new file mode 100644
index 0000000000..4f62ccaa9c
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_inspect_self_gear.xml
@@ -0,0 +1,31 @@
+<?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
new file mode 100644
index 0000000000..471640eff5
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/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="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
new file mode 100644
index 0000000000..f18ddb595c
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_inventory.xml
@@ -0,0 +1,87 @@
+<?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
new file mode 100644
index 0000000000..a2535ce48d
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_inventory_add.xml
@@ -0,0 +1,34 @@
+<?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
new file mode 100644
index 0000000000..3d64e4da4e
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/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="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
new file mode 100644
index 0000000000..f510078e14
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/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="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
new file mode 100644
index 0000000000..b3cddab783
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/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="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
new file mode 100644
index 0000000000..bdf7d2094f
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_login.xml
@@ -0,0 +1,24 @@
+<?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
new file mode 100644
index 0000000000..561b80e046
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_mini_map.xml
@@ -0,0 +1,11 @@
+<?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
new file mode 100644
index 0000000000..e42d913a6f
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_navbar.xml
@@ -0,0 +1,11 @@
+<?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
new file mode 100644
index 0000000000..719a6d3261
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/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="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
new file mode 100644
index 0000000000..8c82e30f0e
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/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="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
new file mode 100644
index 0000000000..a172cf3b26
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_object.xml
@@ -0,0 +1,29 @@
+<?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
new file mode 100644
index 0000000000..0f347b1a90
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/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="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
new file mode 100644
index 0000000000..09fc867d7c
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/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="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
new file mode 100644
index 0000000000..8166cf20ed
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/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="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
new file mode 100644
index 0000000000..1b057c4077
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/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="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
new file mode 100644
index 0000000000..3a799f44eb
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_people_friends_view_sort.xml
@@ -0,0 +1,8 @@
+<?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
new file mode 100644
index 0000000000..30a97a1c72
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/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="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
new file mode 100644
index 0000000000..d31ddaf1aa
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_people_groups_view_sort.xml
@@ -0,0 +1,5 @@
+<?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
new file mode 100644
index 0000000000..ab06d28c36
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/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="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
new file mode 100644
index 0000000000..e0b9ceb63d
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/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="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
new file mode 100644
index 0000000000..aae2313702
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_people_nearby_view_sort.xml
@@ -0,0 +1,8 @@
+<?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
new file mode 100644
index 0000000000..7fccd1621a
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_people_recent_view_sort.xml
@@ -0,0 +1,7 @@
+<?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
new file mode 100644
index 0000000000..000d219ed0
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_picks.xml
@@ -0,0 +1,8 @@
+<?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
new file mode 100644
index 0000000000..7fbd5abd57
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/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="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
new file mode 100644
index 0000000000..5381a4effa
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_place.xml
@@ -0,0 +1,7 @@
+<?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
new file mode 100644
index 0000000000..0e783c0000
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/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="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
new file mode 100644
index 0000000000..23757d47e0
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/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="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
new file mode 100644
index 0000000000..a458b1a768
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/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="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
new file mode 100644
index 0000000000..56b695c597
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/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="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
new file mode 100644
index 0000000000..4882a8ac64
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/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="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
new file mode 100644
index 0000000000..604f754ba8
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/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="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
new file mode 100644
index 0000000000..be83133efc
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_slurl.xml
@@ -0,0 +1,6 @@
+<?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
new file mode 100644
index 0000000000..409a62c31b
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_teleport_history_gear.xml
@@ -0,0 +1,6 @@
+<?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
new file mode 100644
index 0000000000..81053fbd65
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/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="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
new file mode 100644
index 0000000000..c221f141a6
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/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="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
new file mode 100644
index 0000000000..4636ce9929
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/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="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
new file mode 100644
index 0000000000..0beb9314de
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_topinfobar.xml
@@ -0,0 +1,7 @@
+<?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
new file mode 100644
index 0000000000..37755d5749
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/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="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
new file mode 100644
index 0000000000..d9a792ebdf
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/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="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
new file mode 100644
index 0000000000..e0153d9169
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/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="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
new file mode 100644
index 0000000000..a45a6bbc10
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/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="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
new file mode 100644
index 0000000000..cb7935b3ed
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/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="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
new file mode 100644
index 0000000000..763e65f17c
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/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="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
new file mode 100644
index 0000000000..a032c33585
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/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="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
new file mode 100644
index 0000000000..b368aa9141
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/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="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
new file mode 100644
index 0000000000..355c7dbed9
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/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="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
new file mode 100644
index 0000000000..c129e61f25
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/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="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
new file mode 100644
index 0000000000..8353044f37
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_viewer.xml
@@ -0,0 +1,14 @@
+<?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
new file mode 100644
index 0000000000..c9a02d8a86
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/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="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
new file mode 100644
index 0000000000..7c8eef64e5
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_wearing_gear.xml
@@ -0,0 +1,5 @@
+<?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
new file mode 100644
index 0000000000..4a5366091f
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/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="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
new file mode 100644
index 0000000000..05e13bc4f3
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/notifications.xml
@@ -0,0 +1,2951 @@
+<?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 [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="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
new file mode 100644
index 0000000000..be001d09f8
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/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="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
new file mode 100644
index 0000000000..ab9b175f16
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/panel_bottomtray.xml
@@ -0,0 +1,45 @@
+<?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
new file mode 100644
index 0000000000..2d17e4a0cd
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/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="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
new file mode 100644
index 0000000000..756db84c1c
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/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="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="share_btn_panel">
+ <button label="Condividi" name="share_btn"/>
+ </layout_panel>
+ <layout_panel name="pay_btn_panel">
+ <button label="Paga" name="pay_btn"/>
+ </layout_panel>
+ <layout_panel name="call_btn_panel">
+ <button label="Chiama" name="call_btn"/>
+ </layout_panel>
+ <layout_panel name="end_call_btn_panel">
+ <button label="Chiudi chiamata" name="end_call_btn"/>
+ </layout_panel>
+ <layout_panel name="voice_ctrls_btn_panel">
+ <button label="Regolazione voce" name="voice_ctrls_btn"/>
+ </layout_panel>
+ </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
new file mode 100644
index 0000000000..f88230ed11
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/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?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
new file mode 100644
index 0000000000..8e72167759
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/panel_navigation_bar.xml
@@ -0,0 +1,18 @@
+<?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
new file mode 100644
index 0000000000..068c8bb808
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/panel_people.xml
@@ -0,0 +1,94 @@
+<?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="chat_btn_lp">
+ <button label="IM" name="im_btn" tool_tip="Apri una sessione messaggio istantaneo"/>
+ </layout_panel>
+ <layout_panel name="chat_btn_lp">
+ <button label="Chiama" name="call_btn" tool_tip="Chiama questo residente"/>
+ </layout_panel>
+ <layout_panel name="chat_btn_lp">
+ <button label="Condividi" name="share_btn" tool_tip="Condividi un oggetto dell&apos;inventario"/>
+ </layout_panel>
+ <layout_panel name="chat_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
new file mode 100644
index 0000000000..3c7874e093
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/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="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
new file mode 100644
index 0000000000..4353eb9d50
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/panel_status_bar.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="status">
+ <panel.string name="StatBarDaysOfWeek">
+ Domenica:Lunedì:Martedì:Mercoledì:Giovedì:Venerdì:Sabato
+ </panel.string>
+ <panel.string name="StatBarMonthsOfYear">
+ Gennaio:Febbraio:Marzo:Aprile:Maggio:Giugno:Luglio:Agosto:Settembre:Ottobre:Novembre:Dicembre
+ </panel.string>
+ <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>
+ <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$"/>
+ </panel>
+ <text name="TimeText" tool_tip="Orario attuale (Pacifico)">
+ 24:00, ora del Pacifico
+ </text>
+ <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
new file mode 100644
index 0000000000..71a20c8e18
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/floater_camera.xml
@@ -0,0 +1,65 @@
+<?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
new file mode 100644
index 0000000000..1322343903
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/floater_help_browser.xml
@@ -0,0 +1,9 @@
+<?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
new file mode 100644
index 0000000000..439c36dbe9
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/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://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
new file mode 100644
index 0000000000..a29c6a0630
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/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="ãƒãƒ£ãƒƒãƒˆã‚’翻訳(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
new file mode 100644
index 0000000000..48fe8aee78
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/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/minimal/xui/ja/inspect_avatar.xml b/indra/newview/skins/minimal/xui/ja/inspect_avatar.xml
new file mode 100644
index 0000000000..42b67cd333
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/inspect_avatar.xml
@@ -0,0 +1,27 @@
+<?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
new file mode 100644
index 0000000000..e6999ac9b1
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/inspect_object.xml
@@ -0,0 +1,48 @@
+<?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
new file mode 100644
index 0000000000..982a03c6a8
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_add_wearable_gear.xml
@@ -0,0 +1,6 @@
+<?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
new file mode 100644
index 0000000000..5adf0b3745
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/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/minimal/xui/ja/menu_attachment_self.xml b/indra/newview/skins/minimal/xui/ja/menu_attachment_self.xml
new file mode 100644
index 0000000000..830ddc9f63
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/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/minimal/xui/ja/menu_avatar_icon.xml b/indra/newview/skins/minimal/xui/ja/menu_avatar_icon.xml
new file mode 100644
index 0000000000..b04f602134
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/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="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
new file mode 100644
index 0000000000..54dd96f5ef
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/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/minimal/xui/ja/menu_avatar_self.xml b/indra/newview/skins/minimal/xui/ja/menu_avatar_self.xml
new file mode 100644
index 0000000000..4709522665
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/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="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
new file mode 100644
index 0000000000..7f106c1ab5
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/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/minimal/xui/ja/menu_cof_attachment.xml b/indra/newview/skins/minimal/xui/ja/menu_cof_attachment.xml
new file mode 100644
index 0000000000..e786d02e40
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/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/minimal/xui/ja/menu_cof_body_part.xml b/indra/newview/skins/minimal/xui/ja/menu_cof_body_part.xml
new file mode 100644
index 0000000000..eb5faa2545
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/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/minimal/xui/ja/menu_cof_clothing.xml b/indra/newview/skins/minimal/xui/ja/menu_cof_clothing.xml
new file mode 100644
index 0000000000..d984342896
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/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/minimal/xui/ja/menu_cof_gear.xml b/indra/newview/skins/minimal/xui/ja/menu_cof_gear.xml
new file mode 100644
index 0000000000..a071abbd2e
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_cof_gear.xml
@@ -0,0 +1,5 @@
+<?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
new file mode 100644
index 0000000000..c2ef0179b2
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/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/minimal/xui/ja/menu_favorites.xml b/indra/newview/skins/minimal/xui/ja/menu_favorites.xml
new file mode 100644
index 0000000000..4708b1446c
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/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="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
new file mode 100644
index 0000000000..abf490a247
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_gesture_gear.xml
@@ -0,0 +1,10 @@
+<?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
new file mode 100644
index 0000000000..3787f7d645
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/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/minimal/xui/ja/menu_hide_navbar.xml b/indra/newview/skins/minimal/xui/ja/menu_hide_navbar.xml
new file mode 100644
index 0000000000..3a1ae49700
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/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/minimal/xui/ja/menu_im_well_button.xml b/indra/newview/skins/minimal/xui/ja/menu_im_well_button.xml
new file mode 100644
index 0000000000..3397004bd7
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/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/minimal/xui/ja/menu_imchiclet_adhoc.xml b/indra/newview/skins/minimal/xui/ja/menu_imchiclet_adhoc.xml
new file mode 100644
index 0000000000..8cd6fa4a27
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/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/minimal/xui/ja/menu_imchiclet_group.xml b/indra/newview/skins/minimal/xui/ja/menu_imchiclet_group.xml
new file mode 100644
index 0000000000..5bcb96f083
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/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/minimal/xui/ja/menu_imchiclet_p2p.xml b/indra/newview/skins/minimal/xui/ja/menu_imchiclet_p2p.xml
new file mode 100644
index 0000000000..5453f998fa
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/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/minimal/xui/ja/menu_inspect_avatar_gear.xml b/indra/newview/skins/minimal/xui/ja/menu_inspect_avatar_gear.xml
new file mode 100644
index 0000000000..9d0d0f10a6
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/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="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
new file mode 100644
index 0000000000..2edade70bf
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_inspect_object_gear.xml
@@ -0,0 +1,18 @@
+<?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
new file mode 100644
index 0000000000..e3e206f3aa
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_inspect_self_gear.xml
@@ -0,0 +1,31 @@
+<?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
new file mode 100644
index 0000000000..9a4a8138f5
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/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/minimal/xui/ja/menu_inventory.xml b/indra/newview/skins/minimal/xui/ja/menu_inventory.xml
new file mode 100644
index 0000000000..f78ec09e5e
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_inventory.xml
@@ -0,0 +1,87 @@
+<?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
new file mode 100644
index 0000000000..6c754e5d08
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_inventory_add.xml
@@ -0,0 +1,34 @@
+<?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
new file mode 100644
index 0000000000..1f425df83c
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/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/minimal/xui/ja/menu_land.xml b/indra/newview/skins/minimal/xui/ja/menu_land.xml
new file mode 100644
index 0000000000..89c122f14f
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/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/minimal/xui/ja/menu_landmark.xml b/indra/newview/skins/minimal/xui/ja/menu_landmark.xml
new file mode 100644
index 0000000000..c134422955
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/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 をコピー" 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
new file mode 100644
index 0000000000..265f3ebcd0
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/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="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
new file mode 100644
index 0000000000..2e733ee24b
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/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/minimal/xui/ja/menu_navbar.xml b/indra/newview/skins/minimal/xui/ja/menu_navbar.xml
new file mode 100644
index 0000000000..9ae2e58198
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/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/minimal/xui/ja/menu_nearby_chat.xml b/indra/newview/skins/minimal/xui/ja/menu_nearby_chat.xml
new file mode 100644
index 0000000000..c2e4a27686
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/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/minimal/xui/ja/menu_notification_well_button.xml b/indra/newview/skins/minimal/xui/ja/menu_notification_well_button.xml
new file mode 100644
index 0000000000..913bae8958
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/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/minimal/xui/ja/menu_object.xml b/indra/newview/skins/minimal/xui/ja/menu_object.xml
new file mode 100644
index 0000000000..4cee8089ee
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_object.xml
@@ -0,0 +1,29 @@
+<?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
new file mode 100644
index 0000000000..8c4f328661
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/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/minimal/xui/ja/menu_outfit_gear.xml b/indra/newview/skins/minimal/xui/ja/menu_outfit_gear.xml
new file mode 100644
index 0000000000..2bcbe1915b
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/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/minimal/xui/ja/menu_outfit_tab.xml b/indra/newview/skins/minimal/xui/ja/menu_outfit_tab.xml
new file mode 100644
index 0000000000..9491c22f31
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/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/minimal/xui/ja/menu_participant_list.xml b/indra/newview/skins/minimal/xui/ja/menu_participant_list.xml
new file mode 100644
index 0000000000..64d8ded722
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/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/minimal/xui/ja/menu_people_friends_view_sort.xml b/indra/newview/skins/minimal/xui/ja/menu_people_friends_view_sort.xml
new file mode 100644
index 0000000000..76340e4d76
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_people_friends_view_sort.xml
@@ -0,0 +1,8 @@
+<?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
new file mode 100644
index 0000000000..842d79dc4b
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/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/minimal/xui/ja/menu_people_groups_view_sort.xml b/indra/newview/skins/minimal/xui/ja/menu_people_groups_view_sort.xml
new file mode 100644
index 0000000000..bfc7d15017
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_people_groups_view_sort.xml
@@ -0,0 +1,5 @@
+<?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
new file mode 100644
index 0000000000..8d84b0e521
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/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/minimal/xui/ja/menu_people_nearby_multiselect.xml b/indra/newview/skins/minimal/xui/ja/menu_people_nearby_multiselect.xml
new file mode 100644
index 0000000000..3f20e5d3ab
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/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/minimal/xui/ja/menu_people_nearby_view_sort.xml b/indra/newview/skins/minimal/xui/ja/menu_people_nearby_view_sort.xml
new file mode 100644
index 0000000000..a31480158a
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_people_nearby_view_sort.xml
@@ -0,0 +1,8 @@
+<?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
new file mode 100644
index 0000000000..b4f177a068
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_people_recent_view_sort.xml
@@ -0,0 +1,7 @@
+<?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
new file mode 100644
index 0000000000..011d3d2526
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/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/minimal/xui/ja/menu_picks_plus.xml b/indra/newview/skins/minimal/xui/ja/menu_picks_plus.xml
new file mode 100644
index 0000000000..84bf90fea0
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/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/minimal/xui/ja/menu_place.xml b/indra/newview/skins/minimal/xui/ja/menu_place.xml
new file mode 100644
index 0000000000..a9f05e126d
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_place.xml
@@ -0,0 +1,7 @@
+<?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
new file mode 100644
index 0000000000..d5ce88b055
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/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/minimal/xui/ja/menu_places_gear_folder.xml b/indra/newview/skins/minimal/xui/ja/menu_places_gear_folder.xml
new file mode 100644
index 0000000000..e64f97fda5
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/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/minimal/xui/ja/menu_places_gear_landmark.xml b/indra/newview/skins/minimal/xui/ja/menu_places_gear_landmark.xml
new file mode 100644
index 0000000000..f416b5b1f6
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/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="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
new file mode 100644
index 0000000000..9d3a5dda1c
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/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/minimal/xui/ja/menu_save_outfit.xml b/indra/newview/skins/minimal/xui/ja/menu_save_outfit.xml
new file mode 100644
index 0000000000..6513d9264a
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/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/minimal/xui/ja/menu_script_chiclet.xml b/indra/newview/skins/minimal/xui/ja/menu_script_chiclet.xml
new file mode 100644
index 0000000000..a89dd0bcbe
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/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/minimal/xui/ja/menu_slurl.xml b/indra/newview/skins/minimal/xui/ja/menu_slurl.xml
new file mode 100644
index 0000000000..61ba3085d9
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_slurl.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Popup">
+ <menu_item_call label="URL ã«ã¤ã„ã¦" name="about_url"/>
+ <menu_item_call label="URL ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã™ã‚‹" name="teleport_to_url"/>
+ <menu_item_call label="地図" 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
new file mode 100644
index 0000000000..901eab9166
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_teleport_history_gear.xml
@@ -0,0 +1,6 @@
+<?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
new file mode 100644
index 0000000000..66bc32214f
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/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/minimal/xui/ja/menu_teleport_history_tab.xml b/indra/newview/skins/minimal/xui/ja/menu_teleport_history_tab.xml
new file mode 100644
index 0000000000..4dd44d2ec8
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/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/minimal/xui/ja/menu_text_editor.xml b/indra/newview/skins/minimal/xui/ja/menu_text_editor.xml
new file mode 100644
index 0000000000..fcb1038a6a
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/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/minimal/xui/ja/menu_topinfobar.xml b/indra/newview/skins/minimal/xui/ja/menu_topinfobar.xml
new file mode 100644
index 0000000000..1a67a2a8f7
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/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/minimal/xui/ja/menu_url_agent.xml b/indra/newview/skins/minimal/xui/ja/menu_url_agent.xml
new file mode 100644
index 0000000000..92d118a5ae
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/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="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
new file mode 100644
index 0000000000..1dd3d79438
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/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="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
new file mode 100644
index 0000000000..c3da8a8686
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/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 ページを開ã" 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
new file mode 100644
index 0000000000..7af2f9e2cd
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/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="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
new file mode 100644
index 0000000000..8d41e1a571
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/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="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
new file mode 100644
index 0000000000..d6a048dcfc
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/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="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
new file mode 100644
index 0000000000..8d264059d3
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/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="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
new file mode 100644
index 0000000000..a516c5a075
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/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="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
new file mode 100644
index 0000000000..2c857ec915
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/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="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
new file mode 100644
index 0000000000..c3507a9a33
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/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="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
new file mode 100644
index 0000000000..52dec2b282
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_viewer.xml
@@ -0,0 +1,14 @@
+<?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
new file mode 100644
index 0000000000..c402fa0b6d
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/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="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
new file mode 100644
index 0000000000..7a97538117
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_wearing_gear.xml
@@ -0,0 +1,5 @@
+<?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
new file mode 100644
index 0000000000..9effed1f42
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/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/minimal/xui/ja/notifications.xml b/indra/newview/skins/minimal/xui/ja/notifications.xml
new file mode 100644
index 0000000000..6ad0ed1ac6
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/notifications.xml
@@ -0,0 +1,2995 @@
+<?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; ã¨ã„ã†åå‰ã®ã‚ªãƒ–ジェクトãŒã€ã‚ãªãŸã« [ITEM_SLURL] を渡ãã†ã¨ã—ã¦ã„ã¾ã™ã€‚ã“ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’使ã†ã«ã¯ã‚¢ãƒ‰ãƒãƒ³ã‚¹ãƒ¢ãƒ¼ãƒ‰ã¸ã®åˆ‡ã‚Šæ›¿ãˆãŒå¿…è¦ã§ã™ã€‚アドãƒãƒ³ã‚¹ãƒ¢ãƒ¼ãƒ‰ã§ãƒ­ã‚°ã‚¤ãƒ³ã—ãªãŠã™ã¨ã€ã‚ãªãŸã®æŒã¡ç‰©ã«ã“ã®ã‚¢ã‚¤ãƒ†ãƒ ãŒè¦‹ã¤ã‹ã‚Šã¾ã™ã€‚アドãƒãƒ³ã‚¹ãƒ¢ãƒ¼ãƒ‰ã«åˆ‡ã‚Šæ›¿ãˆã‚‹ã«ã¯ã€ã“ã®ã‚¢ãƒ—リケーションを終了ã—ã¦å†èµ·å‹•ã—ã€ãƒ­ã‚°ã‚¤ãƒ³ç”»é¢ã§ãƒ¢ãƒ¼ãƒ‰è¨­å®šã‚’変更ã—ã¦ãã ã•ã„。
+ <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
new file mode 100644
index 0000000000..17e1283d24
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/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/minimal/xui/ja/panel_bottomtray.xml b/indra/newview/skins/minimal/xui/ja/panel_bottomtray.xml
new file mode 100644
index 0000000000..13be2cea0a
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/panel_bottomtray.xml
@@ -0,0 +1,45 @@
+<?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
new file mode 100644
index 0000000000..f7f575206a
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/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/minimal/xui/ja/panel_im_control_panel.xml b/indra/newview/skins/minimal/xui/ja/panel_im_control_panel.xml
new file mode 100644
index 0000000000..f2429ac12a
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/panel_im_control_panel.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_im_control_panel">
+ <text name="avatar_name" value="ä¸æ˜Ž"/>
+ <layout_stack name="button_stack">
+ <layout_panel name="view_profile_btn_panel">
+ <button label="プロフィール" name="view_profile_btn"/>
+ </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/minimal/xui/ja/panel_login.xml b/indra/newview/skins/minimal/xui/ja/panel_login.xml
new file mode 100644
index 0000000000..ac1fe455c7
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/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://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
new file mode 100644
index 0000000000..0426c4fe9a
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/panel_navigation_bar.xml
@@ -0,0 +1,18 @@
+<?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
new file mode 100644
index 0000000000..9eb45d9a80
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/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="最近交æµã—ãŸäººã¯ã„ã¾ã›ã‚“。一緒ã«ä½•ã‹ã™ã‚‹ä»²é–“ã‚’ãŠæŽ¢ã—ã§ã™ã‹ï¼Ÿä¸‹ã®ã€Œè¡Œã先ガイドã€ãƒœã‚¿ãƒ³ã‚’クリックã—ã¦ãã ã•ã„。"/>
+ <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="chat_btn_lp">
+ <button label="IM" name="im_btn" tool_tip="インスタントメッセージを開ãã¾ã™"/>
+ </layout_panel>
+ <layout_panel name="chat_btn_lp">
+ <button label="コール" name="call_btn" tool_tip="ã“ã®ä½äººã«ã‚³ãƒ¼ãƒ«ã™ã‚‹"/>
+ </layout_panel>
+ <layout_panel name="chat_btn_lp">
+ <button label="共有" name="share_btn" tool_tip="「æŒã¡ç‰©ã€ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’共有ã™ã‚‹"/>
+ </layout_panel>
+ <layout_panel name="chat_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
new file mode 100644
index 0000000000..d06db8ccb1
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/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/minimal/xui/ja/panel_status_bar.xml b/indra/newview/skins/minimal/xui/ja/panel_status_bar.xml
new file mode 100644
index 0000000000..163064484b
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/panel_status_bar.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="status">
+ <panel.string name="StatBarDaysOfWeek">
+ 日曜日:月曜日:ç«æ›œæ—¥:水曜日:木曜日:金曜日:土曜日
+ </panel.string>
+ <panel.string name="StatBarMonthsOfYear">
+ 1月:2月:3月:4月:5月:6月:7月:8月:9月:10月:11月:12月
+ </panel.string>
+ <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>
+ <panel name="balance_bg">
+ <text name="balance" tool_tip="クリックã—㦠L$ 残高を更新" value="L$20"/>
+ <button label="L$ ã®è³¼å…¥" name="buyL" tool_tip="クリックã—㦠L$ を購入ã—ã¾ã™"/>
+ </panel>
+ <text name="TimeText" tool_tip="ç¾åœ¨æ™‚刻(太平洋)">
+ 24:00 AM PST
+ </text>
+ <button name="media_toggle_btn" tool_tip="ã™ã¹ã¦ã®ãƒ¡ãƒ‡ã‚£ã‚¢ã‚’開始・åœæ­¢ï¼ˆéŸ³æ¥½ã€ãƒ“デオã€Web ページ)"/>
+ <button name="volume_btn" tool_tip="グローãƒãƒ«éŸ³é‡è¨­å®š"/>
+</panel>
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
index f7fe5640ef..90b321e0a2 100644
--- a/indra/newview/skins/minimal/xui/pt/menu_inspect_avatar_gear.xml
+++ b/indra/newview/skins/minimal/xui/pt/menu_inspect_avatar_gear.xml
@@ -3,6 +3,7 @@
<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"/>
diff --git a/indra/newview/skins/minimal/xui/pt/panel_bottomtray.xml b/indra/newview/skins/minimal/xui/pt/panel_bottomtray.xml
index f67823dbd8..9b4eb2c2b8 100644
--- a/indra/newview/skins/minimal/xui/pt/panel_bottomtray.xml
+++ b/indra/newview/skins/minimal/xui/pt/panel_bottomtray.xml
@@ -4,26 +4,32 @@
<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="Mostra/oculta os gestos"/>
+ <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="Mostra/oculta os controles da câmera"/>
+ <bottomtray_button label="Exibir" name="camera_btn" tool_tip="Controlar ângulo da câmera"/>
</layout_panel>
- <layout_panel name="avatar_and_destinations_panel">
- <bottomtray_button label="Destinos" name="destination_btn" tool_tip="Exibe janela de pessoas"/>
+ <layout_panel name="destinations_panel">
+ <bottomtray_button label="Destinos" name="destination_btn" tool_tip="Viajar no Second Life"/>
</layout_panel>
- <layout_panel name="avatar_and_destinations_panel">
- <bottomtray_button label="Meu avatar" name="avatar_btn"/>
+ <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="Exibe as pessoas"/>
+ <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="Exibe o perfil"/>
+ <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="Abrir &quot;Como...&quot; do Second Life"/>
+ <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">
diff --git a/indra/newview/skins/minimal/xui/pt/panel_im_control_panel.xml b/indra/newview/skins/minimal/xui/pt/panel_im_control_panel.xml
index 91b7d1b7cd..d223ee9c69 100644
--- a/indra/newview/skins/minimal/xui/pt/panel_im_control_panel.xml
+++ b/indra/newview/skins/minimal/xui/pt/panel_im_control_panel.xml
@@ -5,7 +5,7 @@
<button label="Perfil" name="view_profile_btn"/>
</layout_panel>
<layout_panel name="add_friend_btn_panel">
- <button label="Adicionar amigo" name="add_friend_btn"/>
+ <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"/>
diff --git a/indra/newview/skins/minimal/xui/pt/panel_people.xml b/indra/newview/skins/minimal/xui/pt/panel_people.xml
index 935ade2177..d46c440eb9 100644
--- a/indra/newview/skins/minimal/xui/pt/panel_people.xml
+++ b/indra/newview/skins/minimal/xui/pt/panel_people.xml
@@ -53,6 +53,9 @@ Em busca de alguém para conversar? Confira o botão Destinos abaixo.
<button label="MI" name="im_btn" tool_tip="Abrir sessão de mensagem instantânea"/>
</layout_panel>
<layout_panel name="chat_btn_lp">
+ <button label="Ligar" name="call_btn" tool_tip="Ligar para este residente"/>
+ </layout_panel>
+ <layout_panel name="chat_btn_lp">
<button label="Teletransportar" name="teleport_btn" tool_tip="Oferecer teletransporte"/>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/tests/gpus_results.txt b/indra/newview/tests/gpus_results.txt
new file mode 100644
index 0000000000..7e9a064921
--- /dev/null
+++ b/indra/newview/tests/gpus_results.txt
@@ -0,0 +1,1595 @@
+GPU String Supported? Class Recognizer
+------------------------------------------------------------------------------------------------------ ----------- ----- ------------------------------------
+ATI UNRECOGNIZED
+ATI 3D-Analyze unsupported 0 ATI 3D-Analyze
+ATI ASUS A9xxx supported 1 ATI ASUS A9xxx
+ATI ASUS AH24xx supported 1 ATI ASUS AH24xx
+ATI ASUS AH26xx supported 3 ATI ASUS AH26xx
+ATI ASUS AH34xx supported 1 ATI ASUS AH34xx
+ATI ASUS AH36xx supported 3 ATI ASUS AH36xx
+ATI ASUS AH46xx supported 3 ATI ASUS AH46xx
+ATI ASUS AX3xx supported 1 ATI ASUS AX3xx
+ATI ASUS AX5xx supported 1 ATI ASUS AX5xx
+ATI ASUS AX8xx supported 2 ATI ASUS AX8xx
+ATI ASUS EAH38xx supported 3 ATI ASUS EAH38xx
+ATI ASUS EAH43xx supported 1 ATI ASUS EAH43xx
+ATI ASUS EAH45xx supported 1 ATI ASUS EAH45xx
+ATI ASUS EAH48xx supported 3 ATI ASUS EAH48xx
+ATI ASUS EAH57xx supported 3 ATI ASUS EAH57xx
+ATI ASUS EAH58xx supported 3 ATI ASUS EAH58xx
+ATI ASUS X1xxx supported 3 ATI ASUS Radeon X1xxx
+ATI All-in-Wonder 9xxx supported 1 ATI All-in-Wonder 9xxx
+ATI All-in-Wonder HD supported 1 ATI All-in-Wonder HD
+ATI All-in-Wonder PCI-E supported 1 ATI All-in-Wonder PCI-E
+ATI All-in-Wonder X1800 supported 3 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 FireGL supported 0 ATI FireGL
+ATI FireGL 5200 supported 0 ATI FireGL
+ATI FireGL 5xxx supported 0 ATI FireGL
+ATI FireMV supported 0 ATI FireMV
+ATI Generic unsupported 0 ATI Generic
+ATI Hercules 9800 supported 1 ATI Hercules 9800
+ATI IGP 340M unsupported 0 ATI IGP 340M
+ATI M52 supported 1 ATI M52
+ATI M54 supported 1 ATI M54
+ATI M56 supported 1 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 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
+ATI Mobility Radeon 9800 supported 1 ATI Mobility Radeon 9800
+ATI Mobility Radeon HD 2300 supported 1 ATI Mobility Radeon HD 2300
+ATI Mobility Radeon HD 2400 supported 1 ATI Mobility Radeon HD 2400
+ATI Mobility Radeon HD 2600 supported 3 ATI Mobility Radeon HD 2600
+ATI Mobility Radeon HD 2700 supported 3 ATI Mobility Radeon HD 2700
+ATI Mobility Radeon HD 3400 supported 2 ATI Mobility Radeon HD 3400
+ATI Mobility Radeon HD 3600 supported 3 ATI Mobility Radeon HD 3600
+ATI Mobility Radeon HD 3800 supported 3 ATI Mobility Radeon HD 3800
+ATI Mobility Radeon HD 4200 supported 2 ATI Mobility Radeon HD 4200
+ATI Mobility Radeon HD 4300 supported 2 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 RV380 supported 0 ATI RV380
+ATI RV530 supported 1 ATI RV530
+ATI Radeon 2100 supported 0 ATI Radeon 2100
+ATI Radeon 3000 supported 0 ATI Radeon 3000
+ATI Radeon 3100 supported 1 ATI Radeon 3100
+ATI Radeon 7000 supported 0 ATI Radeon 7xxx
+ATI Radeon 7xxx supported 0 ATI Radeon 7xxx
+ATI Radeon 8xxx supported 0 ATI Radeon 8xxx
+ATI Radeon 9000 supported 0 ATI Radeon 9000
+ATI Radeon 9100 supported 0 ATI Radeon 9100
+ATI Radeon 9200 supported 0 ATI Radeon 9200
+ATI Radeon 9500 supported 0 ATI Radeon 9500
+ATI Radeon 9600 supported 0 ATI Radeon 9600
+ATI Radeon 9700 supported 1 ATI Radeon 9700
+ATI Radeon 9800 supported 1 ATI Radeon 9800
+ATI Radeon HD 2300 supported 0 ATI Radeon HD 2300
+ATI Radeon HD 2400 supported 1 ATI Radeon HD 2400
+ATI Radeon HD 2600 supported 2 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 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
+ATI Radeon HD 3800 supported 3 ATI Radeon HD 3800
+ATI Radeon HD 4200 supported 1 ATI Radeon HD 4200
+ATI Radeon HD 4300 supported 1 ATI Radeon HD 4300
+ATI Radeon HD 4500 supported 3 ATI Radeon HD 4500
+ATI Radeon HD 4600 supported 3 ATI Radeon HD 4600
+ATI Radeon HD 4700 supported 3 ATI Radeon HD 4700
+ATI Radeon HD 4800 supported 3 ATI Radeon HD 4800
+ATI Radeon HD 5400 supported 3 ATI Radeon HD 5400
+ATI Radeon HD 5500 supported 3 ATI Radeon HD 5500
+ATI Radeon HD 5600 supported 3 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 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 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 X300 supported 0 ATI Radeon X300
+ATI Radeon X500 supported 0 ATI Radeon X500
+ATI Radeon X600 supported 1 ATI Radeon X600
+ATI Radeon X700 supported 1 ATI Radeon X700
+ATI Radeon X7xx supported 1 ATI Radeon X700
+ATI Radeon X800 supported 2 ATI Radeon X800
+ATI Radeon Xpress supported 0 ATI Radeon Xpress
+ATI Rage 128 supported 0 ATI Rage 128
+ATI Technologies Inc. supported 0 ATI Technologies
+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. 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 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 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 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 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 6600M Series 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 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 6800 Series 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 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. ASUS 5870 Eyefinity 6 supported 0 ATI Technologies
+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 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
+ATI Technologies Inc. ASUS EAH4550 series supported 1 ATI ASUS EAH45xx
+ATI Technologies Inc. ASUS EAH4650 series supported 3 ATI ASUS AH46xx
+ATI Technologies Inc. ASUS EAH4670 series supported 3 ATI ASUS AH46xx
+ATI Technologies Inc. ASUS EAH4750 Series supported 0 ATI Technologies
+ATI Technologies Inc. ASUS EAH4770 Series supported 0 ATI Technologies
+ATI Technologies Inc. ASUS EAH4770 series supported 0 ATI Technologies
+ATI Technologies Inc. ASUS EAH4850 series supported 3 ATI ASUS EAH48xx
+ATI Technologies Inc. ASUS EAH5450 Series supported 0 ATI Technologies
+ATI Technologies Inc. ASUS EAH5550 Series supported 0 ATI Technologies
+ATI Technologies Inc. ASUS EAH5570 series supported 0 ATI Technologies
+ATI Technologies Inc. ASUS EAH5670 Series supported 0 ATI Technologies
+ATI Technologies Inc. ASUS EAH5750 Series supported 3 ATI ASUS EAH57xx
+ATI Technologies Inc. ASUS EAH5770 Series supported 3 ATI ASUS EAH57xx
+ATI Technologies Inc. ASUS EAH5830 Series supported 3 ATI ASUS EAH58xx
+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 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
+ATI Technologies Inc. ASUS X1300 Series x86/SSE2 supported 3 ATI ASUS Radeon X1xxx
+ATI Technologies Inc. ASUS X1550 Series supported 3 ATI ASUS Radeon X1xxx
+ATI Technologies Inc. ASUS X1950 Series x86/SSE2 supported 3 ATI ASUS Radeon X1xxx
+ATI Technologies Inc. ASUS X800 Series supported 0 ATI Technologies
+ATI Technologies Inc. ASUS X850 Series supported 0 ATI Technologies
+ATI Technologies Inc. ATI All-in-Wonder HD supported 1 ATI All-in-Wonder HD
+ATI Technologies Inc. ATI FirePro 2260 supported 1 ATI FirePro 2000
+ATI Technologies Inc. ATI FirePro 2450 supported 1 ATI FirePro 2000
+ATI Technologies Inc. ATI FirePro M5800 supported 3 ATI FirePro M5800
+ATI Technologies Inc. ATI FirePro M7740 supported 3 ATI FirePro M7740
+ATI Technologies Inc. ATI FirePro M7820 supported 3 ATI FirePro M7820
+ATI Technologies Inc. ATI FirePro V3700 (FireGL) supported 0 ATI FireGL
+ATI Technologies Inc. ATI FirePro V3800 supported 1 ATI FirePro 3000
+ATI Technologies Inc. ATI FirePro V4800 supported 2 ATI FirePro 4000
+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 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 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 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
+ATI Technologies Inc. ATI Mobility Radeon HD 2600 supported 3 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 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 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 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
+ATI Technologies Inc. ATI Mobility Radeon HD 4330 supported 2 ATI Mobility Radeon HD 4300
+ATI Technologies Inc. ATI Mobility Radeon HD 4330 Series supported 2 ATI Mobility Radeon HD 4300
+ATI Technologies Inc. ATI Mobility Radeon HD 4350 supported 2 ATI Mobility Radeon HD 4300
+ATI Technologies Inc. ATI Mobility Radeon HD 4350 Series supported 2 ATI Mobility Radeon HD 4300
+ATI Technologies Inc. ATI Mobility Radeon HD 4500 Series supported 3 ATI Mobility Radeon HD 4500
+ATI Technologies Inc. ATI Mobility Radeon HD 4500/5100 Series supported 3 ATI Mobility Radeon HD 4500
+ATI Technologies Inc. ATI Mobility Radeon HD 4530 supported 3 ATI Mobility Radeon HD 4500
+ATI Technologies Inc. ATI Mobility Radeon HD 4530 Series supported 3 ATI Mobility Radeon HD 4500
+ATI Technologies Inc. ATI Mobility Radeon HD 4550 supported 3 ATI Mobility Radeon HD 4500
+ATI Technologies Inc. ATI Mobility Radeon HD 4570 supported 3 ATI Mobility Radeon HD 4500
+ATI Technologies Inc. ATI Mobility Radeon HD 4600 Series supported 3 ATI Mobility Radeon HD 4600
+ATI Technologies Inc. ATI Mobility Radeon HD 4650 supported 3 ATI Mobility Radeon HD 4600
+ATI Technologies Inc. ATI Mobility Radeon HD 4650 Series supported 3 ATI Mobility Radeon HD 4600
+ATI Technologies Inc. ATI Mobility Radeon HD 4670 supported 3 ATI Mobility Radeon HD 4600
+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 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 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 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 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 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 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 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. 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 RADEON XPRESS 1100 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
+ATI Technologies Inc. ATI Radeon supported 0 ATI Technologies
+ATI Technologies Inc. ATI Radeon 2100 supported 0 ATI Radeon 2100
+ATI Technologies Inc. ATI Radeon 2100 (Microsoft - WDDM) supported 0 ATI Radeon 2100
+ATI Technologies Inc. ATI Radeon 2100 Graphics supported 0 ATI Radeon 2100
+ATI Technologies Inc. ATI Radeon 3000 supported 0 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 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 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
+ATI Technologies Inc. ATI Radeon HD 2200 Graphics supported 0 ATI Technologies
+ATI Technologies Inc. ATI Radeon HD 2350 supported 0 ATI Radeon HD 2300
+ATI Technologies Inc. ATI Radeon HD 2400 supported 1 ATI Radeon HD 2400
+ATI Technologies Inc. ATI Radeon HD 2400 OpenGL Engine supported 1 ATI Radeon HD 2400
+ATI Technologies Inc. ATI Radeon HD 2400 PRO supported 1 ATI Radeon HD 2400
+ATI Technologies Inc. ATI Radeon HD 2400 PRO AGP supported 1 ATI Radeon HD 2400
+ATI Technologies Inc. ATI Radeon HD 2400 Pro supported 1 ATI Radeon HD 2400
+ATI Technologies Inc. ATI Radeon HD 2400 Series supported 1 ATI Radeon HD 2400
+ATI Technologies Inc. ATI Radeon HD 2400 XT supported 1 ATI Radeon HD 2400
+ATI Technologies Inc. ATI Radeon HD 2400 XT OpenGL Engine supported 1 ATI Radeon HD 2400
+ATI Technologies Inc. ATI Radeon HD 2600 OpenGL Engine supported 2 ATI Radeon HD 2600
+ATI Technologies Inc. ATI Radeon HD 2600 PRO supported 2 ATI Radeon HD 2600
+ATI Technologies Inc. ATI Radeon HD 2600 PRO OpenGL Engine supported 2 ATI Radeon HD 2600
+ATI Technologies Inc. ATI Radeon HD 2600 Pro supported 2 ATI Radeon HD 2600
+ATI Technologies Inc. ATI Radeon HD 2600 Series supported 2 ATI Radeon HD 2600
+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 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
+ATI Technologies Inc. ATI Radeon HD 3450 - Dell Optiplex supported 1 ATI Radeon HD 3400
+ATI Technologies Inc. ATI Radeon HD 3470 supported 1 ATI Radeon HD 3400
+ATI Technologies Inc. ATI Radeon HD 3470 - Dell Optiplex supported 1 ATI Radeon HD 3400
+ATI Technologies Inc. ATI Radeon HD 3550 supported 1 ATI Radeon HD 3500
+ATI Technologies Inc. ATI Radeon HD 3600 Series supported 3 ATI Radeon HD 3600
+ATI Technologies Inc. ATI Radeon HD 3650 supported 3 ATI Radeon HD 3600
+ATI Technologies Inc. ATI Radeon HD 3650 AGP supported 3 ATI Radeon HD 3600
+ATI Technologies Inc. ATI Radeon HD 3730 supported 3 ATI Radeon HD 3700
+ATI Technologies Inc. ATI Radeon HD 3800 Series supported 3 ATI Radeon HD 3800
+ATI Technologies Inc. ATI Radeon HD 3850 supported 3 ATI Radeon HD 3800
+ATI Technologies Inc. ATI Radeon HD 3850 AGP supported 3 ATI Radeon HD 3800
+ATI Technologies Inc. ATI Radeon HD 3870 supported 3 ATI Radeon HD 3800
+ATI Technologies Inc. ATI Radeon HD 3870 X2 supported 3 ATI Radeon HD 3800
+ATI Technologies Inc. ATI Radeon HD 4200 supported 1 ATI Radeon HD 4200
+ATI Technologies Inc. ATI Radeon HD 4250 supported 1 ATI Radeon HD 4200
+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 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
+ATI Technologies Inc. ATI Radeon HD 4350 (Microsoft WDDM 1.1) supported 1 ATI Radeon HD 4300
+ATI Technologies Inc. ATI Radeon HD 4450 supported 1 ATI Radeon HD 4400
+ATI Technologies Inc. ATI Radeon HD 4500 Series supported 3 ATI Radeon HD 4500
+ATI Technologies Inc. ATI Radeon HD 4550 supported 3 ATI Radeon HD 4500
+ATI Technologies Inc. ATI Radeon HD 4600 Series supported 3 ATI Radeon HD 4600
+ATI Technologies Inc. ATI Radeon HD 4650 supported 3 ATI Radeon HD 4600
+ATI Technologies Inc. ATI Radeon HD 4670 supported 3 ATI Radeon HD 4600
+ATI Technologies Inc. ATI Radeon HD 4670 OpenGL Engine supported 3 ATI Radeon HD 4600
+ATI Technologies Inc. ATI Radeon HD 4700 Series supported 3 ATI Radeon HD 4700
+ATI Technologies Inc. ATI Radeon HD 4720 supported 3 ATI Radeon HD 4700
+ATI Technologies Inc. ATI Radeon HD 4730 supported 3 ATI Radeon HD 4700
+ATI Technologies Inc. ATI Radeon HD 4730 Series supported 3 ATI Radeon HD 4700
+ATI Technologies Inc. ATI Radeon HD 4750 supported 3 ATI Radeon HD 4700
+ATI Technologies Inc. ATI Radeon HD 4770 supported 3 ATI Radeon HD 4700
+ATI Technologies Inc. ATI Radeon HD 4800 Series supported 3 ATI Radeon HD 4800
+ATI Technologies Inc. ATI Radeon HD 4850 supported 3 ATI Radeon HD 4800
+ATI Technologies Inc. ATI Radeon HD 4850 OpenGL Engine supported 3 ATI Radeon HD 4800
+ATI Technologies Inc. ATI Radeon HD 4850 Series supported 3 ATI Radeon HD 4800
+ATI Technologies Inc. ATI Radeon HD 4870 supported 3 ATI Radeon HD 4800
+ATI Technologies Inc. ATI Radeon HD 4870 OpenGL Engine supported 3 ATI Radeon HD 4800
+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 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 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
+ATI Technologies Inc. ATI Radeon HD 5700 Series supported 3 ATI Radeon HD 5700
+ATI Technologies Inc. ATI Radeon HD 5750 supported 3 ATI Radeon HD 5700
+ATI Technologies Inc. ATI Radeon HD 5750 OpenGL Engine supported 3 ATI Radeon HD 5700
+ATI Technologies Inc. ATI Radeon HD 5770 supported 3 ATI Radeon HD 5700
+ATI Technologies Inc. ATI Radeon HD 5770 OpenGL Engine supported 3 ATI Radeon HD 5700
+ATI Technologies Inc. ATI Radeon HD 5800 Series supported 3 ATI Radeon HD 5800
+ATI Technologies Inc. ATI Radeon HD 5850 supported 3 ATI Radeon HD 5800
+ATI Technologies Inc. ATI Radeon HD 5870 supported 3 ATI Radeon HD 5800
+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 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 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
+ATI Technologies Inc. ATI Radeon HD 6770M OpenGL Engine supported 3 ATI Radeon HD 6700
+ATI Technologies Inc. ATI Radeon HD 6800 Series supported 3 ATI Radeon HD 6800
+ATI Technologies Inc. ATI Radeon HD 6970M OpenGL Engine supported 3 ATI Radeon HD 6900
+ATI Technologies Inc. ATI Radeon HD3750 supported 3 ATI Radeon HD 3700
+ATI Technologies Inc. ATI Radeon HD4300/HD4500 series supported 1 ATI Radeon HD 4300
+ATI Technologies Inc. ATI Radeon HD4670 supported 3 ATI Radeon HD 4600
+ATI Technologies Inc. ATI Radeon Juniper LE Prototype OpenGL Engine supported 3 AMD JUNIPER (HD 5700)
+ATI Technologies Inc. ATI Radeon RV710 Prototype OpenGL Engine supported 1 AMD RV710 (HD 4300)
+ATI Technologies Inc. ATI Radeon RV730 Prototype OpenGL Engine supported 3 AMD RV730 (HD 4600)
+ATI Technologies Inc. ATI Radeon RV770 Prototype OpenGL Engine supported 3 AMD RV770 (HD 4800)
+ATI Technologies Inc. ATI Radeon RV790 Prototype OpenGL Engine supported 3 AMD RV790 (HD 4800)
+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 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
+ATI Technologies Inc. ATI Radeon Xpress 1200 supported 0 ATI Radeon Xpress
+ATI Technologies Inc. ATI Radeon Xpress 1200 Series supported 0 ATI Radeon Xpress
+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/SSE2 supported 0 ATI Radeon Xpress
+ATI Technologies Inc. ATI Radeon Xpress Series 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. 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. 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
+ATI Technologies Inc. HD3730 supported 0 ATI Technologies
+ATI Technologies Inc. HIGHTECH EXCALIBUR RADEON 9550SE Series supported 0 ATI Radeon 9500
+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 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. 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. 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
+ATI Technologies Inc. RADEON 7500 DDR x86/SSE2 supported 0 ATI Radeon 7xxx
+ATI Technologies Inc. RADEON 9100 IGP DDR x86/SSE2 supported 0 ATI Radeon 9100
+ATI Technologies Inc. RADEON 9200 DDR x86/MMX/3DNow!/SSE supported 0 ATI Radeon 9200
+ATI Technologies Inc. RADEON 9200 DDR x86/SSE2 supported 0 ATI Radeon 9200
+ATI Technologies Inc. RADEON 9200 PRO DDR x86/MMX/3DNow!/SSE supported 0 ATI Radeon 9200
+ATI Technologies Inc. RADEON 9200 Series DDR x86/MMX/3DNow!/SSE supported 0 ATI Radeon 9200
+ATI Technologies Inc. RADEON 9200 Series DDR x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon 9200
+ATI Technologies Inc. RADEON 9200 Series DDR x86/SSE supported 0 ATI Radeon 9200
+ATI Technologies Inc. RADEON 9200 Series DDR x86/SSE2 supported 0 ATI Radeon 9200
+ATI Technologies Inc. RADEON 9200SE DDR x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon 9200
+ATI Technologies Inc. RADEON 9200SE DDR x86/SSE2 supported 0 ATI Radeon 9200
+ATI Technologies Inc. RADEON 9250/9200 Series DDR x86/MMX/3DNow!/SSE supported 0 ATI Radeon 9200
+ATI Technologies Inc. RADEON 9250/9200 Series DDR x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon 9200
+ATI Technologies Inc. RADEON 9250/9200 Series DDR x86/SSE2 supported 0 ATI Radeon 9200
+ATI Technologies Inc. RADEON 9500 supported 0 ATI 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 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
+ATI Technologies Inc. RADEON 9700 PRO x86/MMX/3DNow!/SSE supported 1 ATI Radeon 9700
+ATI Technologies Inc. RADEON 9800 PRO supported 1 ATI Radeon 9800
+ATI Technologies Inc. RADEON 9800 x86/SSE2 supported 1 ATI Radeon 9800
+ATI Technologies Inc. RADEON IGP 340M DDR x86/SSE2 unsupported 0 ATI IGP 340M
+ATI Technologies Inc. RADEON X300 Series x86/SSE2 supported 0 ATI Radeon X300
+ATI Technologies Inc. RADEON X300 x86/SSE2 supported 0 ATI Radeon X300
+ATI Technologies Inc. RADEON X300/X550 Series x86/SSE2 supported 0 ATI Radeon X300
+ATI Technologies Inc. RADEON X550 x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon X500
+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 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 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
+ATI Technologies Inc. RADEON XPRESS 200 Series x86/SSE2 supported 0 ATI Radeon Xpress
+ATI Technologies Inc. RADEON XPRESS 200M Series SW TCL x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon Xpress
+ATI Technologies Inc. RADEON XPRESS 200M Series SW TCL x86/SSE2 supported 0 ATI Radeon Xpress
+ATI Technologies Inc. RADEON XPRESS 200M Series x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon Xpress
+ATI Technologies Inc. RADEON XPRESS 200M Series x86/SSE2 supported 0 ATI Radeon Xpress
+ATI Technologies Inc. RADEON XPRESS Series x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon Xpress
+ATI Technologies Inc. RADEON XPRESS Series x86/SSE2 supported 0 ATI Radeon Xpress
+ATI Technologies Inc. RS740 supported 0 ATI Technologies
+ATI Technologies Inc. RS780C supported 0 AMD RS780 (HD 3200)
+ATI Technologies Inc. RS780M supported 0 AMD RS780 (HD 3200)
+ATI Technologies Inc. RS880 supported 1 AMD RS880 (HD 4200)
+ATI Technologies Inc. RV410 Pro x86/SSE2 supported 1 ATI RV410 (X700)
+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 6770M supported 0 ATI Technologies
+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
+ATI Technologies Inc. Radeon 9000 DDR x86/SSE2 supported 0 ATI Radeon 9000
+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 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 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 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
+ATI Technologies Inc. Tul, RADEON X600 PRO supported 0 ATI Technologies
+ATI Technologies Inc. Tul, RADEON X600 PRO x86/SSE2 supported 0 ATI Technologies
+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. 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
+ATI Technologies Inc. Yamaha ATI HD 9000da/s supported 0 ATI Technologies
+ATI Technologies Inc. Yamaha ATI HD 9000da/s 2048 supported 0 ATI Technologies
+Advanced Micro Devices, Inc. Mesa DRI R600 (RS780 9612) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2 supported 0 AMD RS780 (HD 3200)
+Advanced Micro Devices, Inc. Mesa DRI R600 (RS880 9710) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2 supported 1 AMD RS880 (HD 4200)
+Advanced Micro Devices, Inc. Mesa DRI R600 (RS880 9712) 20090101 TCL supported 1 AMD RS880 (HD 4200)
+Advanced Micro Devices, Inc. Mesa DRI R600 (RV610 94C1) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2 supported 1 AMD RV610 (HD 2400)
+Advanced Micro Devices, Inc. Mesa DRI R600 (RV610 94C9) 20090101 x86/MMX/SSE2 TCL DRI2 supported 1 AMD RV610 (HD 2400)
+Advanced Micro Devices, Inc. Mesa DRI R600 (RV620 95C4) 20090101 x86/MMX/SSE2 TCL DRI2 supported 1 AMD RV620 (HD 3400)
+Advanced Micro Devices, Inc. Mesa DRI R600 (RV620 95C5) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2 supported 1 AMD RV620 (HD 3400)
+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 (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
+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)
+DRI R300 Project Mesa DRI R300 (RS400 5A62) 20090101 x86/MMX/SSE2 NO-TCL DRI2 supported 1 ATI R300 (9700)
+DRI R300 Project Mesa DRI R300 (RS600 7941) 20090101 x86/MMX/SSE2 NO-TCL unsupported 0 ATI RS600 (Xpress 3200)
+DRI R300 Project Mesa DRI R300 (RS690 791F) 20090101 x86/MMX+/3DNow!+/SSE2 NO-TCL DRI2 supported 1 ATI R300 (9700)
+DRI R300 Project Mesa DRI R300 (RV350 4151) 20090101 AGP 4x x86/MMX+/3DNow!+/SSE TCL supported 0 ATI RV350 (9600)
+DRI R300 Project Mesa DRI R300 (RV350 4153) 20090101 AGP 8x x86/MMX+/3DNow!+/SSE TCL supported 0 ATI RV350 (9600)
+DRI R300 Project Mesa DRI R300 (RV380 3150) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2 supported 0 ATI RV380
+DRI R300 Project Mesa DRI R300 (RV380 3150) 20090101 x86/MMX/SSE2 TCL DRI2 supported 0 ATI RV380
+DRI R300 Project Mesa DRI R300 (RV380 5B60) 20090101 x86/MMX/SSE2 TCL DRI2 supported 0 ATI RV380
+DRI R300 Project Mesa DRI R300 (RV380 5B62) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2 supported 0 ATI RV380
+DRI R300 Project Mesa DRI R300 (RV515 7145) 20090101 x86/MMX/SSE2 TCL DRI2 supported 1 ATI RV515
+DRI R300 Project Mesa DRI R300 (RV515 7146) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2 supported 1 ATI RV515
+DRI R300 Project Mesa DRI R300 (RV515 7146) 20090101 x86/MMX/SSE2 TCL DRI2 supported 1 ATI RV515
+DRI R300 Project Mesa DRI R300 (RV515 7149) 20090101 x86/MMX/SSE2 TCL DRI2 supported 1 ATI RV515
+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
+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 830M unsupported 0 Intel 830M
+Intel 845G unsupported 0 Intel 845G
+Intel 855GM unsupported 0 Intel 855GM
+Intel 865G unsupported 0 Intel 865G
+Intel 915G unsupported 0 Intel 915G
+Intel 915GM unsupported 0 Intel 915GM
+Intel 945G supported 0 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 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 Eaglelake supported 0 Intel Eaglelake
+Intel Familia Mobile 45 Express Chipset (Microsoft Corporation - WDDM 1.1) UNRECOGNIZED
+Intel G33 unsupported 0 Intel G33
+Intel G41 supported 0 Intel G41
+Intel G41 Express Chipset supported 0 Intel G41
+Intel G45 supported 0 Intel G45
+Intel G45/G43 Express Chipset supported 0 Intel G45
+Intel Graphics Media Accelerator HD supported 0 Intel Graphics Media HD
+Intel HD Graphics supported 2 Intel HD Graphics
+Intel HD Graphics 100 supported 2 Intel HD Graphics
+Intel HD Graphics 200 supported 2 Intel HD Graphics
+Intel HD Graphics 200 BR-1101-00SH supported 2 Intel HD Graphics
+Intel HD Graphics 200 BR-1101-00SJ supported 2 Intel HD Graphics
+Intel HD Graphics 200 BR-1101-00SK supported 2 Intel HD Graphics
+Intel HD Graphics 200 BR-1101-01M5 supported 2 Intel HD Graphics
+Intel HD Graphics 200 BR-1101-01M6 supported 2 Intel HD Graphics
+Intel HD Graphics BR-1004-01Y1 supported 2 Intel HD Graphics
+Intel HD Graphics BR-1006-0364 supported 2 Intel HD Graphics
+Intel HD Graphics BR-1006-0365 supported 2 Intel HD Graphics
+Intel HD Graphics BR-1006-0366 supported 2 Intel HD Graphics
+Intel HD Graphics BR-1007-02G4 supported 2 Intel HD Graphics
+Intel HD Graphics BR-1101-04SY supported 2 Intel HD Graphics
+Intel HD Graphics BR-1101-04SZ supported 2 Intel HD Graphics
+Intel HD Graphics BR-1101-04T0 supported 2 Intel HD Graphics
+Intel HD Graphics BR-1101-04T9 supported 2 Intel HD Graphics
+Intel HD Graphics Family supported 2 Intel HD Graphics
+Intel HD Graphics Family BR-1012-00Y8 supported 2 Intel HD Graphics
+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 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 Intel 845G unsupported 0 Intel 845G
+Intel Intel 855GM unsupported 0 Intel 855GM
+Intel Intel 865G unsupported 0 Intel 865G
+Intel Intel 915G unsupported 0 Intel 915G
+Intel Intel 915GM unsupported 0 Intel 915GM
+Intel Intel 945G supported 0 Intel 945G
+Intel Intel 945GM supported 0 Intel 945GM
+Intel Intel 965/963 Graphics Media Accelerator supported 0 Intel 965
+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 Cantiga unsupported 0 Intel Cantiga
+Intel Intel Eaglelake supported 0 Intel Eaglelake
+Intel Intel Grantsdale-G UNRECOGNIZED
+Intel Intel HD Graphics 3000 supported 2 Intel HD Graphics
+Intel Intel Lakeport UNRECOGNIZED
+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 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 HD Graphics supported 2 Intel HD Graphics
+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 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
+LegendgrafiX NVIDIA GeForce GT 430/TitaniumGL/GAC/D3D ACCELERATION/6x86/1 THREADs | http://Legendgr... supported 3 NVIDIA GT 430M
+Linden Lab Headless UNRECOGNIZED
+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 205 supported 0 NVIDIA G 205M
+NVIDIA 210 supported 1 NVIDIA G 210
+NVIDIA 310 supported 2 NVIDIA G 310M
+NVIDIA 310M supported 2 NVIDIA G 310M
+NVIDIA 315 supported 2 NVIDIA G 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 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 G 102M supported 0 NVIDIA G102M
+NVIDIA G 103M supported 0 NVIDIA G103M
+NVIDIA G 105M supported 0 NVIDIA G105M
+NVIDIA G 110M supported 0 NVIDIA G 110M
+NVIDIA G100 supported 0 NVIDIA G100
+NVIDIA G102M supported 0 NVIDIA G102M
+NVIDIA G103M supported 0 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 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 G94 supported 3 NVIDIA G94
+NVIDIA G96/PCI/SSE2 UNRECOGNIZED
+NVIDIA G98/PCI/SSE2 UNRECOGNIZED
+NVIDIA GT 120 supported 2 NVIDIA GT 120M
+NVIDIA GT 130 supported 2 NVIDIA GT 130M
+NVIDIA GT 130M supported 2 NVIDIA GT 130M
+NVIDIA GT 140 supported 2 NVIDIA GT 140M
+NVIDIA GT 150 supported 2 NVIDIA GT 150M
+NVIDIA GT 160M supported 2 NVIDIA GT 160M
+NVIDIA GT 220 supported 2 NVIDIA GT 220M
+NVIDIA GT 220/PCI/SSE2 supported 2 NVIDIA GT 220M
+NVIDIA GT 220/PCI/SSE2/3DNOW! supported 2 NVIDIA GT 220M
+NVIDIA GT 230 supported 2 NVIDIA GT 230M
+NVIDIA GT 230M supported 2 NVIDIA GT 230M
+NVIDIA GT 240 supported 2 NVIDIA GT 240M
+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 330 supported 3 NVIDIA GT 330M
+NVIDIA GT 330M supported 3 NVIDIA GT 330M
+NVIDIA GT 340 supported 2 NVIDIA GT 340M
+NVIDIA GT 420 supported 2 NVIDIA GT 420M
+NVIDIA GT 430 supported 3 NVIDIA GT 430M
+NVIDIA GT 440 supported 3 NVIDIA GT 440M
+NVIDIA GT 450 supported 3 NVIDIA GT 450M
+NVIDIA GT 520 supported 3 NVIDIA GT 520M
+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 GTS 150 supported 2 NVIDIA GT 150M
+NVIDIA GTS 240 supported 3 NVIDIA GTS 240
+NVIDIA GTS 250 supported 3 NVIDIA GTS 250
+NVIDIA GTS 350M supported 3 NVIDIA GTS 350M
+NVIDIA GTS 360 supported 3 NVIDIA GTS 360
+NVIDIA GTS 360M supported 3 NVIDIA GTS 360M
+NVIDIA GTS 450 supported 3 NVIDIA GTS 450
+NVIDIA GTX 260 supported 3 NVIDIA GTX 260
+NVIDIA GTX 260M supported 3 NVIDIA GTX 260
+NVIDIA GTX 270 supported 3 NVIDIA GTX 270
+NVIDIA GTX 280 supported 3 NVIDIA GTX 280
+NVIDIA GTX 285 supported 3 NVIDIA GTX 285
+NVIDIA GTX 290 supported 3 NVIDIA GTX 290
+NVIDIA GTX 460 supported 3 NVIDIA GTX 460
+NVIDIA GTX 460M supported 3 NVIDIA GTX 460M
+NVIDIA GTX 465 supported 3 NVIDIA GTX 465
+NVIDIA GTX 470 supported 3 NVIDIA GTX 470
+NVIDIA GTX 470M supported 3 NVIDIA GTX 470M
+NVIDIA GTX 480 supported 3 NVIDIA GTX 480
+NVIDIA GTX 480M supported 3 NVIDIA GTX 480M
+NVIDIA GTX 550 Ti supported 3 NVIDIA GTX 550
+NVIDIA GTX 560 supported 3 NVIDIA GTX 560
+NVIDIA GTX 560 Ti supported 3 NVIDIA GTX 560
+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 2 supported 0 NVIDIA GeForce 2
+NVIDIA GeForce 205/PCI/SSE2 supported 2 NVIDIA 205
+NVIDIA GeForce 210 supported 2 NVIDIA 210
+NVIDIA GeForce 210/PCI/SSE2 supported 2 NVIDIA 210
+NVIDIA GeForce 210/PCI/SSE2/3DNOW! supported 2 NVIDIA 210
+NVIDIA GeForce 3 supported 0 NVIDIA GeForce 3
+NVIDIA GeForce 305M/PCI/SSE2 supported 1 NVIDIA 305M
+NVIDIA GeForce 310/PCI/SSE2 supported 3 NVIDIA 310
+NVIDIA GeForce 310/PCI/SSE2/3DNOW! supported 3 NVIDIA 310
+NVIDIA GeForce 310M/PCI/SSE2 supported 1 NVIDIA 310M
+NVIDIA GeForce 315/PCI/SSE2 supported 3 NVIDIA 315
+NVIDIA GeForce 315/PCI/SSE2/3DNOW! supported 3 NVIDIA 315
+NVIDIA GeForce 315M/PCI/SSE2 supported 2 NVIDIA 315M
+NVIDIA GeForce 320M/PCI/SSE2 supported 2 NVIDIA 320M
+NVIDIA GeForce 4 Go supported 0 NVIDIA GeForce 4
+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 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 6500 supported 0 NVIDIA GeForce 6500
+NVIDIA GeForce 6500/PCI/SSE2 supported 0 NVIDIA GeForce 6500
+NVIDIA GeForce 6600 supported 1 NVIDIA GeForce 6600
+NVIDIA GeForce 6600 GT/AGP/SSE/3DNOW! supported 1 NVIDIA GeForce 6600
+NVIDIA GeForce 6600 GT/AGP/SSE2 supported 1 NVIDIA GeForce 6600
+NVIDIA GeForce 6600 GT/PCI/SSE/3DNOW! supported 1 NVIDIA GeForce 6600
+NVIDIA GeForce 6600 GT/PCI/SSE2 supported 1 NVIDIA GeForce 6600
+NVIDIA GeForce 6600 GT/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 6600
+NVIDIA GeForce 6600 LE/PCI/SSE2 supported 1 NVIDIA GeForce 6600
+NVIDIA GeForce 6600/AGP/SSE/3DNOW! supported 1 NVIDIA GeForce 6600
+NVIDIA GeForce 6600/AGP/SSE2 supported 1 NVIDIA GeForce 6600
+NVIDIA GeForce 6600/AGP/SSE2/3DNOW! supported 1 NVIDIA GeForce 6600
+NVIDIA GeForce 6600/PCI/SSE2 supported 1 NVIDIA GeForce 6600
+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/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/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
+NVIDIA GeForce 7000M supported 0 NVIDIA GeForce 7000
+NVIDIA GeForce 7000M / nForce 610M/PCI/SSE2 supported 0 NVIDIA GeForce 7000
+NVIDIA GeForce 7000M / nForce 610M/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce 7000
+NVIDIA GeForce 7025 / NVIDIA nForce 630a/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce 7000
+NVIDIA GeForce 7025 / nForce 630a/PCI/SSE2 supported 0 NVIDIA GeForce 7000
+NVIDIA GeForce 7025 / nForce 630a/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce 7000
+NVIDIA GeForce 7050 / NVIDIA nForce 610i/PCI/SSE2 supported 0 NVIDIA GeForce 7000
+NVIDIA GeForce 7050 / NVIDIA nForce 620i/PCI/SSE2 supported 0 NVIDIA GeForce 7000
+NVIDIA GeForce 7050 / nForce 610i/PCI/SSE2 supported 0 NVIDIA GeForce 7000
+NVIDIA GeForce 7050 / nForce 620i/PCI/SSE2 supported 0 NVIDIA GeForce 7000
+NVIDIA GeForce 7050 PV / NVIDIA nForce 630a/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce 7000
+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 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
+NVIDIA GeForce 7300 GS/PCI/SSE2 supported 1 NVIDIA GeForce 7300
+NVIDIA GeForce 7300 GS/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 7300
+NVIDIA GeForce 7300 GT/AGP/SSE2 supported 1 NVIDIA GeForce 7300
+NVIDIA GeForce 7300 GT/AGP/SSE2/3DNOW! supported 1 NVIDIA GeForce 7300
+NVIDIA GeForce 7300 GT/PCI/SSE2 supported 1 NVIDIA GeForce 7300
+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/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
+NVIDIA GeForce 7500 supported 1 NVIDIA GeForce 7500
+NVIDIA GeForce 7500 LE/PCI/SSE2 supported 1 NVIDIA GeForce 7500
+NVIDIA GeForce 7500 LE/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 7500
+NVIDIA GeForce 7600 supported 2 NVIDIA GeForce 7600
+NVIDIA GeForce 7600 GS/AGP/SSE2 supported 2 NVIDIA GeForce 7600
+NVIDIA GeForce 7600 GS/AGP/SSE2/3DNOW! supported 2 NVIDIA GeForce 7600
+NVIDIA GeForce 7600 GS/PCI/SSE2 supported 2 NVIDIA GeForce 7600
+NVIDIA GeForce 7600 GS/PCI/SSE2/3DNOW! supported 2 NVIDIA GeForce 7600
+NVIDIA GeForce 7600 GT/AGP/SSE/3DNOW! supported 2 NVIDIA GeForce 7600
+NVIDIA GeForce 7600 GT/AGP/SSE2 supported 2 NVIDIA GeForce 7600
+NVIDIA GeForce 7600 GT/PCI/SSE2 supported 2 NVIDIA GeForce 7600
+NVIDIA GeForce 7600 GT/PCI/SSE2/3DNOW! supported 2 NVIDIA GeForce 7600
+NVIDIA GeForce 7650 GS/PCI/SSE2 supported 2 NVIDIA GeForce 7600
+NVIDIA GeForce 7800 supported 2 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 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/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 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
+NVIDIA GeForce 8400 GS/PCI/SSE/3DNOW! supported 1 NVIDIA GeForce 8400
+NVIDIA GeForce 8400 GS/PCI/SSE2 supported 1 NVIDIA GeForce 8400
+NVIDIA GeForce 8400 GS/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 8400
+NVIDIA GeForce 8400/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 8400
+NVIDIA GeForce 8400GS/PCI/SSE2 supported 1 NVIDIA GeForce 8400
+NVIDIA GeForce 8400GS/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 8400
+NVIDIA GeForce 8400M supported 1 NVIDIA GeForce 8400M
+NVIDIA GeForce 8400M G/PCI/SSE2 supported 1 NVIDIA GeForce 8400M
+NVIDIA GeForce 8400M G/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 8400M
+NVIDIA GeForce 8400M GS/PCI/SSE2 supported 1 NVIDIA GeForce 8400M
+NVIDIA GeForce 8400M GS/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 8400M
+NVIDIA GeForce 8400M GT/PCI/SSE2 supported 1 NVIDIA GeForce 8400M
+NVIDIA GeForce 8500 supported 3 NVIDIA GeForce 8500
+NVIDIA GeForce 8500 GT/PCI/SSE2 supported 3 NVIDIA GeForce 8500
+NVIDIA GeForce 8500 GT/PCI/SSE2/3DNOW! supported 3 NVIDIA GeForce 8500
+NVIDIA GeForce 8600 supported 3 NVIDIA GeForce 8600
+NVIDIA GeForce 8600 GS/PCI/SSE2 supported 3 NVIDIA GeForce 8600
+NVIDIA GeForce 8600 GS/PCI/SSE2/3DNOW! supported 3 NVIDIA GeForce 8600
+NVIDIA GeForce 8600 GT/PCI/SSE2 supported 3 NVIDIA GeForce 8600
+NVIDIA GeForce 8600 GT/PCI/SSE2/3DNOW! supported 3 NVIDIA GeForce 8600
+NVIDIA GeForce 8600 GTS/PCI/SSE2 supported 3 NVIDIA GeForce 8600
+NVIDIA GeForce 8600 GTS/PCI/SSE2/3DNOW! supported 3 NVIDIA GeForce 8600
+NVIDIA GeForce 8600GS/PCI/SSE2 supported 3 NVIDIA GeForce 8600
+NVIDIA GeForce 8600M supported 1 NVIDIA GeForce 8600M
+NVIDIA GeForce 8600M GS/PCI/SSE2 supported 1 NVIDIA GeForce 8600M
+NVIDIA GeForce 8600M GS/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 8600M
+NVIDIA GeForce 8600M GT/PCI/SSE2 supported 1 NVIDIA GeForce 8600M
+NVIDIA GeForce 8700 supported 3 NVIDIA GeForce 8700
+NVIDIA GeForce 8700M supported 3 NVIDIA GeForce 8700M
+NVIDIA GeForce 8700M GT/PCI/SSE2 supported 3 NVIDIA GeForce 8700M
+NVIDIA GeForce 8800 supported 3 NVIDIA GeForce 8800
+NVIDIA GeForce 8800 GS/PCI/SSE2 supported 3 NVIDIA GeForce 8800
+NVIDIA GeForce 8800 GT/PCI/SSE2 supported 3 NVIDIA GeForce 8800
+NVIDIA GeForce 8800 GT/PCI/SSE2/3DNOW! supported 3 NVIDIA GeForce 8800
+NVIDIA GeForce 8800 GTS 512/PCI/SSE2 supported 3 NVIDIA GeForce 8800
+NVIDIA GeForce 8800 GTS 512/PCI/SSE2/3DNOW! supported 3 NVIDIA GeForce 8800
+NVIDIA GeForce 8800 GTS/PCI/SSE2 supported 3 NVIDIA GeForce 8800
+NVIDIA GeForce 8800 GTS/PCI/SSE2/3DNOW! supported 3 NVIDIA GeForce 8800
+NVIDIA GeForce 8800 GTX/PCI/SSE2 supported 3 NVIDIA GeForce 8800
+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 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
+NVIDIA GeForce 9300 GE/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 9300
+NVIDIA GeForce 9300 GS/PCI/SSE2 supported 1 NVIDIA GeForce 9300
+NVIDIA GeForce 9300 GS/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 9300
+NVIDIA GeForce 9300 SE/PCI/SSE2 supported 1 NVIDIA GeForce 9300
+NVIDIA GeForce 9300M supported 1 NVIDIA GeForce 9300M
+NVIDIA GeForce 9300M G/PCI/SSE2 supported 1 NVIDIA GeForce 9300M
+NVIDIA GeForce 9300M G/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 9300M
+NVIDIA GeForce 9300M GS/PCI/SSE2 supported 1 NVIDIA GeForce 9300M
+NVIDIA GeForce 9300M GS/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 9300M
+NVIDIA GeForce 9400 supported 1 NVIDIA GeForce 9400
+NVIDIA GeForce 9400 GT/PCI/SSE2 supported 1 NVIDIA GeForce 9400
+NVIDIA GeForce 9400 GT/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 9400
+NVIDIA GeForce 9400/PCI/SSE2 supported 1 NVIDIA GeForce 9400
+NVIDIA GeForce 9400M supported 1 NVIDIA GeForce 9400M
+NVIDIA GeForce 9400M G/PCI/SSE2 supported 1 NVIDIA GeForce 9400M
+NVIDIA GeForce 9400M/PCI/SSE2 supported 1 NVIDIA GeForce 9400M
+NVIDIA GeForce 9500 supported 2 NVIDIA GeForce 9500
+NVIDIA GeForce 9500 GS/PCI/SSE2 supported 2 NVIDIA GeForce 9500
+NVIDIA GeForce 9500 GS/PCI/SSE2/3DNOW! supported 2 NVIDIA GeForce 9500
+NVIDIA GeForce 9500 GT/PCI/SSE2 supported 2 NVIDIA GeForce 9500
+NVIDIA GeForce 9500 GT/PCI/SSE2/3DNOW! supported 2 NVIDIA GeForce 9500
+NVIDIA GeForce 9500M supported 2 NVIDIA GeForce 9500M
+NVIDIA GeForce 9500M GS/PCI/SSE2 supported 2 NVIDIA GeForce 9500M
+NVIDIA GeForce 9600 supported 2 NVIDIA GeForce 9600
+NVIDIA GeForce 9600 GS/PCI/SSE2 supported 2 NVIDIA GeForce 9600
+NVIDIA GeForce 9600 GSO 512/PCI/SSE2 supported 2 NVIDIA GeForce 9600
+NVIDIA GeForce 9600 GSO/PCI/SSE2 supported 2 NVIDIA GeForce 9600
+NVIDIA GeForce 9600 GSO/PCI/SSE2/3DNOW! supported 2 NVIDIA GeForce 9600
+NVIDIA GeForce 9600 GT/PCI/SSE2 supported 2 NVIDIA GeForce 9600
+NVIDIA GeForce 9600 GT/PCI/SSE2/3DNOW! supported 2 NVIDIA GeForce 9600
+NVIDIA GeForce 9600M supported 3 NVIDIA GeForce 9600M
+NVIDIA GeForce 9600M GS/PCI/SSE2 supported 3 NVIDIA GeForce 9600M
+NVIDIA GeForce 9600M GT/PCI/SSE2 supported 3 NVIDIA GeForce 9600M
+NVIDIA GeForce 9650M GT/PCI/SSE2 supported 2 NVIDIA GeForce 9600
+NVIDIA GeForce 9700M supported 2 NVIDIA GeForce 9700M
+NVIDIA GeForce 9700M GT/PCI/SSE2 supported 2 NVIDIA GeForce 9700M
+NVIDIA GeForce 9700M GTS/PCI/SSE2 supported 2 NVIDIA GeForce 9700M
+NVIDIA GeForce 9800 supported 3 NVIDIA GeForce 9800
+NVIDIA GeForce 9800 GT/PCI/SSE2 supported 3 NVIDIA GeForce 9800
+NVIDIA GeForce 9800 GT/PCI/SSE2/3DNOW! supported 3 NVIDIA GeForce 9800
+NVIDIA GeForce 9800 GTX+/PCI/SSE2 supported 3 NVIDIA GeForce 9800
+NVIDIA GeForce 9800 GTX+/PCI/SSE2/3DNOW! supported 3 NVIDIA GeForce 9800
+NVIDIA GeForce 9800 GTX/9800 GTX+/PCI/SSE2 supported 3 NVIDIA GeForce 9800
+NVIDIA GeForce 9800 GTX/PCI/SSE2 supported 3 NVIDIA GeForce 9800
+NVIDIA GeForce 9800 GX2/PCI/SSE2 supported 3 NVIDIA GeForce 9800
+NVIDIA GeForce 9800M supported 3 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 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
+NVIDIA GeForce FX 5500/AGP/SSE2/3DNOW! supported 0 NVIDIA GeForce FX 5500
+NVIDIA GeForce FX 5500/PCI/SSE2 supported 0 NVIDIA GeForce FX 5500
+NVIDIA GeForce FX 5500/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce FX 5500
+NVIDIA GeForce FX 5600 supported 0 NVIDIA GeForce FX 5600
+NVIDIA GeForce FX 5600/AGP/SSE2 supported 0 NVIDIA GeForce FX 5600
+NVIDIA GeForce FX 5600/AGP/SSE2/3DNOW! supported 0 NVIDIA GeForce FX 5600
+NVIDIA GeForce FX 5600XT/AGP/SSE2/3DNOW! supported 0 NVIDIA GeForce FX 5600
+NVIDIA GeForce FX 5700 supported 1 NVIDIA GeForce FX 5700
+NVIDIA GeForce FX 5700/AGP/SSE/3DNOW! supported 1 NVIDIA GeForce FX 5700
+NVIDIA GeForce FX 5700LE/AGP/SSE supported 1 NVIDIA GeForce FX 5700
+NVIDIA GeForce FX 5700LE/AGP/SSE/3DNOW! supported 1 NVIDIA GeForce FX 5700
+NVIDIA GeForce FX 5800 supported 1 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 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 Go5xxx/AGP/SSE2 supported 0 NVIDIA GeForce FX Go5xxx
+NVIDIA GeForce G 103M/PCI/SSE2 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
+NVIDIA GeForce G100/PCI/SSE2/3DNOW! supported 0 NVIDIA G100
+NVIDIA GeForce G102M/PCI/SSE2 supported 0 NVIDIA G102M
+NVIDIA GeForce G105M/PCI/SSE2 supported 0 NVIDIA G105M
+NVIDIA GeForce G200/PCI/SSE2 supported 0 NVIDIA G 200
+NVIDIA GeForce G205M/PCI/SSE2 supported 0 NVIDIA G 205M
+NVIDIA GeForce G210/PCI/SSE2 supported 1 NVIDIA G 210
+NVIDIA GeForce G210/PCI/SSE2/3DNOW! supported 1 NVIDIA G 210
+NVIDIA GeForce G210M/PCI/SSE2 supported 1 NVIDIA G 210
+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 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
+NVIDIA GeForce GT 220/PCI/SSE2/3DNOW! supported 2 NVIDIA GT 220M
+NVIDIA GeForce GT 220M/PCI/SSE2 supported 2 NVIDIA GT 220M
+NVIDIA GeForce GT 230/PCI/SSE2 supported 2 NVIDIA GT 230M
+NVIDIA GeForce GT 230M/PCI/SSE2 supported 2 NVIDIA GT 230M
+NVIDIA GeForce GT 240 supported 2 NVIDIA GT 240M
+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 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
+NVIDIA GeForce GT 330M/PCI/SSE2 supported 3 NVIDIA GT 330M
+NVIDIA GeForce GT 335M/PCI/SSE2 supported 1 NVIDIA GT 335M
+NVIDIA GeForce GT 340/PCI/SSE2 supported 2 NVIDIA GT 340M
+NVIDIA GeForce GT 340/PCI/SSE2/3DNOW! supported 2 NVIDIA GT 340M
+NVIDIA GeForce GT 415M/PCI/SSE2 supported 2 NVIDIA GT 415M
+NVIDIA GeForce GT 420/PCI/SSE2 supported 2 NVIDIA GT 420M
+NVIDIA GeForce GT 420M/PCI/SSE2 supported 2 NVIDIA GT 420M
+NVIDIA GeForce GT 425M/PCI/SSE2 supported 3 NVIDIA GT 425M
+NVIDIA GeForce GT 430/PCI/SSE2 supported 3 NVIDIA GT 430M
+NVIDIA GeForce GT 430/PCI/SSE2/3DNOW! supported 3 NVIDIA GT 430M
+NVIDIA GeForce GT 435M/PCI/SSE2 supported 3 NVIDIA GT 435M
+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 520M/PCI/SSE2 supported 3 NVIDIA GT 520M
+NVIDIA GeForce GT 525M/PCI/SSE2 supported 3 NVIDIA GT 525M
+NVIDIA GeForce GT 540M/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
+NVIDIA GeForce GTS 160M/PCI/SSE2 supported 2 NVIDIA GTS 160M
+NVIDIA GeForce GTS 240/PCI/SSE2 supported 3 NVIDIA GTS 240
+NVIDIA GeForce GTS 250/PCI/SSE2 supported 3 NVIDIA GTS 250
+NVIDIA GeForce GTS 250/PCI/SSE2/3DNOW! supported 3 NVIDIA GTS 250
+NVIDIA GeForce GTS 250M/PCI/SSE2 supported 3 NVIDIA GTS 250
+NVIDIA GeForce GTS 350M/PCI/SSE2 supported 3 NVIDIA GTS 350M
+NVIDIA GeForce GTS 360M/PCI/SSE2 supported 3 NVIDIA GTS 360M
+NVIDIA GeForce GTS 450/PCI/SSE2 supported 3 NVIDIA GTS 450
+NVIDIA GeForce GTS 450/PCI/SSE2/3DNOW! supported 3 NVIDIA GTS 450
+NVIDIA GeForce GTS 455/PCI/SSE2 supported 3 NVIDIA GTS 450
+NVIDIA GeForce GTX 260/PCI/SSE2 supported 3 NVIDIA GTX 260
+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 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/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
+NVIDIA GeForce GTX 460 SE/PCI/SSE2/3DNOW! supported 3 NVIDIA GTX 460
+NVIDIA GeForce GTX 460/PCI/SSE2 supported 3 NVIDIA GTX 460
+NVIDIA GeForce GTX 460/PCI/SSE2/3DNOW! supported 3 NVIDIA GTX 460
+NVIDIA GeForce GTX 460M/PCI/SSE2 supported 3 NVIDIA GTX 460M
+NVIDIA GeForce GTX 465/PCI/SSE2 supported 3 NVIDIA GTX 465
+NVIDIA GeForce GTX 465/PCI/SSE2/3DNOW! supported 3 NVIDIA GTX 465
+NVIDIA GeForce GTX 470/PCI/SSE2 supported 3 NVIDIA GTX 470
+NVIDIA GeForce GTX 470/PCI/SSE2/3DNOW! supported 3 NVIDIA GTX 470
+NVIDIA GeForce GTX 480/PCI/SSE2 supported 3 NVIDIA GTX 480
+NVIDIA GeForce GTX 550 Ti/PCI/SSE2 supported 3 NVIDIA GTX 550
+NVIDIA GeForce GTX 550 Ti/PCI/SSE2/3DNOW! supported 3 NVIDIA GTX 550
+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 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
+NVIDIA GeForce GTX 580/PCI/SSE2/3DNOW! supported 3 NVIDIA GTX 580
+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 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 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
+NVIDIA GeForce Go 6600/PCI/SSE2 supported 1 NVIDIA GeForce Go 6600
+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 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
+NVIDIA GeForce Go 7400 supported 1 NVIDIA GeForce Go 7400
+NVIDIA GeForce Go 7400/PCI/SSE2 supported 1 NVIDIA GeForce Go 7400
+NVIDIA GeForce Go 7400/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce Go 7400
+NVIDIA GeForce Go 7600 supported 2 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 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
+NVIDIA GeForce Go 7900 GS/PCI/SSE2 supported 2 NVIDIA GeForce Go 7900
+NVIDIA GeForce Go 7900 GTX/PCI/SSE2 supported 2 NVIDIA GeForce Go 7900
+NVIDIA GeForce Go 7950 GTX/PCI/SSE2 supported 2 NVIDIA GeForce Go 7900
+NVIDIA GeForce PCX supported 0 NVIDIA GeForce PCX
+NVIDIA GeForce2 GTS/AGP/SSE supported 0 NVIDIA GeForce 2
+NVIDIA GeForce2 MX/AGP/3DNOW! supported 0 NVIDIA GeForce 2
+NVIDIA GeForce2 MX/AGP/SSE/3DNOW! supported 0 NVIDIA GeForce 2
+NVIDIA GeForce2 MX/AGP/SSE2 supported 0 NVIDIA GeForce 2
+NVIDIA GeForce2 MX/PCI/SSE2 supported 0 NVIDIA GeForce 2
+NVIDIA GeForce3/AGP/SSE/3DNOW! supported 0 NVIDIA GeForce 3
+NVIDIA GeForce3/AGP/SSE2 supported 0 NVIDIA GeForce 3
+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 440 Go 64M/AGP/SSE2/3DNOW! 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
+NVIDIA GeForce4 MX 4000/PCI/3DNOW! supported 0 NVIDIA GeForce 4
+NVIDIA GeForce4 MX 4000/PCI/SSE/3DNOW! supported 0 NVIDIA GeForce 4
+NVIDIA GeForce4 MX 4000/PCI/SSE2 supported 0 NVIDIA GeForce 4
+NVIDIA GeForce4 MX 420/AGP/SSE/3DNOW! supported 0 NVIDIA GeForce 4
+NVIDIA GeForce4 MX 420/AGP/SSE2 supported 0 NVIDIA GeForce 4
+NVIDIA GeForce4 MX 440 with AGP8X/AGP/SSE2 supported 0 NVIDIA GeForce 4
+NVIDIA GeForce4 MX 440/AGP/SSE2 supported 0 NVIDIA GeForce 4
+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 4400/AGP/SSE2 supported 0 NVIDIA GeForce 4
+NVIDIA Generic UNRECOGNIZED
+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 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 NV43 supported 1 NVIDIA NV43
+NVIDIA NV44 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
+NVIDIA NVIDIA GeForce 7600 GT OpenGL Engine supported 2 NVIDIA GeForce 7600
+NVIDIA NVIDIA GeForce 8600M GT OpenGL Engine supported 1 NVIDIA GeForce 8600M
+NVIDIA NVIDIA GeForce 8800 GS OpenGL Engine supported 3 NVIDIA GeForce 8800
+NVIDIA NVIDIA GeForce 8800 GT OpenGL Engine supported 3 NVIDIA GeForce 8800
+NVIDIA NVIDIA GeForce 9400 OpenGL Engine supported 1 NVIDIA GeForce 9400
+NVIDIA NVIDIA GeForce 9400M OpenGL Engine supported 1 NVIDIA GeForce 9400M
+NVIDIA NVIDIA GeForce 9500 GT OpenGL Engine supported 2 NVIDIA GeForce 9500
+NVIDIA NVIDIA GeForce 9600M GT OpenGL Engine supported 3 NVIDIA GeForce 9600M
+NVIDIA NVIDIA GeForce GT 120 OpenGL Engine supported 2 NVIDIA GT 120M
+NVIDIA NVIDIA GeForce GT 130 OpenGL Engine supported 2 NVIDIA GT 130M
+NVIDIA NVIDIA GeForce GT 220 OpenGL Engine supported 2 NVIDIA GT 220M
+NVIDIA NVIDIA GeForce GT 230M OpenGL Engine supported 2 NVIDIA GT 230M
+NVIDIA NVIDIA GeForce GT 240M OpenGL Engine supported 2 NVIDIA GT 240M
+NVIDIA NVIDIA GeForce GT 330M OpenGL Engine supported 3 NVIDIA GT 330M
+NVIDIA NVIDIA GeForce GT 420M OpenGL Engine supported 2 NVIDIA GT 420M
+NVIDIA NVIDIA GeForce GT 425M OpenGL Engine supported 3 NVIDIA GT 425M
+NVIDIA NVIDIA GeForce GT 430 OpenGL Engine supported 3 NVIDIA GT 430M
+NVIDIA NVIDIA GeForce GT 440 OpenGL Engine supported 3 NVIDIA GT 440M
+NVIDIA NVIDIA GeForce GT 540M OpenGL Engine supported 3 NVIDIA GT 540M
+NVIDIA NVIDIA GeForce GTS 240 OpenGL Engine supported 3 NVIDIA GTS 240
+NVIDIA NVIDIA GeForce GTS 250 OpenGL Engine supported 3 NVIDIA GTS 250
+NVIDIA NVIDIA GeForce GTS 450 OpenGL Engine supported 3 NVIDIA GTS 450
+NVIDIA NVIDIA GeForce GTX 285 OpenGL Engine supported 3 NVIDIA GTX 285
+NVIDIA NVIDIA GeForce GTX 460 OpenGL Engine supported 3 NVIDIA GTX 460
+NVIDIA NVIDIA GeForce GTX 460M OpenGL Engine supported 3 NVIDIA GTX 460M
+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 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 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 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 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
+NVIDIA Quadro 600/PCI/SSE2 supported 2 NVIDIA Quadro 600
+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 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 1400/PCI/SSE2 supported 2 NVIDIA Quadro 400
+NVIDIA Quadro FX 1500 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
+NVIDIA Quadro FX 1700M/PCI/SSE2 supported 1 NVIDIA Quadro FX
+NVIDIA Quadro FX 1800 supported 1 NVIDIA Quadro FX
+NVIDIA Quadro FX 1800/PCI/SSE2 supported 1 NVIDIA Quadro FX
+NVIDIA Quadro FX 1800M/PCI/SSE2 supported 1 NVIDIA Quadro FX
+NVIDIA Quadro FX 2500M/PCI/SSE2 supported 2 NVIDIA Quadro FX 2500M
+NVIDIA Quadro FX 2700M/PCI/SSE2 supported 3 NVIDIA Quadro FX 2700M
+NVIDIA Quadro FX 2800M/PCI/SSE2 supported 3 NVIDIA Quadro FX 2800M
+NVIDIA Quadro FX 3400 supported 2 NVIDIA Quadro 400
+NVIDIA Quadro FX 3450 supported 1 NVIDIA Quadro FX
+NVIDIA Quadro FX 3450/4000 SDI/PCI/SSE2 supported 2 NVIDIA Quadro 400
+NVIDIA Quadro FX 3500 supported 2 NVIDIA Quadro FX 3500
+NVIDIA Quadro FX 3500M/PCI/SSE2 supported 2 NVIDIA Quadro FX 3500
+NVIDIA Quadro FX 360M/PCI/SSE2 supported 1 NVIDIA Quadro FX
+NVIDIA Quadro FX 370 supported 1 NVIDIA Quadro FX
+NVIDIA Quadro FX 370/PCI/SSE2 supported 1 NVIDIA Quadro FX
+NVIDIA Quadro FX 3700 supported 3 NVIDIA Quadro FX 3700
+NVIDIA Quadro FX 3700M/PCI/SSE2 supported 3 NVIDIA Quadro FX 3700
+NVIDIA Quadro FX 370M/PCI/SSE2 supported 1 NVIDIA Quadro FX
+NVIDIA Quadro FX 3800 supported 3 NVIDIA Quadro FX 3800
+NVIDIA Quadro FX 3800M/PCI/SSE2 supported 3 NVIDIA Quadro FX 3800
+NVIDIA Quadro FX 4500 supported 3 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 560 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
+NVIDIA Quadro FX 570M/PCI/SSE2 supported 1 NVIDIA Quadro FX
+NVIDIA Quadro FX 580/PCI/SSE2 supported 1 NVIDIA Quadro FX
+NVIDIA Quadro FX 770M/PCI/SSE2 supported 2 NVIDIA Quadro FX 770M
+NVIDIA Quadro FX 880M supported 3 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 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 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 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 Quadro2 supported 0 NVIDIA Quadro2
+NVIDIA Quadro4 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 nForce unsupported 0 NVIDIA nForce
+NVIDIA unknown board/AGP/SSE2 UNRECOGNIZED
+NVIDIA unknown board/PCI/SSE2 UNRECOGNIZED
+NVIDIA unknown board/PCI/SSE2/3DNOW! UNRECOGNIZED
+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 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 Graphics VIA/S3G UniChrome IGP/MMX/K3D 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 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
+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
+Tungsten Graphics, Inc Mesa DRI 865G GEM 20100330 DEVELOPMENT x86/MMX/SSE2 unsupported 0 Mesa
+Tungsten Graphics, Inc Mesa DRI 915G GEM 20091221 2009Q4 x86/MMX/SSE2 unsupported 0 Mesa
+Tungsten Graphics, Inc Mesa DRI 915G GEM 20100330 DEVELOPMENT x86/MMX/SSE2 unsupported 0 Mesa
+Tungsten Graphics, Inc Mesa DRI 915GM GEM 20090712 2009Q2 RC3 x86/MMX/SSE2 unsupported 0 Mesa
+Tungsten Graphics, Inc Mesa DRI 915GM GEM 20091221 2009Q4 x86/MMX/SSE2 unsupported 0 Mesa
+Tungsten Graphics, Inc Mesa DRI 915GM GEM 20100330 DEVELOPMENT x86/MMX/SSE2 unsupported 0 Mesa
+Tungsten Graphics, Inc Mesa DRI 945G unsupported 0 Mesa
+Tungsten Graphics, Inc Mesa DRI 945G GEM 20091221 2009Q4 x86/MMX/SSE2 unsupported 0 Mesa
+Tungsten Graphics, Inc Mesa DRI 945G GEM 20100330 DEVELOPMENT unsupported 0 Mesa
+Tungsten Graphics, Inc Mesa DRI 945G GEM 20100330 DEVELOPMENT x86/MMX/SSE2 unsupported 0 Mesa
+Tungsten Graphics, Inc Mesa DRI 945GM GEM 20090712 2009Q2 RC3 x86/MMX/SSE2 unsupported 0 Mesa
+Tungsten Graphics, Inc Mesa DRI 945GM GEM 20091221 2009Q4 x86/MMX/SSE2 unsupported 0 Mesa
+Tungsten Graphics, Inc Mesa DRI 945GM GEM 20100328 2010Q1 x86/MMX/SSE2 unsupported 0 Mesa
+Tungsten Graphics, Inc Mesa DRI 945GM GEM 20100330 DEVELOPMENT x86/MMX/SSE2 unsupported 0 Mesa
+Tungsten Graphics, Inc Mesa DRI 945GME x86/MMX/SSE2 unsupported 0 Mesa
+Tungsten Graphics, Inc Mesa DRI 945GME 20061017 unsupported 0 Mesa
+Tungsten Graphics, Inc Mesa DRI 945GME GEM 20090712 2009Q2 RC3 x86/MMX/SSE2 unsupported 0 Mesa
+Tungsten Graphics, Inc Mesa DRI 945GME GEM 20091221 2009Q4 x86/MMX/SSE2 unsupported 0 Mesa
+Tungsten Graphics, Inc Mesa DRI 945GME GEM 20100330 DEVELOPMENT x86/MMX/SSE2 unsupported 0 Mesa
+Tungsten Graphics, Inc Mesa DRI 965GM GEM 20090326 2009Q1 RC2 x86/MMX/SSE2 unsupported 0 Mesa
+Tungsten Graphics, Inc Mesa DRI 965GM GEM 20090712 2009Q2 RC3 x86/MMX/SSE2 unsupported 0 Mesa
+Tungsten Graphics, Inc Mesa DRI 965GM GEM 20091221 2009Q4 x86/MMX/SSE2 unsupported 0 Mesa
+Tungsten Graphics, Inc Mesa DRI 965GM GEM 20100330 DEVELOPMENT x86/MMX/SSE2 unsupported 0 Mesa
+Tungsten Graphics, Inc Mesa DRI G33 20061017 x86/MMX/SSE2 unsupported 0 Mesa
+Tungsten Graphics, Inc Mesa DRI G33 GEM 20090712 2009Q2 RC3 x86/MMX/SSE2 unsupported 0 Mesa
+Tungsten Graphics, Inc Mesa DRI G33 GEM 20091221 2009Q4 x86/MMX/SSE2 unsupported 0 Mesa
+Tungsten Graphics, Inc Mesa DRI G41 GEM 20091221 2009Q4 x86/MMX/SSE2 unsupported 0 Mesa
+Tungsten Graphics, Inc Mesa DRI G41 GEM 20100330 DEVELOPMENT x86/MMX/SSE2 unsupported 0 Mesa
+Tungsten Graphics, Inc Mesa DRI GMA500 20081116 - 5.0.1.0046 x86/MMX/SSE2 unsupported 0 Mesa
+Tungsten Graphics, Inc Mesa DRI IGD GEM 20091221 2009Q4 x86/MMX/SSE2 unsupported 0 Mesa
+Tungsten Graphics, Inc Mesa DRI IGD GEM 20100330 DEVELOPMENT unsupported 0 Mesa
+Tungsten Graphics, Inc Mesa DRI IGD GEM 20100330 DEVELOPMENT x86/MMX/SSE2 unsupported 0 Mesa
+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 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 (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
+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 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)
+X.Org Gallium 0.4 on AMD RV610 supported 1 AMD RV610 (HD 2400)
+X.Org Gallium 0.4 on AMD RV620 supported 1 AMD RV620 (HD 3400)
+X.Org Gallium 0.4 on AMD RV630 supported 2 AMD RV630 (HD 2600)
+X.Org Gallium 0.4 on AMD RV635 supported 3 AMD RV635 (HD 3600)
+X.Org Gallium 0.4 on AMD RV710 supported 1 AMD RV710 (HD 4300)
+X.Org Gallium 0.4 on AMD RV730 supported 3 AMD RV730 (HD 4600)
+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 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 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 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 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)
+X.Org R300 Project Gallium 0.4 on RC410 unsupported 0 ATI RC410 (Xpress 200)
+X.Org R300 Project Gallium 0.4 on RS480 unsupported 0 ATI RS48x (Xpress 200x)
+X.Org R300 Project Gallium 0.4 on RS482 unsupported 0 ATI RS48x (Xpress 200x)
+X.Org R300 Project Gallium 0.4 on RS600 unsupported 0 ATI RS600 (Xpress 3200)
+X.Org R300 Project Gallium 0.4 on RS690 supported 1 ATI R300 (9700)
+X.Org R300 Project Gallium 0.4 on RS740 supported 1 ATI R300 (9700)
+X.Org R300 Project Gallium 0.4 on RV350 supported 0 ATI RV350 (9600)
+X.Org R300 Project Gallium 0.4 on RV370 supported 0 ATI RV370 (X300)
+X.Org R300 Project Gallium 0.4 on RV410 supported 1 ATI RV410 (X700)
+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
diff --git a/indra/newview/tests/gpus_seen.txt b/indra/newview/tests/gpus_seen.txt
new file mode 100644
index 0000000000..c807f22b58
--- /dev/null
+++ b/indra/newview/tests/gpus_seen.txt
@@ -0,0 +1,1593 @@
+ATI
+ATI 3D-Analyze
+ATI ASUS A9xxx
+ATI ASUS AH24xx
+ATI ASUS AH26xx
+ATI ASUS AH34xx
+ATI ASUS AH36xx
+ATI ASUS AH46xx
+ATI ASUS AX3xx
+ATI ASUS AX5xx
+ATI ASUS AX8xx
+ATI ASUS EAH38xx
+ATI ASUS EAH43xx
+ATI ASUS EAH45xx
+ATI ASUS EAH48xx
+ATI ASUS EAH57xx
+ATI ASUS EAH58xx
+ATI ASUS X1xxx
+ATI All-in-Wonder 9xxx
+ATI All-in-Wonder HD
+ATI All-in-Wonder PCI-E
+ATI All-in-Wonder X1800
+ATI All-in-Wonder X1900
+ATI All-in-Wonder X600
+ATI All-in-Wonder X800
+ATI Diamond X1xxx
+ATI Display Adapter
+ATI FireGL
+ATI FireGL 5200
+ATI FireGL 5xxx
+ATI FireMV
+ATI Generic
+ATI Hercules 9800
+ATI IGP 340M
+ATI M52
+ATI M54
+ATI M56
+ATI M71
+ATI M72
+ATI M76
+ATI Mobility Radeon
+ATI Mobility Radeon 7xxx
+ATI Mobility Radeon 9600
+ATI Mobility Radeon 9700
+ATI Mobility Radeon 9800
+ATI Mobility Radeon HD 2300
+ATI Mobility Radeon HD 2400
+ATI Mobility Radeon HD 2600
+ATI Mobility Radeon HD 2700
+ATI Mobility Radeon HD 3400
+ATI Mobility Radeon HD 3600
+ATI Mobility Radeon HD 3800
+ATI Mobility Radeon HD 4200
+ATI Mobility Radeon HD 4300
+ATI Mobility Radeon HD 4500
+ATI Mobility Radeon HD 4600
+ATI Mobility Radeon HD 4800
+ATI Mobility Radeon HD 5400
+ATI Mobility Radeon HD 5600
+ATI Mobility Radeon X1xxx
+ATI Mobility Radeon X2xxx
+ATI Mobility Radeon X3xx
+ATI Mobility Radeon X6xx
+ATI Mobility Radeon X7xx
+ATI Mobility Radeon Xxxx
+ATI RV380
+ATI RV530
+ATI Radeon 2100
+ATI Radeon 3000
+ATI Radeon 3100
+ATI Radeon 7000
+ATI Radeon 7xxx
+ATI Radeon 8xxx
+ATI Radeon 9000
+ATI Radeon 9100
+ATI Radeon 9200
+ATI Radeon 9500
+ATI Radeon 9600
+ATI Radeon 9700
+ATI Radeon 9800
+ATI Radeon HD 2300
+ATI Radeon HD 2400
+ATI Radeon HD 2600
+ATI Radeon HD 2900
+ATI Radeon HD 3000
+ATI Radeon HD 3100
+ATI Radeon HD 3200
+ATI Radeon HD 3300
+ATI Radeon HD 3400
+ATI Radeon HD 3600
+ATI Radeon HD 3800
+ATI Radeon HD 4200
+ATI Radeon HD 4300
+ATI Radeon HD 4500
+ATI Radeon HD 4600
+ATI Radeon HD 4700
+ATI Radeon HD 4800
+ATI Radeon HD 5400
+ATI Radeon HD 5500
+ATI Radeon HD 5600
+ATI Radeon HD 5700
+ATI Radeon HD 5800
+ATI Radeon HD 5900
+ATI Radeon HD 6200
+ATI Radeon HD 6300
+ATI Radeon HD 6500
+ATI Radeon HD 6800
+ATI Radeon HD 6900
+ATI Radeon OpenGL
+ATI Radeon RV250
+ATI Radeon RV600
+ATI Radeon RX9550
+ATI Radeon VE
+ATI Radeon X1000
+ATI Radeon X1200
+ATI Radeon X1300
+ATI Radeon X13xx
+ATI Radeon X1400
+ATI Radeon X1500
+ATI Radeon X1600
+ATI Radeon X16xx
+ATI Radeon X1700
+ATI Radeon X1800
+ATI Radeon X1900
+ATI Radeon X19xx
+ATI Radeon X1xxx
+ATI Radeon X300
+ATI Radeon X500
+ATI Radeon X600
+ATI Radeon X700
+ATI Radeon X7xx
+ATI Radeon X800
+ATI Radeon Xpress
+ATI Rage 128
+ATI Technologies Inc.
+ATI Technologies Inc. x86
+ATI Technologies Inc. x86/SSE2
+ATI Technologies Inc. (Vista) ATI Mobility Radeon HD 5730
+ATI Technologies Inc. 256MB ATI Radeon X1300PRO x86/SSE2
+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 M880G with ATI Mobility Radeon HD 4200
+ATI Technologies Inc. AMD M880G with ATI Mobility Radeon HD 4250
+ATI Technologies Inc. AMD RADEON HD 6450
+ATI Technologies Inc. AMD Radeon HD 6200 series Graphics
+ATI Technologies Inc. AMD Radeon HD 6250 Graphics
+ATI Technologies Inc. AMD Radeon HD 6300 series Graphics
+ATI Technologies Inc. AMD Radeon HD 6300M Series
+ATI Technologies Inc. AMD Radeon HD 6310 Graphics
+ATI Technologies Inc. AMD Radeon HD 6310M
+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 6400M Series
+ATI Technologies Inc. AMD Radeon HD 6450
+ATI Technologies Inc. AMD Radeon HD 6470M
+ATI Technologies Inc. AMD Radeon HD 6490M
+ATI Technologies Inc. AMD Radeon HD 6500M/5600/5700 Series
+ATI Technologies Inc. AMD Radeon HD 6530M
+ATI Technologies Inc. AMD Radeon HD 6550M
+ATI Technologies Inc. AMD Radeon HD 6570
+ATI Technologies Inc. AMD Radeon HD 6570M
+ATI Technologies Inc. AMD Radeon HD 6570M/5700 Series
+ATI Technologies Inc. AMD Radeon HD 6600M Series
+ATI Technologies Inc. AMD Radeon HD 6650M
+ATI Technologies Inc. AMD Radeon HD 6670
+ATI Technologies Inc. AMD Radeon HD 6700 Series
+ATI Technologies Inc. AMD Radeon HD 6750
+ATI Technologies Inc. AMD Radeon HD 6750M
+ATI Technologies Inc. AMD Radeon HD 6770
+ATI Technologies Inc. AMD Radeon HD 6800 Series
+ATI Technologies Inc. AMD Radeon HD 6850M
+ATI Technologies Inc. AMD Radeon HD 6870
+ATI Technologies Inc. AMD Radeon HD 6870M
+ATI Technologies Inc. AMD Radeon HD 6900 Series
+ATI Technologies Inc. AMD Radeon HD 6970M
+ATI Technologies Inc. AMD Radeon HD 6990
+ATI Technologies Inc. AMD Radeon(TM) HD 6470M
+ATI Technologies Inc. ASUS 5870 Eyefinity 6
+ATI Technologies Inc. ASUS AH2600 Series
+ATI Technologies Inc. ASUS AH3450 Series
+ATI Technologies Inc. ASUS AH3650 Series
+ATI Technologies Inc. ASUS AH4650 Series
+ATI Technologies Inc. ASUS ARES
+ATI Technologies Inc. ASUS EAH2900 Series
+ATI Technologies Inc. ASUS EAH3450 Series
+ATI Technologies Inc. ASUS EAH3650 Series
+ATI Technologies Inc. ASUS EAH4350 series
+ATI Technologies Inc. ASUS EAH4550 series
+ATI Technologies Inc. ASUS EAH4650 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 EAH4850 series
+ATI Technologies Inc. ASUS EAH5450 Series
+ATI Technologies Inc. ASUS EAH5550 Series
+ATI Technologies Inc. ASUS EAH5570 series
+ATI Technologies Inc. ASUS EAH5670 Series
+ATI Technologies Inc. ASUS EAH5750 Series
+ATI Technologies Inc. ASUS EAH5770 Series
+ATI Technologies Inc. ASUS EAH5830 Series
+ATI Technologies Inc. ASUS EAH5850 Series
+ATI Technologies Inc. ASUS EAH5870 Series
+ATI Technologies Inc. ASUS EAH5970 Series
+ATI Technologies Inc. ASUS EAH6850 Series
+ATI Technologies Inc. ASUS EAH6870 Series
+ATI Technologies Inc. ASUS EAH6950 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 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 X850 Series
+ATI Technologies Inc. ATI All-in-Wonder HD
+ATI Technologies Inc. ATI FirePro 2260
+ATI Technologies Inc. ATI FirePro 2450
+ATI Technologies Inc. ATI FirePro M5800
+ATI Technologies Inc. ATI FirePro M7740
+ATI Technologies Inc. ATI FirePro M7820
+ATI Technologies Inc. ATI FirePro V3700 (FireGL)
+ATI Technologies Inc. ATI FirePro V3800
+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 9XXX x86/SSE2
+ATI Technologies Inc. ATI MOBILITY RADEON HD 3450
+ATI Technologies Inc. ATI MOBILITY RADEON X1600
+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/SSE2
+ATI Technologies Inc. ATI MOBILITY RADEON X300
+ATI Technologies Inc. ATI MOBILITY RADEON X600
+ATI Technologies Inc. ATI MOBILITY RADEON XPRESS 200
+ATI Technologies Inc. ATI Mobility FireGL V5700
+ATI Technologies Inc. ATI Mobility Radeon 4100
+ATI Technologies Inc. ATI Mobility Radeon Graphics
+ATI Technologies Inc. ATI Mobility Radeon HD 2300
+ATI Technologies Inc. ATI Mobility Radeon HD 2400
+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 XT
+ATI Technologies Inc. ATI Mobility Radeon HD 2700
+ATI Technologies Inc. ATI Mobility Radeon HD 3400 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 3430
+ATI Technologies Inc. ATI Mobility Radeon HD 3450
+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 4200
+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 4250
+ATI Technologies Inc. ATI Mobility Radeon HD 4250 Graphics
+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/4500 Series
+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 4500 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 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 4550
+ATI Technologies Inc. ATI Mobility Radeon HD 4570
+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 Series
+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 5000
+ATI Technologies Inc. ATI Mobility Radeon HD 5000 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 5145
+ATI Technologies Inc. ATI Mobility Radeon HD 5165
+ATI Technologies Inc. ATI Mobility Radeon HD 530v
+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 5450
+ATI Technologies Inc. ATI Mobility Radeon HD 5450 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 545v
+ATI Technologies Inc. ATI Mobility Radeon HD 5470
+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 560v
+ATI Technologies Inc. ATI Mobility Radeon HD 5650
+ATI Technologies Inc. ATI Mobility Radeon HD 5700 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 5730
+ATI Technologies Inc. ATI Mobility Radeon HD 5800 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 5850
+ATI Technologies Inc. ATI Mobility Radeon HD 5870
+ATI Technologies Inc. ATI Mobility Radeon HD 6300 series
+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 6570
+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 X1350
+ATI Technologies Inc. ATI Mobility Radeon X1350 x86/SSE2
+ATI Technologies Inc. ATI Mobility Radeon X1400
+ATI Technologies Inc. ATI Mobility Radeon X1400 x86/SSE2
+ATI Technologies Inc. ATI Mobility Radeon X1600
+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 (Omega 3.8.442)
+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/SSE2
+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 5470
+ATI Technologies Inc. ATI RADEON HD 3200 T25XX by CAMILO
+ATI Technologies Inc. ATI RADEON XPRESS 1100
+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 (Microsoft - WDDM)
+ATI Technologies Inc. ATI Radeon 2100 Graphics
+ATI Technologies Inc. ATI Radeon 3000
+ATI Technologies Inc. ATI Radeon 3000 Graphics
+ATI Technologies Inc. ATI Radeon 3100 Graphics
+ATI Technologies Inc. ATI Radeon 5xxx series
+ATI Technologies Inc. ATI Radeon 9550 / X1050 Series
+ATI Technologies Inc. ATI Radeon 9550 / X1050 Series x86/MMX/3DNow!/SSE
+ATI Technologies Inc. ATI Radeon 9550 / X1050 Series x86/SSE2
+ATI Technologies Inc. ATI Radeon 9550 / X1050 Series(Microsoft - WDDM)
+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 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 HD 2200 Graphics
+ATI Technologies Inc. ATI Radeon HD 2350
+ATI Technologies Inc. ATI Radeon HD 2400
+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 Series
+ATI Technologies Inc. ATI Radeon HD 2400 XT
+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
+ATI Technologies Inc. ATI Radeon HD 2600 Series
+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 3300 Graphics
+ATI Technologies Inc. ATI Radeon HD 3400 Series
+ATI Technologies Inc. ATI Radeon HD 3450
+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 3600 Series
+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 3850
+ATI Technologies Inc. ATI Radeon HD 3850 AGP
+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 4250
+ATI Technologies Inc. ATI Radeon HD 4250 Graphics
+ATI Technologies Inc. ATI Radeon HD 4270
+ATI Technologies Inc. ATI Radeon HD 4290
+ATI Technologies Inc. ATI Radeon HD 4300 Series
+ATI Technologies Inc. ATI Radeon HD 4300/4500 Series
+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 4500 Series
+ATI Technologies Inc. ATI Radeon HD 4550
+ATI Technologies Inc. ATI Radeon HD 4600 Series
+ATI Technologies Inc. ATI Radeon HD 4650
+ATI Technologies Inc. ATI Radeon HD 4670
+ATI Technologies Inc. ATI Radeon HD 4670 OpenGL Engine
+ATI Technologies Inc. ATI Radeon HD 4700 Series
+ATI Technologies Inc. ATI Radeon HD 4720
+ATI Technologies Inc. ATI Radeon HD 4730
+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 4800 Series
+ATI Technologies Inc. ATI Radeon HD 4850
+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 OpenGL Engine
+ATI Technologies Inc. ATI Radeon HD 4870 X2
+ATI Technologies Inc. ATI Radeon HD 5400 Series
+ATI Technologies Inc. ATI Radeon HD 5450
+ATI Technologies Inc. ATI Radeon HD 5500 Series
+ATI Technologies Inc. ATI Radeon HD 5570
+ATI Technologies Inc. ATI Radeon HD 5600 Series
+ATI Technologies Inc. ATI Radeon HD 5630
+ATI Technologies Inc. ATI Radeon HD 5670
+ATI Technologies Inc. ATI Radeon HD 5670 OpenGL Engine
+ATI Technologies Inc. ATI Radeon HD 5700 Series
+ATI Technologies Inc. ATI Radeon HD 5750
+ATI Technologies Inc. ATI Radeon HD 5750 OpenGL Engine
+ATI Technologies Inc. ATI Radeon HD 5770
+ATI Technologies Inc. ATI Radeon HD 5770 OpenGL Engine
+ATI Technologies Inc. ATI Radeon HD 5800 Series
+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 5900 Series
+ATI Technologies Inc. ATI Radeon HD 5970
+ATI Technologies Inc. ATI Radeon HD 6230
+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 6510
+ATI Technologies Inc. ATI Radeon HD 6570M
+ATI Technologies Inc. ATI Radeon HD 6750
+ATI Technologies Inc. ATI Radeon HD 6750M OpenGL Engine
+ATI Technologies Inc. ATI Radeon HD 6770
+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 HD3750
+ATI Technologies Inc. ATI Radeon HD4300/HD4500 series
+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 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 Series
+ATI Technologies Inc. ATI Radeon X1200 Series x86/MMX/3DNow!/SSE2
+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 x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. ATI Radeon X1300/X1550 Series
+ATI Technologies Inc. ATI Radeon X1550 Series
+ATI Technologies Inc. ATI Radeon X1600 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 Xpress 1100
+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 Series
+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 x86/SSE2
+ATI Technologies Inc. ATI Radeon Xpress Series
+ATI Technologies Inc. ATI Yamaha HD 9000
+ATI Technologies Inc. ATi RS880M
+ATI Technologies Inc. Carte graphique VGA standard
+ATI Technologies Inc. Diamond Radeon X1550 Series
+ATI Technologies Inc. EG JUNIPER
+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. GeCube Radeon X1550
+ATI Technologies Inc. Geforce 9500 GT
+ATI Technologies Inc. Geforce 9500GT
+ATI Technologies Inc. Geforce 9800 GT
+ATI Technologies Inc. HD3730
+ATI Technologies Inc. HIGHTECH EXCALIBUR RADEON 9550SE Series
+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 9000 DDR x86/SSE2
+ATI Technologies Inc. MOBILITY RADEON 9000 IGPRADEON 9100 IGP DDR 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 X600 x86/SSE2
+ATI Technologies Inc. MOBILITY RADEON X700 SE x86
+ATI Technologies Inc. MOBILITY RADEON X700 x86/SSE2
+ATI Technologies Inc. MSI RX9550SE
+ATI Technologies Inc. Mobility Radeon X2300 HD
+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/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!/SSE2
+ATI Technologies Inc. RADEON 9200 Series DDR x86/SSE
+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!/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 TX x86/SSE2
+ATI Technologies Inc. RADEON 9600 x86/MMX/3DNow!/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 X300 Series x86/SSE2
+ATI Technologies Inc. RADEON X300 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 X700 PRO x86/SSE2
+ATI Technologies Inc. RADEON X800 SE x86/MMX/3DNow!/SSE2
+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/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/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/SSE2
+ATI Technologies Inc. RS740
+ATI Technologies Inc. RS780C
+ATI Technologies Inc. RS780M
+ATI Technologies Inc. RS880
+ATI Technologies Inc. RV410 Pro x86/SSE2
+ATI Technologies Inc. RV790
+ATI Technologies Inc. Radeon (TM) HD 6470M
+ATI Technologies Inc. Radeon (TM) HD 6490M
+ATI Technologies Inc. Radeon (TM) HD 6770M
+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 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 6800 Series
+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 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 x86/SSE2
+ATI Technologies Inc. Radeon X1600/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 X1900 Series x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. Radeon X1950 Pro
+ATI Technologies Inc. Radeon X1950 Pro x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. Radeon X1950 Series
+ATI Technologies Inc. Radeon X1950 Series (Microsoft - WDDM)
+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 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 HD 3730
+ATI Technologies Inc. Sapphire Radeon HD 3750
+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 X1550 Series
+ATI Technologies Inc. WRESTLER 9802
+ATI Technologies Inc. WRESTLER 9803
+ATI Technologies Inc. XFX Radeon HD 4570
+ATI Technologies Inc. Yamaha ATI HD 9000da/s
+ATI Technologies Inc. Yamaha ATI HD 9000da/s 2048
+Advanced Micro Devices, Inc. Mesa DRI R600 (RS780 9612) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2
+Advanced Micro Devices, Inc. Mesa DRI R600 (RS880 9710) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2
+Advanced Micro Devices, Inc. Mesa DRI R600 (RS880 9712) 20090101 TCL
+Advanced Micro Devices, Inc. Mesa DRI R600 (RV610 94C1) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2
+Advanced Micro Devices, Inc. Mesa DRI R600 (RV610 94C9) 20090101 x86/MMX/SSE2 TCL DRI2
+Advanced Micro Devices, Inc. Mesa DRI R600 (RV620 95C4) 20090101 x86/MMX/SSE2 TCL DRI2
+Advanced Micro Devices, Inc. Mesa DRI R600 (RV620 95C5) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2
+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 (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
+Advanced Micro Devices, Inc. Mesa DRI R600 (RV730 9498) 20090101 TCL DRI2
+Advanced Micro Devices, Inc. Mesa DRI R600 (RV770 9440) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2
+Advanced Micro Devices, Inc. Mesa DRI R600 (RV770 9442) 20090101 x86/MMX/SSE2 TCL DRI2
+Alex Mohr GL Hijacker!
+Apple Software Renderer
+DRI R300 Project Mesa DRI R300 (RS400 5954) 20090101 x86/MMX+/3DNow!+/SSE2 NO-TCL DRI2
+DRI R300 Project Mesa DRI R300 (RS400 5975) 20090101 x86/MMX+/3DNow!+/SSE2 NO-TCL DRI2
+DRI R300 Project Mesa DRI R300 (RS400 5A62) 20090101 x86/MMX/SSE2 NO-TCL DRI2
+DRI R300 Project Mesa DRI R300 (RS600 7941) 20090101 x86/MMX/SSE2 NO-TCL
+DRI R300 Project Mesa DRI R300 (RS690 791F) 20090101 x86/MMX+/3DNow!+/SSE2 NO-TCL DRI2
+DRI R300 Project Mesa DRI R300 (RV350 4151) 20090101 AGP 4x x86/MMX+/3DNow!+/SSE TCL
+DRI R300 Project Mesa DRI R300 (RV350 4153) 20090101 AGP 8x x86/MMX+/3DNow!+/SSE TCL
+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 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
+DRI R300 Project Mesa DRI R300 (RV515 7146) 20090101 x86/MMX/SSE2 TCL DRI2
+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
+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 Chromium
+Intel
+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 4 Series Internal Chipset
+Intel 830M
+Intel 845G
+Intel 855GM
+Intel 865G
+Intel 915G
+Intel 915GM
+Intel 945G
+Intel 945GM
+Intel 950
+Intel 965
+Intel B43 Express Chipset
+Intel Bear Lake
+Intel Broadwater
+Intel Brookdale
+Intel Cantiga
+Intel Eaglelake
+Intel Familia Mobile 45 Express Chipset (Microsoft Corporation - WDDM 1.1)
+Intel G33
+Intel G41
+Intel G41 Express Chipset
+Intel G45
+Intel G45/G43 Express Chipset
+Intel Graphics Media Accelerator HD
+Intel HD Graphics
+Intel HD Graphics 100
+Intel HD Graphics 200
+Intel HD Graphics 200 BR-1101-00SH
+Intel HD Graphics 200 BR-1101-00SJ
+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-1006-0364
+Intel HD Graphics BR-1006-0365
+Intel HD Graphics BR-1006-0366
+Intel HD Graphics BR-1007-02G4
+Intel HD Graphics BR-1101-04SY
+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 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 950 OpenGL Engine
+Intel Inc. Intel GMA X3100 OpenGL Engine
+Intel Inc. Intel HD Graphics 3000 OpenGL Engine
+Intel Inc. Intel HD Graphics OpenGL Engine
+Intel Inc. Intel HD xxxx OpenGL Engine
+Intel Intel 845G
+Intel Intel 855GM
+Intel Intel 865G
+Intel Intel 915G
+Intel Intel 915GM
+Intel Intel 945G
+Intel Intel 945GM
+Intel Intel 965/963 Graphics Media Accelerator
+Intel Intel Bear Lake B
+Intel Intel Broadwater G
+Intel Intel Brookdale-G
+Intel Intel Calistoga
+Intel Intel Cantiga
+Intel Intel Eaglelake
+Intel Intel Grantsdale-G
+Intel Intel HD Graphics 3000
+Intel Intel Lakeport
+Intel Intel Montara-GM
+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 45 Express Chipset Family (Microsoft Corporation - WDDM 1.1)
+Intel Mobile HD Graphics
+Intel Mobile SandyBridge HD Graphics
+Intel Montara
+Intel Pineview
+Intel Q45/Q43 Express Chipset
+Intel Royal BNA Driver
+Intel SandyBridge HD Graphics
+Intel SandyBridge HD Graphics BR-1006-00V8
+Intel Springdale
+Intel X3100
+Intergraph wcgdrv 06.05.06.18
+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
+NVIDIA /PCI/SSE2
+NVIDIA /PCI/SSE2/3DNOW!
+NVIDIA 205
+NVIDIA 210
+NVIDIA 310
+NVIDIA 310M
+NVIDIA 315
+NVIDIA 315M
+NVIDIA 320M
+NVIDIA C51
+NVIDIA D10M2-20/PCI/SSE2
+NVIDIA D10P1-25/PCI/SSE2
+NVIDIA D10P1-30/PCI/SSE2
+NVIDIA D10P2-50/PCI/SSE2
+NVIDIA D11M2-30/PCI/SSE2
+NVIDIA D12-P1-35/PCI/SSE2
+NVIDIA D12U-15/PCI/SSE2
+NVIDIA D13M1-40/PCI/SSE2
+NVIDIA D13P1-40/PCI/SSE2
+NVIDIA D13U-10/PCI/SSE2
+NVIDIA D13U/PCI/SSE2
+NVIDIA D9M
+NVIDIA D9M-20/PCI/SSE2
+NVIDIA Entry Graphics/PCI/SSE2
+NVIDIA Entry Graphics/PCI/SSE2/3DNOW!
+NVIDIA G 102M
+NVIDIA G 103M
+NVIDIA G 105M
+NVIDIA G 110M
+NVIDIA G100
+NVIDIA G102M
+NVIDIA G103M
+NVIDIA G105M
+NVIDIA G210
+NVIDIA G210M
+NVIDIA G70/PCI/SSE2
+NVIDIA G72
+NVIDIA G73
+NVIDIA G84
+NVIDIA G86
+NVIDIA G92
+NVIDIA G92-200/PCI/SSE2
+NVIDIA G94
+NVIDIA G96/PCI/SSE2
+NVIDIA G98/PCI/SSE2
+NVIDIA GT 120
+NVIDIA GT 130
+NVIDIA GT 130M
+NVIDIA GT 140
+NVIDIA GT 150
+NVIDIA GT 160M
+NVIDIA GT 220
+NVIDIA GT 220/PCI/SSE2
+NVIDIA GT 220/PCI/SSE2/3DNOW!
+NVIDIA GT 230
+NVIDIA GT 230M
+NVIDIA GT 240
+NVIDIA GT 240M
+NVIDIA GT 250M
+NVIDIA GT 260M
+NVIDIA GT 320
+NVIDIA GT 320M
+NVIDIA GT 330
+NVIDIA GT 330M
+NVIDIA GT 340
+NVIDIA GT 420
+NVIDIA GT 430
+NVIDIA GT 440
+NVIDIA GT 450
+NVIDIA GT 520
+NVIDIA GT 540
+NVIDIA GT 540M
+NVIDIA GT-120
+NVIDIA GT200/PCI/SSE2
+NVIDIA GTS 150
+NVIDIA GTS 240
+NVIDIA GTS 250
+NVIDIA GTS 350M
+NVIDIA GTS 360
+NVIDIA GTS 360M
+NVIDIA GTS 450
+NVIDIA GTX 260
+NVIDIA GTX 260M
+NVIDIA GTX 270
+NVIDIA GTX 280
+NVIDIA GTX 285
+NVIDIA GTX 290
+NVIDIA GTX 460
+NVIDIA GTX 460M
+NVIDIA GTX 465
+NVIDIA GTX 470
+NVIDIA GTX 470M
+NVIDIA GTX 480
+NVIDIA GTX 480M
+NVIDIA GTX 550 Ti
+NVIDIA GTX 560
+NVIDIA GTX 560 Ti
+NVIDIA GTX 570
+NVIDIA GTX 580
+NVIDIA GTX 590
+NVIDIA GeForce
+NVIDIA GeForce 2
+NVIDIA GeForce 205/PCI/SSE2
+NVIDIA GeForce 210
+NVIDIA GeForce 210/PCI/SSE2
+NVIDIA GeForce 210/PCI/SSE2/3DNOW!
+NVIDIA GeForce 3
+NVIDIA GeForce 305M/PCI/SSE2
+NVIDIA GeForce 310/PCI/SSE2
+NVIDIA GeForce 310/PCI/SSE2/3DNOW!
+NVIDIA GeForce 310M/PCI/SSE2
+NVIDIA GeForce 315/PCI/SSE2
+NVIDIA GeForce 315/PCI/SSE2/3DNOW!
+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 6100
+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 420/PCI/SSE2/3DNOW!
+NVIDIA GeForce 6100 nForce 430/PCI/SSE2/3DNOW!
+NVIDIA GeForce 6100/PCI/SSE2/3DNOW!
+NVIDIA GeForce 6150 LE/PCI/SSE2/3DNOW!
+NVIDIA GeForce 6150/PCI/SSE2
+NVIDIA GeForce 6150/PCI/SSE2/3DNOW!
+NVIDIA GeForce 6150SE nForce 430/PCI/SSE2
+NVIDIA GeForce 6150SE nForce 430/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/3DNOW!
+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/SSE2
+NVIDIA GeForce 6200/AGP/SSE2/3DNOW!
+NVIDIA GeForce 6200/PCI/SSE/3DNOW!
+NVIDIA GeForce 6200/PCI/SSE2
+NVIDIA GeForce 6200/PCI/SSE2/3DNOW!
+NVIDIA GeForce 6200SE TurboCache(TM)/PCI/SSE2/3DNOW!
+NVIDIA GeForce 6500
+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/PCI/SSE/3DNOW!
+NVIDIA GeForce 6600 GT/PCI/SSE2
+NVIDIA GeForce 6600 GT/PCI/SSE2/3DNOW!
+NVIDIA GeForce 6600 LE/PCI/SSE2
+NVIDIA GeForce 6600/AGP/SSE/3DNOW!
+NVIDIA GeForce 6600/AGP/SSE2
+NVIDIA GeForce 6600/AGP/SSE2/3DNOW!
+NVIDIA GeForce 6600/PCI/SSE2
+NVIDIA GeForce 6600/PCI/SSE2/3DNOW!
+NVIDIA GeForce 6700
+NVIDIA GeForce 6800
+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/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 7025 / NVIDIA nForce 630a/PCI/SSE2/3DNOW!
+NVIDIA GeForce 7025 / nForce 630a/PCI/SSE2
+NVIDIA GeForce 7025 / nForce 630a/PCI/SSE2/3DNOW!
+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 620i/PCI/SSE2
+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 630i/PCI/SSE2
+NVIDIA GeForce 7100 / nForce 630i/PCI/SSE2
+NVIDIA GeForce 7100 GS/PCI/SSE2
+NVIDIA GeForce 7100 GS/PCI/SSE2/3DNOW!
+NVIDIA GeForce 7150M / nForce 630M/PCI/SSE2
+NVIDIA GeForce 7150M / nForce 630M/PCI/SSE2/3DNOW!
+NVIDIA GeForce 7300
+NVIDIA GeForce 7300 GS/PCI/SSE2
+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/3DNOW!
+NVIDIA GeForce 7300 LE/PCI/SSE2
+NVIDIA GeForce 7300 LE/PCI/SSE2/3DNOW!
+NVIDIA GeForce 7300 SE/7200 GS/PCI/SSE2
+NVIDIA GeForce 7300 SE/7200 GS/PCI/SSE2/3DNOW!
+NVIDIA GeForce 7300 SE/PCI/SSE2
+NVIDIA GeForce 7300 SE/PCI/SSE2/3DNOW!
+NVIDIA GeForce 7350 LE/PCI/SSE2
+NVIDIA GeForce 7500
+NVIDIA GeForce 7500 LE/PCI/SSE2
+NVIDIA GeForce 7500 LE/PCI/SSE2/3DNOW!
+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/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/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 GTX/PCI/SSE2
+NVIDIA GeForce 7800 GTX/PCI/SSE2/3DNOW!
+NVIDIA GeForce 7900
+NVIDIA GeForce 7900 GS/PCI/SSE2
+NVIDIA GeForce 7900 GS/PCI/SSE2/3DNOW!
+NVIDIA GeForce 7900 GT/GTO/PCI/SSE2
+NVIDIA GeForce 7900 GT/PCI/SSE2/3DNOW!
+NVIDIA GeForce 7900 GTX/PCI/SSE2
+NVIDIA GeForce 7950 GT/PCI/SSE2
+NVIDIA GeForce 7950 GT/PCI/SSE2/3DNOW!
+NVIDIA GeForce 8100
+NVIDIA GeForce 8100 / nForce 720a/PCI/SSE2/3DNOW!
+NVIDIA GeForce 8200
+NVIDIA GeForce 8200/PCI/SSE2
+NVIDIA GeForce 8200/PCI/SSE2/3DNOW!
+NVIDIA GeForce 8200M
+NVIDIA GeForce 8200M G/PCI/SSE2
+NVIDIA GeForce 8200M G/PCI/SSE2/3DNOW!
+NVIDIA GeForce 8300
+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/3DNOW!
+NVIDIA GeForce 8400/PCI/SSE2/3DNOW!
+NVIDIA GeForce 8400GS/PCI/SSE2
+NVIDIA GeForce 8400GS/PCI/SSE2/3DNOW!
+NVIDIA GeForce 8400M
+NVIDIA GeForce 8400M G/PCI/SSE2
+NVIDIA GeForce 8400M G/PCI/SSE2/3DNOW!
+NVIDIA GeForce 8400M GS/PCI/SSE2
+NVIDIA GeForce 8400M GS/PCI/SSE2/3DNOW!
+NVIDIA GeForce 8400M GT/PCI/SSE2
+NVIDIA GeForce 8500
+NVIDIA GeForce 8500 GT/PCI/SSE2
+NVIDIA GeForce 8500 GT/PCI/SSE2/3DNOW!
+NVIDIA GeForce 8600
+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/3DNOW!
+NVIDIA GeForce 8600 GTS/PCI/SSE2
+NVIDIA GeForce 8600 GTS/PCI/SSE2/3DNOW!
+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 8700
+NVIDIA GeForce 8700M
+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/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/3DNOW!
+NVIDIA GeForce 8800 GTX/PCI/SSE2
+NVIDIA GeForce 8800 Ultra/PCI/SSE2
+NVIDIA GeForce 8800M GTS/PCI/SSE2
+NVIDIA GeForce 8800M GTX/PCI/SSE2
+NVIDIA GeForce 9100
+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/3DNOW!
+NVIDIA GeForce 9200
+NVIDIA GeForce 9200/PCI/SSE2
+NVIDIA GeForce 9200/PCI/SSE2/3DNOW!
+NVIDIA GeForce 9200M GE/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/3DNOW!
+NVIDIA GeForce 9300 GS/PCI/SSE2
+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/3DNOW!
+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/3DNOW!
+NVIDIA GeForce 9400/PCI/SSE2
+NVIDIA GeForce 9400M
+NVIDIA GeForce 9400M G/PCI/SSE2
+NVIDIA GeForce 9400M/PCI/SSE2
+NVIDIA GeForce 9500
+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/3DNOW!
+NVIDIA GeForce 9500M
+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 GT/PCI/SSE2
+NVIDIA GeForce 9600 GT/PCI/SSE2/3DNOW!
+NVIDIA GeForce 9600M
+NVIDIA GeForce 9600M GS/PCI/SSE2
+NVIDIA GeForce 9600M 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 9800
+NVIDIA GeForce 9800 GT/PCI/SSE2
+NVIDIA GeForce 9800 GT/PCI/SSE2/3DNOW!
+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/PCI/SSE2
+NVIDIA GeForce 9800 GX2/PCI/SSE2
+NVIDIA GeForce 9800M
+NVIDIA GeForce 9800M GS/PCI/SSE2
+NVIDIA GeForce 9800M GT/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/SSE2
+NVIDIA GeForce FX 5200/AGP/SSE2/3DNOW!
+NVIDIA GeForce FX 5200/PCI/SSE2
+NVIDIA GeForce FX 5200/PCI/SSE2/3DNOW!
+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/3DNOW!
+NVIDIA GeForce FX 5500/PCI/SSE2
+NVIDIA GeForce FX 5500/PCI/SSE2/3DNOW!
+NVIDIA GeForce FX 5600
+NVIDIA GeForce FX 5600/AGP/SSE2
+NVIDIA GeForce FX 5600/AGP/SSE2/3DNOW!
+NVIDIA GeForce FX 5600XT/AGP/SSE2/3DNOW!
+NVIDIA GeForce FX 5700
+NVIDIA GeForce FX 5700/AGP/SSE/3DNOW!
+NVIDIA GeForce FX 5700LE/AGP/SSE
+NVIDIA GeForce FX 5700LE/AGP/SSE/3DNOW!
+NVIDIA GeForce FX 5800
+NVIDIA GeForce FX 5900
+NVIDIA GeForce FX 5900/AGP/SSE2
+NVIDIA GeForce FX 5900XT/AGP/SSE2
+NVIDIA GeForce FX Go5100
+NVIDIA GeForce FX Go5100/AGP/SSE2
+NVIDIA GeForce FX Go5200
+NVIDIA GeForce FX Go5200/AGP/SSE2
+NVIDIA GeForce FX Go5300
+NVIDIA GeForce FX Go5600
+NVIDIA GeForce FX Go5600/AGP/SSE2
+NVIDIA GeForce FX Go5650/AGP/SSE2
+NVIDIA GeForce FX Go5700
+NVIDIA GeForce FX Go5xxx/AGP/SSE2
+NVIDIA GeForce G 103M/PCI/SSE2
+NVIDIA GeForce G 105M/PCI/SSE2
+NVIDIA GeForce G 110M/PCI/SSE2
+NVIDIA GeForce G100/PCI/SSE2
+NVIDIA GeForce G100/PCI/SSE2/3DNOW!
+NVIDIA GeForce G102M/PCI/SSE2
+NVIDIA GeForce G105M/PCI/SSE2
+NVIDIA GeForce G200/PCI/SSE2
+NVIDIA GeForce G205M/PCI/SSE2
+NVIDIA GeForce G210/PCI/SSE2
+NVIDIA GeForce G210/PCI/SSE2/3DNOW!
+NVIDIA GeForce G210M/PCI/SSE2
+NVIDIA GeForce G310M/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 140/PCI/SSE2
+NVIDIA GeForce GT 220/PCI/SSE2
+NVIDIA GeForce GT 220/PCI/SSE2/3DNOW!
+NVIDIA GeForce GT 220M/PCI/SSE2
+NVIDIA GeForce GT 230/PCI/SSE2
+NVIDIA GeForce GT 230M/PCI/SSE2
+NVIDIA GeForce GT 240
+NVIDIA GeForce GT 240/PCI/SSE2
+NVIDIA GeForce GT 240/PCI/SSE2/3DNOW!
+NVIDIA GeForce GT 240M/PCI/SSE2
+NVIDIA GeForce GT 320/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/3DNOW!
+NVIDIA GeForce GT 330M/PCI/SSE2
+NVIDIA GeForce GT 335M/PCI/SSE2
+NVIDIA GeForce GT 340/PCI/SSE2
+NVIDIA GeForce GT 340/PCI/SSE2/3DNOW!
+NVIDIA GeForce GT 415M/PCI/SSE2
+NVIDIA GeForce GT 420/PCI/SSE2
+NVIDIA GeForce GT 420M/PCI/SSE2
+NVIDIA GeForce GT 425M/PCI/SSE2
+NVIDIA GeForce GT 430/PCI/SSE2
+NVIDIA GeForce GT 430/PCI/SSE2/3DNOW!
+NVIDIA GeForce GT 435M/PCI/SSE2
+NVIDIA GeForce GT 440/PCI/SSE2
+NVIDIA GeForce GT 440/PCI/SSE2/3DNOW!
+NVIDIA GeForce GT 445M/PCI/SSE2
+NVIDIA GeForce GT 520M/PCI/SSE2
+NVIDIA GeForce GT 525M/PCI/SSE2
+NVIDIA GeForce GT 540M/PCI/SSE2
+NVIDIA GeForce GT 550M/PCI/SSE2
+NVIDIA GeForce GT 555M/PCI/SSE2
+NVIDIA GeForce GTS 150/PCI/SSE2
+NVIDIA GeForce GTS 160M/PCI/SSE2
+NVIDIA GeForce GTS 240/PCI/SSE2
+NVIDIA GeForce GTS 250/PCI/SSE2
+NVIDIA GeForce GTS 250/PCI/SSE2/3DNOW!
+NVIDIA GeForce GTS 250M/PCI/SSE2
+NVIDIA GeForce GTS 350M/PCI/SSE2
+NVIDIA GeForce GTS 360M/PCI/SSE2
+NVIDIA GeForce GTS 450/PCI/SSE2
+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/3DNOW!
+NVIDIA GeForce GTX 260M/PCI/SSE2
+NVIDIA GeForce GTX 275/PCI/SSE2
+NVIDIA GeForce GTX 280
+NVIDIA GeForce GTX 280/PCI/SSE2
+NVIDIA GeForce GTX 280M/PCI/SSE2
+NVIDIA GeForce GTX 285/PCI/SSE2
+NVIDIA GeForce GTX 295/PCI/SSE2
+NVIDIA GeForce GTX 460 SE/PCI/SSE2
+NVIDIA GeForce GTX 460 SE/PCI/SSE2/3DNOW!
+NVIDIA GeForce GTX 460/PCI/SSE2
+NVIDIA GeForce GTX 460/PCI/SSE2/3DNOW!
+NVIDIA GeForce GTX 460M/PCI/SSE2
+NVIDIA GeForce GTX 465/PCI/SSE2
+NVIDIA GeForce GTX 465/PCI/SSE2/3DNOW!
+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/3DNOW!
+NVIDIA GeForce GTX 560 Ti/PCI/SSE2
+NVIDIA GeForce GTX 560 Ti/PCI/SSE2/3DNOW!
+NVIDIA GeForce GTX 560/PCI/SSE2
+NVIDIA GeForce GTX 570/PCI/SSE2
+NVIDIA GeForce GTX 570/PCI/SSE2/3DNOW!
+NVIDIA GeForce GTX 580/PCI/SSE2
+NVIDIA GeForce GTX 580/PCI/SSE2/3DNOW!
+NVIDIA GeForce GTX 580M/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 6150/PCI/SSE2
+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 6600
+NVIDIA GeForce Go 6600/PCI/SSE2
+NVIDIA GeForce Go 6800
+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/3DNOW!
+NVIDIA GeForce Go 7400
+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/3DNOW!
+NVIDIA GeForce Go 7700
+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 GTX/PCI/SSE2
+NVIDIA GeForce Go 7950 GTX/PCI/SSE2
+NVIDIA GeForce PCX
+NVIDIA GeForce2 GTS/AGP/SSE
+NVIDIA GeForce2 MX/AGP/3DNOW!
+NVIDIA GeForce2 MX/AGP/SSE/3DNOW!
+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 440 Go 64M/AGP/SSE2/3DNOW!
+NVIDIA GeForce4 460 Go/AGP/SSE2
+NVIDIA GeForce4 MX 4000/AGP/SSE/3DNOW!
+NVIDIA GeForce4 MX 4000/AGP/SSE2
+NVIDIA GeForce4 MX 4000/PCI/3DNOW!
+NVIDIA GeForce4 MX 4000/PCI/SSE/3DNOW!
+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/AGP/SSE2
+NVIDIA GeForce4 MX 440/AGP/SSE2/3DNOW!
+NVIDIA GeForce4 MX 440SE with AGP8X/AGP/SSE2
+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/PCI/SSE2
+NVIDIA ION/PCI/SSE2/3DNOW!
+NVIDIA MCP61/PCI/SSE2
+NVIDIA MCP61/PCI/SSE2/3DNOW!
+NVIDIA MCP73/PCI/SSE2
+NVIDIA MCP79MH/PCI/SSE2
+NVIDIA MCP79MX/PCI/SSE2
+NVIDIA MCP7A-O/PCI/SSE2
+NVIDIA MCP7A-S/PCI/SSE2
+NVIDIA MCP89-EPT/PCI/SSE2
+NVIDIA N10M-GE1/PCI/SSE2
+NVIDIA N10P-GE1/PCI/SSE2
+NVIDIA N10P-GV2/PCI/SSE2
+NVIDIA N11M-GE1/PCI/SSE2
+NVIDIA N11M-GE2/PCI/SSE2
+NVIDIA N12E-GS-A1/PCI/SSE2
+NVIDIA NB9M-GE/PCI/SSE2
+NVIDIA NB9M-GE1/PCI/SSE2
+NVIDIA NB9M-GS/PCI/SSE2
+NVIDIA NB9M-NS/PCI/SSE2
+NVIDIA NB9P-GE1/PCI/SSE2
+NVIDIA NB9P-GS/PCI/SSE2
+NVIDIA NV17/AGP/3DNOW!
+NVIDIA NV17/AGP/SSE2
+NVIDIA NV34
+NVIDIA NV35
+NVIDIA NV36/AGP/SSE/3DNOW!
+NVIDIA NV36/AGP/SSE2
+NVIDIA NV41/PCI/SSE2
+NVIDIA NV43
+NVIDIA NV44
+NVIDIA NVIDIA GeForce 210 OpenGL Engine
+NVIDIA NVIDIA GeForce 320M 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 8800 GS OpenGL Engine
+NVIDIA NVIDIA GeForce 8800 GT OpenGL Engine
+NVIDIA NVIDIA GeForce 9400 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 GT 120 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 420M OpenGL Engine
+NVIDIA NVIDIA GeForce GT 425M 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 450 OpenGL Engine
+NVIDIA NVIDIA GeForce GTX 285 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 Pre-Release ION OpenGL Engine
+NVIDIA NVIDIA GeForce4 OpenGL Engine
+NVIDIA NVIDIA NV34MAP OpenGL Engine
+NVIDIA NVIDIA Quadro 4000 OpenGL Engine
+NVIDIA NVIDIA Quadro FX 4800 OpenGL Engine
+NVIDIA NVS 2100M/PCI/SSE2
+NVIDIA NVS 300/PCI/SSE2
+NVIDIA NVS 3100M/PCI/SSE2
+NVIDIA NVS 4100/PCI/SSE2/3DNOW!
+NVIDIA NVS 4200M/PCI/SSE2
+NVIDIA NVS 5100M/PCI/SSE2
+NVIDIA PCI
+NVIDIA Quadro 2000/PCI/SSE2
+NVIDIA Quadro 4000
+NVIDIA Quadro 4000 OpenGL Engine
+NVIDIA Quadro 4000/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/3DNOW!
+NVIDIA Quadro 6000
+NVIDIA Quadro 6000/PCI/SSE2
+NVIDIA Quadro CX/PCI/SSE2
+NVIDIA Quadro DCC
+NVIDIA Quadro FX
+NVIDIA Quadro FX 1100/AGP/SSE2
+NVIDIA Quadro FX 1400/PCI/SSE2
+NVIDIA Quadro FX 1500
+NVIDIA Quadro FX 1500M/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 2700M/PCI/SSE2
+NVIDIA Quadro FX 2800M/PCI/SSE2
+NVIDIA Quadro FX 3400
+NVIDIA Quadro FX 3450
+NVIDIA Quadro FX 3450/4000 SDI/PCI/SSE2
+NVIDIA Quadro FX 3500
+NVIDIA Quadro FX 3500M/PCI/SSE2
+NVIDIA Quadro FX 360M/PCI/SSE2
+NVIDIA Quadro FX 370
+NVIDIA Quadro FX 370/PCI/SSE2
+NVIDIA Quadro FX 3700
+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 4500
+NVIDIA Quadro FX 4600
+NVIDIA Quadro FX 4800
+NVIDIA Quadro FX 4800/PCI/SSE2
+NVIDIA Quadro FX 560
+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 770M/PCI/SSE2
+NVIDIA Quadro FX 880M
+NVIDIA Quadro FX 880M/PCI/SSE2
+NVIDIA Quadro FX Go700/AGP/SSE2
+NVIDIA Quadro NVS
+NVIDIA Quadro NVS 110M/PCI/SSE2
+NVIDIA Quadro NVS 130M/PCI/SSE2
+NVIDIA Quadro NVS 135M/PCI/SSE2
+NVIDIA Quadro NVS 140M/PCI/SSE2
+NVIDIA Quadro NVS 150M/PCI/SSE2
+NVIDIA Quadro NVS 160M/PCI/SSE2
+NVIDIA Quadro NVS 210S/PCI/SSE2/3DNOW!
+NVIDIA Quadro NVS 285/PCI/SSE2
+NVIDIA Quadro NVS 290/PCI/SSE2
+NVIDIA Quadro NVS 295/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/AGP/SSE2
+NVIDIA Quadro2
+NVIDIA Quadro4
+NVIDIA RIVA TNT
+NVIDIA RIVA TNT2/AGP/SSE2
+NVIDIA RIVA TNT2/PCI/3DNOW!
+NVIDIA nForce
+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 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 6490M OpenGL Engine
+Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 6750M 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 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 330M OpenGL Engine
+Radeon RV350 on Gallium
+S3
+S3 Graphics VIA/S3G UniChrome IGP/MMX/K3D
+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 DeltaChrome
+S3 Graphics, Incorporated VIA Chrome9 HC IGP
+SiS
+SiS 661 VGA
+SiS 662 VGA
+SiS 741 VGA
+SiS 760 VGA
+SiS 761GX VGA
+SiS Mirage Graphics3
+Trident
+Tungsten Graphics
+Tungsten Graphics, Inc Mesa DRI 865G GEM 20091221 2009Q4 x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI 865G GEM 20100330 DEVELOPMENT x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI 915G GEM 20091221 2009Q4 x86/MMX/SSE2
+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 945G
+Tungsten Graphics, Inc Mesa DRI 945G GEM 20091221 2009Q4 x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI 945G GEM 20100330 DEVELOPMENT
+Tungsten Graphics, Inc Mesa DRI 945G GEM 20100330 DEVELOPMENT x86/MMX/SSE2
+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 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 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 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 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
+Tungsten Graphics, Inc Mesa DRI IGD GEM 20091221 2009Q4 x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI IGD GEM 20100330 DEVELOPMENT
+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 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 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 R200 (RV280 5964) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2
+VIA
+VMware, Inc. Gallium 0.3 on SVGA3D; build: RELEASE;
+VMware, Inc. Gallium 0.4 on i915 (chipset: 945GM)
+VMware, Inc. Gallium 0.4 on llvmpipe
+VMware, Inc. Gallium 0.4 on softpipe
+X.Org Gallium 0.4 on AMD BARTS
+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 REDWOOD
+X.Org Gallium 0.4 on AMD RS780
+X.Org Gallium 0.4 on AMD RS880
+X.Org Gallium 0.4 on AMD RV610
+X.Org Gallium 0.4 on AMD RV620
+X.Org Gallium 0.4 on AMD RV630
+X.Org Gallium 0.4 on AMD RV635
+X.Org Gallium 0.4 on AMD RV710
+X.Org Gallium 0.4 on AMD RV730
+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 R580
+X.Org R300 Project Gallium 0.4 on ATI RC410
+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 RV350
+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 RV515
+X.Org R300 Project Gallium 0.4 on ATI RV530
+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
+X.Org R300 Project Gallium 0.4 on RC410
+X.Org R300 Project Gallium 0.4 on RS480
+X.Org R300 Project Gallium 0.4 on RS482
+X.Org R300 Project Gallium 0.4 on RS600
+X.Org R300 Project Gallium 0.4 on RS690
+X.Org R300 Project Gallium 0.4 on RS740
+X.Org R300 Project Gallium 0.4 on RV350
+X.Org R300 Project Gallium 0.4 on RV370
+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 NV34
+nouveau Gallium 0.4 on NV36
+nouveau Gallium 0.4 on NV46
+nouveau Gallium 0.4 on NV49
+nouveau Gallium 0.4 on NV4A
+nouveau Gallium 0.4 on NV4B
+nouveau Gallium 0.4 on NV4E
+nouveau Gallium 0.4 on NV50
+nouveau Gallium 0.4 on NV84
+nouveau Gallium 0.4 on NV86
+nouveau Gallium 0.4 on NV92
+nouveau Gallium 0.4 on NV94
+nouveau Gallium 0.4 on NV96
+nouveau Gallium 0.4 on NV98
+nouveau Gallium 0.4 on NVA0
+nouveau Gallium 0.4 on NVA3
+nouveau Gallium 0.4 on NVA5
+nouveau Gallium 0.4 on NVA8
+nouveau Gallium 0.4 on NVAA
+nouveau Gallium 0.4 on NVAC
diff --git a/indra/newview/tests/lldir_stub.cpp b/indra/newview/tests/lldir_stub.cpp
new file mode 100644
index 0000000000..6646860b5e
--- /dev/null
+++ b/indra/newview/tests/lldir_stub.cpp
@@ -0,0 +1,45 @@
+/**
+ * @file lldir_stub.cpp
+ * @brief stub class to allow unit testing
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * Copyright (c) 2009, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+// Use me only if you need to stub out some helper functions, not if you e.g. need sane numbers from countFilesInDir
+
+LLDir::LLDir() {}
+LLDir::~LLDir() {}
+BOOL LLDir::deleteFilesInDir(const std::string &dirname, const std::string &mask) { return true; }
+void LLDir::setChatLogsDir(const std::string &path) {}
+void LLDir::setPerAccountChatLogsDir(const std::string &first, const std::string &last) {}
+void LLDir::setLindenUserDir(const std::string &first, const std::string &last) {}
+void LLDir::setSkinFolder(const std::string &skin_folder) {}
+bool LLDir::setCacheDir(const std::string &path) { return true; }
+void LLDir::dumpCurrentDirectories() {}
+
+class LLDir_stub : public LLDir
+{
+public:
+ LLDir_stub() {}
+ ~LLDir_stub() {}
+
+ /*virtual*/ void initAppDirs(const std::string &app_name) {}
+
+ /*virtual*/ std::string getCurPath() { return "CUR_PATH_FROM_LLDIR"; }
+ /*virtual*/ U32 countFilesInDir(const std::string &dirname, const std::string &mask) { return 42; }
+ /*virtual*/ BOOL getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname, BOOL wrap) { fname = fname + "_NEXT"; return false; }
+ /*virtual*/ void getRandomFileInDir(const std::string &dirname, const std::string &mask, std::string &fname) { fname = "RANDOM_FILE"; }
+ /*virtual*/ BOOL fileExists(const std::string &filename) const { return false; }
+};
+
+LLDir_stub gDirUtil;
+
+LLDir* gDirUtilp = &gDirUtil;
+
+std::string LLDir::getExpandedFilename(ELLPath loc, const std::string& subdir, const std::string& filename) const
+{
+ return subdir + " --- " + filename + " --- expanded!";
+}
+
diff --git a/indra/newview/tests/llglslshader_stub.cpp b/indra/newview/tests/llglslshader_stub.cpp
new file mode 100644
index 0000000000..5333c8a361
--- /dev/null
+++ b/indra/newview/tests/llglslshader_stub.cpp
@@ -0,0 +1,22 @@
+/**
+ * @file llglslshader_stub.cpp
+ * @brief stub class to allow unit testing
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * Copyright (c) 2009, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+#include "llglslshader.h"
+
+void LLGLSLShader::uniform1f(const std::string& uniform, F32 num)
+{
+}
+
+void LLGLSLShader::uniform3fv(const std::string& uniform, U32 count, const GLfloat *v)
+{
+}
+
+void LLGLSLShader::uniform4fv(U32 index, U32 count, const GLfloat* v)
+{
+}
diff --git a/indra/newview/tests/llpipeline_stub.cpp b/indra/newview/tests/llpipeline_stub.cpp
new file mode 100644
index 0000000000..85bf0ae3fb
--- /dev/null
+++ b/indra/newview/tests/llpipeline_stub.cpp
@@ -0,0 +1,15 @@
+/**
+ * @file llpipeline_stub.cpp
+ * @brief stub class to allow unit testing
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * Copyright (c) 2009, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+class LLPipeline
+{
+public: BOOL canUseWindLightShaders() const;
+};
+BOOL LLPipeline::canUseWindLightShaders() const {return TRUE;}
+LLPipeline gPipeline;
diff --git a/indra/newview/tests/llsky_stub.cpp b/indra/newview/tests/llsky_stub.cpp
new file mode 100644
index 0000000000..35f4944a95
--- /dev/null
+++ b/indra/newview/tests/llsky_stub.cpp
@@ -0,0 +1,20 @@
+/**
+ * @file llsky_stub.cpp
+ * @brief stub class to allow unit testing
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * Copyright (c) 2009, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+class LLSky
+{
+public:
+ void setOverrideSun(BOOL override);
+ void setSunDirection(const LLVector3 &sun_direction, const LLVector3 &sun_ang_velocity);
+};
+
+void LLSky::setOverrideSun(BOOL override) {}
+void LLSky::setSunDirection(const LLVector3 &sun_direction, const LLVector3 &sun_ang_velocity) {}
+
+LLSky gSky;
diff --git a/indra/newview/tests/llviewernetwork_test.cpp b/indra/newview/tests/llviewernetwork_test.cpp
index dd7761475e..3c89b64d52 100644
--- a/indra/newview/tests/llviewernetwork_test.cpp
+++ b/indra/newview/tests/llviewernetwork_test.cpp
@@ -164,7 +164,7 @@ namespace tut
std::string("https://secondlife.com/helpers/"));
ensure_equals("Agni login page is correct",
grid[GRID_LOGIN_PAGE_VALUE].asString(),
- std::string("http://secondlife.com/app/login/"));
+ std::string("http://viewer-login.agni.lindenlab.com/"));
ensure("Agni is a favorite",
grid.has(GRID_IS_FAVORITE_VALUE));
ensure("Agni is a system grid",
@@ -208,7 +208,7 @@ namespace tut
std::string("https://secondlife.com/helpers/"));
ensure_equals("Agni login page the same after grid file",
grid[GRID_LOGIN_PAGE_VALUE].asString(),
- std::string("http://secondlife.com/app/login/"));
+ std::string("http://viewer-login.agni.lindenlab.com/"));
ensure("Agni still a favorite after grid file",
grid.has(GRID_IS_FAVORITE_VALUE));
ensure("Agni system grid still set after grid file",
@@ -310,7 +310,7 @@ namespace tut
std::string("http://aditi-secondlife.webdev.lindenlab.com/helpers/"));
ensure_equals("Override known grid login uri: login page is not set",
grid[GRID_LOGIN_PAGE_VALUE].asString(),
- std::string("http://secondlife.com/app/login/"));
+ std::string("http://viewer-login.agni.lindenlab.com/"));
// Override with loginuri
// override custom grid
@@ -359,7 +359,7 @@ namespace tut
std::string("https://my.helper.uri/mycustomhelpers"));
ensure_equals("Override known grid helper uri: login page is not changed",
grid[GRID_LOGIN_PAGE_VALUE].asString(),
- std::string("http://secondlife.com/app/login/"));
+ std::string("http://viewer-login.agni.lindenlab.com/"));
// Override with helperuri
// override custom grid
@@ -451,9 +451,9 @@ namespace tut
ensure_equals("getHelperURI", LLGridManager::getInstance()->getHelperURI(),
std::string("https://secondlife.com/helpers/"));
ensure_equals("getLoginPage", LLGridManager::getInstance()->getLoginPage(),
- std::string("http://secondlife.com/app/login/"));
+ std::string("http://viewer-login.agni.lindenlab.com/"));
ensure_equals("getLoginPage2", LLGridManager::getInstance()->getLoginPage("util.agni.lindenlab.com"),
- std::string("http://secondlife.com/app/login/"));
+ std::string("http://viewer-login.agni.lindenlab.com/"));
ensure("Is Agni a production grid", LLGridManager::getInstance()->isInProductionGrid());
std::vector<std::string> uris;
LLGridManager::getInstance()->getLoginURIs(uris);
diff --git a/indra/newview/tests/llviewershadermgr_stub.cpp b/indra/newview/tests/llviewershadermgr_stub.cpp
new file mode 100644
index 0000000000..0dae527035
--- /dev/null
+++ b/indra/newview/tests/llviewershadermgr_stub.cpp
@@ -0,0 +1,33 @@
+/**
+ * @file llglslshader_stub.cpp
+ * @brief stub class to allow unit testing
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * Copyright (c) 2009, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+#include "../llviewershadermgr.h"
+
+LLShaderMgr::LLShaderMgr() {}
+LLShaderMgr::~LLShaderMgr() {}
+
+LLViewerShaderMgr::LLViewerShaderMgr() {}
+LLViewerShaderMgr::~LLViewerShaderMgr() {}
+
+LLViewerShaderMgr* stub_instance = NULL;
+
+LLViewerShaderMgr* LLViewerShaderMgr::instance() {
+ if(NULL == stub_instance)
+ {
+ stub_instance = new LLViewerShaderMgr();
+ }
+
+ return stub_instance;
+}
+LLViewerShaderMgr::shader_iter fake_iter;
+LLViewerShaderMgr::shader_iter LLViewerShaderMgr::beginShaders() const {return fake_iter;}
+LLViewerShaderMgr::shader_iter LLViewerShaderMgr::endShaders() const {return fake_iter;}
+
+void LLViewerShaderMgr::updateShaderUniforms(LLGLSLShader* shader) {return;}
+std::string LLViewerShaderMgr::getShaderDirPrefix() {return "SHADER_DIR_PREFIX-";}
diff --git a/indra/newview/tests/llwlanimator_stub.cpp b/indra/newview/tests/llwlanimator_stub.cpp
new file mode 100644
index 0000000000..4d1bb85544
--- /dev/null
+++ b/indra/newview/tests/llwlanimator_stub.cpp
@@ -0,0 +1,12 @@
+/**
+ * @file llwlanimator_stub.cpp
+ * @brief stub class to allow unit testing
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * Copyright (c) 2009, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+LLWLAnimator::LLWLAnimator(void) {}
+void LLWLAnimator::update(LLWLParamSet& set) {}
+void LLWLAnimator::setTrack(std::map<F32, LLWLParamKey>& track, F32 dayRate, F64 dayTime, bool run) {}
diff --git a/indra/newview/tests/llwldaycycle_stub.cpp b/indra/newview/tests/llwldaycycle_stub.cpp
new file mode 100644
index 0000000000..d98c9614b4
--- /dev/null
+++ b/indra/newview/tests/llwldaycycle_stub.cpp
@@ -0,0 +1,35 @@
+/**
+ * @file llwldaycycle_stub.cpp
+ * @brief stub class to allow unit testing
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * Copyright (c) 2009, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+LLWLDayCycle::LLWLDayCycle(void)
+{
+}
+
+LLWLDayCycle::~LLWLDayCycle(void)
+{
+}
+
+bool LLWLDayCycle::getKeytime(LLWLParamKey keyFrame, F32& keyTime)
+{
+ keyTime = 0.5;
+ return true;
+}
+
+bool LLWLDayCycle::removeKeyframe(F32 time)
+{
+ return true;
+}
+
+void LLWLDayCycle::loadDayCycleFromFile(const std::string& fileName)
+{
+}
+
+void LLWLDayCycle::removeReferencesTo(const LLWLParamKey &keyframe)
+{
+}
diff --git a/indra/newview/tests/llwlparammanager_test.cpp b/indra/newview/tests/llwlparammanager_test.cpp
new file mode 100644
index 0000000000..a6c6a2abf4
--- /dev/null
+++ b/indra/newview/tests/llwlparammanager_test.cpp
@@ -0,0 +1,254 @@
+/**
+ * @file llwlparammanager_test.cpp
+ * @brief LLWLParamManager tests
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * Copyright (c) 2009, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+// Precompiled headers
+#include "../llviewerprecompiledheaders.h"
+
+// Class to test
+#include "../llwlparammanager.h"
+
+// Dependencies
+#include "linden_common.h"
+
+// TUT header
+#include "lltut.h"
+
+// Stubs
+#include "llwldaycycle_stub.cpp"
+#include "llwlparamset_stub.cpp"
+#include "llwlanimator_stub.cpp"
+#include "llglslshader_stub.cpp"
+#include "lldir_stub.cpp"
+#include "llsky_stub.cpp"
+#include "llpipeline_stub.cpp"
+#include "llviewershadermgr_stub.cpp"
+
+void assert_glerror(void) {}
+LLViewerCamera::LLViewerCamera() {}
+void LLViewerCamera::setView(F32 vertical_fov_rads) {}
+std::string LLTrans::getString(const std::string &xml_desc, const LLStringUtil::format_map_t& args) { return std::string(""); }
+
+char* curl_unescape(const char* c_str, int length)
+{
+ char* copy = new char[length+4];
+ memcpy(copy, c_str, length);
+ copy[length+0] = 'E';
+ copy[length+1] = 'S';
+ copy[length+2] = 'C';
+ copy[length+3] = '\0';
+ return copy;
+}
+void curl_free(void* p) {delete[] ((char*)p);}
+char* curl_escape(const char* c_str, int length) {
+ char* copy = new char[length+6];
+ memcpy(copy, c_str, length);
+ copy[length+0] = 'U';
+ copy[length+1] = 'N';
+ copy[length+2] = 'E';
+ copy[length+3] = 'S';
+ copy[length+4] = 'C';
+ copy[length+5] = '\0';
+ return copy;
+}
+
+namespace tut
+{
+ // Main Setup
+ struct LLWLParamManagerFixture
+ {
+ class LLWLParamManagerTest
+ {
+ };
+
+ LLWLParamManager* mTestManager;
+
+ LLWLParamManagerFixture()
+ : mTestManager(LLWLParamManager::getInstance())
+ {
+ }
+
+ ~LLWLParamManagerFixture()
+ {
+ }
+ };
+ typedef test_group<LLWLParamManagerFixture> factory;
+ typedef factory::object object;
+ factory tf("LLWLParamManager test");
+
+ // Tests
+ template<> template<>
+ void object::test<1>()
+ {
+ try
+ {
+ std::string preset =
+ "<llsd>\
+ <map>\
+ <key>ambient</key>\
+ <array>\
+ <real>1.0499999523162842</real>\
+ <real>1.0499999523162842</real>\
+ <real>1.0499999523162842</real>\
+ <real>0.34999999403953552</real>\
+ </array>\
+ <key>blue_density</key>\
+ <array>\
+ <real>0.2447581488182351</real>\
+ <real>0.44872328639030457</real>\
+ <real>0.75999999046325684</real>\
+ <real>0.38000004053115788</real>\
+ </array>\
+ <key>blue_horizon</key>\
+ <array>\
+ <real>0.49548382097675159</real>\
+ <real>0.49548381382419748</real>\
+ <real>0.63999999284744291</real>\
+ <real>0.31999999642372146</real>\
+ </array>\
+ <key>cloud_color</key>\
+ <array>\
+ <real>0.40999999165535073</real>\
+ <real>0.40999999165535073</real>\
+ <real>0.40999999165535073</real>\
+ <real>0.40999999165535073</real>\
+ </array>\
+ <key>cloud_pos_density1</key>\
+ <array>\
+ <real>1.6884100437164307</real>\
+ <real>0.52609699964523315</real>\
+ <real>0.99999999999999289</real>\
+ <real>1</real>\
+ </array>\
+ <key>cloud_pos_density2</key>\
+ <array>\
+ <real>1.6884100437164307</real>\
+ <real>0.52609699964523315</real>\
+ <real>0.125</real>\
+ <real>1</real>\
+ </array>\
+ <key>cloud_scale</key>\
+ <array>\
+ <real>0.4199999868869746</real>\
+ <real>0</real>\
+ <real>0</real>\
+ <real>1</real>\
+ </array>\
+ <key>cloud_scroll_rate</key>\
+ <array>\
+ <real>10.199999809265137</real>\
+ <real>10.01099967956543</real>\
+ </array>\
+ <key>cloud_shadow</key>\
+ <array>\
+ <real>0.26999998092651367</real>\
+ <real>0</real>\
+ <real>0</real>\
+ <real>1</real>\
+ </array>\
+ <key>density_multiplier</key>\
+ <array>\
+ <real>0.00017999998817685818</real>\
+ <real>0</real>\
+ <real>0</real>\
+ <real>1</real>\
+ </array>\
+ <key>distance_multiplier</key>\
+ <array>\
+ <real>0.80000001192093606</real>\
+ <real>0</real>\
+ <real>0</real>\
+ <real>1</real>\
+ </array>\
+ <key>east_angle</key>\
+ <real>0</real>\
+ <key>enable_cloud_scroll</key>\
+ <array>\
+ <boolean>1</boolean>\
+ <boolean>1</boolean>\
+ </array>\
+ <key>gamma</key>\
+ <array>\
+ <real>1</real>\
+ <real>0</real>\
+ <real>0</real>\
+ <real>1</real>\
+ </array>\
+ <key>glow</key>\
+ <array>\
+ <real>5</real>\
+ <real>0.0010000000474974513</real>\
+ <real>-0.47999998927116394</real>\
+ <real>1</real>\
+ </array>\
+ <key>haze_density</key>\
+ <array>\
+ <real>0.69999998807907104</real>\
+ <real>0</real>\
+ <real>0</real>\
+ <real>1</real>\
+ </array>\
+ <key>haze_horizon</key>\
+ <array>\
+ <real>0.18999999761581243</real>\
+ <real>0.19915600121021271</real>\
+ <real>0.19915600121021271</real>\
+ <real>1</real>\
+ </array>\
+ <key>lightnorm</key>\
+ <array>\
+ <real>0</real>\
+ <real>0.70710659027099609</real>\
+ <real>-0.70710694789886475</real>\
+ <real>0</real>\
+ </array>\
+ <key>max_y</key>\
+ <array>\
+ <real>1605</real>\
+ <real>0</real>\
+ <real>0</real>\
+ <real>1</real>\
+ </array>\
+ <key>preset_num</key>\
+ <integer>22</integer>\
+ <key>star_brightness</key>\
+ <real>0</real>\
+ <key>sun_angle</key>\
+ <real>2.3561947345733643</real>\
+ <key>sunlight_color</key>\
+ <array>\
+ <real>0.73421055078505759</real>\
+ <real>0.78157895803450828</real>\
+ <real>0.89999997615813498</real>\
+ <real>0.29999998211860301</real>\
+ </array>\
+ </map>\
+ </llsd>";
+
+ std::stringstream preset_stream(preset);
+ mTestManager->loadPresetFromXML(LLWLParamKey("test1", LLWLParamKey::SCOPE_LOCAL), preset_stream);
+ LLWLParamSet dummy;
+ ensure("Couldn't get ParamSet after loading it", mTestManager->getParamSet(LLWLParamKey("test1", LLWLParamKey::SCOPE_LOCAL), dummy));
+ }
+ catch (...)
+ {
+ fail("loadPresetFromXML test crashed!");
+ }
+ }
+
+ template<> template<>
+ void object::test<2>()
+ {
+ mTestManager->propagateParameters();
+ ensure_equals("Wrong value from getDomeOffset()", mTestManager->getDomeOffset(), 0.96f);
+ ensure_equals("Wrong value from getDomeRadius()", mTestManager->getDomeRadius(), 15000.f);
+ ensure_equals("Wrong value from getLightDir()", mTestManager->getLightDir(), LLVector4(-0,0,1,0));
+ ensure_equals("Wrong value from getClampedLightDir()", mTestManager->getClampedLightDir(), LLVector4(-0,0,1,0));
+ ensure_equals("Wrong value from getRotatedLightDir()", mTestManager->getRotatedLightDir(), LLVector4(0,0,0,1));
+ }
+}
diff --git a/indra/newview/tests/llwlparamset_stub.cpp b/indra/newview/tests/llwlparamset_stub.cpp
new file mode 100644
index 0000000000..6ce4b5827d
--- /dev/null
+++ b/indra/newview/tests/llwlparamset_stub.cpp
@@ -0,0 +1,24 @@
+/**
+ * @file llwlparamset_stub.cpp
+ * @brief stub class to allow unit testing
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * Copyright (c) 2009, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+LLWLParamSet::LLWLParamSet(void)
+{
+}
+
+void LLWLParamSet::updateCloudScrolling()
+{
+}
+
+void LLWLParamSet::set(const std::string& name, const LLVector4& val)
+{
+}
+
+void LLWLParamSet::update(LLGLSLShader *shader) const
+{
+}
diff --git a/indra/viewer_components/login/lllogin.cpp b/indra/viewer_components/login/lllogin.cpp
index 651d803e0d..d480b63094 100644
--- a/indra/viewer_components/login/lllogin.cpp
+++ b/indra/viewer_components/login/lllogin.cpp
@@ -178,6 +178,8 @@ void LLLogin::Impl::login_(LLCoros::self& self, std::string uri, LLSD login_para
request["uri"] = uri;
request["reply"] = replyPump.getName();
rewrittenURIs = postAndWait(self, request, srv_pump_name, filter);
+ // EXP-772: If rewrittenURIs fail, try original URI as a fallback.
+ rewrittenURIs.append(uri);
} // we no longer need the filter
LLEventPump& xmlrpcPump(LLEventPumps::instance().obtain("LLXMLRPCTransaction"));
diff --git a/indra/win_crash_logger/llcrashloggerwindows.cpp b/indra/win_crash_logger/llcrashloggerwindows.cpp
index 51ff754c27..170babbb98 100644
--- a/indra/win_crash_logger/llcrashloggerwindows.cpp
+++ b/indra/win_crash_logger/llcrashloggerwindows.cpp
@@ -296,6 +296,7 @@ void LLCrashLoggerWindows::gatherPlatformSpecificFiles()
bool LLCrashLoggerWindows::mainLoop()
{
+ llinfos << "CrashSubmitBehavior is " << mCrashBehavior << llendl;
// Note: parent hwnd is 0 (the desktop). No dlg proc. See Petzold (5th ed) HexCalc example, Chapter 11, p529
// win_crash_logger.rc has been edited by hand.
@@ -308,6 +309,7 @@ bool LLCrashLoggerWindows::mainLoop()
if (mCrashBehavior == CRASH_BEHAVIOR_ALWAYS_SEND)
{
+ llinfos << "Showing crash report submit progress window." << llendl;
ShowWindow(gHwndProgress, SW_SHOW );
sendCrashLogs();
}
@@ -354,7 +356,7 @@ bool LLCrashLoggerWindows::mainLoop()
void LLCrashLoggerWindows::updateApplication(const std::string& message)
{
- LLCrashLogger::updateApplication();
+ LLCrashLogger::updateApplication(message);
if(!message.empty()) show_progress(message);
update_messages();
}
@@ -370,6 +372,3 @@ bool LLCrashLoggerWindows::cleanup()
PostQuitMessage(0);
return true;
}
-
-
-
diff --git a/indra/win_crash_logger/llcrashloggerwindows.h b/indra/win_crash_logger/llcrashloggerwindows.h
index 24c564457c..5c45a998b3 100644
--- a/indra/win_crash_logger/llcrashloggerwindows.h
+++ b/indra/win_crash_logger/llcrashloggerwindows.h
@@ -41,7 +41,6 @@ public:
virtual void updateApplication(const std::string& message = LLStringUtil::null);
virtual bool cleanup();
virtual void gatherPlatformSpecificFiles();
- //void annotateCallStack();
void setHandle(HINSTANCE hInst) { mhInst = hInst; }
private:
void ProcessDlgItemText(HWND hWnd, int nIDDlgItem);
diff --git a/indra/win_crash_logger/win_crash_logger.cpp b/indra/win_crash_logger/win_crash_logger.cpp
index 5c22053317..8e916ae437 100644
--- a/indra/win_crash_logger/win_crash_logger.cpp
+++ b/indra/win_crash_logger/win_crash_logger.cpp
@@ -24,51 +24,30 @@
* $/LicenseInfo$
*/
-// win_crash_logger.cpp : Defines the entry point for the application.
-//
-
-// Must be first include, precompiled headers.
#include "linden_common.h"
-
#include "stdafx.h"
-
#include <stdlib.h>
-
#include "llcrashloggerwindows.h"
-
-
-//
-// Implementation
-//
-
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
- llinfos << "Starting crash reporter" << llendl;
+ llinfos << "Starting crash reporter." << llendl;
LLCrashLoggerWindows app;
app.setHandle(hInstance);
- bool ok = app.init();
- if(!ok)
+ app.parseCommandOptions(__argc, __argv);
+
+ if (! app.init())
{
llwarns << "Unable to initialize application." << llendl;
return -1;
}
- // Run the application main loop
- if(!LLApp::isQuitting()) app.mainLoop();
-
- if (!app.isError())
- {
- //
- // We don't want to do cleanup here if the error handler got called -
- // the assumption is that the error handler is responsible for doing
- // app cleanup if there was a problem.
- //
- app.cleanup();
- }
+ app.mainLoop();
+ app.cleanup();
+ llinfos << "Crash reporter finished normally." << llendl;
return 0;
}