summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.hgignore1
-rw-r--r--.hgtags39
-rw-r--r--BuildParams67
-rw-r--r--autobuild.xml1080
-rwxr-xr-xbuild.sh24
-rw-r--r--doc/contributions.txt38
-rw-r--r--etc/message.xml7
-rw-r--r--indra/CMakeLists.txt6
-rw-r--r--indra/cmake/00-Common.cmake21
-rw-r--r--indra/cmake/CMakeLists.txt2
-rw-r--r--indra/cmake/Copy3rdPartyLibs.cmake24
-rw-r--r--[-rwxr-xr-x]indra/cmake/FMOD.cmake0
-rw-r--r--indra/cmake/FindTut.cmake30
-rw-r--r--indra/cmake/GLOD.cmake9
-rw-r--r--indra/cmake/GooglePerfTools.cmake12
-rw-r--r--indra/cmake/LLAddBuildTest.cmake2
-rw-r--r--indra/cmake/LLConvexDecomposition.cmake12
-rw-r--r--indra/cmake/LLPrimitive.cmake28
-rw-r--r--indra/cmake/LLTestCommand.cmake1
-rw-r--r--indra/cmake/OpenGL.cmake3
-rw-r--r--indra/cmake/Prebuilt.cmake56
-rw-r--r--indra/cmake/Pth.cmake21
-rw-r--r--indra/cmake/Tut.cmake9
-rw-r--r--indra/cmake/Variables.cmake8
-rw-r--r--indra/cmake/WebKitLibPlugin.cmake62
-rw-r--r--[-rwxr-xr-x]indra/cmake/run_build_test.py2
-rw-r--r--indra/integration_tests/llimage_libtest/llimage_libtest.cpp212
-rw-r--r--indra/integration_tests/llui_libtest/llui_libtest.cpp5
-rw-r--r--indra/linux_updater/linux_updater.cpp15
-rw-r--r--indra/llcharacter/CMakeLists.txt19
-rw-r--r--indra/llcharacter/llbvhloader.cpp10
-rw-r--r--indra/llcharacter/lljoint.cpp38
-rw-r--r--indra/llcharacter/lljoint.h24
-rw-r--r--indra/llcharacter/llkeyframemotion.cpp2
-rw-r--r--indra/llcommon/CMakeLists.txt14
-rw-r--r--indra/llcommon/indra_constants.h8
-rw-r--r--indra/llcommon/llaccountingquota.h72
-rw-r--r--indra/llcommon/llapp.cpp7
-rw-r--r--indra/llcommon/llassettype.cpp3
-rw-r--r--indra/llcommon/llassettype.h6
-rw-r--r--indra/llcommon/llchat.h3
-rw-r--r--indra/llcommon/lldefs.h8
-rw-r--r--indra/llcommon/llfasttimer.h135
-rw-r--r--indra/llcommon/llfasttimer_class.cpp172
-rw-r--r--indra/llcommon/llfasttimer_class.h9
-rw-r--r--indra/llcommon/llfoldertype.cpp3
-rw-r--r--indra/llcommon/llfoldertype.h6
-rw-r--r--indra/llcommon/llmd5.h2
-rw-r--r--indra/llcommon/llmemory.cpp19
-rw-r--r--indra/llcommon/llmemory.h90
-rw-r--r--indra/llcommon/llrefcount.cpp110
-rw-r--r--indra/llcommon/llrefcount.h20
-rw-r--r--indra/llcommon/llsdserialize.cpp183
-rw-r--r--indra/llcommon/llsdserialize.h4
-rw-r--r--indra/llcommon/llsys.cpp87
-rw-r--r--indra/llcommon/llthread.cpp68
-rw-r--r--indra/llcommon/llthread.h22
-rw-r--r--indra/llcommon/llversionviewer.h4
-rw-r--r--indra/llcommon/stdenums.h3
-rw-r--r--indra/llimage/llimage.cpp23
-rw-r--r--indra/llimage/llimage.h13
-rw-r--r--indra/llimage/llimagej2c.cpp12
-rw-r--r--indra/llimage/llimagej2c.h4
-rw-r--r--indra/llimagej2coj/llimagej2coj.cpp11
-rw-r--r--indra/llimagej2coj/llimagej2coj.h2
-rw-r--r--indra/llinventory/CMakeLists.txt25
-rw-r--r--indra/llinventory/llinventorytype.cpp79
-rw-r--r--indra/llinventory/llinventorytype.h3
-rw-r--r--indra/llinventory/llparcel.cpp9
-rw-r--r--indra/llinventory/llparcel.h13
-rw-r--r--indra/llkdu/llimagej2ckdu.cpp527
-rw-r--r--indra/llkdu/llimagej2ckdu.h7
-rw-r--r--indra/llkdu/llkdumem.cpp22
-rw-r--r--indra/llkdu/llkdumem.h44
-rw-r--r--indra/llkdu/tests/llimagej2ckdu_test.cpp1
-rw-r--r--indra/llmath/CMakeLists.txt14
-rw-r--r--indra/llmath/llcamera.cpp275
-rw-r--r--indra/llmath/llcamera.h30
-rw-r--r--indra/llmath/llmath.h85
-rw-r--r--indra/llmath/llmatrix3a.cpp134
-rw-r--r--indra/llmath/llmatrix3a.h128
-rw-r--r--indra/llmath/llmatrix3a.inl119
-rw-r--r--indra/llmath/llmatrix4a.h143
-rw-r--r--indra/llmath/lloctree.h327
-rw-r--r--indra/llmath/llplane.h44
-rw-r--r--indra/llmath/llquantize.h6
-rw-r--r--indra/llmath/llquaternion.cpp3
-rw-r--r--indra/llmath/llquaternion.h6
-rw-r--r--indra/llmath/llquaternion2.h105
-rw-r--r--indra/llmath/llquaternion2.inl102
-rw-r--r--indra/llmath/llsimdmath.h93
-rw-r--r--indra/llmath/llsimdtypes.h124
-rw-r--r--indra/llmath/llsimdtypes.inl157
-rw-r--r--indra/llmath/lltreenode.h3
-rw-r--r--indra/llmath/llvector4a.cpp222
-rw-r--r--indra/llmath/llvector4a.h324
-rw-r--r--indra/llmath/llvector4a.inl593
-rw-r--r--indra/llmath/llvector4logical.h124
-rw-r--r--indra/llmath/llvolume.cpp2814
-rw-r--r--indra/llmath/llvolume.h191
-rw-r--r--indra/llmath/llvolumemgr.cpp15
-rw-r--r--indra/llmath/llvolumemgr.h1
-rw-r--r--indra/llmath/llvolumeoctree.cpp256
-rw-r--r--indra/llmath/llvolumeoctree.h134
-rw-r--r--indra/llmath/m4math.cpp138
-rw-r--r--indra/llmath/m4math.h34
-rw-r--r--indra/llmath/tests/llbbox_test.cpp2
-rw-r--r--indra/llmath/tests/llquaternion_test.cpp2
-rw-r--r--indra/llmath/tests/v2math_test.cpp6
-rw-r--r--indra/llmath/tests/v3color_test.cpp6
-rw-r--r--indra/llmath/tests/v3dmath_test.cpp4
-rw-r--r--indra/llmath/tests/v3math_test.cpp8
-rw-r--r--indra/llmath/tests/v4color_test.cpp4
-rw-r--r--indra/llmath/tests/v4coloru_test.cpp2
-rw-r--r--indra/llmath/tests/v4math_test.cpp6
-rw-r--r--indra/llmath/v2math.cpp17
-rw-r--r--indra/llmath/v2math.h11
-rw-r--r--indra/llmath/v3color.h10
-rw-r--r--indra/llmath/v3dmath.h10
-rw-r--r--indra/llmath/v3math.cpp22
-rw-r--r--indra/llmath/v3math.h27
-rw-r--r--indra/llmath/v4color.h26
-rw-r--r--indra/llmath/v4coloru.h4
-rw-r--r--indra/llmath/v4math.h8
-rw-r--r--indra/llmath/xform.h4
-rw-r--r--indra/llmessage/llassetstorage.cpp25
-rw-r--r--indra/llmessage/llavatarnamecache.cpp14
-rw-r--r--indra/llmessage/llcurl.cpp203
-rw-r--r--indra/llmessage/llcurl.h3
-rw-r--r--indra/llmessage/lldatapacker.h5
-rw-r--r--indra/llmessage/llhttpassetstorage.cpp8
-rw-r--r--indra/llmessage/llsdmessagebuilder.cpp1
-rw-r--r--indra/llmessage/lltemplatemessagebuilder.cpp1
-rw-r--r--indra/llmessage/lltemplatemessagereader.cpp1
-rw-r--r--indra/llmessage/lltransfermanager.cpp2
-rw-r--r--indra/llmessage/lltransfersourceasset.cpp1
-rw-r--r--indra/llmessage/tests/commtest.h70
-rw-r--r--indra/llmessage/tests/llsdmessage_test.cpp1
-rw-r--r--indra/llmessage/tests/test_llsdmessage_peer.py54
-rw-r--r--indra/llmessage/tests/testrunner.py112
-rw-r--r--indra/llplugin/CMakeLists.txt27
-rw-r--r--indra/llplugin/llpluginclassmedia.cpp101
-rw-r--r--indra/llplugin/llpluginclassmedia.h12
-rw-r--r--indra/llprimitive/CMakeLists.txt20
-rw-r--r--indra/llprimitive/llmodel.cpp2299
-rw-r--r--indra/llprimitive/llmodel.h255
-rw-r--r--indra/llprimitive/llprimitive.cpp17
-rw-r--r--indra/llprimitive/llprimitive.h3
-rw-r--r--indra/llrender/llfontgl.cpp3
-rw-r--r--indra/llrender/llgl.cpp205
-rw-r--r--indra/llrender/llgl.h81
-rw-r--r--indra/llrender/llglheaders.h123
-rw-r--r--indra/llrender/llglslshader.cpp41
-rw-r--r--indra/llrender/llglslshader.h3
-rw-r--r--indra/llrender/llglstates.h32
-rw-r--r--indra/llrender/llimagegl.cpp1
-rw-r--r--indra/llrender/llrender.cpp224
-rw-r--r--indra/llrender/llrender.h39
-rw-r--r--indra/llrender/llrendertarget.cpp265
-rw-r--r--indra/llrender/llrendertarget.h24
-rw-r--r--indra/llrender/llshadermgr.cpp81
-rw-r--r--indra/llrender/llvertexbuffer.cpp299
-rw-r--r--indra/llrender/llvertexbuffer.h64
-rw-r--r--indra/llui/CMakeLists.txt18
-rw-r--r--indra/llui/llbutton.h3
-rw-r--r--indra/llui/llcombobox.cpp4
-rw-r--r--indra/llui/llcombobox.h1
-rw-r--r--indra/llui/llflatlistview.cpp3
-rw-r--r--indra/llui/llflatlistview.h3
-rw-r--r--indra/llui/llfloaterreg.h6
-rw-r--r--indra/llui/llfocusmgr.cpp33
-rw-r--r--indra/llui/llfocusmgr.h11
-rw-r--r--indra/llui/lliconctrl.h1
-rw-r--r--indra/llui/lllineeditor.cpp6
-rw-r--r--indra/llui/lllineeditor.h1
-rw-r--r--indra/llui/llloadingindicator.cpp67
-rw-r--r--indra/llui/llloadingindicator.h31
-rw-r--r--indra/llui/llmultislider.cpp1
-rw-r--r--indra/llui/llnotifications.cpp2
-rw-r--r--indra/llui/llpanel.h1
-rw-r--r--indra/llui/llprogressbar.cpp1
-rw-r--r--indra/llui/llprogressbar.h3
-rw-r--r--indra/llui/llslider.h1
-rw-r--r--indra/llui/llstyle.cpp2
-rw-r--r--indra/llui/llstyle.h5
-rw-r--r--indra/llui/lltextbase.cpp236
-rw-r--r--indra/llui/lltextbase.h4
-rw-r--r--indra/llui/lltexteditor.cpp6
-rw-r--r--indra/llui/lltransutil.cpp5
-rw-r--r--indra/llui/llui.cpp103
-rw-r--r--indra/llui/llui.h84
-rw-r--r--indra/llui/lluiimage.cpp12
-rw-r--r--indra/llui/lluiimage.h17
-rw-r--r--indra/llui/llview.cpp14
-rw-r--r--indra/llui/llview.h9
-rw-r--r--indra/llui/llviewborder.cpp1
-rw-r--r--indra/llui/llwindowshade.h1
-rw-r--r--indra/llui/tests/llurlentry_stub.cpp36
-rw-r--r--indra/llui/tests/llurlentry_test.cpp16
-rw-r--r--indra/llui/tests/llurlmatch_test.cpp54
-rw-r--r--indra/llvfs/CMakeLists.txt35
-rw-r--r--indra/llvfs/lldir.cpp6
-rw-r--r--indra/llvfs/lldir.h25
-rw-r--r--indra/llvfs/lldir_linux.cpp68
-rw-r--r--indra/llvfs/lldir_linux.h1
-rw-r--r--indra/llvfs/lldir_mac.cpp99
-rw-r--r--indra/llvfs/lldir_mac.h2
-rw-r--r--indra/llvfs/lldir_solaris.cpp62
-rw-r--r--indra/llvfs/lldir_solaris.h1
-rw-r--r--indra/llvfs/lldir_win32.cpp61
-rw-r--r--indra/llvfs/lldir_win32.h3
-rw-r--r--indra/llvfs/lldiriterator.cpp4
-rw-r--r--indra/llvfs/llvfile.cpp4
-rw-r--r--indra/llvfs/llvfs.cpp10
-rw-r--r--indra/llvfs/tests/lldir_test.cpp38
-rw-r--r--indra/llwindow/llkeyboardheadless.cpp25
-rw-r--r--indra/llwindow/llwindowmacosx.cpp160
-rw-r--r--indra/llwindow/llwindowmacosx.h3
-rw-r--r--indra/llxml/CMakeLists.txt36
-rw-r--r--indra/llxml/llcontrol.cpp6
-rw-r--r--indra/llxuixml/llinitparam.cpp105
-rw-r--r--indra/llxuixml/llinitparam.h1183
-rw-r--r--indra/llxuixml/lltrans.cpp51
-rw-r--r--indra/llxuixml/lltrans.h12
-rw-r--r--indra/llxuixml/llxuiparser.h3
-rw-r--r--indra/lscript/lscript_library/lscript_library.cpp3
-rw-r--r--indra/media_plugins/webkit/media_plugin_webkit.cpp61
-rw-r--r--indra/media_plugins/winmmshim/forwarding_api.cpp173
-rw-r--r--indra/media_plugins/winmmshim/forwarding_api.h1
-rw-r--r--indra/media_plugins/winmmshim/winmm_shim.cpp22
-rw-r--r--indra/newview/CMakeLists.txt43
-rw-r--r--indra/newview/English.lproj/InfoPlist.strings4
-rw-r--r--indra/newview/Info-SecondLife.plist2
-rw-r--r--indra/newview/app_settings/high_graphics.xml21
-rw-r--r--indra/newview/app_settings/low_graphics.xml25
-rw-r--r--indra/newview/app_settings/mid_graphics.xml21
-rw-r--r--indra/newview/app_settings/settings.xml723
-rw-r--r--indra/newview/app_settings/settings_crash_behavior.xml2
-rw-r--r--indra/newview/app_settings/settings_minimal.xml83
-rw-r--r--indra/newview/app_settings/settings_per_account.xml11
-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.glsl30
-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.glsl14
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/alphaSkinnedV.glsl112
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl62
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/attachmentShadowF.glsl18
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/attachmentShadowV.glsl27
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/avatarAlphaF.glsl68
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/avatarAlphaV.glsl71
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/avatarF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/avatarShadowF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/avatarShadowV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/avatarV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/blurLightF.glsl37
-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.glsl37
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/bumpV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/diffuseF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/diffuseSkinnedV.glsl33
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/diffuseV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/fullbrightV.glsl2
-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.glsl4
-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.glsl3
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl63
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/multiPointLightV.glsl (renamed from indra/newview/app_settings/shaders/class2/deferred/blurLightV.glsl)13
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/pointLightV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl140
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/postDeferredNoDoFF.glsl24
-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/softenLightF.glsl12
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/softenLightV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/sunLightF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOF.glsl78
-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/glowExtractV.glsl1
-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.glsl17
-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.glsl3
-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.glsl39
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/fullbrightShinyV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/fullbrightShinyWaterF.glsl15
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/fullbrightSkinnedV.glsl37
-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.glsl39
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/shinyV.glsl4
-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.glsl39
-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.glsl16
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/alphaSkinnedV.glsl115
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl61
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/avatarAlphaF.glsl98
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/avatarAlphaV.glsl60
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/blurLightF.glsl81
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/edgeF.glsl4
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/edgeV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/postDeferredF.glsl59
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/postDeferredV.glsl17
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl2
-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/sunLightF.glsl5
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl80
-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.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/lightFullbrightF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyWaterF.glsl31
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/lightFullbrightWaterF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/lightShinyF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/lightShinyWaterF.glsl2
-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.glsl2
-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/shinyV.glsl2
-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.glsl4
-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/ultra_graphics.xml21
-rw-r--r--indra/newview/app_settings/windlight/postprocesseffects.xml1
-rw-r--r--indra/newview/character/avatar_lad.xml88
-rw-r--r--indra/newview/featuretable.txt39
-rw-r--r--indra/newview/featuretable_linux.txt31
-rw-r--r--indra/newview/featuretable_mac.txt86
-rw-r--r--indra/newview/featuretable_xp.txt30
-rw-r--r--indra/newview/gpu_table.txt805
-rw-r--r--indra/newview/groupchatlistener.cpp76
-rw-r--r--indra/newview/groupchatlistener.h40
-rw-r--r--indra/newview/installers/windows/installer_template.nsi20
-rw-r--r--indra/newview/installers/windows/lang_en-us.nsibin7162 -> 7542 bytes
-rw-r--r--indra/newview/licenses-mac.txt510
-rw-r--r--indra/newview/licenses-win32.txt69
-rwxr-xr-xindra/newview/linux_tools/wrapper.sh34
-rw-r--r--indra/newview/llaccountingquotamanager.cpp258
-rw-r--r--indra/newview/llaccountingquotamanager.h55
-rw-r--r--indra/newview/llagent.cpp169
-rw-r--r--indra/newview/llagent.h38
-rw-r--r--indra/newview/llagentcamera.cpp12
-rw-r--r--indra/newview/llagentlistener.cpp453
-rw-r--r--indra/newview/llagentlistener.h28
-rw-r--r--indra/newview/llagentpilot.cpp195
-rw-r--r--indra/newview/llagentpilot.h47
-rw-r--r--indra/newview/llappearancemgr.cpp75
-rw-r--r--indra/newview/llappearancemgr.h9
-rw-r--r--indra/newview/llappviewer.cpp235
-rw-r--r--indra/newview/llappviewerlinux.cpp5
-rw-r--r--indra/newview/llappviewerwin32.cpp51
-rw-r--r--indra/newview/llassetuploadresponders.cpp765
-rw-r--r--indra/newview/llassetuploadresponders.h53
-rwxr-xr-x[-rw-r--r--]indra/newview/llavataractions.cpp10
-rw-r--r--indra/newview/llbottomtray.cpp584
-rw-r--r--indra/newview/llbottomtray.h95
-rw-r--r--indra/newview/llcallbacklist.cpp65
-rw-r--r--indra/newview/llcallbacklist.h9
-rw-r--r--indra/newview/llchatbar.cpp6
-rw-r--r--indra/newview/llchiclet.cpp7
-rw-r--r--indra/newview/llcofwearables.cpp5
-rwxr-xr-x[-rw-r--r--]indra/newview/llcommandhandler.cpp0
-rw-r--r--indra/newview/lldateutil.cpp4
-rw-r--r--indra/newview/lldebugview.cpp13
-rw-r--r--indra/newview/lldrawable.cpp220
-rw-r--r--indra/newview/lldrawable.h92
-rw-r--r--indra/newview/lldrawpool.cpp5
-rw-r--r--indra/newview/lldrawpool.h10
-rw-r--r--indra/newview/lldrawpoolalpha.cpp105
-rw-r--r--indra/newview/lldrawpoolavatar.cpp1004
-rw-r--r--indra/newview/lldrawpoolavatar.h109
-rw-r--r--indra/newview/lldrawpoolbump.cpp152
-rw-r--r--indra/newview/lldrawpoolbump.h11
-rw-r--r--indra/newview/lldrawpoolsky.cpp7
-rw-r--r--indra/newview/lldrawpooltree.cpp15
-rw-r--r--indra/newview/lldrawpoolwlsky.cpp2
-rw-r--r--indra/newview/lleventnotifier.h1
-rw-r--r--indra/newview/llface.cpp1194
-rw-r--r--indra/newview/llface.h51
-rw-r--r--indra/newview/llfasttimerview.cpp408
-rw-r--r--indra/newview/llfasttimerview.h1
-rw-r--r--indra/newview/llfeaturemanager.cpp42
-rw-r--r--indra/newview/llfilepicker.cpp70
-rw-r--r--indra/newview/llfilepicker.h6
-rw-r--r--indra/newview/llfirstuse.cpp2
-rw-r--r--indra/newview/llflexibleobject.cpp22
-rw-r--r--indra/newview/llflexibleobject.h2
-rw-r--r--indra/newview/llfloateranimpreview.cpp2
-rw-r--r--indra/newview/llfloaterbuyland.cpp14
-rw-r--r--indra/newview/llfloaterchat.cpp5
-rw-r--r--indra/newview/llfloaterhardwaresettings.cpp5
-rw-r--r--indra/newview/llfloaterimagepreview.cpp139
-rw-r--r--indra/newview/llfloaterland.cpp1
-rw-r--r--indra/newview/llfloaterland.h5
-rw-r--r--indra/newview/llfloatermodelpreview.cpp5037
-rw-r--r--indra/newview/llfloatermodelpreview.h431
-rw-r--r--indra/newview/llfloatermodelwizard.cpp679
-rw-r--r--indra/newview/llfloatermodelwizard.h113
-rwxr-xr-x[-rw-r--r--]indra/newview/llfloaterpreference.cpp202
-rw-r--r--indra/newview/llfloaterpreference.h15
-rw-r--r--indra/newview/llfloaterregiondebugconsole.cpp7
-rw-r--r--indra/newview/llfloaterregiondebugconsole.h5
-rw-r--r--indra/newview/llfloaterregioninfo.cpp87
-rw-r--r--indra/newview/llfloaterregioninfo.h5
-rw-r--r--indra/newview/llfloatersearch.cpp7
-rw-r--r--indra/newview/llfloatersidetraytab.cpp3
-rw-r--r--indra/newview/llfloatersnapshot.cpp1
-rw-r--r--indra/newview/llfloatersounddevices.cpp93
-rw-r--r--indra/newview/llfloatersounddevices.h49
-rw-r--r--indra/newview/llfloatertools.cpp156
-rw-r--r--indra/newview/llfloateruipreview.cpp26
-rwxr-xr-x[-rw-r--r--]indra/newview/llfloaterworldmap.cpp20
-rw-r--r--indra/newview/llfolderview.cpp12
-rw-r--r--indra/newview/llfolderview.h1
-rw-r--r--indra/newview/llfolderviewitem.cpp2
-rw-r--r--indra/newview/llfolderviewitem.h1
-rw-r--r--indra/newview/llgesturelistener.cpp159
-rw-r--r--indra/newview/llgesturelistener.h52
-rw-r--r--indra/newview/llgesturemgr.cpp158
-rw-r--r--indra/newview/llgesturemgr.h17
-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/llhudeffectlookat.cpp4
-rw-r--r--indra/newview/llhudeffectpointat.cpp4
-rw-r--r--indra/newview/llhudicon.cpp42
-rw-r--r--indra/newview/llhudnametag.cpp31
-rw-r--r--indra/newview/llimview.cpp79
-rw-r--r--indra/newview/llimview.h19
-rw-r--r--indra/newview/llinventorybridge.cpp78
-rw-r--r--indra/newview/llinventorybridge.h35
-rw-r--r--indra/newview/llinventoryfilter.cpp10
-rw-r--r--indra/newview/llinventoryfilter.h11
-rw-r--r--indra/newview/llinventoryfunctions.cpp1
-rw-r--r--indra/newview/llinventoryicon.cpp3
-rw-r--r--indra/newview/llinventoryicon.h1
-rw-r--r--indra/newview/llinventoryitemslist.h1
-rw-r--r--indra/newview/llinventorymodel.cpp31
-rw-r--r--indra/newview/llinventorymodel.h5
-rw-r--r--indra/newview/llinventorymodelbackgroundfetch.cpp6
-rw-r--r--indra/newview/llinventoryobserver.cpp11
-rw-r--r--indra/newview/llinventoryobserver.h1
-rw-r--r--indra/newview/lllocationhistory.h1
-rw-r--r--indra/newview/lllogchat.cpp4
-rw-r--r--indra/newview/lllogininstance.cpp13
-rw-r--r--indra/newview/llmaniprotate.cpp2
-rw-r--r--indra/newview/llmanipscale.cpp42
-rw-r--r--indra/newview/llmanipscale.h3
-rw-r--r--indra/newview/llmediactrl.cpp20
-rw-r--r--indra/newview/llmeshrepository.cpp3870
-rw-r--r--indra/newview/llmeshrepository.h552
-rw-r--r--indra/newview/llnamelistctrl.h18
-rw-r--r--indra/newview/llnearbychat.cpp6
-rw-r--r--indra/newview/llnearbychatbar.cpp22
-rw-r--r--indra/newview/llnearbychatbar.h1
-rw-r--r--indra/newview/llnearbychatbarlistener.cpp100
-rw-r--r--indra/newview/llnearbychatbarlistener.h50
-rw-r--r--indra/newview/llnearbychathandler.cpp49
-rw-r--r--indra/newview/llnearbychathandler.h4
-rw-r--r--indra/newview/llnetmap.cpp14
-rw-r--r--indra/newview/llnotificationhandlerutil.cpp18
-rw-r--r--indra/newview/llnotificationmanager.h2
-rw-r--r--indra/newview/lloutputmonitorctrl.h1
-rw-r--r--indra/newview/llpanelavatar.cpp1
-rw-r--r--indra/newview/llpaneleditwearable.cpp15
-rw-r--r--indra/newview/llpanelface.cpp11
-rw-r--r--indra/newview/llpanelgroupgeneral.cpp1
-rw-r--r--indra/newview/llpanelgroupnotices.cpp1
-rw-r--r--indra/newview/llpanelgrouproles.cpp1
-rw-r--r--indra/newview/llpanellogin.cpp216
-rw-r--r--indra/newview/llpanellogin.h2
-rw-r--r--indra/newview/llpanelmaininventory.cpp43
-rw-r--r--indra/newview/llpanelmaininventory.h1
-rw-r--r--indra/newview/llpanelnearbymedia.cpp2
-rw-r--r--indra/newview/llpanelobject.cpp164
-rw-r--r--indra/newview/llpanelobject.h8
-rw-r--r--indra/newview/llpanelobjectinventory.cpp116
-rw-r--r--indra/newview/llpanelpeople.cpp5
-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/llpanelplaces.cpp9
-rw-r--r--indra/newview/llpanelprimmediacontrols.cpp5
-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/llpanelvoicedevicesettings.cpp72
-rw-r--r--indra/newview/llpanelvoicedevicesettings.h3
-rw-r--r--indra/newview/llpanelvolume.cpp227
-rw-r--r--indra/newview/llpanelvolume.h19
-rw-r--r--indra/newview/llphysicsmotion.cpp404
-rw-r--r--indra/newview/llphysicsshapebuilderutil.cpp210
-rw-r--r--indra/newview/llphysicsshapebuilderutil.h138
-rw-r--r--indra/newview/llpolymesh.cpp142
-rw-r--r--indra/newview/llpolymesh.h12
-rw-r--r--indra/newview/llpolymorph.cpp13
-rw-r--r--indra/newview/llpreviewgesture.cpp1
-rw-r--r--indra/newview/llpreviewtexture.cpp34
-rw-r--r--indra/newview/llsceneview.cpp429
-rw-r--r--indra/newview/llsceneview.h48
-rw-r--r--indra/newview/llselectmgr.cpp533
-rw-r--r--indra/newview/llselectmgr.h16
-rw-r--r--indra/newview/llsidepaneliteminfo.cpp1
-rw-r--r--indra/newview/llsidetray.cpp160
-rw-r--r--indra/newview/llsidetray.h4
-rw-r--r--indra/newview/llsidetraylistener.cpp21
-rw-r--r--indra/newview/llsidetraylistener.h21
-rw-r--r--indra/newview/llspatialpartition.cpp1664
-rw-r--r--indra/newview/llspatialpartition.h107
-rw-r--r--indra/newview/llspeakbutton.cpp20
-rw-r--r--indra/newview/llspeakbutton.h5
-rw-r--r--indra/newview/llspeakers.cpp2
-rw-r--r--indra/newview/llsprite.cpp9
-rw-r--r--indra/newview/llstartup.cpp47
-rw-r--r--indra/newview/llsurfacepatch.cpp6
-rw-r--r--indra/newview/llsyswellwindow.cpp2
-rw-r--r--indra/newview/lltexturecache.cpp8
-rw-r--r--indra/newview/lltexturectrl.cpp10
-rw-r--r--indra/newview/lltooldraganddrop.cpp296
-rw-r--r--indra/newview/lltooldraganddrop.h12
-rw-r--r--indra/newview/lltoolgrab.cpp99
-rw-r--r--indra/newview/lltoolgrab.h7
-rw-r--r--indra/newview/lltoolpie.cpp10
-rw-r--r--indra/newview/lltoolpie.h1
-rw-r--r--indra/newview/lltranslate.cpp6
-rw-r--r--indra/newview/llviewerassetstats.cpp17
-rw-r--r--indra/newview/llviewerassettype.cpp2
-rw-r--r--indra/newview/llviewercamera.cpp21
-rw-r--r--indra/newview/llviewerchat.cpp34
-rw-r--r--indra/newview/llviewerchat.h6
-rw-r--r--indra/newview/llviewercontrol.cpp84
-rw-r--r--indra/newview/llviewerdisplay.cpp33
-rw-r--r--indra/newview/llviewerfloaterreg.cpp33
-rw-r--r--indra/newview/llviewerfoldertype.cpp3
-rw-r--r--indra/newview/llviewerinventory.cpp35
-rw-r--r--indra/newview/llviewerjointmesh.cpp295
-rw-r--r--indra/newview/llviewerjointmesh_sse.cpp6
-rw-r--r--indra/newview/llviewerjointmesh_sse2.cpp6
-rw-r--r--indra/newview/llviewerjointmesh_vec.cpp2
-rw-r--r--indra/newview/llviewerjoystick.cpp2
-rw-r--r--indra/newview/llviewerkeyboard.h1
-rw-r--r--indra/newview/llviewermedia.cpp69
-rw-r--r--indra/newview/llviewermedia.h5
-rw-r--r--indra/newview/llviewermenu.cpp113
-rw-r--r--indra/newview/llviewermenufile.cpp557
-rw-r--r--indra/newview/llviewermenufile.h135
-rw-r--r--indra/newview/llviewermessage.cpp64
-rw-r--r--indra/newview/llviewerobject.cpp310
-rw-r--r--indra/newview/llviewerobject.h66
-rw-r--r--indra/newview/llviewerobjectlist.cpp375
-rw-r--r--indra/newview/llviewerobjectlist.h27
-rw-r--r--indra/newview/llviewerparcelmgr.cpp7
-rw-r--r--indra/newview/llviewerparceloverlay.cpp4
-rw-r--r--indra/newview/llviewerpartsim.cpp4
-rw-r--r--indra/newview/llviewerprecompiledheaders.h7
-rw-r--r--indra/newview/llviewerregion.cpp335
-rw-r--r--indra/newview/llviewerregion.h86
-rw-r--r--indra/newview/llviewershadermgr.cpp349
-rw-r--r--indra/newview/llviewershadermgr.h17
-rw-r--r--indra/newview/llviewerstats.cpp2
-rw-r--r--indra/newview/llviewerstats.h31
-rw-r--r--indra/newview/llviewertexteditor.cpp24
-rw-r--r--indra/newview/llviewertexture.cpp20
-rw-r--r--indra/newview/llviewertexturelist.cpp183
-rw-r--r--indra/newview/llviewertexturelist.h21
-rw-r--r--indra/newview/llviewerwindow.cpp359
-rw-r--r--indra/newview/llviewerwindow.h18
-rw-r--r--indra/newview/llvoavatar.cpp438
-rw-r--r--indra/newview/llvoavatar.h37
-rw-r--r--indra/newview/llvoavatarself.cpp14
-rw-r--r--indra/newview/llvoavatarself.h4
-rw-r--r--indra/newview/llvocache.cpp14
-rw-r--r--indra/newview/llvograss.cpp15
-rw-r--r--indra/newview/llvoground.cpp9
-rw-r--r--indra/newview/llvoicechannel.cpp10
-rw-r--r--indra/newview/llvoicevivox.cpp11
-rw-r--r--indra/newview/llvopartgroup.cpp14
-rw-r--r--indra/newview/llvopartgroup.h2
-rw-r--r--indra/newview/llvosky.cpp48
-rw-r--r--indra/newview/llvosurfacepatch.cpp97
-rw-r--r--indra/newview/llvosurfacepatch.h2
-rw-r--r--indra/newview/llvotextbubble.cpp33
-rw-r--r--indra/newview/llvotree.cpp44
-rw-r--r--indra/newview/llvotree.h2
-rw-r--r--indra/newview/llvovolume.cpp928
-rw-r--r--indra/newview/llvovolume.h53
-rw-r--r--indra/newview/llvowater.cpp34
-rw-r--r--indra/newview/llvowater.h2
-rw-r--r--indra/newview/llvowlsky.cpp2
-rw-r--r--indra/newview/llwaterparammanager.cpp11
-rw-r--r--indra/newview/llwearableitemslist.h1
-rw-r--r--indra/newview/llwearabletype.cpp4
-rw-r--r--indra/newview/llwlparammanager.cpp11
-rw-r--r--indra/newview/llworld.cpp333
-rw-r--r--indra/newview/llxmlrpclistener.cpp7
-rw-r--r--indra/newview/pipeline.cpp2022
-rw-r--r--indra/newview/pipeline.h41
-rw-r--r--indra/newview/res/resource.h1
-rw-r--r--indra/newview/res/viewerRes.rc4
-rw-r--r--indra/newview/skins/default/colors.xml28
-rw-r--r--indra/newview/skins/default/textures/icons/Edit_Wrench.pngbin3713 -> 3000 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Inv_Mesh.pngbin0 -> 3263 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/check_mark.pngbin0 -> 3166 bytes
-rw-r--r--indra/newview/skins/default/textures/model_wizard/divider_line.pngbin0 -> 2815 bytes
-rw-r--r--indra/newview/skins/default/textures/model_wizard/progress_bar_bg.pngbin0 -> 3180 bytes
-rw-r--r--indra/newview/skins/default/textures/model_wizard/progress_light.pngbin0 -> 2979 bytes
-rw-r--r--indra/newview/skins/default/textures/textures.xml25
-rw-r--r--indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Left_Disabled.pngbin0 -> 3576 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Left_Off.pngbin0 -> 4309 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Left_Over.pngbin0 -> 4272 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Left_Press.pngbin0 -> 4278 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Middle_Disabled.pngbin0 -> 3425 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Middle_Off.pngbin0 -> 4151 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Middle_Over.pngbin0 -> 4137 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Middle_Press.pngbin0 -> 4200 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Right_Disabled.pngbin0 -> 3169 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Right_Off.pngbin0 -> 3845 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Right_Over.pngbin0 -> 3867 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Right_Press.pngbin0 -> 3915 bytes
-rw-r--r--indra/newview/skins/default/xui/da/floater_about_land.xml10
-rw-r--r--indra/newview/skins/default/xui/da/floater_buy_currency.xml3
-rw-r--r--indra/newview/skins/default/xui/da/floater_env_settings.xml9
-rw-r--r--indra/newview/skins/default/xui/da/floater_map.xml3
-rw-r--r--indra/newview/skins/default/xui/da/floater_tools.xml2
-rw-r--r--indra/newview/skins/default/xui/da/floater_tos.xml2
-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.xml2
-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_gear_default.xml1
-rw-r--r--indra/newview/skins/default/xui/da/menu_object.xml4
-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.xml8
-rw-r--r--indra/newview/skins/default/xui/da/notifications.xml51
-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.xml2
-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_script_ed.xml3
-rw-r--r--indra/newview/skins/default/xui/da/strings.xml359
-rw-r--r--indra/newview/skins/default/xui/de/floater_about_land.xml8
-rw-r--r--indra/newview/skins/default/xui/de/floater_beacons.xml1
-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_postcard.xml16
-rw-r--r--indra/newview/skins/default/xui/de/floater_sell_land.xml18
-rw-r--r--indra/newview/skins/default/xui/de/floater_top_objects.xml23
-rw-r--r--indra/newview/skins/default/xui/de/floater_tos.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_water.xml3
-rw-r--r--indra/newview/skins/default/xui/de/floater_wearable_save_as.xml11
-rw-r--r--indra/newview/skins/default/xui/de/language_settings.xml1
-rw-r--r--indra/newview/skins/default/xui/de/menu_avatar_self.xml1
-rw-r--r--indra/newview/skins/default/xui/de/menu_bottomtray.xml2
-rw-r--r--indra/newview/skins/default/xui/de/menu_inventory.xml1
-rw-r--r--indra/newview/skins/default/xui/de/menu_inventory_add.xml1
-rw-r--r--indra/newview/skins/default/xui/de/menu_media_ctrl.xml6
-rw-r--r--indra/newview/skins/default/xui/de/menu_outfit_gear.xml5
-rw-r--r--indra/newview/skins/default/xui/de/menu_viewer.xml1
-rw-r--r--indra/newview/skins/default/xui/de/notifications.xml15
-rw-r--r--indra/newview/skins/default/xui/de/panel_edit_physics.xml14
-rw-r--r--indra/newview/skins/default/xui/de/panel_edit_wearable.xml6
-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_preferences_chat.xml4
-rw-r--r--indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml4
-rw-r--r--indra/newview/skins/default/xui/de/panel_preferences_privacy.xml2
-rw-r--r--indra/newview/skins/default/xui/de/panel_preferences_sound.xml4
-rw-r--r--indra/newview/skins/default/xui/de/panel_scrolling_param_base.xml4
-rw-r--r--indra/newview/skins/default/xui/de/strings.xml123
-rw-r--r--indra/newview/skins/default/xui/en/floater_about.xml8
-rw-r--r--indra/newview/skins/default/xui/en/floater_buy_contents.xml2
-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_hardware_settings.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_import_collada.xml42
-rw-r--r--indra/newview/skins/default/xui/en/floater_inventory_view_finder.xml29
-rw-r--r--indra/newview/skins/default/xui/en/floater_model_preview.xml547
-rw-r--r--indra/newview/skins/default/xui/en/floater_model_wizard.xml1039
-rw-r--r--indra/newview/skins/default/xui/en/floater_postcard.xml1
-rw-r--r--indra/newview/skins/default/xui/en/floater_preview_gesture.xml4
-rw-r--r--indra/newview/skins/default/xui/en/floater_price_for_listing.xml81
-rw-r--r--indra/newview/skins/default/xui/en/floater_script_debug_panel.xml1
-rw-r--r--indra/newview/skins/default/xui/en/floater_sell_land.xml33
-rw-r--r--indra/newview/skins/default/xui/en/floater_snapshot.xml6
-rw-r--r--indra/newview/skins/default/xui/en/floater_sound_devices.xml47
-rw-r--r--indra/newview/skins/default/xui/en/floater_tools.xml291
-rw-r--r--indra/newview/skins/default/xui/en/floater_top_objects.xml12
-rw-r--r--indra/newview/skins/default/xui/en/floater_windlight_options.xml4
-rw-r--r--indra/newview/skins/default/xui/en/language_settings.xml1
-rw-r--r--indra/newview/skins/default/xui/en/main_view.xml16
-rw-r--r--indra/newview/skins/default/xui/en/menu_inventory_add.xml26
-rw-r--r--indra/newview/skins/default/xui/en/menu_login.xml6
-rw-r--r--indra/newview/skins/default/xui/en/menu_model_import_gear_default.xml79
-rw-r--r--indra/newview/skins/default/xui/en/menu_viewer.xml133
-rw-r--r--indra/newview/skins/default/xui/en/notifications.xml136
-rw-r--r--indra/newview/skins/default/xui/en/panel_bottomtray.xml412
-rw-r--r--indra/newview/skins/default/xui/en/panel_cof_wearables.xml3
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_notices.xml10
-rw-r--r--indra/newview/skins/default/xui/en/panel_media_settings_general.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_place_profile.xml2
-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.xml10
-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.xml32
-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.xml92
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_sound.xml188
-rw-r--r--indra/newview/skins/default/xui/en/panel_region_general.xml16
-rw-r--r--indra/newview/skins/default/xui/en/panel_sound_devices.xml155
-rw-r--r--indra/newview/skins/default/xui/en/strings.xml92
-rw-r--r--indra/newview/skins/default/xui/en/widgets/avatar_icon.xml1
-rw-r--r--indra/newview/skins/default/xui/en/widgets/chiclet_im_p2p.xml1
-rw-r--r--indra/newview/skins/default/xui/en/widgets/loading_indicator.xml20
-rw-r--r--indra/newview/skins/default/xui/en/widgets/scroll_bar.xml18
-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_beacons.xml1
-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.xml5
-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_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_preview_gesture.xml18
-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_sound_devices.xml7
-rw-r--r--indra/newview/skins/default/xui/es/floater_tools.xml52
-rw-r--r--indra/newview/skins/default/xui/es/floater_top_objects.xml13
-rw-r--r--indra/newview/skins/default/xui/es/floater_tos.xml2
-rw-r--r--indra/newview/skins/default/xui/es/language_settings.xml1
-rw-r--r--indra/newview/skins/default/xui/es/menu_avatar_self.xml1
-rw-r--r--indra/newview/skins/default/xui/es/menu_bottomtray.xml2
-rw-r--r--indra/newview/skins/default/xui/es/menu_favorites.xml2
-rw-r--r--indra/newview/skins/default/xui/es/menu_inspect_avatar_gear.xml2
-rw-r--r--indra/newview/skins/default/xui/es/menu_inventory.xml1
-rw-r--r--indra/newview/skins/default/xui/es/menu_inventory_add.xml3
-rw-r--r--indra/newview/skins/default/xui/es/menu_media_ctrl.xml6
-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_outfit_gear.xml5
-rw-r--r--indra/newview/skins/default/xui/es/menu_teleport_history_item.xml2
-rw-r--r--indra/newview/skins/default/xui/es/menu_viewer.xml19
-rw-r--r--indra/newview/skins/default/xui/es/notifications.xml69
-rw-r--r--indra/newview/skins/default/xui/es/panel_edit_physics.xml14
-rw-r--r--indra/newview/skins/default/xui/es/panel_edit_wearable.xml6
-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_preferences_advanced.xml2
-rw-r--r--indra/newview/skins/default/xui/es/panel_preferences_chat.xml4
-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.xml20
-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.xml6
-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_region_terrain.xml2
-rw-r--r--indra/newview/skins/default/xui/es/panel_scrolling_param_base.xml4
-rw-r--r--indra/newview/skins/default/xui/es/panel_sound_devices.xml19
-rw-r--r--indra/newview/skins/default/xui/es/strings.xml280
-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_beacons.xml1
-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_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_tos.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_wearable_save_as.xml11
-rw-r--r--indra/newview/skins/default/xui/fr/language_settings.xml1
-rw-r--r--indra/newview/skins/default/xui/fr/menu_avatar_self.xml1
-rw-r--r--indra/newview/skins/default/xui/fr/menu_bottomtray.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/menu_inventory.xml1
-rw-r--r--indra/newview/skins/default/xui/fr/menu_inventory_add.xml3
-rw-r--r--indra/newview/skins/default/xui/fr/menu_media_ctrl.xml6
-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_outfit_gear.xml5
-rw-r--r--indra/newview/skins/default/xui/fr/menu_viewer.xml13
-rw-r--r--indra/newview/skins/default/xui/fr/notifications.xml62
-rw-r--r--indra/newview/skins/default/xui/fr/panel_edit_physics.xml14
-rw-r--r--indra/newview/skins/default/xui/fr/panel_edit_wearable.xml6
-rw-r--r--indra/newview/skins/default/xui/fr/panel_preferences_chat.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/panel_preferences_colors.xml7
-rw-r--r--indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml18
-rw-r--r--indra/newview/skins/default/xui/fr/panel_preferences_sound.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/panel_region_general.xml1
-rw-r--r--indra/newview/skins/default/xui/fr/panel_scrolling_param_base.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/panel_sound_devices.xml19
-rw-r--r--indra/newview/skins/default/xui/fr/strings.xml267
-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_display_name.xml18
-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_preview_gesture.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_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.xml4
-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.xml3
-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_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.xml12
-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.xml653
-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_display_name.xml18
-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.xml56
-rw-r--r--indra/newview/skins/default/xui/ja/floater_voice_controls.xml2
-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/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_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.xml12
-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.xml653
-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_windlight_options.xml6
-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.xml4
-rw-r--r--indra/newview/skins/default/xui/pl/floater_about_land.xml4
-rw-r--r--indra/newview/skins/default/xui/pl/floater_beacons.xml1
-rw-r--r--indra/newview/skins/default/xui/pl/floater_map.xml3
-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_tools.xml4
-rw-r--r--indra/newview/skins/default/xui/pl/floater_tos.xml2
-rw-r--r--indra/newview/skins/default/xui/pl/language_settings.xml1
-rw-r--r--indra/newview/skins/default/xui/pl/menu_attachment_self.xml2
-rw-r--r--indra/newview/skins/default/xui/pl/menu_avatar_self.xml3
-rw-r--r--indra/newview/skins/default/xui/pl/menu_bottomtray.xml2
-rw-r--r--indra/newview/skins/default/xui/pl/menu_inspect_avatar_gear.xml6
-rw-r--r--indra/newview/skins/default/xui/pl/menu_inspect_self_gear.xml39
-rw-r--r--indra/newview/skins/default/xui/pl/menu_inventory.xml1
-rw-r--r--indra/newview/skins/default/xui/pl/menu_inventory_add.xml1
-rw-r--r--indra/newview/skins/default/xui/pl/menu_inventory_gear_default.xml1
-rw-r--r--indra/newview/skins/default/xui/pl/menu_media_ctrl.xml6
-rw-r--r--indra/newview/skins/default/xui/pl/menu_object.xml4
-rw-r--r--indra/newview/skins/default/xui/pl/menu_outfit_gear.xml5
-rw-r--r--indra/newview/skins/default/xui/pl/menu_places_gear_folder.xml5
-rw-r--r--indra/newview/skins/default/xui/pl/menu_places_gear_landmark.xml5
-rw-r--r--indra/newview/skins/default/xui/pl/menu_viewer.xml13
-rw-r--r--indra/newview/skins/default/xui/pl/notifications.xml67
-rw-r--r--indra/newview/skins/default/xui/pl/panel_edit_physics.xml14
-rw-r--r--indra/newview/skins/default/xui/pl/panel_edit_wearable.xml6
-rw-r--r--indra/newview/skins/default/xui/pl/panel_group_notices.xml2
-rw-r--r--indra/newview/skins/default/xui/pl/panel_login.xml7
-rw-r--r--indra/newview/skins/default/xui/pl/panel_media_settings_security.xml3
-rw-r--r--indra/newview/skins/default/xui/pl/panel_nearby_media.xml2
-rw-r--r--indra/newview/skins/default/xui/pl/panel_people.xml2
-rw-r--r--indra/newview/skins/default/xui/pl/panel_preferences_chat.xml4
-rw-r--r--indra/newview/skins/default/xui/pl/panel_preferences_colors.xml10
-rw-r--r--indra/newview/skins/default/xui/pl/panel_preferences_graphics1.xml6
-rw-r--r--indra/newview/skins/default/xui/pl/panel_preferences_privacy.xml2
-rw-r--r--indra/newview/skins/default/xui/pl/panel_preferences_sound.xml6
-rw-r--r--indra/newview/skins/default/xui/pl/panel_profile.xml8
-rw-r--r--indra/newview/skins/default/xui/pl/panel_script_ed.xml3
-rw-r--r--indra/newview/skins/default/xui/pl/panel_scrolling_param_base.xml4
-rw-r--r--indra/newview/skins/default/xui/pl/sidepanel_item_info.xml4
-rw-r--r--indra/newview/skins/default/xui/pl/strings.xml488
-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_beacons.xml1
-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_device_settings.xml2
-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_pay.xml10
-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_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_tos.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_water.xml4
-rw-r--r--indra/newview/skins/default/xui/pt/floater_windlight_options.xml4
-rw-r--r--indra/newview/skins/default/xui/pt/language_settings.xml1
-rw-r--r--indra/newview/skins/default/xui/pt/menu_avatar_self.xml1
-rw-r--r--indra/newview/skins/default/xui/pt/menu_bottomtray.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/menu_inventory.xml1
-rw-r--r--indra/newview/skins/default/xui/pt/menu_inventory_add.xml3
-rw-r--r--indra/newview/skins/default/xui/pt/menu_media_ctrl.xml6
-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_outfit_gear.xml5
-rw-r--r--indra/newview/skins/default/xui/pt/menu_viewer.xml17
-rw-r--r--indra/newview/skins/default/xui/pt/notifications.xml62
-rw-r--r--indra/newview/skins/default/xui/pt/panel_edit_physics.xml14
-rw-r--r--indra/newview/skins/default/xui/pt/panel_edit_wearable.xml6
-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_preferences_chat.xml4
-rw-r--r--indra/newview/skins/default/xui/pt/panel_preferences_colors.xml5
-rw-r--r--indra/newview/skins/default/xui/pt/panel_preferences_graphics1.xml18
-rw-r--r--indra/newview/skins/default/xui/pt/panel_preferences_sound.xml4
-rw-r--r--indra/newview/skins/default/xui/pt/panel_region_general.xml1
-rw-r--r--indra/newview/skins/default/xui/pt/panel_scrolling_param_base.xml4
-rw-r--r--indra/newview/skins/default/xui/pt/panel_sound_devices.xml19
-rw-r--r--indra/newview/skins/default/xui/pt/strings.xml233
-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_day_cycle_options.xml95
-rw-r--r--indra/newview/skins/default/xui/zh/floater_display_name.xml18
-rw-r--r--indra/newview/skins/default/xui/zh/floater_env_settings.xml25
-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_water.xml70
-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_windlight_options.xml167
-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.xml48
-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.xml4454
-rw-r--r--indra/newview/skins/default/xui/zh/teleport_strings.xml80
-rw-r--r--indra/newview/skins/minimal/textures/bottomtray/Speak_Btn_Off.pngbin0 -> 993 bytes
-rw-r--r--indra/newview/skins/minimal/textures/bottomtray/Speak_Btn_Selected_Press.pngbin0 -> 1217 bytes
-rw-r--r--indra/newview/skins/minimal/textures/textures.xml4
-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.xml19
-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.xml1833
-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.xml39
-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/en/main_view.xml15
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_attachment_other.xml8
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_avatar_other.xml8
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_inspect_avatar_gear.xml9
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_people_nearby.xml10
-rw-r--r--indra/newview/skins/minimal/xui/en/notification_visibility.xml4
-rw-r--r--indra/newview/skins/minimal/xui/en/panel_adhoc_control_panel.xml35
-rw-r--r--indra/newview/skins/minimal/xui/en/panel_bottomtray.xml124
-rw-r--r--indra/newview/skins/minimal/xui/en/panel_im_control_panel.xml97
-rw-r--r--indra/newview/skins/minimal/xui/en/panel_people.xml21
-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_favorites.xml2
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_inspect_avatar_gear.xml3
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_teleport_history_item.xml2
-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/pl/floater_camera.xml65
-rw-r--r--indra/newview/skins/minimal/xui/pl/floater_help_browser.xml9
-rw-r--r--indra/newview/skins/minimal/xui/pl/floater_media_browser.xml30
-rw-r--r--indra/newview/skins/minimal/xui/pl/floater_nearby_chat.xml4
-rw-r--r--indra/newview/skins/minimal/xui/pl/floater_web_content.xml14
-rw-r--r--indra/newview/skins/minimal/xui/pl/inspect_avatar.xml24
-rw-r--r--indra/newview/skins/minimal/xui/pl/inspect_object.xml41
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_add_wearable_gear.xml6
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_attachment_other.xml17
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_attachment_self.xml16
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_avatar_icon.xml7
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_avatar_other.xml16
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_avatar_self.xml31
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_bottomtray.xml17
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_cof_attachment.xml4
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_cof_body_part.xml5
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_cof_clothing.xml6
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_cof_gear.xml5
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_edit.xml12
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_favorites.xml10
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_gesture_gear.xml10
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_group_plus.xml5
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_hide_navbar.xml6
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_im_well_button.xml4
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_imchiclet_adhoc.xml4
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_imchiclet_group.xml6
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_imchiclet_p2p.xml7
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_inspect_avatar_gear.xml21
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_inspect_object_gear.xml18
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_inspect_self_gear.xml31
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_inv_offer_chiclet.xml4
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_inventory.xml84
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_inventory_add.xml33
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_inventory_gear_default.xml17
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_land.xml9
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_landmark.xml7
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_login.xml24
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_mini_map.xml11
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_navbar.xml11
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_nearby_chat.xml9
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_notification_well_button.xml4
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_object.xml29
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_object_icon.xml5
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_outfit_gear.xml27
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_outfit_tab.xml9
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_participant_list.xml21
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_people_friends_view_sort.xml8
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_people_groups.xml8
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_people_groups_view_sort.xml5
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_people_nearby.xml13
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_people_nearby_multiselect.xml10
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_people_nearby_view_sort.xml8
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_people_recent_view_sort.xml7
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_picks.xml8
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_picks_plus.xml5
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_place.xml7
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_place_add_button.xml5
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_places_gear_folder.xml16
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_places_gear_landmark.xml19
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_profile_overflow.xml12
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_save_outfit.xml5
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_script_chiclet.xml4
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_slurl.xml6
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_teleport_history_gear.xml6
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_teleport_history_item.xml6
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_teleport_history_tab.xml5
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_text_editor.xml8
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_topinfobar.xml7
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_url_agent.xml6
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_url_group.xml6
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_url_http.xml7
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_url_inventory.xml6
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_url_map.xml6
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_url_objectim.xml8
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_url_parcel.xml6
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_url_slapp.xml5
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_url_slurl.xml7
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_url_teleport.xml6
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_viewer.xml14
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_wearable_list_item.xml14
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_wearing_gear.xml5
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_wearing_tab.xml6
-rw-r--r--indra/newview/skins/minimal/xui/pl/notifications.xml2907
-rw-r--r--indra/newview/skins/minimal/xui/pl/panel_adhoc_control_panel.xml14
-rw-r--r--indra/newview/skins/minimal/xui/pl/panel_bottomtray.xml39
-rw-r--r--indra/newview/skins/minimal/xui/pl/panel_group_control_panel.xml17
-rw-r--r--indra/newview/skins/minimal/xui/pl/panel_im_control_panel.xml29
-rw-r--r--indra/newview/skins/minimal/xui/pl/panel_login.xml45
-rw-r--r--indra/newview/skins/minimal/xui/pl/panel_navigation_bar.xml18
-rw-r--r--indra/newview/skins/minimal/xui/pl/panel_people.xml94
-rw-r--r--indra/newview/skins/minimal/xui/pl/panel_side_tray_tab_caption.xml7
-rw-r--r--indra/newview/skins/minimal/xui/pl/panel_status_bar.xml33
-rw-r--r--indra/newview/skins/minimal/xui/pt/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/llcapabilitylistener_test.cpp1
-rw-r--r--indra/newview/tests/llremoteparcelrequest_test.cpp4
-rw-r--r--indra/newview/tests/llviewerhelputil_test.cpp4
-rw-r--r--indra/newview/tests/llxmlrpclistener_test.cpp11
-rw-r--r--indra/newview/tests/test_llxmlrpc_peer.py21
-rw-r--r--indra/newview/viewer_manifest.py49
-rw-r--r--indra/test_apps/llplugintest/llmediaplugintest.cpp14
-rw-r--r--indra/viewer_components/login/CMakeLists.txt9
-rw-r--r--indra/viewer_components/login/lllogin.cpp2
-rw-r--r--indra/viewer_components/updater/llupdateinstaller.cpp2
-rw-r--r--indra/viewer_components/updater/tests/llupdaterservice_test.cpp6
-rw-r--r--install.xml1898
-rwxr-xr-xscripts/gpu_table_tester178
-rwxr-xr-x[-rw-r--r--]scripts/md5check.py0
-rw-r--r--scripts/messages/message_template.msg9
-rw-r--r--scripts/messages/message_template.msg.sha12
1897 files changed, 93427 insertions, 18441 deletions
diff --git a/.hgignore b/.hgignore
index 51b864651b..bd4f19a91e 100644
--- a/.hgignore
+++ b/.hgignore
@@ -9,6 +9,7 @@ syntax: glob
.*.swp
#OSX image cache file
*.DS_Store
+*.orig
LICENSES
indra/.distcc
build-linux-*
diff --git a/.hgtags b/.hgtags
index 41bd9a145a..05ef9ce9bc 100644
--- a/.hgtags
+++ b/.hgtags
@@ -8,6 +8,7 @@ bb38ff1a763738609e1b3cada6d15fa61e5e84b9 2.1.1-release
1e2b517adc2ecb342cd3c865f2a6ccf82a3cf8d7 2-1-beta-3
3469d90a115b900f8f250e137bbd9b684130f5d2 beta-4
3e4b947f79d88c385e8218cbc0731cef0e42cfc4 2-1-beta-1
+434973a76ab2755f98ab55e1afc193e16692d5c5 2-1-1-beta-2
46002088d9a4489e323b8d56131c680eaa21258c viewer-2-1-0-start
4f777ffb99fefdc6497c61385c22688ff149c659 viewer-2-0-0
52d96ad3d39be29147c5b2181b3bb46af6164f0e alpha-3
@@ -16,6 +17,7 @@ bb38ff1a763738609e1b3cada6d15fa61e5e84b9 2.1.1-release
7f16e79826d377f5f9f5b33dc721ab56d0d7dc8f alpha-4
7f16e79826d377f5f9f5b33dc721ab56d0d7dc8f fork to viewer-20qa
80bc6cff515118a36108967af49d3f8105c95bc9 viewer-2-0-2-start
+87bfaf8c76f9b22d9c65d4b315358861be87c863 2-1-1-release
b03065d018b8a2e28b7de85b293a4c992cb4c12d 2-1-release
b8419565906e4feb434426d8d9b17dd1458e24b2 alpha-6
bb38ff1a763738609e1b3cada6d15fa61e5e84b9 2-1-1-release
@@ -70,7 +72,6 @@ b723921b5c711bd24dbe77dc76ef488b544dac78 2.5.0-beta3
b723921b5c711bd24dbe77dc76ef488b544dac78 DRTVWR-34_2.5.0-beta3
b723921b5c711bd24dbe77dc76ef488b544dac78 2.5.0-release
b723921b5c711bd24dbe77dc76ef488b544dac78 DRTVWR-31_2.5.0-release
-92e58e51776a4f8c29069b1a62ff21454d2085f0 2.6.0-start
3178e311da3a8739a85363665006ea3c4610cad4 dons-headless-hackathon-work
63a6aedfce785a6c760377bf685b2dae616797d2 2.5.1-start
4dede9ae1ec74d41f6887719f6f1de7340d8578d 2.5.1-release
@@ -79,7 +80,6 @@ b53a0576eec80614d7767ed72b40ed67aeff27c9 DRTVWR-38_2.5.2-release
b53a0576eec80614d7767ed72b40ed67aeff27c9 2.5.2-release
92e58e51776a4f8c29069b1a62ff21454d2085f0 2.6.0-start
f1827b441e05bf37c68e2c15ebc6d09e9b03f527 2.6.0-start
-f1827b441e05bf37c68e2c15ebc6d09e9b03f527 2.6.0-start
4e9eec6a347f89b2b3f295beb72f1cf7837dff66 2.6.0-start
9283d6d1d7eb71dfe4c330e7c9144857e7356bde 2.6.0-beta1
9283d6d1d7eb71dfe4c330e7c9144857e7356bde DRTVWR-40_2.6.0-beta1
@@ -88,8 +88,6 @@ f1827b441e05bf37c68e2c15ebc6d09e9b03f527 2.6.0-start
c5bdef3aaa2744626aef3c217ce29e1900d357b3 2.6.1-start
c5bdef3aaa2744626aef3c217ce29e1900d357b3 DRTVWR-43_2.6.1-beta1
c5bdef3aaa2744626aef3c217ce29e1900d357b3 2.6.1-beta1
-9e4641f4a7870c0f565a25a2971368d5a29516a1 DRTVWR-41_2.6.0-beta2
-9e4641f4a7870c0f565a25a2971368d5a29516a1 2.6.0-beta2
c9182ed77d427c759cfacf49a7b71a2e20d522aa DRTVWR-42_2.6.1-release
c9182ed77d427c759cfacf49a7b71a2e20d522aa 2.6.1-release
56b2778c743c2a964d82e1caf11084d76a87de2c 2.6.2-start
@@ -97,8 +95,39 @@ c9182ed77d427c759cfacf49a7b71a2e20d522aa 2.6.1-release
42f32494bac475d0737799346f6831558ae8bf5d 2.6.0-release
d1203046bb653b763f835b04d184646949d8dd5c DRTVWR-45_2.6.2-beta1
d1203046bb653b763f835b04d184646949d8dd5c 2.6.2-beta1
+214180ad5714ce8392b82bbebcc92f4babd98300 DRTVWR-44_2.6.2-release
+214180ad5714ce8392b82bbebcc92f4babd98300 2.6.2-release
52b2263ab28f0976c689fd0b76c55a9eb027cdbf end-of-develop.py
ec32f1045e7c2644015245df3a9933620aa194b8 2.6.3-start
d7fcefabdf32bb61a9ea6d6037c1bb26190a85bc DRTVWR-47_2.6.3-beta1
d7fcefabdf32bb61a9ea6d6037c1bb26190a85bc 2.6.3-beta1
-74cd32a06837b0c2cb793b2e8d4d82f5d49462b2 2.6.4-start
+0630e977504af5ea320c58d33cae4e1ddee793e9 DRTVWR-48_2.6.3-beta2
+0630e977504af5ea320c58d33cae4e1ddee793e9 2.6.3-beta2
+7db558aaa7c176f2022b3e9cfe38ac72f6d1fccd DRTVWR-50_2.6.5-beta1
+7db558aaa7c176f2022b3e9cfe38ac72f6d1fccd 2.6.5-beta1
+800cefce8d364ffdd2f383cbecb91294da3ea424 2.6.6-start
+bb1075286b3b147b1dae2e3d6b2d56f04ff03f35 DRTVWR-52_2.6.6-beta1
+bb1075286b3b147b1dae2e3d6b2d56f04ff03f35 2.6.6-beta1
+5e349dbe9cc84ea5795af8aeb6d473a0af9d4953 2.6.8-start
+beafa8a9bd1d1b670b7523d865204dc4a4b38eef DRTVWR-55_2.6.8-beta1
+beafa8a9bd1d1b670b7523d865204dc4a4b38eef 2.6.8-beta1
+11d5d8080e67c3955914caf98f2eb116af30e55a 2.6.9-start
+e67da2c6e3125966dd49eef98b36317afac1fcfe 2.6.9-start
+77e5a08344c95738ab879f9671b7758cddd712a3 DRTVWR-57_2.6.9-beta1
+77e5a08344c95738ab879f9671b7758cddd712a3 2.6.9-beta1
+be2000b946f8cb3de5f44b2d419287d4c48ec4eb DRTVWR-54_2.6.8-release
+be2000b946f8cb3de5f44b2d419287d4c48ec4eb 2.6.8-release
+dac76a711da5f1489a01c1fa62ec97d99c25736d DRTVWR-51_2.6.6-release
+dac76a711da5f1489a01c1fa62ec97d99c25736d 2.6.6-release
+8f2da1701c81a62352df2b8d413d27fb2cade9a6 DRTVWR-46_2.6.3-release
+8f2da1701c81a62352df2b8d413d27fb2cade9a6 2.6.3-release
+77e5a08344c95738ab879f9671b7758cddd712a3 DRTVWR-56_2.6.9-release
+8835e0e3c0d3a48244c287bc05811dfc2fba43ec 2.7.0-start
+43c7ee846b7eed80786acbbf35d03bd016a3e85d DRTVWR-59_2.7.0-beta1
+43c7ee846b7eed80786acbbf35d03bd016a3e85d 2.7.0-beta1
+77e5a08344c95738ab879f9671b7758cddd712a3 2.6.9-release
+54fd44ac92e4c61435ea33effe093a3527e18d98 2.7.1-start
+0c4d0c24278074f219e5a32e72b449e78301d11b DRTVWR-61_2.7.1-beta1
+0c4d0c24278074f219e5a32e72b449e78301d11b 2.7.1-beta1
+9f79a6ed8fdcd2f3dac33ea6b3236eeb278dccfe 2.7.2-start
+6a3e7e403bd19e45fdfc2fcc716867af3ab80861 2.7.3-start
diff --git a/BuildParams b/BuildParams
index 3b711397e3..c303bd2e5e 100644
--- a/BuildParams
+++ b/BuildParams
@@ -11,8 +11,11 @@ Linux.symbolfiles = "newview/secondlife-symbols-linux.tar.bz2"
# Use Public Upload Locations
public_build = true
+# skip windows debug build until we can get a fix in.
+build_CYGWIN_Debug = false
+
# Update Public Inworld Build Status Indicators
-email_status_this_is_os = true
+email_status_this_is_os = false
# Limit extent of codeticket updates to revisions after...
codeticket_since = 2.2.0-release
@@ -67,11 +70,12 @@ viewer-pre-release.login_channel = "Second Life Release"
viewer-pre-release.build_debug_release_separately = true
viewer-pre-release.build_viewer_update_version_manager = true
#viewer-pre-release.release-viewer.jira = DRTVWR-13
+viewer-pre-release.release-viewer.jira = DRTVWR-46
+
# =======================================
# brad
# ========================================
-
debug-halting.email = cg@lindenlab.com
debug-halting.build_server = false
debug-halting.build_server_tests = false
@@ -89,6 +93,33 @@ brad-parabuild.build_server = false
brad-parabuild.build_server_tests = false
# ========================================
+# mesh-development
+# ========================================
+mesh-development.viewer_channel = "Project Viewer - Mesh"
+mesh-development.login_channel = "Project Viewer - Mesh"
+mesh-development.viewer_grid = aditi
+mesh-development.build_debug_release_separately = true
+mesh-development.build_CYGWIN_Debug = false
+mesh-development.build_viewer_update_version_manager = false
+
+# ========================================
+# viewer-mesh
+# ========================================
+
+viewer-mesh.build_viewer = true
+viewer-mesh.build_server = false
+viewer-mesh.build_Linux = true
+viewer-mesh.build_hg_bundle = true
+viewer-mesh.build_viewer_update_version_manager = false
+viewer-mesh.build_Debug = false
+viewer-mesh.build_RelWithDebInfo = false
+viewer-mesh.viewer_channel = "Project Viewer - Mesh"
+viewer-mesh.login_channel = "Project Viewer - Mesh"
+viewer-mesh.viewer_grid = aditi
+viewer-mesh.email = shining@lists.lindenlab.com
+
+
+# ========================================
# CG
# ========================================
@@ -111,24 +142,12 @@ gooey.viewer_grid = agni
gooey.build_viewer_update_version_manager = false
# ========================================
-# Display Names project
+# Search Project
# ========================================
-#viewer-identity-evolution.email = leyla@lindenlab.com
-viewer-identity.build_Debug = false
-viewer-identity.build_RelWithDebInfo = false
-viewer-identity.build_viewer = true
-viewer-identity.build_server = false
-viewer-identity.build_server_tests = false
-viewer-identity.build_Linux = true
-viewer-identity.build_hg_bundle = true
-viewer-identity.bulld_docs = true
-viewer-identity.viewer_channel = "Second Life Project Viewer"
-viewer-identity.login_channel = "Second Life Project Viewer"
-viewer-identity.viewer_grid = aditi
-viewer-identity.build_viewer_update_version_manager = false
-
-
+search_project-viewer.build_debug_release_separately = true
+search_project-viewer.viewer_channel = "Second Life Project Viewer - Search"
+search_project-viewer.login_channel = "Second Life Project Viewer - Search"
# ========================================
# palange
@@ -158,7 +177,10 @@ media.build_viewer_update_version_manager = false
oz_viewer-devreview.build_debug_release_separately = true
oz_project-1.build_debug_release_separately = true
oz_project-2.build_debug_release_separately = true
-oz_project-3.build_debug_release_separately = true
+oz-project-3.build_debug_release_separately = true
+oz_viewer-beta-review.build_debug_release_separately = true
+oz_viewer-poreview.build_debug_release_separately = true
+oz_viewer-poreview.codeticket_add_context = false
# ========================================
# enus
@@ -168,13 +190,6 @@ viewer-tut-teamcity.email = enus@lindenlab.com
viewer-tut-teamcity.build_server = false
viewer-tut-teamcity.build_server_tests = false
-# ========================================
-# experience
-# ========================================
-viewer-experience.public_build = false
-viewer-experience.viewer_channel = "Second Life SkyLight Viewer"
-viewer-experience.login_channel = "Second Life SkyLight Viewer"
-
# =================================================================
# asset delivery 2010 projects
# =================================================================
diff --git a/autobuild.xml b/autobuild.xml
index a31d280b6f..ec52d6e331 100644
--- a/autobuild.xml
+++ b/autobuild.xml
@@ -3,14 +3,14 @@
<map>
<key>installables</key>
<map>
- <key>GL</key>
+ <key>GLOD</key>
<map>
<key>license</key>
- <string>GL</string>
+ <string>GLOD</string>
<key>license_file</key>
- <string>LICENSES/GL.txt</string>
+ <string>LICENSES/glod.txt</string>
<key>name</key>
- <string>GL</string>
+ <string>GLOD</string>
<key>platforms</key>
<map>
<key>darwin</key>
@@ -18,9 +18,9 @@
<key>archive</key>
<map>
<key>hash</key>
- <string>0b7c1d43dc2b39301fef6c05948fb826</string>
+ <string>930bdd987a321eda1838caba8cd6098f</string>
<key>url</key>
- <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/GL-darwin-20101004.tar.bz2</string>
+ <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-glod/rev/230348/arch/Darwin/installer/glod-1.0pre4-darwin-20110519.tar.bz2</string>
</map>
<key>name</key>
<string>darwin</string>
@@ -30,9 +30,9 @@
<key>archive</key>
<map>
<key>hash</key>
- <string>d85d88088360aee5b67105ad93b5ad16</string>
+ <string>fb33b6cac2e6b98f93c5efa2af2e5a00</string>
<key>url</key>
- <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/GL-linux-20100929.tar.bz2</string>
+ <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-glod/rev/230348/arch/Linux/installer/glod-1.0pre4-linux-20110519.tar.bz2</string>
</map>
<key>name</key>
<string>linux</string>
@@ -42,9 +42,9 @@
<key>archive</key>
<map>
<key>hash</key>
- <string>f8d98cbe78d5aafbc7aaabf840325aaf</string>
+ <string>388cf0e292f756b4bb37696622f0bbc5</string>
<key>url</key>
- <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/GL-0.0.0-windows-20110303.tar.bz2</string>
+ <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-glod/rev/230348/arch/CYGWIN/installer/glod-1.0pre4-windows-20110519.tar.bz2</string>
</map>
<key>name</key>
<string>windows</string>
@@ -219,6 +219,54 @@
</map>
</map>
</map>
+ <key>colladadom</key>
+ <map>
+ <key>license</key>
+ <string>scea</string>
+ <key>license_file</key>
+ <string>LICENSES/collada.txt</string>
+ <key>name</key>
+ <string>colladadom</string>
+ <key>platforms</key>
+ <map>
+ <key>darwin</key>
+ <map>
+ <key>archive</key>
+ <map>
+ <key>hash</key>
+ <string>480b27a0cb39a4adfcdeabef895de3e1</string>
+ <key>url</key>
+ <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-colladadom/rev/227230/arch/Darwin/installer/colladadom-2.2-darwin-20110420.tar.bz2</string>
+ </map>
+ <key>name</key>
+ <string>darwin</string>
+ </map>
+ <key>linux</key>
+ <map>
+ <key>archive</key>
+ <map>
+ <key>hash</key>
+ <string>d05be8fc196e9ce7b6636b931cf13dff</string>
+ <key>url</key>
+ <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-colladadom/rev/226716/arch/Linux/installer/colladadom-2.2-linux-20110415.tar.bz2</string>
+ </map>
+ <key>name</key>
+ <string>linux</string>
+ </map>
+ <key>windows</key>
+ <map>
+ <key>archive</key>
+ <map>
+ <key>hash</key>
+ <string>a9f548eb6f9aaf292508a8b09c7f2f73</string>
+ <key>url</key>
+ <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-colladadom/rev/226584/arch/CYGWIN/installer/colladadom-2.2-windows-20110413.tar.bz2</string>
+ </map>
+ <key>name</key>
+ <string>windows</string>
+ </map>
+ </map>
+ </map>
<key>curl</key>
<map>
<key>license</key>
@@ -510,9 +558,9 @@
<key>archive</key>
<map>
<key>hash</key>
- <string>9b58d1a9c15807a1301e42a313641010</string>
+ <string>9f8a9dc39fd7c3da0fb3533782d1fddf</string>
<key>url</key>
- <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/freetype-2.4.4-linux-20110310.tar.bz2</string>
+ <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-freetype/rev/226814/arch/Linux/installer/freetype-2.3.9-linux-20110418.tar.bz2</string>
</map>
<key>name</key>
<string>linux</string>
@@ -531,6 +579,42 @@
</map>
</map>
</map>
+ <key>glext</key>
+ <map>
+ <key>license</key>
+ <string>glext</string>
+ <key>license_file</key>
+ <string>LICENSES/glext.txt</string>
+ <key>name</key>
+ <string>glext</string>
+ <key>platforms</key>
+ <map>
+ <key>linux</key>
+ <map>
+ <key>archive</key>
+ <map>
+ <key>hash</key>
+ <string>5de58ca0fe19abf68b25956762ee0d29</string>
+ <key>url</key>
+ <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/glext-68-windows-20110406.tar.bz2</string>
+ </map>
+ <key>name</key>
+ <string>linux</string>
+ </map>
+ <key>windows</key>
+ <map>
+ <key>archive</key>
+ <map>
+ <key>hash</key>
+ <string>5de58ca0fe19abf68b25956762ee0d29</string>
+ <key>url</key>
+ <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/glext-68-windows-20110406.tar.bz2</string>
+ </map>
+ <key>name</key>
+ <string>windows</string>
+ </map>
+ </map>
+ </map>
<key>glh_linear</key>
<map>
<key>license</key>
@@ -615,42 +699,6 @@
</map>
</map>
</map>
- <key>google-perftools</key>
- <map>
- <key>license</key>
- <string>bsd</string>
- <key>license_file</key>
- <string>LICENSES/google-perftools.txt</string>
- <key>name</key>
- <string>google-perftools</string>
- <key>platforms</key>
- <map>
- <key>linux</key>
- <map>
- <key>archive</key>
- <map>
- <key>hash</key>
- <string>cf513fc2eec4a414cc804cf408932a45</string>
- <key>url</key>
- <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/google_perftools-1.7-linux-20110315.tar.bz2</string>
- </map>
- <key>name</key>
- <string>linux</string>
- </map>
- <key>windows</key>
- <map>
- <key>archive</key>
- <map>
- <key>hash</key>
- <string>8108bffe1c814be9d035b47dac3d4541</string>
- <key>url</key>
- <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/google-perftools-1.0-windows-20101001b.tar.bz2</string>
- </map>
- <key>name</key>
- <string>windows</string>
- </map>
- </map>
- </map>
<key>google_breakpad</key>
<map>
<key>license</key>
@@ -704,7 +752,7 @@
<key>license</key>
<string>bsd</string>
<key>license_file</key>
- <string>LICENSES/gmock.txt</string>
+ <string>LICENSES/googlemock.txt</string>
<key>name</key>
<string>googlemock</string>
<key>platforms</key>
@@ -776,7 +824,7 @@
<key>license</key>
<string>lgpl</string>
<key>license_file</key>
- <string>LICENSES/gtk.txt</string>
+ <string>LICENSES/gtk-atk-pango-glib.txt</string>
<key>name</key>
<string>gtk-atk-pango-glib</string>
<key>platforms</key>
@@ -990,9 +1038,9 @@
<key>archive</key>
<map>
<key>hash</key>
- <string>735a955e6442733e2342ab12c1087488</string>
+ <string>f194ba857ca8dd86483a3ef24535d0db</string>
<key>url</key>
- <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libpng-1.5.1-windows-20110221.tar.bz2</string>
+ <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-libpng/rev/226532/arch/CYGWIN/installer/libpng-1.5.1-windows-20110413.tar.bz2</string>
</map>
<key>name</key>
<string>windows</string>
@@ -1047,6 +1095,102 @@
</map>
</map>
</map>
+ <key>llconvexdecomposition</key>
+ <map>
+ <key>license</key>
+ <string>havok</string>
+ <key>license_file</key>
+ <string>on_file</string>
+ <key>name</key>
+ <string>llconvexdecomposition</string>
+ <key>platforms</key>
+ <map>
+ <key>darwin</key>
+ <map>
+ <key>archive</key>
+ <map>
+ <key>hash</key>
+ <string>6e45ad68506cd1ba49fd35a3201f0478</string>
+ <key>url</key>
+ <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-llconvexdecomposition/rev/228821/arch/Darwin/installer/llconvexdecomposition-0.1-darwin-20110504.tar.bz2</string>
+ </map>
+ <key>name</key>
+ <string>darwin</string>
+ </map>
+ <key>linux</key>
+ <map>
+ <key>archive</key>
+ <map>
+ <key>hash</key>
+ <string>00ff5144612c2e261a0811a4503ce3ba</string>
+ <key>url</key>
+ <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-llconvexdecomposition/rev/228821/arch/Linux/installer/llconvexdecomposition-0.1-linux-20110504.tar.bz2</string>
+ </map>
+ <key>name</key>
+ <string>linux</string>
+ </map>
+ <key>windows</key>
+ <map>
+ <key>archive</key>
+ <map>
+ <key>hash</key>
+ <string>a4635dcbbe0915ce023dd41d3b848d4c</string>
+ <key>url</key>
+ <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-llconvexdecomposition/rev/228821/arch/CYGWIN/installer/llconvexdecomposition-0.1-windows-20110504.tar.bz2</string>
+ </map>
+ <key>name</key>
+ <string>windows</string>
+ </map>
+ </map>
+ </map>
+ <key>llconvexdecompositionstub</key>
+ <map>
+ <key>license</key>
+ <string>lgpl</string>
+ <key>license_file</key>
+ <string>LICENSES/lgpl.txt</string>
+ <key>name</key>
+ <string>llconvexdecompositionstub</string>
+ <key>platforms</key>
+ <map>
+ <key>darwin</key>
+ <map>
+ <key>archive</key>
+ <map>
+ <key>hash</key>
+ <string>bc1388fc28dbb3bba1fe7cb8d09f49b4</string>
+ <key>url</key>
+ <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llconvexdecompositionstub/rev/227399/arch/Darwin/installer/llconvexdecompositionstub-0.3-darwin-20110421.tar.bz2</string>
+ </map>
+ <key>name</key>
+ <string>darwin</string>
+ </map>
+ <key>linux</key>
+ <map>
+ <key>archive</key>
+ <map>
+ <key>hash</key>
+ <string>3295bd4a0514b7c15dda9044f40c175e</string>
+ <key>url</key>
+ <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llconvexdecompositionstub/rev/227399/arch/Linux/installer/llconvexdecompositionstub-0.3-linux-20110422.tar.bz2</string>
+ </map>
+ <key>name</key>
+ <string>linux</string>
+ </map>
+ <key>windows</key>
+ <map>
+ <key>archive</key>
+ <map>
+ <key>hash</key>
+ <string>92f1dff3249024c1534b55343ed79ea3</string>
+ <key>url</key>
+ <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llconvexdecompositionstub/rev/227399/arch/CYGWIN/installer/llconvexdecompositionstub-0.3-windows-20110421.tar.bz2</string>
+ </map>
+ <key>name</key>
+ <string>windows</string>
+ </map>
+ </map>
+ </map>
<key>llqtwebkit</key>
<map>
<key>license</key>
@@ -1062,9 +1206,9 @@
<key>archive</key>
<map>
<key>hash</key>
- <string>76c1015eafcba5ca9932c3009533b51c</string>
+ <string>82798d0da3ac3d97c91517a575d9ea1c</string>
<key>url</key>
- <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llqtwebkit/rev/225273/arch/Darwin/installer/llqtwebkit-4.7.1-darwin-20110329.tar.bz2</string>
+ <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llqtwebkit/rev/231093/arch/Darwin/installer/llqtwebkit-4.7.1-darwin-20110526.tar.bz2</string>
</map>
<key>name</key>
<string>darwin</string>
@@ -1086,9 +1230,9 @@
<key>archive</key>
<map>
<key>hash</key>
- <string>1b1b8e104e39c542d69eb37b5ee81818</string>
+ <string>f0708d18943a05013493f69ab7dc6429</string>
<key>url</key>
- <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llqtwebkit/rev/225249/arch/CYGWIN/installer/llqtwebkit-4.7.1-windows-20110329.tar.bz2</string>
+ <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llqtwebkit/rev/231093/arch/CYGWIN/installer/llqtwebkit-4.7.1-windows-20110526.tar.bz2</string>
</map>
<key>name</key>
<string>windows</string>
@@ -1182,9 +1326,9 @@
<key>archive</key>
<map>
<key>hash</key>
- <string>57f32a1a670f06a4dc036eb1164ad9d7</string>
+ <string>e849bc2b779fb7cc5e81aeb021a542c0</string>
<key>url</key>
- <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ogg_vorbis-1.1.3-1.2.0-darwin-20110222.tar.bz2</string>
+ <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-ogvorbis/rev/229529/arch/Darwin/installer/ogg_vorbis-1.2.2-1.3.2-darwin-20110510.tar.bz2</string>
</map>
<key>name</key>
<string>darwin</string>
@@ -1194,9 +1338,9 @@
<key>archive</key>
<map>
<key>hash</key>
- <string>17c000ceef32c0623d038b4c73791bee</string>
+ <string>71eaa462eb0bf8842277a3436483a354</string>
<key>url</key>
- <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ogg_vorbis-1.1.3-1.2.0-linux-20110307.tar.bz2</string>
+ <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-ogvorbis/rev/229529/arch/Linux/installer/ogg_vorbis-1.2.2-1.3.2-linux-20110511.tar.bz2</string>
</map>
<key>name</key>
<string>linux</string>
@@ -1206,9 +1350,9 @@
<key>archive</key>
<map>
<key>hash</key>
- <string>c8fccf7eeb25fd45cb7e04399c0b83ee</string>
+ <string>291dbba89dd8162b76f2c2d82e908c6f</string>
<key>url</key>
- <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ogg_vorbis-1.1.3-1.2.0-windows-20110222.tar.bz2</string>
+ <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-ogvorbis/rev/229529/arch/CYGWIN/installer/ogg_vorbis-1.2.2-1.3.2-windows-20110510.tar.bz2</string>
</map>
<key>name</key>
<string>windows</string>
@@ -1242,9 +1386,9 @@
<key>archive</key>
<map>
<key>hash</key>
- <string>cc159598ef3fcd34fd33a8a0ef846165</string>
+ <string>3d40be8566fa4b9df9a38e2a0f9ea467</string>
<key>url</key>
- <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-openssl/rev/223711/arch/Linux/installer/openssl-0.9.8q-linux-20110314.tar.bz2</string>
+ <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-openssl/rev/226882/arch/Linux/installer/openssl-1.0.0d-linux-20110418.tar.bz2</string>
</map>
<key>name</key>
<string>linux</string>
@@ -1351,14 +1495,14 @@
</map>
</map>
</map>
- <key>pth</key>
+ <key>pcre</key>
<map>
<key>license</key>
- <string>lgpl</string>
+ <string>bsd</string>
<key>license_file</key>
- <string>LICENSES/pth.txt</string>
+ <string>LICENSES/pcre-license.txt</string>
<key>name</key>
- <string>pth</string>
+ <string>pcre</string>
<key>platforms</key>
<map>
<key>darwin</key>
@@ -1366,13 +1510,25 @@
<key>archive</key>
<map>
<key>hash</key>
- <string>2172379794217d0ffba0db09b2ac17bf</string>
+ <string>a8e74694a0f4248228c13c845ed0a6f8</string>
<key>url</key>
- <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/pth-2.0.7-darwin-20110303.tar.bz2</string>
+ <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-pcre/rev/228822/arch/Darwin/installer/pcre-7.6-darwin-20110504.tar.bz2</string>
</map>
<key>name</key>
<string>darwin</string>
</map>
+ <key>linux</key>
+ <map>
+ <key>archive</key>
+ <map>
+ <key>hash</key>
+ <string>bb0abe962b3b8208ed2dab0424aab33d</string>
+ <key>url</key>
+ <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-pcre/rev/228822/arch/Linux/installer/pcre-7.6-linux-20110504.tar.bz2</string>
+ </map>
+ <key>name</key>
+ <string>linux</string>
+ </map>
</map>
</map>
<key>quicktime</key>
@@ -1447,6 +1603,42 @@
</map>
</map>
</map>
+ <key>tcmalloc</key>
+ <map>
+ <key>license</key>
+ <string>bsd</string>
+ <key>license_file</key>
+ <string>LICENSES/google-perftools.txt</string>
+ <key>name</key>
+ <string>tcmalloc</string>
+ <key>platforms</key>
+ <map>
+ <key>linux</key>
+ <map>
+ <key>archive</key>
+ <map>
+ <key>hash</key>
+ <string>dde928cb24d22a267004a8c17669ba65</string>
+ <key>url</key>
+ <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-google-perftools/rev/226426/arch/Linux/installer/google_perftools-1.7-linux-20110412.tar.bz2</string>
+ </map>
+ <key>name</key>
+ <string>linux</string>
+ </map>
+ <key>windows</key>
+ <map>
+ <key>archive</key>
+ <map>
+ <key>hash</key>
+ <string>8308f7bd68bb7083655753b7abe7225f</string>
+ <key>url</key>
+ <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-google-perftools/rev/226287/arch/CYGWIN/installer/google_perftools-1.7-windows-20110411.tar.bz2</string>
+ </map>
+ <key>name</key>
+ <string>windows</string>
+ </map>
+ </map>
+ </map>
<key>tut</key>
<map>
<key>license</key>
@@ -1590,115 +1782,34 @@
<key>options</key>
<array>
<string>-DCMAKE_BUILD_TYPE:STRING=Debug</string>
- <string>-DUNATTENDED:BOOL=OFF</string>
<string>-DWORD_SIZE:STRING=32</string>
<string>-DROOT_PROJECT_NAME:STRING=SecondLife</string>
+ <string>-DINSTALL_PROPRIETARY=TRUE</string>
</array>
</map>
<key>name</key>
<string>Debug</string>
</map>
- <key>OpenSourceDebug</key>
+ <key>DebugOS</key>
<map>
<key>configure</key>
<map>
- <key>command</key>
- <string>cmake</string>
- <key>options</key>
- <array>
- <string>-DCMAKE_BUILD_TYPE:STRING=Debug</string>
- <string>-DUNATTENDED:BOOL=OFF</string>
- <string>-DWORD_SIZE:STRING=32</string>
- <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string>
- </array>
- </map>
- <key>name</key>
- <string>OpenSourceDebug</string>
- </map>
- <key>OpenSourceRelWithDebInfo</key>
- <map>
- <key>configure</key>
- <map>
- <key>command</key>
- <string>cmake</string>
- <key>options</key>
- <array>
- <string>-DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo</string>
- <string>-DUNATTENDED:BOOL=OFF</string>
- <string>-DWORD_SIZE:STRING=32</string>
- <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string>
- </array>
- </map>
- <key>name</key>
- <string>OpenSourceRelWithDebInfo</string>
- </map>
- <key>OpenSourceRelease</key>
- <map>
- <key>configure</key>
- <map>
- <key>command</key>
- <string>cmake</string>
- <key>options</key>
+ <key>arguments</key>
<array>
- <string>-DCMAKE_BUILD_TYPE:STRING=Release</string>
- <string>-DUNATTENDED:BOOL=OFF</string>
- <string>-DWORD_SIZE:STRING=32</string>
- <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string>
+ <string>../indra</string>
</array>
- </map>
- <key>name</key>
- <string>OpenSourceRelease</string>
- </map>
- <key>OpenSourceStandAloneDebug</key>
- <map>
- <key>configure</key>
- <map>
<key>command</key>
<string>cmake</string>
<key>options</key>
<array>
<string>-DCMAKE_BUILD_TYPE:STRING=Debug</string>
- <string>-DUNATTENDED:BOOL=OFF</string>
- <string>-DWORD_SIZE:STRING=32</string>
- <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string>
- </array>
- </map>
- <key>name</key>
- <string>OpenSourceStandAloneDebug</string>
- </map>
- <key>OpenSourceStandAloneRelWithDebInfo</key>
- <map>
- <key>configure</key>
- <map>
- <key>command</key>
- <string>cmake</string>
- <key>options</key>
- <array>
- <string>-DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo</string>
- <string>-DUNATTENDED:BOOL=OFF</string>
- <string>-DWORD_SIZE:STRING=32</string>
- <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string>
- </array>
- </map>
- <key>name</key>
- <string>OpenSourceStandAloneRelWithDebInfo</string>
- </map>
- <key>OpenSourceStandAloneRelease</key>
- <map>
- <key>configure</key>
- <map>
- <key>command</key>
- <string>cmake</string>
- <key>options</key>
- <array>
- <string>-DCMAKE_BUILD_TYPE:STRING=Release</string>
- <string>-DUNATTENDED:BOOL=OFF</string>
<string>-DWORD_SIZE:STRING=32</string>
<string>-DROOT_PROJECT_NAME:STRING=SecondLife</string>
+ <string>-DINSTALL_PROPRIETARY=FALSE</string>
</array>
</map>
<key>name</key>
- <string>OpenSourceStandAloneRelease</string>
+ <string>DebugOS</string>
</map>
<key>RelWithDebInfo</key>
<map>
@@ -1712,36 +1823,15 @@
<key>options</key>
<array>
<string>-DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo</string>
- <string>-DUNATTENDED:BOOL=OFF</string>
<string>-DWORD_SIZE:STRING=32</string>
<string>-DROOT_PROJECT_NAME:STRING=SecondLife</string>
+ <string>-DINSTALL_PROPRIETARY=TRUE</string>
</array>
</map>
<key>name</key>
<string>RelWithDebInfo</string>
</map>
- <key>Release</key>
- <map>
- <key>build</key>
- <map>
- </map>
- <key>configure</key>
- <map>
- <key>command</key>
- <string>cmake</string>
- <key>options</key>
- <array>
- <string>-DCMAKE_BUILD_TYPE:STRING=Release</string>
- <string>-DUNATTENDED:BOOL=OFF</string>
- <string>-DWORD_SIZE:STRING=32</string>
- <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string>
- </array>
- </map>
- <key>name</key>
- <string>Release</string>
- </map>
- <!-- OPEN-1 WORKAROUND begin - to be removed when VC express is detected correctly -->
- <key>VCexpressRelWithDebInfo</key>
+ <key>RelWithDebInfoOS</key>
<map>
<key>configure</key>
<map>
@@ -1754,40 +1844,35 @@
<key>options</key>
<array>
<string>-DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo</string>
- <string>-DUNATTENDED:BOOL=OFF</string>
<string>-DWORD_SIZE:STRING=32</string>
<string>-DROOT_PROJECT_NAME:STRING=SecondLife</string>
+ <string>-DINSTALL_PROPRIETARY=FALSE</string>
</array>
</map>
<key>name</key>
- <string>VCexpressRelWithDebInfo</string>
+ <string>RelWithDebInfoOS</string>
</map>
- <!-- OPEN-1 WORKAROUND end -->
- <!-- OPEN-1a WORKAROUND begin - to be removed when VC 2010 is detected correctly -->
- <key>VC10msbuildRelWithDebInfo</key>
+ <key>Release</key>
<map>
+ <key>build</key>
+ <map>
+ </map>
<key>configure</key>
<map>
- <key>arguments</key>
- <array>
- <string>../indra</string>
- </array>
<key>command</key>
<string>cmake</string>
<key>options</key>
<array>
- <string>-DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo</string>
- <string>-DUNATTENDED:BOOL=OFF</string>
+ <string>-DCMAKE_BUILD_TYPE:STRING=Release</string>
<string>-DWORD_SIZE:STRING=32</string>
<string>-DROOT_PROJECT_NAME:STRING=SecondLife</string>
+ <string>-DINSTALL_PROPRIETARY=TRUE</string>
</array>
</map>
<key>name</key>
- <string>VC10msbuildRelWithDebInfo</string>
+ <string>Release</string>
</map>
- <!-- OPEN-1a WORKAROUND end -->
- <!-- OPEN-1a Release WORKAROUND begin - to be removed when VC 2010 is detected correctly -->
- <key>VC10msbuildRelease</key>
+ <key>ReleaseOS</key>
<map>
<key>configure</key>
<map>
@@ -1800,15 +1885,14 @@
<key>options</key>
<array>
<string>-DCMAKE_BUILD_TYPE:STRING=Release</string>
- <string>-DUNATTENDED:BOOL=OFF</string>
<string>-DWORD_SIZE:STRING=32</string>
<string>-DROOT_PROJECT_NAME:STRING=SecondLife</string>
+ <string>-DINSTALL_PROPRIETARY=FALSE</string>
</array>
</map>
<key>name</key>
- <string>VC10msbuildRelease</string>
+ <string>ReleaseOS</string>
</map>
- <!-- OPEN-1a Release WORKAROUND end -->
</map>
<key>name</key>
<string>common</string>
@@ -1848,15 +1932,12 @@
<array>
<string>-G</string>
<string>'Xcode'</string>
- <string>-DSTANDALONE:BOOL=OFF</string>
- <string>-DINSTALL_PROPRIETARY=TRUE</string>
- <string>-DFMOD=TRUE</string>
</array>
</map>
<key>name</key>
<string>Debug</string>
</map>
- <key>OpenSourceDebug</key>
+ <key>DebugOS</key>
<map>
<key>build</key>
<map>
@@ -1870,116 +1951,26 @@
</map>
<key>configure</key>
<map>
- <key>arguments</key>
- <array>
- <string>../indra</string>
- </array>
<key>options</key>
<array>
<string>-G</string>
<string>'Xcode'</string>
- <string>-DSTANDALONE:BOOL=FALSE</string>
- <string>-DINSTALL_PROPRIETARY=FALSE</string>
- <string>-DFMOD=FALSE</string>
</array>
</map>
<key>name</key>
- <string>OpenSourceDebug</string>
+ <string>DebugOS</string>
</map>
- <key>OpenSourceRelWithDebInfo</key>
- <map>
- <key>build</key>
- <map>
- <key>command</key>
- <string>xcodebuild</string>
- <key>options</key>
- <array>
- <string>-configuration RelWithDebInfo</string>
- <string>-project SecondLife.xcodeproj</string>
- </array>
- </map>
- <key>configure</key>
- <map>
- <key>arguments</key>
- <array>
- <string>../indra</string>
- </array>
- <key>options</key>
- <array>
- <string>-G</string>
- <string>'Xcode'</string>
- <string>-DSTANDALONE:BOOL=FALSE</string>
- <string>-DINSTALL_PROPRIETARY=FALSE</string>
- <string>-DFMOD=FALSE</string>
- </array>
- </map>
- <key>name</key>
- <string>OpenSourceRelWithDebInfo</string>
- </map>
- <key>OpenSourceRelease</key>
- <map>
- <key>build</key>
- <map>
- <key>command</key>
- <string>xcodebuild</string>
- <key>options</key>
- <array>
- <string>-configuration Release</string>
- <string>-project SecondLife.xcodeproj</string>
- </array>
- </map>
- <key>configure</key>
- <map>
- <key>arguments</key>
- <array>
- <string>../indra</string>
- </array>
- <key>options</key>
- <array>
- <string>-G</string>
- <string>'Xcode'</string>
- <string>-DSTANDALONE:BOOL=FALSE</string>
- <string>-DINSTALL_PROPRIETARY=FALSE</string>
- <string>-DFMOD=FALSE</string>
- </array>
- </map>
- <key>name</key>
- <string>OpenSourceRelease</string>
- </map>
- <key>OpenSourceStandAloneDebug</key>
+ <key>RelWithDebInfo</key>
<map>
<key>build</key>
<map>
- <key>command</key>
- <string>xcodebuild</string>
- <key>options</key>
- <array>
- <string>-configuration Debug</string>
- <string>-project SecondLife.xcodeproj</string>
- </array>
- </map>
- <key>configure</key>
- <map>
<key>arguments</key>
<array>
- <string>../indra</string>
- </array>
- <key>options</key>
- <array>
- <string>-G</string>
- <string>'Xcode'</string>
- <string>-DSTANDALONE:BOOL=TRUE</string>
- <string>-DINSTALL_PROPRIETARY=FALSE</string>
- <string>-DFMOD=FALSE</string>
+ <string>|</string>
+ <string>grep</string>
+ <string>-v</string>
+ <string>setenv</string>
</array>
- </map>
- <key>name</key>
- <string>OpenSourceStandAloneDebug</string>
- </map>
- <key>OpenSourceStandAloneRelWithDebInfo</key>
- <map>
- <key>build</key>
- <map>
<key>command</key>
<string>xcodebuild</string>
<key>options</key>
@@ -1998,15 +1989,14 @@
<array>
<string>-G</string>
<string>'Xcode'</string>
- <string>-DSTANDALONE:BOOL=TRUE</string>
- <string>-DINSTALL_PROPRIETARY=FALSE</string>
- <string>-DFMOD=FALSE</string>
</array>
</map>
+ <key>default</key>
+ <string>True</string>
<key>name</key>
- <string>OpenSourceStandAloneRelWithDebInfo</string>
+ <string>RelWithDebInfo</string>
</map>
- <key>OpenSourceStandAloneRelease</key>
+ <key>RelWithDebInfoOS</key>
<map>
<key>build</key>
<map>
@@ -2014,29 +2004,22 @@
<string>xcodebuild</string>
<key>options</key>
<array>
- <string>-configuration Release</string>
+ <string>-configuration RelWithDebInfo</string>
<string>-project SecondLife.xcodeproj</string>
</array>
</map>
<key>configure</key>
<map>
- <key>arguments</key>
- <array>
- <string>../indra</string>
- </array>
<key>options</key>
<array>
<string>-G</string>
<string>'Xcode'</string>
- <string>-DSTANDALONE:BOOL=TRUE</string>
- <string>-DINSTALL_PROPRIETARY=FALSE</string>
- <string>-DFMOD=FALSE</string>
</array>
</map>
<key>name</key>
- <string>OpenSourceStandAloneRelease</string>
+ <string>RelWithDebInfoOS</string>
</map>
- <key>RelWithDebInfo</key>
+ <key>Release</key>
<map>
<key>build</key>
<map>
@@ -2051,7 +2034,7 @@
<string>xcodebuild</string>
<key>options</key>
<array>
- <string>-configuration RelWithDebInfo</string>
+ <string>-configuration Release</string>
<string>-project SecondLife.xcodeproj</string>
</array>
</map>
@@ -2065,27 +2048,15 @@
<array>
<string>-G</string>
<string>'Xcode'</string>
- <string>-DSTANDALONE:BOOL=OFF</string>
- <string>-DINSTALL_PROPRIETARY=TRUE</string>
- <string>-DFMOD=TRUE</string>
</array>
</map>
- <key>default</key>
- <string>True</string>
<key>name</key>
- <string>RelWithDebInfo</string>
+ <string>Release</string>
</map>
- <key>Release</key>
+ <key>ReleaseOS</key>
<map>
<key>build</key>
<map>
- <key>arguments</key>
- <array>
- <string>|</string>
- <string>grep</string>
- <string>-v</string>
- <string>setenv</string>
- </array>
<key>command</key>
<string>xcodebuild</string>
<key>options</key>
@@ -2096,21 +2067,14 @@
</map>
<key>configure</key>
<map>
- <key>arguments</key>
- <array>
- <string>../indra</string>
- </array>
<key>options</key>
<array>
<string>-G</string>
<string>'Xcode'</string>
- <string>-DSTANDALONE:BOOL=OFF</string>
- <string>-DINSTALL_PROPRIETARY=TRUE</string>
- <string>-DFMOD=TRUE</string>
</array>
</map>
<key>name</key>
- <string>Release</string>
+ <string>ReleaseOS</string>
</map>
</map>
<key>name</key>
@@ -2143,73 +2107,12 @@
<array>
<string>-G</string>
<string>'Unix Makefiles'</string>
- <string>-DSTANDALONE:BOOL=OFF</string>
- <string>-DINSTALL_PROPRIETARY=TRUE</string>
- <string>-DFMOD=TRUE</string>
</array>
</map>
<key>name</key>
<string>Debug</string>
</map>
- <key>OpenSourceDebug</key>
- <map>
- <key>build</key>
- <map>
- <key>command</key>
- <string>make</string>
- <key>options</key>
- <array>
- <string>-j 12</string>
- </array>
- </map>
- <key>configure</key>
- <map>
- <key>arguments</key>
- <array>
- <string>../indra</string>
- </array>
- <key>options</key>
- <array>
- <string>-G</string>
- <string>'Unix Makefiles'</string>
- <string>-DSTANDALONE:BOOL=FALSE</string>
- <string>-DINSTALL_PROPRIETARY=FALSE</string>
- <string>-DFMOD=FALSE</string>
- </array>
- </map>
- <key>name</key>
- <string>OpenSourceDebug</string>
- </map>
- <key>OpenSourceRelWithDebInfo</key>
- <map>
- <key>build</key>
- <map>
- <key>command</key>
- <string>make</string>
- <key>options</key>
- <array>
- <string>-j 12</string>
- </array>
- </map>
- <key>configure</key>
- <map>
- <key>arguments</key>
- <array>
- <string>../indra</string>
- </array>
- <key>options</key>
- <array>
- <string>-G</string>
- <string>'Unix Makefiles'</string>
- <string>-DSTANDALONE:BOOL=FALSE</string>
- <string>-DINSTALL_PROPRIETARY=FALSE</string>
- <string>-DFMOD=FALSE</string>
- </array>
- </map>
- <key>name</key>
- <string>OpenSourceRelWithDebInfo</string>
- </map>
- <key>OpenSourceRelease</key>
+ <key>DebugOS</key>
<map>
<key>build</key>
<map>
@@ -2217,57 +2120,21 @@
<string>make</string>
<key>options</key>
<array>
- <string>-j 12</string>
+ <string>-j 2</string>
</array>
</map>
<key>configure</key>
<map>
- <key>arguments</key>
- <array>
- <string>../indra</string>
- </array>
<key>options</key>
<array>
<string>-G</string>
<string>'Unix Makefiles'</string>
- <string>-DSTANDALONE:BOOL=FALSE</string>
- <string>-DINSTALL_PROPRIETARY=FALSE</string>
- <string>-DFMOD=FALSE</string>
</array>
</map>
<key>name</key>
- <string>OpenSourceRelease</string>
+ <string>DebugOS</string>
</map>
- <key>OpenSourceStandAloneDebug</key>
- <map>
- <key>build</key>
- <map>
- <key>command</key>
- <string>make</string>
- <key>options</key>
- <array>
- <string>-j 12</string>
- </array>
- </map>
- <key>configure</key>
- <map>
- <key>arguments</key>
- <array>
- <string>../indra</string>
- </array>
- <key>options</key>
- <array>
- <string>-G</string>
- <string>'Unix Makefiles'</string>
- <string>-DSTANDALONE:BOOL=TRUE</string>
- <string>-DINSTALL_PROPRIETARY=FALSE</string>
- <string>-DFMOD=FALSE</string>
- </array>
- </map>
- <key>name</key>
- <string>OpenSourceStandAloneDebug</string>
- </map>
- <key>OpenSourceStandAloneRelWithDebInfo</key>
+ <key>RelWithDebInfo</key>
<map>
<key>build</key>
<map>
@@ -2288,15 +2155,14 @@
<array>
<string>-G</string>
<string>'Unix Makefiles'</string>
- <string>-DSTANDALONE:BOOL=TRUE</string>
- <string>-DINSTALL_PROPRIETARY=FALSE</string>
- <string>-DFMOD=FALSE</string>
</array>
</map>
+ <key>default</key>
+ <string>True</string>
<key>name</key>
- <string>OpenSourceStandAloneRelWithDebInfo</string>
+ <string>RelWithDebInfo</string>
</map>
- <key>OpenSourceStandAloneRelease</key>
+ <key>RelWithDebInfoOS</key>
<map>
<key>build</key>
<map>
@@ -2304,28 +2170,21 @@
<string>make</string>
<key>options</key>
<array>
- <string>-j 12</string>
+ <string>-j 2</string>
</array>
</map>
<key>configure</key>
<map>
- <key>arguments</key>
- <array>
- <string>../indra</string>
- </array>
<key>options</key>
<array>
<string>-G</string>
<string>'Unix Makefiles'</string>
- <string>-DSTANDALONE:BOOL=TRUE</string>
- <string>-DINSTALL_PROPRIETARY=FALSE</string>
- <string>-DFMOD=FALSE</string>
</array>
</map>
<key>name</key>
- <string>OpenSourceStandAloneRelease</string>
+ <string>RelWithDebInfoOS</string>
</map>
- <key>RelWithDebInfo</key>
+ <key>Release</key>
<map>
<key>build</key>
<map>
@@ -2346,17 +2205,12 @@
<array>
<string>-G</string>
<string>'Unix Makefiles'</string>
- <string>-DSTANDALONE:BOOL=OFF</string>
- <string>-DINSTALL_PROPRIETARY=TRUE</string>
- <string>-DFMOD=TRUE</string>
</array>
</map>
- <key>default</key>
- <string>True</string>
<key>name</key>
- <string>RelWithDebInfo</string>
+ <string>Release</string>
</map>
- <key>Release</key>
+ <key>ReleaseOS</key>
<map>
<key>build</key>
<map>
@@ -2364,26 +2218,19 @@
<string>make</string>
<key>options</key>
<array>
- <string>-j 12</string>
+ <string>-j 2</string>
</array>
</map>
<key>configure</key>
<map>
- <key>arguments</key>
- <array>
- <string>../indra</string>
- </array>
<key>options</key>
<array>
<string>-G</string>
<string>'Unix Makefiles'</string>
- <string>-DSTANDALONE:BOOL=OFF</string>
- <string>-DINSTALL_PROPRIETARY=TRUE</string>
- <string>-DFMOD=TRUE</string>
</array>
</map>
<key>name</key>
- <string>Release</string>
+ <string>ReleaseOS</string>
</map>
<key>default</key>
<map>
@@ -2437,15 +2284,12 @@
<array>
<string>-G</string>
<string>"Visual Studio 10"</string>
- <string>-DSTANDALONE:BOOL=OFF</string>
- <string>-DINSTALL_PROPRIETARY=TRUE</string>
- <string>-DFMOD=TRUE</string>
</array>
</map>
<key>name</key>
<string>Debug</string>
</map>
- <key>OpenSourceDebug</key>
+ <key>DebugOS</key>
<map>
<key>build</key>
<map>
@@ -2454,108 +2298,33 @@
<string>SecondLife.sln</string>
</array>
<key>command</key>
- <string>devenv.com</string>
- <key>options</key>
- <array>
- <string>/build</string>
- <string>Debug</string>
- </array>
- </map>
- <key>configure</key>
- <map>
- <key>arguments</key>
- <array>
- <string>..\indra</string>
- <string>&amp;&amp;</string>
- <string>..\indra\tools\vstool\VSTool.exe</string>
- <string>--solution</string>
- <string>SecondLife.sln</string>
- <string>--config</string>
- <string>Debug</string>
- <string>--startup</string>
- <string>secondlife-bin</string>
- </array>
- <key>options</key>
- <array>
- <string>-G</string>
- <string>"Visual Studio 10"</string>
- <string>-DSTANDALONE:BOOL=FALSE</string>
- <string>-DINSTALL_PROPRIETARY=FALSE</string>
- <string>-DFMOD=FALSE</string>
- </array>
- </map>
- <key>name</key>
- <string>OpenSourceDebug</string>
- </map>
- <key>OpenSourceRelWithDebInfo</key>
- <map>
- <key>build</key>
- <map>
- <key>arguments</key>
- <array>
- <string>SecondLife.sln</string>
- </array>
- <key>command</key>
- <string>devenv.com</string>
- <key>options</key>
- <array>
- <string>/build</string>
- <string>RelWithDebInfo</string>
- </array>
- </map>
- <key>configure</key>
- <map>
- <key>arguments</key>
- <array>
- <string>../indra</string>
- </array>
- <key>options</key>
- <array>
- <string>-G</string>
- <string>"Visual Studio 10"</string>
- <string>-DSTANDALONE:BOOL=FALSE</string>
- <string>-DINSTALL_PROPRIETARY=FALSE</string>
- <string>-DFMOD=FALSE</string>
- </array>
- </map>
- <key>name</key>
- <string>OpenSourceRelWithDebInfo</string>
- </map>
- <key>OpenSourceRelease</key>
- <map>
- <key>build</key>
- <map>
- <key>arguments</key>
- <array>
- <string>SecondLife.sln</string>
- </array>
- <key>command</key>
- <string>devenv.com</string>
+ <string>msbuild.exe</string>
<key>options</key>
<array>
- <string>/build</string>
- <string>Release</string>
+ <string>/p:Configuration=Debug</string>
+ <string>/p:Platform=Win32</string>
+ <string>/t:Build</string>
+ <string>/p:useenv=true</string>
+ <string>/verbosity:minimal</string>
+ <string>/toolsversion:4.0</string>
+ <string>/p:"VCBuildAdditionalOptions= /incremental"</string>
</array>
</map>
<key>configure</key>
<map>
- <key>arguments</key>
- <array>
- <string>../indra</string>
- </array>
<key>options</key>
<array>
<string>-G</string>
<string>"Visual Studio 10"</string>
- <string>-DSTANDALONE:BOOL=FALSE</string>
- <string>-DINSTALL_PROPRIETARY=FALSE</string>
+ <string>-DUNATTENDED:BOOL=ON</string>
+ <string>-DUSE_KDU=FALSE</string>
<string>-DFMOD=FALSE</string>
</array>
</map>
<key>name</key>
- <string>OpenSourceRelease</string>
+ <string>DebugOS</string>
</map>
- <key>OpenSourceStandAloneDebug</key>
+ <key>RelWithDebInfo</key>
<map>
<key>build</key>
<map>
@@ -2564,11 +2333,11 @@
<string>SecondLife.sln</string>
</array>
<key>command</key>
- <string>devenv.com</string>
+ <string>BuildConsole</string>
<key>options</key>
<array>
<string>/build</string>
- <string>Debug</string>
+ <string>"/cfg=RelWithDebInfo|Win32"</string>
</array>
</map>
<key>configure</key>
@@ -2589,49 +2358,14 @@
<array>
<string>-G</string>
<string>"Visual Studio 10"</string>
- <string>-DSTANDALONE:BOOL=TRUE</string>
- <string>-DINSTALL_PROPRIETARY=FALSE</string>
- <string>-DFMOD=FALSE</string>
- </array>
- </map>
- <key>name</key>
- <string>OpenSourceStandAloneDebug</string>
- </map>
- <key>OpenSourceStandAloneRelWithDebInfo</key>
- <map>
- <key>build</key>
- <map>
- <key>arguments</key>
- <array>
- <string>SecondLife.sln</string>
- </array>
- <key>command</key>
- <string>devenv.com</string>
- <key>options</key>
- <array>
- <string>/build</string>
- <string>RelWithDebInfo</string>
- </array>
- </map>
- <key>configure</key>
- <map>
- <key>arguments</key>
- <array>
- <string>../indra</string>
- </array>
- <key>options</key>
- <array>
- <string>-G</string>
- <string>"Visual Studio 10"</string>
- <string>-DSTANDALONE:BOOL=TRUE</string>
- <string>-DINSTALL_PROPRIETARY=FALSE</string>
- <string>-DFMOD=FALSE</string>
</array>
</map>
+ <key>default</key>
+ <string>True</string>
<key>name</key>
- <string>OpenSourceStandAloneRelWithDebInfo</string>
+ <string>RelWithDebInfo</string>
</map>
- <key>OpenSourceStandAloneRelease</key>
+ <key>RelWithDebInfoOS</key>
<map>
<key>build</key>
<map>
@@ -2640,74 +2374,32 @@
<string>SecondLife.sln</string>
</array>
<key>command</key>
- <string>devenv.com</string>
+ <string>msbuild.exe</string>
<key>options</key>
<array>
- <string>/build</string>
- <string>Release</string>
+ <string>/p:Configuration=RelWithDebInfo</string>
+ <string>/p:Platform=Win32</string>
+ <string>/t:Build</string>
+ <string>/p:useenv=true</string>
+ <string>/verbosity:minimal</string>
+ <string>/toolsversion:4.0</string>
+ <string>/p:"VCBuildAdditionalOptions= /incremental"</string>
</array>
</map>
<key>configure</key>
<map>
- <key>arguments</key>
- <array>
- <string>../indra</string>
- </array>
<key>options</key>
<array>
<string>-G</string>
<string>"Visual Studio 10"</string>
- <string>-DSTANDALONE:BOOL=TRUE</string>
+ <string>-DUNATTENDED:BOOL=ON</string>
<string>-DINSTALL_PROPRIETARY=FALSE</string>
+ <string>-DUSE_KDU=FALSE</string>
<string>-DFMOD=FALSE</string>
</array>
</map>
<key>name</key>
- <string>OpenSourceStandAloneRelease</string>
- </map>
- <key>RelWithDebInfo</key>
- <map>
- <key>build</key>
- <map>
- <key>arguments</key>
- <array>
- <string>SecondLife.sln</string>
- </array>
- <key>command</key>
- <string>BuildConsole</string>
- <key>options</key>
- <array>
- <string>/build</string>
- <string>"/cfg=RelWithDebInfo|Win32"</string>
- </array>
- </map>
- <key>configure</key>
- <map>
- <key>arguments</key>
- <array>
- <string>..\indra</string>
- <string>&amp;&amp;</string>
- <string>..\indra\tools\vstool\VSTool.exe</string>
- <string>--solution</string>
- <string>SecondLife.sln</string>
- <string>--config</string>
- <string>RelWithDebInfo</string>
- <string>--startup</string>
- <string>secondlife-bin</string>
- </array>
- <key>options</key>
- <array>
- <string>-G</string>
- <string>"Visual Studio 10"</string>
- <string>-DSTANDALONE:BOOL=OFF</string>
- <string>-DINSTALL_PROPRIETARY=TRUE</string>
- <string>-DFMOD=TRUE</string>
- </array>
- </map>
- <key>default</key>
- <string>True</string>
- <key>name</key>
- <string>RelWithDebInfo</string>
+ <string>RelWithDebInfoOS</string>
</map>
<key>Release</key>
<map>
@@ -2744,95 +2436,31 @@
<array>
<string>-G</string>
<string>"Visual Studio 10"</string>
- <string>-DSTANDALONE:BOOL=OFF</string>
- <string>-DINSTALL_PROPRIETARY=TRUE</string>
- <string>-DFMOD=TRUE</string>
</array>
</map>
<key>name</key>
<string>Release</string>
</map>
- <!-- OPEN-1 WORKAROUND begin - to be removed when VC express is detected correctly -->
- <key>VCexpressRelWithDebInfo</key>
+ <key>ReleaseOS</key>
<map>
<key>build</key>
<map>
<key>arguments</key>
<array>
- <string>"RelWithDebInfo|Win32"</string>
- </array>
- <key>command</key>
- <string>vcbuild.exe</string>
- <key>options</key>
- <array>
- <string>/u</string>
- <string>SecondLife.sln</string>
- </array>
- </map>
- <key>configure</key>
- <map>
- <key>options</key>
- <array>
- <string>-G</string>
- <string>"Visual Studio 10"</string>
- <string>-DSTANDALONE:BOOL=FALSE</string>
- <string>-DINSTALL_PROPRIETARY=FALSE</string>
- <string>-DFMOD=FALSE</string>
- </array>
- </map>
- <key>name</key>
- <string>VCexpressRelWithDebInfo</string>
- </map>
- <!-- OPEN-1 WORKAROUND end -->
- <!-- OPEN-1a WORKAROUND begin - to be removed when VC 2010 is detected correctly -->
- <key>VC10msbuildRelWithDebInfo</key>
- <map>
- <key>build</key>
- <map>
- <key>command</key>
- <string>msbuild.exe</string>
- <key>options</key>
- <array>
<string>SecondLife.sln</string>
- <string>/verbosity:minimal</string>
- <string>/t:build</string>
- <string>/p:Configuration=RelWithDebInfo</string>
- <string>/p:Platform=Win32</string>
- <string>/p:"VCBuildAdditionalOptions= /useenv"</string>
- <string>/p:"VCBuildAdditionalOptions= /incremental"</string>
- </array>
- </map>
- <key>configure</key>
- <map>
- <key>options</key>
- <array>
- <string>-G</string>
- <string>"Visual Studio 10"</string>
- <string>-DSTANDALONE:BOOL=FALSE</string>
- <string>-DINSTALL_PROPRIETARY=FALSE</string>
- <string>-DFMOD=FALSE</string>
</array>
- </map>
- <key>name</key>
- <string>VC10msbuildRelWithDebInfo</string>
- </map>
- <!-- OPEN-1a WORKAROUND end -->
- <!-- OPEN-1a Release WORKAROUND begin - to be removed when VC 2010 is detected correctly -->
- <key>VC10msbuildRelease</key>
- <map>
- <key>build</key>
- <map>
<key>command</key>
<string>msbuild.exe</string>
<key>options</key>
<array>
- <string>SecondLife.sln</string>
- <string>/t:build</string>
<string>/p:Configuration=Release</string>
<string>/p:Platform=Win32</string>
- <string>/p:"VCBuildAdditionalOptions= /useenv"</string>
+ <string>/t:Build</string>
+ <string>/p:useenv=true</string>
+ <string>/verbosity:minimal</string>
+ <string>/toolsversion:4.0</string>
<string>/p:"VCBuildAdditionalOptions= /incremental"</string>
- </array>
+ </array>
</map>
<key>configure</key>
<map>
@@ -2840,15 +2468,15 @@
<array>
<string>-G</string>
<string>"Visual Studio 10"</string>
- <string>-DSTANDALONE:BOOL=FALSE</string>
+ <string>-DUNATTENDED:BOOL=ON</string>
<string>-DINSTALL_PROPRIETARY=FALSE</string>
+ <string>-DUSE_KDU=FALSE</string>
<string>-DFMOD=FALSE</string>
</array>
</map>
<key>name</key>
- <string>VC10msbuildRelease</string>
+ <string>ReleaseOS</string>
</map>
- <!-- OPEN-1a WORKAROUND end -->
</map>
<key>name</key>
<string>windows</string>
diff --git a/build.sh b/build.sh
index 6677958716..4268c76e78 100755
--- a/build.sh
+++ b/build.sh
@@ -42,9 +42,13 @@ installer_Linux()
installer_CYGWIN()
{
- d=$(build_dir_CYGWIN ${last_built_variant:-Release})
- p=$(sed 's:.*=::' "$d/newview/${last_built_variant:-Release}/touched.bat")
- echo "$d/newview/${last_built_variant:-Release}/$p"
+ v=${last_built_variant:-Release}
+ d=$(build_dir_CYGWIN $v)
+ if [ -r "$d/newview/$v/touched.bat" ]
+ then
+ p=$(sed 's:.*=::' "$d/newview/$v/touched.bat")
+ echo "$d/newview/$v/$p"
+ fi
}
pre_build()
@@ -58,7 +62,6 @@ pre_build()
"$AUTOBUILD" configure -c $variant -- \
-DPACKAGE:BOOL=ON \
-DRELEASE_CRASH_REPORTING:BOOL=ON \
- -DUSE_PRECOMPILED_HEADERS=FALSE \
-DVIEWER_CHANNEL:STRING="\"$viewer_channel\"" \
-DVIEWER_LOGIN_CHANNEL:STRING="\"$viewer_login_channel\"" \
-DGRID:STRING="\"$viewer_grid\"" \
@@ -118,12 +121,14 @@ eval '$build_'"$arch" || pass
# File no longer exists in code-sep branch, so let's make sure it exists in order to use it.
if test -f scripts/update_version_files.py ; then
begin_section UpdateVer
- python scripts/update_version_files.py \
- --channel="$viewer_channel" \
- --server_channel="$server_channel" \
- --revision=$revision \
- --verbose \
+ eval $(python scripts/update_version_files.py \
+ --channel="$viewer_channel" \
+ --server_channel="$server_channel" \
+ --revision=$revision \
+ --verbose \
+ | sed -n -e "s,Setting viewer channel/version: '\([^']*\)' / '\([^']*\)',VIEWER_CHANNEL='\1';VIEWER_VERSION='\2',p")\
|| fail update_version_files.py
+ echo "{\"Type\":\"viewer\",\"Version\":\"${VIEWER_VERSION}\"}" > summary.json
end_section UpdateVer
fi
@@ -261,6 +266,7 @@ then
else
upload_item installer "$package" binary/octet-stream
upload_item quicklink "$package" binary/octet-stream
+ [ -f summary.json ] && upload_item installer summary.json text/plain
# Upload crash reporter files.
case "$last_built_variant" in
diff --git a/doc/contributions.txt b/doc/contributions.txt
index 4e11a74b28..b744f4db3e 100644
--- a/doc/contributions.txt
+++ b/doc/contributions.txt
@@ -76,6 +76,7 @@ Aleric Inglewood
VWR-13996
VWR-14426
VWR-24247
+ VWR-25654
VWR-24251
VWR-24252
VWR-24254
@@ -158,6 +159,7 @@ Ann Congrejo
Ansariel Hiller
STORM-1101
Ardy Lay
+ STORM-859
VWR-19499
VWR-24917
Argent Stonecutter
@@ -196,6 +198,7 @@ blino Nakamura
Boroondas Gupte
OPEN-29
OPEN-39
+ OPEN-39
SNOW-278
SNOW-503
SNOW-510
@@ -204,8 +207,10 @@ Boroondas Gupte
SNOW-624
SNOW-737
STORM-318
+ STORM-1182
VWR-233
VWR-20583
+ VWR-25654
VWR-20891
VWR-23455
VWR-24487
@@ -243,6 +248,7 @@ Coaldust Numbers
Cron Stardust
VWR-10579
VWR-25120
+ STORM-1075
Cypren Christenson
STORM-417
Dale Glass
@@ -251,6 +257,8 @@ Dale Glass
VWR-2502
VWR-1358
VWR-2041
+Draconis Neurocam
+ STORM-1259
Drew Dri
VWR-19683
Drewan Keats
@@ -361,6 +369,10 @@ Ian Kas
[NO JIRA] (Ukranian localization)
CT-322
CT-325
+Ima Mechanique
+ OPEN-50
+ OPEN-61
+ STORM-1175
Irene Muni
CT-324
CT-352
@@ -413,6 +425,7 @@ Jonathan Yap
VWR-17801
VWR-24347
STORM-975
+ STORM-990
STORM-1019
STORM-844
STORM-643
@@ -424,6 +437,15 @@ Jonathan Yap
STORM-1094
STORM-1077
STORM-953
+ STORM-1128
+ STORM-956
+ STORM-1095
+ STORM-1236
+ STORM-1259
+ STORM-787
+ STORM-1313
+ STORM-899
+ STORM-1273
Kage Pixel
VWR-11
Ken March
@@ -441,6 +463,7 @@ Kitty Barnett
STORM-799
STORM-800
STORM-1001
+ STORM-1175
VWR-24217
Kunnis Basiat
VWR-82
@@ -449,6 +472,8 @@ Lance Corrimal
VWR-25269
Latif Khalifa
VWR-5370
+leliel Mirihi
+ STORM-1100
Lisa Lowe
CT-218
CT-219
@@ -588,7 +613,7 @@ Nicholaz Beresford
VWR-2684
Nicky Perian
OPEN-1
- OPEN-1087
+ STORM-1087
STORM-1090
Nounouch Hapmouche
VWR-238
@@ -660,6 +685,8 @@ Robin Cornelius
STORM-422
STORM-960
STORM-1019
+ STORM-1095
+ STORM-1128
VWR-2488
VWR-9557
VWR-10579
@@ -710,6 +737,7 @@ Shawn Kaufmat
SNOW-240
Siana Gearz
STORM-960
+ STORM-1088
SignpostMarv Martin
VWR-153
VWR-154
@@ -748,6 +776,8 @@ Strife Onizuka
VWR-2265
VWR-4111
SNOW-691
+TankMaster Finesmith
+ STORM-1100
Tayra Dagostino
SNOW-517
SNOW-543
@@ -796,6 +826,7 @@ Thickbrick Sleaford
VWR-13483
VWR-13947
VWR-24420
+ STORM-956
STORM-1147
Thraxis Epsilon
SVC-371
@@ -803,9 +834,13 @@ Thraxis Epsilon
tiamat bingyi
CT-246
Tofu Buzzard
+ CTS-411
STORM-546
+ VWR-24509
TraductoresAnonimos Alter
CT-324
+TriloByte Zanzibar
+ STORM-1100
Tue Torok
CT-68
CT-69
@@ -873,6 +908,7 @@ WolfPup Lowenhar
STORM-674
STORM-776
STORM-825
+ STORM-859
STORM-1098
VWR-20741
VWR-20933
diff --git a/etc/message.xml b/etc/message.xml
index 764aea3879..3445975545 100644
--- a/etc/message.xml
+++ b/etc/message.xml
@@ -596,6 +596,13 @@
<boolean>false</boolean>
</map>
+ <key>ObjectPhysicsProperties</key>
+ <map>
+ <key>flavor</key>
+ <string>llsd</string>
+ <key>trusted-sender</key>
+ <boolean>true</boolean>
+ </map>
</map>
<key>capBans</key>
diff --git a/indra/CMakeLists.txt b/indra/CMakeLists.txt
index 310e6cbdd4..d1042d6e86 100644
--- a/indra/CMakeLists.txt
+++ b/indra/CMakeLists.txt
@@ -35,8 +35,10 @@ endif (NOT CMAKE_BUILD_TYPE)
# For the library installation process;
# see cmake/Prebuild.cmake for the counterpart code.
-file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/temp)
-file(WRITE ${CMAKE_BINARY_DIR}/temp/sentinel_installed "0")
+if ("${CMAKE_SOURCE_DIR}/../autobuild.xml" IS_NEWER_THAN "${CMAKE_BINARY_DIR}/temp/sentinel_installed")
+ file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/temp)
+ file(WRITE ${CMAKE_BINARY_DIR}/temp/sentinel_installed "0")
+endif ("${CMAKE_SOURCE_DIR}/../autobuild.xml" IS_NEWER_THAN "${CMAKE_BINARY_DIR}/temp/sentinel_installed")
add_subdirectory(cmake)
add_subdirectory(${LIBS_OPEN_PREFIX}llaudio)
diff --git a/indra/cmake/00-Common.cmake b/indra/cmake/00-Common.cmake
index 15b827b217..2c974fb4ff 100644
--- a/indra/cmake/00-Common.cmake
+++ b/indra/cmake/00-Common.cmake
@@ -36,6 +36,13 @@ if (WINDOWS)
# Don't build DLLs.
set(BUILD_SHARED_LIBS OFF)
+ # for "backwards compatibility", cmake sneaks in the Zm1000 option which royally
+ # screws incredibuild. this hack disables it.
+ # for details see: http://connect.microsoft.com/VisualStudio/feedback/details/368107/clxx-fatal-error-c1027-inconsistent-values-for-ym-between-creation-and-use-of-precompiled-headers
+ # http://www.ogre3d.org/forums/viewtopic.php?f=2&t=60015
+ # http://www.cmake.org/pipermail/cmake/2009-September/032143.html
+ string(REPLACE "/Zm1000" " " CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS})
+
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /Od /Zi /MDd /MP -D_SCL_SECURE_NO_WARNINGS=1"
CACHE STRING "C++ compiler debug options" FORCE)
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO
@@ -50,16 +57,18 @@ if (WINDOWS)
add_definitions(
/DLL_WINDOWS=1
+ /DDOM_DYNAMIC
/DUNICODE
/D_UNICODE
/GS
/TP
- /W3
+ /W2
/c
/Zc:forScope
/nologo
/Oy-
/Zc:wchar_t-
+ /arch:SSE2
)
# Are we using the crummy Visual Studio KDU build workaround?
@@ -134,6 +143,8 @@ if (LINUX)
-fno-strict-aliasing
-fsigned-char
-g
+ -msse2
+ -mfpmath=sse
-pthread
)
@@ -153,10 +164,6 @@ if (LINUX)
link_directories(/usr/lib/mysql4/mysql)
endif (EXISTS /usr/lib/mysql4/mysql)
- add_definitions(
- -msse2
- -mfpmath=sse
- )
endif (SERVER)
if (VIEWER)
@@ -164,6 +171,8 @@ 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)
+ #add_definitions(-ftree-vectorize) # THIS CRASHES GCC 3.1-3.2
if (NOT STANDALONE)
# this stops us requiring a really recent glibc at runtime
add_definitions(-fno-stack-protector)
@@ -203,7 +212,7 @@ if (LINUX OR DARWIN)
set(GCC_WARNINGS "${GCC_WARNINGS} -Werror")
endif (NOT GCC_DISABLE_FATAL_WARNINGS)
- set(GCC_CXX_WARNINGS "${GCC_WARNINGS} -Wno-reorder -Wno-non-virtual-dtor -Woverloaded-virtual")
+ set(GCC_CXX_WARNINGS "${GCC_WARNINGS} -Wno-reorder -Wno-non-virtual-dtor")
set(CMAKE_C_FLAGS "${GCC_WARNINGS} ${CMAKE_C_FLAGS}")
set(CMAKE_CXX_FLAGS "${GCC_CXX_WARNINGS} ${CMAKE_CXX_FLAGS}")
diff --git a/indra/cmake/CMakeLists.txt b/indra/cmake/CMakeLists.txt
index 89c1c3691a..279d577a27 100644
--- a/indra/cmake/CMakeLists.txt
+++ b/indra/cmake/CMakeLists.txt
@@ -34,6 +34,7 @@ set(cmake_SOURCE_FILES
FindZLIB.cmake
FMOD.cmake
FreeType.cmake
+ GLOD.cmake
GStreamer010Plugin.cmake
GooglePerfTools.cmake
JPEG.cmake
@@ -41,6 +42,7 @@ set(cmake_SOURCE_FILES
LLAudio.cmake
LLCharacter.cmake
LLCommon.cmake
+ LLConvexDecomposition.cmake
LLCrashLogger.cmake
LLDatabase.cmake
LLImage.cmake
diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake
index 4698116022..d9efc8f40d 100644
--- a/indra/cmake/Copy3rdPartyLibs.cmake
+++ b/indra/cmake/Copy3rdPartyLibs.cmake
@@ -39,6 +39,8 @@ if(WINDOWS)
libapriconv-1.dll
ssleay32.dll
libeay32.dll
+ libcollada14dom22-d.dll
+ glod.dll
)
set(release_src_dir "${ARCH_PREBUILT_DIRS_RELEASE}")
@@ -49,6 +51,8 @@ if(WINDOWS)
libapriconv-1.dll
ssleay32.dll
libeay32.dll
+ libcollada14dom22.dll
+ glod.dll
)
if(USE_GOOGLE_PERFTOOLS)
@@ -127,7 +131,8 @@ elseif (MSVC_VERSION EQUAL 1600) # VisualStudio 2010
PATHS
${MSVC_DEBUG_REDIST_PATH}
[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\10.0\\Setup\\VC;ProductDir]/redist/Debug_NonRedist/x86/Microsoft.VC100.DebugCRT
- NO_DEFAULT_PATH
+ [HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Windows;Directory]/SysWOW64
+ [HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Windows;Directory]/System32
NO_DEFAULT_PATH
)
@@ -151,7 +156,8 @@ elseif (MSVC_VERSION EQUAL 1600) # VisualStudio 2010
PATHS
${MSVC_REDIST_PATH}
[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\10.0\\Setup\\VC;ProductDir]/redist/x86/Microsoft.VC100.CRT
- NO_DEFAULT_PATH
+ [HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Windows;Directory]/SysWOW64
+ [HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Windows;Directory]/System32
NO_DEFAULT_PATH
)
@@ -205,9 +211,12 @@ elseif(DARWIN)
libaprutil-1.dylib
libexpat.1.5.2.dylib
libexpat.dylib
- libllqtwebkit.dylib
+ libGLOD.dylib
+ libllqtwebkit.dylib
+ libminizip.a
libndofdev.dylib
libexception_handler.dylib
+ libcollada14dom.dylib
)
# fmod is statically linked on darwin
@@ -243,23 +252,26 @@ elseif(LINUX)
libaprutil-1.so.0
libatk-1.0.so
libbreakpad_client.so.0
- libcrypto.so.0.9.8
+ libcollada14dom.so
+ libcrypto.so.1.0.0
libdb-5.1.so
libexpat.so
libexpat.so.1
+ libglod.so
libgmock_main.so
libgmock.so.0
libgmodule-2.0.so
libgobject-2.0.so
libgtest_main.so
libgtest.so.0
+ libminizip.so
libopenal.so
libopenjpeg.so
libssl.so
- libtcmalloc.so
+ libtcmalloc_minimal.so
libuuid.so.16
libuuid.so.16.0.22
- libssl.so.0.9.8
+ libssl.so.1.0.0
libfontconfig.so.1.4.4
)
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/FindTut.cmake b/indra/cmake/FindTut.cmake
deleted file mode 100644
index c2a9f43053..0000000000
--- a/indra/cmake/FindTut.cmake
+++ /dev/null
@@ -1,30 +0,0 @@
-# -*- cmake -*-
-
-# - Find Tut
-# Find the Tut unit test framework includes and library
-# This module defines
-# TUT_INCLUDE_DIR, where to find tut/tut.hpp.
-# TUT_FOUND, If false, do not try to use Tut.
-
-find_path(TUT_INCLUDE_DIR tut/tut.hpp
- NO_SYSTEM_ENVIRONMENT_PATH
- )
-
-if (TUT_INCLUDE_DIR)
- set(TUT_FOUND "YES")
-else (TUT_INCLUDE_DIR)
- set(TUT_FOUND "NO")
-endif (TUT_INCLUDE_DIR)
-
-if (TUT_FOUND)
- if (NOT TUT_FIND_QUIETLY)
- message(STATUS "Found Tut: ${TUT_INCLUDE_DIR}")
- set(TUT_FIND_QUIETLY TRUE) # Only alert us the first time
- endif (NOT TUT_FIND_QUIETLY)
-else (TUT_FOUND)
- if (TUT_FIND_REQUIRED)
- message(FATAL_ERROR "Could not find Tut")
- endif (TUT_FIND_REQUIRED)
-endif (TUT_FOUND)
-
-mark_as_advanced(TUT_INCLUDE_DIR)
diff --git a/indra/cmake/GLOD.cmake b/indra/cmake/GLOD.cmake
new file mode 100644
index 0000000000..77221d55ed
--- /dev/null
+++ b/indra/cmake/GLOD.cmake
@@ -0,0 +1,9 @@
+# -*- cmake -*-
+include(Prebuilt)
+
+if (NOT STANDALONE)
+ use_prebuilt_binary(GLOD)
+endif (NOT STANDALONE)
+
+set(GLOD_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/include)
+set(GLOD_LIBRARIES glod)
diff --git a/indra/cmake/GooglePerfTools.cmake b/indra/cmake/GooglePerfTools.cmake
index 6c784a3a76..8740e36753 100644
--- a/indra/cmake/GooglePerfTools.cmake
+++ b/indra/cmake/GooglePerfTools.cmake
@@ -5,15 +5,16 @@ if (STANDALONE)
include(FindGooglePerfTools)
else (STANDALONE)
if (WINDOWS)
- use_prebuilt_binary(google-perftools)
+ use_prebuilt_binary(tcmalloc)
set(TCMALLOC_LIBRARIES
debug libtcmalloc_minimal-debug
optimized libtcmalloc_minimal)
set(GOOGLE_PERFTOOLS_FOUND "YES")
endif (WINDOWS)
if (LINUX)
- use_prebuilt_binary(google-perftools)
- set(TCMALLOC_LIBRARIES tcmalloc)
+ use_prebuilt_binary(tcmalloc)
+ set(TCMALLOC_LIBRARIES
+ tcmalloc)
set(PROFILER_LIBRARIES profiler)
set(GOOGLE_PERFTOOLS_INCLUDE_DIR
${LIBS_PREBUILT_DIR}/include)
@@ -28,12 +29,11 @@ if (GOOGLE_PERFTOOLS_FOUND)
endif (GOOGLE_PERFTOOLS_FOUND)
if (WINDOWS)
- # *TODO -reenable this once we get server usage sorted out
- #set(USE_GOOGLE_PERFTOOLS ON)
+ set(USE_GOOGLE_PERFTOOLS ON)
endif (WINDOWS)
if (USE_GOOGLE_PERFTOOLS)
- set(TCMALLOC_FLAG -DLL_USE_TCMALLOC=1)
+ set(TCMALLOC_FLAG -ULL_USE_TCMALLOC=1)
include_directories(${GOOGLE_PERFTOOLS_INCLUDE_DIR})
set(GOOGLE_PERFTOOLS_LIBRARIES ${TCMALLOC_LIBRARIES} ${STACKTRACE_LIBRARIES} ${PROFILER_LIBRARIES})
else (USE_GOOGLE_PERFTOOLS)
diff --git a/indra/cmake/LLAddBuildTest.cmake b/indra/cmake/LLAddBuildTest.cmake
index 3f259f6382..08feab6e36 100644
--- a/indra/cmake/LLAddBuildTest.cmake
+++ b/indra/cmake/LLAddBuildTest.cmake
@@ -95,7 +95,7 @@ INCLUDE(GoogleMock)
IF(${name}_test_additional_INCLUDE_DIRS MATCHES NOTFOUND)
SET(${name}_test_additional_INCLUDE_DIRS "")
ENDIF(${name}_test_additional_INCLUDE_DIRS MATCHES NOTFOUND)
- INCLUDE_DIRECTORIES(${alltest_INCLUDE_DIRS} ${name}_test_additional_INCLUDE_DIRS )
+ INCLUDE_DIRECTORIES(${alltest_INCLUDE_DIRS} ${${name}_test_additional_INCLUDE_DIRS} )
IF(LL_TEST_VERBOSE)
MESSAGE("LL_ADD_PROJECT_UNIT_TESTS ${name}_test_additional_INCLUDE_DIRS ${${name}_test_additional_INCLUDE_DIRS}")
ENDIF(LL_TEST_VERBOSE)
diff --git a/indra/cmake/LLConvexDecomposition.cmake b/indra/cmake/LLConvexDecomposition.cmake
new file mode 100644
index 0000000000..8e44504782
--- /dev/null
+++ b/indra/cmake/LLConvexDecomposition.cmake
@@ -0,0 +1,12 @@
+# -*- cmake -*-
+include(Prebuilt)
+
+set(LLCONVEXDECOMP_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include)
+
+if (INSTALL_PROPRIETARY AND NOT STANDALONE)
+ use_prebuilt_binary(llconvexdecomposition)
+ set(LLCONVEXDECOMP_LIBRARY llconvexdecomposition)
+else (INSTALL_PROPRIETARY AND NOT STANDALONE)
+ use_prebuilt_binary(llconvexdecompositionstub)
+ set(LLCONVEXDECOMP_LIBRARY llconvexdecompositionstub)
+endif (INSTALL_PROPRIETARY AND NOT STANDALONE)
diff --git a/indra/cmake/LLPrimitive.cmake b/indra/cmake/LLPrimitive.cmake
index d397b78f1c..e68d16ed08 100644
--- a/indra/cmake/LLPrimitive.cmake
+++ b/indra/cmake/LLPrimitive.cmake
@@ -1,7 +1,33 @@
# -*- cmake -*-
+# these should be moved to their own cmake file
+include(Prebuilt)
+use_prebuilt_binary(colladadom)
+use_prebuilt_binary(pcre)
+use_prebuilt_binary(libxml)
+
set(LLPRIMITIVE_INCLUDE_DIRS
${LIBS_OPEN_DIR}/llprimitive
)
+if (WINDOWS)
+ set(LLPRIMITIVE_LIBRARIES
+ debug llprimitive
+ optimized llprimitive
+ debug libcollada14dom22-d
+ optimized libcollada14dom22
+ debug libboost_filesystem-vc100-mt-gd-1_45
+ optimized libboost_filesystem-vc100-mt-1_45
+ debug libboost_system-vc100-mt-gd-1_45
+ optimized libboost_system-vc100-mt-1_45
+ )
+else (WINDOWS)
+ set(LLPRIMITIVE_LIBRARIES
+ llprimitive
+ collada14dom
+ minizip
+ xml2
+ pcrecpp
+ pcre
+ )
+endif (WINDOWS)
-set(LLPRIMITIVE_LIBRARIES llprimitive)
diff --git a/indra/cmake/LLTestCommand.cmake b/indra/cmake/LLTestCommand.cmake
index 554559edbd..b5a0580a90 100644
--- a/indra/cmake/LLTestCommand.cmake
+++ b/indra/cmake/LLTestCommand.cmake
@@ -1,3 +1,4 @@
+include(Python)
MACRO(LL_TEST_COMMAND OUTVAR LD_LIBRARY_PATH)
# nat wonders how Kitware can use the term 'function' for a construct that
# cannot return a value. And yet, variables you set inside a FUNCTION are
diff --git a/indra/cmake/OpenGL.cmake b/indra/cmake/OpenGL.cmake
index 661666f00d..0a3dd976b4 100644
--- a/indra/cmake/OpenGL.cmake
+++ b/indra/cmake/OpenGL.cmake
@@ -2,8 +2,7 @@
include(Prebuilt)
if (NOT STANDALONE)
- use_prebuilt_binary(GL)
- # possible glh_linear should have its own .cmake file instead
+ use_prebuilt_binary(glext)
use_prebuilt_binary(glh_linear)
set(GLEXT_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/include)
endif (NOT STANDALONE)
diff --git a/indra/cmake/Prebuilt.cmake b/indra/cmake/Prebuilt.cmake
index 1b60d176f1..dbb4dfc46c 100644
--- a/indra/cmake/Prebuilt.cmake
+++ b/indra/cmake/Prebuilt.cmake
@@ -1,35 +1,49 @@
# -*- cmake -*-
include(FindAutobuild)
+if(INSTALL_PROPRIETARY)
+ include(FindSCP)
+endif(INSTALL_PROPRIETARY)
+# The use_prebuilt_binary macro handles automated installation of package
+# dependencies using autobuild. The goal is that 'autobuild install' should
+# only be run when we know we need to install a new package. This should be
+# the case in a clean checkout, or if autobuild.xml has been updated since the
+# last run (encapsulated by the file ${CMAKE_BINARY_DIR}/temp/sentinel_installed),
+# or if a previous attempt to install the package has failed (the exit status
+# of previous attempts is serialized in the file
+# ${CMAKE_BINARY_DIR}/temp/${_binary}_installed)
macro (use_prebuilt_binary _binary)
if (NOT DEFINED STANDALONE_${_binary})
set(STANDALONE_${_binary} ${STANDALONE})
endif (NOT DEFINED STANDALONE_${_binary})
if (NOT STANDALONE_${_binary})
- if(${CMAKE_BINARY_DIR}/temp/sentinel_installed IS_NEWER_THAN ${CMAKE_BINARY_DIR}/temp/${_binary}_installed)
- if(INSTALL_PROPRIETARY)
- include(FindSCP)
- endif(INSTALL_PROPRIETARY)
- if(DEBUG_PREBUILT)
- message("cd ${CMAKE_SOURCE_DIR} && ${AUTOBUILD_EXECUTABLE} install
- --install-dir=${AUTOBUILD_INSTALL_DIR}
- --skip-license-check
- ${_binary} ")
- endif(DEBUG_PREBUILT)
- execute_process(COMMAND "${AUTOBUILD_EXECUTABLE}"
- install
- --install-dir=${AUTOBUILD_INSTALL_DIR}
- --skip-license-check
- ${_binary}
- WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
- RESULT_VARIABLE ${_binary}_installed
- )
+ if("${${_binary}_installed}" STREQUAL "" AND EXISTS "${CMAKE_BINARY_DIR}/temp/${_binary}_installed")
+ file(READ ${CMAKE_BINARY_DIR}/temp/${_binary}_installed "${_binary}_installed")
+ if(DEBUG_PREBUILT)
+ message(STATUS "${_binary}_installed: \"${${_binary}_installed}\"")
+ endif(DEBUG_PREBUILT)
+ endif("${${_binary}_installed}" STREQUAL "" AND EXISTS "${CMAKE_BINARY_DIR}/temp/${_binary}_installed")
+
+ if(${CMAKE_BINARY_DIR}/temp/sentinel_installed IS_NEWER_THAN ${CMAKE_BINARY_DIR}/temp/${_binary}_installed OR NOT ${${_binary}_installed} EQUAL 0)
+ if(DEBUG_PREBUILT)
+ message("cd ${CMAKE_SOURCE_DIR} && ${AUTOBUILD_EXECUTABLE} install
+ --install-dir=${AUTOBUILD_INSTALL_DIR}
+ --skip-license-check
+ ${_binary} ")
+ endif(DEBUG_PREBUILT)
+ execute_process(COMMAND "${AUTOBUILD_EXECUTABLE}"
+ install
+ --install-dir=${AUTOBUILD_INSTALL_DIR}
+ --skip-license-check
+ ${_binary}
+ WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
+ RESULT_VARIABLE ${_binary}_installed
+ )
file(WRITE ${CMAKE_BINARY_DIR}/temp/${_binary}_installed "${${_binary}_installed}")
- else(${CMAKE_BINARY_DIR}/temp/sentinel_installed IS_NEWER_THAN ${CMAKE_BINARY_DIR}/temp/${_binary}_installed)
- set(${_binary}_installed 0)
- endif(${CMAKE_BINARY_DIR}/temp/sentinel_installed IS_NEWER_THAN ${CMAKE_BINARY_DIR}/temp/${_binary}_installed)
+ endif(${CMAKE_BINARY_DIR}/temp/sentinel_installed IS_NEWER_THAN ${CMAKE_BINARY_DIR}/temp/${_binary}_installed OR NOT ${${_binary}_installed} EQUAL 0)
+
if(NOT ${_binary}_installed EQUAL 0)
message(FATAL_ERROR
"Failed to download or unpack prebuilt '${_binary}'."
diff --git a/indra/cmake/Pth.cmake b/indra/cmake/Pth.cmake
deleted file mode 100644
index a28f6ec696..0000000000
--- a/indra/cmake/Pth.cmake
+++ /dev/null
@@ -1,21 +0,0 @@
-# -*- cmake -*-
-include(Prebuilt)
-
-set(PTH_FIND_QUIETLY ON)
-set(PTH_FIND_REQUIRED ON)
-
-if (STANDALONE)
-# ?? How would I construct FindPTH.cmake? This file was cloned from
-# CURL.cmake, which uses include(FindCURL), but there's no FindCURL.cmake?
-# include(FindPTH)
-else (STANDALONE)
- # This library is only needed to support Boost.Coroutine, and only on Mac.
- if (DARWIN)
- use_prebuilt_binary(pth)
- set(PTH_LIBRARIES pth)
- set(PTH_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include)
- else (DARWIN)
- set(PTH_LIBRARIES)
- set(PTH_INCLUDE_DIRS)
- endif (DARWIN)
-endif (STANDALONE)
diff --git a/indra/cmake/Tut.cmake b/indra/cmake/Tut.cmake
index 738c08c42f..7488e9dcb0 100644
--- a/indra/cmake/Tut.cmake
+++ b/indra/cmake/Tut.cmake
@@ -1,11 +1,6 @@
# -*- cmake -*-
include(Prebuilt)
-set(TUT_FIND_REQUIRED TRUE)
-set(TUT_FIND_QUIETLY TRUE)
-
-if (STANDALONE)
- include(FindTut)
-else (STANDALONE)
+if (NOT STANDALONE)
use_prebuilt_binary(tut)
-endif (STANDALONE)
+endif(NOT STANDALONE)
diff --git a/indra/cmake/Variables.cmake b/indra/cmake/Variables.cmake
index 77dd34d122..4cbf7aa043 100644
--- a/indra/cmake/Variables.cmake
+++ b/indra/cmake/Variables.cmake
@@ -29,6 +29,7 @@ set(SERVER_PREFIX)
set(VIEWER_PREFIX)
set(INTEGRATION_TESTS_PREFIX)
set(LL_TESTS ON CACHE BOOL "Build and run unit and integration tests (disable for build timing runs to reduce variation")
+set(INCREMENTAL_LINK OFF CACHE BOOL "Use incremental linking on win32 builds (enable for faster links on some machines)")
if(LIBS_CLOSED_DIR)
file(TO_CMAKE_PATH "${LIBS_CLOSED_DIR}" LIBS_CLOSED_DIR)
@@ -101,8 +102,8 @@ 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_DEBUG_INFORMATION_FORMAT "DWARF with dSYM File")
+ 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:
# -DCMAKE_OSX_ARCHITECTURES:STRING='i386;ppc'
@@ -135,6 +136,7 @@ set(VIEWER_LOGIN_CHANNEL ${VIEWER_CHANNEL} CACHE STRING "Fake login channel for
set(VERSION_BUILD "0" CACHE STRING "Revision number passed in from the outside")
set(STANDALONE OFF CACHE BOOL "Do not use Linden-supplied prebuilt libraries.")
+set(UNATTENDED OFF CACHE BOOL "Should be set to ON for building with VC Express editions.")
if (NOT STANDALONE AND EXISTS ${CMAKE_SOURCE_DIR}/llphysics)
set(SERVER ON CACHE BOOL "Build Second Life server software.")
@@ -150,7 +152,7 @@ For more information, please see JIRA DEV-14943 - Cmake Linux cannot build both
endif (LINUX AND SERVER AND VIEWER)
-set(USE_PRECOMPILED_HEADERS OFF CACHE BOOL "Enable use of precompiled header directives where supported.")
+set(USE_PRECOMPILED_HEADERS ON CACHE BOOL "Enable use of precompiled header directives where supported.")
source_group("CMake Rules" FILES CMakeLists.txt)
diff --git a/indra/cmake/WebKitLibPlugin.cmake b/indra/cmake/WebKitLibPlugin.cmake
index 0f5a81c020..7131445464 100644
--- a/indra/cmake/WebKitLibPlugin.cmake
+++ b/indra/cmake/WebKitLibPlugin.cmake
@@ -26,42 +26,45 @@ if (STANDALONE)
endforeach(qlibname)
# qjpeg depends on libjpeg
list(APPEND QT_PLUGIN_LIBRARIES jpeg)
- set(WEBKITLIBPLUGIN OFF CACHE BOOL
- "WEBKITLIBPLUGIN support for the llplugin/llmedia test apps.")
+ set(WEBKITLIBPLUGIN OFF CACHE BOOL
+ "WEBKITLIBPLUGIN support for the llplugin/llmedia test apps.")
else (STANDALONE)
- use_prebuilt_binary(llqtwebkit)
- set(WEBKITLIBPLUGIN ON CACHE BOOL
- "WEBKITLIBPLUGIN support for the llplugin/llmedia test apps.")
+ use_prebuilt_binary(llqtwebkit)
+ set(WEBKITLIBPLUGIN ON CACHE BOOL
+ "WEBKITLIBPLUGIN support for the llplugin/llmedia test apps.")
endif (STANDALONE)
if (WINDOWS)
- set(WEBKIT_PLUGIN_LIBRARIES
- debug llqtwebkitd
- debug QtWebKitd4
- debug QtOpenGLd4
- debug QtNetworkd4
- debug QtGuid4
- debug QtCored4
- debug qtmaind
- optimized llqtwebkit
- optimized QtWebKit4
- optimized QtOpenGL4
- optimized QtNetwork4
- optimized QtGui4
- optimized QtCore4
- optimized qtmain
- )
+ set(WEBKIT_PLUGIN_LIBRARIES
+ debug llqtwebkitd
+ debug QtWebKitd4
+ debug QtOpenGLd4
+ debug QtNetworkd4
+ debug QtGuid4
+ debug QtCored4
+ debug qtmaind
+ optimized llqtwebkit
+ optimized QtWebKit4
+ optimized QtOpenGL4
+ optimized QtNetwork4
+ optimized QtGui4
+ optimized QtCore4
+ optimized qtmain
+ )
elseif (DARWIN)
- set(WEBKIT_PLUGIN_LIBRARIES
- optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libllqtwebkit.dylib
- debug ${ARCH_PREBUILT_DIRS_RELEASE}/libllqtwebkit.dylib
- )
+ set(WEBKIT_PLUGIN_LIBRARIES
+ optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libllqtwebkit.dylib
+ debug ${ARCH_PREBUILT_DIRS_RELEASE}/libllqtwebkit.dylib
+ )
elseif (LINUX)
- if (STANDALONE)
set(WEBKIT_PLUGIN_LIBRARIES ${LLQTWEBKIT_LIBRARY} ${QT_LIBRARIES} ${QT_PLUGIN_LIBRARIES})
- else (STANDALONE)
set(WEBKIT_PLUGIN_LIBRARIES
llqtwebkit
+# qico
+# qpng
+# qtiff
+# qsvg
+# QtSvg
QtWebKit
QtOpenGL
QtNetwork
@@ -74,6 +77,9 @@ elseif (LINUX)
X11
Xrender
GL
+
+# sqlite3
+# Xi
+# SM
)
- endif (STANDALONE)
endif (WINDOWS)
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/llimage_libtest/llimage_libtest.cpp b/indra/integration_tests/llimage_libtest/llimage_libtest.cpp
index 365f5f758c..976aae08bb 100644
--- a/indra/integration_tests/llimage_libtest/llimage_libtest.cpp
+++ b/indra/integration_tests/llimage_libtest/llimage_libtest.cpp
@@ -53,12 +53,36 @@ static const char USAGE[] = "\n"
" -o, --output <file1 .. file2> OR <type>\n"
" List of image files to create (assumes same order as for input files)\n"
" OR 3 letters file type extension to convert each input file into.\n"
+" -r, --region <x0, y0, x1, y1>\n"
+" Crop region applied to the input files in pixels.\n"
+" Only used for j2c images. Default is no region cropping.\n"
+" -d, --discard_level <n>\n"
+" Discard level max used on input. 0 is highest resolution. Max discard level is 5.\n"
+" This allows the input image to be clamped in resolution when loading.\n"
+" Only valid for j2c images. Default is no discard.\n"
+" -p, --precincts <n>\n"
+" Dimension of precincts in pixels. Precincts are assumed square and identical for\n"
+" all levels. Note that this option also add PLT and tile markers to the codestream, \n"
+" and uses RPCL order. Power of 2 must be used.\n"
+" Only valid for output j2c images. Default is no precincts used.\n"
+" -b, --blocks <n>\n"
+" Dimension of coding blocks in pixels. Blocks are assumed square. Power of 2 must\n"
+" be used. Blocks must be smaller than precincts. Like precincts, this option adds\n"
+" PLT, tile markers and uses RPCL.\n"
+" Only valid for output j2c images. Default is 64.\n"
+" -l, --levels <n>\n"
+" Number of decomposition levels (aka discard levels) in the output image.\n"
+" The maximum number of levels authorized is 32.\n"
+" Only valid for output j2c images. Default is 5.\n"
+" -rev, --reversible\n"
+" Set the compression to be lossless (reversible in j2c parlance).\n"
+" Only valid for output j2c images.\n"
" -log, --logmetrics <metric>\n"
" Log performance data for <metric>. Results in <metric>.slp\n"
" Note: so far, only ImageCompressionTester has been tested.\n"
-" -r, --analyzeperformance\n"
+" -a, --analyzeperformance\n"
" Create a report comparing <metric>_baseline.slp with current <metric>.slp\n"
-" Results in <metric>_report.csv"
+" Results in <metric>_report.csv\n"
" -s, --image-stats\n"
" Output stats for each input and output image.\n"
"\n";
@@ -69,31 +93,8 @@ static bool sAllDone = false;
// Create an empty formatted image instance of the correct type from the filename
LLPointer<LLImageFormatted> create_image(const std::string &filename)
{
- std::string exten = gDirUtilp->getExtension(filename);
- U32 codec = LLImageBase::getCodecFromExtension(exten);
-
- LLPointer<LLImageFormatted> image;
- switch (codec)
- {
- case IMG_CODEC_BMP:
- image = new LLImageBMP();
- break;
- case IMG_CODEC_TGA:
- image = new LLImageTGA();
- break;
- case IMG_CODEC_JPEG:
- image = new LLImageJPEG();
- break;
- case IMG_CODEC_J2C:
- image = new LLImageJ2C();
- break;
- case IMG_CODEC_PNG:
- image = new LLImagePNG();
- break;
- default:
- return NULL;
- }
-
+ std::string exten = gDirUtilp->getExtension(filename);
+ LLPointer<LLImageFormatted> image = LLImageFormatted::createFromExtension(exten);
return image;
}
@@ -110,10 +111,11 @@ void output_image_stats(LLPointer<LLImageFormatted> image, const std::string &fi
}
// Load an image from file and return a raw (decompressed) instance of its data
-LLPointer<LLImageRaw> load_image(const std::string &src_filename, bool output_stats)
+LLPointer<LLImageRaw> load_image(const std::string &src_filename, int discard_level, int* region, bool output_stats)
{
LLPointer<LLImageFormatted> image = create_image(src_filename);
-
+
+ // This just loads the image file stream into a buffer. No decoding done.
if (!image->load(src_filename))
{
return NULL;
@@ -131,6 +133,15 @@ LLPointer<LLImageRaw> load_image(const std::string &src_filename, bool output_st
}
LLPointer<LLImageRaw> raw_image = new LLImageRaw;
+
+ // Set the image restriction on load in the case of a j2c image
+ if ((image->getCodec() == IMG_CODEC_J2C) && ((discard_level != -1) || (region != NULL)))
+ {
+ // That method doesn't exist (and likely, doesn't make sense) for any other image file format
+ // hence the required cryptic cast.
+ ((LLImageJ2C*)(image.get()))->initDecode(*raw_image, discard_level, region);
+ }
+
if (!image->decode(raw_image, 0.0f))
{
return NULL;
@@ -140,10 +151,22 @@ LLPointer<LLImageRaw> load_image(const std::string &src_filename, bool output_st
}
// Save a raw image instance into a file
-bool save_image(const std::string &dest_filename, LLPointer<LLImageRaw> raw_image, bool output_stats)
+bool save_image(const std::string &dest_filename, LLPointer<LLImageRaw> raw_image, int blocks_size, int precincts_size, int levels, bool reversible, bool output_stats)
{
LLPointer<LLImageFormatted> image = create_image(dest_filename);
+ // Set the image codestream parameters on output in the case of a j2c image
+ if (image->getCodec() == IMG_CODEC_J2C)
+ {
+ // That method doesn't exist (and likely, doesn't make sense) for any other image file format
+ // hence the required cryptic cast.
+ if ((blocks_size != -1) || (precincts_size != -1) || (levels != 0))
+ {
+ ((LLImageJ2C*)(image.get()))->initEncode(*raw_image, blocks_size, precincts_size, levels);
+ }
+ ((LLImageJ2C*)(image.get()))->setReversible(reversible);
+ }
+
if (!image->encode(raw_image, 0.0f))
{
return false;
@@ -280,8 +303,15 @@ int main(int argc, char** argv)
// List of input and output files
std::list<std::string> input_filenames;
std::list<std::string> output_filenames;
+ // Other optional parsed arguments
bool analyze_performance = false;
bool image_stats = false;
+ int* region = NULL;
+ int discard_level = -1;
+ int precincts_size = -1;
+ int blocks_size = -1;
+ int levels = 0;
+ bool reversible = false;
// Init whatever is necessary
ll_init_apr();
@@ -323,6 +353,99 @@ int main(int argc, char** argv)
file_name = argv[arg+1]; // Next argument and loop over
}
}
+ else if ((!strcmp(argv[arg], "--region") || !strcmp(argv[arg], "-r")) && arg < argc-1)
+ {
+ std::string value_str = argv[arg+1];
+ int index = 0;
+ region = new int[4];
+ while (value_str[0] != '-') // if arg starts with '-', it's the next option
+ {
+ int value = atoi(value_str.c_str());
+ region[index++] = value;
+ arg += 1; // Definitely skip that arg now we know it's a number
+ if ((arg + 1) == argc) // Break out of the loop if we reach the end of the arg list
+ break;
+ if (index == 4) // Break out of the loop if we captured 4 values already
+ break;
+ value_str = argv[arg+1]; // Next argument and loop over
+ }
+ if (index != 4)
+ {
+ std::cout << "--region arguments invalid" << std::endl;
+ delete [] region;
+ region = NULL;
+ }
+ }
+ else if (!strcmp(argv[arg], "--discard_level") || !strcmp(argv[arg], "-d"))
+ {
+ std::string value_str;
+ if ((arg + 1) < argc)
+ {
+ value_str = argv[arg+1];
+ }
+ if (((arg + 1) >= argc) || (value_str[0] == '-'))
+ {
+ std::cout << "No valid --discard_level argument given, discard_level ignored" << std::endl;
+ }
+ else
+ {
+ discard_level = atoi(value_str.c_str());
+ // Clamp to the values accepted by the viewer
+ discard_level = llclamp(discard_level,0,5);
+ }
+ }
+ else if (!strcmp(argv[arg], "--precincts") || !strcmp(argv[arg], "-p"))
+ {
+ std::string value_str;
+ if ((arg + 1) < argc)
+ {
+ value_str = argv[arg+1];
+ }
+ if (((arg + 1) >= argc) || (value_str[0] == '-'))
+ {
+ std::cout << "No valid --precincts argument given, precincts ignored" << std::endl;
+ }
+ else
+ {
+ precincts_size = atoi(value_str.c_str());
+ }
+ }
+ else if (!strcmp(argv[arg], "--blocks") || !strcmp(argv[arg], "-b"))
+ {
+ std::string value_str;
+ if ((arg + 1) < argc)
+ {
+ value_str = argv[arg+1];
+ }
+ if (((arg + 1) >= argc) || (value_str[0] == '-'))
+ {
+ std::cout << "No valid --blocks argument given, blocks ignored" << std::endl;
+ }
+ else
+ {
+ blocks_size = atoi(value_str.c_str());
+ }
+ }
+ else if (!strcmp(argv[arg], "--levels") || !strcmp(argv[arg], "-l"))
+ {
+ std::string value_str;
+ if ((arg + 1) < argc)
+ {
+ value_str = argv[arg+1];
+ }
+ if (((arg + 1) >= argc) || (value_str[0] == '-'))
+ {
+ std::cout << "No valid --levels argument given, default (5) will be used" << std::endl;
+ }
+ else
+ {
+ levels = atoi(value_str.c_str());
+ }
+ }
+ else if (!strcmp(argv[arg], "--reversible") || !strcmp(argv[arg], "-rev"))
+ {
+ reversible = true;
+ }
else if (!strcmp(argv[arg], "--logmetrics") || !strcmp(argv[arg], "-log"))
{
// '--logmetrics' needs to be specified with a named test metric argument
@@ -346,7 +469,7 @@ int main(int argc, char** argv)
break;
}
}
- else if (!strcmp(argv[arg], "--analyzeperformance") || !strcmp(argv[arg], "-r"))
+ else if (!strcmp(argv[arg], "--analyzeperformance") || !strcmp(argv[arg], "-a"))
{
analyze_performance = true;
}
@@ -364,7 +487,7 @@ int main(int argc, char** argv)
}
if (analyze_performance && !LLFastTimer::sMetricLog)
{
- std::cout << "Cannot create perf report if no perf gathered (i.e. use argument -log <perf> with -r) -> exit" << std::endl;
+ std::cout << "Cannot create perf report if no perf gathered (i.e. use argument -log <perf> with -a) -> exit" << std::endl;
return 0;
}
@@ -382,10 +505,10 @@ int main(int argc, char** argv)
std::list<std::string>::iterator out_file = output_filenames.begin();
std::list<std::string>::iterator in_end = input_filenames.end();
std::list<std::string>::iterator out_end = output_filenames.end();
- for (; in_file != in_end; ++in_file)
+ for (; in_file != in_end; ++in_file, ++out_file)
{
// Load file
- LLPointer<LLImageRaw> raw_image = load_image(*in_file, image_stats);
+ LLPointer<LLImageRaw> raw_image = load_image(*in_file, discard_level, region, image_stats);
if (!raw_image)
{
std::cout << "Error: Image " << *in_file << " could not be loaded" << std::endl;
@@ -395,7 +518,7 @@ int main(int argc, char** argv)
// Save file
if (out_file != out_end)
{
- if (!save_image(*out_file, raw_image, image_stats))
+ if (!save_image(*out_file, raw_image, blocks_size, precincts_size, levels, reversible, image_stats))
{
std::cout << "Error: Image " << *out_file << " could not be saved" << std::endl;
}
@@ -403,29 +526,28 @@ int main(int argc, char** argv)
{
std::cout << *in_file << " -> " << *out_file << std::endl;
}
- ++out_file;
}
}
- // Stop the perf gathering system if needed
- if (LLFastTimer::sMetricLog)
- {
- LLMetricPerformanceTesterBasic::deleteTester(LLFastTimer::sLogName);
- sAllDone = true;
- }
-
// Output perf data if requested by user
if (analyze_performance)
{
- std::cout << "Analyzing performance" << std::endl;
-
std::string baseline_name = LLFastTimer::sLogName + "_baseline.slp";
std::string current_name = LLFastTimer::sLogName + ".slp";
std::string report_name = LLFastTimer::sLogName + "_report.csv";
+ std::cout << "Analyzing performance, check report in : " << report_name << std::endl;
+
LLMetricPerformanceTesterBasic::doAnalysisMetrics(baseline_name, current_name, report_name);
}
+ // Stop the perf gathering system if needed
+ if (LLFastTimer::sMetricLog)
+ {
+ LLMetricPerformanceTesterBasic::deleteTester(LLFastTimer::sLogName);
+ sAllDone = true;
+ }
+
// Cleanup and exit
LLImage::cleanupClass();
if (fast_timer_log_thread)
diff --git a/indra/integration_tests/llui_libtest/llui_libtest.cpp b/indra/integration_tests/llui_libtest/llui_libtest.cpp
index c34115ee80..217e26c3ca 100644
--- a/indra/integration_tests/llui_libtest/llui_libtest.cpp
+++ b/indra/integration_tests/llui_libtest/llui_libtest.cpp
@@ -33,6 +33,7 @@
// linden library includes
#include "llcontrol.h" // LLControlGroup
#include "lldir.h"
+#include "lldiriterator.h"
#include "llerrorcontrol.h"
#include "llfloater.h"
#include "llfontfreetype.h"
@@ -174,7 +175,9 @@ void export_test_floaters()
std::string delim = gDirUtilp->getDirDelimiter();
std::string xui_dir = get_xui_dir() + "en" + delim;
std::string filename;
- while (gDirUtilp->getNextFileInDir(xui_dir, "floater_test_*.xml", filename))
+
+ LLDirIterator iter(xui_dir, "floater_test_*.xml");
+ while (iter.next(filename))
{
if (filename.find("_new.xml") != std::string::npos)
{
diff --git a/indra/linux_updater/linux_updater.cpp b/indra/linux_updater/linux_updater.cpp
index a81de0223c..eed00ac06e 100644
--- a/indra/linux_updater/linux_updater.cpp
+++ b/indra/linux_updater/linux_updater.cpp
@@ -33,6 +33,7 @@
#include "llerrorcontrol.h"
#include "llfile.h"
#include "lldir.h"
+#include "lldiriterator.h"
#include "llxmlnode.h"
#include "lltrans.h"
@@ -55,6 +56,8 @@ typedef struct _updater_app_state {
std::string strings_dirs;
std::string strings_file;
+ LLDirIterator *image_dir_iter;
+
GtkWidget *window;
GtkWidget *progress_bar;
GtkWidget *image;
@@ -115,7 +118,7 @@ bool translate_init(std::string comma_delim_path_list,
void updater_app_ui_init(void);
void updater_app_quit(UpdaterAppState *app_state);
void parse_args_and_init(int argc, char **argv, UpdaterAppState *app_state);
-std::string next_image_filename(std::string& image_path);
+std::string next_image_filename(std::string& image_path, LLDirIterator& iter);
void display_error(GtkWidget *parent, std::string title, std::string message);
BOOL install_package(std::string package_file, std::string destination);
BOOL spawn_viewer(UpdaterAppState *app_state);
@@ -181,7 +184,7 @@ void updater_app_ui_init(UpdaterAppState *app_state)
// load the first image
app_state->image = gtk_image_new_from_file
- (next_image_filename(app_state->image_dir).c_str());
+ (next_image_filename(app_state->image_dir, *app_state->image_dir_iter).c_str());
gtk_widget_set_size_request(app_state->image, 340, 310);
gtk_container_add(GTK_CONTAINER(frame), app_state->image);
@@ -212,7 +215,7 @@ gboolean rotate_image_cb(gpointer data)
llassert(data != NULL);
app_state = (UpdaterAppState *) data;
- filename = next_image_filename(app_state->image_dir);
+ filename = next_image_filename(app_state->image_dir, *app_state->image_dir_iter);
gdk_threads_enter();
gtk_image_set_from_file(GTK_IMAGE(app_state->image), filename.c_str());
@@ -221,10 +224,10 @@ gboolean rotate_image_cb(gpointer data)
return TRUE;
}
-std::string next_image_filename(std::string& image_path)
+std::string next_image_filename(std::string& image_path, LLDirIterator& iter)
{
std::string image_filename;
- gDirUtilp->getNextFileInDir(image_path, "/*.jpg", image_filename);
+ iter.next(image_filename);
return image_path + "/" + image_filename;
}
@@ -748,6 +751,7 @@ void parse_args_and_init(int argc, char **argv, UpdaterAppState *app_state)
else if ((!strcmp(argv[i], "--image-dir")) && (++i < argc))
{
app_state->image_dir = argv[i];
+ app_state->image_dir_iter = new LLDirIterator(argv[i], "/*.jpg");
}
else if ((!strcmp(argv[i], "--dest")) && (++i < argc))
{
@@ -832,6 +836,7 @@ int main(int argc, char **argv)
}
bool success = !app_state->failure;
+ delete app_state->image_dir_iter;
delete app_state;
return success ? 0 : 1;
}
diff --git a/indra/llcharacter/CMakeLists.txt b/indra/llcharacter/CMakeLists.txt
index 14841b5d3d..6eb154458d 100644
--- a/indra/llcharacter/CMakeLists.txt
+++ b/indra/llcharacter/CMakeLists.txt
@@ -77,12 +77,13 @@ list(APPEND llcharacter_SOURCE_FILES ${llcharacter_HEADER_FILES})
add_library (llcharacter ${llcharacter_SOURCE_FILES})
-if(LL_TESTS)
- # Add tests
- include(LLAddBuildTest)
- # UNIT TESTS
- SET(llcharacter_TEST_SOURCE_FILES
- lljoint.cpp
- )
- LL_ADD_PROJECT_UNIT_TESTS(llcharacter "${llcharacter_TEST_SOURCE_FILES}")
-endif(LL_TESTS)
+# Add tests
+if (LL_TESTS)
+ include(LLAddBuildTest)
+ # UNIT TESTS
+ SET(llcharacter_TEST_SOURCE_FILES
+ lljoint.cpp
+ )
+ LL_ADD_PROJECT_UNIT_TESTS(llcharacter "${llcharacter_TEST_SOURCE_FILES}")
+endif (LL_TESTS)
+
diff --git a/indra/llcharacter/llbvhloader.cpp b/indra/llcharacter/llbvhloader.cpp
index 532a2c1b0d..f3cf950afa 100644
--- a/indra/llcharacter/llbvhloader.cpp
+++ b/indra/llcharacter/llbvhloader.cpp
@@ -42,10 +42,10 @@ using namespace std;
#define INCHES_TO_METERS 0.02540005f
-const F32 POSITION_KEYFRAME_THRESHOLD = 0.03f;
+const F32 POSITION_KEYFRAME_THRESHOLD_SQUARED = 0.03f * 0.03f;
const F32 ROTATION_KEYFRAME_THRESHOLD = 0.01f;
-const F32 POSITION_MOTION_THRESHOLD = 0.001f;
+const F32 POSITION_MOTION_THRESHOLD_SQUARED = 0.001f * 0.001f;
const F32 ROTATION_MOTION_THRESHOLD = 0.001f;
char gInFile[1024]; /* Flawfinder: ignore */
@@ -1196,7 +1196,7 @@ void LLBVHLoader::optimize()
if (ki_prev == ki_last_good_pos)
{
joint->mNumPosKeys++;
- if (dist_vec(LLVector3(ki_prev->mPos), first_frame_pos) > POSITION_MOTION_THRESHOLD)
+ if (dist_vec_squared(LLVector3(ki_prev->mPos), first_frame_pos) > POSITION_MOTION_THRESHOLD_SQUARED)
{
pos_changed = TRUE;
}
@@ -1209,12 +1209,12 @@ void LLBVHLoader::optimize()
LLVector3 current_pos(ki->mPos);
LLVector3 interp_pos = lerp(current_pos, last_good_pos, 1.f / (F32)numPosFramesConsidered);
- if (dist_vec(current_pos, first_frame_pos) > POSITION_MOTION_THRESHOLD)
+ if (dist_vec_squared(current_pos, first_frame_pos) > POSITION_MOTION_THRESHOLD_SQUARED)
{
pos_changed = TRUE;
}
- if (dist_vec(interp_pos, test_pos) < POSITION_KEYFRAME_THRESHOLD)
+ if (dist_vec_squared(interp_pos, test_pos) < POSITION_KEYFRAME_THRESHOLD_SQUARED)
{
ki_prev->mIgnorePos = TRUE;
numPosFramesConsidered++;
diff --git a/indra/llcharacter/lljoint.cpp b/indra/llcharacter/lljoint.cpp
index 5d750c6c96..19907933cb 100644
--- a/indra/llcharacter/lljoint.cpp
+++ b/indra/llcharacter/lljoint.cpp
@@ -50,6 +50,7 @@ LLJoint::LLJoint()
mUpdateXform = TRUE;
mJointNum = -1;
touch();
+ mResetAfterRestoreOldXform = false;
}
@@ -235,6 +236,42 @@ void LLJoint::setPosition( const LLVector3& pos )
//--------------------------------------------------------------------
+// setPosition()
+//--------------------------------------------------------------------
+void LLJoint::setDefaultFromCurrentXform( void )
+{
+ mDefaultXform = mXform;
+ touch(MATRIX_DIRTY | POSITION_DIRTY);
+
+}
+
+//--------------------------------------------------------------------
+// storeCurrentXform()
+//--------------------------------------------------------------------
+void LLJoint::storeCurrentXform( const LLVector3& pos )
+{
+ mOldXform = mXform;
+ mResetAfterRestoreOldXform = true;
+ setPosition( pos );
+}
+//--------------------------------------------------------------------
+// restoreOldXform()
+//--------------------------------------------------------------------
+void LLJoint::restoreOldXform( void )
+{
+ mResetAfterRestoreOldXform = false;
+ mXform = mOldXform;
+}
+//--------------------------------------------------------------------
+// restoreOldXform()
+//--------------------------------------------------------------------
+void LLJoint::restoreToDefaultXform( void )
+{
+ mXform = mDefaultXform;
+ setPosition( mXform.getPosition() );
+}
+
+//--------------------------------------------------------------------
// getWorldPosition()
//--------------------------------------------------------------------
LLVector3 LLJoint::getWorldPosition()
@@ -522,3 +559,4 @@ void LLJoint::clampRotation(LLQuaternion old_rot, LLQuaternion new_rot)
}
// End
+
diff --git a/indra/llcharacter/lljoint.h b/indra/llcharacter/lljoint.h
index 8c8e5930fb..dc3c58cf64 100644
--- a/indra/llcharacter/lljoint.h
+++ b/indra/llcharacter/lljoint.h
@@ -80,11 +80,16 @@ protected:
// explicit transformation members
LLXformMatrix mXform;
+ LLXformMatrix mOldXform;
+ LLXformMatrix mDefaultXform;
+ LLUUID mId;
public:
U32 mDirtyFlags;
BOOL mUpdateXform;
+ BOOL mResetAfterRestoreOldXform;
+
// describes the skin binding pose
LLVector3 mSkinOffset;
@@ -130,7 +135,9 @@ public:
// get/set local position
const LLVector3& getPosition();
void setPosition( const LLVector3& pos );
-
+
+ void setDefaultPosition( const LLVector3& pos );
+
// get/set world position
LLVector3 getWorldPosition();
LLVector3 getLastWorldPosition();
@@ -172,6 +179,21 @@ public:
S32 getJointNum() const { return mJointNum; }
void setJointNum(S32 joint_num) { mJointNum = joint_num; }
+
+ void restoreOldXform( void );
+ void restoreToDefaultXform( void );
+ void setDefaultFromCurrentXform( void );
+ void storeCurrentXform( const LLVector3& pos );
+
+ //Accessor for the joint id
+ LLUUID getId( void ) { return mId; }
+ //Setter for the joints id
+ void setId( const LLUUID& id ) { mId = id;}
+
+ //If the old transform flag has been set, then the reset logic in avatar needs to be aware(test) of it
+ const BOOL doesJointNeedToBeReset( void ) const { return mResetAfterRestoreOldXform; }
+ //Setter for joint reset flag
+ void setJointToBeReset( BOOL val ) { mResetAfterRestoreOldXform = val; }
};
#endif // LL_LLJOINT_H
diff --git a/indra/llcharacter/llkeyframemotion.cpp b/indra/llcharacter/llkeyframemotion.cpp
index 5b0867524e..9df033a4ca 100644
--- a/indra/llcharacter/llkeyframemotion.cpp
+++ b/indra/llcharacter/llkeyframemotion.cpp
@@ -1145,7 +1145,7 @@ void LLKeyframeMotion::applyConstraint(JointConstraint* constraint, F32 time, U8
constraint->mPositions[joint_num] = new_pos;
}
constraint->mFixupDistanceRMS *= 1.f / (constraint->mTotalLength * (F32)(shared_data->mChainLength - 1));
- constraint->mFixupDistanceRMS = fsqrtf(constraint->mFixupDistanceRMS);
+ constraint->mFixupDistanceRMS = (F32) sqrt(constraint->mFixupDistanceRMS);
//reset old joint rots
for (joint_num = 0; joint_num <= shared_data->mChainLength; joint_num++)
diff --git a/indra/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt
index 22e0705036..9910281b64 100644
--- a/indra/llcommon/CMakeLists.txt
+++ b/indra/llcommon/CMakeLists.txt
@@ -7,7 +7,6 @@ include(00-Common)
include(LLCommon)
include(Linking)
include(Boost)
-include(Pth)
include(LLSharedLibs)
include(GoogleBreakpad)
include(GooglePerfTools)
@@ -18,7 +17,6 @@ include_directories(
${EXPAT_INCLUDE_DIRS}
${LLCOMMON_INCLUDE_DIRS}
${ZLIB_INCLUDE_DIRS}
- ${PTH_INCLUDE_DIRS}
)
# add_executable(lltreeiterators lltreeiterators.cpp)
@@ -117,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
@@ -268,6 +267,10 @@ if(LLCOMMON_LINK_SHARED)
add_definitions(-fPIC)
endif(WINDOWS)
endif(NOT WORD_SIZE EQUAL 32)
+ if(WINDOWS)
+ # always generate llcommon.pdb, even for "Release" builds
+ set_target_properties(llcommon PROPERTIES LINK_FLAGS "/DEBUG")
+ endif(WINDOWS)
ll_stage_sharedlib(llcommon)
else(LLCOMMON_LINK_SHARED)
add_library (llcommon ${llcommon_SOURCE_FILES})
@@ -283,10 +286,15 @@ target_link_libraries(
${WINDOWS_LIBRARIES}
${BOOST_PROGRAM_OPTIONS_LIBRARY}
${BOOST_REGEX_LIBRARY}
- ${PTH_LIBRARIES}
${GOOGLE_PERFTOOLS_LIBRARIES}
)
+if (DARWIN)
+ include(CMakeFindFrameworks)
+ find_library(CARBON_LIBRARY Carbon)
+ target_link_libraries(llcommon ${CARBON_LIBRARY})
+endif (DARWIN)
+
add_dependencies(llcommon stage_third_party_libs)
if (LL_TESTS)
diff --git a/indra/llcommon/indra_constants.h b/indra/llcommon/indra_constants.h
index 95cb606240..d0f287657e 100644
--- a/indra/llcommon/indra_constants.h
+++ b/indra/llcommon/indra_constants.h
@@ -312,6 +312,14 @@ const F32 CHAT_SHOUT_RADIUS = 100.f;
const F32 CHAT_MAX_RADIUS = CHAT_SHOUT_RADIUS;
const F32 CHAT_MAX_RADIUS_BY_TWO = CHAT_MAX_RADIUS / 2.f;
+// squared editions of the above for distance checks
+const F32 CHAT_WHISPER_RADIUS_SQUARED = CHAT_WHISPER_RADIUS * CHAT_WHISPER_RADIUS;
+const F32 CHAT_NORMAL_RADIUS_SQUARED = CHAT_NORMAL_RADIUS * CHAT_NORMAL_RADIUS;
+const F32 CHAT_SHOUT_RADIUS_SQUARED = CHAT_SHOUT_RADIUS * CHAT_SHOUT_RADIUS;
+const F32 CHAT_MAX_RADIUS_SQUARED = CHAT_SHOUT_RADIUS_SQUARED;
+const F32 CHAT_MAX_RADIUS_BY_TWO_SQUARED = CHAT_MAX_RADIUS_BY_TWO * CHAT_MAX_RADIUS_BY_TWO;
+
+
// this times above gives barely audible radius
const F32 CHAT_BARELY_AUDIBLE_FACTOR = 2.0f;
diff --git a/indra/llcommon/llaccountingquota.h b/indra/llcommon/llaccountingquota.h
new file mode 100644
index 0000000000..3401cb57b6
--- /dev/null
+++ b/indra/llcommon/llaccountingquota.h
@@ -0,0 +1,72 @@
+/**
+ * @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 totalRenderCost, F32 totalPhysicsCost, F32 totalNetworkCost, F32 totalSimulationCost)
+ : mOwnerRenderCost( ownerRenderCost ), mOwnerPhysicsCost( ownerPhysicsCost )
+ , mOwnerNetworkCost( ownerNetworkCost ), mOwnerSimulationCost( ownerSimulationCost )
+ , mGroupRenderCost( groupRenderCost ), mGroupPhysicsCost( groupPhysicsCost )
+ , mGroupNetworkCost( groupNetworkCost ), mGroupSimulationCost( groupSimulationCost )
+ , mOtherRenderCost( otherRenderCost ), mOtherPhysicsCost( otherPhysicsCost )
+ , mOtherNetworkCost( otherNetworkCost ), mOtherSimulationCost( otherSimulationCost )
+ , mTotalRenderCost( totalRenderCost ), mTotalPhysicsCost( totalPhysicsCost )
+ , mTotalNetworkCost( totalNetworkCost ), mTotalSimulationCost( totalSimulationCost )
+ {
+ }
+ ParcelQuota(){}
+ F32 mOwnerRenderCost, mOwnerPhysicsCost, mOwnerNetworkCost, mOwnerSimulationCost;
+ F32 mGroupRenderCost, mGroupPhysicsCost, mGroupNetworkCost, mGroupSimulationCost;
+ F32 mOtherRenderCost, mOtherPhysicsCost, mOtherNetworkCost, mOtherSimulationCost;
+ F32 mTotalRenderCost, mTotalPhysicsCost, mTotalNetworkCost, mTotalSimulationCost;
+};
+
+struct SelectionQuota
+{
+ SelectionQuota( S32 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;
+ S32 mLocalId;
+};
+
+#endif
+
+
+
diff --git a/indra/llcommon/llapp.cpp b/indra/llcommon/llapp.cpp
index 39daefd1ad..ed192a9975 100644
--- a/indra/llcommon/llapp.cpp
+++ b/indra/llcommon/llapp.cpp
@@ -24,6 +24,10 @@
* $/LicenseInfo$
*/
+#include "linden_common.h"
+
+#include "llapp.h"
+
#include <cstdlib>
#ifdef LL_DARWIN
@@ -32,9 +36,6 @@
#include <sys/sysctl.h>
#endif
-#include "linden_common.h"
-#include "llapp.h"
-
#include "llcommon.h"
#include "llapr.h"
#include "llerrorcontrol.h"
diff --git a/indra/llcommon/llassettype.cpp b/indra/llcommon/llassettype.cpp
index eb610f625a..145dddd543 100644
--- a/indra/llcommon/llassettype.cpp
+++ b/indra/llcommon/llassettype.cpp
@@ -93,8 +93,9 @@ LLAssetDictionary::LLAssetDictionary()
addEntry(LLAssetType::AT_LINK, new AssetEntry("LINK", "link", "sym link", false, false, true));
addEntry(LLAssetType::AT_LINK_FOLDER, new AssetEntry("FOLDER_LINK", "link_f", "sym folder link", false, false, true));
+ addEntry(LLAssetType::AT_MESH, new AssetEntry("MESH", "mesh", "mesh", false, false, false));
+ addEntry(LLAssetType::AT_NONE, new AssetEntry("NONE", "-1", NULL, FALSE, FALSE, FALSE));
- addEntry(LLAssetType::AT_NONE, new AssetEntry("NONE", "-1", NULL, false, false, false));
};
// static
diff --git a/indra/llcommon/llassettype.h b/indra/llcommon/llassettype.h
index c5ff2364cc..74ccd00324 100644
--- a/indra/llcommon/llassettype.h
+++ b/indra/llcommon/llassettype.h
@@ -108,8 +108,10 @@ public:
AT_LINK_FOLDER = 25,
// Inventory folder link
-
- AT_COUNT = 26,
+ AT_MESH = 49,
+ // Mesh data in our proprietary SLM format
+
+ AT_COUNT = 50,
// +*********************************************************+
// | TO ADD AN ELEMENT TO THIS ENUM: |
diff --git a/indra/llcommon/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/lldefs.h b/indra/llcommon/lldefs.h
index 6b38de6500..5a4b8325f4 100644
--- a/indra/llcommon/lldefs.h
+++ b/indra/llcommon/lldefs.h
@@ -236,5 +236,13 @@ inline LLDATATYPE llclampb(const LLDATATYPE& a)
return llmin(llmax(a, (LLDATATYPE)0), (LLDATATYPE)255);
}
+template <class LLDATATYPE>
+inline void llswap(LLDATATYPE& lhs, LLDATATYPE& rhs)
+{
+ LLDATATYPE tmp = lhs;
+ lhs = rhs;
+ rhs = tmp;
+}
+
#endif // LL_LLDEFS_H
diff --git a/indra/llcommon/llfasttimer.h b/indra/llcommon/llfasttimer.h
index 4ff93a553c..2b25f2fabb 100644
--- a/indra/llcommon/llfasttimer.h
+++ b/indra/llcommon/llfasttimer.h
@@ -27,140 +27,9 @@
#ifndef LL_FASTTIMER_H
#define LL_FASTTIMER_H
+// Implementation of getCPUClockCount32() and getCPUClockCount64 are now in llfastertimer_class.cpp.
+
// pull in the actual class definition
#include "llfasttimer_class.h"
-//
-// Important note: These implementations must be FAST!
-//
-
-#if LL_WINDOWS
-//
-// Windows implementation of CPU clock
-//
-
-//
-// NOTE: put back in when we aren't using platform sdk anymore
-//
-// because MS has different signatures for these functions in winnt.h
-// need to rename them to avoid conflicts
-//#define _interlockedbittestandset _renamed_interlockedbittestandset
-//#define _interlockedbittestandreset _renamed_interlockedbittestandreset
-//#include <intrin.h>
-//#undef _interlockedbittestandset
-//#undef _interlockedbittestandreset
-
-//inline U32 LLFastTimer::getCPUClockCount32()
-//{
-// U64 time_stamp = __rdtsc();
-// return (U32)(time_stamp >> 8);
-//}
-//
-//// return full timer value, *not* shifted by 8 bits
-//inline U64 LLFastTimer::getCPUClockCount64()
-//{
-// return __rdtsc();
-//}
-
-// shift off lower 8 bits for lower resolution but longer term timing
-// on 1Ghz machine, a 32-bit word will hold ~1000 seconds of timing
-inline U32 LLFastTimer::getCPUClockCount32()
-{
- U32 ret_val;
- __asm
- {
- _emit 0x0f
- _emit 0x31
- shr eax,8
- shl edx,24
- or eax, edx
- mov dword ptr [ret_val], eax
- }
- return ret_val;
-}
-
-// return full timer value, *not* shifted by 8 bits
-inline U64 LLFastTimer::getCPUClockCount64()
-{
- U64 ret_val;
- __asm
- {
- _emit 0x0f
- _emit 0x31
- mov eax,eax
- mov edx,edx
- mov dword ptr [ret_val+4], edx
- mov dword ptr [ret_val], eax
- }
- return ret_val;
-}
-#endif
-
-
-#if (LL_LINUX || LL_SOLARIS) && !(defined(__i386__) || defined(__amd64__))
-//
-// Linux and Solaris implementation of CPU clock - non-x86.
-// This is accurate but SLOW! Only use out of desperation.
-//
-// Try to use the MONOTONIC clock if available, this is a constant time counter
-// with nanosecond resolution (but not necessarily accuracy) and attempts are
-// made to synchronize this value between cores at kernel start. It should not
-// be affected by CPU frequency. If not available use the REALTIME clock, but
-// this may be affected by NTP adjustments or other user activity affecting
-// the system time.
-inline U64 LLFastTimer::getCPUClockCount64()
-{
- struct timespec tp;
-
-#ifdef CLOCK_MONOTONIC // MONOTONIC supported at build-time?
- if (-1 == clock_gettime(CLOCK_MONOTONIC,&tp)) // if MONOTONIC isn't supported at runtime then ouch, try REALTIME
-#endif
- clock_gettime(CLOCK_REALTIME,&tp);
-
- return (tp.tv_sec*LLFastTimer::sClockResolution)+tp.tv_nsec;
-}
-
-inline U32 LLFastTimer::getCPUClockCount32()
-{
- return (U32)(LLFastTimer::getCPUClockCount64() >> 8);
-}
-#endif // (LL_LINUX || LL_SOLARIS) && !(defined(__i386__) || defined(__amd64__))
-
-
-#if (LL_LINUX || LL_SOLARIS || LL_DARWIN) && (defined(__i386__) || defined(__amd64__))
-//
-// Mac+Linux+Solaris FAST x86 implementation of CPU clock
-inline U32 LLFastTimer::getCPUClockCount32()
-{
- U64 x;
- __asm__ volatile (".byte 0x0f, 0x31": "=A"(x));
- return (U32)(x >> 8);
-}
-
-inline U64 LLFastTimer::getCPUClockCount64()
-{
- U64 x;
- __asm__ volatile (".byte 0x0f, 0x31": "=A"(x));
- return x;
-}
-#endif
-
-
-#if ( LL_DARWIN && !(defined(__i386__) || defined(__amd64__)))
-//
-// Mac PPC (deprecated) implementation of CPU clock
-//
-// Just use gettimeofday implementation for now
-
-inline U32 LLFastTimer::getCPUClockCount32()
-{
- return (U32)(get_clock_count()>>8);
-}
-
-inline U64 LLFastTimer::getCPUClockCount64()
-{
- return get_clock_count();
-}
-#endif
-
#endif // LL_LLFASTTIMER_H
diff --git a/indra/llcommon/llfasttimer_class.cpp b/indra/llcommon/llfasttimer_class.cpp
index bce87ada96..bd594b06cf 100644
--- a/indra/llcommon/llfasttimer_class.cpp
+++ b/indra/llcommon/llfasttimer_class.cpp
@@ -35,10 +35,13 @@
#include <boost/bind.hpp>
+
#if LL_WINDOWS
+#include "lltimer.h"
#elif LL_LINUX || LL_SOLARIS
#include <sys/time.h>
#include <sched.h>
+#include "lltimer.h"
#elif LL_DARWIN
#include <sys/time.h>
#include "lltimer.h" // get_clock_count()
@@ -61,6 +64,8 @@ BOOL LLFastTimer::sMetricLog = FALSE;
LLMutex* LLFastTimer::sLogLock = NULL;
std::queue<LLSD> LLFastTimer::sLogQueue;
+#define USE_RDTSC 0
+
#if LL_LINUX || LL_SOLARIS
U64 LLFastTimer::sClockResolution = 1000000000; // Nanosecond resolution
#else
@@ -234,10 +239,23 @@ U64 LLFastTimer::countsPerSecond() // counts per second for the *32-bit* timer
#else // windows or x86-mac or x86-linux or x86-solaris
U64 LLFastTimer::countsPerSecond() // counts per second for the *32-bit* timer
{
+#if USE_RDTSC || !LL_WINDOWS
//getCPUFrequency returns MHz and sCPUClockFrequency wants to be in Hz
static U64 sCPUClockFrequency = U64(LLProcessorInfo().getCPUFrequency()*1000000.0);
// we drop the low-order byte in our timers, so report a lower frequency
+#else
+ // If we're not using RDTSC, each fasttimer tick is just a performance counter tick.
+ // Not redefining the clock frequency itself (in llprocessor.cpp/calculate_cpu_frequency())
+ // since that would change displayed MHz stats for CPUs
+ static bool firstcall = true;
+ static U64 sCPUClockFrequency;
+ if (firstcall)
+ {
+ QueryPerformanceFrequency((LARGE_INTEGER*)&sCPUClockFrequency);
+ firstcall = false;
+ }
+#endif
return sCPUClockFrequency >> 8;
}
#endif
@@ -482,6 +500,19 @@ void LLFastTimer::NamedTimer::resetFrame()
{
if (sLog)
{ //output current frame counts to performance log
+
+ static S32 call_count = 0;
+ if (call_count % 100 == 0)
+ {
+ llinfos << "countsPerSecond (32 bit): " << countsPerSecond() << llendl;
+ llinfos << "get_clock_count (64 bit): " << get_clock_count() << llendl;
+ llinfos << "LLProcessorInfo().getCPUFrequency() " << LLProcessorInfo().getCPUFrequency() << llendl;
+ llinfos << "getCPUClockCount32() " << getCPUClockCount32() << llendl;
+ llinfos << "getCPUClockCount64() " << getCPUClockCount64() << llendl;
+ llinfos << "elapsed sec " << ((F64)getCPUClockCount64())/((F64)LLProcessorInfo().getCPUFrequency()*1000000.0) << llendl;
+ }
+ call_count++;
+
F64 iclock_freq = 1000.0 / countsPerSecond(); // good place to calculate clock frequency
F64 total_time = 0;
@@ -763,3 +794,144 @@ LLFastTimer::LLFastTimer(LLFastTimer::FrameState* state)
//////////////////////////////////////////////////////////////////////////////
+//
+// Important note: These implementations must be FAST!
+//
+
+
+#if LL_WINDOWS
+//
+// Windows implementation of CPU clock
+//
+
+//
+// NOTE: put back in when we aren't using platform sdk anymore
+//
+// because MS has different signatures for these functions in winnt.h
+// need to rename them to avoid conflicts
+//#define _interlockedbittestandset _renamed_interlockedbittestandset
+//#define _interlockedbittestandreset _renamed_interlockedbittestandreset
+//#include <intrin.h>
+//#undef _interlockedbittestandset
+//#undef _interlockedbittestandreset
+
+//inline U32 LLFastTimer::getCPUClockCount32()
+//{
+// U64 time_stamp = __rdtsc();
+// return (U32)(time_stamp >> 8);
+//}
+//
+//// return full timer value, *not* shifted by 8 bits
+//inline U64 LLFastTimer::getCPUClockCount64()
+//{
+// return __rdtsc();
+//}
+
+// shift off lower 8 bits for lower resolution but longer term timing
+// on 1Ghz machine, a 32-bit word will hold ~1000 seconds of timing
+#if USE_RDTSC
+U32 LLFastTimer::getCPUClockCount32()
+{
+ U32 ret_val;
+ __asm
+ {
+ _emit 0x0f
+ _emit 0x31
+ shr eax,8
+ shl edx,24
+ or eax, edx
+ mov dword ptr [ret_val], eax
+ }
+ return ret_val;
+}
+
+// return full timer value, *not* shifted by 8 bits
+U64 LLFastTimer::getCPUClockCount64()
+{
+ U64 ret_val;
+ __asm
+ {
+ _emit 0x0f
+ _emit 0x31
+ mov eax,eax
+ mov edx,edx
+ mov dword ptr [ret_val+4], edx
+ mov dword ptr [ret_val], eax
+ }
+ return ret_val;
+}
+
+std::string LLFastTimer::sClockType = "rdtsc";
+
+#else
+//LL_COMMON_API U64 get_clock_count(); // in lltimer.cpp
+// These use QueryPerformanceCounter, which is arguably fine and also works on amd architectures.
+U32 LLFastTimer::getCPUClockCount32()
+{
+ return (U32)(get_clock_count()>>8);
+}
+
+U64 LLFastTimer::getCPUClockCount64()
+{
+ return get_clock_count();
+}
+
+std::string LLFastTimer::sClockType = "QueryPerformanceCounter";
+#endif
+
+#endif
+
+
+#if (LL_LINUX || LL_SOLARIS) && !(defined(__i386__) || defined(__amd64__))
+//
+// Linux and Solaris implementation of CPU clock - non-x86.
+// This is accurate but SLOW! Only use out of desperation.
+//
+// Try to use the MONOTONIC clock if available, this is a constant time counter
+// with nanosecond resolution (but not necessarily accuracy) and attempts are
+// made to synchronize this value between cores at kernel start. It should not
+// be affected by CPU frequency. If not available use the REALTIME clock, but
+// this may be affected by NTP adjustments or other user activity affecting
+// the system time.
+U64 LLFastTimer::getCPUClockCount64()
+{
+ struct timespec tp;
+
+#ifdef CLOCK_MONOTONIC // MONOTONIC supported at build-time?
+ if (-1 == clock_gettime(CLOCK_MONOTONIC,&tp)) // if MONOTONIC isn't supported at runtime then ouch, try REALTIME
+#endif
+ clock_gettime(CLOCK_REALTIME,&tp);
+
+ return (tp.tv_sec*LLFastTimer::sClockResolution)+tp.tv_nsec;
+}
+
+U32 LLFastTimer::getCPUClockCount32()
+{
+ return (U32)(LLFastTimer::getCPUClockCount64() >> 8);
+}
+
+std::string LLFastTimer::sClockType = "clock_gettime";
+
+#endif // (LL_LINUX || LL_SOLARIS) && !(defined(__i386__) || defined(__amd64__))
+
+
+#if (LL_LINUX || LL_SOLARIS || LL_DARWIN) && (defined(__i386__) || defined(__amd64__))
+//
+// Mac+Linux+Solaris FAST x86 implementation of CPU clock
+U32 LLFastTimer::getCPUClockCount32()
+{
+ U64 x;
+ __asm__ volatile (".byte 0x0f, 0x31": "=A"(x));
+ return (U32)(x >> 8);
+}
+
+U64 LLFastTimer::getCPUClockCount64()
+{
+ U64 x;
+ __asm__ volatile (".byte 0x0f, 0x31": "=A"(x));
+ return x;
+}
+
+std::string LLFastTimer::sClockType = "rdtsc";
+#endif
+
diff --git a/indra/llcommon/llfasttimer_class.h b/indra/llcommon/llfasttimer_class.h
index eb9789682b..827747f0c6 100644
--- a/indra/llcommon/llfasttimer_class.h
+++ b/indra/llcommon/llfasttimer_class.h
@@ -31,12 +31,15 @@
#define FAST_TIMER_ON 1
#define TIME_FAST_TIMERS 0
+#define DEBUG_FAST_TIMER_THREADS 1
class LLMutex;
#include <queue>
#include "llsd.h"
+LL_COMMON_API void assert_main_thread();
+
class LL_COMMON_API LLFastTimer
{
public:
@@ -176,6 +179,11 @@ public:
U64 timer_end = getCPUClockCount64();
sTimerCycles += timer_end - timer_start;
#endif
+#if DEBUG_FAST_TIMER_THREADS
+#if !LL_RELEASE
+ assert_main_thread();
+#endif
+#endif
}
LL_FORCE_INLINE ~LLFastTimer()
@@ -245,6 +253,7 @@ public:
U32 mChildTime;
};
static CurTimerData sCurTimerData;
+ static std::string sClockType;
private:
static U32 getCPUClockCount32();
diff --git a/indra/llcommon/llfoldertype.cpp b/indra/llcommon/llfoldertype.cpp
index ebc79af412..c2cfb7286e 100644
--- a/indra/llcommon/llfoldertype.cpp
+++ b/indra/llcommon/llfoldertype.cpp
@@ -89,6 +89,9 @@ LLFolderDictionary::LLFolderDictionary()
addEntry(LLFolderType::FT_CURRENT_OUTFIT, new FolderEntry("current", TRUE));
addEntry(LLFolderType::FT_OUTFIT, new FolderEntry("outfit", FALSE));
addEntry(LLFolderType::FT_MY_OUTFITS, new FolderEntry("my_otfts", TRUE));
+
+ addEntry(LLFolderType::FT_MESH, new FolderEntry("mesh", TRUE));
+
addEntry(LLFolderType::FT_INBOX, new FolderEntry("inbox", TRUE));
addEntry(LLFolderType::FT_NONE, new FolderEntry("-1", FALSE));
diff --git a/indra/llcommon/llfoldertype.h b/indra/llcommon/llfoldertype.h
index 936fbed17d..cb32cb075b 100644
--- a/indra/llcommon/llfoldertype.h
+++ b/indra/llcommon/llfoldertype.h
@@ -80,9 +80,11 @@ public:
FT_OUTFIT = 47,
FT_MY_OUTFITS = 48,
- FT_INBOX = 49,
+ FT_MESH = 49,
- FT_COUNT = 50,
+ FT_INBOX = 50,
+
+ FT_COUNT = 51,
FT_NONE = -1
};
diff --git a/indra/llcommon/llmd5.h b/indra/llcommon/llmd5.h
index c8acbbe591..1526e6ac3c 100644
--- a/indra/llcommon/llmd5.h
+++ b/indra/llcommon/llmd5.h
@@ -103,7 +103,7 @@ public:
void raw_digest(unsigned char *array) const; // provide 16-byte array for binary data
void hex_digest(char *string) const; // provide 33-byte array for ascii-hex string
- friend std::ostream& operator<< (std::ostream&, LLMD5 context);
+ friend LL_COMMON_API std::ostream& operator<< (std::ostream&, LLMD5 context);
private:
diff --git a/indra/llcommon/llmemory.cpp b/indra/llcommon/llmemory.cpp
index 51fcd5b717..21d1c84d69 100644
--- a/indra/llcommon/llmemory.cpp
+++ b/indra/llcommon/llmemory.cpp
@@ -71,25 +71,6 @@ void LLMemory::freeReserve()
reserveMem = NULL;
}
-void* ll_allocate (size_t size)
-{
- if (size == 0)
- {
- llwarns << "Null allocation" << llendl;
- }
- void *p = malloc(size);
- if (p == NULL)
- {
- LLMemory::freeReserve();
- llerrs << "Out of memory Error" << llendl;
- }
- return p;
-}
-
-void ll_release (void *p)
-{
- free(p);
-}
//----------------------------------------------------------------------------
diff --git a/indra/llcommon/llmemory.h b/indra/llcommon/llmemory.h
index 11406f59b0..3bd1403576 100644
--- a/indra/llcommon/llmemory.h
+++ b/indra/llcommon/llmemory.h
@@ -1,25 +1,25 @@
-/**
+/**
* @file llmemory.h
* @brief Memory allocation/deallocation header-stuff goes here.
*
* $LicenseInfo:firstyear=2002&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2010, Linden Research, Inc.
- *
+ *
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License only.
- *
+ *
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
+ *
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
@@ -28,12 +28,82 @@
#include "llmemtype.h"
-extern S32 gTotalDAlloc;
-extern S32 gTotalDAUse;
-extern S32 gDACount;
+#if LL_DEBUG
+inline void* ll_aligned_malloc( size_t size, int align )
+{
+ void* mem = malloc( size + (align - 1) + sizeof(void*) );
+ char* aligned = ((char*)mem) + sizeof(void*);
+ aligned += align - ((uintptr_t)aligned & (align - 1));
+
+ ((void**)aligned)[-1] = mem;
+ return aligned;
+}
+
+inline void ll_aligned_free( void* ptr )
+{
+ free( ((void**)ptr)[-1] );
+}
-extern void* ll_allocate (size_t size);
-extern void ll_release (void *p);
+inline void* ll_aligned_malloc_16(size_t size) // returned hunk MUST be freed with ll_aligned_free_16().
+{
+#if defined(LL_WINDOWS)
+ return _mm_malloc(size, 16);
+#elif defined(LL_DARWIN)
+ return malloc(size); // default osx malloc is 16 byte aligned.
+#else
+ void *rtn;
+ if (LL_LIKELY(0 == posix_memalign(&rtn, 16, size)))
+ return rtn;
+ else // bad alignment requested, or out of memory
+ return NULL;
+#endif
+}
+
+inline void ll_aligned_free_16(void *p)
+{
+#if defined(LL_WINDOWS)
+ _mm_free(p);
+#elif defined(LL_DARWIN)
+ return free(p);
+#else
+ free(p); // posix_memalign() is compatible with heap deallocator
+#endif
+}
+
+inline void* ll_aligned_malloc_32(size_t size) // returned hunk MUST be freed with ll_aligned_free_32().
+{
+#if defined(LL_WINDOWS)
+ return _mm_malloc(size, 32);
+#elif defined(LL_DARWIN)
+ return ll_aligned_malloc( size, 32 );
+#else
+ void *rtn;
+ if (LL_LIKELY(0 == posix_memalign(&rtn, 32, size)))
+ return rtn;
+ else // bad alignment requested, or out of memory
+ return NULL;
+#endif
+}
+
+inline void ll_aligned_free_32(void *p)
+{
+#if defined(LL_WINDOWS)
+ _mm_free(p);
+#elif defined(LL_DARWIN)
+ ll_aligned_free( p );
+#else
+ free(p); // posix_memalign() is compatible with heap deallocator
+#endif
+}
+#else // LL_DEBUG
+// ll_aligned_foo are noops now that we use tcmalloc everywhere (tcmalloc aligns automatically at appropriate intervals)
+#define ll_aligned_malloc( size, align ) malloc(size)
+#define ll_aligned_free( ptr ) free(ptr)
+#define ll_aligned_malloc_16 malloc
+#define ll_aligned_free_16 free
+#define ll_aligned_malloc_32 malloc
+#define ll_aligned_free_32 free
+#endif // LL_DEBUG
class LL_COMMON_API LLMemory
{
diff --git a/indra/llcommon/llrefcount.cpp b/indra/llcommon/llrefcount.cpp
index 55d0c85cbd..e1876599fc 100644
--- a/indra/llcommon/llrefcount.cpp
+++ b/indra/llcommon/llrefcount.cpp
@@ -29,9 +29,25 @@
#include "llerror.h"
+#if LL_REF_COUNT_DEBUG
+#include "llthread.h"
+#include "llapr.h"
+#endif
+
LLRefCount::LLRefCount(const LLRefCount& other)
: mRef(0)
{
+#if LL_REF_COUNT_DEBUG
+ if(gAPRPoolp)
+ {
+ mMutexp = new LLMutex(gAPRPoolp) ;
+ }
+ else
+ {
+ mMutexp = NULL ;
+ }
+ mCrashAtUnlock = FALSE ;
+#endif
}
LLRefCount& LLRefCount::operator=(const LLRefCount&)
@@ -43,6 +59,17 @@ LLRefCount& LLRefCount::operator=(const LLRefCount&)
LLRefCount::LLRefCount() :
mRef(0)
{
+#if LL_REF_COUNT_DEBUG
+ if(gAPRPoolp)
+ {
+ mMutexp = new LLMutex(gAPRPoolp) ;
+ }
+ else
+ {
+ mMutexp = NULL ;
+ }
+ mCrashAtUnlock = FALSE ;
+#endif
}
LLRefCount::~LLRefCount()
@@ -51,4 +78,87 @@ LLRefCount::~LLRefCount()
{
llerrs << "deleting non-zero reference" << llendl;
}
+
+#if LL_REF_COUNT_DEBUG
+ if(gAPRPoolp)
+ {
+ delete mMutexp ;
+ }
+#endif
}
+
+#if LL_REF_COUNT_DEBUG
+void LLRefCount::ref() const
+{
+ if(mMutexp)
+ {
+ if(mMutexp->isLocked())
+ {
+ mCrashAtUnlock = TRUE ;
+ llerrs << "the mutex is locked by the thread: " << mLockedThreadID
+ << " Current thread: " << LLThread::currentID() << llendl ;
+ }
+
+ mMutexp->lock() ;
+ mLockedThreadID = LLThread::currentID() ;
+
+ mRef++;
+
+ if(mCrashAtUnlock)
+ {
+ while(1); //crash here.
+ }
+ mMutexp->unlock() ;
+ }
+ else
+ {
+ mRef++;
+ }
+}
+
+S32 LLRefCount::unref() const
+{
+ if(mMutexp)
+ {
+ if(mMutexp->isLocked())
+ {
+ mCrashAtUnlock = TRUE ;
+ llerrs << "the mutex is locked by the thread: " << mLockedThreadID
+ << " Current thread: " << LLThread::currentID() << llendl ;
+ }
+
+ mMutexp->lock() ;
+ mLockedThreadID = LLThread::currentID() ;
+
+ llassert(mRef >= 1);
+ if (0 == --mRef)
+ {
+ if(mCrashAtUnlock)
+ {
+ while(1); //crash here.
+ }
+ mMutexp->unlock() ;
+
+ delete this;
+ return 0;
+ }
+
+ if(mCrashAtUnlock)
+ {
+ while(1); //crash here.
+ }
+ mMutexp->unlock() ;
+ return mRef;
+ }
+ else
+ {
+ llassert(mRef >= 1);
+ if (0 == --mRef)
+ {
+ delete this;
+ return 0;
+ }
+ return mRef;
+ }
+}
+#endif
diff --git a/indra/llcommon/llrefcount.h b/indra/llcommon/llrefcount.h
index 19f008b15c..8eb5d53f3f 100644
--- a/indra/llcommon/llrefcount.h
+++ b/indra/llcommon/llrefcount.h
@@ -28,6 +28,11 @@
#include <boost/noncopyable.hpp>
+#define LL_REF_COUNT_DEBUG 0
+#if LL_REF_COUNT_DEBUG
+class LLMutex ;
+#endif
+
//----------------------------------------------------------------------------
// RefCount objects should generally only be accessed by way of LLPointer<>'s
// see llthread.h for LLThreadSafeRefCount
@@ -43,12 +48,16 @@ protected:
public:
LLRefCount();
- void ref() const
+#if LL_REF_COUNT_DEBUG
+ void ref() const ;
+ S32 unref() const ;
+#else
+ inline void ref() const
{
mRef++;
}
- S32 unref() const
+ inline S32 unref() const
{
llassert(mRef >= 1);
if (0 == --mRef)
@@ -58,6 +67,7 @@ public:
}
return mRef;
}
+#endif
//NOTE: when passing around a const LLRefCount object, this can return different results
// at different types, since mRef is mutable
@@ -68,6 +78,12 @@ public:
private:
mutable S32 mRef;
+
+#if LL_REF_COUNT_DEBUG
+ LLMutex* mMutexp ;
+ mutable U32 mLockedThreadID ;
+ mutable BOOL mCrashAtUnlock ;
+#endif
};
#endif
diff --git a/indra/llcommon/llsdserialize.cpp b/indra/llcommon/llsdserialize.cpp
index 10f460e8a6..5be5ecc492 100644
--- a/indra/llcommon/llsdserialize.cpp
+++ b/indra/llcommon/llsdserialize.cpp
@@ -34,6 +34,12 @@
#include <iostream>
#include "apr_base64.h"
+#ifdef LL_STANDALONE
+# include <zlib.h>
+#else
+# include "zlib/zlib.h" // for davep's dirty little zip functions
+#endif
+
#if !LL_WINDOWS
#include <netinet/in.h> // htonl & ntohl
#endif
@@ -1983,3 +1989,180 @@ std::ostream& operator<<(std::ostream& s, const LLSD& llsd)
return s;
}
+
+//dirty little zippers -- yell at davep if these are horrid
+
+//return a string containing gzipped bytes of binary serialized LLSD
+// VERY inefficient -- creates several copies of LLSD block in memory
+std::string zip_llsd(LLSD& data)
+{
+ std::stringstream llsd_strm;
+
+ LLSDSerialize::toBinary(data, llsd_strm);
+
+ const U32 CHUNK = 65536;
+
+ z_stream strm;
+ strm.zalloc = Z_NULL;
+ strm.zfree = Z_NULL;
+ strm.opaque = Z_NULL;
+
+ S32 ret = deflateInit(&strm, Z_BEST_COMPRESSION);
+ if (ret != Z_OK)
+ {
+ llwarns << "Failed to compress LLSD block." << llendl;
+ return std::string();
+ }
+
+ std::string source = llsd_strm.str();
+
+ U8 out[CHUNK];
+
+ strm.avail_in = source.size();
+ strm.next_in = (U8*) source.data();
+ U8* output = NULL;
+
+ U32 cur_size = 0;
+
+ U32 have = 0;
+
+ do
+ {
+ strm.avail_out = CHUNK;
+ strm.next_out = out;
+
+ ret = deflate(&strm, Z_FINISH);
+ if (ret == Z_OK || ret == Z_STREAM_END)
+ { //copy result into output
+ if (strm.avail_out >= CHUNK)
+ {
+ llerrs << "WTF?" << llendl;
+ }
+
+ have = CHUNK-strm.avail_out;
+ output = (U8*) realloc(output, cur_size+have);
+ memcpy(output+cur_size, out, have);
+ cur_size += have;
+ }
+ else
+ {
+ free(output);
+ llwarns << "Failed to compress LLSD block." << llendl;
+ return std::string();
+ }
+ }
+ while (ret == Z_OK);
+
+ std::string::size_type size = cur_size;
+
+ std::string result((char*) output, size);
+ deflateEnd(&strm);
+ free(output);
+
+#if 0 //verify results work with unzip_llsd
+ std::istringstream test(result);
+ LLSD test_sd;
+ if (!unzip_llsd(test_sd, test, result.size()))
+ {
+ llerrs << "Invalid compression result!" << llendl;
+ }
+#endif
+
+ return result;
+}
+
+//decompress a block of LLSD from provided istream
+// not very efficient -- creats a copy of decompressed LLSD block in memory
+// and deserializes from that copy using LLSDSerialize
+bool unzip_llsd(LLSD& data, std::istream& is, S32 size)
+{
+ U8* result = NULL;
+ U32 cur_size = 0;
+ z_stream strm;
+
+ const U32 CHUNK = 65536;
+
+ U8 *in = new U8[size];
+ is.read((char*) in, size);
+
+ U8 out[CHUNK];
+
+ strm.zalloc = Z_NULL;
+ strm.zfree = Z_NULL;
+ strm.opaque = Z_NULL;
+ strm.avail_in = size;
+ strm.next_in = in;
+
+ S32 ret = inflateInit(&strm);
+
+ do
+ {
+ strm.avail_out = CHUNK;
+ strm.next_out = out;
+ ret = inflate(&strm, Z_NO_FLUSH);
+ if (ret == Z_STREAM_ERROR)
+ {
+ inflateEnd(&strm);
+ free(result);
+ delete [] in;
+ return false;
+ }
+
+ switch (ret)
+ {
+ case Z_NEED_DICT:
+ ret = Z_DATA_ERROR;
+ case Z_DATA_ERROR:
+ case Z_MEM_ERROR:
+ inflateEnd(&strm);
+ free(result);
+ delete [] in;
+ return false;
+ break;
+ }
+
+ U32 have = CHUNK-strm.avail_out;
+
+ result = (U8*) realloc(result, cur_size + have);
+ memcpy(result+cur_size, out, have);
+ cur_size += have;
+
+ } while (ret == Z_OK);
+
+ inflateEnd(&strm);
+ delete [] in;
+
+ if (ret != Z_STREAM_END)
+ {
+ free(result);
+ return false;
+ }
+
+ //result now points to the decompressed LLSD block
+ {
+ std::string res_str((char*) result, cur_size);
+
+ std::string deprecated_header("<? LLSD/Binary ?>");
+
+ if (res_str.substr(0, deprecated_header.size()) == deprecated_header)
+ {
+ res_str = res_str.substr(deprecated_header.size()+1, cur_size);
+ }
+ cur_size = res_str.size();
+
+ std::istringstream istr(res_str);
+
+ if (!LLSDSerialize::fromBinary(data, istr, cur_size))
+ {
+ llwarns << "Failed to unzip LLSD block" << llendl;
+ free(result);
+ return false;
+ }
+ }
+
+ free(result);
+ return true;
+}
+
+
+
diff --git a/indra/llcommon/llsdserialize.h b/indra/llcommon/llsdserialize.h
index 1f096b5254..99a3ea3cd4 100644
--- a/indra/llcommon/llsdserialize.h
+++ b/indra/llcommon/llsdserialize.h
@@ -790,4 +790,8 @@ public:
}
};
+//dirty little zip functions -- yell at davep
+LL_COMMON_API std::string zip_llsd(LLSD& data);
+LL_COMMON_API bool unzip_llsd(LLSD& data, std::istream& is, S32 size);
+
#endif // LL_LLSDSERIALIZE_H
diff --git a/indra/llcommon/llsys.cpp b/indra/llcommon/llsys.cpp
index 10cdc7087b..e8616a9be6 100644
--- a/indra/llcommon/llsys.cpp
+++ b/indra/llcommon/llsys.cpp
@@ -46,6 +46,7 @@
# include <sys/sysctl.h>
# include <sys/utsname.h>
# include <stdint.h>
+# include <Carbon/Carbon.h>
#elif LL_LINUX
# include <errno.h>
# include <sys/utsname.h>
@@ -187,22 +188,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..
@@ -307,8 +316,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,
@@ -318,7 +326,58 @@ LLOSInfo::LLOSInfo() :
}
mOSString += compatibility_mode;
+#elif LL_DARWIN
+
+ // Initialize mOSStringSimple to something like:
+ // "Mac OS X 10.6.7"
+ {
+ const char * DARWIN_PRODUCT_NAME = "Mac OS X";
+
+ SInt32 major_version, minor_version, bugfix_version;
+ OSErr r1 = Gestalt(gestaltSystemVersionMajor, &major_version);
+ OSErr r2 = Gestalt(gestaltSystemVersionMinor, &minor_version);
+ OSErr r3 = Gestalt(gestaltSystemVersionBugFix, &bugfix_version);
+
+ if((r1 == noErr) && (r2 == noErr) && (r3 == noErr))
+ {
+ mMajorVer = major_version;
+ mMinorVer = minor_version;
+ mBuild = bugfix_version;
+
+ std::stringstream os_version_string;
+ os_version_string << DARWIN_PRODUCT_NAME << " " << mMajorVer << "." << mMinorVer << "." << mBuild;
+
+ // Put it in the OS string we are compiling
+ mOSStringSimple.append(os_version_string.str());
+ }
+ else
+ {
+ mOSStringSimple.append("Unable to collect OS info");
+ }
+ }
+
+ // Initialize mOSString to something like:
+ // "Mac OS X 10.6.7 Darwin Kernel Version 10.7.0: Sat Jan 29 15:17:16 PST 2011; root:xnu-1504.9.37~1/RELEASE_I386 i386"
+ struct utsname un;
+ if(uname(&un) != -1)
+ {
+ mOSString = mOSStringSimple;
+ mOSString.append(" ");
+ mOSString.append(un.sysname);
+ mOSString.append(" ");
+ mOSString.append(un.release);
+ mOSString.append(" ");
+ mOSString.append(un.version);
+ mOSString.append(" ");
+ mOSString.append(un.machine);
+ }
+ else
+ {
+ mOSString = mOSStringSimple;
+ }
+
#else
+
struct utsname un;
if(uname(&un) != -1)
{
@@ -334,15 +393,7 @@ LLOSInfo::LLOSInfo() :
// Simplify 'Simple'
std::string ostype = mOSStringSimple.substr(0, mOSStringSimple.find_first_of(" ", 0));
- if (ostype == "Darwin")
- {
- // Only care about major Darwin versions, truncate at first '.'
- S32 idx1 = mOSStringSimple.find_first_of(".", 0);
- std::string simple = mOSStringSimple.substr(0, idx1);
- if (simple.length() > 0)
- mOSStringSimple = simple;
- }
- else if (ostype == "Linux")
+ if (ostype == "Linux")
{
// Only care about major and minor Linux versions, truncate at second '.'
std::string::size_type idx1 = mOSStringSimple.find_first_of(".", 0);
diff --git a/indra/llcommon/llthread.cpp b/indra/llcommon/llthread.cpp
index 49d05ef411..d9400fb5b3 100644
--- a/indra/llcommon/llthread.cpp
+++ b/indra/llcommon/llthread.cpp
@@ -56,6 +56,21 @@
//
//----------------------------------------------------------------------------
+#if !LL_DARWIN
+U32 ll_thread_local sThreadID = 0;
+#endif
+
+U32 LLThread::sIDIter = 0;
+
+LL_COMMON_API void assert_main_thread()
+{
+ static U32 s_thread_id = LLThread::currentID();
+ if (LLThread::currentID() != s_thread_id)
+ {
+ llerrs << "Illegal execution outside main thread." << llendl;
+ }
+}
+
//
// Handed to the APR thread creation function
//
@@ -63,10 +78,14 @@ void *APR_THREAD_FUNC LLThread::staticRun(apr_thread_t *apr_threadp, void *datap
{
LLThread *threadp = (LLThread *)datap;
+#if !LL_DARWIN
+ sThreadID = threadp->mID;
+#endif
+
// Run the user supplied function
threadp->run();
- llinfos << "LLThread::staticRun() Exiting: " << threadp->mName << llendl;
+ //llinfos << "LLThread::staticRun() Exiting: " << threadp->mName << llendl;
// We're done with the run function, this thread is done executing now.
threadp->mStatus = STOPPED;
@@ -81,6 +100,8 @@ LLThread::LLThread(const std::string& name, apr_pool_t *poolp) :
mAPRThreadp(NULL),
mStatus(STOPPED)
{
+ mID = ++sIDIter;
+
// Thread creation probably CAN be paranoid about APR being initialized, if necessary
if (poolp)
{
@@ -121,7 +142,7 @@ void LLThread::shutdown()
// First, set the flag that indicates that we're ready to die
setQuitting();
- llinfos << "LLThread::~LLThread() Killing thread " << mName << " Status: " << mStatus << llendl;
+ //llinfos << "LLThread::~LLThread() Killing thread " << mName << " Status: " << mStatus << llendl;
// Now wait a bit for the thread to exit
// It's unclear whether I should even bother doing this - this destructor
// should netver get called unless we're already stopped, really...
@@ -143,7 +164,7 @@ void LLThread::shutdown()
if (!isStopped())
{
// This thread just wouldn't stop, even though we gave it time
- llwarns << "LLThread::~LLThread() exiting thread before clean exit!" << llendl;
+ //llwarns << "LLThread::~LLThread() exiting thread before clean exit!" << llendl;
// Put a stake in its heart.
apr_thread_exit(mAPRThreadp, -1);
return;
@@ -283,7 +304,7 @@ void LLThread::wakeLocked()
//============================================================================
LLMutex::LLMutex(apr_pool_t *poolp) :
- mAPRMutexp(NULL)
+ mAPRMutexp(NULL), mCount(0), mLockingThread(NO_THREAD)
{
//if (poolp)
//{
@@ -315,7 +336,18 @@ LLMutex::~LLMutex()
void LLMutex::lock()
{
+#if LL_DARWIN
+ if (mLockingThread == LLThread::currentID())
+#else
+ if (mLockingThread == sThreadID)
+#endif
+ { //redundant lock
+ mCount++;
+ return;
+ }
+
apr_thread_mutex_lock(mAPRMutexp);
+
#if MUTEX_DEBUG
// Have to have the lock before we can access the debug info
U32 id = LLThread::currentID();
@@ -323,10 +355,22 @@ void LLMutex::lock()
llerrs << "Already locked in Thread: " << id << llendl;
mIsLocked[id] = TRUE;
#endif
+
+#if LL_DARWIN
+ mLockingThread = LLThread::currentID();
+#else
+ mLockingThread = sThreadID;
+#endif
}
void LLMutex::unlock()
{
+ if (mCount > 0)
+ { //not the root unlock
+ mCount--;
+ return;
+ }
+
#if MUTEX_DEBUG
// Access the debug info while we have the lock
U32 id = LLThread::currentID();
@@ -334,6 +378,8 @@ void LLMutex::unlock()
llerrs << "Not locked in Thread: " << id << llendl;
mIsLocked[id] = FALSE;
#endif
+
+ mLockingThread = NO_THREAD;
apr_thread_mutex_unlock(mAPRMutexp);
}
@@ -351,6 +397,11 @@ bool LLMutex::isLocked()
}
}
+U32 LLMutex::lockingThread() const
+{
+ return mLockingThread;
+}
+
//============================================================================
LLCondition::LLCondition(apr_pool_t *poolp) :
@@ -371,6 +422,15 @@ LLCondition::~LLCondition()
void LLCondition::wait()
{
+ if (!isLocked())
+ { //mAPRMutexp MUST be locked before calling apr_thread_cond_wait
+ apr_thread_mutex_lock(mAPRMutexp);
+#if MUTEX_DEBUG
+ // avoid asserts on destruction in non-release builds
+ U32 id = LLThread::currentID();
+ mIsLocked[id] = TRUE;
+#endif
+ }
apr_thread_cond_wait(mAPRCondp, mAPRMutexp);
}
diff --git a/indra/llcommon/llthread.h b/indra/llcommon/llthread.h
index f1c6cd75af..40291a2569 100644
--- a/indra/llcommon/llthread.h
+++ b/indra/llcommon/llthread.h
@@ -35,8 +35,17 @@ class LLThread;
class LLMutex;
class LLCondition;
+#if LL_WINDOWS
+#define ll_thread_local __declspec(thread)
+#else
+#define ll_thread_local __thread
+#endif
+
class LL_COMMON_API LLThread
{
+private:
+ static U32 sIDIter;
+
public:
typedef enum e_thread_status
{
@@ -77,6 +86,8 @@ public:
apr_pool_t *getAPRPool() { return mAPRPoolp; }
LLVolatileAPRPool* getLocalAPRFilePool() { return mLocalAPRFilePoolp ; }
+ U32 getID() const { return mID; }
+
private:
BOOL mPaused;
@@ -91,6 +102,7 @@ protected:
apr_pool_t *mAPRPoolp;
BOOL mIsLocalPool;
EThreadStatus mStatus;
+ U32 mID;
//a local apr_pool for APRFile operations in this thread. If it exists, LLAPRFile::sAPRFilePoolp should not be used.
//Note: this pool is used by APRFile ONLY, do NOT use it for any other purposes.
@@ -128,17 +140,27 @@ protected:
class LL_COMMON_API LLMutex
{
public:
+ typedef enum
+ {
+ NO_THREAD = 0xFFFFFFFF
+ } e_locking_thread;
+
LLMutex(apr_pool_t *apr_poolp); // NULL pool constructs a new pool for the mutex
virtual ~LLMutex();
void lock(); // blocks
void unlock();
bool isLocked(); // non-blocking, but does do a lock/unlock so not free
+ U32 lockingThread() const; //get ID of locking thread
protected:
apr_thread_mutex_t *mAPRMutexp;
+ mutable U32 mCount;
+ mutable U32 mLockingThread;
+
apr_pool_t *mAPRPoolp;
BOOL mIsLocalPool;
+
#if MUTEX_DEBUG
std::map<U32, BOOL> mIsLocked;
#endif
diff --git a/indra/llcommon/llversionviewer.h b/indra/llcommon/llversionviewer.h
index bd6df962a1..cfafbf0470 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 = 5;
+const S32 LL_VERSION_MINOR = 7;
+const S32 LL_VERSION_PATCH = 4;
const S32 LL_VERSION_BUILD = 0;
const char * const LL_CHANNEL = "Second Life Developer";
diff --git a/indra/llcommon/stdenums.h b/indra/llcommon/stdenums.h
index 9f86de124e..556eff8370 100644
--- a/indra/llcommon/stdenums.h
+++ b/indra/llcommon/stdenums.h
@@ -49,7 +49,8 @@ enum EDragAndDropType
DAD_ANIMATION = 12,
DAD_GESTURE = 13,
DAD_LINK = 14,
- DAD_COUNT = 15, // number of types in this enum
+ DAD_MESH = 15,
+ DAD_COUNT = 16, // number of types in this enum
};
// Reasons for drags to be denied.
diff --git a/indra/llimage/llimage.cpp b/indra/llimage/llimage.cpp
index 39211bf7fa..f0d15d9607 100644
--- a/indra/llimage/llimage.cpp
+++ b/indra/llimage/llimage.cpp
@@ -1254,28 +1254,7 @@ bool LLImageRaw::createFromFile(const std::string &filename, bool j2c_lowest_mip
return false;
}
- LLPointer<LLImageFormatted> image;
- switch(codec)
- {
- //case IMG_CODEC_RGB:
- case IMG_CODEC_BMP:
- image = new LLImageBMP();
- break;
- case IMG_CODEC_TGA:
- image = new LLImageTGA();
- break;
- case IMG_CODEC_JPEG:
- image = new LLImageJPEG();
- break;
- case IMG_CODEC_J2C:
- image = new LLImageJ2C();
- break;
- case IMG_CODEC_DXT:
- image = new LLImageDXT();
- break;
- default:
- return false;
- }
+ LLPointer<LLImageFormatted> image = LLImageFormatted::createFromType(codec);
llassert(image.notNull());
U8 *buffer = image->allocateData(length);
diff --git a/indra/llimage/llimage.h b/indra/llimage/llimage.h
index 18444f3934..c464c3b2b6 100644
--- a/indra/llimage/llimage.h
+++ b/indra/llimage/llimage.h
@@ -35,8 +35,21 @@
const S32 MIN_IMAGE_MIP = 2; // 4x4, only used for expand/contract power of 2
const S32 MAX_IMAGE_MIP = 11; // 2048x2048
+
+// *TODO : Use MAX_IMAGE_MIP as max discard level and modify j2c management so that the number
+// of levels is read from the header's file, not inferred from its size.
const S32 MAX_DISCARD_LEVEL = 5;
+// JPEG2000 size constraints
+// Those are declared here as they are germane to other image constraints used in the viewer
+// and declared right here. Some come from the JPEG2000 spec, some conventions specific to SL.
+const S32 MAX_DECOMPOSITION_LEVELS = 32; // Number of decomposition levels cannot exceed 32 according to jpeg2000 spec
+const S32 MIN_DECOMPOSITION_LEVELS = 5; // the SL viewer will *crash* trying to decode images with fewer than 5 decomposition levels (unless image is small that is)
+const S32 MAX_PRECINCT_SIZE = 2048; // No reason to be bigger than MAX_IMAGE_SIZE
+const S32 MIN_PRECINCT_SIZE = 4; // Can't be smaller than MIN_BLOCK_SIZE
+const S32 MAX_BLOCK_SIZE = 64; // Max total block size is 4096, hence 64x64 when using square blocks
+const S32 MIN_BLOCK_SIZE = 4; // Min block dim is 4 according to jpeg2000 spec
+
const S32 MIN_IMAGE_SIZE = (1<<MIN_IMAGE_MIP); // 4, only used for expand/contract power of 2
const S32 MAX_IMAGE_SIZE = (1<<MAX_IMAGE_MIP); // 2048
const S32 MIN_IMAGE_AREA = MIN_IMAGE_SIZE * MIN_IMAGE_SIZE;
diff --git a/indra/llimage/llimagej2c.cpp b/indra/llimage/llimagej2c.cpp
index 80fec7f8a0..44e6b89dd3 100644
--- a/indra/llimage/llimagej2c.cpp
+++ b/indra/llimage/llimagej2c.cpp
@@ -139,6 +139,15 @@ BOOL LLImageJ2C::updateData()
return res;
}
+BOOL LLImageJ2C::initDecode(LLImageRaw &raw_image, int discard_level, int* region)
+{
+ return mImpl->initDecode(*this,raw_image,discard_level,region);
+}
+
+BOOL LLImageJ2C::initEncode(LLImageRaw &raw_image, int blocks_size, int precincts_size, int levels)
+{
+ return mImpl->initEncode(*this,raw_image,blocks_size,precincts_size,levels);
+}
BOOL LLImageJ2C::decode(LLImageRaw *raw_imagep, F32 decode_time)
{
@@ -251,6 +260,9 @@ S32 LLImageJ2C::calcHeaderSizeJ2C()
//static
S32 LLImageJ2C::calcDataSizeJ2C(S32 w, S32 h, S32 comp, S32 discard_level, F32 rate)
{
+ // Note: this only provides an *estimate* of the size in bytes of an image level
+ // *TODO: find a way to read the true size (when available) and convey the fact
+ // that the result is an estimate in the other cases
if (rate <= 0.f) rate = .125f;
while (discard_level > 0)
{
diff --git a/indra/llimage/llimagej2c.h b/indra/llimage/llimagej2c.h
index dd5bec8b2e..914174fc57 100644
--- a/indra/llimage/llimagej2c.h
+++ b/indra/llimage/llimagej2c.h
@@ -56,6 +56,8 @@ public:
/*virtual*/ void resetLastError();
/*virtual*/ void setLastError(const std::string& message, const std::string& filename = std::string());
+ BOOL initDecode(LLImageRaw &raw_image, int discard_level, int* region);
+ BOOL initEncode(LLImageRaw &raw_image, int blocks_size, int precincts_size, int levels);
// Encode with comment text
BOOL encode(const LLImageRaw *raw_imagep, const char* comment_text, F32 encode_time=0.0);
@@ -117,6 +119,8 @@ protected:
virtual BOOL decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, S32 first_channel, S32 max_channel_count) = 0;
virtual BOOL encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, const char* comment_text, F32 encode_time=0.0,
BOOL reversible=FALSE) = 0;
+ virtual BOOL initDecode(LLImageJ2C &base, LLImageRaw &raw_image, int discard_level = -1, int* region = NULL) = 0;
+ virtual BOOL initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size = -1, int precincts_size = -1, int levels = 0) = 0;
friend class LLImageJ2C;
};
diff --git a/indra/llimagej2coj/llimagej2coj.cpp b/indra/llimagej2coj/llimagej2coj.cpp
index 13b12c0928..d15824ce5a 100644
--- a/indra/llimagej2coj/llimagej2coj.cpp
+++ b/indra/llimagej2coj/llimagej2coj.cpp
@@ -107,6 +107,17 @@ LLImageJ2COJ::~LLImageJ2COJ()
{
}
+BOOL LLImageJ2COJ::initDecode(LLImageJ2C &base, LLImageRaw &raw_image, int discard_level, int* region)
+{
+ // No specific implementation for this method in the OpenJpeg case
+ return FALSE;
+}
+
+BOOL LLImageJ2COJ::initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size, int precincts_size, int levels)
+{
+ // No specific implementation for this method in the OpenJpeg case
+ return FALSE;
+}
BOOL LLImageJ2COJ::decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, S32 first_channel, S32 max_channel_count)
{
diff --git a/indra/llimagej2coj/llimagej2coj.h b/indra/llimagej2coj/llimagej2coj.h
index 9476665ccb..40ad4edb00 100644
--- a/indra/llimagej2coj/llimagej2coj.h
+++ b/indra/llimagej2coj/llimagej2coj.h
@@ -39,6 +39,8 @@ protected:
/*virtual*/ BOOL decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, S32 first_channel, S32 max_channel_count);
/*virtual*/ BOOL encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, const char* comment_text, F32 encode_time=0.0,
BOOL reversible = FALSE);
+ /*virtual*/ BOOL initDecode(LLImageJ2C &base, LLImageRaw &raw_image, int discard_level = -1, int* region = NULL);
+ /*virtual*/ BOOL initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size = -1, int precincts_size = -1, int levels = 0);
};
#endif
diff --git a/indra/llinventory/CMakeLists.txt b/indra/llinventory/CMakeLists.txt
index 6b2b61f883..35a764b111 100644
--- a/indra/llinventory/CMakeLists.txt
+++ b/indra/llinventory/CMakeLists.txt
@@ -59,16 +59,17 @@ list(APPEND llinventory_SOURCE_FILES ${llinventory_HEADER_FILES})
add_library (llinventory ${llinventory_SOURCE_FILES})
-if(LL_TESTS)
- #add unit tests
- INCLUDE(LLAddBuildTest)
- SET(llinventory_TEST_SOURCE_FILES
- # no real unit tests yet!
- )
- LL_ADD_PROJECT_UNIT_TESTS(llinventory "${llinventory_TEST_SOURCE_FILES}")
- #set(TEST_DEBUG on)
- set(test_libs llinventory ${LLMESSAGE_LIBRARIES} ${LLVFS_LIBRARIES} ${LLMATH_LIBRARIES} ${LLCOMMON_LIBRARIES} ${WINDOWS_LIBRARIES})
- LL_ADD_INTEGRATION_TEST(inventorymisc "" "${test_libs}")
- LL_ADD_INTEGRATION_TEST(llparcel "" "${test_libs}")
-endif(LL_TESTS)
+#add unit tests
+if (LL_TESTS)
+ INCLUDE(LLAddBuildTest)
+ SET(llinventory_TEST_SOURCE_FILES
+ # no real unit tests yet!
+ )
+ LL_ADD_PROJECT_UNIT_TESTS(llinventory "${llinventory_TEST_SOURCE_FILES}")
+
+ #set(TEST_DEBUG on)
+ set(test_libs llinventory ${LLMESSAGE_LIBRARIES} ${LLVFS_LIBRARIES} ${LLMATH_LIBRARIES} ${LLCOMMON_LIBRARIES} ${WINDOWS_LIBRARIES})
+ LL_ADD_INTEGRATION_TEST(inventorymisc "" "${test_libs}")
+ LL_ADD_INTEGRATION_TEST(llparcel "" "${test_libs}")
+endif (LL_TESTS)
diff --git a/indra/llinventory/llinventorytype.cpp b/indra/llinventory/llinventorytype.cpp
index a99be1420b..d2bba21648 100644
--- a/indra/llinventory/llinventorytype.cpp
+++ b/indra/llinventory/llinventorytype.cpp
@@ -83,6 +83,7 @@ LLInventoryDictionary::LLInventoryDictionary()
addEntry(LLInventoryType::IT_WEARABLE, new InventoryEntry("wearable", "wearable", 2, LLAssetType::AT_CLOTHING, LLAssetType::AT_BODYPART));
addEntry(LLInventoryType::IT_ANIMATION, new InventoryEntry("animation", "animation", 1, LLAssetType::AT_ANIMATION));
addEntry(LLInventoryType::IT_GESTURE, new InventoryEntry("gesture", "gesture", 1, LLAssetType::AT_GESTURE));
+ addEntry(LLInventoryType::IT_MESH, new InventoryEntry("mesh", "mesh", 1, LLAssetType::AT_MESH));
}
@@ -91,32 +92,58 @@ LLInventoryDictionary::LLInventoryDictionary()
static const LLInventoryType::EType
DEFAULT_ASSET_FOR_INV_TYPE[LLAssetType::AT_COUNT] =
{
- LLInventoryType::IT_TEXTURE, // AT_TEXTURE
- LLInventoryType::IT_SOUND, // AT_SOUND
- LLInventoryType::IT_CALLINGCARD, // AT_CALLINGCARD
- LLInventoryType::IT_LANDMARK, // AT_LANDMARK
- LLInventoryType::IT_LSL, // AT_SCRIPT
- LLInventoryType::IT_WEARABLE, // AT_CLOTHING
- LLInventoryType::IT_OBJECT, // AT_OBJECT
- LLInventoryType::IT_NOTECARD, // AT_NOTECARD
- LLInventoryType::IT_CATEGORY, // AT_CATEGORY
- LLInventoryType::IT_NONE, // (null entry)
- LLInventoryType::IT_LSL, // AT_LSL_TEXT
- LLInventoryType::IT_LSL, // AT_LSL_BYTECODE
- LLInventoryType::IT_TEXTURE, // AT_TEXTURE_TGA
- LLInventoryType::IT_WEARABLE, // AT_BODYPART
- LLInventoryType::IT_CATEGORY, // AT_TRASH
- LLInventoryType::IT_CATEGORY, // AT_SNAPSHOT_CATEGORY
- LLInventoryType::IT_CATEGORY, // AT_LOST_AND_FOUND
- LLInventoryType::IT_SOUND, // AT_SOUND_WAV
- LLInventoryType::IT_NONE, // AT_IMAGE_TGA
- LLInventoryType::IT_NONE, // AT_IMAGE_JPEG
- LLInventoryType::IT_ANIMATION, // AT_ANIMATION
- LLInventoryType::IT_GESTURE, // AT_GESTURE
- LLInventoryType::IT_NONE, // AT_SIMSTATE
-
- LLInventoryType::IT_NONE, // AT_LINK
- LLInventoryType::IT_NONE, // AT_LINK_FOLDER
+ LLInventoryType::IT_TEXTURE, // 0 AT_TEXTURE
+ LLInventoryType::IT_SOUND, // 1 AT_SOUND
+ LLInventoryType::IT_CALLINGCARD, // 2 AT_CALLINGCARD
+ LLInventoryType::IT_LANDMARK, // 3 AT_LANDMARK
+ LLInventoryType::IT_LSL, // 4 AT_SCRIPT
+ LLInventoryType::IT_WEARABLE, // 5 AT_CLOTHING
+ LLInventoryType::IT_OBJECT, // 6 AT_OBJECT
+ LLInventoryType::IT_NOTECARD, // 7 AT_NOTECARD
+ LLInventoryType::IT_CATEGORY, // 8 AT_CATEGORY
+ LLInventoryType::IT_NONE, // 9 (null entry)
+ LLInventoryType::IT_LSL, // 10 AT_LSL_TEXT
+ LLInventoryType::IT_LSL, // 11 AT_LSL_BYTECODE
+ LLInventoryType::IT_TEXTURE, // 12 AT_TEXTURE_TGA
+ LLInventoryType::IT_WEARABLE, // 13 AT_BODYPART
+ LLInventoryType::IT_CATEGORY, // 14 AT_TRASH
+ LLInventoryType::IT_CATEGORY, // 15 AT_SNAPSHOT_CATEGORY
+ LLInventoryType::IT_CATEGORY, // 16 AT_LOST_AND_FOUND
+ LLInventoryType::IT_SOUND, // 17 AT_SOUND_WAV
+ LLInventoryType::IT_NONE, // 18 AT_IMAGE_TGA
+ LLInventoryType::IT_NONE, // 19 AT_IMAGE_JPEG
+ LLInventoryType::IT_ANIMATION, // 20 AT_ANIMATION
+ LLInventoryType::IT_GESTURE, // 21 AT_GESTURE
+ LLInventoryType::IT_NONE, // 22 AT_SIMSTATE
+
+ LLInventoryType::IT_NONE, // 23 AT_LINK
+ LLInventoryType::IT_NONE, // 24 AT_LINK_FOLDER
+
+ LLInventoryType::IT_NONE, // 25 AT_NONE
+ LLInventoryType::IT_NONE, // 26 AT_NONE
+ LLInventoryType::IT_NONE, // 27 AT_NONE
+ LLInventoryType::IT_NONE, // 28 AT_NONE
+ LLInventoryType::IT_NONE, // 29 AT_NONE
+ LLInventoryType::IT_NONE, // 30 AT_NONE
+ LLInventoryType::IT_NONE, // 31 AT_NONE
+ LLInventoryType::IT_NONE, // 32 AT_NONE
+ LLInventoryType::IT_NONE, // 33 AT_NONE
+ LLInventoryType::IT_NONE, // 34 AT_NONE
+ LLInventoryType::IT_NONE, // 35 AT_NONE
+ LLInventoryType::IT_NONE, // 36 AT_NONE
+ LLInventoryType::IT_NONE, // 37 AT_NONE
+ LLInventoryType::IT_NONE, // 38 AT_NONE
+ LLInventoryType::IT_NONE, // 39 AT_NONE
+ LLInventoryType::IT_NONE, // 40 AT_NONE
+ LLInventoryType::IT_NONE, // 41 AT_NONE
+ LLInventoryType::IT_NONE, // 42 AT_NONE
+ LLInventoryType::IT_NONE, // 43 AT_NONE
+ LLInventoryType::IT_NONE, // 44 AT_NONE
+ LLInventoryType::IT_NONE, // 45 AT_NONE
+ LLInventoryType::IT_NONE, // 46 AT_NONE
+ LLInventoryType::IT_NONE, // 47 AT_NONE
+ LLInventoryType::IT_NONE, // 48 AT_NONE
+ LLInventoryType::IT_MESH // 49 AT_MESH
};
// static
diff --git a/indra/llinventory/llinventorytype.h b/indra/llinventory/llinventorytype.h
index d9777a73f2..1a24e351ad 100644
--- a/indra/llinventory/llinventorytype.h
+++ b/indra/llinventory/llinventorytype.h
@@ -61,7 +61,8 @@ public:
IT_WEARABLE = 18,
IT_ANIMATION = 19,
IT_GESTURE = 20,
- IT_COUNT = 21,
+ IT_MESH = 22,
+ IT_COUNT = 23,
IT_NONE = -1
};
diff --git a/indra/llinventory/llparcel.cpp b/indra/llinventory/llparcel.cpp
index 0a4cd51ea0..e8cd871157 100644
--- a/indra/llinventory/llparcel.cpp
+++ b/indra/llinventory/llparcel.cpp
@@ -1348,3 +1348,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..4893337967 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;
@@ -586,7 +586,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;
@@ -657,8 +661,9 @@ protected:
BOOL mRegionPushOverride;
BOOL mRegionDenyAnonymousOverride;
BOOL mRegionDenyAgeUnverifiedOverride;
-
-
+
+ ParcelQuota mQuota;
+
public:
// HACK, make private
S32 mLocalID;
diff --git a/indra/llkdu/llimagej2ckdu.cpp b/indra/llkdu/llimagej2ckdu.cpp
index 10ea5685e8..c156ed0cef 100644
--- a/indra/llkdu/llimagej2ckdu.cpp
+++ b/indra/llkdu/llimagej2ckdu.cpp
@@ -29,40 +29,41 @@
#include "lltimer.h"
#include "llpointer.h"
+#include "llmath.h"
#include "llkdumem.h"
class kdc_flow_control {
-public: // Member functions
- kdc_flow_control(kdu_image_in_base *img_in, kdu_codestream codestream);
- ~kdc_flow_control();
- bool advance_components();
- void process_components();
+public:
+ kdc_flow_control(kdu_image_in_base *img_in, kdu_codestream codestream);
+ ~kdc_flow_control();
+ bool advance_components();
+ void process_components();
+
+private:
-private: // Data
-
- struct kdc_component_flow_control {
- public: // Data
- kdu_image_in_base *reader;
- int vert_subsampling;
- int ratio_counter; /* Initialized to 0, decremented by `count_delta';
+ struct kdc_component_flow_control {
+ public:
+ kdu_image_in_base *reader;
+ int vert_subsampling;
+ int ratio_counter; /* Initialized to 0, decremented by `count_delta';
when < 0, a new line must be processed, after
which it is incremented by `vert_subsampling'. */
- int initial_lines;
- int remaining_lines;
- kdu_line_buf *line;
- };
-
- kdu_codestream codestream;
- kdu_dims valid_tile_indices;
- kdu_coords tile_idx;
- kdu_tile tile;
- int num_components;
- kdc_component_flow_control *components;
- int count_delta; // Holds the minimum of the `vert_subsampling' fields
- kdu_multi_analysis engine;
- kdu_long max_buffer_memory;
+ int initial_lines;
+ int remaining_lines;
+ kdu_line_buf *line;
+ };
+
+ kdu_codestream codestream;
+ kdu_dims valid_tile_indices;
+ kdu_coords tile_idx;
+ kdu_tile tile;
+ int num_components;
+ kdc_component_flow_control *components;
+ int count_delta; // Holds the minimum of the `vert_subsampling' fields
+ kdu_multi_analysis engine;
+ kdu_long max_buffer_memory;
};
//
@@ -72,7 +73,8 @@ void set_default_colour_weights(kdu_params *siz);
const char* engineInfoLLImageJ2CKDU()
{
- return "KDU v6.4.1";
+ static std::string version = llformat("KDU %s", KDU_CORE_VERSION);
+ return version.c_str();
}
LLImageJ2CKDU* createLLImageJ2CKDU()
@@ -105,7 +107,11 @@ const char* fallbackEngineInfoLLImageJ2CImpl()
class LLKDUDecodeState
{
public:
+ LLKDUDecodeState(kdu_tile tile, kdu_byte *buf, S32 row_gap);
+ ~LLKDUDecodeState();
+ BOOL processTileDecode(F32 decode_time, BOOL limit_time = TRUE);
+private:
S32 mNumComponents;
BOOL mUseYCC;
kdu_dims mDims;
@@ -113,22 +119,12 @@ public:
kdu_tile_comp mComps[4];
kdu_line_buf mLines[4];
kdu_pull_ifc mEngines[4];
- bool mReversible[4]; // Some components may be reversible and others not.
- int mBitDepths[4]; // Original bit-depth may be quite different from 8.
-
+ bool mReversible[4]; // Some components may be reversible and others not
+ int mBitDepths[4]; // Original bit-depth may be quite different from 8
+
kdu_tile mTile;
kdu_byte *mBuf;
S32 mRowGap;
-
- LLKDUDecodeState(kdu_tile tile, kdu_byte *buf, S32 row_gap);
- ~LLKDUDecodeState();
- BOOL processTileDecode(F32 decode_time, BOOL limit_time = TRUE);
-
-public:
- int *AssignLayerBytes(siz_params *siz, int &num_specs);
-
- void setupCodeStream(BOOL keep_codestream, LLImageJ2CKDU::ECodeStreamMode mode);
- BOOL initDecode(LLImageRaw &raw_image, F32 decode_time, LLImageJ2CKDU::ECodeStreamMode mode, S32 first_channel, S32 max_channel_count );
};
void ll_kdu_error( void )
@@ -153,7 +149,7 @@ class LLKDUMessageError : public kdu_message
public:
/*virtual*/ void put_text(const char *s);
/*virtual*/ void put_text(const kdu_uint16 *s);
- /*virtual*/ void flush(bool end_of_message=false);
+ /*virtual*/ void flush(bool end_of_message = false);
static LLKDUMessageError sDefaultMessage;
};
@@ -179,7 +175,7 @@ void LLKDUMessageError::put_text(const kdu_uint16 *s)
void LLKDUMessageError::flush(bool end_of_message)
{
- if( end_of_message )
+ if (end_of_message)
{
throw "KDU throwing an exception";
}
@@ -195,7 +191,10 @@ mCodeStreamp(NULL),
mTPosp(NULL),
mTileIndicesp(NULL),
mRawImagep(NULL),
-mDecodeState(NULL)
+mDecodeState(NULL),
+mBlocksSize(-1),
+mPrecinctsSize(-1),
+mLevels(0)
{
}
@@ -210,7 +209,7 @@ void transfer_bytes(kdu_byte *dest, kdu_line_buf &src, int gap, int precision);
void LLImageJ2CKDU::setupCodeStream(LLImageJ2C &base, BOOL keep_codestream, ECodeStreamMode mode)
{
S32 data_size = base.getDataSize();
- S32 max_bytes = base.getMaxBytes() ? base.getMaxBytes() : data_size;
+ S32 max_bytes = (base.getMaxBytes() ? base.getMaxBytes() : data_size);
//
// Initialization
@@ -247,21 +246,21 @@ void LLImageJ2CKDU::setupCodeStream(LLImageJ2C &base, BOOL keep_codestream, ECod
// Set the maximum number of bytes to use from the codestream
mCodeStreamp->set_max_bytes(max_bytes);
- // If you want to flip or rotate the image for some reason, change
+ // If you want to flip or rotate the image for some reason, change
// the resolution, or identify a restricted region of interest, this is
// the place to do it. You may use "kdu_codestream::change_appearance"
// and "kdu_codestream::apply_input_restrictions" for this purpose.
- // If you wish to truncate the code-stream prior to decompression, you
+ // If you wish to truncate the code-stream prior to decompression, you
// may use "kdu_codestream::set_max_bytes".
- // If you wish to retain all compressed data so that the material
+ // If you wish to retain all compressed data so that the material
// can be decompressed multiple times, possibly with different appearance
// parameters, you should call "kdu_codestream::set_persistent" here.
- // There are a variety of other features which must be enabled at
+ // There are a variety of other features which must be enabled at
// this point if you want to take advantage of them. See the
// descriptions appearing with the "kdu_codestream" interface functions
// in "kdu_compressed.h" for an itemized account of these capabilities.
- switch( mode )
+ switch (mode)
{
case MODE_FAST:
mCodeStreamp->set_fast();
@@ -326,7 +325,38 @@ void LLImageJ2CKDU::cleanupCodeStream()
mTileIndicesp = NULL;
}
-BOOL LLImageJ2CKDU::initDecode(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, ECodeStreamMode mode, S32 first_channel, S32 max_channel_count )
+BOOL LLImageJ2CKDU::initDecode(LLImageJ2C &base, LLImageRaw &raw_image, int discard_level, int* region)
+{
+ return initDecode(base,raw_image,0.0f,MODE_FAST,0,4,discard_level,region);
+}
+
+BOOL LLImageJ2CKDU::initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size, int precincts_size, int levels)
+{
+ mPrecinctsSize = precincts_size;
+ if (mPrecinctsSize != -1)
+ {
+ mPrecinctsSize = get_lower_power_two(mPrecinctsSize,MAX_PRECINCT_SIZE);
+ mPrecinctsSize = llmax(mPrecinctsSize,MIN_PRECINCT_SIZE);
+ }
+ mBlocksSize = blocks_size;
+ if (mBlocksSize != -1)
+ {
+ mBlocksSize = get_lower_power_two(mBlocksSize,MAX_BLOCK_SIZE);
+ mBlocksSize = llmax(mBlocksSize,MIN_BLOCK_SIZE);
+ if (mPrecinctsSize != -1)
+ {
+ mBlocksSize = llmin(mBlocksSize,mPrecinctsSize); // blocks *must* be smaller than precincts
+ }
+ }
+ mLevels = levels;
+ if (mLevels != 0)
+ {
+ mLevels = llclamp(mLevels,MIN_DECOMPOSITION_LEVELS,MIN_DECOMPOSITION_LEVELS);
+ }
+ return TRUE;
+}
+
+BOOL LLImageJ2CKDU::initDecode(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, ECodeStreamMode mode, S32 first_channel, S32 max_channel_count, int discard_level, int* region)
{
base.resetLastError();
@@ -339,17 +369,38 @@ BOOL LLImageJ2CKDU::initDecode(LLImageJ2C &base, LLImageRaw &raw_image, F32 deco
mRawImagep = &raw_image;
mCodeStreamp->change_appearance(false, true, false);
- mCodeStreamp->apply_input_restrictions(first_channel,max_channel_count,base.getRawDiscardLevel(),0,NULL);
- kdu_dims dims; mCodeStreamp->get_dims(0,dims);
- S32 channels = base.getComponents() - first_channel;
- if( channels > max_channel_count )
+ // Apply loading discard level and cropping if required
+ kdu_dims* region_kdu = NULL;
+ if (region != NULL)
+ {
+ region_kdu = new kdu_dims;
+ region_kdu->pos.x = region[0];
+ region_kdu->pos.y = region[1];
+ region_kdu->size.x = region[2] - region[0];
+ region_kdu->size.y = region[3] - region[1];
+ }
+ int discard = (discard_level != -1 ? discard_level : base.getRawDiscardLevel());
+
+ // Apply loading restrictions
+ mCodeStreamp->apply_input_restrictions( first_channel, max_channel_count, discard, 0, region_kdu);
+
+ // Clean-up
+ if (region_kdu)
{
- channels = max_channel_count;
+ delete region_kdu;
+ region_kdu = NULL;
}
+
+ // Resize raw_image according to the image to be decoded
+ kdu_dims dims; mCodeStreamp->get_dims(0,dims);
+ // *TODO: Use the real number of levels read from the file throughout the code instead of relying on an infered value from dimensions
+ //S32 levels = mCodeStreamp->get_min_dwt_levels();
+ S32 channels = base.getComponents() - first_channel;
+ channels = llmin(channels,max_channel_count);
raw_image.resize(dims.size.x, dims.size.y, channels);
+ //llinfos << "j2c image dimension: width = " << dims.size.x << ", height = " << dims.size.y << ", channels = " << channels << ", levels = " << levels << llendl;
- // llinfos << "Resizing to " << dims.size.x << ":" << dims.size.y << llendl;
if (!mTileIndicesp)
{
mTileIndicesp = new kdu_dims;
@@ -426,7 +477,7 @@ BOOL LLImageJ2CKDU::decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 deco
// canvas coordinate system. Comparing the two tells
// us where the current tile is in the buffer.
S32 channels = base.getComponents() - first_channel;
- if( channels > max_channel_count )
+ if (channels > max_channel_count)
{
channels = max_channel_count;
}
@@ -452,14 +503,14 @@ BOOL LLImageJ2CKDU::decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 deco
return FALSE;
}
}
- catch( const char* msg )
+ catch (const char* msg)
{
base.setLastError(ll_safe_string(msg));
base.decodeFailed();
cleanupCodeStream();
return TRUE; // done
}
- catch( ... )
+ catch (...)
{
base.setLastError( "Unknown J2C error" );
base.decodeFailed();
@@ -482,28 +533,17 @@ BOOL LLImageJ2CKDU::decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 deco
BOOL LLImageJ2CKDU::encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, const char* comment_text, F32 encode_time, BOOL reversible)
{
- // Collect simple arguments.
- bool transpose, vflip, hflip;
- bool allow_rate_prediction, mem, quiet, no_weights;
- int cpu_iterations;
- std::ostream *record_stream;
-
- transpose = false;
- record_stream = NULL;
- allow_rate_prediction = true;
- no_weights = false;
- cpu_iterations = -1;
- mem = false;
- quiet = false;
- vflip = true;
- hflip = false;
+ // Declare and set simple arguments
+ bool transpose = false;
+ bool vflip = true;
+ bool hflip = false;
try
{
- // Set up input image files.
+ // Set up input image files
siz_params siz;
- // Should set rate someplace here.
+ // Should set rate someplace here
LLKDUMemIn mem_in(raw_image.getData(),
raw_image.getDataSize(),
raw_image.getWidth(),
@@ -521,26 +561,17 @@ BOOL LLImageJ2CKDU::encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, co
siz.set(Sprecision,0,0,8); // Image samples have original bit-depth of 8
siz.set(Ssigned,0,0,false); // Image samples are originally unsigned
- kdu_params *siz_ref = &siz; siz_ref->finalize();
- siz_params transformed_siz; // Use this one to construct code-strea
+ kdu_params *siz_ref = &siz;
+ siz_ref->finalize();
+ siz_params transformed_siz; // Use this one to construct code-stream
transformed_siz.copy_from(&siz,-1,-1,-1,0,transpose,false,false);
- // Construct the `kdu_codestream' object and parse all remaining arguments.
-
+ // Construct the `kdu_codestream' object and parse all remaining arguments
U32 max_output_size = base.getWidth()*base.getHeight()*base.getComponents();
- if (max_output_size < 1000)
- {
- max_output_size = 1000;
- }
+ max_output_size = (max_output_size < 1000 ? 1000 : max_output_size);
U8 *output_buffer = new U8[max_output_size];
-
- U32 output_size = max_output_size; // gets modified
- LLKDUMemTarget output(output_buffer, output_size, base.getWidth()*base.getHeight()*base.getComponents());
- if (output_size > max_output_size)
- {
- llerrs << llformat("LLImageJ2C::encode output_size(%d) > max_output_size(%d)",
- output_size,max_output_size) << llendl;
- }
+ U32 output_size = 0; // Address updated by LLKDUMemTarget to give the final compressed buffer size
+ LLKDUMemTarget output(output_buffer, output_size, max_output_size);
kdu_codestream codestream;
codestream.create(&transformed_siz,&output);
@@ -558,16 +589,22 @@ BOOL LLImageJ2CKDU::encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, co
kdu_long layer_bytes[64];
U32 max_bytes = 0;
- if ((num_components >= 3) && !no_weights)
+ if (num_components >= 3)
{
+ // Note that we always use YCC and not YUV
+ // *TODO: Verify this doesn't screws up reversible textures (like sculpties) as YCC is not reversible but YUV is...
set_default_colour_weights(codestream.access_siz());
}
if (reversible)
{
- // If we're doing reversible, assume we're not using quality layers.
- // Yes, I know this is incorrect!
codestream.access_siz()->parse_string("Creversible=yes");
+ // *TODO: we should use yuv in reversible mode and one level since those images are small.
+ // Don't turn this on now though as both create problems on decoding for the moment
+ //codestream.access_siz()->parse_string("Clevels=1");
+ //codestream.access_siz()->parse_string("Cycc=no");
+ // If we're doing reversible (i.e. lossless compression), assumes we're not using quality layers.
+ // *TODO: this is incorrect and unecessary. Try using the regular layer setting.
codestream.access_siz()->parse_string("Clayers=1");
num_layer_specs = 1;
layer_bytes[0] = 0;
@@ -577,6 +614,7 @@ BOOL LLImageJ2CKDU::encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, co
// Rate is the argument passed into the LLImageJ2C which
// specifies the target compression rate. The default is 8:1.
// Possibly if max_bytes < 500, we should just use the default setting?
+ // *TODO: mRate is actually always 8:1 in the viewer. Test different values. Also force to reversible for small (< 500 bytes) textures.
if (base.mRate != 0.f)
{
max_bytes = (U32)(base.mRate*base.getWidth()*base.getHeight()*base.getComponents());
@@ -617,42 +655,61 @@ BOOL LLImageJ2CKDU::encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, co
codestream.access_siz()->parse_string(layer_string.c_str());
}
}
- codestream.access_siz()->finalize_all();
- if (cpu_iterations >= 0)
+
+ // Set up data ordering, markers, etc... if precincts or blocks specified
+ if ((mBlocksSize != -1) || (mPrecinctsSize != -1))
{
- codestream.collect_timing_stats(cpu_iterations);
+ if (mPrecinctsSize != -1)
+ {
+ std::string precincts_string = llformat("Cprecincts={%d,%d}",mPrecinctsSize,mPrecinctsSize);
+ codestream.access_siz()->parse_string(precincts_string.c_str());
+ }
+ if (mBlocksSize != -1)
+ {
+ std::string blocks_string = llformat("Cblk={%d,%d}",mBlocksSize,mBlocksSize);
+ codestream.access_siz()->parse_string(blocks_string.c_str());
+ }
+ std::string ordering_string = llformat("Corder=RPCL");
+ codestream.access_siz()->parse_string(ordering_string.c_str());
+ std::string PLT_string = llformat("ORGgen_plt=yes");
+ codestream.access_siz()->parse_string(PLT_string.c_str());
+ std::string Parts_string = llformat("ORGtparts=R");
+ codestream.access_siz()->parse_string(Parts_string.c_str());
}
+ if (mLevels != 0)
+ {
+ std::string levels_string = llformat("Clevels=%d",mLevels);
+ codestream.access_siz()->parse_string(levels_string.c_str());
+ }
+
+ codestream.access_siz()->finalize_all();
codestream.change_appearance(transpose,vflip,hflip);
// Now we are ready for sample data processing.
- kdc_flow_control *tile = new kdc_flow_control(&mem_in,codestream);
- bool done = false;
- while (!done)
- {
- // Process line by line
- done = true;
- if (tile->advance_components())
- {
- done = false;
- tile->process_components();
- }
- }
+ kdc_flow_control *tile = new kdc_flow_control(&mem_in,codestream);
+ bool done = false;
+ while (!done)
+ {
+ // Process line by line
+ if (tile->advance_components())
+ {
+ tile->process_components();
+ }
+ else
+ {
+ done = true;
+ }
+ }
// Produce the compressed output
- codestream.flush(layer_bytes,num_layer_specs);
+ codestream.flush(layer_bytes,num_layer_specs);
// Cleanup
- delete tile;
-
+ delete tile;
codestream.destroy();
- if (record_stream != NULL)
- {
- delete record_stream;
- }
// Now that we're done encoding, create the new data buffer for the compressed
// image and stick it there.
-
base.copyData(output_buffer, output_size);
base.updateData(); // set width, height
delete[] output_buffer;
@@ -674,19 +731,19 @@ BOOL LLImageJ2CKDU::encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, co
BOOL LLImageJ2CKDU::getMetadata(LLImageJ2C &base)
{
// *FIX: kdu calls our callback function if there's an error, and
- // then bombs. To regain control, we throw an exception, and
+ // then bombs. To regain control, we throw an exception, and
// catch it here.
try
{
setupCodeStream(base, FALSE, MODE_FAST);
return TRUE;
}
- catch( const char* msg )
+ catch (const char* msg)
{
base.setLastError(ll_safe_string(msg));
return FALSE;
}
- catch( ... )
+ catch (...)
{
base.setLastError( "Unknown J2C error" );
return FALSE;
@@ -699,37 +756,49 @@ void set_default_colour_weights(kdu_params *siz)
assert(cod != NULL);
bool can_use_ycc = true;
- bool rev0=false;
- int depth0=0, sub_x0=1, sub_y0=1;
- for (int c=0; c < 3; c++)
+ bool rev0 = false;
+ int depth0 = 0, sub_x0 = 1, sub_y0 = 1;
+ for (int c = 0; c < 3; c++)
{
- int depth=0; siz->get(Sprecision,c,0,depth);
- int sub_y=1; siz->get(Ssampling,c,0,sub_y);
- int sub_x=1; siz->get(Ssampling,c,1,sub_x);
+ int depth = 0; siz->get(Sprecision,c,0,depth);
+ int sub_y = 1; siz->get(Ssampling,c,0,sub_y);
+ int sub_x = 1; siz->get(Ssampling,c,1,sub_x);
kdu_params *coc = cod->access_relation(-1,c);
- bool rev=false; coc->get(Creversible,0,0,rev);
+ bool rev = false; coc->get(Creversible,0,0,rev);
if (c == 0)
- { rev0=rev; depth0=depth; sub_x0=sub_x; sub_y0=sub_y; }
- else if ((rev != rev0) || (depth != depth0) ||
- (sub_x != sub_x0) || (sub_y != sub_y0))
+ {
+ rev0 = rev; depth0 = depth; sub_x0 = sub_x; sub_y0 = sub_y;
+ }
+ else if ((rev != rev0) || (depth != depth0) ||
+ (sub_x != sub_x0) || (sub_y != sub_y0))
+ {
can_use_ycc = false;
+ }
}
if (!can_use_ycc)
+ {
return;
+ }
bool use_ycc;
if (!cod->get(Cycc,0,0,use_ycc))
+ {
cod->set(Cycc,0,0,use_ycc=true);
+ }
if (!use_ycc)
+ {
return;
+ }
float weight;
- if (cod->get(Clev_weights,0,0,weight) ||
- cod->get(Cband_weights,0,0,weight))
- return; // Weights already specified explicitly.
+ if (cod->get(Clev_weights,0,0,weight) || cod->get(Cband_weights,0,0,weight))
+ {
+ // Weights already specified explicitly -> nothing to do
+ return;
+ }
- /* These example weights are adapted from numbers generated by Marcus Nadenau
- at EPFL, for a viewing distance of 15 cm and a display resolution of
- 300 DPI. */
+ // These example weights are adapted from numbers generated by Marcus Nadenau
+ // at EPFL, for a viewing distance of 15 cm and a display resolution of
+ // 300 DPI.
cod->parse_string("Cband_weights:C0="
"{0.0901},{0.2758},{0.2758},"
@@ -775,7 +844,7 @@ all necessary level shifting, type conversion, rounding and truncation. */
val += 128;
if (val & ((-1)<<8))
{
- val = (val<0)?0:255;
+ val = (val < 0 ? 0 : 255);
}
*dest = (kdu_byte) val;
}
@@ -793,7 +862,7 @@ all necessary level shifting, type conversion, rounding and truncation. */
val += 128;
if (val & ((-1)<<8))
{
- val = (val<0)?0:255;
+ val = (val < 0 ? 0 : 255);
}
*dest = (kdu_byte) val;
}
@@ -816,7 +885,7 @@ all necessary level shifting, type conversion, rounding and truncation. */
val += 128;
if (val & ((-1)<<8))
{
- val = (val<0)?0:255;
+ val = (val < 0 ? 0 : 255);
}
*dest = (kdu_byte) val;
}
@@ -835,7 +904,7 @@ all necessary level shifting, type conversion, rounding and truncation. */
val += 128;
if (val & ((-1)<<8))
{
- val = (val<0)?0:(256-(1<<upshift));
+ val = (val < 0 ? 0 : 256 - (1<<upshift));
}
*dest = (kdu_byte) val;
}
@@ -857,7 +926,7 @@ all necessary level shifting, type conversion, rounding and truncation. */
val += 128;
if (val & ((-1)<<8))
{
- val = (val<0)?0:255;
+ val = (val < 0 ? 0 : 255);
}
*dest = (kdu_byte) val;
}
@@ -873,7 +942,7 @@ all necessary level shifting, type conversion, rounding and truncation. */
val += 128;
if (val & ((-1)<<8))
{
- val = (val<0)?0:(256-(1<<upshift));
+ val = (val < 0 ? 0 : 256 - (1<<upshift));
}
*dest = (kdu_byte) val;
}
@@ -892,17 +961,17 @@ LLKDUDecodeState::LLKDUDecodeState(kdu_tile tile, kdu_byte *buf, S32 row_gap)
mNumComponents = tile.get_num_components();
- llassert(mNumComponents<=4);
+ llassert(mNumComponents <= 4);
mUseYCC = tile.get_ycc();
- for (c=0; c<4; ++c)
+ for (c = 0; c < 4; ++c)
{
mReversible[c] = false;
mBitDepths[c] = 0;
}
// Open tile-components and create processing engines and resources
- for (c=0; c < mNumComponents; c++)
+ for (c = 0; c < mNumComponents; c++)
{
mComps[c] = mTile.access_component(c);
mReversible[c] = mComps[c].get_reversible();
@@ -929,7 +998,7 @@ LLKDUDecodeState::LLKDUDecodeState(kdu_tile tile, kdu_byte *buf, S32 row_gap)
}
}
mAllocator.finalize(); // Actually creates buffering resources
- for (c=0; c < mNumComponents; c++)
+ for (c = 0; c < mNumComponents; c++)
{
mLines[c].create(); // Grabs resources from the allocator.
}
@@ -937,13 +1006,11 @@ LLKDUDecodeState::LLKDUDecodeState(kdu_tile tile, kdu_byte *buf, S32 row_gap)
LLKDUDecodeState::~LLKDUDecodeState()
{
- S32 c;
// Cleanup
- for (c=0; c < mNumComponents; c++)
+ for (S32 c = 0; c < mNumComponents; c++)
{
mEngines[c].destroy(); // engines are interfaces; no default destructors
}
-
mTile.close();
}
@@ -962,7 +1029,7 @@ separation between consecutive rows in the real buffer. */
LLTimer decode_timer;
while (mDims.size.y--)
{
- for (c=0; c < mNumComponents; c++)
+ for (c = 0; c < mNumComponents; c++)
{
mEngines[c].pull(mLines[c],true);
}
@@ -970,7 +1037,7 @@ separation between consecutive rows in the real buffer. */
{
kdu_convert_ycc_to_rgb(mLines[0],mLines[1],mLines[2]);
}
- for (c=0; c < mNumComponents; c++)
+ for (c = 0; c < mNumComponents; c++)
{
transfer_bytes(mBuf+c,mLines[c],mNumComponents,mBitDepths[c]);
}
@@ -990,96 +1057,100 @@ separation between consecutive rows in the real buffer. */
kdc_flow_control::kdc_flow_control (kdu_image_in_base *img_in, kdu_codestream codestream)
{
- int n;
-
- this->codestream = codestream;
- codestream.get_valid_tiles(valid_tile_indices);
- tile_idx = valid_tile_indices.pos;
- tile = codestream.open_tile(tile_idx,NULL);
-
- // Set up the individual components
- num_components = codestream.get_num_components(true);
- components = new kdc_component_flow_control[num_components];
- count_delta = 0;
- kdc_component_flow_control *comp = components;
- for (n = 0; n < num_components; n++, comp++)
- {
- comp->line = NULL;
- comp->reader = img_in;
- kdu_coords subsampling;
- codestream.get_subsampling(n,subsampling,true);
- kdu_dims dims;
- codestream.get_tile_dims(tile_idx,n,dims,true);
- comp->vert_subsampling = subsampling.y;
- if ((n == 0) || (comp->vert_subsampling < count_delta))
- {
- count_delta = comp->vert_subsampling;
- }
- comp->ratio_counter = 0;
- comp->remaining_lines = comp->initial_lines = dims.size.y;
- }
- assert(num_components >= 0);
-
- tile.set_components_of_interest(num_components);
- max_buffer_memory = engine.create(codestream,tile,false,NULL,false,1,NULL,NULL,false);
+ int n;
+
+ this->codestream = codestream;
+ codestream.get_valid_tiles(valid_tile_indices);
+ tile_idx = valid_tile_indices.pos;
+ tile = codestream.open_tile(tile_idx,NULL);
+
+ // Set up the individual components
+ num_components = codestream.get_num_components(true);
+ components = new kdc_component_flow_control[num_components];
+ count_delta = 0;
+ kdc_component_flow_control *comp = components;
+ for (n = 0; n < num_components; n++, comp++)
+ {
+ comp->line = NULL;
+ comp->reader = img_in;
+ kdu_coords subsampling;
+ codestream.get_subsampling(n,subsampling,true);
+ kdu_dims dims;
+ codestream.get_tile_dims(tile_idx,n,dims,true);
+ comp->vert_subsampling = subsampling.y;
+ if ((n == 0) || (comp->vert_subsampling < count_delta))
+ {
+ count_delta = comp->vert_subsampling;
+ }
+ comp->ratio_counter = 0;
+ comp->remaining_lines = comp->initial_lines = dims.size.y;
+ }
+ assert(num_components >= 0);
+
+ tile.set_components_of_interest(num_components);
+ max_buffer_memory = engine.create(codestream,tile,false,NULL,false,1,NULL,NULL,false);
}
kdc_flow_control::~kdc_flow_control()
{
- if (components != NULL)
- delete[] components;
- if (engine.exists())
- engine.destroy();
+ if (components != NULL)
+ {
+ delete[] components;
+ }
+ if (engine.exists())
+ {
+ engine.destroy();
+ }
}
bool kdc_flow_control::advance_components()
{
- bool found_line = false;
- while (!found_line)
- {
- bool all_done = true;
- kdc_component_flow_control *comp = components;
- for (int n = 0; n < num_components; n++, comp++)
- {
- assert(comp->ratio_counter >= 0);
- if (comp->remaining_lines > 0)
- {
- all_done = false;
- comp->ratio_counter -= count_delta;
- if (comp->ratio_counter < 0)
- {
- found_line = true;
- comp->line = engine.exchange_line(n,NULL,NULL);
- assert(comp->line != NULL);
+ bool found_line = false;
+ while (!found_line)
+ {
+ bool all_done = true;
+ kdc_component_flow_control *comp = components;
+ for (int n = 0; n < num_components; n++, comp++)
+ {
+ assert(comp->ratio_counter >= 0);
+ if (comp->remaining_lines > 0)
+ {
+ all_done = false;
+ comp->ratio_counter -= count_delta;
+ if (comp->ratio_counter < 0)
+ {
+ found_line = true;
+ comp->line = engine.exchange_line(n,NULL,NULL);
+ assert(comp->line != NULL);
if (comp->line->get_width())
{
comp->reader->get(n,*(comp->line),0);
}
- }
- }
- }
- if (all_done)
- {
- return false;
- }
- }
- return true;
+ }
+ }
+ }
+ if (all_done)
+ {
+ return false;
+ }
+ }
+ return true;
}
void kdc_flow_control::process_components()
{
- kdc_component_flow_control *comp = components;
- for (int n = 0; n < num_components; n++, comp++)
- {
- if (comp->ratio_counter < 0)
- {
- comp->ratio_counter += comp->vert_subsampling;
- assert(comp->ratio_counter >= 0);
- assert(comp->remaining_lines > 0);
- comp->remaining_lines--;
- assert(comp->line != NULL);
- engine.exchange_line(n,comp->line,NULL);
- comp->line = NULL;
- }
- }
+ kdc_component_flow_control *comp = components;
+ for (int n = 0; n < num_components; n++, comp++)
+ {
+ if (comp->ratio_counter < 0)
+ {
+ comp->ratio_counter += comp->vert_subsampling;
+ assert(comp->ratio_counter >= 0);
+ assert(comp->remaining_lines > 0);
+ comp->remaining_lines--;
+ assert(comp->line != NULL);
+ engine.exchange_line(n,comp->line,NULL);
+ comp->line = NULL;
+ }
+ }
}
diff --git a/indra/llkdu/llimagej2ckdu.h b/indra/llkdu/llimagej2ckdu.h
index 5628f69eeb..1489dbf704 100644
--- a/indra/llkdu/llimagej2ckdu.h
+++ b/indra/llkdu/llimagej2ckdu.h
@@ -58,17 +58,22 @@ protected:
/*virtual*/ BOOL decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, S32 first_channel, S32 max_channel_count);
/*virtual*/ BOOL encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, const char* comment_text, F32 encode_time=0.0,
BOOL reversible=FALSE);
+ /*virtual*/ BOOL initDecode(LLImageJ2C &base, LLImageRaw &raw_image, int discard_level = -1, int* region = NULL);
+ /*virtual*/ BOOL initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size = -1, int precincts_size = -1, int levels = 0);
private:
+ BOOL initDecode(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, ECodeStreamMode mode, S32 first_channel, S32 max_channel_count, int discard_level = -1, int* region = NULL);
void setupCodeStream(LLImageJ2C &base, BOOL keep_codestream, ECodeStreamMode mode);
void cleanupCodeStream();
- BOOL initDecode(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, ECodeStreamMode mode, S32 first_channel, S32 max_channel_count );
// Encode variable
LLKDUMemSource *mInputp;
kdu_codestream *mCodeStreamp;
kdu_coords *mTPosp; // tile position
kdu_dims *mTileIndicesp;
+ int mBlocksSize;
+ int mPrecinctsSize;
+ int mLevels;
// Temporary variables for in-progress decodes...
LLImageRaw *mRawImagep;
diff --git a/indra/llkdu/llkdumem.cpp b/indra/llkdu/llkdumem.cpp
index 1f549cbbe0..0347475559 100644
--- a/indra/llkdu/llkdumem.cpp
+++ b/indra/llkdu/llkdumem.cpp
@@ -47,12 +47,12 @@ LLKDUMemIn::LLKDUMemIn(const U8 *data,
num_components = in_num_components;
alignment_bytes = 0;
- for (n=0; n<3; ++n)
+ for (n = 0; n < 3; ++n)
{
precision[n] = 0;
}
- for (n=0; n < num_components; ++n)
+ for (n = 0; n < num_components; ++n)
{
siz->set(Sdims,n,0,rows);
siz->set(Sdims,n,1,cols);
@@ -80,12 +80,12 @@ LLKDUMemIn::~LLKDUMemIn()
}
image_line_buf *tmp;
while ((tmp=incomplete_lines) != NULL)
- {
+ {
incomplete_lines = tmp->next;
delete tmp;
}
while ((tmp=free_lines) != NULL)
- {
+ {
free_lines = tmp->next;
delete tmp;
}
@@ -98,16 +98,16 @@ bool LLKDUMemIn::get(int comp_idx, kdu_line_buf &line, int x_tnum)
assert((idx >= 0) && (idx < num_components));
x_tnum = x_tnum*num_components+idx;
image_line_buf *scan, *prev=NULL;
- for (scan=incomplete_lines; scan != NULL; prev=scan, scan=scan->next)
- {
+ for (scan = incomplete_lines; scan != NULL; prev = scan, scan = scan->next)
+ {
assert(scan->next_x_tnum >= x_tnum);
if (scan->next_x_tnum == x_tnum)
{
break;
}
- }
+ }
if (scan == NULL)
- { // Need to read a new image line.
+ { // Need to read a new image line.
assert(x_tnum == 0); // Must consume in very specific order.
if (num_unread_rows == 0)
{
@@ -134,7 +134,7 @@ bool LLKDUMemIn::get(int comp_idx, kdu_line_buf &line, int x_tnum)
num_unread_rows--;
scan->accessed_samples = 0;
scan->next_x_tnum = 0;
- }
+ }
assert((cols-scan->accessed_samples) >= line.get_width());
@@ -161,7 +161,7 @@ bool LLKDUMemIn::get(int comp_idx, kdu_line_buf &line, int x_tnum)
}
}
else
- {
+ {
kdu_sample16 *dp = line.get_buf16();
if (line.is_absolute())
{ // 16-bit absolute integers
@@ -177,7 +177,7 @@ bool LLKDUMemIn::get(int comp_idx, kdu_line_buf &line, int x_tnum)
dp->ival = (((kdu_int16)(*sp)) - 128) << (KDU_FIX_POINT-8);
}
}
- }
+ }
scan->next_x_tnum++;
if (idx == (num_components-1))
diff --git a/indra/llkdu/llkdumem.h b/indra/llkdu/llkdumem.h
index 7064de4408..9d923fc367 100644
--- a/indra/llkdu/llkdumem.h
+++ b/indra/llkdu/llkdumem.h
@@ -39,7 +39,7 @@
class LLKDUMemSource: public kdu_compressed_source
{
-public: // Member functions
+public:
LLKDUMemSource(U8 *input_buffer, U32 size)
{
mData = input_buffer;
@@ -47,11 +47,11 @@ public: // Member functions
mCurPos = 0;
}
- ~LLKDUMemSource()
+ ~LLKDUMemSource()
{
}
- int read(kdu_byte *buf, int num_bytes)
+ int read(kdu_byte *buf, int num_bytes)
{
U32 num_out;
num_out = num_bytes;
@@ -70,7 +70,7 @@ public: // Member functions
mCurPos = 0;
}
-private: // Data
+private:
U8 *mData;
U32 mSize;
U32 mCurPos;
@@ -78,7 +78,7 @@ private: // Data
class LLKDUMemTarget: public kdu_compressed_target
{
-public: // Member functions
+public:
LLKDUMemTarget(U8 *output_buffer, U32 &output_size, const U32 buffer_size)
{
mData = output_buffer;
@@ -87,11 +87,11 @@ public: // Member functions
mOutputSize = &output_size;
}
- ~LLKDUMemTarget()
- {
+ ~LLKDUMemTarget()
+ {
}
- bool write(const kdu_byte *buf, int num_bytes)
+ bool write(const kdu_byte *buf, int num_bytes)
{
U32 num_out;
num_out = num_bytes;
@@ -108,7 +108,7 @@ public: // Member functions
return true;
}
-private: // Data
+private:
U8 *mData;
U32 mSize;
U32 mCurPos;
@@ -117,27 +117,27 @@ private: // Data
class LLKDUMemIn : public kdu_image_in_base
{
-public: // Member functions
- LLKDUMemIn(const U8 *data,
+public:
+ LLKDUMemIn(const U8 *data,
const U32 size,
const U16 rows,
const U16 cols,
U8 in_num_components,
siz_params *siz);
- ~LLKDUMemIn();
+ ~LLKDUMemIn();
- bool get(int comp_idx, kdu_line_buf &line, int x_tnum);
+ bool get(int comp_idx, kdu_line_buf &line, int x_tnum);
-private: // Data
+private:
const U8 *mData;
- int first_comp_idx;
- int num_components;
- int rows, cols;
- int alignment_bytes; // Number of 0's at end of each line.
- int precision[3];
- image_line_buf *incomplete_lines; // Each "sample" represents a full pixel
- image_line_buf *free_lines;
- int num_unread_rows;
+ int first_comp_idx;
+ int num_components;
+ int rows, cols;
+ int alignment_bytes; // Number of 0's at end of each line.
+ int precision[3];
+ image_line_buf *incomplete_lines; // Each "sample" represents a full pixel
+ image_line_buf *free_lines;
+ int num_unread_rows;
U32 mCurPos;
U32 mDataSize;
diff --git a/indra/llkdu/tests/llimagej2ckdu_test.cpp b/indra/llkdu/tests/llimagej2ckdu_test.cpp
index 7ac24a969a..ab60ab6d50 100644
--- a/indra/llkdu/tests/llimagej2ckdu_test.cpp
+++ b/indra/llkdu/tests/llimagej2ckdu_test.cpp
@@ -134,6 +134,7 @@ kdu_params* kdu_params::access_cluster(const char*) { return NULL; }
void kdu_codestream::set_fast() { }
void kdu_codestream::set_fussy() { }
void kdu_codestream::get_dims(int, kdu_dims&, bool ) { }
+int kdu_codestream::get_min_dwt_levels() { return 5; }
void kdu_codestream::change_appearance(bool, bool, bool) { }
void kdu_codestream::get_tile_dims(kdu_coords, int, kdu_dims&, bool ) { }
void kdu_codestream::destroy() { }
diff --git a/indra/llmath/CMakeLists.txt b/indra/llmath/CMakeLists.txt
index e93fe90650..9dadad7dd3 100644
--- a/indra/llmath/CMakeLists.txt
+++ b/indra/llmath/CMakeLists.txt
@@ -15,13 +15,16 @@ set(llmath_SOURCE_FILES
llcamera.cpp
llcoordframe.cpp
llline.cpp
+ llmatrix3a.cpp
llmodularmath.cpp
llperlin.cpp
llquaternion.cpp
llrect.cpp
llsphere.cpp
+ llvector4a.cpp
llvolume.cpp
llvolumemgr.cpp
+ llvolumeoctree.cpp
llsdutil_math.cpp
m3math.cpp
m4math.cpp
@@ -49,21 +52,32 @@ set(llmath_HEADER_FILES
llinterp.h
llline.h
llmath.h
+ llmatrix3a.h
+ llmatrix3a.inl
llmodularmath.h
lloctree.h
llperlin.h
llplane.h
llquantize.h
llquaternion.h
+ llquaternion2.h
+ llquaternion2.inl
llrect.h
+ llsimdmath.h
+ llsimdtypes.h
+ llsimdtypes.inl
llsphere.h
lltreenode.h
+ llvector4a.h
+ llvector4a.inl
+ llvector4logical.h
llv4math.h
llv4matrix3.h
llv4matrix4.h
llv4vector3.h
llvolume.h
llvolumemgr.h
+ llvolumeoctree.h
llsdutil_math.h
m3math.h
m4math.h
diff --git a/indra/llmath/llcamera.cpp b/indra/llmath/llcamera.cpp
index 687c1a7d45..22ba26f99b 100644
--- a/indra/llmath/llcamera.cpp
+++ b/indra/llmath/llcamera.cpp
@@ -45,7 +45,6 @@ LLCamera::LLCamera() :
calculateFrustumPlanes();
}
-
LLCamera::LLCamera(F32 vertical_fov_rads, F32 aspect_ratio, S32 view_height_in_pixels, F32 near_plane, F32 far_plane) :
LLCoordFrame(),
mViewHeightInPixels(view_height_in_pixels),
@@ -61,6 +60,10 @@ LLCamera::LLCamera(F32 vertical_fov_rads, F32 aspect_ratio, S32 view_height_in_p
setView(vertical_fov_rads);
}
+LLCamera::~LLCamera()
+{
+
+}
// ---------------- LLCamera::getFoo() member functions ----------------
@@ -82,11 +85,11 @@ F32 LLCamera::getMaxView() const
// ---------------- LLCamera::setFoo() member functions ----------------
-void LLCamera::setUserClipPlane(LLPlane plane)
+void LLCamera::setUserClipPlane(LLPlane& plane)
{
mPlaneCount = 7;
- mAgentPlanes[6].p = plane;
- mAgentPlanes[6].mask = calcPlaneMask(plane);
+ mAgentPlanes[6] = plane;
+ mPlaneMask[6] = plane.calcPlaneMask();
}
void LLCamera::disableUserClipPlane()
@@ -158,166 +161,91 @@ size_t LLCamera::readFrustumFromBuffer(const char *buffer)
// ---------------- test methods ----------------
-S32 LLCamera::AABBInFrustum(const LLVector3 &center, const LLVector3& radius)
+S32 LLCamera::AABBInFrustum(const LLVector4a &center, const LLVector4a& radius)
{
- static const LLVector3 scaler[] = {
- LLVector3(-1,-1,-1),
- LLVector3( 1,-1,-1),
- LLVector3(-1, 1,-1),
- LLVector3( 1, 1,-1),
- LLVector3(-1,-1, 1),
- LLVector3( 1,-1, 1),
- LLVector3(-1, 1, 1),
- LLVector3( 1, 1, 1)
+ static const LLVector4a scaler[] = {
+ LLVector4a(-1,-1,-1),
+ LLVector4a( 1,-1,-1),
+ LLVector4a(-1, 1,-1),
+ LLVector4a( 1, 1,-1),
+ LLVector4a(-1,-1, 1),
+ LLVector4a( 1,-1, 1),
+ LLVector4a(-1, 1, 1),
+ LLVector4a( 1, 1, 1)
};
U8 mask = 0;
- S32 result = 2;
-
- /*if (mFrustumCornerDist > 0.f && radius.magVecSquared() > mFrustumCornerDist * mFrustumCornerDist)
- { //box is larger than frustum, check frustum quads against box planes
-
- static const LLVector3 dir[] =
- {
- LLVector3(1, 0, 0),
- LLVector3(-1, 0, 0),
- LLVector3(0, 1, 0),
- LLVector3(0, -1, 0),
- LLVector3(0, 0, 1),
- LLVector3(0, 0, -1)
- };
-
- U32 quads[] =
- {
- 0, 1, 2, 3,
- 0, 1, 5, 4,
- 2, 3, 7, 6,
- 3, 0, 7, 4,
- 1, 2, 6, 4,
- 4, 5, 6, 7
- };
-
- result = 0;
-
- BOOL total_inside = TRUE;
- for (U32 i = 0; i < 6; i++)
- {
- LLVector3 p = center + radius.scaledVec(dir[i]);
- F32 d = -p*dir[i];
-
- for (U32 j = 0; j < 6; j++)
- { //for each quad
- F32 dist = mAgentFrustum[quads[j*4+0]]*dir[i] + d;
- if (dist > 0)
- { //at least one frustum point is outside the AABB
- total_inside = FALSE;
- for (U32 k = 1; k < 4; k++)
- { //for each other point on quad
- if ( mAgentFrustum[quads[j*4+k]]*dir[i]+d <= 0.f)
- { //quad is straddling some plane of AABB
- return 1;
- }
- }
- }
- else
- {
- for (U32 k = 1; k < 4; k++)
- {
- if (mAgentFrustum[quads[j*4+k]]*dir[i]+d > 0.f)
- {
- return 1;
- }
- }
- }
- }
- }
-
- if (total_inside)
- {
- result = 1;
- }
- }
- else*/
+ bool result = false;
+ LLVector4a rscale, maxp, minp;
+ LLSimdScalar d;
+ for (U32 i = 0; i < mPlaneCount; i++)
{
- for (U32 i = 0; i < mPlaneCount; i++)
+ mask = mPlaneMask[i];
+ if (mask != 0xff)
{
- mask = mAgentPlanes[i].mask;
- if (mask == 0xff)
- {
- continue;
- }
- LLPlane p = mAgentPlanes[i].p;
- LLVector3 n = LLVector3(p);
- float d = p.mV[3];
- LLVector3 rscale = radius.scaledVec(scaler[mask]);
-
- LLVector3 minp = center - rscale;
- LLVector3 maxp = center + rscale;
-
- if (n * minp > -d)
+ const LLPlane& p(mAgentPlanes[i]);
+ p.getAt<3>(d);
+ rscale.setMul(radius, scaler[mask]);
+ minp.setSub(center, rscale);
+ d = -d;
+ if (p.dot3(minp).getF32() > d)
{
return 0;
}
-
- if (n * maxp > -d)
+
+ if(!result)
{
- result = 1;
+ maxp.setAdd(center, rscale);
+ result = (p.dot3(maxp).getF32() > d);
}
}
}
-
- return result;
+ return result?1:2;
}
-S32 LLCamera::AABBInFrustumNoFarClip(const LLVector3 &center, const LLVector3& radius)
+
+S32 LLCamera::AABBInFrustumNoFarClip(const LLVector4a& center, const LLVector4a& radius)
{
- static const LLVector3 scaler[] = {
- LLVector3(-1,-1,-1),
- LLVector3( 1,-1,-1),
- LLVector3(-1, 1,-1),
- LLVector3( 1, 1,-1),
- LLVector3(-1,-1, 1),
- LLVector3( 1,-1, 1),
- LLVector3(-1, 1, 1),
- LLVector3( 1, 1, 1)
+ static const LLVector4a scaler[] = {
+ LLVector4a(-1,-1,-1),
+ LLVector4a( 1,-1,-1),
+ LLVector4a(-1, 1,-1),
+ LLVector4a( 1, 1,-1),
+ LLVector4a(-1,-1, 1),
+ LLVector4a( 1,-1, 1),
+ LLVector4a(-1, 1, 1),
+ LLVector4a( 1, 1, 1)
};
U8 mask = 0;
- S32 result = 2;
-
+ bool result = false;
+ LLVector4a rscale, maxp, minp;
+ LLSimdScalar d;
for (U32 i = 0; i < mPlaneCount; i++)
{
- if (i == 5)
- {
- continue;
- }
-
- mask = mAgentPlanes[i].mask;
- if (mask == 0xff)
- {
- continue;
- }
- LLPlane p = mAgentPlanes[i].p;
- LLVector3 n = LLVector3(p);
- float d = p.mV[3];
- LLVector3 rscale = radius.scaledVec(scaler[mask]);
-
- LLVector3 minp = center - rscale;
- LLVector3 maxp = center + rscale;
-
- if (n * minp > -d)
+ mask = mPlaneMask[i];
+ if ((i != 5) && (mask != 0xff))
{
- return 0;
- }
-
- if (n * maxp > -d)
- {
- result = 1;
+ const LLPlane& p(mAgentPlanes[i]);
+ p.getAt<3>(d);
+ rscale.setMul(radius, scaler[mask]);
+ minp.setSub(center, rscale);
+ d = -d;
+ if (p.dot3(minp).getF32() > d)
+ {
+ return 0;
+ }
+
+ if(!result)
+ {
+ maxp.setAdd(center, rscale);
+ result = (p.dot3(maxp).getF32() > d);
+ }
}
}
- return result;
+ return result?1:2;
}
int LLCamera::sphereInFrustumQuick(const LLVector3 &sphere_center, const F32 radius)
@@ -438,28 +366,22 @@ int LLCamera::sphereInFrustumOld(const LLVector3 &sphere_center, const F32 radiu
int LLCamera::sphereInFrustum(const LLVector3 &sphere_center, const F32 radius) const
{
// Returns 1 if sphere is in frustum, 0 if not.
- int res = 2;
+ bool res = false;
for (int i = 0; i < 6; i++)
{
- if (mAgentPlanes[i].mask == 0xff)
+ if (mPlaneMask[i] != 0xff)
{
- continue;
- }
-
- float d = mAgentPlanes[i].p.dist(sphere_center);
+ float d = mAgentPlanes[i].dist(sphere_center);
- if (d > radius)
- {
- return 0;
- }
-
- if (d > -radius)
- {
- res = 1;
+ if (d > radius)
+ {
+ return 0;
+ }
+ res = res || (d > -radius);
}
}
- return res;
+ return res?1:2;
}
@@ -611,25 +533,6 @@ LLPlane planeFromPoints(LLVector3 p1, LLVector3 p2, LLVector3 p3)
return LLPlane(p1, n);
}
-U8 LLCamera::calcPlaneMask(const LLPlane& plane)
-{
- U8 mask = 0;
-
- if (plane.mV[0] >= 0)
- {
- mask |= 1;
- }
- if (plane.mV[1] >= 0)
- {
- mask |= 2;
- }
- if (plane.mV[2] >= 0)
- {
- mask |= 4;
- }
-
- return mask;
-}
void LLCamera::ignoreAgentFrustumPlane(S32 idx)
{
@@ -638,12 +541,13 @@ void LLCamera::ignoreAgentFrustumPlane(S32 idx)
return;
}
- mAgentPlanes[idx].mask = 0xff;
- mAgentPlanes[idx].p.clearVec();
+ mPlaneMask[idx] = 0xff;
+ mAgentPlanes[idx].clear();
}
void LLCamera::calcAgentFrustumPlanes(LLVector3* frust)
{
+
for (int i = 0; i < 8; i++)
{
mAgentFrustum[i] = frust[i];
@@ -656,27 +560,27 @@ void LLCamera::calcAgentFrustumPlanes(LLVector3* frust)
//order of planes is important, keep most likely to fail in the front of the list
//near - frust[0], frust[1], frust[2]
- mAgentPlanes[2].p = planeFromPoints(frust[0], frust[1], frust[2]);
+ mAgentPlanes[2] = planeFromPoints(frust[0], frust[1], frust[2]);
//far
- mAgentPlanes[5].p = planeFromPoints(frust[5], frust[4], frust[6]);
+ mAgentPlanes[5] = planeFromPoints(frust[5], frust[4], frust[6]);
//left
- mAgentPlanes[0].p = planeFromPoints(frust[4], frust[0], frust[7]);
+ mAgentPlanes[0] = planeFromPoints(frust[4], frust[0], frust[7]);
//right
- mAgentPlanes[1].p = planeFromPoints(frust[1], frust[5], frust[6]);
+ mAgentPlanes[1] = planeFromPoints(frust[1], frust[5], frust[6]);
//top
- mAgentPlanes[4].p = planeFromPoints(frust[3], frust[2], frust[6]);
+ mAgentPlanes[4] = planeFromPoints(frust[3], frust[2], frust[6]);
//bottom
- mAgentPlanes[3].p = planeFromPoints(frust[1], frust[0], frust[4]);
+ mAgentPlanes[3] = planeFromPoints(frust[1], frust[0], frust[4]);
//cache plane octant facing mask for use in AABBInFrustum
for (U32 i = 0; i < mPlaneCount; i++)
{
- mAgentPlanes[i].mask = calcPlaneMask(mAgentPlanes[i].p);
+ mPlaneMask[i] = mAgentPlanes[i].calcPlaneMask();
}
}
@@ -730,9 +634,10 @@ void LLCamera::calculateWorldFrustumPlanes()
F32 d;
LLVector3 center = mOrigin - mXAxis*mNearPlane;
mWorldPlanePos = center;
+ LLVector3 pnorm;
for (int p=0; p<4; p++)
{
- LLVector3 pnorm = LLVector3(mLocalPlanes[p]);
+ mLocalPlanes[p].getVector3(pnorm);
LLVector3 norm = rotateToAbsolute(pnorm);
norm.normVec();
d = -(center * norm);
@@ -742,13 +647,15 @@ void LLCamera::calculateWorldFrustumPlanes()
LLVector3 zaxis(0, 0, 1.0f);
F32 yaw = getYaw();
{
- LLVector3 tnorm = LLVector3(mLocalPlanes[PLANE_LEFT]);
+ LLVector3 tnorm;
+ mLocalPlanes[PLANE_LEFT].getVector3(tnorm);
tnorm.rotVec(yaw, zaxis);
d = -(mOrigin * tnorm);
mHorizPlanes[HORIZ_PLANE_LEFT] = LLPlane(tnorm, d);
}
{
- LLVector3 tnorm = LLVector3(mLocalPlanes[PLANE_RIGHT]);
+ LLVector3 tnorm;
+ mLocalPlanes[PLANE_RIGHT].getVector3(tnorm);
tnorm.rotVec(yaw, zaxis);
d = -(mOrigin * tnorm);
mHorizPlanes[HORIZ_PLANE_RIGHT] = LLPlane(tnorm, d);
diff --git a/indra/llmath/llcamera.h b/indra/llmath/llcamera.h
index 531144db39..ec67b91d05 100644
--- a/indra/llmath/llcamera.h
+++ b/indra/llmath/llcamera.h
@@ -31,6 +31,7 @@
#include "llmath.h"
#include "llcoordframe.h"
#include "llplane.h"
+#include "llvector4a.h"
const F32 DEFAULT_FIELD_OF_VIEW = 60.f * DEG_TO_RAD;
const F32 DEFAULT_ASPECT_RATIO = 640.f / 480.f;
@@ -64,6 +65,12 @@ class LLCamera
: public LLCoordFrame
{
public:
+
+ LLCamera(const LLCamera& rhs)
+ {
+ *this = rhs;
+ }
+
enum {
PLANE_LEFT = 0,
PLANE_RIGHT = 1,
@@ -101,6 +108,9 @@ public:
};
private:
+ LLPlane mAgentPlanes[7]; //frustum planes in agent space a la gluUnproject (I'm a bastard, I know) - DaveP
+ U8 mPlaneMask[8]; // 8 for alignment
+
F32 mView; // angle between top and bottom frustum planes in radians.
F32 mAspect; // width/height
S32 mViewHeightInPixels; // for ViewHeightInPixels() only
@@ -114,30 +124,22 @@ private:
LLPlane mWorldPlanes[PLANE_NUM];
LLPlane mHorizPlanes[HORIZ_PLANE_NUM];
- struct frustum_plane
- {
- frustum_plane() : mask(0) {}
- LLPlane p;
- U8 mask;
- };
- frustum_plane mAgentPlanes[7]; //frustum planes in agent space a la gluUnproject (I'm a bastard, I know) - DaveP
-
U32 mPlaneCount; //defaults to 6, if setUserClipPlane is called, uses user supplied clip plane in
LLVector3 mWorldPlanePos; // Position of World Planes (may be offset from camera)
public:
LLVector3 mAgentFrustum[8]; //8 corners of 6-plane frustum
F32 mFrustumCornerDist; //distance to corner of frustum against far clip plane
- LLPlane getAgentPlane(U32 idx) { return mAgentPlanes[idx].p; }
+ LLPlane& getAgentPlane(U32 idx) { return mAgentPlanes[idx]; }
public:
LLCamera();
LLCamera(F32 vertical_fov_rads, F32 aspect_ratio, S32 view_height_in_pixels, F32 near_plane, F32 far_plane);
- virtual ~LLCamera(){} // no-op virtual destructor
+ virtual ~LLCamera();
+
- void setUserClipPlane(LLPlane plane);
+ void setUserClipPlane(LLPlane& plane);
void disableUserClipPlane();
- U8 calcPlaneMask(const LLPlane& plane);
virtual void setView(F32 vertical_fov_rads);
void setViewHeightInPixels(S32 height);
void setAspect(F32 new_aspect);
@@ -184,8 +186,8 @@ public:
S32 sphereInFrustum(const LLVector3 &center, const F32 radius) const;
S32 pointInFrustum(const LLVector3 &point) const { return sphereInFrustum(point, 0.0f); }
S32 sphereInFrustumFull(const LLVector3 &center, const F32 radius) const { return sphereInFrustum(center, radius); }
- S32 AABBInFrustum(const LLVector3 &center, const LLVector3& radius);
- S32 AABBInFrustumNoFarClip(const LLVector3 &center, const LLVector3& radius);
+ S32 AABBInFrustum(const LLVector4a& center, const LLVector4a& radius);
+ S32 AABBInFrustumNoFarClip(const LLVector4a& center, const LLVector4a& radius);
//does a quick 'n dirty sphere-sphere check
S32 sphereInFrustumQuick(const LLVector3 &sphere_center, const F32 radius);
diff --git a/indra/llmath/llmath.h b/indra/llmath/llmath.h
index 798f1154d0..eea7c977fb 100644
--- a/indra/llmath/llmath.h
+++ b/indra/llmath/llmath.h
@@ -29,7 +29,7 @@
#include <cmath>
#include <cstdlib>
-#include <complex>
+#include <vector>
#include "lldefs.h"
//#include "llstl.h" // *TODO: Remove when LLString is gone
//#include "llstring.h" // *TODO: Remove when LLString is gone
@@ -55,32 +55,11 @@
#endif
// Single Precision Floating Point Routines
-#ifndef sqrtf
-#define sqrtf(x) ((F32)sqrt((F64)(x)))
-#endif
-#ifndef fsqrtf
-#define fsqrtf(x) sqrtf(x)
-#endif
-
-#ifndef cosf
-#define cosf(x) ((F32)cos((F64)(x)))
-#endif
-#ifndef sinf
-#define sinf(x) ((F32)sin((F64)(x)))
-#endif
-#ifndef tanf
+// (There used to be more defined here, but they appeared to be redundant and
+// were breaking some other includes. Removed by Falcon, reviewed by Andrew, 11/25/09)
+/*#ifndef tanf
#define tanf(x) ((F32)tan((F64)(x)))
-#endif
-#ifndef acosf
-#define acosf(x) ((F32)acos((F64)(x)))
-#endif
-
-#ifndef powf
-#define powf(x,y) ((F32)pow((F64)(x),(F64)(y)))
-#endif
-#ifndef expf
-#define expf(x) ((F32)exp((F64)(x)))
-#endif
+#endif*/
const F32 GRAVITY = -9.8f;
@@ -200,7 +179,7 @@ inline S32 llfloor( F32 f )
}
return result;
#else
- return (S32)floorf(f);
+ return (S32)floor(f);
#endif
}
@@ -378,11 +357,14 @@ inline F32 snap_to_sig_figs(F32 foo, S32 sig_figs)
bar *= 10.f;
}
- foo = (F32)llround(foo * bar);
+ //F32 new_foo = (F32)llround(foo * bar);
+ // the llround() implementation sucks. Don't us it.
- // shift back
- foo /= bar;
- return foo;
+ F32 sign = (foo > 0.f) ? 1.f : -1.f;
+ F32 new_foo = F32( S64(foo * bar + sign * 0.5f));
+ new_foo /= bar;
+
+ return new_foo;
}
inline F32 lerp(F32 a, F32 b, F32 u)
@@ -516,4 +498,45 @@ inline F32 llgaussian(F32 x, F32 o)
return 1.f/(F_SQRT_TWO_PI*o)*powf(F_E, -(x*x)/(2*o*o));
}
+//helper function for removing outliers
+template <class VEC_TYPE>
+inline void ll_remove_outliers(std::vector<VEC_TYPE>& data, F32 k)
+{
+ if (data.size() < 100)
+ { //not enough samples
+ return;
+ }
+
+ VEC_TYPE Q1 = data[data.size()/4];
+ VEC_TYPE Q3 = data[data.size()-data.size()/4-1];
+
+ VEC_TYPE min = (VEC_TYPE) ((F32) Q1-k * (F32) (Q3-Q1));
+ VEC_TYPE max = (VEC_TYPE) ((F32) Q3+k * (F32) (Q3-Q1));
+
+ U32 i = 0;
+ while (i < data.size() && data[i] < min)
+ {
+ i++;
+ }
+
+ S32 j = data.size()-1;
+ while (j > 0 && data[j] > max)
+ {
+ j--;
+ }
+
+ if (j < data.size()-1)
+ {
+ data.erase(data.begin()+j, data.end());
+ }
+
+ if (i > 0)
+ {
+ data.erase(data.begin(), data.begin()+i);
+ }
+}
+
+// Include simd math header
+#include "llsimdmath.h"
+
#endif
diff --git a/indra/llmath/llmatrix3a.cpp b/indra/llmath/llmatrix3a.cpp
new file mode 100644
index 0000000000..ab077abcb0
--- /dev/null
+++ b/indra/llmath/llmatrix3a.cpp
@@ -0,0 +1,134 @@
+/**
+ * @file llvector4a.cpp
+ * @brief SIMD vector implementation
+ *
+ * $LicenseInfo:firstyear=2010&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llmath.h"
+
+static LL_ALIGN_16(const F32 M_IDENT_3A[12]) =
+ { 1.f, 0.f, 0.f, 0.f, // Column 1
+ 0.f, 1.f, 0.f, 0.f, // Column 2
+ 0.f, 0.f, 1.f, 0.f }; // Column 3
+
+extern const LLMatrix3a LL_M3A_IDENTITY = *reinterpret_cast<const LLMatrix3a*> (M_IDENT_3A);
+
+void LLMatrix3a::setMul( const LLMatrix3a& lhs, const LLMatrix3a& rhs )
+{
+ const LLVector4a col0 = lhs.getColumn(0);
+ const LLVector4a col1 = lhs.getColumn(1);
+ const LLVector4a col2 = lhs.getColumn(2);
+
+ for ( int i = 0; i < 3; i++ )
+ {
+ LLVector4a xxxx = _mm_load_ss( rhs.mColumns[i].getF32ptr() );
+ xxxx.splat<0>( xxxx );
+ xxxx.mul( col0 );
+
+ {
+ LLVector4a yyyy = _mm_load_ss( rhs.mColumns[i].getF32ptr() + 1 );
+ yyyy.splat<0>( yyyy );
+ yyyy.mul( col1 );
+ xxxx.add( yyyy );
+ }
+
+ {
+ LLVector4a zzzz = _mm_load_ss( rhs.mColumns[i].getF32ptr() + 2 );
+ zzzz.splat<0>( zzzz );
+ zzzz.mul( col2 );
+ xxxx.add( zzzz );
+ }
+
+ xxxx.store4a( mColumns[i].getF32ptr() );
+ }
+
+}
+
+/*static */void LLMatrix3a::batchTransform( const LLMatrix3a& xform, const LLVector4a* src, int numVectors, LLVector4a* dst )
+{
+ const LLVector4a col0 = xform.getColumn(0);
+ const LLVector4a col1 = xform.getColumn(1);
+ const LLVector4a col2 = xform.getColumn(2);
+ const LLVector4a* maxAddr = src + numVectors;
+
+ if ( numVectors & 0x1 )
+ {
+ LLVector4a xxxx = _mm_load_ss( (const F32*)src );
+ LLVector4a yyyy = _mm_load_ss( (const F32*)src + 1 );
+ LLVector4a zzzz = _mm_load_ss( (const F32*)src + 2 );
+ xxxx.splat<0>( xxxx );
+ yyyy.splat<0>( yyyy );
+ zzzz.splat<0>( zzzz );
+ xxxx.mul( col0 );
+ yyyy.mul( col1 );
+ zzzz.mul( col2 );
+ xxxx.add( yyyy );
+ xxxx.add( zzzz );
+ xxxx.store4a( (F32*)dst );
+ src++;
+ dst++;
+ }
+
+
+ numVectors >>= 1;
+ while ( src < maxAddr )
+ {
+ _mm_prefetch( (const char*)(src + 32 ), _MM_HINT_NTA );
+ _mm_prefetch( (const char*)(dst + 32), _MM_HINT_NTA );
+ LLVector4a xxxx = _mm_load_ss( (const F32*)src );
+ LLVector4a xxxx1= _mm_load_ss( (const F32*)(src + 1) );
+
+ xxxx.splat<0>( xxxx );
+ xxxx1.splat<0>( xxxx1 );
+ xxxx.mul( col0 );
+ xxxx1.mul( col0 );
+
+ {
+ LLVector4a yyyy = _mm_load_ss( (const F32*)src + 1 );
+ LLVector4a yyyy1 = _mm_load_ss( (const F32*)(src + 1) + 1);
+ yyyy.splat<0>( yyyy );
+ yyyy1.splat<0>( yyyy1 );
+ yyyy.mul( col1 );
+ yyyy1.mul( col1 );
+ xxxx.add( yyyy );
+ xxxx1.add( yyyy1 );
+ }
+
+ {
+ LLVector4a zzzz = _mm_load_ss( (const F32*)(src) + 2 );
+ LLVector4a zzzz1 = _mm_load_ss( (const F32*)(++src) + 2 );
+ zzzz.splat<0>( zzzz );
+ zzzz1.splat<0>( zzzz1 );
+ zzzz.mul( col2 );
+ zzzz1.mul( col2 );
+ xxxx.add( zzzz );
+ xxxx1.add( zzzz1 );
+ }
+
+ xxxx.store4a(dst->getF32ptr());
+ src++;
+ dst++;
+
+ xxxx1.store4a((F32*)dst++);
+ }
+}
diff --git a/indra/llmath/llmatrix3a.h b/indra/llmath/llmatrix3a.h
new file mode 100644
index 0000000000..adb7e3389d
--- /dev/null
+++ b/indra/llmath/llmatrix3a.h
@@ -0,0 +1,128 @@
+/**
+ * @file llmatrix3a.h
+ * @brief LLMatrix3a class header file - memory aligned and vectorized 3x3 matrix
+ *
+ * $LicenseInfo:firstyear=2010&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLMATRIX3A_H
+#define LL_LLMATRIX3A_H
+
+/////////////////////////////
+// LLMatrix3a, LLRotation
+/////////////////////////////
+// This class stores a 3x3 (technically 4x3) matrix in column-major order
+/////////////////////////////
+/////////////////////////////
+// These classes are intentionally minimal right now. If you need additional
+// functionality, please contact someone with SSE experience (e.g., Falcon or
+// Huseby).
+/////////////////////////////
+
+// LLMatrix3a is the base class for LLRotation, which should be used instead any time you're dealing with a
+// rotation matrix.
+class LLMatrix3a
+{
+public:
+
+ // Utility function for quickly transforming an array of LLVector4a's
+ // For transforming a single LLVector4a, see LLVector4a::setRotated
+ static void batchTransform( const LLMatrix3a& xform, const LLVector4a* src, int numVectors, LLVector4a* dst );
+
+ // Utility function to obtain the identity matrix
+ static inline const LLMatrix3a& getIdentity();
+
+ //////////////////////////
+ // Ctors
+ //////////////////////////
+
+ // Ctor
+ LLMatrix3a() {}
+
+ // Ctor for setting by columns
+ inline LLMatrix3a( const LLVector4a& c0, const LLVector4a& c1, const LLVector4a& c2 );
+
+ //////////////////////////
+ // Get/Set
+ //////////////////////////
+
+ // Loads from an LLMatrix3
+ inline void loadu(const LLMatrix3& src);
+
+ // Set rows
+ inline void setRows(const LLVector4a& r0, const LLVector4a& r1, const LLVector4a& r2);
+
+ // Set columns
+ inline void setColumns(const LLVector4a& c0, const LLVector4a& c1, const LLVector4a& c2);
+
+ // Get the read-only access to a specified column. Valid columns are 0-2, but the
+ // function is unchecked. You've been warned.
+ inline const LLVector4a& getColumn(const U32 column) const;
+
+ /////////////////////////
+ // Matrix modification
+ /////////////////////////
+
+ // Set this matrix to the product of lhs and rhs ( this = lhs * rhs )
+ void setMul( const LLMatrix3a& lhs, const LLMatrix3a& rhs );
+
+ // Set this matrix to the transpose of src
+ inline void setTranspose(const LLMatrix3a& src);
+
+ // Set this matrix to a*w + b*(1-w)
+ inline void setLerp(const LLMatrix3a& a, const LLMatrix3a& b, F32 w);
+
+ /////////////////////////
+ // Matrix inspection
+ /////////////////////////
+
+ // Sets all 4 elements in 'dest' to the determinant of this matrix.
+ // If you will be using the determinant in subsequent ops with LLVector4a, use this version
+ inline void getDeterminant( LLVector4a& dest ) const;
+
+ // Returns the determinant as an LLSimdScalar. Use this if you will be using the determinant
+ // primary for scalar operations.
+ inline LLSimdScalar getDeterminant() const;
+
+ // Returns nonzero if rows 0-2 and colums 0-2 contain no NaN or INF values. Row 3 is ignored
+ inline LLBool32 isFinite() const;
+
+ // Returns true if this matrix is equal to 'rhs' up to 'tolerance'
+ inline bool isApproximatelyEqual( const LLMatrix3a& rhs, F32 tolerance = F_APPROXIMATELY_ZERO ) const;
+
+protected:
+
+ LLVector4a mColumns[3];
+
+};
+
+class LLRotation : public LLMatrix3a
+{
+public:
+
+ LLRotation() {}
+
+ // Returns true if this rotation is orthonormal with det ~= 1
+ inline bool isOkRotation() const;
+};
+
+#endif
diff --git a/indra/llmath/llmatrix3a.inl b/indra/llmath/llmatrix3a.inl
new file mode 100644
index 0000000000..37819fea3c
--- /dev/null
+++ b/indra/llmath/llmatrix3a.inl
@@ -0,0 +1,119 @@
+/**
+ * @file llmatrix3a.inl
+ * @brief LLMatrix3a inline definitions
+ *
+ * $LicenseInfo:firstyear=2010&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llmatrix3a.h"
+#include "m3math.h"
+
+inline LLMatrix3a::LLMatrix3a( const LLVector4a& c0, const LLVector4a& c1, const LLVector4a& c2 )
+{
+ setColumns( c0, c1, c2 );
+}
+
+inline void LLMatrix3a::loadu(const LLMatrix3& src)
+{
+ mColumns[0].load3(src.mMatrix[0]);
+ mColumns[1].load3(src.mMatrix[1]);
+ mColumns[2].load3(src.mMatrix[2]);
+}
+
+inline void LLMatrix3a::setRows(const LLVector4a& r0, const LLVector4a& r1, const LLVector4a& r2)
+{
+ mColumns[0] = r0;
+ mColumns[1] = r1;
+ mColumns[2] = r2;
+ setTranspose( *this );
+}
+
+inline void LLMatrix3a::setColumns(const LLVector4a& c0, const LLVector4a& c1, const LLVector4a& c2)
+{
+ mColumns[0] = c0;
+ mColumns[1] = c1;
+ mColumns[2] = c2;
+}
+
+inline void LLMatrix3a::setTranspose(const LLMatrix3a& src)
+{
+ const LLQuad srcCol0 = src.mColumns[0];
+ const LLQuad srcCol1 = src.mColumns[1];
+ const LLQuad unpacklo = _mm_unpacklo_ps( srcCol0, srcCol1 );
+ mColumns[0] = _mm_movelh_ps( unpacklo, src.mColumns[2] );
+ mColumns[1] = _mm_shuffle_ps( _mm_movehl_ps( srcCol0, unpacklo ), src.mColumns[2], _MM_SHUFFLE(0, 1, 1, 0) );
+ mColumns[2] = _mm_shuffle_ps( _mm_unpackhi_ps( srcCol0, srcCol1 ), src.mColumns[2], _MM_SHUFFLE(0, 2, 1, 0) );
+}
+
+inline const LLVector4a& LLMatrix3a::getColumn(const U32 column) const
+{
+ llassert( column < 3 );
+ return mColumns[column];
+}
+
+inline void LLMatrix3a::setLerp(const LLMatrix3a& a, const LLMatrix3a& b, F32 w)
+{
+ mColumns[0].setLerp( a.mColumns[0], b.mColumns[0], w );
+ mColumns[1].setLerp( a.mColumns[1], b.mColumns[1], w );
+ mColumns[2].setLerp( a.mColumns[2], b.mColumns[2], w );
+}
+
+inline LLBool32 LLMatrix3a::isFinite() const
+{
+ return mColumns[0].isFinite3() && mColumns[1].isFinite3() && mColumns[2].isFinite3();
+}
+
+inline void LLMatrix3a::getDeterminant( LLVector4a& dest ) const
+{
+ LLVector4a col1xcol2; col1xcol2.setCross3( mColumns[1], mColumns[2] );
+ dest.setAllDot3( col1xcol2, mColumns[0] );
+}
+
+inline LLSimdScalar LLMatrix3a::getDeterminant() const
+{
+ LLVector4a col1xcol2; col1xcol2.setCross3( mColumns[1], mColumns[2] );
+ return col1xcol2.dot3( mColumns[0] );
+}
+
+inline bool LLMatrix3a::isApproximatelyEqual( const LLMatrix3a& rhs, F32 tolerance /*= F_APPROXIMATELY_ZERO*/ ) const
+{
+ return rhs.getColumn(0).equals3(mColumns[0], tolerance)
+ && rhs.getColumn(1).equals3(mColumns[1], tolerance)
+ && rhs.getColumn(2).equals3(mColumns[2], tolerance);
+}
+
+inline const LLMatrix3a& LLMatrix3a::getIdentity()
+{
+ extern const LLMatrix3a LL_M3A_IDENTITY;
+ return LL_M3A_IDENTITY;
+}
+
+inline bool LLRotation::isOkRotation() const
+{
+ LLMatrix3a transpose; transpose.setTranspose( *this );
+ LLMatrix3a product; product.setMul( *this, transpose );
+
+ LLSimdScalar detMinusOne = getDeterminant() - 1.f;
+
+ return product.isApproximatelyEqual( LLMatrix3a::getIdentity() ) && (detMinusOne.getAbs() < F_APPROXIMATELY_ZERO);
+}
+
diff --git a/indra/llmath/llmatrix4a.h b/indra/llmath/llmatrix4a.h
new file mode 100644
index 0000000000..27cf5b79f6
--- /dev/null
+++ b/indra/llmath/llmatrix4a.h
@@ -0,0 +1,143 @@
+/**
+ * @file llmatrix4a.h
+ * @brief LLMatrix4a class header file - memory aligned and vectorized 4x4 matrix
+ *
+ * $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_LLMATRIX4A_H
+#define LL_LLMATRIX4A_H
+
+#include "llvector4a.h"
+#include "m4math.h"
+#include "m3math.h"
+
+class LLMatrix4a
+{
+public:
+ LLVector4a mMatrix[4];
+
+ inline void clear()
+ {
+ mMatrix[0].clear();
+ mMatrix[1].clear();
+ mMatrix[2].clear();
+ mMatrix[3].clear();
+ }
+
+ inline void loadu(const LLMatrix4& src)
+ {
+ mMatrix[0] = _mm_loadu_ps(src.mMatrix[0]);
+ mMatrix[1] = _mm_loadu_ps(src.mMatrix[1]);
+ mMatrix[2] = _mm_loadu_ps(src.mMatrix[2]);
+ mMatrix[3] = _mm_loadu_ps(src.mMatrix[3]);
+
+ }
+
+ inline void loadu(const LLMatrix3& src)
+ {
+ mMatrix[0].load3(src.mMatrix[0]);
+ mMatrix[1].load3(src.mMatrix[1]);
+ mMatrix[2].load3(src.mMatrix[2]);
+ mMatrix[3].set(0,0,0,1.f);
+ }
+
+ inline void add(const LLMatrix4a& rhs)
+ {
+ mMatrix[0].add(rhs.mMatrix[0]);
+ mMatrix[1].add(rhs.mMatrix[1]);
+ mMatrix[2].add(rhs.mMatrix[2]);
+ mMatrix[3].add(rhs.mMatrix[3]);
+ }
+
+ inline void setRows(const LLVector4a& r0, const LLVector4a& r1, const LLVector4a& r2)
+ {
+ mMatrix[0] = r0;
+ mMatrix[1] = r1;
+ mMatrix[2] = r2;
+ }
+
+ inline void setMul(const LLMatrix4a& m, const F32 s)
+ {
+ mMatrix[0].setMul(m.mMatrix[0], s);
+ mMatrix[1].setMul(m.mMatrix[1], s);
+ mMatrix[2].setMul(m.mMatrix[2], s);
+ mMatrix[3].setMul(m.mMatrix[3], s);
+ }
+
+ inline void setLerp(const LLMatrix4a& a, const LLMatrix4a& b, F32 w)
+ {
+ LLVector4a d0,d1,d2,d3;
+ d0.setSub(b.mMatrix[0], a.mMatrix[0]);
+ d1.setSub(b.mMatrix[1], a.mMatrix[1]);
+ d2.setSub(b.mMatrix[2], a.mMatrix[2]);
+ d3.setSub(b.mMatrix[3], a.mMatrix[3]);
+
+ // this = a + d*w
+
+ d0.mul(w);
+ d1.mul(w);
+ d2.mul(w);
+ d3.mul(w);
+
+ mMatrix[0].setAdd(a.mMatrix[0],d0);
+ mMatrix[1].setAdd(a.mMatrix[1],d1);
+ mMatrix[2].setAdd(a.mMatrix[2],d2);
+ mMatrix[3].setAdd(a.mMatrix[3],d3);
+ }
+
+ inline void rotate(const LLVector4a& v, LLVector4a& res)
+ {
+ res = _mm_shuffle_ps(v, v, _MM_SHUFFLE(0, 0, 0, 0));
+ res.mul(mMatrix[0]);
+
+ LLVector4a y;
+ y = _mm_shuffle_ps(v, v, _MM_SHUFFLE(1, 1, 1, 1));
+ y.mul(mMatrix[1]);
+
+ LLVector4a z;
+ z = _mm_shuffle_ps(v, v, _MM_SHUFFLE(2, 2, 2, 2));
+ z.mul(mMatrix[2]);
+
+ res.add(y);
+ res.add(z);
+ }
+
+ inline void affineTransform(const LLVector4a& v, LLVector4a& res)
+ {
+ LLVector4a x,y,z;
+
+ x = _mm_shuffle_ps(v, v, _MM_SHUFFLE(0, 0, 0, 0));
+ y = _mm_shuffle_ps(v, v, _MM_SHUFFLE(1, 1, 1, 1));
+ z = _mm_shuffle_ps(v, v, _MM_SHUFFLE(2, 2, 2, 2));
+
+ x.mul(mMatrix[0]);
+ y.mul(mMatrix[1]);
+ z.mul(mMatrix[2]);
+
+ x.add(y);
+ z.add(mMatrix[3]);
+ res.setAdd(x,z);
+ }
+};
+
+#endif
diff --git a/indra/llmath/lloctree.h b/indra/llmath/lloctree.h
index 90d4d742c9..fdfc24f8b7 100644
--- a/indra/llmath/lloctree.h
+++ b/indra/llmath/lloctree.h
@@ -29,14 +29,11 @@
#include "lltreenode.h"
#include "v3math.h"
+#include "llvector4a.h"
#include <vector>
#include <set>
-#if LL_RELEASE_WITH_DEBUG_INFO || LL_DEBUG
-#define OCT_ERRS LL_ERRS("OctreeErrors")
-#else
#define OCT_ERRS LL_WARNS("OctreeErrors")
-#endif
#define LL_OCTREE_PARANOIA_CHECK 0
#if LL_DARWIN
@@ -67,6 +64,13 @@ public:
};
template <class T>
+class LLOctreeTravelerDepthFirst : public LLOctreeTraveler<T>
+{
+public:
+ virtual void traverse(const LLOctreeNode<T>* node);
+};
+
+template <class T>
class LLOctreeNode : public LLTreeNode<T>
{
public:
@@ -81,23 +85,30 @@ public:
typedef LLOctreeNode<T> oct_node;
typedef LLOctreeListener<T> oct_listener;
- static const U8 OCTANT_POSITIVE_X = 0x01;
- static const U8 OCTANT_POSITIVE_Y = 0x02;
- static const U8 OCTANT_POSITIVE_Z = 0x04;
-
- LLOctreeNode( LLVector3d center,
- LLVector3d size,
+ /*void* operator new(size_t size)
+ {
+ return ll_aligned_malloc_16(size);
+ }
+
+ void operator delete(void* ptr)
+ {
+ ll_aligned_free_16(ptr);
+ }*/
+
+ LLOctreeNode( const LLVector4a& center,
+ const LLVector4a& size,
BaseType* parent,
U8 octant = 255)
: mParent((oct_node*)parent),
- mCenter(center),
- mSize(size),
mOctant(octant)
{
+ mCenter = center;
+ mSize = size;
+
updateMinMax();
if ((mOctant == 255) && mParent)
{
- mOctant = ((oct_node*) mParent)->getOctant(mCenter.mdV);
+ mOctant = ((oct_node*) mParent)->getOctant(mCenter);
}
clearChildren();
@@ -114,40 +125,24 @@ public:
}
inline const BaseType* getParent() const { return mParent; }
- inline void setParent(BaseType* parent) { mParent = (oct_node*) parent; }
- inline const LLVector3d& getCenter() const { return mCenter; }
- inline const LLVector3d& getSize() const { return mSize; }
- inline void setCenter(LLVector3d center) { mCenter = center; }
- inline void setSize(LLVector3d size) { mSize = size; }
- inline oct_node* getNodeAt(T* data) { return getNodeAt(data->getPositionGroup(), data->getBinRadius()); }
- inline U8 getOctant() const { return mOctant; }
- inline void setOctant(U8 octant) { mOctant = octant; }
+ inline void setParent(BaseType* parent) { mParent = (oct_node*) parent; }
+ inline const LLVector4a& getCenter() const { return mCenter; }
+ inline const LLVector4a& getSize() const { return mSize; }
+ inline void setCenter(const LLVector4a& center) { mCenter = center; }
+ inline void setSize(const LLVector4a& size) { mSize = size; }
+ inline oct_node* getNodeAt(T* data) { return getNodeAt(data->getPositionGroup(), data->getBinRadius()); }
+ inline U8 getOctant() const { return mOctant; }
inline const oct_node* getOctParent() const { return (const oct_node*) getParent(); }
inline oct_node* getOctParent() { return (oct_node*) getParent(); }
- U8 getOctant(const F64 pos[]) const //get the octant pos is in
+ U8 getOctant(const LLVector4a& pos) const //get the octant pos is in
{
- U8 ret = 0;
-
- if (pos[0] > mCenter.mdV[0])
- {
- ret |= OCTANT_POSITIVE_X;
- }
- if (pos[1] > mCenter.mdV[1])
- {
- ret |= OCTANT_POSITIVE_Y;
- }
- if (pos[2] > mCenter.mdV[2])
- {
- ret |= OCTANT_POSITIVE_Z;
- }
-
- return ret;
+ return (U8) (pos.greaterThan(mCenter).getGatheredBits() & 0x7);
}
- inline bool isInside(const LLVector3d& pos, const F64& rad) const
+ inline bool isInside(const LLVector4a& pos, const F32& rad) const
{
- return rad <= mSize.mdV[0]*2.0 && isInside(pos);
+ return rad <= mSize[0]*2.f && isInside(pos);
}
inline bool isInside(T* data) const
@@ -155,29 +150,27 @@ public:
return isInside(data->getPositionGroup(), data->getBinRadius());
}
- bool isInside(const LLVector3d& pos) const
+ bool isInside(const LLVector4a& pos) const
{
- const F64& x = pos.mdV[0];
- const F64& y = pos.mdV[1];
- const F64& z = pos.mdV[2];
-
- if (x > mMax.mdV[0] || x <= mMin.mdV[0] ||
- y > mMax.mdV[1] || y <= mMin.mdV[1] ||
- z > mMax.mdV[2] || z <= mMin.mdV[2])
+ S32 gt = pos.greaterThan(mMax).getGatheredBits() & 0x7;
+ if (gt)
{
return false;
}
-
+
+ S32 lt = pos.lessEqual(mMin).getGatheredBits() & 0x7;
+ if (lt)
+ {
+ return false;
+ }
+
return true;
}
void updateMinMax()
{
- for (U32 i = 0; i < 3; i++)
- {
- mMax.mdV[i] = mCenter.mdV[i] + mSize.mdV[i];
- mMin.mdV[i] = mCenter.mdV[i] - mSize.mdV[i];
- }
+ mMax.setAdd(mCenter, mSize);
+ mMin.setSub(mCenter, mSize);
}
inline oct_listener* getOctListener(U32 index)
@@ -190,34 +183,34 @@ public:
return contains(xform->getBinRadius());
}
- bool contains(F64 radius)
+ bool contains(F32 radius)
{
if (mParent == NULL)
{ //root node contains nothing
return false;
}
- F64 size = mSize.mdV[0];
- F64 p_size = size * 2.0;
+ F32 size = mSize[0];
+ F32 p_size = size * 2.f;
- return (radius <= 0.001 && size <= 0.001) ||
+ return (radius <= 0.001f && size <= 0.001f) ||
(radius <= p_size && radius > size);
}
- static void pushCenter(LLVector3d &center, const LLVector3d &size, const T* data)
+ static void pushCenter(LLVector4a &center, const LLVector4a &size, const T* data)
{
- const LLVector3d& pos = data->getPositionGroup();
- for (U32 i = 0; i < 3; i++)
- {
- if (pos.mdV[i] > center.mdV[i])
- {
- center.mdV[i] += size.mdV[i];
- }
- else
- {
- center.mdV[i] -= size.mdV[i];
- }
- }
+ const LLVector4a& pos = data->getPositionGroup();
+
+ LLVector4Logical gt = pos.greaterThan(center);
+
+ LLVector4a up;
+ up = _mm_and_ps(size, gt);
+
+ LLVector4a down;
+ down = _mm_andnot_ps(gt, size);
+
+ center.add(up);
+ center.sub(down);
}
void accept(oct_traveler* visitor) { visitor->visit(this); }
@@ -236,32 +229,49 @@ public:
void accept(tree_traveler* visitor) const { visitor->visit(this); }
void accept(oct_traveler* visitor) const { visitor->visit(this); }
- oct_node* getNodeAt(const LLVector3d& pos, const F64& rad)
+ void validateChildMap()
+ {
+ for (U32 i = 0; i < 8; i++)
+ {
+ U8 idx = mChildMap[i];
+ if (idx != 255)
+ {
+ LLOctreeNode<T>* child = mChild[idx];
+
+ if (child->getOctant() != i)
+ {
+ llerrs << "Invalid child map, bad octant data." << llendl;
+ }
+
+ if (getOctant(child->getCenter()) != child->getOctant())
+ {
+ llerrs << "Invalid child octant compared to position data." << llendl;
+ }
+ }
+ }
+ }
+
+
+ oct_node* getNodeAt(const LLVector4a& pos, const F32& rad)
{
LLOctreeNode<T>* node = this;
if (node->isInside(pos, rad))
{
//do a quick search by octant
- U8 octant = node->getOctant(pos.mdV);
- BOOL keep_going = TRUE;
-
+ U8 octant = node->getOctant(pos);
+
//traverse the tree until we find a node that has no node
//at the appropriate octant or is smaller than the object.
//by definition, that node is the smallest node that contains
// the data
- while (keep_going && node->getSize().mdV[0] >= rad)
+ U8 next_node = node->mChildMap[octant];
+
+ while (next_node != 255 && node->getSize()[0] >= rad)
{
- keep_going = FALSE;
- for (U32 i = 0; i < node->getChildCount() && !keep_going; i++)
- {
- if (node->getChild(i)->getOctant() == octant)
- {
- node = node->getChild(i);
- octant = node->getOctant(pos.mdV);
- keep_going = TRUE;
- }
- }
+ node = node->getChild(next_node);
+ octant = node->getOctant(pos);
+ next_node = node->mChildMap[octant];
}
}
else if (!node->contains(rad) && node->getParent())
@@ -276,7 +286,7 @@ public:
{
if (data == NULL)
{
- //OCT_ERRS << "!!! INVALID ELEMENT ADDED TO OCTREE BRANCH !!!" << llendl;
+ OCT_ERRS << "!!! INVALID ELEMENT ADDED TO OCTREE BRANCH !!!" << llendl;
return false;
}
LLOctreeNode<T>* parent = getOctParent();
@@ -284,10 +294,8 @@ public:
//is it here?
if (isInside(data->getPositionGroup()))
{
- if (getElementCount() < LL_OCTREE_MAX_CAPACITY &&
- (contains(data->getBinRadius()) ||
- (data->getBinRadius() > getSize().mdV[0] &&
- parent && parent->getElementCount() >= LL_OCTREE_MAX_CAPACITY)))
+ if ((getElementCount() < LL_OCTREE_MAX_CAPACITY && contains(data->getBinRadius()) ||
+ (data->getBinRadius() > getSize()[0] && parent && parent->getElementCount() >= LL_OCTREE_MAX_CAPACITY)))
{ //it belongs here
#if LL_OCTREE_PARANOIA_CHECK
//if this is a redundant insertion, error out (should never happen)
@@ -317,16 +325,21 @@ public:
}
//it's here, but no kids are in the right place, make a new kid
- LLVector3d center(getCenter());
- LLVector3d size(getSize()*0.5);
+ LLVector4a center = getCenter();
+ LLVector4a size = getSize();
+ size.mul(0.5f);
//push center in direction of data
LLOctreeNode<T>::pushCenter(center, size, data);
// handle case where floating point number gets too small
- if( llabs(center.mdV[0] - getCenter().mdV[0]) < F_APPROXIMATELY_ZERO &&
- llabs(center.mdV[1] - getCenter().mdV[1]) < F_APPROXIMATELY_ZERO &&
- llabs(center.mdV[2] - getCenter().mdV[2]) < F_APPROXIMATELY_ZERO)
+ LLVector4a val;
+ val.setSub(center, getCenter());
+ val.setAbs(val);
+
+ S32 lt = val.lessThan(LLVector4a::getEpsilon()).getGatheredBits() & 0x7;
+
+ if( lt == 0x7 )
{
mData.insert(data);
BaseType::insert(data);
@@ -344,7 +357,7 @@ public:
//make sure no existing node matches this position
for (U32 i = 0; i < getChildCount(); i++)
{
- if (mChild[i]->getCenter() == center)
+ if (mChild[i]->getCenter().equals3(center))
{
OCT_ERRS << "Octree detected duplicate child center and gave up." << llendl;
return false;
@@ -362,7 +375,7 @@ public:
else
{
//it's not in here, give it to the root
- //OCT_ERRS << "Octree insertion failed, starting over from root!" << llendl;
+ OCT_ERRS << "Octree insertion failed, starting over from root!" << llendl;
oct_node* node = this;
@@ -436,6 +449,9 @@ public:
void clearChildren()
{
mChild.clear();
+
+ U32* foo = (U32*) mChildMap;
+ foo[0] = foo[1] = 0xFFFFFFFF;
}
void validate()
@@ -469,13 +485,19 @@ public:
void addChild(oct_node* child, BOOL silent = FALSE)
{
#if LL_OCTREE_PARANOIA_CHECK
+
+ if (child->getSize().equals3(getSize()))
+ {
+ OCT_ERRS << "Child size is same as parent size!" << llendl;
+ }
+
for (U32 i = 0; i < getChildCount(); i++)
{
- if(mChild[i]->getSize() != child->getSize())
+ if(!mChild[i]->getSize().equals3(child->getSize()))
{
OCT_ERRS <<"Invalid octree child size." << llendl;
}
- if (mChild[i]->getCenter() == child->getCenter())
+ if (mChild[i]->getCenter().equals3(child->getCenter()))
{
OCT_ERRS <<"Duplicate octree child position." << llendl;
}
@@ -487,6 +509,8 @@ public:
}
#endif
+ mChildMap[child->getOctant()] = (U8) mChild.size();
+
mChild.push_back(child);
child->setParent(this);
@@ -500,7 +524,7 @@ public:
}
}
- void removeChild(U8 index, BOOL destroy = FALSE)
+ void removeChild(S32 index, BOOL destroy = FALSE)
{
for (U32 i = 0; i < this->getListenerCount(); i++)
{
@@ -508,6 +532,8 @@ public:
listener->handleChildRemoval(this, getChild(index));
}
+
+
if (destroy)
{
mChild[index]->destroy();
@@ -515,6 +541,15 @@ public:
}
mChild.erase(mChild.begin() + index);
+ //rebuild child map
+ U32* foo = (U32*) mChildMap;
+ foo[0] = foo[1] = 0xFFFFFFFF;
+
+ for (U32 i = 0; i < mChild.size(); ++i)
+ {
+ mChildMap[mChild[i]->getOctant()] = i;
+ }
+
checkAlive();
}
@@ -541,19 +576,32 @@ public:
}
}
- //OCT_ERRS << "Octree failed to delete requested child." << llendl;
+ OCT_ERRS << "Octree failed to delete requested child." << llendl;
}
protected:
- child_list mChild;
- element_list mData;
+ typedef enum
+ {
+ CENTER = 0,
+ SIZE = 1,
+ MAX = 2,
+ MIN = 3
+ } eDName;
+
+ LLVector4a mCenter;
+ LLVector4a mSize;
+ LLVector4a mMax;
+ LLVector4a mMin;
+
oct_node* mParent;
- LLVector3d mCenter;
- LLVector3d mSize;
- LLVector3d mMax;
- LLVector3d mMin;
U8 mOctant;
-};
+
+ child_list mChild;
+ U8 mChildMap[8];
+
+ element_list mData;
+
+};
//just like a regular node, except it might expand on insert and compress on balance
template <class T>
@@ -563,9 +611,9 @@ public:
typedef LLOctreeNode<T> BaseType;
typedef LLOctreeNode<T> oct_node;
- LLOctreeRoot( LLVector3d center,
- LLVector3d size,
- BaseType* parent)
+ LLOctreeRoot(const LLVector4a& center,
+ const LLVector4a& size,
+ BaseType* parent)
: BaseType(center, size, parent)
{
}
@@ -596,6 +644,8 @@ public:
//destroy child
child->clearChildren();
delete child;
+
+ return false;
}
return true;
@@ -606,28 +656,33 @@ public:
{
if (data == NULL)
{
- //OCT_ERRS << "!!! INVALID ELEMENT ADDED TO OCTREE ROOT !!!" << llendl;
+ OCT_ERRS << "!!! INVALID ELEMENT ADDED TO OCTREE ROOT !!!" << llendl;
return false;
}
if (data->getBinRadius() > 4096.0)
{
- //OCT_ERRS << "!!! ELEMENT EXCEEDS MAXIMUM SIZE IN OCTREE ROOT !!!" << llendl;
+ OCT_ERRS << "!!! ELEMENT EXCEEDS MAXIMUM SIZE IN OCTREE ROOT !!!" << llendl;
return false;
}
- const F64 MAX_MAG = 1024.0*1024.0;
+ LLVector4a MAX_MAG;
+ MAX_MAG.splat(1024.f*1024.f);
- const LLVector3d& v = data->getPositionGroup();
- if (!(fabs(v.mdV[0]-this->mCenter.mdV[0]) < MAX_MAG &&
- fabs(v.mdV[1]-this->mCenter.mdV[1]) < MAX_MAG &&
- fabs(v.mdV[2]-this->mCenter.mdV[2]) < MAX_MAG))
+ const LLVector4a& v = data->getPositionGroup();
+
+ LLVector4a val;
+ val.setSub(v, BaseType::mCenter);
+ val.setAbs(val);
+ S32 lt = val.lessThan(MAX_MAG).getGatheredBits() & 0x7;
+
+ if (lt != 0x7)
{
- //OCT_ERRS << "!!! ELEMENT EXCEEDS RANGE OF SPATIAL PARTITION !!!" << llendl;
+ OCT_ERRS << "!!! ELEMENT EXCEEDS RANGE OF SPATIAL PARTITION !!!" << llendl;
return false;
}
- if (this->getSize().mdV[0] > data->getBinRadius() && isInside(data->getPositionGroup()))
+ if (this->getSize()[0] > data->getBinRadius() && isInside(data->getPositionGroup()))
{
//we got it, just act like a branch
oct_node* node = getNodeAt(data);
@@ -643,31 +698,34 @@ public:
else if (this->getChildCount() == 0)
{
//first object being added, just wrap it up
- while (!(this->getSize().mdV[0] > data->getBinRadius() && isInside(data->getPositionGroup())))
+ while (!(this->getSize()[0] > data->getBinRadius() && isInside(data->getPositionGroup())))
{
- LLVector3d center, size;
+ LLVector4a center, size;
center = this->getCenter();
size = this->getSize();
LLOctreeNode<T>::pushCenter(center, size, data);
this->setCenter(center);
- this->setSize(size*2);
+ size.mul(2.f);
+ this->setSize(size);
this->updateMinMax();
}
LLOctreeNode<T>::insert(data);
}
else
{
- while (!(this->getSize().mdV[0] > data->getBinRadius() && isInside(data->getPositionGroup())))
+ while (!(this->getSize()[0] > data->getBinRadius() && isInside(data->getPositionGroup())))
{
//the data is outside the root node, we need to grow
- LLVector3d center(this->getCenter());
- LLVector3d size(this->getSize());
+ LLVector4a center(this->getCenter());
+ LLVector4a size(this->getSize());
//expand this node
- LLVector3d newcenter(center);
+ LLVector4a newcenter(center);
LLOctreeNode<T>::pushCenter(newcenter, size, data);
this->setCenter(newcenter);
- this->setSize(size*2);
+ LLVector4a size2 = size;
+ size2.mul(2.f);
+ this->setSize(size2);
this->updateMinMax();
//copy our children to a new branch
@@ -704,4 +762,15 @@ void LLOctreeTraveler<T>::traverse(const LLOctreeNode<T>* node)
traverse(node->getChild(i));
}
}
+
+template <class T>
+void LLOctreeTravelerDepthFirst<T>::traverse(const LLOctreeNode<T>* node)
+{
+ for (U32 i = 0; i < node->getChildCount(); i++)
+ {
+ traverse(node->getChild(i));
+ }
+ node->accept(this);
+}
+
#endif
diff --git a/indra/llmath/llplane.h b/indra/llmath/llplane.h
index 443f3f46b9..a611894721 100644
--- a/indra/llmath/llplane.h
+++ b/indra/llmath/llplane.h
@@ -36,19 +36,23 @@
// The plane normal = [A, B, C]
// The closest approach = D / sqrt(A*A + B*B + C*C)
-class LLPlane : public LLVector4
+class LLPlane
{
public:
+
+ // Constructors
LLPlane() {}; // no default constructor
LLPlane(const LLVector3 &p0, F32 d) { setVec(p0, d); }
LLPlane(const LLVector3 &p0, const LLVector3 &n) { setVec(p0, n); }
- void setVec(const LLVector3 &p0, F32 d) { LLVector4::setVec(p0[0], p0[1], p0[2], d); }
- void setVec(const LLVector3 &p0, const LLVector3 &n)
+ inline void setVec(const LLVector3 &p0, F32 d) { mV.set(p0[0], p0[1], p0[2], d); }
+
+ // Set
+ inline void setVec(const LLVector3 &p0, const LLVector3 &n)
{
F32 d = -(p0 * n);
setVec(n, d);
}
- void setVec(const LLVector3 &p0, const LLVector3 &p1, const LLVector3 &p2)
+ inline void setVec(const LLVector3 &p0, const LLVector3 &p1, const LLVector3 &p2)
{
LLVector3 u, v, w;
u = p1 - p0;
@@ -58,8 +62,38 @@ public:
F32 d = -(w * p0);
setVec(w, d);
}
- LLPlane& operator=(const LLVector4& v2) { LLVector4::setVec(v2[0],v2[1],v2[2],v2[3]); return *this;}
+
+ inline LLPlane& operator=(const LLVector4& v2) { mV.set(v2[0],v2[1],v2[2],v2[3]); return *this;}
+
+ inline LLPlane& operator=(const LLVector4a& v2) { mV.set(v2[0],v2[1],v2[2],v2[3]); return *this;}
+
+ inline void set(const LLPlane& p2) { mV = p2.mV; }
+
+ //
F32 dist(const LLVector3 &v2) const { return mV[0]*v2[0] + mV[1]*v2[1] + mV[2]*v2[2] + mV[3]; }
+
+ inline LLSimdScalar dot3(const LLVector4a& b) const { return mV.dot3(b); }
+
+ // Read-only access a single float in this vector. Do not use in proximity to any function call that manipulates
+ // the data at the whole vector level or you will incur a substantial penalty. Consider using the splat functions instead
+ inline F32 operator[](const S32 idx) const { return mV[idx]; }
+
+ // preferable when index is known at compile time
+ template <int N> LL_FORCE_INLINE void getAt(LLSimdScalar& v) const { v = mV.getScalarAt<N>(); }
+
+ // reset the vector to 0, 0, 0, 1
+ inline void clear() { mV.set(0, 0, 0, 1); }
+
+ inline void getVector3(LLVector3& vec) const { vec.set(mV[0], mV[1], mV[2]); }
+
+ // Retrieve the mask indicating which of the x, y, or z axis are greater or equal to zero.
+ inline U8 calcPlaneMask()
+ {
+ return mV.greaterEqual(LLVector4a::getZero()).getGatheredBits() & LLVector4Logical::MASK_XYZ;
+ }
+
+private:
+ LLVector4a mV;
};
diff --git a/indra/llmath/llquantize.h b/indra/llmath/llquantize.h
index 7f56ff3448..1595dbecf8 100644
--- a/indra/llmath/llquantize.h
+++ b/indra/llmath/llquantize.h
@@ -29,10 +29,16 @@
#define LL_LLQUANTIZE_H
const U16 U16MAX = 65535;
+LL_ALIGN_16( const F32 F_U16MAX_4A[4] ) = { 65535.f, 65535.f, 65535.f, 65535.f };
+
const F32 OOU16MAX = 1.f/(F32)(U16MAX);
+LL_ALIGN_16( const F32 F_OOU16MAX_4A[4] ) = { OOU16MAX, OOU16MAX, OOU16MAX, OOU16MAX };
const U8 U8MAX = 255;
+LL_ALIGN_16( const F32 F_U8MAX_4A[4] ) = { 255.f, 255.f, 255.f, 255.f };
+
const F32 OOU8MAX = 1.f/(F32)(U8MAX);
+LL_ALIGN_16( const F32 F_OOU8MAX_4A[4] ) = { OOU8MAX, OOU8MAX, OOU8MAX, OOU8MAX };
const U8 FIRSTVALIDCHAR = 54;
const U8 MAXSTRINGVAL = U8MAX - FIRSTVALIDCHAR; //we don't allow newline or null
diff --git a/indra/llmath/llquaternion.cpp b/indra/llmath/llquaternion.cpp
index a51f11072c..7381d5eb99 100644
--- a/indra/llmath/llquaternion.cpp
+++ b/indra/llmath/llquaternion.cpp
@@ -26,9 +26,10 @@
#include "linden_common.h"
+#include "llmath.h" // for F_PI
+
#include "llquaternion.h"
-#include "llmath.h" // for F_PI
//#include "vmath.h"
#include "v3math.h"
#include "v3dmath.h"
diff --git a/indra/llmath/llquaternion.h b/indra/llmath/llquaternion.h
index 26da14ae20..ca0dfe206b 100644
--- a/indra/llmath/llquaternion.h
+++ b/indra/llmath/llquaternion.h
@@ -27,7 +27,11 @@
#ifndef LLQUATERNION_H
#define LLQUATERNION_H
-#include "llmath.h"
+#include <iostream>
+
+#ifndef LLMATH_H //enforce specific include order to avoid tangling inline dependencies
+#error "Please include llmath.h first."
+#endif
class LLVector4;
class LLVector3;
diff --git a/indra/llmath/llquaternion2.h b/indra/llmath/llquaternion2.h
new file mode 100644
index 0000000000..fd9c0cf3ab
--- /dev/null
+++ b/indra/llmath/llquaternion2.h
@@ -0,0 +1,105 @@
+/**
+ * @file llquaternion2.h
+ * @brief LLQuaternion2 class header file - SIMD-enabled quaternion class
+ *
+ * $LicenseInfo:firstyear=2010&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_QUATERNION2_H
+#define LL_QUATERNION2_H
+
+/////////////////////////////
+// LLQuaternion2
+/////////////////////////////
+// This class stores a quaternion x*i + y*j + z*k + w in <x, y, z, w> order
+// (i.e., w in high order element of vector)
+/////////////////////////////
+/////////////////////////////
+// These classes are intentionally minimal right now. If you need additional
+// functionality, please contact someone with SSE experience (e.g., Falcon or
+// Huseby).
+/////////////////////////////
+#include "llquaternion.h"
+
+class LLQuaternion2
+{
+public:
+
+ //////////////////////////
+ // Ctors
+ //////////////////////////
+
+ // Ctor
+ LLQuaternion2() {}
+
+ // Ctor from LLQuaternion
+ explicit LLQuaternion2( const class LLQuaternion& quat );
+
+ //////////////////////////
+ // Get/Set
+ //////////////////////////
+
+ // Load from an LLQuaternion
+ inline void operator=( const LLQuaternion& quat )
+ {
+ mQ.loadua( quat.mQ );
+ }
+
+ // Return the internal LLVector4a representation of the quaternion
+ inline const LLVector4a& getVector4a() const;
+ inline LLVector4a& getVector4aRw();
+
+ /////////////////////////
+ // Quaternion modification
+ /////////////////////////
+
+ // Set this quaternion to the conjugate of src
+ inline void setConjugate(const LLQuaternion2& src);
+
+ // Renormalizes the quaternion. Assumes it has nonzero length.
+ inline void normalize();
+
+ // Quantize this quaternion to 8 bit precision
+ inline void quantize8();
+
+ // Quantize this quaternion to 16 bit precision
+ inline void quantize16();
+
+ /////////////////////////
+ // Quaternion inspection
+ /////////////////////////
+
+ // Return true if this quaternion is equal to 'rhs'.
+ // Note! Quaternions exhibit "double-cover", so any rotation has two equally valid
+ // quaternion representations and they will NOT compare equal.
+ inline bool equals(const LLQuaternion2& rhs, F32 tolerance = F_APPROXIMATELY_ZERO ) const;
+
+ // Return true if all components are finite and the quaternion is normalized
+ inline bool isOkRotation() const;
+
+protected:
+
+ LLVector4a mQ;
+
+};
+
+#endif
diff --git a/indra/llmath/llquaternion2.inl b/indra/llmath/llquaternion2.inl
new file mode 100644
index 0000000000..2a6987552d
--- /dev/null
+++ b/indra/llmath/llquaternion2.inl
@@ -0,0 +1,102 @@
+/**
+ * @file llquaternion2.inl
+ * @brief LLQuaternion2 inline definitions
+ *
+ * $LicenseInfo:firstyear=2010&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llquaternion2.h"
+
+static const LLQuad LL_V4A_PLUS_ONE = {1.f, 1.f, 1.f, 1.f};
+static const LLQuad LL_V4A_MINUS_ONE = {-1.f, -1.f, -1.f, -1.f};
+
+// Ctor from LLQuaternion
+inline LLQuaternion2::LLQuaternion2( const LLQuaternion& quat )
+{
+ mQ.set(quat.mQ[VX], quat.mQ[VY], quat.mQ[VZ], quat.mQ[VW]);
+}
+
+//////////////////////////
+// Get/Set
+//////////////////////////
+
+// Return the internal LLVector4a representation of the quaternion
+inline const LLVector4a& LLQuaternion2::getVector4a() const
+{
+ return mQ;
+}
+
+inline LLVector4a& LLQuaternion2::getVector4aRw()
+{
+ return mQ;
+}
+
+/////////////////////////
+// Quaternion modification
+/////////////////////////
+
+// Set this quaternion to the conjugate of src
+inline void LLQuaternion2::setConjugate(const LLQuaternion2& src)
+{
+ static LL_ALIGN_16( const U32 F_QUAT_INV_MASK_4A[4] ) = { 0x80000000, 0x80000000, 0x80000000, 0x00000000 };
+ mQ = _mm_xor_ps(src.mQ, *reinterpret_cast<const LLQuad*>(&F_QUAT_INV_MASK_4A));
+}
+
+// Renormalizes the quaternion. Assumes it has nonzero length.
+inline void LLQuaternion2::normalize()
+{
+ mQ.normalize4();
+}
+
+// Quantize this quaternion to 8 bit precision
+inline void LLQuaternion2::quantize8()
+{
+ mQ.quantize8( LL_V4A_MINUS_ONE, LL_V4A_PLUS_ONE );
+ normalize();
+}
+
+// Quantize this quaternion to 16 bit precision
+inline void LLQuaternion2::quantize16()
+{
+ mQ.quantize16( LL_V4A_MINUS_ONE, LL_V4A_PLUS_ONE );
+ normalize();
+}
+
+
+/////////////////////////
+// Quaternion inspection
+/////////////////////////
+
+// Return true if this quaternion is equal to 'rhs'.
+// Note! Quaternions exhibit "double-cover", so any rotation has two equally valid
+// quaternion representations and they will NOT compare equal.
+inline bool LLQuaternion2::equals(const LLQuaternion2 &rhs, F32 tolerance/* = F_APPROXIMATELY_ZERO*/) const
+{
+ return mQ.equals4(rhs.mQ, tolerance);
+}
+
+// Return true if all components are finite and the quaternion is normalized
+inline bool LLQuaternion2::isOkRotation() const
+{
+ return mQ.isFinite4() && mQ.isNormalized4();
+}
+
diff --git a/indra/llmath/llsimdmath.h b/indra/llmath/llsimdmath.h
new file mode 100644
index 0000000000..c7cdf7b32c
--- /dev/null
+++ b/indra/llmath/llsimdmath.h
@@ -0,0 +1,93 @@
+/**
+ * @file llsimdmath.h
+ * @brief Common header for SIMD-based math library (llvector4a, llmatrix3a, etc.)
+ *
+ * $LicenseInfo:firstyear=2010&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_SIMD_MATH_H
+#define LL_SIMD_MATH_H
+
+#ifndef LLMATH_H
+#error "Please include llmath.h before this file."
+#endif
+
+#if ( ( LL_DARWIN || LL_LINUX ) && !(__SSE2__) ) || ( LL_WINDOWS && ( _M_IX86_FP < 2 ) )
+#error SSE2 not enabled. LLVector4a and related class will not compile.
+#endif
+
+#if !LL_WINDOWS
+#include <stdint.h>
+#endif
+
+template <typename T> T* LL_NEXT_ALIGNED_ADDRESS(T* address)
+{
+ return reinterpret_cast<T*>(
+ (reinterpret_cast<uintptr_t>(address) + 0xF) & ~0xF);
+}
+
+template <typename T> T* LL_NEXT_ALIGNED_ADDRESS_64(T* address)
+{
+ return reinterpret_cast<T*>(
+ (reinterpret_cast<uintptr_t>(address) + 0x3F) & ~0x3F);
+}
+
+#if LL_LINUX || LL_DARWIN
+
+#define LL_ALIGN_PREFIX(x)
+#define LL_ALIGN_POSTFIX(x) __attribute__((aligned(x)))
+
+#elif LL_WINDOWS
+
+#define LL_ALIGN_PREFIX(x) __declspec(align(x))
+#define LL_ALIGN_POSTFIX(x)
+
+#else
+#error "LL_ALIGN_PREFIX and LL_ALIGN_POSTFIX undefined"
+#endif
+
+#define LL_ALIGN_16(var) LL_ALIGN_PREFIX(16) var LL_ALIGN_POSTFIX(16)
+
+
+
+#include <xmmintrin.h>
+#include <emmintrin.h>
+
+#include "llsimdtypes.h"
+#include "llsimdtypes.inl"
+
+class LLMatrix3a;
+class LLRotation;
+class LLMatrix3;
+
+#include "llquaternion.h"
+
+#include "llvector4logical.h"
+#include "llvector4a.h"
+#include "llmatrix3a.h"
+#include "llquaternion2.h"
+#include "llvector4a.inl"
+#include "llmatrix3a.inl"
+#include "llquaternion2.inl"
+
+
+#endif //LL_SIMD_MATH_H
diff --git a/indra/llmath/llsimdtypes.h b/indra/llmath/llsimdtypes.h
new file mode 100644
index 0000000000..bd991d0e71
--- /dev/null
+++ b/indra/llmath/llsimdtypes.h
@@ -0,0 +1,124 @@
+/**
+ * @file llsimdtypes.h
+ * @brief Declaration of basic SIMD math related types
+ *
+ * $LicenseInfo:firstyear=2010&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_SIMD_TYPES_H
+#define LL_SIMD_TYPES_H
+
+#ifndef LL_SIMD_MATH_H
+#error "Please include llmath.h before this file."
+#endif
+
+typedef __m128 LLQuad;
+
+
+#if LL_WINDOWS
+#pragma warning(push)
+#pragma warning( disable : 4800 3 ) // Disable warning about casting int to bool for this class.
+#if defined(_MSC_VER) && (_MSC_VER < 1500)
+// VC++ 2005 is missing these intrinsics
+// __forceinline is MSVC specific and attempts to override compiler inlining judgment. This is so
+// even in debug builds this call is a NOP.
+__forceinline const __m128 _mm_castsi128_ps( const __m128i a ) { return reinterpret_cast<const __m128&>(a); }
+__forceinline const __m128i _mm_castps_si128( const __m128 a ) { return reinterpret_cast<const __m128i&>(a); }
+#endif // _MSC_VER
+
+#endif // LL_WINDOWS
+
+class LLBool32
+{
+public:
+ inline LLBool32() {}
+ inline LLBool32(int rhs) : m_bool(rhs) {}
+ inline LLBool32(unsigned int rhs) : m_bool(rhs) {}
+ inline LLBool32(bool rhs) { m_bool = static_cast<const int>(rhs); }
+ inline LLBool32& operator= (bool rhs) { m_bool = (int)rhs; return *this; }
+ inline bool operator== (bool rhs) const { return static_cast<const bool&>(m_bool) == rhs; }
+ inline bool operator!= (bool rhs) const { return !operator==(rhs); }
+ inline operator bool() const { return static_cast<const bool&>(m_bool); }
+
+private:
+ int m_bool;
+};
+
+#if LL_WINDOWS
+#pragma warning(pop)
+#endif
+
+class LLSimdScalar
+{
+public:
+ inline LLSimdScalar() {}
+ inline LLSimdScalar(LLQuad q)
+ {
+ mQ = q;
+ }
+
+ inline LLSimdScalar(F32 f)
+ {
+ mQ = _mm_set_ss(f);
+ }
+
+ static inline const LLSimdScalar& getZero()
+ {
+ extern const LLQuad F_ZERO_4A;
+ return reinterpret_cast<const LLSimdScalar&>(F_ZERO_4A);
+ }
+
+ inline F32 getF32() const;
+
+ inline LLBool32 isApproximatelyEqual(const LLSimdScalar& rhs, F32 tolerance = F_APPROXIMATELY_ZERO) const;
+
+ inline LLSimdScalar getAbs() const;
+
+ inline void setMax( const LLSimdScalar& a, const LLSimdScalar& b );
+
+ inline void setMin( const LLSimdScalar& a, const LLSimdScalar& b );
+
+ inline LLSimdScalar& operator=(F32 rhs);
+
+ inline LLSimdScalar& operator+=(const LLSimdScalar& rhs);
+
+ inline LLSimdScalar& operator-=(const LLSimdScalar& rhs);
+
+ inline LLSimdScalar& operator*=(const LLSimdScalar& rhs);
+
+ inline LLSimdScalar& operator/=(const LLSimdScalar& rhs);
+
+ inline operator LLQuad() const
+ {
+ return mQ;
+ }
+
+ inline const LLQuad& getQuad() const
+ {
+ return mQ;
+ }
+
+private:
+ LLQuad mQ;
+};
+
+#endif //LL_SIMD_TYPES_H
diff --git a/indra/llmath/llsimdtypes.inl b/indra/llmath/llsimdtypes.inl
new file mode 100644
index 0000000000..712239e425
--- /dev/null
+++ b/indra/llmath/llsimdtypes.inl
@@ -0,0 +1,157 @@
+/**
+ * @file llsimdtypes.inl
+ * @brief Inlined definitions of basic SIMD math related types
+ *
+ * $LicenseInfo:firstyear=2010&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+
+
+
+//////////////////
+// LLSimdScalar
+//////////////////
+
+inline LLSimdScalar operator+(const LLSimdScalar& a, const LLSimdScalar& b)
+{
+ LLSimdScalar t(a);
+ t += b;
+ return t;
+}
+
+inline LLSimdScalar operator-(const LLSimdScalar& a, const LLSimdScalar& b)
+{
+ LLSimdScalar t(a);
+ t -= b;
+ return t;
+}
+
+inline LLSimdScalar operator*(const LLSimdScalar& a, const LLSimdScalar& b)
+{
+ LLSimdScalar t(a);
+ t *= b;
+ return t;
+}
+
+inline LLSimdScalar operator/(const LLSimdScalar& a, const LLSimdScalar& b)
+{
+ LLSimdScalar t(a);
+ t /= b;
+ return t;
+}
+
+inline LLSimdScalar operator-(const LLSimdScalar& a)
+{
+ static LL_ALIGN_16(const U32 signMask[4]) = {0x80000000, 0x80000000, 0x80000000, 0x80000000 };
+ return _mm_xor_ps(*reinterpret_cast<const LLQuad*>(signMask), a);
+}
+
+inline LLBool32 operator==(const LLSimdScalar& a, const LLSimdScalar& b)
+{
+ return _mm_comieq_ss(a, b);
+}
+
+inline LLBool32 operator!=(const LLSimdScalar& a, const LLSimdScalar& b)
+{
+ return _mm_comineq_ss(a, b);
+}
+
+inline LLBool32 operator<(const LLSimdScalar& a, const LLSimdScalar& b)
+{
+ return _mm_comilt_ss(a, b);
+}
+
+inline LLBool32 operator<=(const LLSimdScalar& a, const LLSimdScalar& b)
+{
+ return _mm_comile_ss(a, b);
+}
+
+inline LLBool32 operator>(const LLSimdScalar& a, const LLSimdScalar& b)
+{
+ return _mm_comigt_ss(a, b);
+}
+
+inline LLBool32 operator>=(const LLSimdScalar& a, const LLSimdScalar& b)
+{
+ return _mm_comige_ss(a, b);
+}
+
+inline LLBool32 LLSimdScalar::isApproximatelyEqual(const LLSimdScalar& rhs, F32 tolerance /* = F_APPROXIMATELY_ZERO */) const
+{
+ const LLSimdScalar tol( tolerance );
+ const LLSimdScalar diff = _mm_sub_ss( mQ, rhs.mQ );
+ const LLSimdScalar absDiff = diff.getAbs();
+ return absDiff <= tol;
+}
+
+inline void LLSimdScalar::setMax( const LLSimdScalar& a, const LLSimdScalar& b )
+{
+ mQ = _mm_max_ss( a, b );
+}
+
+inline void LLSimdScalar::setMin( const LLSimdScalar& a, const LLSimdScalar& b )
+{
+ mQ = _mm_min_ss( a, b );
+}
+
+inline LLSimdScalar& LLSimdScalar::operator=(F32 rhs)
+{
+ mQ = _mm_set_ss(rhs);
+ return *this;
+}
+
+inline LLSimdScalar& LLSimdScalar::operator+=(const LLSimdScalar& rhs)
+{
+ mQ = _mm_add_ss( mQ, rhs );
+ return *this;
+}
+
+inline LLSimdScalar& LLSimdScalar::operator-=(const LLSimdScalar& rhs)
+{
+ mQ = _mm_sub_ss( mQ, rhs );
+ return *this;
+}
+
+inline LLSimdScalar& LLSimdScalar::operator*=(const LLSimdScalar& rhs)
+{
+ mQ = _mm_mul_ss( mQ, rhs );
+ return *this;
+}
+
+inline LLSimdScalar& LLSimdScalar::operator/=(const LLSimdScalar& rhs)
+{
+ mQ = _mm_div_ss( mQ, rhs );
+ return *this;
+}
+
+inline LLSimdScalar LLSimdScalar::getAbs() const
+{
+ static const LL_ALIGN_16(U32 F_ABS_MASK_4A[4]) = { 0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF };
+ return _mm_and_ps( mQ, *reinterpret_cast<const LLQuad*>(F_ABS_MASK_4A));
+}
+
+inline F32 LLSimdScalar::getF32() const
+{
+ F32 ret;
+ _mm_store_ss(&ret, mQ);
+ return ret;
+}
diff --git a/indra/llmath/lltreenode.h b/indra/llmath/lltreenode.h
index a462d1659e..c66bc26176 100644
--- a/indra/llmath/lltreenode.h
+++ b/indra/llmath/lltreenode.h
@@ -28,6 +28,9 @@
#include "stdtypes.h"
#include "xform.h"
+#include "llpointer.h"
+#include "llrefcount.h"
+
#include <vector>
template <class T> class LLTreeNode;
diff --git a/indra/llmath/llvector4a.cpp b/indra/llmath/llvector4a.cpp
new file mode 100644
index 0000000000..b66b7a7076
--- /dev/null
+++ b/indra/llmath/llvector4a.cpp
@@ -0,0 +1,222 @@
+/**
+ * @file llvector4a.cpp
+ * @brief SIMD vector implementation
+ *
+ * $LicenseInfo:firstyear=2010&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llmath.h"
+#include "llquantize.h"
+
+extern const LLQuad F_ZERO_4A = { 0, 0, 0, 0 };
+extern const LLQuad F_APPROXIMATELY_ZERO_4A = {
+ F_APPROXIMATELY_ZERO,
+ F_APPROXIMATELY_ZERO,
+ F_APPROXIMATELY_ZERO,
+ F_APPROXIMATELY_ZERO
+};
+
+extern const LLVector4a LL_V4A_ZERO = reinterpret_cast<const LLVector4a&> ( F_ZERO_4A );
+extern const LLVector4a LL_V4A_EPSILON = reinterpret_cast<const LLVector4a&> ( F_APPROXIMATELY_ZERO_4A );
+
+/*static */void LLVector4a::memcpyNonAliased16(F32* __restrict dst, const F32* __restrict src, size_t bytes)
+{
+ assert(src != NULL);
+ assert(dst != NULL);
+ assert(bytes > 0);
+ assert((bytes % sizeof(F32))== 0);
+
+ F32* end = dst + (bytes / sizeof(F32) );
+
+ if (bytes > 64)
+ {
+ F32* begin_64 = LL_NEXT_ALIGNED_ADDRESS_64(dst);
+
+ //at least 64 (16*4) bytes before the end of the destination, switch to 16 byte copies
+ F32* end_64 = end-16;
+
+ _mm_prefetch((char*)begin_64, _MM_HINT_NTA);
+ _mm_prefetch((char*)begin_64 + 64, _MM_HINT_NTA);
+ _mm_prefetch((char*)begin_64 + 128, _MM_HINT_NTA);
+ _mm_prefetch((char*)begin_64 + 192, _MM_HINT_NTA);
+
+ while (dst < begin_64)
+ {
+ copy4a(dst, src);
+ dst += 4;
+ src += 4;
+ }
+
+ while (dst < end_64)
+ {
+ _mm_prefetch((char*)src + 512, _MM_HINT_NTA);
+ _mm_prefetch((char*)dst + 512, _MM_HINT_NTA);
+ copy4a(dst, src);
+ copy4a(dst+4, src+4);
+ copy4a(dst+8, src+8);
+ copy4a(dst+12, src+12);
+
+ dst += 16;
+ src += 16;
+ }
+ }
+
+ while (dst < end)
+ {
+ copy4a(dst, src);
+ dst += 4;
+ src += 4;
+ }
+}
+
+void LLVector4a::setRotated( const LLRotation& rot, const LLVector4a& vec )
+{
+ const LLVector4a col0 = rot.getColumn(0);
+ const LLVector4a col1 = rot.getColumn(1);
+ const LLVector4a col2 = rot.getColumn(2);
+
+ LLVector4a result = _mm_load_ss( vec.getF32ptr() );
+ result.splat<0>( result );
+ result.mul( col0 );
+
+ {
+ LLVector4a yyyy = _mm_load_ss( vec.getF32ptr() + 1 );
+ yyyy.splat<0>( yyyy );
+ yyyy.mul( col1 );
+ result.add( yyyy );
+ }
+
+ {
+ LLVector4a zzzz = _mm_load_ss( vec.getF32ptr() + 2 );
+ zzzz.splat<0>( zzzz );
+ zzzz.mul( col2 );
+ result.add( zzzz );
+ }
+
+ *this = result;
+}
+
+void LLVector4a::setRotated( const LLQuaternion2& quat, const LLVector4a& vec )
+{
+ const LLVector4a& quatVec = quat.getVector4a();
+ LLVector4a temp; temp.setCross3(quatVec, vec);
+ temp.add( temp );
+
+ const LLVector4a realPart( quatVec.getScalarAt<3>() );
+ LLVector4a tempTimesReal; tempTimesReal.setMul( temp, realPart );
+
+ mQ = vec;
+ add( tempTimesReal );
+
+ LLVector4a imagCrossTemp; imagCrossTemp.setCross3( quatVec, temp );
+ add(imagCrossTemp);
+}
+
+void LLVector4a::quantize8( const LLVector4a& low, const LLVector4a& high )
+{
+ LLVector4a val(mQ);
+ LLVector4a delta; delta.setSub( high, low );
+
+ {
+ val.clamp(low, high);
+ val.sub(low);
+
+ // 8-bit quantization means we can do with just 12 bits of reciprocal accuracy
+ const LLVector4a oneOverDelta = _mm_rcp_ps(delta.mQ);
+// {
+// static LL_ALIGN_16( const F32 F_TWO_4A[4] ) = { 2.f, 2.f, 2.f, 2.f };
+// LLVector4a two; two.load4a( F_TWO_4A );
+//
+// // Here we use _mm_rcp_ps plus one round of newton-raphson
+// // We wish to find 'x' such that x = 1/delta
+// // As a first approximation, we take x0 = _mm_rcp_ps(delta)
+// // Then x1 = 2 * x0 - a * x0^2 or x1 = x0 * ( 2 - a * x0 )
+// // See Intel AP-803 http://ompf.org/!/Intel_application_note_AP-803.pdf
+// const LLVector4a recipApprox = _mm_rcp_ps(delta.mQ);
+// oneOverDelta.setMul( delta, recipApprox );
+// oneOverDelta.setSub( two, oneOverDelta );
+// oneOverDelta.mul( recipApprox );
+// }
+
+ val.mul(oneOverDelta);
+ val.mul(*reinterpret_cast<const LLVector4a*>(F_U8MAX_4A));
+ }
+
+ val = _mm_cvtepi32_ps(_mm_cvtps_epi32( val.mQ ));
+
+ {
+ val.mul(*reinterpret_cast<const LLVector4a*>(F_OOU8MAX_4A));
+ val.mul(delta);
+ val.add(low);
+ }
+
+ {
+ LLVector4a maxError; maxError.setMul(delta, *reinterpret_cast<const LLVector4a*>(F_OOU8MAX_4A));
+ LLVector4a absVal; absVal.setAbs( val );
+ setSelectWithMask( absVal.lessThan( maxError ), F_ZERO_4A, val );
+ }
+}
+
+void LLVector4a::quantize16( const LLVector4a& low, const LLVector4a& high )
+{
+ LLVector4a val(mQ);
+ LLVector4a delta; delta.setSub( high, low );
+
+ {
+ val.clamp(low, high);
+ val.sub(low);
+
+ // 16-bit quantization means we need a round of Newton-Raphson
+ LLVector4a oneOverDelta;
+ {
+ static LL_ALIGN_16( const F32 F_TWO_4A[4] ) = { 2.f, 2.f, 2.f, 2.f };
+ LLVector4a two; two.load4a( F_TWO_4A );
+
+ // Here we use _mm_rcp_ps plus one round of newton-raphson
+ // We wish to find 'x' such that x = 1/delta
+ // As a first approximation, we take x0 = _mm_rcp_ps(delta)
+ // Then x1 = 2 * x0 - a * x0^2 or x1 = x0 * ( 2 - a * x0 )
+ // See Intel AP-803 http://ompf.org/!/Intel_application_note_AP-803.pdf
+ const LLVector4a recipApprox = _mm_rcp_ps(delta.mQ);
+ oneOverDelta.setMul( delta, recipApprox );
+ oneOverDelta.setSub( two, oneOverDelta );
+ oneOverDelta.mul( recipApprox );
+ }
+
+ val.mul(oneOverDelta);
+ val.mul(*reinterpret_cast<const LLVector4a*>(F_U16MAX_4A));
+ }
+
+ val = _mm_cvtepi32_ps(_mm_cvtps_epi32( val.mQ ));
+
+ {
+ val.mul(*reinterpret_cast<const LLVector4a*>(F_OOU16MAX_4A));
+ val.mul(delta);
+ val.add(low);
+ }
+
+ {
+ LLVector4a maxError; maxError.setMul(delta, *reinterpret_cast<const LLVector4a*>(F_OOU16MAX_4A));
+ LLVector4a absVal; absVal.setAbs( val );
+ setSelectWithMask( absVal.lessThan( maxError ), F_ZERO_4A, val );
+ }
+}
diff --git a/indra/llmath/llvector4a.h b/indra/llmath/llvector4a.h
new file mode 100644
index 0000000000..596082509d
--- /dev/null
+++ b/indra/llmath/llvector4a.h
@@ -0,0 +1,324 @@
+/**
+ * @file llvector4a.h
+ * @brief LLVector4a class header file - memory aligned and vectorized 4 component vector
+ *
+ * $LicenseInfo:firstyear=2010&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLVECTOR4A_H
+#define LL_LLVECTOR4A_H
+
+
+class LLRotation;
+
+#include <assert.h>
+#include "llpreprocessor.h"
+
+///////////////////////////////////
+// FIRST TIME USERS PLEASE READ
+//////////////////////////////////
+// This is just the beginning of LLVector4a. There are many more useful functions
+// yet to be implemented. For example, setNeg to negate a vector, rotate() to apply
+// a matrix rotation, various functions to manipulate only the X, Y, and Z elements
+// and many others (including a whole variety of accessors). So if you don't see a
+// function here that you need, please contact Falcon or someone else with SSE
+// experience (Richard, I think, has some and davep has a little as of the time
+// of this writing, July 08, 2010) about getting it implemented before you resort to
+// LLVector3/LLVector4.
+/////////////////////////////////
+
+class LLVector4a
+{
+public:
+
+ ///////////////////////////////////
+ // STATIC METHODS
+ ///////////////////////////////////
+
+ // Call initClass() at startup to avoid 15,000+ cycle penalties from denormalized numbers
+ static void initClass()
+ {
+ _MM_SET_FLUSH_ZERO_MODE(_MM_FLUSH_ZERO_ON);
+ _MM_SET_ROUNDING_MODE(_MM_ROUND_NEAREST);
+ }
+
+ // Return a vector of all zeros
+ static inline const LLVector4a& getZero()
+ {
+ extern const LLVector4a LL_V4A_ZERO;
+ return LL_V4A_ZERO;
+ }
+
+ // Return a vector of all epsilon, where epsilon is a small float suitable for approximate equality checks
+ static inline const LLVector4a& getEpsilon()
+ {
+ extern const LLVector4a LL_V4A_EPSILON;
+ return LL_V4A_EPSILON;
+ }
+
+ // Copy 16 bytes from src to dst. Source and destination must be 16-byte aligned
+ static inline void copy4a(F32* dst, const F32* src)
+ {
+ _mm_store_ps(dst, _mm_load_ps(src));
+ }
+
+ // Copy words 16-byte blocks from src to dst. Source and destination must not overlap.
+ static void memcpyNonAliased16(F32* __restrict dst, const F32* __restrict src, size_t bytes);
+
+ ////////////////////////////////////
+ // CONSTRUCTORS
+ ////////////////////////////////////
+
+ LLVector4a()
+ { //DO NOT INITIALIZE -- The overhead is completely unnecessary
+ }
+
+ LLVector4a(F32 x, F32 y, F32 z, F32 w = 0.f)
+ {
+ set(x,y,z,w);
+ }
+
+ LLVector4a(F32 x)
+ {
+ splat(x);
+ }
+
+ LLVector4a(const LLSimdScalar& x)
+ {
+ splat(x);
+ }
+
+ LLVector4a(LLQuad q)
+ {
+ mQ = q;
+ }
+
+ ////////////////////////////////////
+ // LOAD/STORE
+ ////////////////////////////////////
+
+ // Load from 16-byte aligned src array (preferred method of loading)
+ inline void load4a(const F32* src);
+
+ // Load from unaligned src array (NB: Significantly slower than load4a)
+ inline void loadua(const F32* src);
+
+ // Load only three floats beginning at address 'src'. Slowest method.
+ inline void load3(const F32* src);
+
+ // Store to a 16-byte aligned memory address
+ inline void store4a(F32* dst) const;
+
+ ////////////////////////////////////
+ // BASIC GET/SET
+ ////////////////////////////////////
+
+ // Return a "this" as an F32 pointer. Do not use unless you have a very good reason. (Not sure? Ask Falcon)
+ inline F32* getF32ptr();
+
+ // Return a "this" as a const F32 pointer. Do not use unless you have a very good reason. (Not sure? Ask Falcon)
+ inline const F32* const getF32ptr() const;
+
+ // Read-only access a single float in this vector. Do not use in proximity to any function call that manipulates
+ // the data at the whole vector level or you will incur a substantial penalty. Consider using the splat functions instead
+ inline F32 operator[](const S32 idx) const;
+
+ // Prefer this method for read-only access to a single element. Prefer the templated version if the elem is known at compile time.
+ inline LLSimdScalar getScalarAt(const S32 idx) const;
+
+ // Prefer this method for read-only access to a single element. Prefer the templated version if the elem is known at compile time.
+ template <int N> LL_FORCE_INLINE LLSimdScalar getScalarAt() const;
+
+ // Set to an x, y, z and optional w provided
+ inline void set(F32 x, F32 y, F32 z, F32 w = 0.f);
+
+ // Set to all zeros. This is preferred to using ::getZero()
+ inline void clear();
+
+ // Set all elements to 'x'
+ inline void splat(const F32 x);
+
+ // Set all elements to 'x'
+ inline void splat(const LLSimdScalar& x);
+
+ // Set all 4 elements to element N of src, with N known at compile time
+ template <int N> void splat(const LLVector4a& src);
+
+ // Set all 4 elements to element i of v, with i NOT known at compile time
+ inline void splat(const LLVector4a& v, U32 i);
+
+ // Select bits from sourceIfTrue and sourceIfFalse according to bits in mask
+ inline void setSelectWithMask( const LLVector4Logical& mask, const LLVector4a& sourceIfTrue, const LLVector4a& sourceIfFalse );
+
+ ////////////////////////////////////
+ // ALGEBRAIC
+ ////////////////////////////////////
+
+ // Set this to the element-wise (a + b)
+ inline void setAdd(const LLVector4a& a, const LLVector4a& b);
+
+ // Set this to element-wise (a - b)
+ inline void setSub(const LLVector4a& a, const LLVector4a& b);
+
+ // Set this to element-wise multiply (a * b)
+ inline void setMul(const LLVector4a& a, const LLVector4a& b);
+
+ // Set this to element-wise quotient (a / b)
+ inline void setDiv(const LLVector4a& a, const LLVector4a& b);
+
+ // Set this to the element-wise absolute value of src
+ inline void setAbs(const LLVector4a& src);
+
+ // Add to each component in this vector the corresponding component in rhs
+ inline void add(const LLVector4a& rhs);
+
+ // Subtract from each component in this vector the corresponding component in rhs
+ inline void sub(const LLVector4a& rhs);
+
+ // Multiply each component in this vector by the corresponding component in rhs
+ inline void mul(const LLVector4a& rhs);
+
+ // Divide each component in this vector by the corresponding component in rhs
+ inline void div(const LLVector4a& rhs);
+
+ // Multiply this vector by x in a scalar fashion
+ inline void mul(const F32 x);
+
+ // Set this to (a x b) (geometric cross-product)
+ inline void setCross3(const LLVector4a& a, const LLVector4a& b);
+
+ // Set all elements to the dot product of the x, y, and z elements in a and b
+ inline void setAllDot3(const LLVector4a& a, const LLVector4a& b);
+
+ // Set all elements to the dot product of the x, y, z, and w elements in a and b
+ inline void setAllDot4(const LLVector4a& a, const LLVector4a& b);
+
+ // Return the 3D dot product of this vector and b
+ inline LLSimdScalar dot3(const LLVector4a& b) const;
+
+ // Return the 4D dot product of this vector and b
+ inline LLSimdScalar dot4(const LLVector4a& b) const;
+
+ // Normalize this vector with respect to the x, y, and z components only. Accurate to 22 bites of precision. W component is destroyed
+ // Note that this does not consider zero length vectors!
+ inline void normalize3();
+
+ // Same as normalize3() but with respect to all 4 components
+ inline void normalize4();
+
+ // Same as normalize3(), but returns length as a SIMD scalar
+ inline LLSimdScalar normalize3withLength();
+
+ // Normalize this vector with respect to the x, y, and z components only. Accurate only to 10-12 bits of precision. W component is destroyed
+ // Note that this does not consider zero length vectors!
+ inline void normalize3fast();
+
+ // Return true if this vector is normalized with respect to x,y,z up to tolerance
+ inline LLBool32 isNormalized3( F32 tolerance = 1e-3 ) const;
+
+ // Return true if this vector is normalized with respect to all components up to tolerance
+ inline LLBool32 isNormalized4( F32 tolerance = 1e-3 ) const;
+
+ // Set all elements to the length of vector 'v'
+ inline void setAllLength3( const LLVector4a& v );
+
+ // Get this vector's length
+ inline LLSimdScalar getLength3() const;
+
+ // Set the components of this vector to the minimum of the corresponding components of lhs and rhs
+ inline void setMin(const LLVector4a& lhs, const LLVector4a& rhs);
+
+ // Set the components of this vector to the maximum of the corresponding components of lhs and rhs
+ inline void setMax(const LLVector4a& lhs, const LLVector4a& rhs);
+
+ // Clamps this vector to be within the component-wise range low to high (inclusive)
+ inline void clamp( const LLVector4a& low, const LLVector4a& high );
+
+ // Set this to (c * lhs) + rhs * ( 1 - c)
+ inline void setLerp(const LLVector4a& lhs, const LLVector4a& rhs, F32 c);
+
+ // Return true (nonzero) if x, y, z (and w for Finite4) are all finite floats
+ inline LLBool32 isFinite3() const;
+ inline LLBool32 isFinite4() const;
+
+ // Set this vector to 'vec' rotated by the LLRotation or LLQuaternion2 provided
+ void setRotated( const LLRotation& rot, const LLVector4a& vec );
+ void setRotated( const class LLQuaternion2& quat, const LLVector4a& vec );
+
+ // Set this vector to 'vec' rotated by the INVERSE of the LLRotation or LLQuaternion2 provided
+ inline void setRotatedInv( const LLRotation& rot, const LLVector4a& vec );
+ inline void setRotatedInv( const class LLQuaternion2& quat, const LLVector4a& vec );
+
+ // Quantize this vector to 8 or 16 bit precision
+ void quantize8( const LLVector4a& low, const LLVector4a& high );
+ void quantize16( const LLVector4a& low, const LLVector4a& high );
+
+ ////////////////////////////////////
+ // LOGICAL
+ ////////////////////////////////////
+ // The functions in this section will compare the elements in this vector
+ // to those in rhs and return an LLVector4Logical with all bits set in elements
+ // where the comparison was true and all bits unset in elements where the comparison
+ // was false. See llvector4logica.h
+ ////////////////////////////////////
+ // WARNING: Other than equals3 and equals4, these functions do NOT account
+ // for floating point tolerance. You should include the appropriate tolerance
+ // in the inputs.
+ ////////////////////////////////////
+
+ inline LLVector4Logical greaterThan(const LLVector4a& rhs) const;
+
+ inline LLVector4Logical lessThan(const LLVector4a& rhs) const;
+
+ inline LLVector4Logical greaterEqual(const LLVector4a& rhs) const;
+
+ inline LLVector4Logical lessEqual(const LLVector4a& rhs) const;
+
+ inline LLVector4Logical equal(const LLVector4a& rhs) const;
+
+ // Returns true if this and rhs are componentwise equal up to the specified absolute tolerance
+ inline bool equals4(const LLVector4a& rhs, F32 tolerance = F_APPROXIMATELY_ZERO ) const;
+
+ inline bool equals3(const LLVector4a& rhs, F32 tolerance = F_APPROXIMATELY_ZERO ) const;
+
+ ////////////////////////////////////
+ // OPERATORS
+ ////////////////////////////////////
+
+ // Do NOT add aditional operators without consulting someone with SSE experience
+ inline const LLVector4a& operator= ( const LLVector4a& rhs );
+
+ inline const LLVector4a& operator= ( const LLQuad& rhs );
+
+ inline operator LLQuad() const;
+
+private:
+ LLQuad mQ;
+};
+
+inline void update_min_max(LLVector4a& min, LLVector4a& max, const LLVector4a& p)
+{
+ min.setMin(min, p);
+ max.setMax(max, p);
+}
+
+#endif
diff --git a/indra/llmath/llvector4a.inl b/indra/llmath/llvector4a.inl
new file mode 100644
index 0000000000..7ad22a5631
--- /dev/null
+++ b/indra/llmath/llvector4a.inl
@@ -0,0 +1,593 @@
+/**
+ * @file llvector4a.inl
+ * @brief LLVector4a inline function implementations
+ *
+ * $LicenseInfo:firstyear=2010&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+////////////////////////////////////
+// LOAD/STORE
+////////////////////////////////////
+
+// Load from 16-byte aligned src array (preferred method of loading)
+inline void LLVector4a::load4a(const F32* src)
+{
+ mQ = _mm_load_ps(src);
+}
+
+// Load from unaligned src array (NB: Significantly slower than load4a)
+inline void LLVector4a::loadua(const F32* src)
+{
+ mQ = _mm_loadu_ps(src);
+}
+
+// Load only three floats beginning at address 'src'. Slowest method.
+inline void LLVector4a::load3(const F32* src)
+{
+ // mQ = { 0.f, src[2], src[1], src[0] } = { W, Z, Y, X }
+ // NB: This differs from the convention of { Z, Y, X, W }
+ mQ = _mm_set_ps(0.f, src[2], src[1], src[0]);
+}
+
+// Store to a 16-byte aligned memory address
+inline void LLVector4a::store4a(F32* dst) const
+{
+ _mm_store_ps(dst, mQ);
+}
+
+////////////////////////////////////
+// BASIC GET/SET
+////////////////////////////////////
+
+// Return a "this" as an F32 pointer. Do not use unless you have a very good reason. (Not sure? Ask Falcon)
+F32* LLVector4a::getF32ptr()
+{
+ return (F32*) &mQ;
+}
+
+// Return a "this" as a const F32 pointer. Do not use unless you have a very good reason. (Not sure? Ask Falcon)
+const F32* const LLVector4a::getF32ptr() const
+{
+ return (const F32* const) &mQ;
+}
+
+// Read-only access a single float in this vector. Do not use in proximity to any function call that manipulates
+// the data at the whole vector level or you will incur a substantial penalty. Consider using the splat functions instead
+inline F32 LLVector4a::operator[](const S32 idx) const
+{
+ return ((F32*)&mQ)[idx];
+}
+
+// Prefer this method for read-only access to a single element. Prefer the templated version if the elem is known at compile time.
+inline LLSimdScalar LLVector4a::getScalarAt(const S32 idx) const
+{
+ // Return appropriate LLQuad. It will be cast to LLSimdScalar automatically (should be effectively a nop)
+ switch (idx)
+ {
+ case 0:
+ return mQ;
+ case 1:
+ return _mm_shuffle_ps(mQ, mQ, _MM_SHUFFLE(1, 1, 1, 1));
+ case 2:
+ return _mm_shuffle_ps(mQ, mQ, _MM_SHUFFLE(2, 2, 2, 2));
+ case 3:
+ default:
+ return _mm_shuffle_ps(mQ, mQ, _MM_SHUFFLE(3, 3, 3, 3));
+ }
+}
+
+// Prefer this method for read-only access to a single element. Prefer the templated version if the elem is known at compile time.
+template <int N> LL_FORCE_INLINE LLSimdScalar LLVector4a::getScalarAt() const
+{
+ return _mm_shuffle_ps(mQ, mQ, _MM_SHUFFLE(N, N, N, N));
+}
+
+template<> LL_FORCE_INLINE LLSimdScalar LLVector4a::getScalarAt<0>() const
+{
+ return mQ;
+}
+
+// Set to an x, y, z and optional w provided
+inline void LLVector4a::set(F32 x, F32 y, F32 z, F32 w)
+{
+ mQ = _mm_set_ps(w, z, y, x);
+}
+
+// Set to all zeros
+inline void LLVector4a::clear()
+{
+ mQ = LLVector4a::getZero().mQ;
+}
+
+inline void LLVector4a::splat(const F32 x)
+{
+ mQ = _mm_set1_ps(x);
+}
+
+inline void LLVector4a::splat(const LLSimdScalar& x)
+{
+ mQ = _mm_shuffle_ps( x.getQuad(), x.getQuad(), _MM_SHUFFLE(0,0,0,0) );
+}
+
+// Set all 4 elements to element N of src, with N known at compile time
+template <int N> void LLVector4a::splat(const LLVector4a& src)
+{
+ mQ = _mm_shuffle_ps(src.mQ, src.mQ, _MM_SHUFFLE(N, N, N, N) );
+}
+
+// Set all 4 elements to element i of v, with i NOT known at compile time
+inline void LLVector4a::splat(const LLVector4a& v, U32 i)
+{
+ switch (i)
+ {
+ case 0:
+ mQ = _mm_shuffle_ps(v.mQ, v.mQ, _MM_SHUFFLE(0, 0, 0, 0));
+ break;
+ case 1:
+ mQ = _mm_shuffle_ps(v.mQ, v.mQ, _MM_SHUFFLE(1, 1, 1, 1));
+ break;
+ case 2:
+ mQ = _mm_shuffle_ps(v.mQ, v.mQ, _MM_SHUFFLE(2, 2, 2, 2));
+ break;
+ case 3:
+ mQ = _mm_shuffle_ps(v.mQ, v.mQ, _MM_SHUFFLE(3, 3, 3, 3));
+ break;
+ }
+}
+
+// Select bits from sourceIfTrue and sourceIfFalse according to bits in mask
+inline void LLVector4a::setSelectWithMask( const LLVector4Logical& mask, const LLVector4a& sourceIfTrue, const LLVector4a& sourceIfFalse )
+{
+ // ((( sourceIfTrue ^ sourceIfFalse ) & mask) ^ sourceIfFalse )
+ // E.g., sourceIfFalse = 1010b, sourceIfTrue = 0101b, mask = 1100b
+ // (sourceIfTrue ^ sourceIfFalse) = 1111b --> & mask = 1100b --> ^ sourceIfFalse = 0110b,
+ // as expected (01 from sourceIfTrue, 10 from sourceIfFalse)
+ // Courtesy of Mark++, http://markplusplus.wordpress.com/2007/03/14/fast-sse-select-operation/
+ mQ = _mm_xor_ps( sourceIfFalse, _mm_and_ps( mask, _mm_xor_ps( sourceIfTrue, sourceIfFalse ) ) );
+}
+
+////////////////////////////////////
+// ALGEBRAIC
+////////////////////////////////////
+
+// Set this to the element-wise (a + b)
+inline void LLVector4a::setAdd(const LLVector4a& a, const LLVector4a& b)
+{
+ mQ = _mm_add_ps(a.mQ, b.mQ);
+}
+
+// Set this to element-wise (a - b)
+inline void LLVector4a::setSub(const LLVector4a& a, const LLVector4a& b)
+{
+ mQ = _mm_sub_ps(a.mQ, b.mQ);
+}
+
+// Set this to element-wise multiply (a * b)
+inline void LLVector4a::setMul(const LLVector4a& a, const LLVector4a& b)
+{
+ mQ = _mm_mul_ps(a.mQ, b.mQ);
+}
+
+// Set this to element-wise quotient (a / b)
+inline void LLVector4a::setDiv(const LLVector4a& a, const LLVector4a& b)
+{
+ mQ = _mm_div_ps( a.mQ, b.mQ );
+}
+
+// Set this to the element-wise absolute value of src
+inline void LLVector4a::setAbs(const LLVector4a& src)
+{
+ static const LL_ALIGN_16(U32 F_ABS_MASK_4A[4]) = { 0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF };
+ mQ = _mm_and_ps(src.mQ, *reinterpret_cast<const LLQuad*>(F_ABS_MASK_4A));
+}
+
+// Add to each component in this vector the corresponding component in rhs
+inline void LLVector4a::add(const LLVector4a& rhs)
+{
+ mQ = _mm_add_ps(mQ, rhs.mQ);
+}
+
+// Subtract from each component in this vector the corresponding component in rhs
+inline void LLVector4a::sub(const LLVector4a& rhs)
+{
+ mQ = _mm_sub_ps(mQ, rhs.mQ);
+}
+
+// Multiply each component in this vector by the corresponding component in rhs
+inline void LLVector4a::mul(const LLVector4a& rhs)
+{
+ mQ = _mm_mul_ps(mQ, rhs.mQ);
+}
+
+// Divide each component in this vector by the corresponding component in rhs
+inline void LLVector4a::div(const LLVector4a& rhs)
+{
+ // TODO: Check accuracy, maybe add divFast
+ mQ = _mm_div_ps(mQ, rhs.mQ);
+}
+
+// Multiply this vector by x in a scalar fashion
+inline void LLVector4a::mul(const F32 x)
+{
+ LLVector4a t;
+ t.splat(x);
+
+ mQ = _mm_mul_ps(mQ, t.mQ);
+}
+
+// Set this to (a x b) (geometric cross-product)
+inline void LLVector4a::setCross3(const LLVector4a& a, const LLVector4a& b)
+{
+ // Vectors are stored in memory in w, z, y, x order from high to low
+ // Set vector1 = { a[W], a[X], a[Z], a[Y] }
+ const LLQuad vector1 = _mm_shuffle_ps( a.mQ, a.mQ, _MM_SHUFFLE( 3, 0, 2, 1 ));
+ // Set vector2 = { b[W], b[Y], b[X], b[Z] }
+ const LLQuad vector2 = _mm_shuffle_ps( b.mQ, b.mQ, _MM_SHUFFLE( 3, 1, 0, 2 ));
+ // mQ = { a[W]*b[W], a[X]*b[Y], a[Z]*b[X], a[Y]*b[Z] }
+ mQ = _mm_mul_ps( vector1, vector2 );
+ // vector3 = { a[W], a[Y], a[X], a[Z] }
+ const LLQuad vector3 = _mm_shuffle_ps( a.mQ, a.mQ, _MM_SHUFFLE( 3, 1, 0, 2 ));
+ // vector4 = { b[W], b[X], b[Z], b[Y] }
+ const LLQuad vector4 = _mm_shuffle_ps( b.mQ, b.mQ, _MM_SHUFFLE( 3, 0, 2, 1 ));
+ // mQ = { 0, a[X]*b[Y] - a[Y]*b[X], a[Z]*b[X] - a[X]*b[Z], a[Y]*b[Z] - a[Z]*b[Y] }
+ mQ = _mm_sub_ps( mQ, _mm_mul_ps( vector3, vector4 ));
+}
+
+/* This function works, but may be slightly slower than the one below on older machines
+ inline void LLVector4a::setAllDot3(const LLVector4a& a, const LLVector4a& b)
+ {
+ // ab = { a[W]*b[W], a[Z]*b[Z], a[Y]*b[Y], a[X]*b[X] }
+ const LLQuad ab = _mm_mul_ps( a.mQ, b.mQ );
+ // yzxw = { a[W]*b[W], a[Z]*b[Z], a[X]*b[X], a[Y]*b[Y] }
+ const LLQuad wzxy = _mm_shuffle_ps( ab, ab, _MM_SHUFFLE(3, 2, 0, 1 ));
+ // xPlusY = { 2*a[W]*b[W], 2 * a[Z] * b[Z], a[Y]*b[Y] + a[X] * b[X], a[X] * b[X] + a[Y] * b[Y] }
+ const LLQuad xPlusY = _mm_add_ps(ab, wzxy);
+ // xPlusYSplat = { a[Y]*b[Y] + a[X] * b[X], a[X] * b[X] + a[Y] * b[Y], a[Y]*b[Y] + a[X] * b[X], a[X] * b[X] + a[Y] * b[Y] }
+ const LLQuad xPlusYSplat = _mm_movelh_ps(xPlusY, xPlusY);
+ // zSplat = { a[Z]*b[Z], a[Z]*b[Z], a[Z]*b[Z], a[Z]*b[Z] }
+ const LLQuad zSplat = _mm_shuffle_ps( ab, ab, _MM_SHUFFLE( 2, 2, 2, 2 ));
+ // mQ = { a[Z] * b[Z] + a[Y] * b[Y] + a[X] * b[X], same, same, same }
+ mQ = _mm_add_ps(zSplat, xPlusYSplat);
+ }*/
+
+// Set all elements to the dot product of the x, y, and z elements in a and b
+inline void LLVector4a::setAllDot3(const LLVector4a& a, const LLVector4a& b)
+{
+ // ab = { a[W]*b[W], a[Z]*b[Z], a[Y]*b[Y], a[X]*b[X] }
+ const LLQuad ab = _mm_mul_ps( a.mQ, b.mQ );
+ // yzxw = { a[W]*b[W], a[Z]*b[Z], a[X]*b[X], a[Y]*b[Y] }
+ const __m128i wzxy = _mm_shuffle_epi32(_mm_castps_si128(ab), _MM_SHUFFLE(3, 2, 0, 1 ));
+ // xPlusY = { 2*a[W]*b[W], 2 * a[Z] * b[Z], a[Y]*b[Y] + a[X] * b[X], a[X] * b[X] + a[Y] * b[Y] }
+ const LLQuad xPlusY = _mm_add_ps(ab, _mm_castsi128_ps(wzxy));
+ // xPlusYSplat = { a[Y]*b[Y] + a[X] * b[X], a[X] * b[X] + a[Y] * b[Y], a[Y]*b[Y] + a[X] * b[X], a[X] * b[X] + a[Y] * b[Y] }
+ const LLQuad xPlusYSplat = _mm_movelh_ps(xPlusY, xPlusY);
+ // zSplat = { a[Z]*b[Z], a[Z]*b[Z], a[Z]*b[Z], a[Z]*b[Z] }
+ const __m128i zSplat = _mm_shuffle_epi32(_mm_castps_si128(ab), _MM_SHUFFLE( 2, 2, 2, 2 ));
+ // mQ = { a[Z] * b[Z] + a[Y] * b[Y] + a[X] * b[X], same, same, same }
+ mQ = _mm_add_ps(_mm_castsi128_ps(zSplat), xPlusYSplat);
+}
+
+// Set all elements to the dot product of the x, y, z, and w elements in a and b
+inline void LLVector4a::setAllDot4(const LLVector4a& a, const LLVector4a& b)
+{
+ // ab = { a[W]*b[W], a[Z]*b[Z], a[Y]*b[Y], a[X]*b[X] }
+ const LLQuad ab = _mm_mul_ps( a.mQ, b.mQ );
+ // yzxw = { a[W]*b[W], a[Z]*b[Z], a[X]*b[X], a[Y]*b[Y] }
+ const __m128i zwxy = _mm_shuffle_epi32(_mm_castps_si128(ab), _MM_SHUFFLE(2, 3, 0, 1 ));
+ // zPlusWandXplusY = { a[W]*b[W] + a[Z]*b[Z], a[Z] * b[Z] + a[W]*b[W], a[Y]*b[Y] + a[X] * b[X], a[X] * b[X] + a[Y] * b[Y] }
+ const LLQuad zPlusWandXplusY = _mm_add_ps(ab, _mm_castsi128_ps(zwxy));
+ // xPlusYSplat = { a[Y]*b[Y] + a[X] * b[X], a[X] * b[X] + a[Y] * b[Y], a[Y]*b[Y] + a[X] * b[X], a[X] * b[X] + a[Y] * b[Y] }
+ const LLQuad xPlusYSplat = _mm_movelh_ps(zPlusWandXplusY, zPlusWandXplusY);
+ const LLQuad zPlusWSplat = _mm_movehl_ps(zPlusWandXplusY, zPlusWandXplusY);
+
+ // mQ = { a[W]*b[W] + a[Z] * b[Z] + a[Y] * b[Y] + a[X] * b[X], same, same, same }
+ mQ = _mm_add_ps(xPlusYSplat, zPlusWSplat);
+}
+
+// Return the 3D dot product of this vector and b
+inline LLSimdScalar LLVector4a::dot3(const LLVector4a& b) const
+{
+ const LLQuad ab = _mm_mul_ps( mQ, b.mQ );
+ const LLQuad splatY = _mm_castsi128_ps( _mm_shuffle_epi32( _mm_castps_si128(ab), _MM_SHUFFLE(1, 1, 1, 1) ) );
+ const LLQuad splatZ = _mm_castsi128_ps( _mm_shuffle_epi32( _mm_castps_si128(ab), _MM_SHUFFLE(2, 2, 2, 2) ) );
+ const LLQuad xPlusY = _mm_add_ps( ab, splatY );
+ return _mm_add_ps( xPlusY, splatZ );
+}
+
+// Return the 4D dot product of this vector and b
+inline LLSimdScalar LLVector4a::dot4(const LLVector4a& b) const
+{
+ // ab = { w, z, y, x }
+ const LLQuad ab = _mm_mul_ps( mQ, b.mQ );
+ // upperProdsInLowerElems = { y, x, y, x }
+ const LLQuad upperProdsInLowerElems = _mm_movehl_ps( ab, ab );
+ // sumOfPairs = { w+y, z+x, 2y, 2x }
+ const LLQuad sumOfPairs = _mm_add_ps( upperProdsInLowerElems, ab );
+ // shuffled = { z+x, z+x, z+x, z+x }
+ const LLQuad shuffled = _mm_castsi128_ps( _mm_shuffle_epi32( _mm_castps_si128( sumOfPairs ), _MM_SHUFFLE(1, 1, 1, 1) ) );
+ return _mm_add_ss( sumOfPairs, shuffled );
+}
+
+// Normalize this vector with respect to the x, y, and z components only. Accurate to 22 bites of precision. W component is destroyed
+// Note that this does not consider zero length vectors!
+inline void LLVector4a::normalize3()
+{
+ // lenSqrd = a dot a
+ LLVector4a lenSqrd; lenSqrd.setAllDot3( *this, *this );
+ // rsqrt = approximate reciprocal square (i.e., { ~1/len(a)^2, ~1/len(a)^2, ~1/len(a)^2, ~1/len(a)^2 }
+ const LLQuad rsqrt = _mm_rsqrt_ps(lenSqrd.mQ);
+ static const LLQuad half = { 0.5f, 0.5f, 0.5f, 0.5f };
+ static const LLQuad three = {3.f, 3.f, 3.f, 3.f };
+ // Now we do one round of Newton-Raphson approximation to get full accuracy
+ // According to the Newton-Raphson method, given a first 'w' for the root of f(x) = 1/x^2 - a (i.e., x = 1/sqrt(a))
+ // the next better approximation w[i+1] = w - f(w)/f'(w) = w - (1/w^2 - a)/(-2*w^(-3))
+ // w[i+1] = w + 0.5 * (1/w^2 - a) * w^3 = w + 0.5 * (w - a*w^3) = 1.5 * w - 0.5 * a * w^3
+ // = 0.5 * w * (3 - a*w^2)
+ // Our first approx is w = rsqrt. We need out = a * w[i+1] (this is the input vector 'a', not the 'a' from the above formula
+ // which is actually lenSqrd). So out = a * [0.5*rsqrt * (3 - lenSqrd*rsqrt*rsqrt)]
+ const LLQuad AtimesRsqrt = _mm_mul_ps( lenSqrd.mQ, rsqrt );
+ const LLQuad AtimesRsqrtTimesRsqrt = _mm_mul_ps( AtimesRsqrt, rsqrt );
+ const LLQuad threeMinusAtimesRsqrtTimesRsqrt = _mm_sub_ps(three, AtimesRsqrtTimesRsqrt );
+ const LLQuad nrApprox = _mm_mul_ps(half, _mm_mul_ps(rsqrt, threeMinusAtimesRsqrtTimesRsqrt));
+ mQ = _mm_mul_ps( mQ, nrApprox );
+}
+
+// Normalize this vector with respect to all components. Accurate to 22 bites of precision.
+// Note that this does not consider zero length vectors!
+inline void LLVector4a::normalize4()
+{
+ // lenSqrd = a dot a
+ LLVector4a lenSqrd; lenSqrd.setAllDot4( *this, *this );
+ // rsqrt = approximate reciprocal square (i.e., { ~1/len(a)^2, ~1/len(a)^2, ~1/len(a)^2, ~1/len(a)^2 }
+ const LLQuad rsqrt = _mm_rsqrt_ps(lenSqrd.mQ);
+ static const LLQuad half = { 0.5f, 0.5f, 0.5f, 0.5f };
+ static const LLQuad three = {3.f, 3.f, 3.f, 3.f };
+ // Now we do one round of Newton-Raphson approximation to get full accuracy
+ // According to the Newton-Raphson method, given a first 'w' for the root of f(x) = 1/x^2 - a (i.e., x = 1/sqrt(a))
+ // the next better approximation w[i+1] = w - f(w)/f'(w) = w - (1/w^2 - a)/(-2*w^(-3))
+ // w[i+1] = w + 0.5 * (1/w^2 - a) * w^3 = w + 0.5 * (w - a*w^3) = 1.5 * w - 0.5 * a * w^3
+ // = 0.5 * w * (3 - a*w^2)
+ // Our first approx is w = rsqrt. We need out = a * w[i+1] (this is the input vector 'a', not the 'a' from the above formula
+ // which is actually lenSqrd). So out = a * [0.5*rsqrt * (3 - lenSqrd*rsqrt*rsqrt)]
+ const LLQuad AtimesRsqrt = _mm_mul_ps( lenSqrd.mQ, rsqrt );
+ const LLQuad AtimesRsqrtTimesRsqrt = _mm_mul_ps( AtimesRsqrt, rsqrt );
+ const LLQuad threeMinusAtimesRsqrtTimesRsqrt = _mm_sub_ps(three, AtimesRsqrtTimesRsqrt );
+ const LLQuad nrApprox = _mm_mul_ps(half, _mm_mul_ps(rsqrt, threeMinusAtimesRsqrtTimesRsqrt));
+ mQ = _mm_mul_ps( mQ, nrApprox );
+}
+
+// Normalize this vector with respect to the x, y, and z components only. Accurate to 22 bites of precision. W component is destroyed
+// Note that this does not consider zero length vectors!
+inline LLSimdScalar LLVector4a::normalize3withLength()
+{
+ // lenSqrd = a dot a
+ LLVector4a lenSqrd; lenSqrd.setAllDot3( *this, *this );
+ // rsqrt = approximate reciprocal square (i.e., { ~1/len(a)^2, ~1/len(a)^2, ~1/len(a)^2, ~1/len(a)^2 }
+ const LLQuad rsqrt = _mm_rsqrt_ps(lenSqrd.mQ);
+ static const LLQuad half = { 0.5f, 0.5f, 0.5f, 0.5f };
+ static const LLQuad three = {3.f, 3.f, 3.f, 3.f };
+ // Now we do one round of Newton-Raphson approximation to get full accuracy
+ // According to the Newton-Raphson method, given a first 'w' for the root of f(x) = 1/x^2 - a (i.e., x = 1/sqrt(a))
+ // the next better approximation w[i+1] = w - f(w)/f'(w) = w - (1/w^2 - a)/(-2*w^(-3))
+ // w[i+1] = w + 0.5 * (1/w^2 - a) * w^3 = w + 0.5 * (w - a*w^3) = 1.5 * w - 0.5 * a * w^3
+ // = 0.5 * w * (3 - a*w^2)
+ // Our first approx is w = rsqrt. We need out = a * w[i+1] (this is the input vector 'a', not the 'a' from the above formula
+ // which is actually lenSqrd). So out = a * [0.5*rsqrt * (3 - lenSqrd*rsqrt*rsqrt)]
+ const LLQuad AtimesRsqrt = _mm_mul_ps( lenSqrd.mQ, rsqrt );
+ const LLQuad AtimesRsqrtTimesRsqrt = _mm_mul_ps( AtimesRsqrt, rsqrt );
+ const LLQuad threeMinusAtimesRsqrtTimesRsqrt = _mm_sub_ps(three, AtimesRsqrtTimesRsqrt );
+ const LLQuad nrApprox = _mm_mul_ps(half, _mm_mul_ps(rsqrt, threeMinusAtimesRsqrtTimesRsqrt));
+ mQ = _mm_mul_ps( mQ, nrApprox );
+ return _mm_sqrt_ss(lenSqrd);
+}
+
+// Normalize this vector with respect to the x, y, and z components only. Accurate only to 10-12 bits of precision. W component is destroyed
+// Note that this does not consider zero length vectors!
+inline void LLVector4a::normalize3fast()
+{
+ LLVector4a lenSqrd; lenSqrd.setAllDot3( *this, *this );
+ const LLQuad approxRsqrt = _mm_rsqrt_ps(lenSqrd.mQ);
+ mQ = _mm_mul_ps( mQ, approxRsqrt );
+}
+
+// Return true if this vector is normalized with respect to x,y,z up to tolerance
+inline LLBool32 LLVector4a::isNormalized3( F32 tolerance ) const
+{
+ static LL_ALIGN_16(const U32 ones[4]) = { 0x3f800000, 0x3f800000, 0x3f800000, 0x3f800000 };
+ LLSimdScalar tol = _mm_load_ss( &tolerance );
+ tol = _mm_mul_ss( tol, tol );
+ LLVector4a lenSquared; lenSquared.setAllDot3( *this, *this );
+ lenSquared.sub( *reinterpret_cast<const LLVector4a*>(ones) );
+ lenSquared.setAbs(lenSquared);
+ return _mm_comile_ss( lenSquared, tol );
+}
+
+// Return true if this vector is normalized with respect to all components up to tolerance
+inline LLBool32 LLVector4a::isNormalized4( F32 tolerance ) const
+{
+ static LL_ALIGN_16(const U32 ones[4]) = { 0x3f800000, 0x3f800000, 0x3f800000, 0x3f800000 };
+ LLSimdScalar tol = _mm_load_ss( &tolerance );
+ tol = _mm_mul_ss( tol, tol );
+ LLVector4a lenSquared; lenSquared.setAllDot4( *this, *this );
+ lenSquared.sub( *reinterpret_cast<const LLVector4a*>(ones) );
+ lenSquared.setAbs(lenSquared);
+ return _mm_comile_ss( lenSquared, tol );
+}
+
+// Set all elements to the length of vector 'v'
+inline void LLVector4a::setAllLength3( const LLVector4a& v )
+{
+ LLVector4a lenSqrd;
+ lenSqrd.setAllDot3(v, v);
+
+ mQ = _mm_sqrt_ps(lenSqrd.mQ);
+}
+
+// Get this vector's length
+inline LLSimdScalar LLVector4a::getLength3() const
+{
+ return _mm_sqrt_ss( dot3( (const LLVector4a)mQ ) );
+}
+
+// Set the components of this vector to the minimum of the corresponding components of lhs and rhs
+inline void LLVector4a::setMin(const LLVector4a& lhs, const LLVector4a& rhs)
+{
+ mQ = _mm_min_ps(lhs.mQ, rhs.mQ);
+}
+
+// Set the components of this vector to the maximum of the corresponding components of lhs and rhs
+inline void LLVector4a::setMax(const LLVector4a& lhs, const LLVector4a& rhs)
+{
+ mQ = _mm_max_ps(lhs.mQ, rhs.mQ);
+}
+
+// Set this to (c * lhs) + rhs * ( 1 - c)
+inline void LLVector4a::setLerp(const LLVector4a& lhs, const LLVector4a& rhs, F32 c)
+{
+ LLVector4a a = lhs;
+ a.mul(c);
+
+ LLVector4a b = rhs;
+ b.mul(1.f-c);
+
+ setAdd(a, b);
+}
+
+inline LLBool32 LLVector4a::isFinite3() const
+{
+ static LL_ALIGN_16(const U32 nanOrInfMask[4]) = { 0x7f800000, 0x7f800000, 0x7f800000, 0x7f800000 };
+ const __m128i nanOrInfMaskV = *reinterpret_cast<const __m128i*> (nanOrInfMask);
+ const __m128i maskResult = _mm_and_si128( _mm_castps_si128(mQ), nanOrInfMaskV );
+ const LLVector4Logical equalityCheck = _mm_castsi128_ps(_mm_cmpeq_epi32( maskResult, nanOrInfMaskV ));
+ return !equalityCheck.areAnySet( LLVector4Logical::MASK_XYZ );
+}
+
+inline LLBool32 LLVector4a::isFinite4() const
+{
+ static LL_ALIGN_16(const U32 nanOrInfMask[4]) = { 0x7f800000, 0x7f800000, 0x7f800000, 0x7f800000 };
+ const __m128i nanOrInfMaskV = *reinterpret_cast<const __m128i*> (nanOrInfMask);
+ const __m128i maskResult = _mm_and_si128( _mm_castps_si128(mQ), nanOrInfMaskV );
+ const LLVector4Logical equalityCheck = _mm_castsi128_ps(_mm_cmpeq_epi32( maskResult, nanOrInfMaskV ));
+ return !equalityCheck.areAnySet( LLVector4Logical::MASK_XYZW );
+}
+
+inline void LLVector4a::setRotatedInv( const LLRotation& rot, const LLVector4a& vec )
+{
+ LLRotation inv; inv.setTranspose( rot );
+ setRotated( inv, vec );
+}
+
+inline void LLVector4a::setRotatedInv( const LLQuaternion2& quat, const LLVector4a& vec )
+{
+ LLQuaternion2 invRot; invRot.setConjugate( quat );
+ setRotated(invRot, vec);
+}
+
+inline void LLVector4a::clamp( const LLVector4a& low, const LLVector4a& high )
+{
+ const LLVector4Logical highMask = greaterThan( high );
+ const LLVector4Logical lowMask = lessThan( low );
+
+ setSelectWithMask( highMask, high, *this );
+ setSelectWithMask( lowMask, low, *this );
+}
+
+
+////////////////////////////////////
+// LOGICAL
+////////////////////////////////////
+// The functions in this section will compare the elements in this vector
+// to those in rhs and return an LLVector4Logical with all bits set in elements
+// where the comparison was true and all bits unset in elements where the comparison
+// was false. See llvector4logica.h
+////////////////////////////////////
+// WARNING: Other than equals3 and equals4, these functions do NOT account
+// for floating point tolerance. You should include the appropriate tolerance
+// in the inputs.
+////////////////////////////////////
+
+inline LLVector4Logical LLVector4a::greaterThan(const LLVector4a& rhs) const
+{
+ return _mm_cmpgt_ps(mQ, rhs.mQ);
+}
+
+inline LLVector4Logical LLVector4a::lessThan(const LLVector4a& rhs) const
+{
+ return _mm_cmplt_ps(mQ, rhs.mQ);
+}
+
+inline LLVector4Logical LLVector4a::greaterEqual(const LLVector4a& rhs) const
+{
+ return _mm_cmpge_ps(mQ, rhs.mQ);
+}
+
+inline LLVector4Logical LLVector4a::lessEqual(const LLVector4a& rhs) const
+{
+ return _mm_cmple_ps(mQ, rhs.mQ);
+}
+
+inline LLVector4Logical LLVector4a::equal(const LLVector4a& rhs) const
+{
+ return _mm_cmpeq_ps(mQ, rhs.mQ);
+}
+
+// Returns true if this and rhs are componentwise equal up to the specified absolute tolerance
+inline bool LLVector4a::equals4(const LLVector4a& rhs, F32 tolerance ) const
+{
+ LLVector4a diff; diff.setSub( *this, rhs );
+ diff.setAbs( diff );
+ const LLQuad tol = _mm_set1_ps( tolerance );
+ const LLQuad cmp = _mm_cmplt_ps( diff, tol );
+ return (_mm_movemask_ps( cmp ) & LLVector4Logical::MASK_XYZW) == LLVector4Logical::MASK_XYZW;
+}
+
+inline bool LLVector4a::equals3(const LLVector4a& rhs, F32 tolerance ) const
+{
+ LLVector4a diff; diff.setSub( *this, rhs );
+ diff.setAbs( diff );
+ const LLQuad tol = _mm_set1_ps( tolerance );
+ const LLQuad t = _mm_cmplt_ps( diff, tol );
+ return (_mm_movemask_ps( t ) & LLVector4Logical::MASK_XYZ) == LLVector4Logical::MASK_XYZ;
+
+}
+
+////////////////////////////////////
+// OPERATORS
+////////////////////////////////////
+
+// Do NOT add aditional operators without consulting someone with SSE experience
+inline const LLVector4a& LLVector4a::operator= ( const LLVector4a& rhs )
+{
+ mQ = rhs.mQ;
+ return *this;
+}
+
+inline const LLVector4a& LLVector4a::operator= ( const LLQuad& rhs )
+{
+ mQ = rhs;
+ return *this;
+}
+
+inline LLVector4a::operator LLQuad() const
+{
+ return mQ;
+}
diff --git a/indra/llmath/llvector4logical.h b/indra/llmath/llvector4logical.h
new file mode 100644
index 0000000000..dd66b09d43
--- /dev/null
+++ b/indra/llmath/llvector4logical.h
@@ -0,0 +1,124 @@
+/**
+ * @file llvector4logical.h
+ * @brief LLVector4Logical class header file - Companion class to LLVector4a for logical and bit-twiddling operations
+ *
+ * $LicenseInfo:firstyear=2010&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_VECTOR4LOGICAL_H
+#define LL_VECTOR4LOGICAL_H
+
+
+////////////////////////////
+// LLVector4Logical
+////////////////////////////
+// This class is incomplete. If you need additional functionality,
+// for example setting/unsetting particular elements or performing
+// other boolean operations, feel free to implement. If you need
+// assistance in determining the most optimal implementation,
+// contact someone with SSE experience (Falcon, Richard, Davep, e.g.)
+////////////////////////////
+
+static LL_ALIGN_16(const U32 S_V4LOGICAL_MASK_TABLE[4*4]) =
+{
+ 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFFFFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFFFFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF
+};
+
+class LLVector4Logical
+{
+public:
+
+ enum {
+ MASK_X = 1,
+ MASK_Y = 1 << 1,
+ MASK_Z = 1 << 2,
+ MASK_W = 1 << 3,
+ MASK_XYZ = MASK_X | MASK_Y | MASK_Z,
+ MASK_XYZW = MASK_XYZ | MASK_W
+ };
+
+ // Empty default ctor
+ LLVector4Logical() {}
+
+ LLVector4Logical( const LLQuad& quad )
+ {
+ mQ = quad;
+ }
+
+ // Create and return a mask consisting of the lowest order bit of each element
+ inline U32 getGatheredBits() const
+ {
+ return _mm_movemask_ps(mQ);
+ };
+
+ // Invert this mask
+ inline LLVector4Logical& invert()
+ {
+ static const LL_ALIGN_16(U32 allOnes[4]) = { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF };
+ mQ = _mm_andnot_ps( mQ, *(LLQuad*)(allOnes) );
+ return *this;
+ }
+
+ inline LLBool32 areAllSet( U32 mask ) const
+ {
+ return ( getGatheredBits() & mask) == mask;
+ }
+
+ inline LLBool32 areAllSet() const
+ {
+ return areAllSet( MASK_XYZW );
+ }
+
+ inline LLBool32 areAnySet( U32 mask ) const
+ {
+ return getGatheredBits() & mask;
+ }
+
+ inline LLBool32 areAnySet() const
+ {
+ return areAnySet( MASK_XYZW );
+ }
+
+ inline operator LLQuad() const
+ {
+ return mQ;
+ }
+
+ inline void clear()
+ {
+ mQ = _mm_setzero_ps();
+ }
+
+ template<int N> void setElement()
+ {
+ mQ = _mm_or_ps( mQ, *reinterpret_cast<const LLQuad*>(S_V4LOGICAL_MASK_TABLE + 4*N) );
+ }
+
+private:
+
+ LLQuad mQ;
+};
+
+#endif //LL_VECTOR4ALOGICAL_H
diff --git a/indra/llmath/llvolume.cpp b/indra/llmath/llvolume.cpp
index 71b92962fb..c504215ee5 100644
--- a/indra/llmath/llvolume.cpp
+++ b/indra/llmath/llvolume.cpp
@@ -1,4 +1,5 @@
/**
+
* @file llvolume.cpp
*
* $LicenseInfo:firstyear=2002&license=viewerlgpl$
@@ -24,9 +25,13 @@
*/
#include "linden_common.h"
+#include "llmemory.h"
#include "llmath.h"
#include <set>
+#if !LL_WINDOWS
+#include <stdint.h>
+#endif
#include "llerror.h"
#include "llmemtype.h"
@@ -37,9 +42,16 @@
#include "v4math.h"
#include "m4math.h"
#include "m3math.h"
+#include "llmatrix3a.h"
+#include "lloctree.h"
#include "lldarray.h"
#include "llvolume.h"
+#include "llvolumeoctree.h"
#include "llstl.h"
+#include "llsdserialize.h"
+#include "llvector4a.h"
+#include "llmatrix4a.h"
+#include "lltimer.h"
#define DEBUG_SILHOUETTE_BINORMALS 0
#define DEBUG_SILHOUETTE_NORMALS 0 // TomY: Use this to display normals using the silhouette
@@ -80,7 +92,18 @@ const F32 SKEW_MAX = 0.95f;
const F32 SCULPT_MIN_AREA = 0.002f;
const S32 SCULPT_MIN_AREA_DETAIL = 1;
-#define GEN_TRI_STRIP 0
+extern BOOL gDebugGL;
+
+void assert_aligned(void* ptr, uintptr_t alignment)
+{
+#if 0
+ uintptr_t t = (uintptr_t) ptr;
+ if (t%alignment != 0)
+ {
+ llerrs << "WTF?" << llendl;
+ }
+#endif
+}
BOOL check_same_clock_dir( const LLVector3& pt1, const LLVector3& pt2, const LLVector3& pt3, const LLVector3& norm)
{
@@ -99,128 +122,262 @@ BOOL check_same_clock_dir( const LLVector3& pt1, const LLVector3& pt2, const LLV
BOOL LLLineSegmentBoxIntersect(const LLVector3& start, const LLVector3& end, const LLVector3& center, const LLVector3& size)
{
- float fAWdU[3];
- LLVector3 dir;
- LLVector3 diff;
+ return LLLineSegmentBoxIntersect(start.mV, end.mV, center.mV, size.mV);
+}
+
+BOOL LLLineSegmentBoxIntersect(const F32* start, const F32* end, const F32* center, const F32* size)
+{
+ F32 fAWdU[3];
+ F32 dir[3];
+ F32 diff[3];
for (U32 i = 0; i < 3; i++)
{
- dir.mV[i] = 0.5f * (end.mV[i] - start.mV[i]);
- diff.mV[i] = (0.5f * (end.mV[i] + start.mV[i])) - center.mV[i];
- fAWdU[i] = fabsf(dir.mV[i]);
- if(fabsf(diff.mV[i])>size.mV[i] + fAWdU[i]) return false;
+ dir[i] = 0.5f * (end[i] - start[i]);
+ diff[i] = (0.5f * (end[i] + start[i])) - center[i];
+ fAWdU[i] = fabsf(dir[i]);
+ if(fabsf(diff[i])>size[i] + fAWdU[i]) return false;
}
float f;
- f = dir.mV[1] * diff.mV[2] - dir.mV[2] * diff.mV[1]; if(fabsf(f)>size.mV[1]*fAWdU[2] + size.mV[2]*fAWdU[1]) return false;
- f = dir.mV[2] * diff.mV[0] - dir.mV[0] * diff.mV[2]; if(fabsf(f)>size.mV[0]*fAWdU[2] + size.mV[2]*fAWdU[0]) return false;
- f = dir.mV[0] * diff.mV[1] - dir.mV[1] * diff.mV[0]; if(fabsf(f)>size.mV[0]*fAWdU[1] + size.mV[1]*fAWdU[0]) return false;
+ f = dir[1] * diff[2] - dir[2] * diff[1]; if(fabsf(f)>size[1]*fAWdU[2] + size[2]*fAWdU[1]) return false;
+ f = dir[2] * diff[0] - dir[0] * diff[2]; if(fabsf(f)>size[0]*fAWdU[2] + size[2]*fAWdU[0]) return false;
+ f = dir[0] * diff[1] - dir[1] * diff[0]; if(fabsf(f)>size[0]*fAWdU[1] + size[1]*fAWdU[0]) return false;
return true;
}
+
// intersect test between triangle vert0, vert1, vert2 and a ray from orig in direction dir.
// returns TRUE if intersecting and returns barycentric coordinates in intersection_a, intersection_b,
// and returns the intersection point along dir in intersection_t.
// Moller-Trumbore algorithm
-BOOL LLTriangleRayIntersect(const LLVector3& vert0, const LLVector3& vert1, const LLVector3& vert2, const LLVector3& orig, const LLVector3& dir,
- F32* intersection_a, F32* intersection_b, F32* intersection_t, BOOL two_sided)
+BOOL LLTriangleRayIntersect(const LLVector4a& vert0, const LLVector4a& vert1, const LLVector4a& vert2, const LLVector4a& orig, const LLVector4a& dir,
+ F32& intersection_a, F32& intersection_b, F32& intersection_t)
{
- F32 u, v, t;
/* find vectors for two edges sharing vert0 */
- LLVector3 edge1 = vert1 - vert0;
+ LLVector4a edge1;
+ edge1.setSub(vert1, vert0);
- LLVector3 edge2 = vert2 - vert0;;
+ LLVector4a edge2;
+ edge2.setSub(vert2, vert0);
/* begin calculating determinant - also used to calculate U parameter */
- LLVector3 pvec = dir % edge2;
-
- /* if determinant is near zero, ray lies in plane of triangle */
- F32 det = edge1 * pvec;
+ LLVector4a pvec;
+ pvec.setCross3(dir, edge2);
- if (!two_sided)
+ /* if determinant is near zero, ray lies in plane of triangle */
+ LLVector4a det;
+ det.setAllDot3(edge1, pvec);
+
+ if (det.greaterEqual(LLVector4a::getEpsilon()).getGatheredBits() & 0x7)
{
- if (det < F_APPROXIMATELY_ZERO)
- {
- return FALSE;
- }
-
/* calculate distance from vert0 to ray origin */
- LLVector3 tvec = orig - vert0;
+ LLVector4a tvec;
+ tvec.setSub(orig, vert0);
/* calculate U parameter and test bounds */
- u = tvec * pvec;
+ LLVector4a u;
+ u.setAllDot3(tvec,pvec);
- if (u < 0.f || u > det)
+ if ((u.greaterEqual(LLVector4a::getZero()).getGatheredBits() & 0x7) &&
+ (u.lessEqual(det).getGatheredBits() & 0x7))
{
- return FALSE;
+ /* prepare to test V parameter */
+ LLVector4a qvec;
+ qvec.setCross3(tvec, edge1);
+
+ /* calculate V parameter and test bounds */
+ LLVector4a v;
+ v.setAllDot3(dir, qvec);
+
+
+ //if (!(v < 0.f || u + v > det))
+
+ LLVector4a sum_uv;
+ sum_uv.setAdd(u, v);
+
+ S32 v_gequal = v.greaterEqual(LLVector4a::getZero()).getGatheredBits() & 0x7;
+ S32 sum_lequal = sum_uv.lessEqual(det).getGatheredBits() & 0x7;
+
+ if (v_gequal && sum_lequal)
+ {
+ /* calculate t, scale parameters, ray intersects triangle */
+ LLVector4a t;
+ t.setAllDot3(edge2,qvec);
+
+ t.div(det);
+ u.div(det);
+ v.div(det);
+
+ intersection_a = u[0];
+ intersection_b = v[0];
+ intersection_t = t[0];
+ return TRUE;
+ }
}
-
- /* prepare to test V parameter */
- LLVector3 qvec = tvec % edge1;
+ }
- /* calculate V parameter and test bounds */
- v = dir * qvec;
- if (v < 0.f || u + v > det)
- {
- return FALSE;
- }
+ return FALSE;
+}
- /* calculate t, scale parameters, ray intersects triangle */
- t = edge2 * qvec;
- F32 inv_det = 1.0 / det;
- t *= inv_det;
- u *= inv_det;
- v *= inv_det;
- }
+BOOL LLTriangleRayIntersectTwoSided(const LLVector4a& vert0, const LLVector4a& vert1, const LLVector4a& vert2, const LLVector4a& orig, const LLVector4a& dir,
+ F32& intersection_a, F32& intersection_b, F32& intersection_t)
+{
+ F32 u, v, t;
- else // two sided
- {
- if (det > -F_APPROXIMATELY_ZERO && det < F_APPROXIMATELY_ZERO)
- {
- return FALSE;
- }
- F32 inv_det = 1.0 / det;
+ /* find vectors for two edges sharing vert0 */
+ LLVector4a edge1;
+ edge1.setSub(vert1, vert0);
+
+
+ LLVector4a edge2;
+ edge2.setSub(vert2, vert0);
- /* calculate distance from vert0 to ray origin */
- LLVector3 tvec = orig - vert0;
-
- /* calculate U parameter and test bounds */
- u = (tvec * pvec) * inv_det;
- if (u < 0.f || u > 1.f)
- {
- return FALSE;
- }
+ /* begin calculating determinant - also used to calculate U parameter */
+ LLVector4a pvec;
+ pvec.setCross3(dir, edge2);
- /* prepare to test V parameter */
- LLVector3 qvec = tvec - edge1;
-
- /* calculate V parameter and test bounds */
- v = (dir * qvec) * inv_det;
-
- if (v < 0.f || u + v > 1.f)
- {
- return FALSE;
- }
+ /* if determinant is near zero, ray lies in plane of triangle */
+ F32 det = edge1.dot3(pvec).getF32();
- /* calculate t, ray intersects triangle */
- t = (edge2 * qvec) * inv_det;
+
+ if (det > -F_APPROXIMATELY_ZERO && det < F_APPROXIMATELY_ZERO)
+ {
+ return FALSE;
+ }
+
+ F32 inv_det = 1.f / det;
+
+ /* calculate distance from vert0 to ray origin */
+ LLVector4a tvec;
+ tvec.setSub(orig, vert0);
+
+ /* calculate U parameter and test bounds */
+ u = (tvec.dot3(pvec).getF32()) * inv_det;
+ if (u < 0.f || u > 1.f)
+ {
+ return FALSE;
+ }
+
+ /* prepare to test V parameter */
+ tvec.sub(edge1);
+
+ /* calculate V parameter and test bounds */
+ v = (dir.dot3(tvec).getF32()) * inv_det;
+
+ if (v < 0.f || u + v > 1.f)
+ {
+ return FALSE;
}
+
+ /* calculate t, ray intersects triangle */
+ t = (edge2.dot3(tvec).getF32()) * inv_det;
- if (intersection_a != NULL)
- *intersection_a = u;
- if (intersection_b != NULL)
- *intersection_b = v;
- if (intersection_t != NULL)
- *intersection_t = t;
+ intersection_a = u;
+ intersection_b = v;
+ intersection_t = t;
return TRUE;
}
+//helper for non-aligned vectors
+BOOL LLTriangleRayIntersect(const LLVector3& vert0, const LLVector3& vert1, const LLVector3& vert2, const LLVector3& orig, const LLVector3& dir,
+ F32& intersection_a, F32& intersection_b, F32& intersection_t, BOOL two_sided)
+{
+ LLVector4a vert0a, vert1a, vert2a, origa, dira;
+ vert0a.load3(vert0.mV);
+ vert1a.load3(vert1.mV);
+ vert2a.load3(vert2.mV);
+ origa.load3(orig.mV);
+ dira.load3(dir.mV);
+
+ if (two_sided)
+ {
+ return LLTriangleRayIntersectTwoSided(vert0a, vert1a, vert2a, origa, dira,
+ intersection_a, intersection_b, intersection_t);
+ }
+ else
+ {
+ return LLTriangleRayIntersect(vert0a, vert1a, vert2a, origa, dira,
+ intersection_a, intersection_b, intersection_t);
+ }
+}
+
+class LLVolumeOctreeRebound : public LLOctreeTravelerDepthFirst<LLVolumeTriangle>
+{
+public:
+ const LLVolumeFace* mFace;
+
+ LLVolumeOctreeRebound(const LLVolumeFace* face)
+ {
+ mFace = face;
+ }
+
+ virtual void visit(const LLOctreeNode<LLVolumeTriangle>* branch)
+ { //this is a depth first traversal, so it's safe to assum all children have complete
+ //bounding data
+
+ LLVolumeOctreeListener* node = (LLVolumeOctreeListener*) branch->getListener(0);
+
+ LLVector4a& min = node->mExtents[0];
+ LLVector4a& max = node->mExtents[1];
+
+ if (!branch->getData().empty())
+ { //node has data, find AABB that binds data set
+ const LLVolumeTriangle* tri = *(branch->getData().begin());
+
+ //initialize min/max to first available vertex
+ min = *(tri->mV[0]);
+ max = *(tri->mV[0]);
+
+ for (LLOctreeNode<LLVolumeTriangle>::const_element_iter iter =
+ branch->getData().begin(); iter != branch->getData().end(); ++iter)
+ { //for each triangle in node
+
+ //stretch by triangles in node
+ tri = *iter;
+
+ min.setMin(min, *tri->mV[0]);
+ min.setMin(min, *tri->mV[1]);
+ min.setMin(min, *tri->mV[2]);
+
+ max.setMax(max, *tri->mV[0]);
+ max.setMax(max, *tri->mV[1]);
+ max.setMax(max, *tri->mV[2]);
+ }
+ }
+ else if (!branch->getChildren().empty())
+ { //no data, but child nodes exist
+ LLVolumeOctreeListener* child = (LLVolumeOctreeListener*) branch->getChild(0)->getListener(0);
+
+ //initialize min/max to extents of first child
+ min = child->mExtents[0];
+ max = child->mExtents[1];
+ }
+ else
+ {
+ llerrs << "WTF? Empty leaf" << llendl;
+ }
+
+ for (S32 i = 0; i < branch->getChildCount(); ++i)
+ { //stretch by child extents
+ LLVolumeOctreeListener* child = (LLVolumeOctreeListener*) branch->getChild(i)->getListener(0);
+ min.setMin(min, child->mExtents[0]);
+ max.setMax(max, child->mExtents[1]);
+ }
+
+ node->mBounds[0].setAdd(min, max);
+ node->mBounds[0].mul(0.5f);
+
+ node->mBounds[1].setSub(max,min);
+ node->mBounds[1].mul(0.5f);
+ }
+};
//-------------------------------------------------------------------
// statics
@@ -1669,7 +1826,13 @@ LLVolume::LLVolume(const LLVolumeParams &params, const F32 detail, const BOOL ge
mFaceMask = 0x0;
mDetail = detail;
mSculptLevel = -2;
-
+ mIsTetrahedron = FALSE;
+ mLODScaleBias.setVec(1,1,1);
+ mHullPoints = NULL;
+ mHullIndices = NULL;
+ mNumHullPoints = 0;
+ mNumHullIndices = 0;
+
// set defaults
if (mParams.getPathParams().getCurveType() == LL_PCODE_PATH_FLEXIBLE)
{
@@ -1684,7 +1847,8 @@ LLVolume::LLVolume(const LLVolumeParams &params, const F32 detail, const BOOL ge
mGenerateSingleFace = generate_single_face;
generate();
- if (mParams.getSculptID().isNull() && params.getSculptType() == LL_SCULPT_TYPE_NONE)
+
+ if (mParams.getSculptID().isNull() && mParams.getSculptType() == LL_SCULPT_TYPE_NONE)
{
createVolumeFaces();
}
@@ -1719,6 +1883,11 @@ LLVolume::~LLVolume()
mPathp = NULL;
mProfilep = NULL;
mVolumeFaces.clear();
+
+ ll_aligned_free_16(mHullPoints);
+ mHullPoints = NULL;
+ ll_aligned_free_16(mHullIndices);
+ mHullIndices = NULL;
}
BOOL LLVolume::generate()
@@ -1835,6 +2004,577 @@ BOOL LLVolume::generate()
return FALSE;
}
+void LLVolumeFace::VertexData::init()
+{
+ if (!mData)
+ {
+ mData = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*2);
+ }
+}
+
+LLVolumeFace::VertexData::VertexData()
+{
+ mData = NULL;
+ init();
+}
+
+LLVolumeFace::VertexData::VertexData(const VertexData& rhs)
+{
+ mData = NULL;
+ *this = rhs;
+}
+
+const LLVolumeFace::VertexData& LLVolumeFace::VertexData::operator=(const LLVolumeFace::VertexData& rhs)
+{
+ if (this != &rhs)
+ {
+ init();
+ LLVector4a::memcpyNonAliased16((F32*) mData, (F32*) rhs.mData, 2*sizeof(LLVector4a));
+ mTexCoord = rhs.mTexCoord;
+ }
+ return *this;
+}
+
+LLVolumeFace::VertexData::~VertexData()
+{
+ ll_aligned_free_16(mData);
+ mData = NULL;
+}
+
+LLVector4a& LLVolumeFace::VertexData::getPosition()
+{
+ return mData[POSITION];
+}
+
+LLVector4a& LLVolumeFace::VertexData::getNormal()
+{
+ return mData[NORMAL];
+}
+
+const LLVector4a& LLVolumeFace::VertexData::getPosition() const
+{
+ return mData[POSITION];
+}
+
+const LLVector4a& LLVolumeFace::VertexData::getNormal() const
+{
+ return mData[NORMAL];
+}
+
+
+void LLVolumeFace::VertexData::setPosition(const LLVector4a& pos)
+{
+ mData[POSITION] = pos;
+}
+
+void LLVolumeFace::VertexData::setNormal(const LLVector4a& norm)
+{
+ mData[NORMAL] = norm;
+}
+
+bool LLVolumeFace::VertexData::operator<(const LLVolumeFace::VertexData& rhs)const
+{
+ const F32* lp = this->getPosition().getF32ptr();
+ const F32* rp = rhs.getPosition().getF32ptr();
+
+ if (lp[0] != rp[0])
+ {
+ return lp[0] < rp[0];
+ }
+
+ if (rp[1] != lp[1])
+ {
+ return lp[1] < rp[1];
+ }
+
+ if (rp[2] != lp[2])
+ {
+ return lp[2] < rp[2];
+ }
+
+ lp = getNormal().getF32ptr();
+ rp = rhs.getNormal().getF32ptr();
+
+ if (lp[0] != rp[0])
+ {
+ return lp[0] < rp[0];
+ }
+
+ if (rp[1] != lp[1])
+ {
+ return lp[1] < rp[1];
+ }
+
+ if (rp[2] != lp[2])
+ {
+ return lp[2] < rp[2];
+ }
+
+ if (mTexCoord.mV[0] != rhs.mTexCoord.mV[0])
+ {
+ return mTexCoord.mV[0] < rhs.mTexCoord.mV[0];
+ }
+
+ return mTexCoord.mV[1] < rhs.mTexCoord.mV[1];
+}
+
+bool LLVolumeFace::VertexData::operator==(const LLVolumeFace::VertexData& rhs)const
+{
+ return mData[POSITION].equals3(rhs.getPosition()) &&
+ mData[NORMAL].equals3(rhs.getNormal()) &&
+ mTexCoord == rhs.mTexCoord;
+}
+
+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)
+ {
+ if (angle_cutoff > 1.f)
+ {
+ retval = (mData[NORMAL].equals3(rhs.mData[NORMAL]));
+ }
+ else
+ {
+ F32 cur_angle = rhs.mData[NORMAL].dot3(mData[NORMAL]).getF32();
+ retval = cur_angle > angle_cutoff;
+ }
+ }
+
+ return retval;
+}
+
+bool LLVolume::unpackVolumeFaces(std::istream& is, S32 size)
+{
+ //input stream is now pointing at a zlib compressed block of LLSD
+ //decompress block
+ LLSD mdl;
+ if (!unzip_llsd(mdl, is, size))
+ {
+ llwarns << "not a valid mesh asset!" << llendl;
+ return false;
+ }
+
+ {
+ U32 face_count = mdl.size();
+
+ if (face_count == 0)
+ {
+ llerrs << "WTF?" << llendl;
+ }
+
+ mVolumeFaces.resize(face_count);
+
+ for (U32 i = 0; i < face_count; ++i)
+ {
+ LLSD::Binary pos = mdl[i]["Position"];
+ LLSD::Binary norm = mdl[i]["Normal"];
+ LLSD::Binary tc = mdl[i]["TexCoord0"];
+ LLSD::Binary idx = mdl[i]["TriangleList"];
+
+ LLVolumeFace& face = mVolumeFaces[i];
+
+ //copy out indices
+ face.resizeIndices(idx.size()/2);
+
+ if (idx.empty() || face.mNumIndices < 3)
+ { //why is there an empty index list?
+ llerrs <<"WTF?" << llendl;
+ continue;
+ }
+
+ U16* indices = (U16*) &(idx[0]);
+ U32 count = idx.size()/2;
+ for (U32 j = 0; j < count; ++j)
+ {
+ face.mIndices[j] = indices[j];
+ }
+
+ //copy out vertices
+ U32 num_verts = pos.size()/(3*2);
+ face.resizeVertices(num_verts);
+
+ LLVector3 minp;
+ LLVector3 maxp;
+ LLVector2 min_tc;
+ LLVector2 max_tc;
+
+ minp.setValue(mdl[i]["PositionDomain"]["Min"]);
+ maxp.setValue(mdl[i]["PositionDomain"]["Max"]);
+ LLVector4a min_pos, max_pos;
+ min_pos.load3(minp.mV);
+ max_pos.load3(maxp.mV);
+
+ min_tc.setValue(mdl[i]["TexCoord0Domain"]["Min"]);
+ max_tc.setValue(mdl[i]["TexCoord0Domain"]["Max"]);
+
+ LLVector4a pos_range;
+ pos_range.setSub(max_pos, min_pos);
+ LLVector2 tc_range2 = max_tc - min_tc;
+ LLVector4a tc_range;
+ tc_range.set(tc_range2[0], tc_range2[1], tc_range2[0], tc_range2[1]);
+ LLVector4a min_tc4(min_tc[0], min_tc[1], min_tc[0], min_tc[1]);
+
+ LLVector4a* pos_out = face.mPositions;
+ LLVector4a* norm_out = face.mNormals;
+ LLVector4a* tc_out = (LLVector4a*) face.mTexCoords;
+
+ {
+ U16* v = (U16*) &(pos[0]);
+ for (U32 j = 0; j < num_verts; ++j)
+ {
+ pos_out->set((F32) v[0], (F32) v[1], (F32) v[2]);
+ pos_out->div(65535.f);
+ pos_out->mul(pos_range);
+ pos_out->add(min_pos);
+ pos_out++;
+ v += 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;
+ }
+ }
+
+ {
+ U16* t = (U16*) &(tc[0]);
+ for (U32 j = 0; j < num_verts; j+=2)
+ {
+ 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;
+
+ tc_out->div(65535.f);
+ tc_out->mul(tc_range);
+ tc_out->add(min_tc4);
+
+ tc_out++;
+ }
+ }
+
+ if (mdl[i].has("Weights"))
+ {
+ face.allocateWeights(num_verts);
+
+ LLSD::Binary weights = mdl[i]["Weights"];
+
+ U32 idx = 0;
+
+ U32 cur_vertex = 0;
+ while (idx < weights.size() && cur_vertex < num_verts)
+ {
+ const U8 END_INFLUENCES = 0xFF;
+ U8 joint = weights[idx++];
+
+ U32 cur_influence = 0;
+ LLVector4 wght(0,0,0,0);
+
+ while (joint != END_INFLUENCES && idx < weights.size())
+ {
+ U16 influence = weights[idx++];
+ influence |= ((U16) weights[idx++] << 8);
+
+ F32 w = llclamp((F32) influence / 65535.f, 0.f, 0.99999f);
+ wght.mV[cur_influence++] = (F32) joint + w;
+
+ if (cur_influence >= 4)
+ {
+ joint = END_INFLUENCES;
+ }
+ else
+ {
+ joint = weights[idx++];
+ }
+ }
+
+ face.mWeights[cur_vertex].loadua(wght.mV);
+
+ cur_vertex++;
+ }
+
+ if (cur_vertex != num_verts || idx != weights.size())
+ {
+ llwarns << "Vertex weight count does not match vertex count!" << llendl;
+ }
+
+ }
+
+ // modifier flags?
+ bool do_mirror = (mParams.getSculptType() & LL_SCULPT_FLAG_MIRROR);
+ bool do_invert = (mParams.getSculptType() &LL_SCULPT_FLAG_INVERT);
+
+
+ // translate to actions:
+ bool do_reflect_x = false;
+ bool do_reverse_triangles = false;
+ bool do_invert_normals = false;
+
+ if (do_mirror)
+ {
+ do_reflect_x = true;
+ do_reverse_triangles = !do_reverse_triangles;
+ }
+
+ if (do_invert)
+ {
+ do_invert_normals = true;
+ do_reverse_triangles = !do_reverse_triangles;
+ }
+
+ // now do the work
+
+ if (do_reflect_x)
+ {
+ LLVector4a* p = (LLVector4a*) face.mPositions;
+ LLVector4a* n = (LLVector4a*) face.mNormals;
+
+ for (S32 i = 0; i < face.mNumVertices; i++)
+ {
+ p[i].mul(-1.0f);
+ n[i].mul(-1.0f);
+ }
+ }
+
+ if (do_invert_normals)
+ {
+ LLVector4a* n = (LLVector4a*) face.mNormals;
+
+ for (S32 i = 0; i < face.mNumVertices; i++)
+ {
+ n[i].mul(-1.0f);
+ }
+ }
+
+ if (do_reverse_triangles)
+ {
+ for (U32 j = 0; j < face.mNumIndices; j += 3)
+ {
+ // swap the 2nd and 3rd index
+ S32 swap = face.mIndices[j+1];
+ face.mIndices[j+1] = face.mIndices[j+2];
+ face.mIndices[j+2] = swap;
+ }
+ }
+
+ //calculate bounding box
+ 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)
+ {
+ min.setMin(min, face.mPositions[i]);
+ max.setMax(max, face.mPositions[i]);
+ }
+ }
+ }
+
+ mSculptLevel = 0; // success!
+
+ cacheOptimize();
+
+ return true;
+}
+
+void tetrahedron_set_normal(LLVolumeFace::VertexData* cv)
+{
+ LLVector4a v0;
+ v0.setSub(cv[1].getPosition(), cv[0].getNormal());
+ LLVector4a v1;
+ v1.setSub(cv[2].getNormal(), cv[0].getPosition());
+
+ cv[0].getNormal().setCross3(v0,v1);
+ cv[0].getNormal().normalize3fast();
+ cv[1].setNormal(cv[0].getNormal());
+ cv[2].setNormal(cv[1].getNormal());
+}
+
+BOOL LLVolume::isTetrahedron()
+{
+ return mIsTetrahedron;
+}
+
+void LLVolume::makeTetrahedron()
+{
+ mVolumeFaces.clear();
+
+ LLVolumeFace face;
+
+ F32 x = 0.25f;
+ LLVector4a p[] =
+ { //unit tetrahedron corners
+ LLVector4a(x,x,x),
+ LLVector4a(-x,-x,x),
+ LLVector4a(-x,x,-x),
+ LLVector4a(x,-x,-x)
+ };
+
+ face.mExtents[0].splat(-x);
+ face.mExtents[1].splat(x);
+
+ LLVolumeFace::VertexData cv[3];
+
+ //set texture coordinates
+ cv[0].mTexCoord = LLVector2(0,0);
+ cv[1].mTexCoord = LLVector2(1,0);
+ cv[2].mTexCoord = LLVector2(0.5f, 0.5f*F_SQRT3);
+
+
+ //side 1
+ cv[0].setPosition(p[1]);
+ cv[1].setPosition(p[0]);
+ cv[2].setPosition(p[2]);
+
+ tetrahedron_set_normal(cv);
+
+ face.resizeVertices(12);
+ face.resizeIndices(12);
+
+ LLVector4a* v = (LLVector4a*) face.mPositions;
+ LLVector4a* n = (LLVector4a*) face.mNormals;
+ LLVector2* tc = (LLVector2*) face.mTexCoords;
+
+ v[0] = cv[0].getPosition();
+ v[1] = cv[1].getPosition();
+ v[2] = cv[2].getPosition();
+ v += 3;
+
+ n[0] = cv[0].getNormal();
+ n[1] = cv[1].getNormal();
+ n[2] = cv[2].getNormal();
+ n += 3;
+
+ tc[0] = cv[0].mTexCoord;
+ tc[1] = cv[1].mTexCoord;
+ tc[2] = cv[2].mTexCoord;
+ tc += 3;
+
+
+ //side 2
+ cv[0].setPosition(p[3]);
+ cv[1].setPosition(p[0]);
+ cv[2].setPosition(p[1]);
+
+ tetrahedron_set_normal(cv);
+
+ v[0] = cv[0].getPosition();
+ v[1] = cv[1].getPosition();
+ v[2] = cv[2].getPosition();
+ v += 3;
+
+ n[0] = cv[0].getNormal();
+ n[1] = cv[1].getNormal();
+ n[2] = cv[2].getNormal();
+ n += 3;
+
+ 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]);
+ cv[2].setPosition(p[2]);
+
+ tetrahedron_set_normal(cv);
+
+ v[0] = cv[0].getPosition();
+ v[1] = cv[1].getPosition();
+ v[2] = cv[2].getPosition();
+ v += 3;
+
+ n[0] = cv[0].getNormal();
+ n[1] = cv[1].getNormal();
+ n[2] = cv[2].getNormal();
+ n += 3;
+
+ tc[0] = cv[0].mTexCoord;
+ tc[1] = cv[1].mTexCoord;
+ tc[2] = cv[2].mTexCoord;
+ tc += 3;
+
+ //side 4
+ cv[0].setPosition(p[2]);
+ cv[1].setPosition(p[0]);
+ cv[2].setPosition(p[3]);
+
+ tetrahedron_set_normal(cv);
+
+ v[0] = cv[0].getPosition();
+ v[1] = cv[1].getPosition();
+ v[2] = cv[2].getPosition();
+ v += 3;
+
+ n[0] = cv[0].getNormal();
+ n[1] = cv[1].getNormal();
+ n[2] = cv[2].getNormal();
+ n += 3;
+
+ 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++)
+ {
+ face.mIndices[i] = i;
+ }
+
+ mVolumeFaces.push_back(face);
+ mSculptLevel = 0;
+ mIsTetrahedron = TRUE;
+}
+
+void LLVolume::copyVolumeFaces(const LLVolume* volume)
+{
+ mVolumeFaces = volume->mVolumeFaces;
+ mSculptLevel = 0;
+ mIsTetrahedron = FALSE;
+}
+
+void LLVolume::cacheOptimize()
+{
+ for (S32 i = 0; i < mVolumeFaces.size(); ++i)
+ {
+ mVolumeFaces[i].cacheOptimize();
+ }
+}
+
+
+S32 LLVolume::getNumFaces() const
+{
+ U8 sculpt_type = (mParams.getSculptType() & LL_SCULPT_TYPE_MASK);
+
+ if (sculpt_type == LL_SCULPT_TYPE_MESH)
+ {
+ return LL_SCULPT_MESH_MAX_FACES;
+ }
+
+ return (S32)mProfilep->mFaces.size();
+}
+
void LLVolume::createVolumeFaces()
{
@@ -2188,7 +2928,7 @@ void sculpt_calc_mesh_resolution(U16 width, U16 height, U8 type, F32 detail, S32
ratio = (F32) width / (F32) height;
- s = (S32)fsqrtf(((F32)vertices / ratio));
+ s = (S32)(F32) sqrt(((F32)vertices / ratio));
s = llmax(s, 4); // no degenerate sizes, please
t = vertices / s;
@@ -2281,6 +3021,16 @@ BOOL LLVolume::isFlat(S32 face)
}
+bool LLVolumeParams::isSculpt() const
+{
+ return mSculptID.notNull();
+}
+
+bool LLVolumeParams::isMeshSculpt() const
+{
+ return isSculpt() && ((mSculptType & LL_SCULPT_TYPE_MASK) == LL_SCULPT_TYPE_MESH);
+}
+
bool LLVolumeParams::operator==(const LLVolumeParams &params) const
{
return ( (getPathParams() == params.getPathParams()) &&
@@ -2314,7 +3064,6 @@ bool LLVolumeParams::operator<(const LLVolumeParams &params) const
return mSculptID < params.mSculptID;
}
-
return mSculptType < params.mSculptType;
@@ -3372,34 +4121,62 @@ S32 LLVolume::getNumTriangleIndices() const
return count;
}
+
+S32 LLVolume::getNumTriangles() const
+{
+ U32 triangle_count = 0;
+
+ for (S32 i = 0; i < getNumVolumeFaces(); ++i)
+ {
+ triangle_count += getVolumeFace(i).mNumIndices/3;
+ }
+
+ return triangle_count;
+}
+
+
//-----------------------------------------------------------------------------
// generateSilhouetteVertices()
//-----------------------------------------------------------------------------
void LLVolume::generateSilhouetteVertices(std::vector<LLVector3> &vertices,
std::vector<LLVector3> &normals,
- std::vector<S32> &segments,
- const LLVector3& obj_cam_vec,
- const LLMatrix4& mat,
- const LLMatrix3& norm_mat,
+ const LLVector3& obj_cam_vec_in,
+ const LLMatrix4& mat_in,
+ const LLMatrix3& norm_mat_in,
S32 face_mask)
{
LLMemType m1(LLMemType::MTYPE_VOLUME);
-
+
+ LLMatrix4a mat;
+ mat.loadu(mat_in);
+
+ LLMatrix4a norm_mat;
+ norm_mat.loadu(norm_mat_in);
+
+ LLVector4a obj_cam_vec;
+ obj_cam_vec.load3(obj_cam_vec_in.mV);
+
vertices.clear();
normals.clear();
- segments.clear();
+ if ((mParams.getSculptType() & LL_SCULPT_TYPE_MASK) == LL_SCULPT_TYPE_MESH)
+ {
+ return;
+ }
+
S32 cur_index = 0;
//for each face
for (face_list_t::iterator iter = mVolumeFaces.begin();
iter != mVolumeFaces.end(); ++iter)
{
- const LLVolumeFace& face = *iter;
+ LLVolumeFace& face = *iter;
- if (!(face_mask & (0x1 << cur_index++)))
+ if (!(face_mask & (0x1 << cur_index++)) ||
+ face.mNumIndices == 0 || face.mEdge.empty())
{
continue;
}
+
if (face.mTypeMask & (LLVolumeFace::CAP_MASK)) {
}
@@ -3412,7 +4189,7 @@ void LLVolume::generateSilhouetteVertices(std::vector<LLVector3> &vertices,
#if DEBUG_SILHOUETTE_EDGE_MAP
//for each triangle
- U32 count = face.mIndices.size();
+ U32 count = face.mNumIndices;
for (U32 j = 0; j < count/3; j++) {
//get vertices
S32 v1 = face.mIndices[j*3+0];
@@ -3420,9 +4197,9 @@ void LLVolume::generateSilhouetteVertices(std::vector<LLVector3> &vertices,
S32 v3 = face.mIndices[j*3+2];
//get current face center
- LLVector3 cCenter = (face.mVertices[v1].mPosition +
- face.mVertices[v2].mPosition +
- face.mVertices[v3].mPosition) / 3.0f;
+ LLVector3 cCenter = (face.mVertices[v1].getPosition() +
+ face.mVertices[v2].getPosition() +
+ face.mVertices[v3].getPosition()) / 3.0f;
//for each edge
for (S32 k = 0; k < 3; k++) {
@@ -3440,9 +4217,9 @@ void LLVolume::generateSilhouetteVertices(std::vector<LLVector3> &vertices,
v3 = face.mIndices[nIndex*3+2];
//get neighbor face center
- LLVector3 nCenter = (face.mVertices[v1].mPosition +
- face.mVertices[v2].mPosition +
- face.mVertices[v3].mPosition) / 3.0f;
+ LLVector3 nCenter = (face.mVertices[v1].getPosition() +
+ face.mVertices[v2].getPosition() +
+ face.mVertices[v3].getPosition()) / 3.0f;
//draw line
vertices.push_back(cCenter);
@@ -3465,15 +4242,15 @@ void LLVolume::generateSilhouetteVertices(std::vector<LLVector3> &vertices,
#elif DEBUG_SILHOUETTE_NORMALS
//for each vertex
- for (U32 j = 0; j < face.mVertices.size(); j++) {
- vertices.push_back(face.mVertices[j].mPosition);
- vertices.push_back(face.mVertices[j].mPosition + face.mVertices[j].mNormal*0.1f);
+ for (U32 j = 0; j < face.mNumVertices; j++) {
+ vertices.push_back(face.mVertices[j].getPosition());
+ vertices.push_back(face.mVertices[j].getPosition() + face.mVertices[j].getNormal()*0.1f);
normals.push_back(LLVector3(0,0,1));
normals.push_back(LLVector3(0,0,1));
segments.push_back(vertices.size());
#if DEBUG_SILHOUETTE_BINORMALS
- vertices.push_back(face.mVertices[j].mPosition);
- vertices.push_back(face.mVertices[j].mPosition + face.mVertices[j].mBinormal*0.1f);
+ vertices.push_back(face.mVertices[j].getPosition());
+ vertices.push_back(face.mVertices[j].getPosition() + face.mVertices[j].mBinormal*0.1f);
normals.push_back(LLVector3(0,0,1));
normals.push_back(LLVector3(0,0,1));
segments.push_back(vertices.size());
@@ -3491,26 +4268,36 @@ void LLVolume::generateSilhouetteVertices(std::vector<LLVector3> &vertices,
//for each triangle
std::vector<U8> fFacing;
- vector_append(fFacing, face.mIndices.size()/3);
- for (U32 j = 0; j < face.mIndices.size()/3; j++)
+ vector_append(fFacing, face.mNumIndices/3);
+
+ LLVector4a* v = (LLVector4a*) face.mPositions;
+ LLVector4a* n = (LLVector4a*) face.mNormals;
+
+ for (U32 j = 0; j < face.mNumIndices/3; j++)
{
//approximate normal
S32 v1 = face.mIndices[j*3+0];
S32 v2 = face.mIndices[j*3+1];
S32 v3 = face.mIndices[j*3+2];
- LLVector3 norm = (face.mVertices[v1].mPosition - face.mVertices[v2].mPosition) %
- (face.mVertices[v2].mPosition - face.mVertices[v3].mPosition);
-
- if (norm.magVecSquared() < 0.00000001f)
+ LLVector4a c1,c2;
+ c1.setSub(v[v1], v[v2]);
+ c2.setSub(v[v2], v[v3]);
+
+ LLVector4a norm;
+
+ norm.setCross3(c1, c2);
+
+ if (norm.dot3(norm) < 0.00000001f)
{
fFacing[j] = AWAY | TOWARDS;
}
else
{
//get view vector
- LLVector3 view = (obj_cam_vec-face.mVertices[v1].mPosition);
- bool away = view * norm > 0.0f;
+ LLVector4a view;
+ view.setSub(obj_cam_vec, v[v1]);
+ bool away = view.dot3(norm) > 0.0f;
if (away)
{
fFacing[j] = AWAY;
@@ -3523,7 +4310,7 @@ void LLVolume::generateSilhouetteVertices(std::vector<LLVector3> &vertices,
}
//for each triangle
- for (U32 j = 0; j < face.mIndices.size()/3; j++)
+ for (U32 j = 0; j < face.mNumIndices/3; j++)
{
if (fFacing[j] == (AWAY | TOWARDS))
{ //this is a degenerate triangle
@@ -3556,17 +4343,21 @@ void LLVolume::generateSilhouetteVertices(std::vector<LLVector3> &vertices,
S32 v1 = face.mIndices[j*3+k];
S32 v2 = face.mIndices[j*3+((k+1)%3)];
- vertices.push_back(face.mVertices[v1].mPosition*mat);
- LLVector3 norm1 = face.mVertices[v1].mNormal * norm_mat;
- norm1.normVec();
- normals.push_back(norm1);
+ LLVector4a t;
+ mat.affineTransform(v[v1], t);
+ vertices.push_back(LLVector3(t[0], t[1], t[2]));
- vertices.push_back(face.mVertices[v2].mPosition*mat);
- LLVector3 norm2 = face.mVertices[v2].mNormal * norm_mat;
- norm2.normVec();
- normals.push_back(norm2);
+ norm_mat.rotate(n[v1], t);
- segments.push_back(vertices.size());
+ t.normalize3fast();
+ normals.push_back(LLVector3(t[0], t[1], t[2]));
+
+ mat.affineTransform(v[v2], t);
+ vertices.push_back(LLVector3(t[0], t[1], t[2]));
+
+ norm_mat.rotate(n[v2], t);
+ t.normalize3fast();
+ normals.push_back(LLVector3(t[0], t[1], t[2]));
}
}
}
@@ -3579,6 +4370,19 @@ S32 LLVolume::lineSegmentIntersect(const LLVector3& start, const LLVector3& end,
S32 face,
LLVector3* intersection,LLVector2* tex_coord, LLVector3* normal, LLVector3* bi_normal)
{
+ LLVector4a starta, enda;
+ starta.load3(start.mV);
+ enda.load3(end.mV);
+
+ return lineSegmentIntersect(starta, enda, face, intersection, tex_coord, normal, bi_normal);
+
+}
+
+
+S32 LLVolume::lineSegmentIntersect(const LLVector4a& start, const LLVector4a& end,
+ S32 face,
+ LLVector3* intersection,LLVector2* tex_coord, LLVector3* normal, LLVector3* bi_normal)
+{
S32 hit_face = -1;
S32 start_face;
@@ -3595,16 +4399,23 @@ S32 LLVolume::lineSegmentIntersect(const LLVector3& start, const LLVector3& end,
end_face = face;
}
- LLVector3 dir = end - start;
+ LLVector4a dir;
+ dir.setSub(end, start);
F32 closest_t = 2.f; // must be larger than 1
+ end_face = llmin(end_face, getNumVolumeFaces()-1);
+
for (S32 i = start_face; i <= end_face; i++)
{
- const LLVolumeFace &face = getVolumeFace((U32)i);
+ LLVolumeFace &face = mVolumeFaces[i];
+
+ LLVector4a box_center;
+ box_center.setAdd(face.mExtents[0], face.mExtents[1]);
+ box_center.mul(0.5f);
- LLVector3 box_center = (face.mExtents[0] + face.mExtents[1]) / 2.f;
- LLVector3 box_size = face.mExtents[1] - face.mExtents[0];
+ LLVector4a box_size;
+ box_size.setSub(face.mExtents[1], face.mExtents[0]);
if (LLLineSegmentBoxIntersect(start, end, box_center, box_size))
{
@@ -3612,56 +4423,19 @@ S32 LLVolume::lineSegmentIntersect(const LLVector3& start, const LLVector3& end,
{
genBinormals(i);
}
-
- for (U32 tri = 0; tri < face.mIndices.size()/3; tri++)
- {
- S32 index1 = face.mIndices[tri*3+0];
- S32 index2 = face.mIndices[tri*3+1];
- S32 index3 = face.mIndices[tri*3+2];
- F32 a, b, t;
+ if (!face.mOctree)
+ {
+ face.createOctree();
+ }
- if (LLTriangleRayIntersect(face.mVertices[index1].mPosition,
- face.mVertices[index2].mPosition,
- face.mVertices[index3].mPosition,
- start, dir, &a, &b, &t, FALSE))
- {
- if ((t >= 0.f) && // if hit is after start
- (t <= 1.f) && // and before end
- (t < closest_t)) // and this hit is closer
- {
- closest_t = t;
- hit_face = i;
+ //LLVector4a* p = (LLVector4a*) face.mPositions;
- if (intersection != NULL)
- {
- *intersection = start + dir * closest_t;
- }
-
- if (tex_coord != NULL)
+ LLOctreeTriangleRayIntersect intersect(start, dir, &face, &closest_t, intersection, tex_coord, normal, bi_normal);
+ intersect.traverse(face.mOctree);
+ if (intersect.mHitFace)
{
- *tex_coord = ((1.f - a - b) * face.mVertices[index1].mTexCoord +
- a * face.mVertices[index2].mTexCoord +
- b * face.mVertices[index3].mTexCoord);
-
- }
-
- if (normal != NULL)
- {
- *normal = ((1.f - a - b) * face.mVertices[index1].mNormal +
- a * face.mVertices[index2].mNormal +
- b * face.mVertices[index3].mNormal);
- }
-
- if (bi_normal != NULL)
- {
- *bi_normal = ((1.f - a - b) * face.mVertices[index1].mBinormal +
- a * face.mVertices[index2].mBinormal +
- b * face.mVertices[index3].mBinormal);
- }
-
- }
- }
+ hit_face = i;
}
}
}
@@ -4109,11 +4883,28 @@ BOOL LLVolumeParams::exportLegacyStream(std::ostream& output_stream) const
return TRUE;
}
+LLSD LLVolumeParams::sculptAsLLSD() const
+{
+ LLSD sd = LLSD();
+ sd["id"] = getSculptID();
+ sd["type"] = getSculptType();
+
+ return sd;
+}
+
+bool LLVolumeParams::sculptFromLLSD(LLSD& sd)
+{
+ setSculptID(sd["id"].asUUID(), (U8)sd["type"].asInteger());
+ return true;
+}
+
LLSD LLVolumeParams::asLLSD() const
{
LLSD sd = LLSD();
sd["path"] = mPathParams;
sd["profile"] = mProfileParams;
+ sd["sculpt"] = sculptAsLLSD();
+
return sd;
}
@@ -4121,6 +4912,8 @@ bool LLVolumeParams::fromLLSD(LLSD& sd)
{
mPathParams.fromLLSD(sd["path"]);
mProfileParams.fromLLSD(sd["profile"]);
+ sculptFromLLSD(sd["sculpt"]);
+
return true;
}
@@ -4163,6 +4956,12 @@ const F32 MIN_CONCAVE_PATH_WEDGE = 0.111111f; // 1/9 unity
// for collison purposes
BOOL LLVolumeParams::isConvex() const
{
+ if (!getSculptID().isNull())
+ {
+ // can't determine, be safe and say no:
+ return FALSE;
+ }
+
F32 path_length = mPathParams.getEnd() - mPathParams.getBegin();
F32 hollow = mProfileParams.getHollow();
@@ -4403,9 +5202,154 @@ std::ostream& operator<<(std::ostream &s, const LLVolume *volumep)
return s;
}
+LLVolumeFace::LLVolumeFace() :
+ mID(0),
+ mTypeMask(0),
+ mBeginS(0),
+ mBeginT(0),
+ mNumS(0),
+ mNumT(0),
+ mNumVertices(0),
+ mNumIndices(0),
+ mPositions(NULL),
+ mNormals(NULL),
+ mBinormals(NULL),
+ mTexCoords(NULL),
+ mIndices(NULL),
+ mWeights(NULL),
+ mOctree(NULL)
+{
+ mExtents = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*3);
+ mCenter = mExtents+2;
+}
+
+LLVolumeFace::LLVolumeFace(const LLVolumeFace& src)
+: mID(0),
+ mTypeMask(0),
+ mBeginS(0),
+ mBeginT(0),
+ mNumS(0),
+ mNumT(0),
+ mNumVertices(0),
+ mNumIndices(0),
+ mPositions(NULL),
+ mNormals(NULL),
+ mBinormals(NULL),
+ mTexCoords(NULL),
+ mIndices(NULL),
+ mWeights(NULL),
+ mOctree(NULL)
+{
+ mExtents = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*3);
+ mCenter = mExtents+2;
+ *this = src;
+}
+
+LLVolumeFace& LLVolumeFace::operator=(const LLVolumeFace& src)
+{
+ if (&src == this)
+ { //self assignment, do nothing
+ return *this;
+ }
+
+ mID = src.mID;
+ mTypeMask = src.mTypeMask;
+ mBeginS = src.mBeginS;
+ mBeginT = src.mBeginT;
+ mNumS = src.mNumS;
+ mNumT = src.mNumT;
+
+ mExtents[0] = src.mExtents[0];
+ mExtents[1] = src.mExtents[1];
+ *mCenter = *src.mCenter;
+
+ mNumVertices = 0;
+ mNumIndices = 0;
+
+ freeData();
+
+ LLVector4a::memcpyNonAliased16((F32*) mExtents, (F32*) src.mExtents, 3*sizeof(LLVector4a));
+
+ resizeVertices(src.mNumVertices);
+ resizeIndices(src.mNumIndices);
+
+ if (mNumVertices)
+ {
+ S32 vert_size = mNumVertices*sizeof(LLVector4a);
+ S32 tc_size = (mNumVertices*sizeof(LLVector2)+0xF) & ~0xF;
+
+ 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.mBinormals)
+ {
+ allocateBinormals(src.mNumVertices);
+ LLVector4a::memcpyNonAliased16((F32*) mBinormals, (F32*) src.mBinormals, vert_size);
+ }
+ else
+ {
+ ll_aligned_free_16(mBinormals);
+ mBinormals = NULL;
+ }
+
+ if (src.mWeights)
+ {
+ allocateWeights(src.mNumVertices);
+ LLVector4a::memcpyNonAliased16((F32*) mWeights, (F32*) src.mWeights, vert_size);
+ }
+ else
+ {
+ ll_aligned_free_16(mWeights);
+ mWeights = NULL;
+ }
+ }
+
+ if (mNumIndices)
+ {
+ S32 idx_size = (mNumIndices*sizeof(U16)+0xF) & ~0xF;
+
+ LLVector4a::memcpyNonAliased16((F32*) mIndices, (F32*) src.mIndices, idx_size);
+ }
+
+ //delete
+ return *this;
+}
+
+LLVolumeFace::~LLVolumeFace()
+{
+ ll_aligned_free_16(mExtents);
+ mExtents = NULL;
+
+ freeData();
+}
+
+void LLVolumeFace::freeData()
+{
+ ll_aligned_free_16(mPositions);
+ mPositions = NULL;
+ ll_aligned_free_16( mNormals);
+ mNormals = NULL;
+ ll_aligned_free_16(mTexCoords);
+ mTexCoords = NULL;
+ ll_aligned_free_16(mIndices);
+ mIndices = NULL;
+ ll_aligned_free_16(mBinormals);
+ mBinormals = NULL;
+ ll_aligned_free_16(mWeights);
+ mWeights = NULL;
+
+ delete mOctree;
+ mOctree = NULL;
+}
BOOL LLVolumeFace::create(LLVolume* volume, BOOL partial_build)
{
+ //tree for this face is no longer valid
+ delete mOctree;
+ mOctree = NULL;
+
BOOL ret = FALSE ;
if (mTypeMask & CAP_MASK)
{
@@ -4426,25 +5370,24 @@ BOOL LLVolumeFace::create(LLVolume* volume, BOOL partial_build)
mTexCoordExtents[0].setVec(1.f, 1.f) ;
mTexCoordExtents[1].setVec(0.f, 0.f) ;
- U32 end = mVertices.size() ;
- for(U32 i = 0 ; i < end ; i++)
+ for(U32 i = 0 ; i < mNumVertices ; i++)
{
- if(mTexCoordExtents[0].mV[0] > mVertices[i].mTexCoord.mV[0])
+ if(mTexCoordExtents[0].mV[0] > mTexCoords[i].mV[0])
{
- mTexCoordExtents[0].mV[0] = mVertices[i].mTexCoord.mV[0] ;
+ mTexCoordExtents[0].mV[0] = mTexCoords[i].mV[0] ;
}
- if(mTexCoordExtents[1].mV[0] < mVertices[i].mTexCoord.mV[0])
+ if(mTexCoordExtents[1].mV[0] < mTexCoords[i].mV[0])
{
- mTexCoordExtents[1].mV[0] = mVertices[i].mTexCoord.mV[0] ;
+ mTexCoordExtents[1].mV[0] = mTexCoords[i].mV[0] ;
}
- if(mTexCoordExtents[0].mV[1] > mVertices[i].mTexCoord.mV[1])
+ if(mTexCoordExtents[0].mV[1] > mTexCoords[i].mV[1])
{
- mTexCoordExtents[0].mV[1] = mVertices[i].mTexCoord.mV[1] ;
+ mTexCoordExtents[0].mV[1] = mTexCoords[i].mV[1] ;
}
- if(mTexCoordExtents[1].mV[1] < mVertices[i].mTexCoord.mV[1])
+ if(mTexCoordExtents[1].mV[1] < mTexCoords[i].mV[1])
{
- mTexCoordExtents[1].mV[1] = mVertices[i].mTexCoord.mV[1] ;
+ mTexCoordExtents[1].mV[1] = mTexCoords[i].mV[1] ;
}
}
mTexCoordExtents[0].mV[0] = llmax(0.f, mTexCoordExtents[0].mV[0]) ;
@@ -4456,6 +5399,610 @@ BOOL LLVolumeFace::create(LLVolume* volume, BOOL partial_build)
return ret ;
}
+void LLVolumeFace::getVertexData(U16 index, LLVolumeFace::VertexData& cv)
+{
+ cv.setPosition(mPositions[index]);
+ cv.setNormal(mNormals[index]);
+ cv.mTexCoord = mTexCoords[index];
+}
+
+bool LLVolumeFace::VertexMapData::operator==(const LLVolumeFace::VertexData& rhs) const
+{
+ return getPosition().equals3(rhs.getPosition()) &&
+ mTexCoord == rhs.mTexCoord &&
+ getNormal().equals3(rhs.getNormal());
+}
+
+bool LLVolumeFace::VertexMapData::ComparePosition::operator()(const LLVector3& a, const LLVector3& b) const
+{
+ if (a.mV[0] != b.mV[0])
+ {
+ return a.mV[0] < b.mV[0];
+ }
+
+ if (a.mV[1] != b.mV[1])
+ {
+ return a.mV[1] < b.mV[1];
+ }
+
+ return a.mV[2] < b.mV[2];
+}
+
+void LLVolumeFace::optimize(F32 angle_cutoff)
+{
+ LLVolumeFace new_face;
+
+ //map of points to vector of vertices at that point
+ VertexMapData::PointMap point_map;
+
+ //remove redundant vertices
+ for (U32 i = 0; i < mNumIndices; ++i)
+ {
+ U16 index = mIndices[i];
+
+ LLVolumeFace::VertexData cv;
+ getVertexData(index, cv);
+
+ BOOL found = FALSE;
+ VertexMapData::PointMap::iterator point_iter = point_map.find(LLVector3(cv.getPosition().getF32ptr()));
+ if (point_iter != point_map.end())
+ { //duplicate point might exist
+ for (U32 j = 0; j < point_iter->second.size(); ++j)
+ {
+ LLVolumeFace::VertexData& tv = (point_iter->second)[j];
+ if (tv.compareNormal(cv, angle_cutoff))
+ {
+ found = TRUE;
+ new_face.pushIndex((point_iter->second)[j].mIndex);
+ break;
+ }
+ }
+ }
+
+ if (!found)
+ {
+ new_face.pushVertex(cv);
+ U16 index = (U16) new_face.mNumVertices-1;
+ new_face.pushIndex(index);
+
+ VertexMapData d;
+ d.setPosition(cv.getPosition());
+ d.mTexCoord = cv.mTexCoord;
+ d.setNormal(cv.getNormal());
+ d.mIndex = index;
+ if (point_iter != point_map.end())
+ {
+ point_iter->second.push_back(d);
+ }
+ else
+ {
+ point_map[LLVector3(d.getPosition().getF32ptr())].push_back(d);
+ }
+ }
+ }
+
+ swapData(new_face);
+}
+
+class LLVCacheTriangleData;
+
+class LLVCacheVertexData
+{
+public:
+ S32 mIdx;
+ S32 mCacheTag;
+ F32 mScore;
+ U32 mActiveTriangles;
+ std::vector<LLVCacheTriangleData*> mTriangles;
+
+ LLVCacheVertexData()
+ {
+ mCacheTag = -1;
+ mScore = 0.f;
+ mActiveTriangles = 0;
+ mIdx = -1;
+ }
+};
+
+class LLVCacheTriangleData
+{
+public:
+ bool mActive;
+ F32 mScore;
+ LLVCacheVertexData* mVertex[3];
+
+ LLVCacheTriangleData()
+ {
+ mActive = true;
+ mScore = 0.f;
+ mVertex[0] = mVertex[1] = mVertex[2] = NULL;
+ }
+
+ void complete()
+ {
+ mActive = false;
+ for (S32 i = 0; i < 3; ++i)
+ {
+ if (mVertex[i])
+ {
+ llassert_always(mVertex[i]->mActiveTriangles > 0);
+ mVertex[i]->mActiveTriangles--;
+ }
+ }
+ }
+
+ bool operator<(const LLVCacheTriangleData& rhs) const
+ { //highest score first
+ return rhs.mScore < mScore;
+ }
+};
+
+const F32 FindVertexScore_CacheDecayPower = 1.5f;
+const F32 FindVertexScore_LastTriScore = 0.75f;
+const F32 FindVertexScore_ValenceBoostScale = 2.0f;
+const F32 FindVertexScore_ValenceBoostPower = 0.5f;
+const U32 MaxSizeVertexCache = 32;
+
+F32 find_vertex_score(LLVCacheVertexData& data)
+{
+ if (data.mActiveTriangles == 0)
+ { //no triangle references this vertex
+ return -1.f;
+ }
+
+ F32 score = 0.f;
+
+ S32 cache_idx = data.mCacheTag;
+
+ if (cache_idx < 0)
+ {
+ //not in cache
+ }
+ else
+ {
+ if (cache_idx < 3)
+ { //vertex was in the last triangle
+ score = FindVertexScore_LastTriScore;
+ }
+ else
+ { //more points for being higher in the cache
+ F32 scaler = 1.f/(MaxSizeVertexCache-3);
+ score = 1.f-((cache_idx-3)*scaler);
+ score = powf(score, FindVertexScore_CacheDecayPower);
+ }
+ }
+
+ //bonus points for having low valence
+ F32 valence_boost = powf(data.mActiveTriangles, -FindVertexScore_ValenceBoostPower);
+ score += FindVertexScore_ValenceBoostScale * valence_boost;
+
+ return score;
+}
+
+class LLVCacheFIFO
+{
+public:
+ LLVCacheVertexData* mCache[MaxSizeVertexCache];
+ U32 mMisses;
+
+ LLVCacheFIFO()
+ {
+ mMisses = 0;
+ for (U32 i = 0; i < MaxSizeVertexCache; ++i)
+ {
+ mCache[i] = NULL;
+ }
+ }
+
+ void addVertex(LLVCacheVertexData* data)
+ {
+ if (data->mCacheTag == -1)
+ {
+ mMisses++;
+
+ S32 end = MaxSizeVertexCache-1;
+
+ if (mCache[end])
+ {
+ mCache[end]->mCacheTag = -1;
+ }
+
+ for (S32 i = end; i > 0; --i)
+ {
+ mCache[i] = mCache[i-1];
+ if (mCache[i])
+ {
+ mCache[i]->mCacheTag = i;
+ }
+ }
+
+ mCache[0] = data;
+ data->mCacheTag = 0;
+ }
+ }
+};
+
+class LLVCacheLRU
+{
+public:
+ LLVCacheVertexData* mCache[MaxSizeVertexCache+3];
+
+ LLVCacheTriangleData* mBestTriangle;
+
+ U32 mMisses;
+
+ LLVCacheLRU()
+ {
+ for (U32 i = 0; i < MaxSizeVertexCache+3; ++i)
+ {
+ mCache[i] = NULL;
+ }
+
+ mBestTriangle = NULL;
+ mMisses = 0;
+ }
+
+ void addVertex(LLVCacheVertexData* data)
+ {
+ S32 end = MaxSizeVertexCache+2;
+ if (data->mCacheTag != -1)
+ { //just moving a vertex to the front of the cache
+ end = data->mCacheTag;
+ }
+ else
+ {
+ mMisses++;
+ if (mCache[end])
+ { //adding a new vertex, vertex at end of cache falls off
+ mCache[end]->mCacheTag = -1;
+ }
+ }
+
+ for (S32 i = end; i > 0; --i)
+ { //adjust cache pointers and tags
+ mCache[i] = mCache[i-1];
+
+ if (mCache[i])
+ {
+ mCache[i]->mCacheTag = i;
+ }
+ }
+
+ mCache[0] = data;
+ mCache[0]->mCacheTag = 0;
+ }
+
+ void addTriangle(LLVCacheTriangleData* data)
+ {
+ addVertex(data->mVertex[0]);
+ addVertex(data->mVertex[1]);
+ addVertex(data->mVertex[2]);
+ }
+
+ void updateScores()
+ {
+ for (U32 i = MaxSizeVertexCache; i < MaxSizeVertexCache+3; ++i)
+ { //trailing 3 vertices aren't actually in the cache for scoring purposes
+ if (mCache[i])
+ {
+ mCache[i]->mCacheTag = -1;
+ }
+ }
+
+ for (U32 i = 0; i < MaxSizeVertexCache; ++i)
+ { //update scores of vertices in cache
+ if (mCache[i])
+ {
+ mCache[i]->mScore = find_vertex_score(*(mCache[i]));
+ llassert_always(mCache[i]->mCacheTag == i);
+ }
+ }
+
+ mBestTriangle = NULL;
+ //update triangle scores
+ for (U32 i = 0; i < MaxSizeVertexCache+3; ++i)
+ {
+ if (mCache[i])
+ {
+ for (U32 j = 0; j < mCache[i]->mTriangles.size(); ++j)
+ {
+ LLVCacheTriangleData* tri = mCache[i]->mTriangles[j];
+ if (tri->mActive)
+ {
+ tri->mScore = tri->mVertex[0]->mScore;
+ tri->mScore += tri->mVertex[1]->mScore;
+ tri->mScore += tri->mVertex[2]->mScore;
+
+ if (!mBestTriangle || mBestTriangle->mScore < tri->mScore)
+ {
+ mBestTriangle = tri;
+ }
+ }
+ }
+ }
+ }
+
+ //knock trailing 3 vertices off the cache
+ for (U32 i = MaxSizeVertexCache; i < MaxSizeVertexCache+3; ++i)
+ {
+ if (mCache[i])
+ {
+ llassert_always(mCache[i]->mCacheTag == -1);
+ mCache[i] = NULL;
+ }
+ }
+ }
+};
+
+
+void LLVolumeFace::cacheOptimize()
+{ //optimize for vertex cache according to Forsyth method:
+ // http://home.comcast.net/~tom_forsyth/papers/fast_vert_cache_opt.html
+
+ LLVCacheLRU cache;
+
+ //mapping of vertices to triangles and indices
+ std::vector<LLVCacheVertexData> vertex_data;
+
+ //mapping of triangles do vertices
+ std::vector<LLVCacheTriangleData> triangle_data;
+
+ triangle_data.resize(mNumIndices/3);
+ vertex_data.resize(mNumVertices);
+
+ for (U32 i = 0; i < mNumIndices; i++)
+ { //populate vertex data and triangle data arrays
+ U16 idx = mIndices[i];
+ U32 tri_idx = i/3;
+
+ vertex_data[idx].mTriangles.push_back(&(triangle_data[tri_idx]));
+ vertex_data[idx].mIdx = idx;
+ triangle_data[tri_idx].mVertex[i%3] = &(vertex_data[idx]);
+ }
+
+ /*F32 pre_acmr = 1.f;
+ //measure cache misses from before rebuild
+ {
+ LLVCacheFIFO test_cache;
+ for (U32 i = 0; i < mNumIndices; ++i)
+ {
+ test_cache.addVertex(&vertex_data[mIndices[i]]);
+ }
+
+ for (U32 i = 0; i < mNumVertices; i++)
+ {
+ vertex_data[i].mCacheTag = -1;
+ }
+
+ pre_acmr = (F32) test_cache.mMisses/(mNumIndices/3);
+ }*/
+
+ for (U32 i = 0; i < mNumVertices; i++)
+ { //initialize score values (no cache -- might try a fifo cache here)
+ vertex_data[i].mScore = find_vertex_score(vertex_data[i]);
+ vertex_data[i].mActiveTriangles = vertex_data[i].mTriangles.size();
+
+ for (U32 j = 0; j < vertex_data[i].mTriangles.size(); ++j)
+ {
+ vertex_data[i].mTriangles[j]->mScore += vertex_data[i].mScore;
+ }
+ }
+
+ //sort triangle data by score
+ std::sort(triangle_data.begin(), triangle_data.end());
+
+ std::vector<U16> new_indices;
+
+ LLVCacheTriangleData* tri;
+
+ //prime pump by adding first triangle to cache;
+ tri = &(triangle_data[0]);
+ cache.addTriangle(tri);
+ new_indices.push_back(tri->mVertex[0]->mIdx);
+ new_indices.push_back(tri->mVertex[1]->mIdx);
+ new_indices.push_back(tri->mVertex[2]->mIdx);
+ tri->complete();
+
+ U32 breaks = 0;
+ for (U32 i = 1; i < mNumIndices/3; ++i)
+ {
+ cache.updateScores();
+ tri = cache.mBestTriangle;
+ if (!tri)
+ {
+ breaks++;
+ for (U32 j = 0; j < triangle_data.size(); ++j)
+ {
+ if (triangle_data[j].mActive)
+ {
+ tri = &(triangle_data[j]);
+ break;
+ }
+ }
+ }
+
+ cache.addTriangle(tri);
+ new_indices.push_back(tri->mVertex[0]->mIdx);
+ new_indices.push_back(tri->mVertex[1]->mIdx);
+ new_indices.push_back(tri->mVertex[2]->mIdx);
+ tri->complete();
+ }
+
+ for (U32 i = 0; i < mNumIndices; ++i)
+ {
+ mIndices[i] = new_indices[i];
+ }
+
+ /*F32 post_acmr = 1.f;
+ //measure cache misses from after rebuild
+ {
+ LLVCacheFIFO test_cache;
+ for (U32 i = 0; i < mNumVertices; i++)
+ {
+ vertex_data[i].mCacheTag = -1;
+ }
+
+ for (U32 i = 0; i < mNumIndices; ++i)
+ {
+ test_cache.addVertex(&vertex_data[mIndices[i]]);
+ }
+
+ post_acmr = (F32) test_cache.mMisses/(mNumIndices/3);
+ }*/
+
+ //optimize for pre-TnL cache
+
+ //allocate space for new buffer
+ S32 num_verts = mNumVertices;
+ LLVector4a* pos = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*num_verts);
+ LLVector4a* norm = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*num_verts);
+ S32 size = ((num_verts*sizeof(LLVector2)) + 0xF) & ~0xF;
+ LLVector2* tc = (LLVector2*) ll_aligned_malloc_16(size);
+
+ LLVector4a* wght = NULL;
+ if (mWeights)
+ {
+ wght = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*num_verts);
+ }
+
+ LLVector4a* binorm = NULL;
+ if (mBinormals)
+ {
+ binorm = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*num_verts);
+ }
+
+ //allocate mapping of old indices to new indices
+ std::vector<S32> new_idx;
+ new_idx.resize(mNumVertices, -1);
+
+ S32 cur_idx = 0;
+ for (U32 i = 0; i < mNumIndices; ++i)
+ {
+ U16 idx = mIndices[i];
+ if (new_idx[idx] == -1)
+ { //this vertex hasn't been added yet
+ new_idx[idx] = cur_idx;
+
+ //copy vertex data
+ pos[cur_idx] = mPositions[idx];
+ norm[cur_idx] = mNormals[idx];
+ tc[cur_idx] = mTexCoords[idx];
+ if (mWeights)
+ {
+ wght[cur_idx] = mWeights[idx];
+ }
+ if (mBinormals)
+ {
+ binorm[cur_idx] = mBinormals[idx];
+ }
+
+ cur_idx++;
+ }
+ }
+
+ for (U32 i = 0; i < mNumIndices; ++i)
+ {
+ mIndices[i] = new_idx[mIndices[i]];
+ }
+
+ ll_aligned_free_16(mPositions);
+ ll_aligned_free_16(mNormals);
+ ll_aligned_free_16(mTexCoords);
+ ll_aligned_free_16(mWeights);
+ ll_aligned_free_16(mBinormals);
+
+ mPositions = pos;
+ mNormals = norm;
+ mTexCoords = tc;
+ mWeights = wght;
+ mBinormals = binorm;
+
+ //std::string result = llformat("ACMR pre/post: %.3f/%.3f -- %d triangles %d breaks", pre_acmr, post_acmr, mNumIndices/3, breaks);
+ //llinfos << result << llendl;
+
+}
+
+void LLVolumeFace::createOctree(F32 scaler, const LLVector4a& center, const LLVector4a& size)
+{
+ if (mOctree)
+ {
+ return;
+ }
+
+ mOctree = new LLOctreeRoot<LLVolumeTriangle>(center, size, NULL);
+ new LLVolumeOctreeListener(mOctree);
+
+ for (U32 i = 0; i < mNumIndices; i+= 3)
+ { //for each triangle
+ LLPointer<LLVolumeTriangle> tri = new LLVolumeTriangle();
+
+ const LLVector4a& v0 = mPositions[mIndices[i]];
+ const LLVector4a& v1 = mPositions[mIndices[i+1]];
+ const LLVector4a& v2 = mPositions[mIndices[i+2]];
+
+ //store pointers to vertex data
+ tri->mV[0] = &v0;
+ tri->mV[1] = &v1;
+ tri->mV[2] = &v2;
+
+ //store indices
+ tri->mIndex[0] = mIndices[i];
+ tri->mIndex[1] = mIndices[i+1];
+ tri->mIndex[2] = mIndices[i+2];
+
+ //get minimum point
+ LLVector4a min = v0;
+ min.setMin(min, v1);
+ min.setMin(min, v2);
+
+ //get maximum point
+ LLVector4a max = v0;
+ max.setMax(max, v1);
+ max.setMax(max, v2);
+
+ //compute center
+ LLVector4a center;
+ center.setAdd(min, max);
+ center.mul(0.5f);
+
+ tri->mPositionGroup = center;
+
+ //compute "radius"
+ LLVector4a size;
+ size.setSub(max,min);
+
+ tri->mRadius = size.getLength3().getF32() * scaler;
+
+ //insert
+ mOctree->insert(tri);
+ }
+
+ //remove unneeded octree layers
+ while (!mOctree->balance()) { }
+
+ //calculate AABB for each node
+ LLVolumeOctreeRebound rebound(this);
+ rebound.traverse(mOctree);
+
+ if (gDebugGL)
+ {
+ LLVolumeOctreeValidate validate;
+ validate.traverse(mOctree);
+ }
+}
+
+
+void LLVolumeFace::swapData(LLVolumeFace& rhs)
+{
+ llswap(rhs.mPositions, mPositions);
+ llswap(rhs.mNormals, mNormals);
+ llswap(rhs.mBinormals, mBinormals);
+ llswap(rhs.mTexCoords, mTexCoords);
+ llswap(rhs.mIndices,mIndices);
+ llswap(rhs.mNumVertices, mNumVertices);
+ llswap(rhs.mNumIndices, mNumIndices);
+}
+
void LerpPlanarVertex(LLVolumeFace::VertexData& v0,
LLVolumeFace::VertexData& v1,
LLVolumeFace::VertexData& v2,
@@ -4463,10 +6010,21 @@ void LerpPlanarVertex(LLVolumeFace::VertexData& v0,
F32 coef01,
F32 coef02)
{
- vout.mPosition = v0.mPosition + ((v1.mPosition-v0.mPosition)*coef01)+((v2.mPosition-v0.mPosition)*coef02);
+
+ LLVector4a lhs;
+ lhs.setSub(v1.getPosition(), v0.getPosition());
+ lhs.mul(coef01);
+ LLVector4a rhs;
+ rhs.setSub(v2.getPosition(), v0.getPosition());
+ rhs.mul(coef02);
+
+ rhs.add(lhs);
+ rhs.add(v0.getPosition());
+
+ vout.setPosition(rhs);
+
vout.mTexCoord = v0.mTexCoord + ((v1.mTexCoord-v0.mTexCoord)*coef01)+((v2.mTexCoord-v0.mTexCoord)*coef02);
- vout.mNormal = v0.mNormal;
- vout.mBinormal = v0.mBinormal;
+ vout.setNormal(v0.getNormal());
}
BOOL LLVolumeFace::createUnCutCubeCap(LLVolume* volume, BOOL partial_build)
@@ -4486,84 +6044,113 @@ BOOL LLVolumeFace::createUnCutCubeCap(LLVolume* volume, BOOL partial_build)
num_vertices = (grid_size+1)*(grid_size+1);
num_indices = quad_count * 4;
- LLVector3& min = mExtents[0];
- LLVector3& max = mExtents[1];
+ LLVector4a& min = mExtents[0];
+ LLVector4a& max = mExtents[1];
S32 offset = 0;
if (mTypeMask & TOP_MASK)
+ {
offset = (max_t-1) * max_s;
+ }
else
+ {
offset = mBeginS;
+ }
- VertexData corners[4];
- VertexData baseVert;
- for(int t = 0; t < 4; t++){
- corners[t].mPosition = mesh[offset + (grid_size*t)].mPos;
- corners[t].mTexCoord.mV[0] = profile[grid_size*t].mV[0]+0.5f;
- corners[t].mTexCoord.mV[1] = 0.5f - profile[grid_size*t].mV[1];
- }
- baseVert.mNormal =
- ((corners[1].mPosition-corners[0].mPosition) %
- (corners[2].mPosition-corners[1].mPosition));
- baseVert.mNormal.normVec();
- if(!(mTypeMask & TOP_MASK)){
- baseVert.mNormal *= -1.0f;
- }else{
- //Swap the UVs on the U(X) axis for top face
- LLVector2 swap;
- swap = corners[0].mTexCoord;
- corners[0].mTexCoord=corners[3].mTexCoord;
- corners[3].mTexCoord=swap;
- swap = corners[1].mTexCoord;
- corners[1].mTexCoord=corners[2].mTexCoord;
- corners[2].mTexCoord=swap;
- }
- baseVert.mBinormal = calc_binormal_from_triangle(
- corners[0].mPosition, corners[0].mTexCoord,
- corners[1].mPosition, corners[1].mTexCoord,
- corners[2].mPosition, corners[2].mTexCoord);
- for(int t = 0; t < 4; t++){
- corners[t].mBinormal = baseVert.mBinormal;
- corners[t].mNormal = baseVert.mNormal;
- }
- mHasBinormals = TRUE;
-
- if (partial_build)
{
- mVertices.clear();
- }
+ VertexData corners[4];
+ VertexData baseVert;
+ for(S32 t = 0; t < 4; t++)
+ {
+ corners[t].getPosition().load3( mesh[offset + (grid_size*t)].mPos.mV);
+ corners[t].mTexCoord.mV[0] = profile[grid_size*t].mV[0]+0.5f;
+ corners[t].mTexCoord.mV[1] = 0.5f - profile[grid_size*t].mV[1];
+ }
- S32 vtop = mVertices.size();
- for(int gx = 0;gx<grid_size+1;gx++){
- for(int gy = 0;gy<grid_size+1;gy++){
- VertexData newVert;
- LerpPlanarVertex(
- corners[0],
- corners[1],
- corners[3],
- newVert,
- (F32)gx/(F32)grid_size,
- (F32)gy/(F32)grid_size);
- mVertices.push_back(newVert);
+ {
+ LLVector4a lhs;
+ lhs.setSub(corners[1].getPosition(), corners[0].getPosition());
+ LLVector4a rhs;
+ rhs.setSub(corners[2].getPosition(), corners[1].getPosition());
+ baseVert.getNormal().setCross3(lhs, rhs);
+ baseVert.getNormal().normalize3fast();
+ }
- if (gx == 0 && gy == 0)
- {
- min = max = newVert.mPosition;
- }
- else
+ if(!(mTypeMask & TOP_MASK))
+ {
+ baseVert.getNormal().mul(-1.0f);
+ }
+ else
+ {
+ //Swap the UVs on the U(X) axis for top face
+ LLVector2 swap;
+ swap = corners[0].mTexCoord;
+ corners[0].mTexCoord=corners[3].mTexCoord;
+ corners[3].mTexCoord=swap;
+ swap = corners[1].mTexCoord;
+ corners[1].mTexCoord=corners[2].mTexCoord;
+ corners[2].mTexCoord=swap;
+ }
+
+ LLVector4a binormal;
+
+ calc_binormal_from_triangle( binormal,
+ corners[0].getPosition(), corners[0].mTexCoord,
+ corners[1].getPosition(), corners[1].mTexCoord,
+ corners[2].getPosition(), corners[2].mTexCoord);
+
+ binormal.normalize3fast();
+
+ S32 size = (grid_size+1)*(grid_size+1);
+ resizeVertices(size);
+ allocateBinormals(size);
+
+ LLVector4a* pos = (LLVector4a*) mPositions;
+ LLVector4a* norm = (LLVector4a*) mNormals;
+ LLVector4a* binorm = (LLVector4a*) mBinormals;
+ LLVector2* tc = (LLVector2*) mTexCoords;
+
+ for(int gx = 0;gx<grid_size+1;gx++)
+ {
+ for(int gy = 0;gy<grid_size+1;gy++)
{
- update_min_max(min,max,newVert.mPosition);
+ VertexData newVert;
+ LerpPlanarVertex(
+ corners[0],
+ corners[1],
+ corners[3],
+ newVert,
+ (F32)gx/(F32)grid_size,
+ (F32)gy/(F32)grid_size);
+
+ *pos++ = newVert.getPosition();
+ *norm++ = baseVert.getNormal();
+ *tc++ = newVert.mTexCoord;
+ *binorm++ = binormal;
+
+ if (gx == 0 && gy == 0)
+ {
+ min = newVert.getPosition();
+ max = min;
+ }
+ else
+ {
+ min.setMin(min, newVert.getPosition());
+ max.setMax(max, newVert.getPosition());
+ }
}
}
- }
- mCenter = (min + max) * 0.5f;
+ mCenter->setAdd(min, max);
+ mCenter->mul(0.5f);
+ }
if (!partial_build)
{
-#if GEN_TRI_STRIP
- mTriStrip.clear();
-#endif
+ resizeIndices(grid_size*grid_size*6);
+
+ U16* out = mIndices;
+
S32 idxs[] = {0,1,(grid_size+1)+1,(grid_size+1)+1,(grid_size+1),0};
for(S32 gx = 0;gx<grid_size;gx++)
{
@@ -4574,61 +6161,18 @@ BOOL LLVolumeFace::createUnCutCubeCap(LLVolume* volume, BOOL partial_build)
{
for(S32 i=5;i>=0;i--)
{
- mIndices.push_back(vtop+(gy*(grid_size+1))+gx+idxs[i]);
- }
-
-#if GEN_TRI_STRIP
- if (gy == 0)
- {
- mTriStrip.push_back((gx+1)*(grid_size+1));
- mTriStrip.push_back((gx+1)*(grid_size+1));
- mTriStrip.push_back(gx*(grid_size+1));
- }
-
- mTriStrip.push_back(gy+1+(gx+1)*(grid_size+1));
- mTriStrip.push_back(gy+1+gx*(grid_size+1));
-
-
- if (gy == grid_size-1)
- {
- mTriStrip.push_back(gy+1+gx*(grid_size+1));
- }
-#endif
+ *out++ = ((gy*(grid_size+1))+gx+idxs[i]);
+ }
}
else
{
for(S32 i=0;i<6;i++)
{
- mIndices.push_back(vtop+(gy*(grid_size+1))+gx+idxs[i]);
- }
-
-#if GEN_TRI_STRIP
- if (gy == 0)
- {
- mTriStrip.push_back(gx*(grid_size+1));
- mTriStrip.push_back(gx*(grid_size+1));
- mTriStrip.push_back((gx+1)*(grid_size+1));
+ *out++ = ((gy*(grid_size+1))+gx+idxs[i]);
}
-
- mTriStrip.push_back(gy+1+gx*(grid_size+1));
- mTriStrip.push_back(gy+1+(gx+1)*(grid_size+1));
-
- if (gy == grid_size-1)
- {
- mTriStrip.push_back(gy+1+(gx+1)*(grid_size+1));
- }
-#endif
}
- }
-
- }
-
-#if GEN_TRI_STRIP
- if (mTriStrip.size()%2 == 1)
- {
- mTriStrip.push_back(mTriStrip[mTriStrip.size()-1]);
+ }
}
-#endif
}
return TRUE;
@@ -4658,17 +6202,31 @@ BOOL LLVolumeFace::createCap(LLVolume* volume, BOOL partial_build)
num_vertices = profile.size();
num_indices = (profile.size() - 2)*3;
- mVertices.resize(num_vertices);
+ if (!(mTypeMask & HOLLOW_MASK) && !(mTypeMask & OPEN_MASK))
+ {
+ resizeVertices(num_vertices+1);
+ allocateBinormals(num_vertices+1);
- if (!partial_build)
+ if (!partial_build)
+ {
+ resizeIndices(num_indices+3);
+ }
+ }
+ else
{
- mIndices.resize(num_indices);
+ resizeVertices(num_vertices);
+ allocateBinormals(num_vertices);
+
+ if (!partial_build)
+ {
+ resizeIndices(num_indices);
+ }
}
S32 max_s = volume->getProfile().getTotal();
S32 max_t = volume->getPath().mPath.size();
- mCenter.clearVec();
+ mCenter->clear();
S32 offset = 0;
if (mTypeMask & TOP_MASK)
@@ -4686,82 +6244,91 @@ BOOL LLVolumeFace::createCap(LLVolume* volume, BOOL partial_build)
LLVector2 cuv;
LLVector2 min_uv, max_uv;
- LLVector3& min = mExtents[0];
- LLVector3& max = mExtents[1];
+ LLVector4a& min = mExtents[0];
+ LLVector4a& max = mExtents[1];
+
+ LLVector2* tc = (LLVector2*) mTexCoords;
+ LLVector4a* pos = (LLVector4a*) mPositions;
+ LLVector4a* norm = (LLVector4a*) mNormals;
+ LLVector4a* binorm = (LLVector4a*) mBinormals;
// Copy the vertices into the array
for (S32 i = 0; i < num_vertices; i++)
{
if (mTypeMask & TOP_MASK)
{
- mVertices[i].mTexCoord.mV[0] = profile[i].mV[0]+0.5f;
- mVertices[i].mTexCoord.mV[1] = profile[i].mV[1]+0.5f;
+ tc[i].mV[0] = profile[i].mV[0]+0.5f;
+ tc[i].mV[1] = profile[i].mV[1]+0.5f;
}
else
{
// Mirror for underside.
- mVertices[i].mTexCoord.mV[0] = profile[i].mV[0]+0.5f;
- mVertices[i].mTexCoord.mV[1] = 0.5f - profile[i].mV[1];
+ tc[i].mV[0] = profile[i].mV[0]+0.5f;
+ tc[i].mV[1] = 0.5f - profile[i].mV[1];
}
- mVertices[i].mPosition = mesh[i + offset].mPos;
+ pos[i].load3(mesh[i + offset].mPos.mV);
if (i == 0)
{
- min = max = mVertices[i].mPosition;
- min_uv = max_uv = mVertices[i].mTexCoord;
+ max = pos[i];
+ min = max;
+ min_uv = max_uv = tc[i];
}
else
{
- update_min_max(min,max, mVertices[i].mPosition);
- update_min_max(min_uv, max_uv, mVertices[i].mTexCoord);
+ update_min_max(min,max,pos[i]);
+ update_min_max(min_uv, max_uv, tc[i]);
}
}
- mCenter = (min+max)*0.5f;
+ mCenter->setAdd(min, max);
+ mCenter->mul(0.5f);
+
cuv = (min_uv + max_uv)*0.5f;
- LLVector3 binormal = calc_binormal_from_triangle(
- mCenter, cuv,
- mVertices[0].mPosition, mVertices[0].mTexCoord,
- mVertices[1].mPosition, mVertices[1].mTexCoord);
- binormal.normVec();
+ LLVector4a binormal;
+ calc_binormal_from_triangle(binormal,
+ *mCenter, cuv,
+ pos[0], tc[0],
+ pos[1], tc[1]);
+ binormal.normalize3fast();
+
+ LLVector4a normal;
+ LLVector4a d0, d1;
+
- LLVector3 d0;
- LLVector3 d1;
- LLVector3 normal;
+ d0.setSub(*mCenter, pos[0]);
+ d1.setSub(*mCenter, pos[1]);
- d0 = mCenter-mVertices[0].mPosition;
- d1 = mCenter-mVertices[1].mPosition;
+ if (mTypeMask & TOP_MASK)
+ {
+ normal.setCross3(d0, d1);
+ }
+ else
+ {
+ normal.setCross3(d1, d0);
+ }
- normal = (mTypeMask & TOP_MASK) ? (d0%d1) : (d1%d0);
- normal.normVec();
+ normal.normalize3fast();
VertexData vd;
- vd.mPosition = mCenter;
- vd.mNormal = normal;
- vd.mBinormal = binormal;
+ vd.setPosition(*mCenter);
vd.mTexCoord = cuv;
if (!(mTypeMask & HOLLOW_MASK) && !(mTypeMask & OPEN_MASK))
{
- mVertices.push_back(vd);
+ pos[num_vertices] = *mCenter;
+ tc[num_vertices] = cuv;
num_vertices++;
- if (!partial_build)
- {
- vector_append(mIndices, 3);
- }
}
-
for (S32 i = 0; i < num_vertices; i++)
{
- mVertices[i].mBinormal = binormal;
- mVertices[i].mNormal = normal;
+ binorm[i].load4a(binormal.getF32ptr());
+ norm[i].load4a(normal.getF32ptr());
}
- mHasBinormals = TRUE;
-
if (partial_build)
{
return TRUE;
@@ -4869,8 +6436,6 @@ BOOL LLVolumeFace::createCap(LLVolume* volume, BOOL partial_build)
pt2--;
}
}
-
- makeTriStrip();
}
else
{
@@ -4975,8 +6540,6 @@ BOOL LLVolumeFace::createCap(LLVolume* volume, BOOL partial_build)
pt2--;
}
}
-
- makeTriStrip();
}
}
else
@@ -4998,131 +6561,277 @@ BOOL LLVolumeFace::createCap(LLVolume* volume, BOOL partial_build)
mIndices[3*i+v2] = i + 1;
}
-#if GEN_TRI_STRIP
- //make tri strip
- if (mTypeMask & OPEN_MASK)
- {
- makeTriStrip();
- }
- else
- {
- S32 j = num_vertices-2;
- if (mTypeMask & TOP_MASK)
- {
- mTriStrip.push_back(0);
- for (S32 i = 0; i <= j; ++i)
- {
- mTriStrip.push_back(i);
- if (i != j)
- {
- mTriStrip.push_back(j);
- }
- --j;
- }
- }
- else
- {
- mTriStrip.push_back(j);
- for (S32 i = 0; i <= j; ++i)
- {
- if (i != j)
- {
- mTriStrip.push_back(j);
- }
- mTriStrip.push_back(i);
- --j;
- }
- }
-
- mTriStrip.push_back(mTriStrip[mTriStrip.size()-1]);
- if (mTriStrip.size()%2 == 1)
- {
- mTriStrip.push_back(mTriStrip[mTriStrip.size()-1]);
- }
- }
-#endif
}
return TRUE;
}
-void LLVolumeFace::makeTriStrip()
+void LLVolumeFace::createBinormals()
{
-#if GEN_TRI_STRIP
- for (U32 i = 0; i < mIndices.size(); i+=3)
+ LLMemType m1(LLMemType::MTYPE_VOLUME);
+
+ if (!mBinormals)
{
- U16 i0 = mIndices[i];
- U16 i1 = mIndices[i+1];
- U16 i2 = mIndices[i+2];
+ allocateBinormals(mNumVertices);
- if ((i/3)%2 == 1)
- {
- mTriStrip.push_back(i0);
- mTriStrip.push_back(i0);
- mTriStrip.push_back(i1);
- mTriStrip.push_back(i2);
- mTriStrip.push_back(i2);
- }
- else
+ //generate binormals
+ LLVector4a* pos = mPositions;
+ LLVector2* tc = (LLVector2*) mTexCoords;
+ LLVector4a* binorm = (LLVector4a*) mBinormals;
+
+ LLVector4a* end = mBinormals+mNumVertices;
+ while (binorm < end)
{
- mTriStrip.push_back(i2);
- mTriStrip.push_back(i2);
- mTriStrip.push_back(i1);
- mTriStrip.push_back(i0);
- mTriStrip.push_back(i0);
+ (*binorm++).clear();
}
- }
- if (mTriStrip.size()%2 == 1)
- {
- mTriStrip.push_back(mTriStrip[mTriStrip.size()-1]);
- }
-#endif
-}
+ binorm = mBinormals;
-void LLVolumeFace::createBinormals()
-{
- LLMemType m1(LLMemType::MTYPE_VOLUME);
-
- if (!mHasBinormals)
- {
- //generate binormals
- for (U32 i = 0; i < mIndices.size()/3; i++)
+ for (U32 i = 0; i < mNumIndices/3; i++)
{ //for each triangle
- const VertexData& v0 = mVertices[mIndices[i*3+0]];
- const VertexData& v1 = mVertices[mIndices[i*3+1]];
- const VertexData& v2 = mVertices[mIndices[i*3+2]];
+ const U16& i0 = mIndices[i*3+0];
+ const U16& i1 = mIndices[i*3+1];
+ const U16& i2 = mIndices[i*3+2];
//calculate binormal
- LLVector3 binorm = calc_binormal_from_triangle(v0.mPosition, v0.mTexCoord,
- v1.mPosition, v1.mTexCoord,
- v2.mPosition, v2.mTexCoord);
+ LLVector4a binormal;
+ calc_binormal_from_triangle(binormal,
+ pos[i0], tc[i0],
+ pos[i1], tc[i1],
+ pos[i2], tc[i2]);
- for (U32 j = 0; j < 3; j++)
- { //add triangle normal to vertices
- mVertices[mIndices[i*3+j]].mBinormal += binorm; // * (weight_sum - d[j])/weight_sum;
- }
+
+ //add triangle normal to vertices
+ binorm[i0].add(binormal);
+ binorm[i1].add(binormal);
+ binorm[i2].add(binormal);
//even out quad contributions
if (i % 2 == 0)
{
- mVertices[mIndices[i*3+2]].mBinormal += binorm;
+ binorm[i2].add(binormal);
}
else
{
- mVertices[mIndices[i*3+1]].mBinormal += binorm;
+ binorm[i1].add(binormal);
}
}
//normalize binormals
- for (U32 i = 0; i < mVertices.size(); i++)
+ for (U32 i = 0; i < mNumVertices; i++)
+ {
+ binorm[i].normalize3fast();
+ //bump map/planar projection code requires normals to be normalized
+ mNormals[i].normalize3fast();
+ }
+ }
+}
+
+void LLVolumeFace::resizeVertices(S32 num_verts)
+{
+ ll_aligned_free_16(mPositions);
+ ll_aligned_free_16(mNormals);
+ ll_aligned_free_16(mBinormals);
+ ll_aligned_free_16(mTexCoords);
+
+ mBinormals = NULL;
+
+ if (num_verts)
+ {
+ mPositions = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*num_verts);
+ assert_aligned(mPositions, 16);
+ mNormals = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*num_verts);
+ assert_aligned(mNormals, 16);
+
+ //pad texture coordinate block end to allow for QWORD reads
+ S32 size = ((num_verts*sizeof(LLVector2)) + 0xF) & ~0xF;
+ mTexCoords = (LLVector2*) ll_aligned_malloc_16(size);
+ assert_aligned(mTexCoords, 16);
+ }
+ else
+ {
+ mPositions = NULL;
+ mNormals = NULL;
+ mTexCoords = NULL;
+ }
+
+ mNumVertices = num_verts;
+}
+
+void LLVolumeFace::pushVertex(const LLVolumeFace::VertexData& cv)
+{
+ pushVertex(cv.getPosition(), cv.getNormal(), cv.mTexCoord);
+}
+
+void LLVolumeFace::pushVertex(const LLVector4a& pos, const LLVector4a& norm, const LLVector2& tc)
+{
+ S32 new_verts = mNumVertices+1;
+ S32 new_size = new_verts*16;
+// S32 old_size = mNumVertices*16;
+
+ //positions
+ mPositions = (LLVector4a*) realloc(mPositions, new_size);
+
+ //normals
+ mNormals = (LLVector4a*) realloc(mNormals, new_size);
+
+ //tex coords
+ new_size = ((new_verts*8)+0xF) & ~0xF;
+ mTexCoords = (LLVector2*) realloc(mTexCoords, new_size);
+
+
+ //just clear binormals
+ ll_aligned_free_16(mBinormals);
+ mBinormals = NULL;
+
+ mPositions[mNumVertices] = pos;
+ mNormals[mNumVertices] = norm;
+ mTexCoords[mNumVertices] = tc;
+
+ mNumVertices++;
+}
+
+void LLVolumeFace::allocateBinormals(S32 num_verts)
+{
+ ll_aligned_free_16(mBinormals);
+ mBinormals = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*num_verts);
+}
+
+void LLVolumeFace::allocateWeights(S32 num_verts)
+{
+ ll_aligned_free_16(mWeights);
+ mWeights = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*num_verts);
+}
+
+void LLVolumeFace::resizeIndices(S32 num_indices)
+{
+ ll_aligned_free_16(mIndices);
+
+ if (num_indices)
+ {
+ //pad index block end to allow for QWORD reads
+ S32 size = ((num_indices*sizeof(U16)) + 0xF) & ~0xF;
+
+ mIndices = (U16*) ll_aligned_malloc_16(size);
+ }
+ else
+ {
+ mIndices = NULL;
+ }
+
+ mNumIndices = num_indices;
+}
+
+void LLVolumeFace::pushIndex(const U16& idx)
+{
+ S32 new_count = mNumIndices + 1;
+ S32 new_size = ((new_count*2)+0xF) & ~0xF;
+
+ S32 old_size = ((mNumIndices*2)+0xF) & ~0xF;
+ if (new_size != old_size)
+ {
+ mIndices = (U16*) realloc(mIndices, new_size);
+ }
+
+ mIndices[mNumIndices++] = idx;
+}
+
+void LLVolumeFace::fillFromLegacyData(std::vector<LLVolumeFace::VertexData>& v, std::vector<U16>& idx)
+{
+ resizeVertices(v.size());
+ resizeIndices(idx.size());
+
+ for (U32 i = 0; i < v.size(); ++i)
+ {
+ mPositions[i] = v[i].getPosition();
+ mNormals[i] = v[i].getNormal();
+ mTexCoords[i] = v[i].mTexCoord;
+ }
+
+ for (U32 i = 0; i < idx.size(); ++i)
+ {
+ mIndices[i] = idx[i];
+ }
+}
+
+void LLVolumeFace::appendFace(const LLVolumeFace& face, LLMatrix4& mat_in, LLMatrix4& norm_mat_in)
+{
+ U16 offset = mNumVertices;
+
+ S32 new_count = face.mNumVertices + mNumVertices;
+
+ if (new_count > 65536)
+ {
+ llerrs << "Cannot append face -- 16-bit overflow will occur." << llendl;
+ }
+
+ if (face.mNumVertices == 0)
+ {
+ llerrs << "Cannot append empty face." << llendl;
+ }
+
+ //allocate new buffer space
+ mPositions = (LLVector4a*) realloc(mPositions, new_count*sizeof(LLVector4a));
+ assert_aligned(mPositions, 16);
+ mNormals = (LLVector4a*) realloc(mNormals, new_count*sizeof(LLVector4a));
+ assert_aligned(mNormals, 16);
+ mTexCoords = (LLVector2*) realloc(mTexCoords, (new_count*sizeof(LLVector2)+0xF) & ~0xF);
+ assert_aligned(mTexCoords, 16);
+
+ mNumVertices = new_count;
+
+ //get destination address of appended face
+ LLVector4a* dst_pos = mPositions+offset;
+ LLVector2* dst_tc = mTexCoords+offset;
+ LLVector4a* dst_norm = mNormals+offset;
+
+ //get source addresses of appended face
+ const LLVector4a* src_pos = face.mPositions;
+ const LLVector2* src_tc = face.mTexCoords;
+ const LLVector4a* src_norm = face.mNormals;
+
+ //load aligned matrices
+ LLMatrix4a mat, norm_mat;
+ mat.loadu(mat_in);
+ norm_mat.loadu(norm_mat_in);
+
+ for (U32 i = 0; i < face.mNumVertices; ++i)
+ {
+ //transform appended face position and store
+ mat.affineTransform(src_pos[i], dst_pos[i]);
+
+ //transform appended face normal and store
+ norm_mat.rotate(src_norm[i], dst_norm[i]);
+ dst_norm[i].normalize3fast();
+
+ //copy appended face texture coordinate
+ dst_tc[i] = src_tc[i];
+
+ if (offset == 0 && i == 0)
+ { //initialize bounding box
+ mExtents[0] = mExtents[1] = dst_pos[i];
+ }
+ else
{
- mVertices[i].mBinormal.normVec();
- mVertices[i].mNormal.normVec();
+ //stretch bounding box
+ update_min_max(mExtents[0], mExtents[1], dst_pos[i]);
}
+ }
+
+
+ new_count = mNumIndices + face.mNumIndices;
- mHasBinormals = TRUE;
+ //allocate new index buffer
+ mIndices = (U16*) realloc(mIndices, (new_count*sizeof(U16)+0xF) & ~0xF);
+
+ //get destination address into new index buffer
+ U16* dst_idx = mIndices+mNumIndices;
+ mNumIndices = new_count;
+
+ for (U32 i = 0; i < face.mNumIndices; ++i)
+ { //copy indices, offsetting by old vertex count
+ dst_idx[i] = face.mIndices[i]+offset;
}
}
@@ -5152,18 +6861,20 @@ BOOL LLVolumeFace::createSide(LLVolume* volume, BOOL partial_build)
num_vertices = mNumS*mNumT;
num_indices = (mNumS-1)*(mNumT-1)*6;
- mVertices.resize(num_vertices);
-
if (!partial_build)
{
- mIndices.resize(num_indices);
- mEdge.resize(num_indices);
- }
- else
- {
- mHasBinormals = FALSE;
+ resizeVertices(num_vertices);
+ resizeIndices(num_indices);
+
+ if ((volume->getParams().getSculptType() & LL_SCULPT_TYPE_MASK) != LL_SCULPT_TYPE_MESH)
+ {
+ mEdge.resize(num_indices);
+ }
}
+ LLVector4a* pos = (LLVector4a*) mPositions;
+ LLVector4a* norm = (LLVector4a*) mNormals;
+ LLVector2* tc = (LLVector2*) mTexCoords;
S32 begin_stex = llfloor( profile[mBeginS].mV[2] );
S32 num_s = ((mTypeMask & INNER_MASK) && (mTypeMask & FLAT_MASK) && mNumS > 2) ? mNumS/2 : mNumS;
@@ -5214,21 +6925,20 @@ BOOL LLVolumeFace::createSide(LLVolume* volume, BOOL partial_build)
i = mBeginS + s + max_s*t;
}
- mVertices[cur_vertex].mPosition = mesh[i].mPos;
- mVertices[cur_vertex].mTexCoord = LLVector2(ss,tt);
+ pos[cur_vertex].load3(mesh[i].mPos.mV);
+ tc[cur_vertex] = LLVector2(ss,tt);
- mVertices[cur_vertex].mNormal = LLVector3(0,0,0);
- mVertices[cur_vertex].mBinormal = LLVector3(0,0,0);
-
+ norm[cur_vertex].clear();
cur_vertex++;
if ((mTypeMask & INNER_MASK) && (mTypeMask & FLAT_MASK) && mNumS > 2 && s > 0)
{
- mVertices[cur_vertex].mPosition = mesh[i].mPos;
- mVertices[cur_vertex].mTexCoord = LLVector2(ss,tt);
+
+ pos[cur_vertex].load3(mesh[i].mPos.mV);
+ tc[cur_vertex] = LLVector2(ss,tt);
- mVertices[cur_vertex].mNormal = LLVector3(0,0,0);
- mVertices[cur_vertex].mBinormal = LLVector3(0,0,0);
+ norm[cur_vertex].clear();
+
cur_vertex++;
}
}
@@ -5246,29 +6956,29 @@ BOOL LLVolumeFace::createSide(LLVolume* volume, BOOL partial_build)
i = mBeginS + s + max_s*t;
ss = profile[mBeginS + s].mV[2] - begin_stex;
- mVertices[cur_vertex].mPosition = mesh[i].mPos;
- mVertices[cur_vertex].mTexCoord = LLVector2(ss,tt);
-
- mVertices[cur_vertex].mNormal = LLVector3(0,0,0);
- mVertices[cur_vertex].mBinormal = LLVector3(0,0,0);
-
+ pos[cur_vertex].load3(mesh[i].mPos.mV);
+ tc[cur_vertex] = LLVector2(ss,tt);
+ norm[cur_vertex].clear();
+
cur_vertex++;
}
}
//get bounding box for this side
- LLVector3& face_min = mExtents[0];
- LLVector3& face_max = mExtents[1];
- mCenter.clearVec();
+ LLVector4a& face_min = mExtents[0];
+ LLVector4a& face_max = mExtents[1];
+ mCenter->clear();
+
+ face_min = face_max = pos[0];
- face_min = face_max = mVertices[0].mPosition;
- for (U32 i = 1; i < mVertices.size(); ++i)
+ for (U32 i = 1; i < mNumVertices; ++i)
{
- update_min_max(face_min, face_max, mVertices[i].mPosition);
+ update_min_max(face_min, face_max, pos[i]);
}
- mCenter = (face_min + face_max) * 0.5f;
+ mCenter->setAdd(face_min, face_max);
+ mCenter->mul(0.5f);
S32 cur_index = 0;
S32 cur_edge = 0;
@@ -5276,18 +6986,9 @@ BOOL LLVolumeFace::createSide(LLVolume* volume, BOOL partial_build)
if (!partial_build)
{
-#if GEN_TRI_STRIP
- mTriStrip.clear();
-#endif
-
// Now we generate the indices.
for (t = 0; t < (mNumT-1); t++)
{
-#if GEN_TRI_STRIP
- //prepend terminating index to strip
- mTriStrip.push_back(mNumS*t);
-#endif
-
for (s = 0; s < (mNumS-1); s++)
{
mIndices[cur_index++] = s + mNumS*t; //bottom left
@@ -5297,16 +6998,6 @@ BOOL LLVolumeFace::createSide(LLVolume* volume, BOOL partial_build)
mIndices[cur_index++] = s+1 + mNumS*t; //bottom right
mIndices[cur_index++] = s+1 + mNumS*(t+1); //top right
-#if GEN_TRI_STRIP
- if (s == 0)
- {
- mTriStrip.push_back(s+mNumS*t);
- mTriStrip.push_back(s+mNumS*(t+1));
- }
- mTriStrip.push_back(s+1+mNumS*t);
- mTriStrip.push_back(s+1+mNumS*(t+1));
-#endif
-
mEdge[cur_edge++] = (mNumS-1)*2*t+s*2+1; //bottom left/top right neighbor face
if (t < mNumT-2) { //top right/top left neighbor face
mEdge[cur_edge++] = (mNumS-1)*2*(t+1)+s*2+1;
@@ -5347,52 +7038,61 @@ BOOL LLVolumeFace::createSide(LLVolume* volume, BOOL partial_build)
}
mEdge[cur_edge++] = (mNumS-1)*2*t+s*2; //top right/bottom left neighbor face
}
-#if GEN_TRI_STRIP
- //append terminating vertex to strip
- mTriStrip.push_back(mNumS-1+mNumS*(t+1));
-#endif
}
+ }
-#if GEN_TRI_STRIP
- if (mTriStrip.size()%2 == 1)
- {
- mTriStrip.push_back(mTriStrip[mTriStrip.size()-1]);
- }
-#endif
+ //clear normals
+ for (U32 i = 0; i < mNumVertices; i++)
+ {
+ mNormals[i].clear();
}
//generate normals
- for (U32 i = 0; i < mIndices.size()/3; i++) //for each triangle
+ for (U32 i = 0; i < mNumIndices/3; i++) //for each triangle
{
const U16* idx = &(mIndices[i*3]);
-
- VertexData* v[] =
- { &mVertices[idx[0]], &mVertices[idx[1]], &mVertices[idx[2]] };
-
- //calculate triangle normal
- LLVector3 norm = (v[0]->mPosition-v[1]->mPosition) % (v[0]->mPosition-v[2]->mPosition);
+
- v[0]->mNormal += norm;
- v[1]->mNormal += norm;
- v[2]->mNormal += norm;
+ LLVector4a* v[] =
+ { pos+idx[0], pos+idx[1], pos+idx[2] };
+
+ LLVector4a* n[] =
+ { norm+idx[0], norm+idx[1], norm+idx[2] };
+
+ //calculate triangle normal
+ LLVector4a a, b, c;
+
+ a.setSub(*v[0], *v[1]);
+ b.setSub(*v[0], *v[2]);
+ c.setCross3(a,b);
+ n[0]->add(c);
+ n[1]->add(c);
+ n[2]->add(c);
+
//even out quad contributions
- v[i%2+1]->mNormal += norm;
+ n[i%2+1]->add(c);
}
// adjust normals based on wrapping and stitching
- BOOL s_bottom_converges = ((mVertices[0].mPosition - mVertices[mNumS*(mNumT-2)].mPosition).magVecSquared() < 0.000001f);
- BOOL s_top_converges = ((mVertices[mNumS-1].mPosition - mVertices[mNumS*(mNumT-2)+mNumS-1].mPosition).magVecSquared() < 0.000001f);
+ LLVector4a top;
+ top.setSub(pos[0], pos[mNumS*(mNumT-2)]);
+ BOOL s_bottom_converges = (top.dot3(top) < 0.000001f);
+
+ top.setSub(pos[mNumS-1], pos[mNumS*(mNumT-2)+mNumS-1]);
+ BOOL s_top_converges = (top.dot3(top) < 0.000001f);
+
if (sculpt_stitching == LL_SCULPT_TYPE_NONE) // logic for non-sculpt volumes
{
if (volume->getPath().isOpen() == FALSE)
{ //wrap normals on T
for (S32 i = 0; i < mNumS; i++)
{
- LLVector3 norm = mVertices[i].mNormal + mVertices[mNumS*(mNumT-1)+i].mNormal;
- mVertices[i].mNormal = norm;
- mVertices[mNumS*(mNumT-1)+i].mNormal = norm;
+ LLVector4a n;
+ n.setAdd(norm[i], norm[mNumS*(mNumT-1)+i]);
+ norm[i] = n;
+ norm[mNumS*(mNumT-1)+i] = n;
}
}
@@ -5400,9 +7100,10 @@ BOOL LLVolumeFace::createSide(LLVolume* volume, BOOL partial_build)
{ //wrap normals on S
for (S32 i = 0; i < mNumT; i++)
{
- LLVector3 norm = mVertices[mNumS*i].mNormal + mVertices[mNumS*i+mNumS-1].mNormal;
- mVertices[mNumS * i].mNormal = norm;
- mVertices[mNumS * i+mNumS-1].mNormal = norm;
+ LLVector4a n;
+ n.setAdd(norm[mNumS*i], norm[mNumS*i+mNumS-1]);
+ norm[mNumS * i] = n;
+ norm[mNumS * i+mNumS-1] = n;
}
}
@@ -5413,7 +7114,7 @@ BOOL LLVolumeFace::createSide(LLVolume* volume, BOOL partial_build)
{ //all lower S have same normal
for (S32 i = 0; i < mNumT; i++)
{
- mVertices[mNumS*i].mNormal = LLVector3(1,0,0);
+ norm[mNumS*i].set(1,0,0);
}
}
@@ -5421,12 +7122,11 @@ BOOL LLVolumeFace::createSide(LLVolume* volume, BOOL partial_build)
{ //all upper S have same normal
for (S32 i = 0; i < mNumT; i++)
{
- mVertices[mNumS*i+mNumS-1].mNormal = LLVector3(-1,0,0);
+ norm[mNumS*i+mNumS-1].set(-1,0,0);
}
}
}
}
-
else // logic for sculpt volumes
{
BOOL average_poles = FALSE;
@@ -5449,30 +7149,33 @@ BOOL LLVolumeFace::createSide(LLVolume* volume, BOOL partial_build)
{
// average normals for north pole
- LLVector3 average(0.0, 0.0, 0.0);
+ LLVector4a average;
+ average.clear();
+
for (S32 i = 0; i < mNumS; i++)
{
- average += mVertices[i].mNormal;
+ average.add(norm[i]);
}
// set average
for (S32 i = 0; i < mNumS; i++)
{
- mVertices[i].mNormal = average;
+ norm[i] = average;
}
// average normals for south pole
- average = LLVector3(0.0, 0.0, 0.0);
+ average.clear();
+
for (S32 i = 0; i < mNumS; i++)
{
- average += mVertices[i + mNumS * (mNumT - 1)].mNormal;
+ average.add(norm[i + mNumS * (mNumT - 1)]);
}
// set average
for (S32 i = 0; i < mNumS; i++)
{
- mVertices[i + mNumS * (mNumT - 1)].mNormal = average;
+ norm[i + mNumS * (mNumT - 1)] = average;
}
}
@@ -5482,23 +7185,22 @@ BOOL LLVolumeFace::createSide(LLVolume* volume, BOOL partial_build)
{
for (S32 i = 0; i < mNumT; i++)
{
- LLVector3 norm = mVertices[mNumS*i].mNormal + mVertices[mNumS*i+mNumS-1].mNormal;
- mVertices[mNumS * i].mNormal = norm;
- mVertices[mNumS * i+mNumS-1].mNormal = norm;
+ LLVector4a n;
+ n.setAdd(norm[mNumS*i], norm[mNumS*i+mNumS-1]);
+ norm[mNumS * i] = n;
+ norm[mNumS * i+mNumS-1] = n;
}
}
-
-
if (wrap_t)
{
for (S32 i = 0; i < mNumS; i++)
{
- LLVector3 norm = mVertices[i].mNormal + mVertices[mNumS*(mNumT-1)+i].mNormal;
- mVertices[i].mNormal = norm;
- mVertices[mNumS*(mNumT-1)+i].mNormal = norm;
+ LLVector4a n;
+ n.setAdd(norm[i], norm[mNumS*(mNumT-1)+i]);
+ norm[i] = n;
+ norm[mNumS*(mNumT-1)+i] = n;
}
-
}
}
@@ -5508,41 +7210,51 @@ BOOL LLVolumeFace::createSide(LLVolume* volume, BOOL partial_build)
// Finds binormal based on three vertices with texture coordinates.
// Fills in dummy values if the triangle has degenerate texture coordinates.
-LLVector3 calc_binormal_from_triangle(
- const LLVector3& pos0,
+void calc_binormal_from_triangle(LLVector4a& binormal,
+
+ const LLVector4a& pos0,
const LLVector2& tex0,
- const LLVector3& pos1,
+ const LLVector4a& pos1,
const LLVector2& tex1,
- const LLVector3& pos2,
+ const LLVector4a& pos2,
const LLVector2& tex2)
{
- LLVector3 rx0( pos0.mV[VX], tex0.mV[VX], tex0.mV[VY] );
- LLVector3 rx1( pos1.mV[VX], tex1.mV[VX], tex1.mV[VY] );
- LLVector3 rx2( pos2.mV[VX], tex2.mV[VX], tex2.mV[VY] );
+ LLVector4a rx0( pos0[VX], tex0.mV[VX], tex0.mV[VY] );
+ LLVector4a rx1( pos1[VX], tex1.mV[VX], tex1.mV[VY] );
+ LLVector4a rx2( pos2[VX], tex2.mV[VX], tex2.mV[VY] );
- LLVector3 ry0( pos0.mV[VY], tex0.mV[VX], tex0.mV[VY] );
- LLVector3 ry1( pos1.mV[VY], tex1.mV[VX], tex1.mV[VY] );
- LLVector3 ry2( pos2.mV[VY], tex2.mV[VX], tex2.mV[VY] );
+ LLVector4a ry0( pos0[VY], tex0.mV[VX], tex0.mV[VY] );
+ LLVector4a ry1( pos1[VY], tex1.mV[VX], tex1.mV[VY] );
+ LLVector4a ry2( pos2[VY], tex2.mV[VX], tex2.mV[VY] );
- LLVector3 rz0( pos0.mV[VZ], tex0.mV[VX], tex0.mV[VY] );
- LLVector3 rz1( pos1.mV[VZ], tex1.mV[VX], tex1.mV[VY] );
- LLVector3 rz2( pos2.mV[VZ], tex2.mV[VX], tex2.mV[VY] );
+ LLVector4a rz0( pos0[VZ], tex0.mV[VX], tex0.mV[VY] );
+ LLVector4a rz1( pos1[VZ], tex1.mV[VX], tex1.mV[VY] );
+ LLVector4a rz2( pos2[VZ], tex2.mV[VX], tex2.mV[VY] );
- LLVector3 r0 = (rx0 - rx1) % (rx0 - rx2);
- LLVector3 r1 = (ry0 - ry1) % (ry0 - ry2);
- LLVector3 r2 = (rz0 - rz1) % (rz0 - rz2);
+ LLVector4a lhs, rhs;
+
+ LLVector4a r0;
+ lhs.setSub(rx0, rx1); rhs.setSub(rx0, rx2);
+ r0.setCross3(lhs, rhs);
+
+ LLVector4a r1;
+ lhs.setSub(ry0, ry1); rhs.setSub(ry0, ry2);
+ r1.setCross3(lhs, rhs);
+
+ LLVector4a r2;
+ lhs.setSub(rz0, rz1); rhs.setSub(rz0, rz2);
+ r2.setCross3(lhs, rhs);
- if( r0.mV[VX] && r1.mV[VX] && r2.mV[VX] )
+ if( r0[VX] && r1[VX] && r2[VX] )
{
- LLVector3 binormal(
- -r0.mV[VZ] / r0.mV[VX],
- -r1.mV[VZ] / r1.mV[VX],
- -r2.mV[VZ] / r2.mV[VX]);
+ binormal.set(
+ -r0[VZ] / r0[VX],
+ -r1[VZ] / r1[VX],
+ -r2[VZ] / r2[VX]);
// binormal.normVec();
- return binormal;
}
else
{
- return LLVector3( 0, 1 , 0 );
+ binormal.set( 0, 1 , 0 );
}
}
diff --git a/indra/llmath/llvolume.h b/indra/llmath/llvolume.h
index 28b9895ff3..01bfbd858b 100644
--- a/indra/llmath/llvolume.h
+++ b/indra/llmath/llvolume.h
@@ -34,8 +34,13 @@ class LLPathParams;
class LLVolumeParams;
class LLProfile;
class LLPath;
+
+template <class T> class LLOctreeNode;
+
+class LLVector4a;
class LLVolumeFace;
class LLVolume;
+class LLVolumeTriangle;
#include "lldarray.h"
#include "lluuid.h"
@@ -43,6 +48,8 @@ class LLVolume;
//#include "vmath.h"
#include "v2math.h"
#include "v3math.h"
+#include "v3dmath.h"
+#include "v4math.h"
#include "llquaternion.h"
#include "llstrider.h"
#include "v4coloru.h"
@@ -177,12 +184,14 @@ const U8 LL_SCULPT_TYPE_SPHERE = 1;
const U8 LL_SCULPT_TYPE_TORUS = 2;
const U8 LL_SCULPT_TYPE_PLANE = 3;
const U8 LL_SCULPT_TYPE_CYLINDER = 4;
-
-const U8 LL_SCULPT_TYPE_MASK = LL_SCULPT_TYPE_SPHERE | LL_SCULPT_TYPE_TORUS | LL_SCULPT_TYPE_PLANE | LL_SCULPT_TYPE_CYLINDER;
+const U8 LL_SCULPT_TYPE_MESH = 5;
+const U8 LL_SCULPT_TYPE_MASK = LL_SCULPT_TYPE_SPHERE | LL_SCULPT_TYPE_TORUS | LL_SCULPT_TYPE_PLANE |
+ LL_SCULPT_TYPE_CYLINDER | LL_SCULPT_TYPE_MESH;
const U8 LL_SCULPT_FLAG_INVERT = 64;
const U8 LL_SCULPT_FLAG_MIRROR = 128;
+const S32 LL_SCULPT_MESH_MAX_FACES = 8;
class LLProfileParams
{
@@ -569,6 +578,9 @@ public:
BOOL importLegacyStream(std::istream& input_stream);
BOOL exportLegacyStream(std::ostream& output_stream) const;
+ LLSD sculptAsLLSD() const;
+ bool sculptFromLLSD(LLSD& sd);
+
LLSD asLLSD() const;
operator LLSD() const { return asLLSD(); }
bool fromLLSD(LLSD& sd);
@@ -628,7 +640,8 @@ public:
const F32& getSkew() const { return mPathParams.getSkew(); }
const LLUUID& getSculptID() const { return mSculptID; }
const U8& getSculptType() const { return mSculptType; }
-
+ bool isSculpt() const;
+ bool isMeshSculpt() const;
BOOL isConvex() const;
// 'begin' and 'end' should be in range [0, 1] (they will be clamped)
@@ -779,30 +792,88 @@ public:
class LLVolumeFace
{
public:
- LLVolumeFace() :
- mID(0),
- mTypeMask(0),
- mHasBinormals(FALSE),
- mBeginS(0),
- mBeginT(0),
- mNumS(0),
- mNumT(0)
+ class VertexData
{
- }
+ enum
+ {
+ POSITION = 0,
+ NORMAL = 1
+ };
+
+ private:
+ void init();
+ public:
+ VertexData();
+ VertexData(const VertexData& rhs);
+ const VertexData& operator=(const VertexData& rhs);
+
+ ~VertexData();
+ LLVector4a& getPosition();
+ LLVector4a& getNormal();
+ const LLVector4a& getPosition() const;
+ const LLVector4a& getNormal() const;
+ void setPosition(const LLVector4a& pos);
+ void setNormal(const LLVector4a& norm);
+
+
+ LLVector2 mTexCoord;
+
+ bool operator<(const VertexData& rhs) const;
+ bool operator==(const VertexData& rhs) const;
+ bool compareNormal(const VertexData& rhs, F32 angle_cutoff) const;
+
+ private:
+ LLVector4a* mData;
+ };
+
+ LLVolumeFace();
+ LLVolumeFace(const LLVolumeFace& src);
+ LLVolumeFace& operator=(const LLVolumeFace& rhs);
+
+ ~LLVolumeFace();
+private:
+ void freeData();
+public:
BOOL create(LLVolume* volume, BOOL partial_build = FALSE);
void createBinormals();
- void makeTriStrip();
- class VertexData
+ void appendFace(const LLVolumeFace& face, LLMatrix4& transform, LLMatrix4& normal_tranform);
+
+ void resizeVertices(S32 num_verts);
+ void allocateBinormals(S32 num_verts);
+ void allocateWeights(S32 num_verts);
+ void resizeIndices(S32 num_indices);
+ void fillFromLegacyData(std::vector<LLVolumeFace::VertexData>& v, std::vector<U16>& idx);
+
+ void pushVertex(const VertexData& cv);
+ void pushVertex(const LLVector4a& pos, const LLVector4a& norm, const LLVector2& tc);
+ void pushIndex(const U16& idx);
+
+ void swapData(LLVolumeFace& rhs);
+
+ void getVertexData(U16 indx, LLVolumeFace::VertexData& cv);
+
+ class VertexMapData : public LLVolumeFace::VertexData
{
public:
- LLVector3 mPosition;
- LLVector3 mNormal;
- LLVector3 mBinormal;
- LLVector2 mTexCoord;
+ U16 mIndex;
+
+ bool operator==(const LLVolumeFace::VertexData& rhs) const;
+
+ struct ComparePosition
+ {
+ bool operator()(const LLVector3& a, const LLVector3& b) const;
+ };
+
+ typedef std::map<LLVector3, std::vector<VertexMapData>, VertexMapData::ComparePosition > PointMap;
};
+ void optimize(F32 angle_cutoff = 2.f);
+ void cacheOptimize();
+
+ void createOctree(F32 scaler = 0.25f, const LLVector4a& center = LLVector4a(0,0,0), const LLVector4a& size = LLVector4a(0.5f,0.5f,0.5f));
+
enum
{
SINGLE_MASK = 0x0001,
@@ -821,23 +892,35 @@ public:
public:
S32 mID;
U32 mTypeMask;
- LLVector3 mCenter;
- BOOL mHasBinormals;
-
+
// Only used for INNER/OUTER faces
S32 mBeginS;
S32 mBeginT;
S32 mNumS;
S32 mNumT;
- LLVector3 mExtents[2]; //minimum and maximum point of face
- LLVector2 mTexCoordExtents[2]; //minimum and maximum of texture coordinates of the face.
+ LLVector4a* mExtents; //minimum and maximum point of face
+ LLVector4a* mCenter;
+ LLVector2 mTexCoordExtents[2]; //minimum and maximum of texture coordinates of the face.
+
+ S32 mNumVertices;
+ S32 mNumIndices;
+
+ LLVector4a* mPositions;
+ LLVector4a* mNormals;
+ LLVector4a* mBinormals;
+ LLVector2* mTexCoords;
+ U16* mIndices;
- std::vector<VertexData> mVertices;
- std::vector<U16> mIndices;
- std::vector<U16> mTriStrip;
std::vector<S32> mEdge;
+ //list of skin weights for rigged volumes
+ // format is mWeights[vertex_index].mV[influence] = <joint_index>.<weight>
+ // mWeights.size() should be empty or match mVertices.size()
+ LLVector4a* mWeights;
+
+ LLOctreeNode<LLVolumeTriangle>* mOctree;
+
private:
BOOL createUnCutCubeCap(LLVolume* volume, BOOL partial_build = FALSE);
BOOL createCap(LLVolume* volume, BOOL partial_build = FALSE);
@@ -848,8 +931,7 @@ class LLVolume : public LLRefCount
{
friend class LLVolumeLODGroup;
-private:
- LLVolume(const LLVolume&); // Don't implement
+protected:
~LLVolume(); // use unref
public:
@@ -871,7 +953,7 @@ public:
U8 getProfileType() const { return mParams.getProfileParams().getCurveType(); }
U8 getPathType() const { return mParams.getPathParams().getCurveType(); }
- S32 getNumFaces() const { return (S32)mProfilep->mFaces.size(); }
+ S32 getNumFaces() const;
S32 getNumVolumeFaces() const { return mVolumeFaces.size(); }
F32 getDetail() const { return mDetail; }
const LLVolumeParams& getParams() const { return mParams; }
@@ -893,15 +975,17 @@ public:
BOOL isUnique() const { return mUnique; }
S32 getSculptLevel() const { return mSculptLevel; }
-
+ void setSculptLevel(S32 level) { mSculptLevel = level; }
+
S32 *getTriangleIndices(U32 &num_indices) const;
// returns number of triangle indeces required for path/profile mesh
S32 getNumTriangleIndices() const;
+ S32 getNumTriangles() const;
+
void generateSilhouetteVertices(std::vector<LLVector3> &vertices,
std::vector<LLVector3> &normals,
- std::vector<S32> &segments,
const LLVector3& view_vec,
const LLMatrix4& mat,
const LLMatrix3& norm_mat,
@@ -917,6 +1001,13 @@ public:
LLVector3* normal = NULL, // return the surface normal at the intersection point
LLVector3* bi_normal = NULL // return the surface bi-normal at the intersection point
);
+
+ S32 lineSegmentIntersect(const LLVector4a& start, const LLVector4a& end,
+ S32 face = 1,
+ LLVector3* intersection = NULL,
+ LLVector2* tex_coord = NULL,
+ LLVector3* normal = NULL,
+ LLVector3* bi_normal = NULL);
// The following cleans up vertices and triangles,
// getting rid of degenerate triangles and duplicate vertices,
@@ -938,11 +1029,14 @@ public:
friend std::ostream& operator<<(std::ostream &s, const LLVolume *volumep); // HACK to bypass Windoze confusion over
// conversion if *(LLVolume*) to LLVolume&
const LLVolumeFace &getVolumeFace(const S32 f) const {return mVolumeFaces[f];} // DO NOT DELETE VOLUME WHILE USING THIS REFERENCE, OR HOLD A POINTER TO THIS VOLUMEFACE
-
+
U32 mFaceMask; // bit array of which faces exist in this volume
LLVector3 mLODScaleBias; // vector for biasing LOD based on scale
void sculpt(U16 sculpt_width, U16 sculpt_height, S8 sculpt_components, const U8* sculpt_data, S32 sculpt_level);
+ void copyVolumeFaces(const LLVolume* volume);
+ void cacheOptimize();
+
private:
void sculptGenerateMapVertices(U16 sculpt_width, U16 sculpt_height, S8 sculpt_components, const U8* sculpt_data, U8 sculpt_type);
F32 sculptGetSurfaceArea();
@@ -953,35 +1047,56 @@ private:
protected:
BOOL generate();
void createVolumeFaces();
+public:
+ virtual bool unpackVolumeFaces(std::istream& is, S32 size);
+
+ virtual void makeTetrahedron();
+ virtual BOOL isTetrahedron();
protected:
BOOL mUnique;
F32 mDetail;
S32 mSculptLevel;
+ BOOL mIsTetrahedron;
LLVolumeParams mParams;
LLPath *mPathp;
LLProfile *mProfilep;
std::vector<Point> mMesh;
-
+
BOOL mGenerateSingleFace;
typedef std::vector<LLVolumeFace> face_list_t;
face_list_t mVolumeFaces;
+
+public:
+ LLVector4a* mHullPoints;
+ U16* mHullIndices;
+ S32 mNumHullPoints;
+ S32 mNumHullIndices;
};
std::ostream& operator<<(std::ostream &s, const LLVolumeParams &volume_params);
-LLVector3 calc_binormal_from_triangle(
- const LLVector3& pos0,
+void calc_binormal_from_triangle(
+ LLVector4a& binormal,
+ const LLVector4a& pos0,
const LLVector2& tex0,
- const LLVector3& pos1,
+ const LLVector4a& pos1,
const LLVector2& tex1,
- const LLVector3& pos2,
+ const LLVector4a& pos2,
const LLVector2& tex2);
+BOOL LLLineSegmentBoxIntersect(const F32* start, const F32* end, const F32* center, const F32* size);
BOOL LLLineSegmentBoxIntersect(const LLVector3& start, const LLVector3& end, const LLVector3& center, const LLVector3& size);
+BOOL LLLineSegmentBoxIntersect(const LLVector4a& start, const LLVector4a& end, const LLVector4a& center, const LLVector4a& size);
+
BOOL LLTriangleRayIntersect(const LLVector3& vert0, const LLVector3& vert1, const LLVector3& vert2, const LLVector3& orig, const LLVector3& dir,
- F32* intersection_a, F32* intersection_b, F32* intersection_t, BOOL two_sided);
+ F32& intersection_a, F32& intersection_b, F32& intersection_t, BOOL two_sided);
+
+BOOL LLTriangleRayIntersect(const LLVector4a& vert0, const LLVector4a& vert1, const LLVector4a& vert2, const LLVector4a& orig, const LLVector4a& dir,
+ F32& intersection_a, F32& intersection_b, F32& intersection_t);
+BOOL LLTriangleRayIntersectTwoSided(const LLVector4a& vert0, const LLVector4a& vert1, const LLVector4a& vert2, const LLVector4a& orig, const LLVector4a& dir,
+ F32& intersection_a, F32& intersection_b, F32& intersection_t);
diff --git a/indra/llmath/llvolumemgr.cpp b/indra/llmath/llvolumemgr.cpp
index 88c195936c..c60b750088 100644
--- a/indra/llmath/llvolumemgr.cpp
+++ b/indra/llmath/llvolumemgr.cpp
@@ -314,7 +314,7 @@ BOOL LLVolumeLODGroup::derefLOD(LLVolume *volumep)
{
llassert_always(mLODRefs[i] > 0);
mLODRefs[i]--;
-#if 1 // SJB: Possible opt: keep other lods around
+#if 0 // SJB: Possible opt: keep other lods around
if (!mLODRefs[i])
{
mVolumeLODs[i] = NULL;
@@ -369,6 +369,19 @@ F32 LLVolumeLODGroup::getVolumeScaleFromDetail(const S32 detail)
return mDetailScales[detail];
}
+S32 LLVolumeLODGroup::getVolumeDetailFromScale(const F32 detail)
+{
+ for (S32 i = 1; i < 4; i++)
+ {
+ if (mDetailScales[i] > detail)
+ {
+ return i-1;
+ }
+ }
+
+ return 3;
+}
+
F32 LLVolumeLODGroup::dump()
{
F32 usage = 0.f;
diff --git a/indra/llmath/llvolumemgr.h b/indra/llmath/llvolumemgr.h
index 5257da2693..c75906f675 100644
--- a/indra/llmath/llvolumemgr.h
+++ b/indra/llmath/llvolumemgr.h
@@ -53,6 +53,7 @@ public:
static S32 getDetailFromTan(const F32 tan_angle);
static void getDetailProximity(const F32 tan_angle, F32 &to_lower, F32& to_higher);
static F32 getVolumeScaleFromDetail(const S32 detail);
+ static S32 getVolumeDetailFromScale(F32 scale);
LLVolume* refLOD(const S32 detail);
BOOL derefLOD(LLVolume *volumep);
diff --git a/indra/llmath/llvolumeoctree.cpp b/indra/llmath/llvolumeoctree.cpp
new file mode 100644
index 0000000000..b5a935c2b5
--- /dev/null
+++ b/indra/llmath/llvolumeoctree.cpp
@@ -0,0 +1,256 @@
+/**
+
+ * @file llvolumeoctree.cpp
+ *
+ * $LicenseInfo:firstyear=2002&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llvolumeoctree.h"
+#include "llvector4a.h"
+
+BOOL LLLineSegmentBoxIntersect(const LLVector4a& start, const LLVector4a& end, const LLVector4a& center, const LLVector4a& size)
+{
+ LLVector4a fAWdU;
+ LLVector4a dir;
+ LLVector4a diff;
+
+ dir.setSub(end, start);
+ dir.mul(0.5f);
+
+ diff.setAdd(end,start);
+ diff.mul(0.5f);
+ diff.sub(center);
+ fAWdU.setAbs(dir);
+
+ LLVector4a rhs;
+ rhs.setAdd(size, fAWdU);
+
+ LLVector4a lhs;
+ lhs.setAbs(diff);
+
+ U32 grt = lhs.greaterThan(rhs).getGatheredBits();
+
+ if (grt & 0x7)
+ {
+ return false;
+ }
+
+ LLVector4a f;
+ f.setCross3(dir, diff);
+ f.setAbs(f);
+
+ LLVector4a v0, v1;
+
+ v0 = _mm_shuffle_ps(size, size,_MM_SHUFFLE(3,0,0,1));
+ v1 = _mm_shuffle_ps(fAWdU, fAWdU, _MM_SHUFFLE(3,1,2,2));
+ lhs.setMul(v0, v1);
+
+ v0 = _mm_shuffle_ps(size, size, _MM_SHUFFLE(3,1,2,2));
+ v1 = _mm_shuffle_ps(fAWdU, fAWdU, _MM_SHUFFLE(3,0,0,1));
+ rhs.setMul(v0, v1);
+ rhs.add(lhs);
+
+ grt = f.greaterThan(rhs).getGatheredBits();
+
+ return (grt & 0x7) ? false : true;
+}
+
+
+LLVolumeOctreeListener::LLVolumeOctreeListener(LLOctreeNode<LLVolumeTriangle>* node)
+{
+ node->addListener(this);
+}
+
+LLVolumeOctreeListener::~LLVolumeOctreeListener()
+{
+
+}
+
+void LLVolumeOctreeListener::handleChildAddition(const LLOctreeNode<LLVolumeTriangle>* parent,
+ LLOctreeNode<LLVolumeTriangle>* child)
+{
+ new LLVolumeOctreeListener(child);
+}
+
+
+LLOctreeTriangleRayIntersect::LLOctreeTriangleRayIntersect(const LLVector4a& start, const LLVector4a& dir,
+ const LLVolumeFace* face, F32* closest_t,
+ LLVector3* intersection,LLVector2* tex_coord, LLVector3* normal, LLVector3* bi_normal)
+ : mFace(face),
+ mStart(start),
+ mDir(dir),
+ mIntersection(intersection),
+ mTexCoord(tex_coord),
+ mNormal(normal),
+ mBinormal(bi_normal),
+ mClosestT(closest_t),
+ mHitFace(false)
+{
+ mEnd.setAdd(mStart, mDir);
+}
+
+void LLOctreeTriangleRayIntersect::traverse(const LLOctreeNode<LLVolumeTriangle>* node)
+{
+ LLVolumeOctreeListener* vl = (LLVolumeOctreeListener*) node->getListener(0);
+
+ /*const F32* start = mStart.getF32();
+ const F32* end = mEnd.getF32();
+ const F32* center = vl->mBounds[0].getF32();
+ const F32* size = vl->mBounds[1].getF32();*/
+
+ //if (LLLineSegmentBoxIntersect(mStart, mEnd, vl->mBounds[0], vl->mBounds[1]))
+ if (LLLineSegmentBoxIntersect(mStart.getF32ptr(), mEnd.getF32ptr(), vl->mBounds[0].getF32ptr(), vl->mBounds[1].getF32ptr()))
+ {
+ node->accept(this);
+ for (S32 i = 0; i < node->getChildCount(); ++i)
+ {
+ traverse(node->getChild(i));
+ }
+ }
+}
+
+void LLOctreeTriangleRayIntersect::visit(const LLOctreeNode<LLVolumeTriangle>* node)
+{
+ for (LLOctreeNode<LLVolumeTriangle>::const_element_iter iter =
+ node->getData().begin(); iter != node->getData().end(); ++iter)
+ {
+ const LLVolumeTriangle* tri = *iter;
+
+ F32 a, b, t;
+
+ if (LLTriangleRayIntersect(*tri->mV[0], *tri->mV[1], *tri->mV[2],
+ mStart, mDir, a, b, t))
+ {
+ if ((t >= 0.f) && // if hit is after start
+ (t <= 1.f) && // and before end
+ (t < *mClosestT)) // and this hit is closer
+ {
+ *mClosestT = t;
+ mHitFace = true;
+
+ if (mIntersection != NULL)
+ {
+ LLVector4a intersect = mDir;
+ intersect.mul(*mClosestT);
+ intersect.add(mStart);
+ mIntersection->set(intersect.getF32ptr());
+ }
+
+
+ if (mTexCoord != NULL)
+ {
+ LLVector2* tc = (LLVector2*) mFace->mTexCoords;
+ *mTexCoord = ((1.f - a - b) * tc[tri->mIndex[0]] +
+ a * tc[tri->mIndex[1]] +
+ b * tc[tri->mIndex[2]]);
+
+ }
+
+ if (mNormal != NULL)
+ {
+ LLVector4* norm = (LLVector4*) mFace->mNormals;
+
+ *mNormal = ((1.f - a - b) * LLVector3(norm[tri->mIndex[0]]) +
+ a * LLVector3(norm[tri->mIndex[1]]) +
+ b * LLVector3(norm[tri->mIndex[2]]));
+ }
+
+ if (mBinormal != NULL)
+ {
+ LLVector4* binormal = (LLVector4*) mFace->mBinormals;
+ *mBinormal = ((1.f - a - b) * LLVector3(binormal[tri->mIndex[0]]) +
+ a * LLVector3(binormal[tri->mIndex[1]]) +
+ b * LLVector3(binormal[tri->mIndex[2]]));
+ }
+ }
+ }
+ }
+}
+
+const LLVector4a& LLVolumeTriangle::getPositionGroup() const
+{
+ return mPositionGroup;
+}
+
+const F32& LLVolumeTriangle::getBinRadius() const
+{
+ return mRadius;
+}
+
+
+//TEST CODE
+
+void LLVolumeOctreeValidate::visit(const LLOctreeNode<LLVolumeTriangle>* branch)
+{
+ LLVolumeOctreeListener* node = (LLVolumeOctreeListener*) branch->getListener(0);
+
+ //make sure bounds matches extents
+ LLVector4a& min = node->mExtents[0];
+ LLVector4a& max = node->mExtents[1];
+
+ LLVector4a& center = node->mBounds[0];
+ LLVector4a& size = node->mBounds[1];
+
+ LLVector4a test_min, test_max;
+ test_min.setSub(center, size);
+ test_max.setAdd(center, size);
+
+ if (!test_min.equals3(min, 0.001f) ||
+ !test_max.equals3(max, 0.001f))
+ {
+ llerrs << "Bad bounding box data found." << llendl;
+ }
+
+ test_min.sub(LLVector4a(0.001f));
+ test_max.add(LLVector4a(0.001f));
+
+ for (U32 i = 0; i < branch->getChildCount(); ++i)
+ {
+ LLVolumeOctreeListener* child = (LLVolumeOctreeListener*) branch->getChild(i)->getListener(0);
+
+ //make sure all children fit inside this node
+ if (child->mExtents[0].lessThan(test_min).areAnySet(LLVector4Logical::MASK_XYZ) ||
+ child->mExtents[1].greaterThan(test_max).areAnySet(LLVector4Logical::MASK_XYZ))
+ {
+ llerrs << "Child protrudes from bounding box." << llendl;
+ }
+ }
+
+ //children fit, check data
+ for (LLOctreeNode<LLVolumeTriangle>::const_element_iter iter = branch->getData().begin();
+ iter != branch->getData().end(); ++iter)
+ {
+ const LLVolumeTriangle* tri = *iter;
+
+ //validate triangle
+ for (U32 i = 0; i < 3; i++)
+ {
+ if (tri->mV[i]->greaterThan(test_max).areAnySet(LLVector4Logical::MASK_XYZ) ||
+ tri->mV[i]->lessThan(test_min).areAnySet(LLVector4Logical::MASK_XYZ))
+ {
+ llerrs << "Triangle protrudes from node." << llendl;
+ }
+ }
+ }
+}
+
+
diff --git a/indra/llmath/llvolumeoctree.h b/indra/llmath/llvolumeoctree.h
new file mode 100644
index 0000000000..688d91dc40
--- /dev/null
+++ b/indra/llmath/llvolumeoctree.h
@@ -0,0 +1,134 @@
+/**
+ * @file llvolumeoctree.h
+ * @brief LLVolume octree classes.
+ *
+ * $LicenseInfo:firstyear=2002&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLVOLUME_OCTREE_H
+#define LL_LLVOLUME_OCTREE_H
+
+#include "linden_common.h"
+#include "llmemory.h"
+
+#include "lloctree.h"
+#include "llvolume.h"
+#include "llvector4a.h"
+
+class LLVolumeTriangle : public LLRefCount
+{
+public:
+ LLVolumeTriangle()
+ {
+
+ }
+
+ LLVolumeTriangle(const LLVolumeTriangle& rhs)
+ {
+ *this = rhs;
+ }
+
+ const LLVolumeTriangle& operator=(const LLVolumeTriangle& rhs)
+ {
+ llerrs << "Illegal operation!" << llendl;
+ return *this;
+ }
+
+ ~LLVolumeTriangle()
+ {
+
+ }
+
+ LLVector4a mPositionGroup;
+
+ const LLVector4a* mV[3];
+ U16 mIndex[3];
+
+ F32 mRadius;
+
+ virtual const LLVector4a& getPositionGroup() const;
+ virtual const F32& getBinRadius() const;
+};
+
+class LLVolumeOctreeListener : public LLOctreeListener<LLVolumeTriangle>
+{
+public:
+
+ LLVolumeOctreeListener(LLOctreeNode<LLVolumeTriangle>* node);
+ ~LLVolumeOctreeListener();
+
+ LLVolumeOctreeListener(const LLVolumeOctreeListener& rhs)
+ {
+ *this = rhs;
+ }
+
+ const LLVolumeOctreeListener& operator=(const LLVolumeOctreeListener& rhs)
+ {
+ llerrs << "Illegal operation!" << llendl;
+ return *this;
+ }
+
+ //LISTENER FUNCTIONS
+ virtual void handleChildAddition(const LLOctreeNode<LLVolumeTriangle>* parent,
+ LLOctreeNode<LLVolumeTriangle>* child);
+ virtual void handleStateChange(const LLTreeNode<LLVolumeTriangle>* node) { }
+ virtual void handleChildRemoval(const LLOctreeNode<LLVolumeTriangle>* parent,
+ const LLOctreeNode<LLVolumeTriangle>* child) { }
+ virtual void handleInsertion(const LLTreeNode<LLVolumeTriangle>* node, LLVolumeTriangle* tri) { }
+ virtual void handleRemoval(const LLTreeNode<LLVolumeTriangle>* node, LLVolumeTriangle* tri) { }
+ virtual void handleDestruction(const LLTreeNode<LLVolumeTriangle>* node) { }
+
+
+public:
+ LLVector4a mBounds[2]; // bounding box (center, size) of this node and all its children (tight fit to objects)
+ LLVector4a mExtents[2]; // extents (min, max) of this node and all its children
+};
+
+class LLOctreeTriangleRayIntersect : public LLOctreeTraveler<LLVolumeTriangle>
+{
+public:
+ const LLVolumeFace* mFace;
+ LLVector4a mStart;
+ LLVector4a mDir;
+ LLVector4a mEnd;
+ LLVector3* mIntersection;
+ LLVector2* mTexCoord;
+ LLVector3* mNormal;
+ LLVector3* mBinormal;
+ F32* mClosestT;
+ bool mHitFace;
+
+ LLOctreeTriangleRayIntersect(const LLVector4a& start, const LLVector4a& dir,
+ const LLVolumeFace* face, F32* closest_t,
+ LLVector3* intersection,LLVector2* tex_coord, LLVector3* normal, LLVector3* bi_normal);
+
+ void traverse(const LLOctreeNode<LLVolumeTriangle>* node);
+
+ virtual void visit(const LLOctreeNode<LLVolumeTriangle>* node);
+};
+
+class LLVolumeOctreeValidate : public LLOctreeTraveler<LLVolumeTriangle>
+{
+ virtual void visit(const LLOctreeNode<LLVolumeTriangle>* branch);
+};
+
+#endif
diff --git a/indra/llmath/m4math.cpp b/indra/llmath/m4math.cpp
index 946b1553fe..bad4deb4de 100644
--- a/indra/llmath/m4math.cpp
+++ b/indra/llmath/m4math.cpp
@@ -215,8 +215,33 @@ const LLMatrix4& LLMatrix4::transpose()
F32 LLMatrix4::determinant() const
{
- llerrs << "Not implemented!" << llendl;
- return 0.f;
+ F32 value =
+ mMatrix[0][3] * mMatrix[1][2] * mMatrix[2][1] * mMatrix[3][0] -
+ mMatrix[0][2] * mMatrix[1][3] * mMatrix[2][1] * mMatrix[3][0] -
+ mMatrix[0][3] * mMatrix[1][1] * mMatrix[2][2] * mMatrix[3][0] +
+ mMatrix[0][1] * mMatrix[1][3] * mMatrix[2][2] * mMatrix[3][0] +
+ mMatrix[0][2] * mMatrix[1][1] * mMatrix[2][3] * mMatrix[3][0] -
+ mMatrix[0][1] * mMatrix[1][2] * mMatrix[2][3] * mMatrix[3][0] -
+ mMatrix[0][3] * mMatrix[1][2] * mMatrix[2][0] * mMatrix[3][1] +
+ mMatrix[0][2] * mMatrix[1][3] * mMatrix[2][0] * mMatrix[3][1] +
+ mMatrix[0][3] * mMatrix[1][0] * mMatrix[2][2] * mMatrix[3][1] -
+ mMatrix[0][0] * mMatrix[1][3] * mMatrix[2][2] * mMatrix[3][1] -
+ mMatrix[0][2] * mMatrix[1][0] * mMatrix[2][3] * mMatrix[3][1] +
+ mMatrix[0][0] * mMatrix[1][2] * mMatrix[2][3] * mMatrix[3][1] +
+ mMatrix[0][3] * mMatrix[1][1] * mMatrix[2][0] * mMatrix[3][2] -
+ mMatrix[0][1] * mMatrix[1][3] * mMatrix[2][0] * mMatrix[3][2] -
+ mMatrix[0][3] * mMatrix[1][0] * mMatrix[2][1] * mMatrix[3][2] +
+ mMatrix[0][0] * mMatrix[1][3] * mMatrix[2][1] * mMatrix[3][2] +
+ mMatrix[0][1] * mMatrix[1][0] * mMatrix[2][3] * mMatrix[3][2] -
+ mMatrix[0][0] * mMatrix[1][1] * mMatrix[2][3] * mMatrix[3][2] -
+ mMatrix[0][2] * mMatrix[1][1] * mMatrix[2][0] * mMatrix[3][3] +
+ mMatrix[0][1] * mMatrix[1][2] * mMatrix[2][0] * mMatrix[3][3] +
+ mMatrix[0][2] * mMatrix[1][0] * mMatrix[2][1] * mMatrix[3][3] -
+ mMatrix[0][0] * mMatrix[1][2] * mMatrix[2][1] * mMatrix[3][3] -
+ mMatrix[0][1] * mMatrix[1][0] * mMatrix[2][2] * mMatrix[3][3] +
+ mMatrix[0][0] * mMatrix[1][1] * mMatrix[2][2] * mMatrix[3][3];
+
+ return value;
}
// Only works for pure orthonormal, homogeneous transform matrices.
@@ -422,6 +447,17 @@ const LLMatrix4& LLMatrix4::initRotTrans(const LLQuaternion &q, const LLVector
return (*this);
}
+const LLMatrix4& LLMatrix4::initScale(const LLVector3 &scale)
+{
+ setIdentity();
+
+ mMatrix[VX][VX] = scale.mV[VX];
+ mMatrix[VY][VY] = scale.mV[VY];
+ mMatrix[VZ][VZ] = scale.mV[VZ];
+
+ return (*this);
+}
+
const LLMatrix4& LLMatrix4::initAll(const LLVector3 &scale, const LLQuaternion &q, const LLVector3 &pos)
{
F32 sx, sy, sz;
@@ -642,37 +678,6 @@ const LLMatrix4& LLMatrix4::initMatrix(const LLMatrix3 &mat, const LLVector4 &
// LLMatrix4 Operators
-
-/* Not implemented to help enforce code consistency with the syntax of
- row-major notation. This is a Good Thing.
-LLVector4 operator*(const LLMatrix4 &a, const LLVector4 &b)
-{
- // Operate "to the right" on column-vector b
- LLVector4 vec;
- vec.mV[VX] = a.mMatrix[VX][VX] * b.mV[VX] +
- a.mMatrix[VY][VX] * b.mV[VY] +
- a.mMatrix[VZ][VX] * b.mV[VZ] +
- a.mMatrix[VW][VX] * b.mV[VW];
-
- vec.mV[VY] = a.mMatrix[VX][VY] * b.mV[VX] +
- a.mMatrix[VY][VY] * b.mV[VY] +
- a.mMatrix[VZ][VY] * b.mV[VZ] +
- a.mMatrix[VW][VY] * b.mV[VW];
-
- vec.mV[VZ] = a.mMatrix[VX][VZ] * b.mV[VX] +
- a.mMatrix[VY][VZ] * b.mV[VY] +
- a.mMatrix[VZ][VZ] * b.mV[VZ] +
- a.mMatrix[VW][VZ] * b.mV[VW];
-
- vec.mV[VW] = a.mMatrix[VX][VW] * b.mV[VX] +
- a.mMatrix[VY][VW] * b.mV[VY] +
- a.mMatrix[VZ][VW] * b.mV[VZ] +
- a.mMatrix[VW][VW] * b.mV[VW];
- return vec;
-}
-*/
-
-
LLVector4 operator*(const LLVector4 &a, const LLMatrix4 &b)
{
// Operate "to the left" on row-vector a
@@ -768,6 +773,23 @@ bool operator!=(const LLMatrix4 &a, const LLMatrix4 &b)
return FALSE;
}
+bool operator<(const LLMatrix4& a, const LLMatrix4 &b)
+{
+ U32 i, j;
+ for (i = 0; i < NUM_VALUES_IN_MAT4; i++)
+ {
+ for (j = 0; j < NUM_VALUES_IN_MAT4; j++)
+ {
+ if (a.mMatrix[i][j] != b.mMatrix[i][j])
+ {
+ return a.mMatrix[i][j] < b.mMatrix[i][j];
+ }
+ }
+ }
+
+ return false;
+}
+
const LLMatrix4& operator*=(LLMatrix4 &a, F32 k)
{
U32 i, j;
@@ -807,4 +829,54 @@ std::ostream& operator<<(std::ostream& s, const LLMatrix4 &a)
return s;
}
+LLSD LLMatrix4::getValue() const
+{
+ LLSD ret;
+
+ ret[0] = mMatrix[0][0];
+ ret[1] = mMatrix[0][1];
+ ret[2] = mMatrix[0][2];
+ ret[3] = mMatrix[0][3];
+
+ ret[4] = mMatrix[1][0];
+ ret[5] = mMatrix[1][1];
+ ret[6] = mMatrix[1][2];
+ ret[7] = mMatrix[1][3];
+
+ ret[8] = mMatrix[2][0];
+ ret[9] = mMatrix[2][1];
+ ret[10] = mMatrix[2][2];
+ ret[11] = mMatrix[2][3];
+
+ ret[12] = mMatrix[3][0];
+ ret[13] = mMatrix[3][1];
+ ret[14] = mMatrix[3][2];
+ ret[15] = mMatrix[3][3];
+
+ return ret;
+}
+
+void LLMatrix4::setValue(const LLSD& data)
+{
+ mMatrix[0][0] = data[0].asReal();
+ mMatrix[0][1] = data[1].asReal();
+ mMatrix[0][2] = data[2].asReal();
+ mMatrix[0][3] = data[3].asReal();
+
+ mMatrix[1][0] = data[4].asReal();
+ mMatrix[1][1] = data[5].asReal();
+ mMatrix[1][2] = data[6].asReal();
+ mMatrix[1][3] = data[7].asReal();
+
+ mMatrix[2][0] = data[8].asReal();
+ mMatrix[2][1] = data[9].asReal();
+ mMatrix[2][2] = data[10].asReal();
+ mMatrix[2][3] = data[11].asReal();
+
+ mMatrix[3][0] = data[12].asReal();
+ mMatrix[3][1] = data[13].asReal();
+ mMatrix[3][2] = data[14].asReal();
+ mMatrix[3][3] = data[15].asReal();
+}
+
diff --git a/indra/llmath/m4math.h b/indra/llmath/m4math.h
index 6ec9958491..a7dce10397 100644
--- a/indra/llmath/m4math.h
+++ b/indra/llmath/m4math.h
@@ -119,6 +119,8 @@ public:
~LLMatrix4(void); // Destructor
+ LLSD getValue() const;
+ void setValue(const LLSD&);
//////////////////////////////
//
@@ -132,6 +134,7 @@ public:
// various useful matrix functions
const LLMatrix4& setIdentity(); // Load identity matrix
+ bool isIdentity() const;
const LLMatrix4& setZero(); // Clears matrix to all zeros.
const LLMatrix4& initRotation(const F32 angle, const F32 x, const F32 y, const F32 z); // Calculate rotation matrix by rotating angle radians about (x, y, z)
@@ -153,6 +156,7 @@ public:
const LLMatrix4& initRotTrans(const F32 roll, const F32 pitch, const F32 yaw, const LLVector4 &pos); // Rotation from Euler + translation
const LLMatrix4& initRotTrans(const LLQuaternion &q, const LLVector4 &pos); // Set with Quaternion and position
+ const LLMatrix4& initScale(const LLVector3 &scale);
// Set all
const LLMatrix4& initAll(const LLVector3 &scale, const LLQuaternion &q, const LLVector3 &pos);
@@ -219,10 +223,7 @@ public:
// Operators
//
-// Not implemented to enforce code that agrees with symbolic syntax
-// friend LLVector4 operator*(const LLMatrix4 &a, const LLVector4 &b); // Apply rotation a to vector b
-
-// friend inline LLMatrix4 operator*(const LLMatrix4 &a, const LLMatrix4 &b); // Return a * b
+ // friend inline LLMatrix4 operator*(const LLMatrix4 &a, const LLMatrix4 &b); // Return a * b
friend LLVector4 operator*(const LLVector4 &a, const LLMatrix4 &b); // Return transform of vector a by matrix b
friend const LLVector3 operator*(const LLVector3 &a, const LLMatrix4 &b); // Return full transform of a by matrix b
friend LLVector4 rotate_vector(const LLVector4 &a, const LLMatrix4 &b); // Rotates a but does not translate
@@ -230,6 +231,7 @@ public:
friend bool operator==(const LLMatrix4 &a, const LLMatrix4 &b); // Return a == b
friend bool operator!=(const LLMatrix4 &a, const LLMatrix4 &b); // Return a != b
+ friend bool operator<(const LLMatrix4 &a, const LLMatrix4& b); // Return a < b
friend const LLMatrix4& operator+=(LLMatrix4 &a, const LLMatrix4 &b); // Return a + b
friend const LLMatrix4& operator-=(LLMatrix4 &a, const LLMatrix4 &b); // Return a - b
@@ -263,6 +265,30 @@ inline const LLMatrix4& LLMatrix4::setIdentity()
return (*this);
}
+inline bool LLMatrix4::isIdentity() const
+{
+ return
+ mMatrix[0][0] == 1.f &&
+ mMatrix[0][1] == 0.f &&
+ mMatrix[0][2] == 0.f &&
+ mMatrix[0][3] == 0.f &&
+
+ mMatrix[1][0] == 0.f &&
+ mMatrix[1][1] == 1.f &&
+ mMatrix[1][2] == 0.f &&
+ mMatrix[1][3] == 0.f &&
+
+ mMatrix[2][0] == 0.f &&
+ mMatrix[2][1] == 0.f &&
+ mMatrix[2][2] == 1.f &&
+ mMatrix[2][3] == 0.f &&
+
+ mMatrix[3][0] == 0.f &&
+ mMatrix[3][1] == 0.f &&
+ mMatrix[3][2] == 0.f &&
+ mMatrix[3][3] == 1.f;
+}
+
/*
inline LLMatrix4 operator*(const LLMatrix4 &a, const LLMatrix4 &b)
diff --git a/indra/llmath/tests/llbbox_test.cpp b/indra/llmath/tests/llbbox_test.cpp
index 8064ab217d..fd0dbb58fc 100644
--- a/indra/llmath/tests/llbbox_test.cpp
+++ b/indra/llmath/tests/llbbox_test.cpp
@@ -34,7 +34,7 @@
#define ANGLE (3.14159265f / 2.0f)
-#define APPROX_EQUAL(a, b) dist_vec((a),(b)) < 1e-5
+#define APPROX_EQUAL(a, b) (dist_vec_squared((a),(b)) < 1e-10)
namespace tut
{
diff --git a/indra/llmath/tests/llquaternion_test.cpp b/indra/llmath/tests/llquaternion_test.cpp
index 9e79b299ff..e69010b2d6 100644
--- a/indra/llmath/tests/llquaternion_test.cpp
+++ b/indra/llmath/tests/llquaternion_test.cpp
@@ -29,12 +29,12 @@
#include "linden_common.h"
#include "../test/lltut.h"
-#include "../llquaternion.h"
#include "../v4math.h"
#include "../v3math.h"
#include "../v3dmath.h"
#include "../m4math.h"
#include "../m3math.h"
+#include "../llquaternion.h"
namespace tut
{
diff --git a/indra/llmath/tests/v2math_test.cpp b/indra/llmath/tests/v2math_test.cpp
index 9747996b25..4d6a2eca93 100644
--- a/indra/llmath/tests/v2math_test.cpp
+++ b/indra/llmath/tests/v2math_test.cpp
@@ -85,7 +85,7 @@ namespace tut
F32 x = 2.2345f, y = 3.5678f ;
LLVector2 vec2(x,y);
ensure("magVecSquared:Fail ", is_approx_equal(vec2.magVecSquared(), (x*x + y*y)));
- ensure("magVec:Fail ", is_approx_equal(vec2.magVec(), fsqrtf(x*x + y*y)));
+ ensure("magVec:Fail ", is_approx_equal(vec2.magVec(), (F32) sqrt(x*x + y*y)));
}
template<> template<>
@@ -407,7 +407,7 @@ namespace tut
ensure_equals("dist_vec_squared values are not equal",val2, val1);
val1 = dist_vec(vec2, vec3);
- val2 = fsqrtf((x1 - x2)*(x1 - x2) + (y1 - y2)* (y1 - y2));
+ val2 = (F32) sqrt((x1 - x2)*(x1 - x2) + (y1 - y2)* (y1 - y2));
ensure_equals("dist_vec values are not equal",val2, val1);
}
@@ -431,7 +431,7 @@ namespace tut
LLVector2 vec2(x1, y1);
F32 vecMag = vec2.normVec();
- F32 mag = fsqrtf(x1*x1 + y1*y1);
+ F32 mag = (F32) sqrt(x1*x1 + y1*y1);
F32 oomag = 1.f / mag;
val1 = x1 * oomag;
diff --git a/indra/llmath/tests/v3color_test.cpp b/indra/llmath/tests/v3color_test.cpp
index 2c00f00ab3..29d1c483ab 100644
--- a/indra/llmath/tests/v3color_test.cpp
+++ b/indra/llmath/tests/v3color_test.cpp
@@ -93,7 +93,7 @@ namespace tut
F32 r = 2.3436212f, g = 1231.f, b = 4.7849321232f;
LLColor3 llcolor3(r,g,b);
ensure("magVecSquared:Fail ", is_approx_equal(llcolor3.magVecSquared(), (r*r + g*g + b*b)));
- ensure("magVec:Fail ", is_approx_equal(llcolor3.magVec(), fsqrtf(r*r + g*g + b*b)));
+ ensure("magVec:Fail ", is_approx_equal(llcolor3.magVec(), (F32) sqrt(r*r + g*g + b*b)));
}
template<> template<>
@@ -103,7 +103,7 @@ namespace tut
F32 val1, val2,val3;
LLColor3 llcolor3(r,g,b);
F32 vecMag = llcolor3.normVec();
- F32 mag = fsqrtf(r*r + g*g + b*b);
+ F32 mag = (F32) sqrt(r*r + g*g + b*b);
F32 oomag = 1.f / mag;
val1 = r * oomag;
val2 = g * oomag;
@@ -286,7 +286,7 @@ namespace tut
F32 r1 =1.f, g1 = 2.f,b1 = 1.2f, r2 = -2.3f, g2 = 1.11f, b2 = 1234.234f;
LLColor3 llcolor3(r1,g1,b1),llcolor3a(r2,g2,b2);
F32 val = distVec(llcolor3,llcolor3a);
- ensure("distVec failed ", is_approx_equal(fsqrtf((r1-r2)*(r1-r2) + (g1-g2)*(g1-g2) + (b1-b2)*(b1-b2)) ,val));
+ ensure("distVec failed ", is_approx_equal((F32) sqrt((r1-r2)*(r1-r2) + (g1-g2)*(g1-g2) + (b1-b2)*(b1-b2)) ,val));
F32 val1 = distVec_squared(llcolor3,llcolor3a);
ensure("distVec_squared failed ", is_approx_equal(((r1-r2)*(r1-r2) + (g1-g2)*(g1-g2) + (b1-b2)*(b1-b2)) ,val1));
diff --git a/indra/llmath/tests/v3dmath_test.cpp b/indra/llmath/tests/v3dmath_test.cpp
index b67346f4e5..20b26faa12 100644
--- a/indra/llmath/tests/v3dmath_test.cpp
+++ b/indra/llmath/tests/v3dmath_test.cpp
@@ -30,11 +30,11 @@
#include "llsd.h"
#include "../test/lltut.h"
-#include "../llquaternion.h"
#include "../m3math.h"
#include "../v4math.h"
#include "../v3dmath.h"
#include "../v3dmath.h"
+#include "../llquaternion.h"
namespace tut
{
@@ -403,7 +403,7 @@ namespace tut
LLVector3d vec3D(x,y,z);
F64 res = (x*x + y*y + z*z) - vec3D.magVecSquared();
ensure("1:magVecSquared:Fail ", ((-F_APPROXIMATELY_ZERO <= res)&& (res <=F_APPROXIMATELY_ZERO)));
- res = fsqrtf(x*x + y*y + z*z) - vec3D.magVec();
+ res = (F32) sqrt(x*x + y*y + z*z) - vec3D.magVec();
ensure("2:magVec: Fail ", ((-F_APPROXIMATELY_ZERO <= res)&& (res <=F_APPROXIMATELY_ZERO)));
}
diff --git a/indra/llmath/tests/v3math_test.cpp b/indra/llmath/tests/v3math_test.cpp
index e4732bf861..df7a77002f 100644
--- a/indra/llmath/tests/v3math_test.cpp
+++ b/indra/llmath/tests/v3math_test.cpp
@@ -30,12 +30,12 @@
#include "../test/lltut.h"
#include "llsd.h"
-#include "../llquaternion.h"
-#include "../llquantize.h"
#include "../v3dmath.h"
#include "../m3math.h"
#include "../v4math.h"
#include "../v3math.h"
+#include "../llquaternion.h"
+#include "../llquantize.h"
namespace tut
@@ -149,7 +149,7 @@ namespace tut
F32 x = 2.32f, y = 1.212f, z = -.12f;
LLVector3 vec3(x,y,z);
ensure("1:magVecSquared:Fail ", is_approx_equal(vec3.magVecSquared(), (x*x + y*y + z*z)));
- ensure("2:magVec:Fail ", is_approx_equal(vec3.magVec(), fsqrtf(x*x + y*y + z*z)));
+ ensure("2:magVec:Fail ", is_approx_equal(vec3.magVec(), (F32) sqrt(x*x + y*y + z*z)));
}
template<> template<>
@@ -509,7 +509,7 @@ namespace tut
F32 val1,val2;
LLVector3 vec3(x1,y1,z1),vec3a(x2,y2,z2);
val1 = dist_vec(vec3,vec3a);
- val2 = fsqrtf((x1 - x2)*(x1 - x2) + (y1 - y2)* (y1 - y2) + (z1 - z2)* (z1 -z2));
+ val2 = (F32) sqrt((x1 - x2)*(x1 - x2) + (y1 - y2)* (y1 - y2) + (z1 - z2)* (z1 -z2));
ensure_equals("1:dist_vec: Fail ",val2, val1);
val1 = dist_vec_squared(vec3,vec3a);
val2 =((x1 - x2)*(x1 - x2) + (y1 - y2)* (y1 - y2) + (z1 - z2)* (z1 -z2));
diff --git a/indra/llmath/tests/v4color_test.cpp b/indra/llmath/tests/v4color_test.cpp
index fbd43625d1..d7eec3c87f 100644
--- a/indra/llmath/tests/v4color_test.cpp
+++ b/indra/llmath/tests/v4color_test.cpp
@@ -155,7 +155,7 @@ namespace tut
F32 r = 0x20, g = 0xFFFF, b = 0xFF;
LLColor4 llcolor4(r,g,b);
ensure("magVecSquared:Fail ", is_approx_equal(llcolor4.magVecSquared(), (r*r + g*g + b*b)));
- ensure("magVec:Fail ", is_approx_equal(llcolor4.magVec(), fsqrtf(r*r + g*g + b*b)));
+ ensure("magVec:Fail ", is_approx_equal(llcolor4.magVec(), (F32) sqrt(r*r + g*g + b*b)));
}
template<> template<>
@@ -164,7 +164,7 @@ namespace tut
F32 r = 0x20, g = 0xFFFF, b = 0xFF;
LLColor4 llcolor4(r,g,b);
F32 vecMag = llcolor4.normVec();
- F32 mag = fsqrtf(r*r + g*g + b*b);
+ F32 mag = (F32) sqrt(r*r + g*g + b*b);
F32 oomag = 1.f / mag;
F32 val1 = r * oomag, val2 = g * oomag, val3 = b * oomag;
ensure("1:normVec failed ", (is_approx_equal(val1, llcolor4.mV[0]) && is_approx_equal(val2, llcolor4.mV[1]) && is_approx_equal(val3, llcolor4.mV[2]) && is_approx_equal(vecMag, mag)));
diff --git a/indra/llmath/tests/v4coloru_test.cpp b/indra/llmath/tests/v4coloru_test.cpp
index 6d84ba41ef..128f6f3564 100644
--- a/indra/llmath/tests/v4coloru_test.cpp
+++ b/indra/llmath/tests/v4coloru_test.cpp
@@ -135,7 +135,7 @@ namespace tut
U8 r = 0x12, g = 0xFF, b = 0xAF;
LLColor4U llcolor4u(r,g,b);
ensure("magVecSquared:Fail ", is_approx_equal(llcolor4u.magVecSquared(), (F32)(r*r + g*g + b*b)));
- ensure("magVec:Fail ", is_approx_equal(llcolor4u.magVec(), fsqrtf(r*r + g*g + b*b)));
+ ensure("magVec:Fail ", is_approx_equal(llcolor4u.magVec(), (F32) sqrt((F32) (r*r + g*g + b*b))));
}
template<> template<>
diff --git a/indra/llmath/tests/v4math_test.cpp b/indra/llmath/tests/v4math_test.cpp
index b1f934e555..191ac864df 100644
--- a/indra/llmath/tests/v4math_test.cpp
+++ b/indra/llmath/tests/v4math_test.cpp
@@ -30,9 +30,9 @@
#include "../test/lltut.h"
#include "llsd.h"
-#include "../llquaternion.h"
#include "../m4math.h"
#include "../v4math.h"
+#include "../llquaternion.h"
namespace tut
{
@@ -96,7 +96,7 @@ namespace tut
{
F32 x = 10.f, y = -2.3f, z = -.023f;
LLVector4 vec4(x,y,z);
- ensure("magVec:Fail ", is_approx_equal(vec4.magVec(), fsqrtf(x*x + y*y + z*z)));
+ ensure("magVec:Fail ", is_approx_equal(vec4.magVec(), (F32) sqrt(x*x + y*y + z*z)));
ensure("magVecSquared:Fail ", is_approx_equal(vec4.magVecSquared(), (x*x + y*y + z*z)));
}
@@ -337,7 +337,7 @@ namespace tut
F32 val1,val2;
LLVector4 vec4(x1,y1,z1),vec4a(x2,y2,z2);
val1 = dist_vec(vec4,vec4a);
- val2 = fsqrtf((x1 - x2)*(x1 - x2) + (y1 - y2)* (y1 - y2) + (z1 - z2)* (z1 -z2));
+ val2 = (F32) sqrt((x1 - x2)*(x1 - x2) + (y1 - y2)* (y1 - y2) + (z1 - z2)* (z1 -z2));
ensure_equals("dist_vec: Fail ",val2, val1);
val1 = dist_vec_squared(vec4,vec4a);
val2 =((x1 - x2)*(x1 - x2) + (y1 - y2)* (y1 - y2) + (z1 - z2)* (z1 -z2));
diff --git a/indra/llmath/v2math.cpp b/indra/llmath/v2math.cpp
index 0180049b5d..a0cd642853 100644
--- a/indra/llmath/v2math.cpp
+++ b/indra/llmath/v2math.cpp
@@ -86,7 +86,7 @@ F32 dist_vec(const LLVector2 &a, const LLVector2 &b)
{
F32 x = a.mV[0] - b.mV[0];
F32 y = a.mV[1] - b.mV[1];
- return fsqrtf( x*x + y*y );
+ return (F32) sqrt( x*x + y*y );
}
F32 dist_vec_squared(const LLVector2 &a, const LLVector2 &b)
@@ -109,3 +109,18 @@ LLVector2 lerp(const LLVector2 &a, const LLVector2 &b, F32 u)
a.mV[VX] + (b.mV[VX] - a.mV[VX]) * u,
a.mV[VY] + (b.mV[VY] - a.mV[VY]) * u );
}
+
+LLSD LLVector2::getValue() const
+{
+ LLSD ret;
+ ret[0] = mV[0];
+ ret[1] = mV[1];
+ return ret;
+}
+
+void LLVector2::setValue(LLSD& sd)
+{
+ mV[0] = (F32) sd[0].asReal();
+ mV[1] = (F32) sd[1].asReal();
+}
+
diff --git a/indra/llmath/v2math.h b/indra/llmath/v2math.h
index f50a5e6633..8d5db96f5e 100644
--- a/indra/llmath/v2math.h
+++ b/indra/llmath/v2math.h
@@ -60,6 +60,9 @@ class LLVector2
void set(const LLVector2 &vec); // Sets LLVector2 to vec
void set(const F32 *vec); // Sets LLVector2 to vec
+ LLSD getValue() const;
+ void setValue(LLSD& sd);
+
void setVec(F32 x, F32 y); // deprecated
void setVec(const LLVector2 &vec); // deprecated
void setVec(const F32 *vec); // deprecated
@@ -216,7 +219,7 @@ inline void LLVector2::setVec(const F32 *vec)
inline F32 LLVector2::length(void) const
{
- return fsqrtf(mV[0]*mV[0] + mV[1]*mV[1]);
+ return (F32) sqrt(mV[0]*mV[0] + mV[1]*mV[1]);
}
inline F32 LLVector2::lengthSquared(void) const
@@ -226,7 +229,7 @@ inline F32 LLVector2::lengthSquared(void) const
inline F32 LLVector2::normalize(void)
{
- F32 mag = fsqrtf(mV[0]*mV[0] + mV[1]*mV[1]);
+ F32 mag = (F32) sqrt(mV[0]*mV[0] + mV[1]*mV[1]);
F32 oomag;
if (mag > FP_MAG_THRESHOLD)
@@ -253,7 +256,7 @@ inline bool LLVector2::isFinite() const
// deprecated
inline F32 LLVector2::magVec(void) const
{
- return fsqrtf(mV[0]*mV[0] + mV[1]*mV[1]);
+ return (F32) sqrt(mV[0]*mV[0] + mV[1]*mV[1]);
}
// deprecated
@@ -265,7 +268,7 @@ inline F32 LLVector2::magVecSquared(void) const
// deprecated
inline F32 LLVector2::normVec(void)
{
- F32 mag = fsqrtf(mV[0]*mV[0] + mV[1]*mV[1]);
+ F32 mag = (F32) sqrt(mV[0]*mV[0] + mV[1]*mV[1]);
F32 oomag;
if (mag > FP_MAG_THRESHOLD)
diff --git a/indra/llmath/v3color.h b/indra/llmath/v3color.h
index 327e452bf7..56cb2ae73e 100644
--- a/indra/llmath/v3color.h
+++ b/indra/llmath/v3color.h
@@ -278,7 +278,7 @@ inline F32 LLColor3::brightness(void) const
inline F32 LLColor3::length(void) const
{
- return fsqrtf(mV[0]*mV[0] + mV[1]*mV[1] + mV[2]*mV[2]);
+ return (F32) sqrt(mV[0]*mV[0] + mV[1]*mV[1] + mV[2]*mV[2]);
}
inline F32 LLColor3::lengthSquared(void) const
@@ -288,7 +288,7 @@ inline F32 LLColor3::lengthSquared(void) const
inline F32 LLColor3::normalize(void)
{
- F32 mag = fsqrtf(mV[0]*mV[0] + mV[1]*mV[1] + mV[2]*mV[2]);
+ F32 mag = (F32) sqrt(mV[0]*mV[0] + mV[1]*mV[1] + mV[2]*mV[2]);
F32 oomag;
if (mag)
@@ -304,7 +304,7 @@ inline F32 LLColor3::normalize(void)
// deprecated
inline F32 LLColor3::magVec(void) const
{
- return fsqrtf(mV[0]*mV[0] + mV[1]*mV[1] + mV[2]*mV[2]);
+ return (F32) sqrt(mV[0]*mV[0] + mV[1]*mV[1] + mV[2]*mV[2]);
}
// deprecated
@@ -316,7 +316,7 @@ inline F32 LLColor3::magVecSquared(void) const
// deprecated
inline F32 LLColor3::normVec(void)
{
- F32 mag = fsqrtf(mV[0]*mV[0] + mV[1]*mV[1] + mV[2]*mV[2]);
+ F32 mag = (F32) sqrt(mV[0]*mV[0] + mV[1]*mV[1] + mV[2]*mV[2]);
F32 oomag;
if (mag)
@@ -438,7 +438,7 @@ inline F32 distVec(const LLColor3 &a, const LLColor3 &b)
F32 x = a.mV[0] - b.mV[0];
F32 y = a.mV[1] - b.mV[1];
F32 z = a.mV[2] - b.mV[2];
- return fsqrtf( x*x + y*y + z*z );
+ return (F32) sqrt( x*x + y*y + z*z );
}
inline F32 distVec_squared(const LLColor3 &a, const LLColor3 &b)
diff --git a/indra/llmath/v3dmath.h b/indra/llmath/v3dmath.h
index 664c986ad0..578dcdc8ea 100644
--- a/indra/llmath/v3dmath.h
+++ b/indra/llmath/v3dmath.h
@@ -234,7 +234,7 @@ inline const LLVector3d& LLVector3d::setVec(const F64 *vec)
inline F64 LLVector3d::normVec(void)
{
- F64 mag = fsqrtf(mdV[0]*mdV[0] + mdV[1]*mdV[1] + mdV[2]*mdV[2]);
+ F64 mag = (F32) sqrt(mdV[0]*mdV[0] + mdV[1]*mdV[1] + mdV[2]*mdV[2]);
F64 oomag;
if (mag > FP_MAG_THRESHOLD)
@@ -256,7 +256,7 @@ inline F64 LLVector3d::normVec(void)
inline F64 LLVector3d::normalize(void)
{
- F64 mag = fsqrtf(mdV[0]*mdV[0] + mdV[1]*mdV[1] + mdV[2]*mdV[2]);
+ F64 mag = (F32) sqrt(mdV[0]*mdV[0] + mdV[1]*mdV[1] + mdV[2]*mdV[2]);
F64 oomag;
if (mag > FP_MAG_THRESHOLD)
@@ -280,7 +280,7 @@ inline F64 LLVector3d::normalize(void)
inline F64 LLVector3d::magVec(void) const
{
- return fsqrtf(mdV[0]*mdV[0] + mdV[1]*mdV[1] + mdV[2]*mdV[2]);
+ return (F32) sqrt(mdV[0]*mdV[0] + mdV[1]*mdV[1] + mdV[2]*mdV[2]);
}
inline F64 LLVector3d::magVecSquared(void) const
@@ -290,7 +290,7 @@ inline F64 LLVector3d::magVecSquared(void) const
inline F64 LLVector3d::length(void) const
{
- return fsqrtf(mdV[0]*mdV[0] + mdV[1]*mdV[1] + mdV[2]*mdV[2]);
+ return (F32) sqrt(mdV[0]*mdV[0] + mdV[1]*mdV[1] + mdV[2]*mdV[2]);
}
inline F64 LLVector3d::lengthSquared(void) const
@@ -400,7 +400,7 @@ inline F64 dist_vec(const LLVector3d &a, const LLVector3d &b)
F64 x = a.mdV[0] - b.mdV[0];
F64 y = a.mdV[1] - b.mdV[1];
F64 z = a.mdV[2] - b.mdV[2];
- return fsqrtf( x*x + y*y + z*z );
+ return (F32) sqrt( x*x + y*y + z*z );
}
inline F64 dist_vec_squared(const LLVector3d &a, const LLVector3d &b)
diff --git a/indra/llmath/v3math.cpp b/indra/llmath/v3math.cpp
index 18b15e08c4..e7107dee16 100644
--- a/indra/llmath/v3math.cpp
+++ b/indra/llmath/v3math.cpp
@@ -206,6 +206,28 @@ const LLVector3& LLVector3::rotVec(const LLQuaternion &q)
return *this;
}
+const LLVector3& LLVector3::transVec(const LLMatrix4& mat)
+{
+ setVec(
+ mV[VX] * mat.mMatrix[VX][VX] +
+ mV[VY] * mat.mMatrix[VX][VY] +
+ mV[VZ] * mat.mMatrix[VX][VZ] +
+ mat.mMatrix[VX][VW],
+
+ mV[VX] * mat.mMatrix[VY][VX] +
+ mV[VY] * mat.mMatrix[VY][VY] +
+ mV[VZ] * mat.mMatrix[VY][VZ] +
+ mat.mMatrix[VY][VW],
+
+ mV[VX] * mat.mMatrix[VZ][VX] +
+ mV[VY] * mat.mMatrix[VZ][VY] +
+ mV[VZ] * mat.mMatrix[VZ][VZ] +
+ mat.mMatrix[VZ][VW]);
+
+ return *this;
+}
+
+
const LLVector3& LLVector3::rotVec(F32 angle, const LLVector3 &vec)
{
if ( !vec.isExactlyZero() && angle )
diff --git a/indra/llmath/v3math.h b/indra/llmath/v3math.h
index 4b3efe7394..0432aeba4c 100644
--- a/indra/llmath/v3math.h
+++ b/indra/llmath/v3math.h
@@ -34,6 +34,7 @@
class LLVector2;
class LLVector4;
class LLMatrix3;
+class LLMatrix4;
class LLVector3d;
class LLQuaternion;
@@ -110,6 +111,7 @@ class LLVector3
const LLVector3& rotVec(F32 angle, F32 x, F32 y, F32 z); // Rotates about x,y,z by angle radians
const LLVector3& rotVec(const LLMatrix3 &mat); // Rotates by LLMatrix4 mat
const LLVector3& rotVec(const LLQuaternion &q); // Rotates by LLQuaternion q
+ const LLVector3& transVec(const LLMatrix4& mat); // Transforms by LLMatrix4 mat (mat * v)
const LLVector3& scaleVec(const LLVector3& vec); // scales per component by vec
LLVector3 scaledVec(const LLVector3& vec) const; // get a copy of this vector scaled by vec
@@ -277,7 +279,7 @@ inline void LLVector3::setVec(const F32 *vec)
inline F32 LLVector3::normalize(void)
{
- F32 mag = fsqrtf(mV[0]*mV[0] + mV[1]*mV[1] + mV[2]*mV[2]);
+ F32 mag = (F32) sqrt(mV[0]*mV[0] + mV[1]*mV[1] + mV[2]*mV[2]);
F32 oomag;
if (mag > FP_MAG_THRESHOLD)
@@ -300,7 +302,7 @@ inline F32 LLVector3::normalize(void)
// deprecated
inline F32 LLVector3::normVec(void)
{
- F32 mag = fsqrtf(mV[0]*mV[0] + mV[1]*mV[1] + mV[2]*mV[2]);
+ F32 mag = (F32) sqrt(mV[0]*mV[0] + mV[1]*mV[1] + mV[2]*mV[2]);
F32 oomag;
if (mag > FP_MAG_THRESHOLD)
@@ -324,7 +326,7 @@ inline F32 LLVector3::normVec(void)
inline F32 LLVector3::length(void) const
{
- return fsqrtf(mV[0]*mV[0] + mV[1]*mV[1] + mV[2]*mV[2]);
+ return (F32) sqrt(mV[0]*mV[0] + mV[1]*mV[1] + mV[2]*mV[2]);
}
inline F32 LLVector3::lengthSquared(void) const
@@ -334,7 +336,7 @@ inline F32 LLVector3::lengthSquared(void) const
inline F32 LLVector3::magVec(void) const
{
- return fsqrtf(mV[0]*mV[0] + mV[1]*mV[1] + mV[2]*mV[2]);
+ return (F32) sqrt(mV[0]*mV[0] + mV[1]*mV[1] + mV[2]*mV[2]);
}
inline F32 LLVector3::magVecSquared(void) const
@@ -468,7 +470,7 @@ inline F32 dist_vec(const LLVector3 &a, const LLVector3 &b)
F32 x = a.mV[0] - b.mV[0];
F32 y = a.mV[1] - b.mV[1];
F32 z = a.mV[2] - b.mV[2];
- return fsqrtf( x*x + y*y + z*z );
+ return (F32) sqrt( x*x + y*y + z*z );
}
inline F32 dist_vec_squared(const LLVector3 &a, const LLVector3 &b)
@@ -537,6 +539,21 @@ inline void update_min_max(LLVector3& min, LLVector3& max, const LLVector3& pos)
}
}
+inline void update_min_max(LLVector3& min, LLVector3& max, const F32* pos)
+{
+ for (U32 i = 0; i < 3; i++)
+ {
+ if (min.mV[i] > pos[i])
+ {
+ min.mV[i] = pos[i];
+ }
+ if (max.mV[i] < pos[i])
+ {
+ max.mV[i] = pos[i];
+ }
+ }
+}
+
inline F32 angle_between(const LLVector3& a, const LLVector3& b)
{
LLVector3 an = a;
diff --git a/indra/llmath/v4color.h b/indra/llmath/v4color.h
index 60d24e2e11..b047f86e6e 100644
--- a/indra/llmath/v4color.h
+++ b/indra/llmath/v4color.h
@@ -108,6 +108,7 @@ class LLColor4
const LLColor4& operator=(const LLColor3 &a); // Assigns vec3 to vec4 and returns vec4
+ bool operator<(const LLColor4& rhs) const;
friend std::ostream& operator<<(std::ostream& s, const LLColor4 &a); // Print a
friend LLColor4 operator+(const LLColor4 &a, const LLColor4 &b); // Return vector a + b
friend LLColor4 operator-(const LLColor4 &a, const LLColor4 &b); // Return vector a minus b
@@ -385,7 +386,7 @@ inline const LLColor4& LLColor4::setAlpha(F32 a)
inline F32 LLColor4::length(void) const
{
- return fsqrtf(mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ]);
+ return (F32) sqrt(mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ]);
}
inline F32 LLColor4::lengthSquared(void) const
@@ -395,7 +396,7 @@ inline F32 LLColor4::lengthSquared(void) const
inline F32 LLColor4::normalize(void)
{
- F32 mag = fsqrtf(mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ]);
+ F32 mag = (F32) sqrt(mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ]);
F32 oomag;
if (mag)
@@ -411,7 +412,7 @@ inline F32 LLColor4::normalize(void)
// deprecated
inline F32 LLColor4::magVec(void) const
{
- return fsqrtf(mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ]);
+ return (F32) sqrt(mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ]);
}
// deprecated
@@ -423,7 +424,7 @@ inline F32 LLColor4::magVecSquared(void) const
// deprecated
inline F32 LLColor4::normVec(void)
{
- F32 mag = fsqrtf(mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ]);
+ F32 mag = (F32) sqrt(mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ]);
F32 oomag;
if (mag)
@@ -589,6 +590,23 @@ inline LLColor4 lerp(const LLColor4 &a, const LLColor4 &b, F32 u)
a.mV[VW] + (b.mV[VW] - a.mV[VW]) * u);
}
+inline bool LLColor4::operator<(const LLColor4& rhs) const
+{
+ if (mV[0] != rhs.mV[0])
+ {
+ return mV[0] < rhs.mV[0];
+ }
+ if (mV[1] != rhs.mV[1])
+ {
+ return mV[1] < rhs.mV[1];
+ }
+ if (mV[2] != rhs.mV[2])
+ {
+ return mV[2] < rhs.mV[2];
+ }
+
+ return mV[3] < rhs.mV[3];
+}
void LLColor4::clamp()
{
diff --git a/indra/llmath/v4coloru.h b/indra/llmath/v4coloru.h
index 7471aebe02..12da7e2dd7 100644
--- a/indra/llmath/v4coloru.h
+++ b/indra/llmath/v4coloru.h
@@ -294,7 +294,7 @@ inline const LLColor4U& LLColor4U::setAlpha(U8 a)
inline F32 LLColor4U::length(void) const
{
- return fsqrtf( ((F32)mV[VX]) * mV[VX] + ((F32)mV[VY]) * mV[VY] + ((F32)mV[VZ]) * mV[VZ] );
+ return (F32) sqrt( ((F32)mV[VX]) * mV[VX] + ((F32)mV[VY]) * mV[VY] + ((F32)mV[VZ]) * mV[VZ] );
}
inline F32 LLColor4U::lengthSquared(void) const
@@ -305,7 +305,7 @@ inline F32 LLColor4U::lengthSquared(void) const
// deprecated
inline F32 LLColor4U::magVec(void) const
{
- return fsqrtf( ((F32)mV[VX]) * mV[VX] + ((F32)mV[VY]) * mV[VY] + ((F32)mV[VZ]) * mV[VZ] );
+ return (F32) sqrt( ((F32)mV[VX]) * mV[VX] + ((F32)mV[VY]) * mV[VY] + ((F32)mV[VZ]) * mV[VZ] );
}
// deprecated
diff --git a/indra/llmath/v4math.h b/indra/llmath/v4math.h
index e7028626f9..623c8b2003 100644
--- a/indra/llmath/v4math.h
+++ b/indra/llmath/v4math.h
@@ -315,7 +315,7 @@ inline void LLVector4::setVec(const F32 *vec)
inline F32 LLVector4::length(void) const
{
- return fsqrtf(mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ]);
+ return (F32) sqrt(mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ]);
}
inline F32 LLVector4::lengthSquared(void) const
@@ -325,7 +325,7 @@ inline F32 LLVector4::lengthSquared(void) const
inline F32 LLVector4::magVec(void) const
{
- return fsqrtf(mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ]);
+ return (F32) sqrt(mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ]);
}
inline F32 LLVector4::magVecSquared(void) const
@@ -457,7 +457,7 @@ inline LLVector4 lerp(const LLVector4 &a, const LLVector4 &b, F32 u)
inline F32 LLVector4::normalize(void)
{
- F32 mag = fsqrtf(mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ]);
+ F32 mag = (F32) sqrt(mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ]);
F32 oomag;
if (mag > FP_MAG_THRESHOLD)
@@ -480,7 +480,7 @@ inline F32 LLVector4::normalize(void)
// deprecated
inline F32 LLVector4::normVec(void)
{
- F32 mag = fsqrtf(mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ]);
+ F32 mag = (F32) sqrt(mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ]);
F32 oomag;
if (mag > FP_MAG_THRESHOLD)
diff --git a/indra/llmath/xform.h b/indra/llmath/xform.h
index 5159c1cbfe..1b50749b3e 100644
--- a/indra/llmath/xform.h
+++ b/indra/llmath/xform.h
@@ -32,11 +32,11 @@
const F32 MAX_OBJECT_Z = 4096.f; // should match REGION_HEIGHT_METERS, Pre-havok4: 768.f
const F32 MIN_OBJECT_Z = -256.f;
-const F32 DEFAULT_MAX_PRIM_SCALE = 10.f;
+const F32 DEFAULT_MAX_PRIM_SCALE = 64.f;
+const F32 DEFAULT_MAX_PRIM_SCALE_NO_MESH = 10.f;
const F32 MIN_PRIM_SCALE = 0.01f;
const F32 MAX_PRIM_SCALE = 65536.f; // something very high but not near FLT_MAX
-
class LLXform
{
protected:
diff --git a/indra/llmessage/llassetstorage.cpp b/indra/llmessage/llassetstorage.cpp
index 27a368df3d..31cdb1219b 100644
--- a/indra/llmessage/llassetstorage.cpp
+++ b/indra/llmessage/llassetstorage.cpp
@@ -398,6 +398,12 @@ BOOL LLAssetStorage::hasLocalAsset(const LLUUID &uuid, const LLAssetType::EType
bool LLAssetStorage::findInStaticVFSAndInvokeCallback(const LLUUID& uuid, LLAssetType::EType type,
LLGetAssetCallback callback, void *user_data)
{
+ if (user_data)
+ {
+ // The *user_data should not be passed without a callback to clean it up.
+ llassert(callback != NULL)
+ }
+
BOOL exists = mStaticVFS->getExists(uuid, type);
if (exists)
{
@@ -432,15 +438,26 @@ void LLAssetStorage::getAssetData(const LLUUID uuid, LLAssetType::EType type, LL
llinfos << "ASSET_TRACE requesting " << uuid << " type " << LLAssetType::lookup(type) << llendl;
+ if (user_data)
+ {
+ // The *user_data should not be passed without a callback to clean it up.
+ llassert(callback != NULL)
+ }
+
if (mShutDown)
{
llinfos << "ASSET_TRACE cancelled " << uuid << " type " << LLAssetType::lookup(type) << " shutting down" << llendl;
- return; // don't get the asset or do any callbacks, we are shutting down
+
+ if (callback)
+ {
+ callback(mVFS, uuid, type, user_data, LL_ERR_ASSET_REQUEST_FAILED, LL_EXSTAT_NONE);
+ }
+ return;
}
-
+
if (uuid.isNull())
{
- // Special case early out for NULL uuid
+ // Special case early out for NULL uuid and for shutting down
if (callback)
{
callback(mVFS, uuid, type, user_data, LL_ERR_ASSET_REQUEST_NOT_IN_DATABASE, LL_EXSTAT_NULL_UUID);
@@ -544,7 +561,7 @@ void LLAssetStorage::_queueDataRequest(const LLUUID& uuid, LLAssetType::EType at
tpvf.setAsset(uuid, atype);
tpvf.setCallback(downloadCompleteCallback, req);
- llinfos << "Starting transfer for " << uuid << llendl;
+ //llinfos << "Starting transfer for " << uuid << llendl;
LLTransferTargetChannel *ttcp = gTransferManager.getTargetChannel(mUpstreamHost, LLTCT_ASSET);
ttcp->requestTransfer(spa, tpvf, 100.f + (is_priority ? 1.f : 0.f));
}
diff --git a/indra/llmessage/llavatarnamecache.cpp b/indra/llmessage/llavatarnamecache.cpp
index 767001b633..97f2792686 100644
--- a/indra/llmessage/llavatarnamecache.cpp
+++ b/indra/llmessage/llavatarnamecache.cpp
@@ -553,12 +553,10 @@ void LLAvatarNameCache::eraseUnrefreshed()
if (!sLastExpireCheck || sLastExpireCheck < max_unrefreshed)
{
sLastExpireCheck = now;
- cache_t::iterator it = sCache.begin();
- while (it != sCache.end())
+
+ for (cache_t::iterator it = sCache.begin(); it != sCache.end();)
{
- cache_t::iterator cur = it;
- ++it;
- const LLAvatarName& av_name = cur->second;
+ const LLAvatarName& av_name = it->second;
if (av_name.mExpires < max_unrefreshed)
{
const LLUUID& agent_id = it->first;
@@ -566,8 +564,12 @@ void LLAvatarNameCache::eraseUnrefreshed()
<< " user '" << av_name.mUsername << "' "
<< "expired " << now - av_name.mExpires << " secs ago"
<< LL_ENDL;
- sCache.erase(cur);
+ sCache.erase(it++);
}
+ else
+ {
+ ++it;
+ }
}
LL_INFOS("AvNameCache") << sCache.size() << " cached avatar names" << LL_ENDL;
}
diff --git a/indra/llmessage/llcurl.cpp b/indra/llmessage/llcurl.cpp
index a485fa0160..7c8b7e3584 100644
--- a/indra/llmessage/llcurl.cpp
+++ b/indra/llmessage/llcurl.cpp
@@ -49,6 +49,7 @@
#include "llstl.h"
#include "llsdserialize.h"
#include "llthread.h"
+#include "lltimer.h"
//////////////////////////////////////////////////////////////////////////////
/*
@@ -84,6 +85,26 @@ std::vector<LLMutex*> LLCurl::sSSLMutex;
std::string LLCurl::sCAPath;
std::string LLCurl::sCAFile;
+void check_curl_code(CURLcode code)
+{
+ if (code != CURLE_OK)
+ {
+ // linux appears to throw a curl error once per session for a bad initialization
+ // at a pretty random time (when enabling cookies).
+ llinfos << "curl error detected: " << curl_easy_strerror(code) << llendl;
+ }
+}
+
+void check_curl_multi_code(CURLMcode code)
+{
+ if (code != CURLM_OK)
+ {
+ // linux appears to throw a curl error once per session for a bad initialization
+ // at a pretty random time (when enabling cookies).
+ llinfos << "curl multi error detected: " << curl_multi_strerror(code) << llendl;
+ }
+}
+
//static
void LLCurl::setCAPath(const std::string& path)
{
@@ -234,7 +255,12 @@ public:
void resetState();
+ static CURL* allocEasyHandle();
+ static void releaseEasyHandle(CURL* handle);
+
private:
+ friend class LLCurl;
+
CURL* mCurlEasyHandle;
struct curl_slist* mHeaders;
@@ -249,8 +275,62 @@ private:
std::vector<char*> mStrings;
ResponderPtr mResponder;
+
+ static std::set<CURL*> sFreeHandles;
+ static std::set<CURL*> sActiveHandles;
+ static LLMutex* sHandleMutex;
};
+std::set<CURL*> LLCurl::Easy::sFreeHandles;
+std::set<CURL*> LLCurl::Easy::sActiveHandles;
+LLMutex* LLCurl::Easy::sHandleMutex = NULL;
+
+
+//static
+CURL* LLCurl::Easy::allocEasyHandle()
+{
+ CURL* ret = NULL;
+ LLMutexLock lock(sHandleMutex);
+ if (sFreeHandles.empty())
+ {
+ ret = curl_easy_init();
+ }
+ else
+ {
+ ret = *(sFreeHandles.begin());
+ sFreeHandles.erase(ret);
+ curl_easy_reset(ret);
+ }
+
+ if (ret)
+ {
+ sActiveHandles.insert(ret);
+ }
+
+ return ret;
+}
+
+//static
+void LLCurl::Easy::releaseEasyHandle(CURL* handle)
+{
+ if (!handle)
+ {
+ llerrs << "handle cannot be NULL!" << llendl;
+ }
+
+ LLMutexLock lock(sHandleMutex);
+
+ if (sActiveHandles.find(handle) != sActiveHandles.end())
+ {
+ sActiveHandles.erase(handle);
+ sFreeHandles.insert(handle);
+ }
+ else
+ {
+ llerrs << "Invalid handle." << llendl;
+ }
+}
+
LLCurl::Easy::Easy()
: mHeaders(NULL),
mCurlEasyHandle(NULL)
@@ -261,25 +341,28 @@ LLCurl::Easy::Easy()
LLCurl::Easy* LLCurl::Easy::getEasy()
{
Easy* easy = new Easy();
- easy->mCurlEasyHandle = curl_easy_init();
+ easy->mCurlEasyHandle = allocEasyHandle();
+
if (!easy->mCurlEasyHandle)
{
// this can happen if we have too many open files (fails in c-ares/ares_init.c)
- llwarns << "curl_multi_init() returned NULL! Easy handles: " << gCurlEasyCount << " Multi handles: " << gCurlMultiCount << llendl;
+ llwarns << "allocEasyHandle() returned NULL! Easy handles: " << gCurlEasyCount << " Multi handles: " << gCurlMultiCount << llendl;
delete easy;
return NULL;
}
- // set no DMS caching as default for all easy handles. This prevents them adopting a
+ // set no DNS caching as default for all easy handles. This prevents them adopting a
// multi handles cache if they are added to one.
- curl_easy_setopt(easy->mCurlEasyHandle, CURLOPT_DNS_CACHE_TIMEOUT, 0);
+ CURLcode result = curl_easy_setopt(easy->mCurlEasyHandle, CURLOPT_DNS_CACHE_TIMEOUT, 0);
+ check_curl_code(result);
+
++gCurlEasyCount;
return easy;
}
LLCurl::Easy::~Easy()
{
- curl_easy_cleanup(mCurlEasyHandle);
+ releaseEasyHandle(mCurlEasyHandle);
--gCurlEasyCount;
curl_slist_free_all(mHeaders);
for_each(mStrings.begin(), mStrings.end(), DeletePointerArray());
@@ -338,9 +421,9 @@ void LLCurl::Easy::setHeaders()
void LLCurl::Easy::getTransferInfo(LLCurl::TransferInfo* info)
{
- curl_easy_getinfo(mCurlEasyHandle, CURLINFO_SIZE_DOWNLOAD, &info->mSizeDownload);
- curl_easy_getinfo(mCurlEasyHandle, CURLINFO_TOTAL_TIME, &info->mTotalTime);
- curl_easy_getinfo(mCurlEasyHandle, CURLINFO_SPEED_DOWNLOAD, &info->mSpeedDownload);
+ check_curl_code(curl_easy_getinfo(mCurlEasyHandle, CURLINFO_SIZE_DOWNLOAD, &info->mSizeDownload));
+ check_curl_code(curl_easy_getinfo(mCurlEasyHandle, CURLINFO_TOTAL_TIME, &info->mTotalTime));
+ check_curl_code(curl_easy_getinfo(mCurlEasyHandle, CURLINFO_SPEED_DOWNLOAD, &info->mSpeedDownload));
}
U32 LLCurl::Easy::report(CURLcode code)
@@ -350,13 +433,14 @@ U32 LLCurl::Easy::report(CURLcode code)
if (code == CURLE_OK)
{
- curl_easy_getinfo(mCurlEasyHandle, CURLINFO_RESPONSE_CODE, &responseCode);
+ check_curl_code(curl_easy_getinfo(mCurlEasyHandle, CURLINFO_RESPONSE_CODE, &responseCode));
//*TODO: get reason from first line of mHeaderOutput
}
else
{
responseCode = 499;
responseReason = strerror(code) + " : " + mErrorBuffer;
+ setopt(CURLOPT_FRESH_CONNECT, TRUE);
}
if (mResponder)
@@ -372,17 +456,20 @@ U32 LLCurl::Easy::report(CURLcode code)
// Note: these all assume the caller tracks the value (i.e. keeps it persistant)
void LLCurl::Easy::setopt(CURLoption option, S32 value)
{
- curl_easy_setopt(mCurlEasyHandle, option, value);
+ CURLcode result = curl_easy_setopt(mCurlEasyHandle, option, value);
+ check_curl_code(result);
}
void LLCurl::Easy::setopt(CURLoption option, void* value)
{
- curl_easy_setopt(mCurlEasyHandle, option, value);
+ CURLcode result = curl_easy_setopt(mCurlEasyHandle, option, value);
+ check_curl_code(result);
}
void LLCurl::Easy::setopt(CURLoption option, char* value)
{
- curl_easy_setopt(mCurlEasyHandle, option, value);
+ CURLcode result = curl_easy_setopt(mCurlEasyHandle, option, value);
+ check_curl_code(result);
}
// Note: this copies the string so that the caller does not have to keep it around
@@ -391,7 +478,8 @@ void LLCurl::Easy::setoptString(CURLoption option, const std::string& value)
char* tstring = new char[value.length()+1];
strcpy(tstring, value.c_str());
mStrings.push_back(tstring);
- curl_easy_setopt(mCurlEasyHandle, option, tstring);
+ CURLcode result = curl_easy_setopt(mCurlEasyHandle, option, tstring);
+ check_curl_code(result);
}
void LLCurl::Easy::slist_append(const char* str)
@@ -443,7 +531,7 @@ void LLCurl::Easy::prepRequest(const std::string& url,
if (post) setoptString(CURLOPT_ENCODING, "");
-// setopt(CURLOPT_VERBOSE, 1); // usefull for debugging
+ //setopt(CURLOPT_VERBOSE, 1); // usefull for debugging
setopt(CURLOPT_NOSIGNAL, 1);
mOutput.reset(new LLBufferArray);
@@ -467,6 +555,9 @@ void LLCurl::Easy::prepRequest(const std::string& url,
setCA();
setopt(CURLOPT_SSL_VERIFYPEER, true);
+
+ //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);
setoptString(CURLOPT_URL, url);
@@ -532,6 +623,7 @@ LLCurl::Multi::Multi()
llwarns << "curl_multi_init() returned NULL! Easy handles: " << gCurlEasyCount << " Multi handles: " << gCurlMultiCount << llendl;
mCurlMultiHandle = curl_multi_init();
}
+
llassert_always(mCurlMultiHandle);
++gCurlMultiCount;
}
@@ -543,7 +635,7 @@ LLCurl::Multi::~Multi()
iter != mEasyActiveList.end(); ++iter)
{
Easy* easy = *iter;
- curl_multi_remove_handle(mCurlMultiHandle, easy->getCurlHandle());
+ check_curl_multi_code(curl_multi_remove_handle(mCurlMultiHandle, easy->getCurlHandle()));
delete easy;
}
mEasyActiveList.clear();
@@ -553,7 +645,7 @@ LLCurl::Multi::~Multi()
for_each(mEasyFreeList.begin(), mEasyFreeList.end(), DeletePointer());
mEasyFreeList.clear();
- curl_multi_cleanup(mCurlMultiHandle);
+ check_curl_multi_code(curl_multi_cleanup(mCurlMultiHandle));
--gCurlMultiCount;
}
@@ -574,8 +666,10 @@ S32 LLCurl::Multi::perform()
CURLMcode code = curl_multi_perform(mCurlMultiHandle, &q);
if (CURLM_CALL_MULTI_PERFORM != code || q == 0)
{
+ check_curl_multi_code(code);
break;
}
+
}
mQueued = q;
return q;
@@ -642,11 +736,12 @@ LLCurl::Easy* LLCurl::Multi::allocEasy()
bool LLCurl::Multi::addEasy(Easy* easy)
{
CURLMcode mcode = curl_multi_add_handle(mCurlMultiHandle, easy->getCurlHandle());
- if (mcode != CURLM_OK)
- {
- llwarns << "Curl Error: " << curl_multi_strerror(mcode) << llendl;
- return false;
- }
+ check_curl_multi_code(mcode);
+ //if (mcode != CURLM_OK)
+ //{
+ // llwarns << "Curl Error: " << curl_multi_strerror(mcode) << llendl;
+ // return false;
+ //}
return true;
}
@@ -667,22 +762,14 @@ void LLCurl::Multi::easyFree(Easy* easy)
void LLCurl::Multi::removeEasy(Easy* easy)
{
- curl_multi_remove_handle(mCurlMultiHandle, easy->getCurlHandle());
+ check_curl_multi_code(curl_multi_remove_handle(mCurlMultiHandle, easy->getCurlHandle()));
easyFree(easy);
}
//static
std::string LLCurl::strerror(CURLcode errorcode)
{
-#if LL_DARWIN
- // curl_easy_strerror was added in libcurl 7.12.0. Unfortunately, the version in the Mac OS X 10.3.9 SDK is 7.10.2...
- // There's a problem with the custom curl headers in our build that keeps me from #ifdefing this on the libcurl version number
- // (the correct check would be #if LIBCURL_VERSION_NUM >= 0x070c00). We'll fix the header problem soon, but for now
- // just punt and print the numeric error code on the Mac.
- return llformat("%d", errorcode);
-#else // LL_DARWIN
return std::string(curl_easy_strerror(errorcode));
-#endif // LL_DARWIN
}
////////////////////////////////////////////////////////////////////////////
@@ -694,6 +781,7 @@ LLCurlRequest::LLCurlRequest() :
mActiveRequestCount(0)
{
mThreadID = LLThread::currentID();
+ mProcessing = FALSE;
}
LLCurlRequest::~LLCurlRequest()
@@ -728,6 +816,11 @@ LLCurl::Easy* LLCurlRequest::allocEasy()
bool LLCurlRequest::addEasy(LLCurl::Easy* easy)
{
llassert_always(mActiveMulti);
+
+ if (mProcessing)
+ {
+ llerrs << "Posting to a LLCurlRequest instance from within a responder is not allowed (causes DNS timeouts)." << llendl;
+ }
bool res = mActiveMulti->addEasy(easy);
return res;
}
@@ -785,12 +878,41 @@ bool LLCurlRequest::post(const std::string& url,
bool res = addEasy(easy);
return res;
}
+
+bool LLCurlRequest::post(const std::string& url,
+ const headers_t& headers,
+ const std::string& data,
+ LLCurl::ResponderPtr responder)
+{
+ LLCurl::Easy* easy = allocEasy();
+ if (!easy)
+ {
+ return false;
+ }
+ easy->prepRequest(url, headers, responder);
+
+ easy->getInput().write(data.data(), data.size());
+ S32 bytes = easy->getInput().str().length();
+ easy->setopt(CURLOPT_POST, 1);
+ easy->setopt(CURLOPT_POSTFIELDS, (void*)NULL);
+ easy->setopt(CURLOPT_POSTFIELDSIZE, bytes);
+
+ easy->slist_append("Content-Type: application/octet-stream");
+ easy->setHeaders();
+
+ lldebugs << "POSTING: " << bytes << " bytes." << llendl;
+ bool res = addEasy(easy);
+ return res;
+}
+
// Note: call once per frame
S32 LLCurlRequest::process()
{
llassert_always(mThreadID == LLThread::currentID());
S32 res = 0;
+
+ mProcessing = TRUE;
for (curlmulti_set_t::iterator iter = mMultiSet.begin();
iter != mMultiSet.end(); )
{
@@ -804,6 +926,7 @@ S32 LLCurlRequest::process()
delete multi;
}
}
+ mProcessing = FALSE;
return res;
}
@@ -1033,8 +1156,12 @@ void LLCurl::initClass()
// Do not change this "unless you are familiar with and mean to control
// internal operations of libcurl"
// - http://curl.haxx.se/libcurl/c/curl_global_init.html
- curl_global_init(CURL_GLOBAL_ALL);
+ CURLcode code = curl_global_init(CURL_GLOBAL_ALL);
+
+ check_curl_code(code);
+ Easy::sHandleMutex = new LLMutex(NULL);
+
#if SAFE_SSL
S32 mutex_count = CRYPTO_num_locks();
for (S32 i=0; i<mutex_count; i++)
@@ -1052,7 +1179,19 @@ void LLCurl::cleanupClass()
CRYPTO_set_locking_callback(NULL);
for_each(sSSLMutex.begin(), sSSLMutex.end(), DeletePointer());
#endif
- curl_global_cleanup();
+
+ delete Easy::sHandleMutex;
+ Easy::sHandleMutex = NULL;
+
+ for (std::set<CURL*>::iterator iter = Easy::sFreeHandles.begin(); iter != Easy::sFreeHandles.end(); ++iter)
+ {
+ CURL* curl = *iter;
+ curl_easy_cleanup(curl);
+ }
+
+ Easy::sFreeHandles.clear();
+
+ llassert(Easy::sActiveHandles.empty());
}
const unsigned int LLCurl::MAX_REDIRECTS = 5;
diff --git a/indra/llmessage/llcurl.h b/indra/llmessage/llcurl.h
index 64dadd6640..4ce3fa1078 100644
--- a/indra/llmessage/llcurl.h
+++ b/indra/llmessage/llcurl.h
@@ -202,6 +202,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);
+
S32 process();
S32 getQueued();
@@ -215,6 +217,7 @@ private:
curlmulti_set_t mMultiSet;
LLCurl::Multi* mActiveMulti;
S32 mActiveRequestCount;
+ BOOL mProcessing;
U32 mThreadID; // debug
};
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/llhttpassetstorage.cpp b/indra/llmessage/llhttpassetstorage.cpp
index 9ea2ff4153..5a38b7fd9f 100644
--- a/indra/llmessage/llhttpassetstorage.cpp
+++ b/indra/llmessage/llhttpassetstorage.cpp
@@ -174,8 +174,8 @@ LLSD LLHTTPAssetRequest::getFullDetails() const
double curl_total_time = -1.0f;
double curl_size_upload = -1.0f;
double curl_size_download = -1.0f;
- long curl_content_length_upload = -1;
- long curl_content_length_download = -1;
+ double curl_content_length_upload = -1.0f;
+ double curl_content_length_download = -1.0f;
long curl_request_size = -1;
const char* curl_content_type = NULL;
@@ -194,8 +194,8 @@ LLSD LLHTTPAssetRequest::getFullDetails() const
sd["curl_total_time"] = curl_total_time;
sd["curl_size_upload"] = curl_size_upload;
sd["curl_size_download"] = curl_size_download;
- sd["curl_content_length_upload"] = (int) curl_content_length_upload;
- sd["curl_content_length_download"] = (int) curl_content_length_download;
+ sd["curl_content_length_upload"] = curl_content_length_upload;
+ sd["curl_content_length_download"] = curl_content_length_download;
sd["curl_request_size"] = (int) curl_request_size;
if (curl_content_type)
{
diff --git a/indra/llmessage/llsdmessagebuilder.cpp b/indra/llmessage/llsdmessagebuilder.cpp
index 42c179782f..2698a271ee 100644
--- a/indra/llmessage/llsdmessagebuilder.cpp
+++ b/indra/llmessage/llsdmessagebuilder.cpp
@@ -29,6 +29,7 @@
#include "llsdmessagebuilder.h"
#include "llmessagetemplate.h"
+#include "llmath.h"
#include "llquaternion.h"
#include "llsdutil.h"
#include "llsdutil_math.h"
diff --git a/indra/llmessage/lltemplatemessagebuilder.cpp b/indra/llmessage/lltemplatemessagebuilder.cpp
index 6611d704e6..9e8eb48460 100644
--- a/indra/llmessage/lltemplatemessagebuilder.cpp
+++ b/indra/llmessage/lltemplatemessagebuilder.cpp
@@ -29,6 +29,7 @@
#include "lltemplatemessagebuilder.h"
#include "llmessagetemplate.h"
+#include "llmath.h"
#include "llquaternion.h"
#include "u64.h"
#include "v3dmath.h"
diff --git a/indra/llmessage/lltemplatemessagereader.cpp b/indra/llmessage/lltemplatemessagereader.cpp
index 3bfcd58c69..f470e1b2a5 100644
--- a/indra/llmessage/lltemplatemessagereader.cpp
+++ b/indra/llmessage/lltemplatemessagereader.cpp
@@ -30,6 +30,7 @@
#include "llfasttimer.h"
#include "llmessagebuilder.h"
#include "llmessagetemplate.h"
+#include "llmath.h"
#include "llquaternion.h"
#include "message.h"
#include "u64.h"
diff --git a/indra/llmessage/lltransfermanager.cpp b/indra/llmessage/lltransfermanager.cpp
index 754eb99cbd..034680caf8 100644
--- a/indra/llmessage/lltransfermanager.cpp
+++ b/indra/llmessage/lltransfermanager.cpp
@@ -338,7 +338,7 @@ void LLTransferManager::processTransferInfo(LLMessageSystem *msgp, void **)
}
}
- llinfos << "Receiving " << transfer_id << ", size " << size << " bytes" << llendl;
+ //llinfos << "Receiving " << transfer_id << ", size " << size << " bytes" << llendl;
ttp->setSize(size);
ttp->setGotInfo(TRUE);
diff --git a/indra/llmessage/lltransfersourceasset.cpp b/indra/llmessage/lltransfersourceasset.cpp
index 7e57841580..8537773a3f 100644
--- a/indra/llmessage/lltransfersourceasset.cpp
+++ b/indra/llmessage/lltransfersourceasset.cpp
@@ -251,3 +251,4 @@ BOOL LLTransferSourceParamsAsset::unpackParams(LLDataPacker &dp)
return TRUE;
}
+
diff --git a/indra/llmessage/tests/commtest.h b/indra/llmessage/tests/commtest.h
index 32035783e2..0d149b5258 100644
--- a/indra/llmessage/tests/commtest.h
+++ b/indra/llmessage/tests/commtest.h
@@ -34,7 +34,67 @@
#include "llsd.h"
#include "llhost.h"
#include "stringize.h"
+#include <map>
#include <string>
+#include <stdexcept>
+#include <boost/lexical_cast.hpp>
+
+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).
@@ -55,13 +115,21 @@ struct commtest_data
replyPump("reply"),
errorPump("error"),
success(false),
- host("127.0.0.1", 8000),
+ host("127.0.0.1", getport("PORT")),
server(STRINGIZE("http://" << host.getString() << "/"))
{
replyPump.listen("self", boost::bind(&commtest_data::outcome, this, _1, true));
errorPump.listen("self", boost::bind(&commtest_data::outcome, this, _1, false));
}
+ static int getport(const std::string& var)
+ {
+ // 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)
{
// std::cout << "commtest_data::outcome(" << _result << ", " << _success << ")\n";
diff --git a/indra/llmessage/tests/llsdmessage_test.cpp b/indra/llmessage/tests/llsdmessage_test.cpp
index 9998a1b8bb..0f2c069303 100644
--- a/indra/llmessage/tests/llsdmessage_test.cpp
+++ b/indra/llmessage/tests/llsdmessage_test.cpp
@@ -61,6 +61,7 @@ namespace tut
llsdmessage_data():
httpPump(pumps.obtain("LLHTTPClient"))
{
+ LLCurl::initClass();
LLSDMessage::link();
}
};
diff --git a/indra/llmessage/tests/test_llsdmessage_peer.py b/indra/llmessage/tests/test_llsdmessage_peer.py
index 580ee7f8b4..9886d49ccc 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 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)))
@@ -97,27 +99,43 @@ class TestHTTPRequestHandler(BaseHTTPRequestHandler):
self.wfile.write(response)
else: # fail requested
status = data.get("status", 500)
+ # self.responses maps an int status to a (short, long) pair of
+ # strings. We want the longer string. That's why we pass a string
+ # pair to get(): the [1] will select the second string, whether it
+ # came from self.responses or from our default pair.
reason = data.get("reason",
self.responses.get(status,
("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
-class TestHTTPServer(Thread):
- def run(self):
- httpd = HTTPServer(('127.0.0.1', 8000), TestHTTPRequestHandler)
- debug("Starting HTTP server...\n")
- httpd.serve_forever()
+ def log_error(self, format, *args):
+ # Suppress error output as well
+ pass
if __name__ == "__main__":
- sys.exit(run(server=TestHTTPServer(name="httpd"), *sys.argv[1:]))
+ # Instantiate an HTTPServer(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))
+ # 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 b70ce91ee7..f329ec2a0e 100644
--- a/indra/llmessage/tests/testrunner.py
+++ b/indra/llmessage/tests/testrunner.py
@@ -29,12 +29,109 @@ $/LicenseInfo$
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):
+ """
+ Find a free server port to use. Specifically, evaluate 'expr' (a
+ callable(port)) until it stops raising EADDRINUSE exception.
+
+ Pass:
+
+ portlist: an iterable (e.g. xrange()) of ports to try. If you exhaust the
+ range, freeport() lets the socket.error exception propagate. If you want
+ unbounded, you could pass itertools.count(baseport), though of course in
+ practice the ceiling is 2^16-1 anyway. But it seems prudent to constrain
+ the range much more sharply: if we're iterating an absurd number of times,
+ probably something else is wrong.
+
+ expr: a callable accepting a port number, specifically one of the items
+ from portlist. If calling that callable raises socket.error with
+ EADDRINUSE, freeport() retrieves the next item from portlist and retries.
+
+ Returns: (expr(port), port)
+
+ port: the value from portlist for which expr(port) succeeded
+
+ Raises:
+
+ Any exception raised by expr(port) other than EADDRINUSE.
+
+ socket.error if, for every item from portlist, expr(port) raises
+ socket.error. The exception you see is the one from the last item in
+ portlist.
+
+ StopIteration if portlist is completely empty.
+
+ Example:
+
+ server, port = freeport(xrange(8000, 8010),
+ lambda port: HTTPServer(("localhost", port),
+ MyRequestHandler))
+ # pass 'port' to client code
+ # call server.serve_forever()
+ """
+ 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.
+ 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:
+ 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
@@ -63,8 +160,7 @@ 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
diff --git a/indra/llplugin/CMakeLists.txt b/indra/llplugin/CMakeLists.txt
index 1dc05e0b20..2f28673c07 100644
--- a/indra/llplugin/CMakeLists.txt
+++ b/indra/llplugin/CMakeLists.txt
@@ -66,21 +66,20 @@ add_library (llplugin ${llplugin_SOURCE_FILES})
add_subdirectory(slplugin)
+# Add tests
if (LL_TESTS)
- # Add tests
- include(LLAddBuildTest)
+ include(LLAddBuildTest)
+ # UNIT TESTS
+ SET(llplugin_TEST_SOURCE_FILES
+ llplugincookiestore.cpp
+ )
- # UNIT TESTS
- SET(llplugin_TEST_SOURCE_FILES
- llplugincookiestore.cpp
- )
+ # llplugincookiestore has a dependency on curl, so we need to link the curl library into the test.
+ set_source_files_properties(
+ llplugincookiestore.cpp
+ PROPERTIES
+ LL_TEST_ADDITIONAL_LIBRARIES "${CURL_LIBRARIES}"
+ )
- # llplugincookiestore has a dependency on curl, so we need to link the curl library into the test.
- set_source_files_properties(
- llplugincookiestore.cpp
- PROPERTIES
- LL_TEST_ADDITIONAL_LIBRARIES "${CURL_LIBRARIES}"
- )
-
- LL_ADD_PROJECT_UNIT_TESTS(llplugin "${llplugin_TEST_SOURCE_FILES}")
+ LL_ADD_PROJECT_UNIT_TESTS(llplugin "${llplugin_TEST_SOURCE_FILES}")
endif (LL_TESTS)
diff --git a/indra/llplugin/llpluginclassmedia.cpp b/indra/llplugin/llpluginclassmedia.cpp
index 2103216536..9f666369d4 100644
--- a/indra/llplugin/llpluginclassmedia.cpp
+++ b/indra/llplugin/llpluginclassmedia.cpp
@@ -436,6 +436,107 @@ std::string LLPluginClassMedia::translateModifiers(MASK modifiers)
return result;
}
+void LLPluginClassMedia::jsExposeObjectEvent( bool expose )
+{
+ if( ! mPlugin || !mPlugin->isRunning() || mPlugin->isBlocked() )
+ {
+ return;
+ }
+
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "js_expose_object");
+ message.setValueBoolean( "expose", expose );
+ sendMessage( message );
+}
+
+void LLPluginClassMedia::jsValuesValidEvent( bool valid )
+{
+ if( ! mPlugin || !mPlugin->isRunning() || mPlugin->isBlocked() )
+ {
+ return;
+ }
+
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "js_values_valid");
+ message.setValueBoolean( "valid", valid );
+ 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)
diff --git a/indra/llplugin/llpluginclassmedia.h b/indra/llplugin/llpluginclassmedia.h
index cf8d8b26b9..fea836aa68 100644
--- a/indra/llplugin/llpluginclassmedia.h
+++ b/indra/llplugin/llpluginclassmedia.h
@@ -117,7 +117,17 @@ public:
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 jsExposeObjectEvent( bool expose );
+ void jsValuesValidEvent( bool valid );
+ 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);
diff --git a/indra/llprimitive/CMakeLists.txt b/indra/llprimitive/CMakeLists.txt
index f4d21308b3..97e1ebde47 100644
--- a/indra/llprimitive/CMakeLists.txt
+++ b/indra/llprimitive/CMakeLists.txt
@@ -13,11 +13,14 @@ include_directories(
${LLMATH_INCLUDE_DIRS}
${LLMESSAGE_INCLUDE_DIRS}
${LLXML_INCLUDE_DIRS}
+ ${LIBS_PREBUILT_DIR}/include/collada
+ ${LIBS_PREBUILT_DIR}/include/collada/1.4
)
set(llprimitive_SOURCE_FILES
llmaterialtable.cpp
llmediaentry.cpp
+ llmodel.cpp
llprimitive.cpp
llprimtexturelist.cpp
lltextureanim.cpp
@@ -34,6 +37,7 @@ set(llprimitive_HEADER_FILES
legacy_object_types.h
llmaterialtable.h
llmediaentry.h
+ llmodel.h
llprimitive.h
llprimtexturelist.h
lltextureanim.h
@@ -53,11 +57,11 @@ list(APPEND llprimitive_SOURCE_FILES ${llprimitive_HEADER_FILES})
add_library (llprimitive ${llprimitive_SOURCE_FILES})
-if(LL_TESTS)
- #add unit tests
- INCLUDE(LLAddBuildTest)
- SET(llprimitive_TEST_SOURCE_FILES
- llmediaentry.cpp
- )
- LL_ADD_PROJECT_UNIT_TESTS(llprimitive "${llprimitive_TEST_SOURCE_FILES}")
-endif(LL_TESTS)
+#add unit tests
+if (LL_TESTS)
+ INCLUDE(LLAddBuildTest)
+ SET(llprimitive_TEST_SOURCE_FILES
+ llmediaentry.cpp
+ )
+ LL_ADD_PROJECT_UNIT_TESTS(llprimitive "${llprimitive_TEST_SOURCE_FILES}")
+endif (LL_TESTS)
diff --git a/indra/llprimitive/llmodel.cpp b/indra/llprimitive/llmodel.cpp
new file mode 100644
index 0000000000..57ac7a143f
--- /dev/null
+++ b/indra/llprimitive/llmodel.cpp
@@ -0,0 +1,2299 @@
+/**
+ * @file llmodel.cpp
+ * @brief Model handling implementation
+ *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "linden_common.h"
+
+#include "llmodel.h"
+#include "llconvexdecomposition.h"
+#include "llsdserialize.h"
+#include "llvector4a.h"
+
+#include "dae.h"
+#include "dae/daeErrorHandler.h"
+#include "dom/domConstants.h"
+#include "dom/domMesh.h"
+
+#ifdef LL_STANDALONE
+# include <zlib.h>
+#else
+# include "zlib/zlib.h"
+#endif
+
+
+
+std::string model_names[] =
+{
+ "lowest_lod",
+ "low_lod",
+ "medium_lod",
+ "high_lod",
+ "physics_shape"
+};
+
+const int MODEL_NAMES_LENGTH = sizeof(model_names) / sizeof(std::string);
+
+LLModel::LLModel(LLVolumeParams& params, F32 detail)
+ : LLVolume(params, detail), mNormalizedScale(1,1,1), mNormalizedTranslation(0,0,0)
+ , mPelvisOffset( 0.0f ), mStatus(NO_ERRORS)
+{
+ mDecompID = -1;
+ mLocalID = -1;
+}
+
+LLModel::~LLModel()
+{
+ if (mDecompID >= 0)
+ {
+ LLConvexDecomposition::getInstance()->deleteDecomposition(mDecompID);
+ }
+}
+
+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,
+ domSource* &pos_source, domSource* &tc_source, domSource* &norm_source)
+{
+ idx_stride = 0;
+
+ for (U32 j = 0; j < inputs.getCount(); ++j)
+ {
+ idx_stride = llmax((S32) inputs[j]->getOffset(), idx_stride);
+
+ 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();
+
+
+ for (U32 k = 0; k < v_inp.getCount(); ++k)
+ {
+ if (strcmp(COMMON_PROFILE_INPUT_POSITION, v_inp[k]->getSemantic()) == 0)
+ {
+ pos_offset = inputs[j]->getOffset();
+
+ const domURIFragmentType& uri = v_inp[k]->getSource();
+ daeElementRef elem = uri.getElement();
+ pos_source = (domSource*) elem.cast();
+ }
+
+ if (strcmp(COMMON_PROFILE_INPUT_NORMAL, v_inp[k]->getSemantic()) == 0)
+ {
+ norm_offset = inputs[j]->getOffset();
+
+ const domURIFragmentType& uri = v_inp[k]->getSource();
+ daeElementRef elem = uri.getElement();
+ norm_source = (domSource*) elem.cast();
+ }
+ }
+ }
+
+ if (strcmp(COMMON_PROFILE_INPUT_NORMAL, inputs[j]->getSemantic()) == 0)
+ {
+ //found normal array for this triangle list
+ norm_offset = inputs[j]->getOffset();
+ const domURIFragmentType& uri = inputs[j]->getSource();
+ daeElementRef elem = uri.getElement();
+ norm_source = (domSource*) elem.cast();
+ }
+ else if (strcmp(COMMON_PROFILE_INPUT_TEXCOORD, inputs[j]->getSemantic()) == 0)
+ { //found texCoords
+ tc_offset = inputs[j]->getOffset();
+ const domURIFragmentType& uri = inputs[j]->getSource();
+ daeElementRef elem = uri.getElement();
+ tc_source = (domSource*) elem.cast();
+ }
+ }
+
+ idx_stride += 1;
+}
+
+LLModel::EModelStatus load_face_from_dom_triangles(std::vector<LLVolumeFace>& face_list, std::vector<std::string>& materials, domTrianglesRef& tri)
+{
+ LLVolumeFace face;
+ std::vector<LLVolumeFace::VertexData> verts;
+ std::vector<U16> indices;
+
+ const domInputLocalOffset_Array& inputs = tri->getInput_array();
+
+ S32 pos_offset = -1;
+ S32 tc_offset = -1;
+ S32 norm_offset = -1;
+
+ domSource* pos_source = NULL;
+ domSource* tc_source = NULL;
+ domSource* norm_source = NULL;
+
+ S32 idx_stride = 0;
+
+ get_dom_sources(inputs, pos_offset, tc_offset, norm_offset, idx_stride, pos_source, tc_source, norm_source);
+
+ domPRef p = tri->getP();
+ domListOfUInts& idx = p->getValue();
+
+ domListOfFloats dummy ;
+ domListOfFloats& v = pos_source ? pos_source->getFloat_array()->getValue() : dummy ;
+ domListOfFloats& tc = tc_source ? tc_source->getFloat_array()->getValue() : dummy ;
+ domListOfFloats& n = norm_source ? norm_source->getFloat_array()->getValue() : dummy ;
+
+ if (pos_source)
+ {
+ face.mExtents[0].set(v[0], v[1], v[2]);
+ face.mExtents[1].set(v[0], v[1], v[2]);
+ }
+
+ LLVolumeFace::VertexMapData::PointMap point_map;
+
+ for (U32 i = 0; i < idx.getCount(); i += idx_stride)
+ {
+ LLVolumeFace::VertexData cv;
+ if (pos_source)
+ {
+ cv.setPosition(LLVector4a(v[idx[i+pos_offset]*3+0],
+ v[idx[i+pos_offset]*3+1],
+ v[idx[i+pos_offset]*3+2]));
+ }
+
+ if (tc_source)
+ {
+ 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;
+
+ LLVolumeFace::VertexMapData::PointMap::iterator point_iter;
+ point_iter = point_map.find(LLVector3(cv.getPosition().getF32ptr()));
+
+ if (point_iter != point_map.end())
+ {
+ for (U32 j = 0; j < point_iter->second.size(); ++j)
+ {
+ if ((point_iter->second)[j] == cv)
+ {
+ found = TRUE;
+ indices.push_back((point_iter->second)[j].mIndex);
+ break;
+ }
+ }
+ }
+
+ if (!found)
+ {
+ update_min_max(face.mExtents[0], face.mExtents[1], cv.getPosition());
+ verts.push_back(cv);
+ if (verts.size() >= 65535)
+ {
+ //llerrs << "Attempted to write model exceeding 16-bit index buffer limitation." << llendl;
+ return LLModel::VERTEX_NUMBER_OVERFLOW ;
+ }
+ U16 index = (U16) (verts.size()-1);
+ indices.push_back(index);
+
+ LLVolumeFace::VertexMapData d;
+ d.setPosition(cv.getPosition());
+ d.mTexCoord = cv.mTexCoord;
+ d.setNormal(cv.getNormal());
+ d.mIndex = index;
+ if (point_iter != point_map.end())
+ {
+ point_iter->second.push_back(d);
+ }
+ else
+ {
+ point_map[LLVector3(d.getPosition().getF32ptr())].push_back(d);
+ }
+ }
+
+ if (indices.size()%3 == 0 && verts.size() >= 65532)
+ {
+ face_list.push_back(face);
+ face_list.rbegin()->fillFromLegacyData(verts, indices);
+ face = LLVolumeFace();
+ point_map.clear();
+ }
+
+ }
+
+ if (!verts.empty())
+ {
+ std::string material;
+
+ if (tri->getMaterial())
+ {
+ material = std::string(tri->getMaterial());
+ }
+
+ materials.push_back(material);
+ face_list.push_back(face);
+
+ face_list.rbegin()->fillFromLegacyData(verts, indices);
+ }
+
+ return LLModel::NO_ERRORS ;
+}
+
+LLModel::EModelStatus load_face_from_dom_polylist(std::vector<LLVolumeFace>& face_list, std::vector<std::string>& materials, domPolylistRef& poly)
+{
+ domPRef p = poly->getP();
+ domListOfUInts& idx = p->getValue();
+
+ if (idx.getCount() == 0)
+ {
+ return LLModel::NO_ERRORS ;
+ }
+
+ const domInputLocalOffset_Array& inputs = poly->getInput_array();
+
+
+ domListOfUInts& vcount = poly->getVcount()->getValue();
+
+ S32 pos_offset = -1;
+ S32 tc_offset = -1;
+ S32 norm_offset = -1;
+
+ domSource* pos_source = NULL;
+ domSource* tc_source = NULL;
+ domSource* norm_source = NULL;
+
+ S32 idx_stride = 0;
+
+ get_dom_sources(inputs, pos_offset, tc_offset, norm_offset, idx_stride, pos_source, tc_source, norm_source);
+
+ LLVolumeFace face;
+
+ std::vector<U16> indices;
+ std::vector<LLVolumeFace::VertexData> verts;
+
+ domListOfFloats v;
+ domListOfFloats tc;
+ domListOfFloats n;
+
+ if (pos_source)
+ {
+ v = pos_source->getFloat_array()->getValue();
+ face.mExtents[0].set(v[0], v[1], v[2]);
+ face.mExtents[1].set(v[0], v[1], v[2]);
+ }
+
+ if (tc_source)
+ {
+ tc = tc_source->getFloat_array()->getValue();
+ }
+
+ if (norm_source)
+ {
+ n = norm_source->getFloat_array()->getValue();
+ }
+
+ LLVolumeFace::VertexMapData::PointMap point_map;
+
+ U32 cur_idx = 0;
+ for (U32 i = 0; i < vcount.getCount(); ++i)
+ { //for each polygon
+ U32 first_index = 0;
+ U32 last_index = 0;
+ for (U32 j = 0; j < vcount[i]; ++j)
+ { //for each vertex
+
+ LLVolumeFace::VertexData cv;
+
+ if (pos_source)
+ {
+ cv.getPosition().set(v[idx[cur_idx+pos_offset]*3+0],
+ v[idx[cur_idx+pos_offset]*3+1],
+ v[idx[cur_idx+pos_offset]*3+2]);
+ }
+
+ if (tc_source)
+ {
+ 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;
+
+ LLVolumeFace::VertexMapData::PointMap::iterator point_iter;
+ LLVector3 pos3(cv.getPosition().getF32ptr());
+ point_iter = point_map.find(pos3);
+
+ if (point_iter != point_map.end())
+ {
+ for (U32 k = 0; k < point_iter->second.size(); ++k)
+ {
+ if ((point_iter->second)[k] == cv)
+ {
+ found = TRUE;
+ U32 index = (point_iter->second)[k].mIndex;
+ if (j == 0)
+ {
+ first_index = index;
+ }
+ else if (j == 1)
+ {
+ last_index = index;
+ }
+ else
+ {
+ indices.push_back(first_index);
+ indices.push_back(last_index);
+ indices.push_back(index);
+ last_index = index;
+ }
+
+ break;
+ }
+ }
+ }
+
+ if (!found)
+ {
+ update_min_max(face.mExtents[0], face.mExtents[1], cv.getPosition());
+ verts.push_back(cv);
+ if (verts.size() >= 65535)
+ {
+ //llerrs << "Attempted to write model exceeding 16-bit index buffer limitation." << llendl;
+ return LLModel::VERTEX_NUMBER_OVERFLOW ;
+ }
+ U16 index = (U16) (verts.size()-1);
+
+ if (j == 0)
+ {
+ first_index = index;
+ }
+ else if (j == 1)
+ {
+ last_index = index;
+ }
+ else
+ {
+ indices.push_back(first_index);
+ indices.push_back(last_index);
+ indices.push_back(index);
+ last_index = index;
+ }
+
+ LLVolumeFace::VertexMapData d;
+ d.setPosition(cv.getPosition());
+ d.mTexCoord = cv.mTexCoord;
+ d.setNormal(cv.getNormal());
+ d.mIndex = index;
+ if (point_iter != point_map.end())
+ {
+ point_iter->second.push_back(d);
+ }
+ else
+ {
+ point_map[pos3].push_back(d);
+ }
+ }
+
+ if (indices.size()%3 == 0 && indices.size() >= 65532)
+ {
+ face_list.push_back(face);
+ face_list.rbegin()->fillFromLegacyData(verts, indices);
+ face = LLVolumeFace();
+ verts.clear();
+ indices.clear();
+ point_map.clear();
+ }
+ }
+ }
+
+ if (!verts.empty())
+ {
+ std::string material;
+
+ if (poly->getMaterial())
+ {
+ material = std::string(poly->getMaterial());
+ }
+
+ materials.push_back(material);
+ face_list.push_back(face);
+ face_list.rbegin()->fillFromLegacyData(verts, indices);
+ }
+
+ return LLModel::NO_ERRORS ;
+}
+
+LLModel::EModelStatus load_face_from_dom_polygons(std::vector<LLVolumeFace>& face_list, std::vector<std::string>& materials, domPolygonsRef& poly)
+{
+ LLVolumeFace face;
+ std::vector<U16> indices;
+ std::vector<LLVolumeFace::VertexData> verts;
+
+ const domInputLocalOffset_Array& inputs = poly->getInput_array();
+
+
+ S32 v_offset = -1;
+ S32 n_offset = -1;
+ S32 t_offset = -1;
+
+ domListOfFloats* v = NULL;
+ domListOfFloats* n = NULL;
+ domListOfFloats* t = NULL;
+
+ U32 stride = 0;
+ for (U32 i = 0; i < inputs.getCount(); ++i)
+ {
+ stride = llmax((U32) inputs[i]->getOffset()+1, stride);
+
+ if (strcmp(COMMON_PROFILE_INPUT_VERTEX, inputs[i]->getSemantic()) == 0)
+ { //found vertex array
+ v_offset = inputs[i]->getOffset();
+
+ const domURIFragmentType& uri = inputs[i]->getSource();
+ daeElementRef elem = uri.getElement();
+ domVertices* vertices = (domVertices*) elem.cast();
+
+ domInputLocal_Array& v_inp = vertices->getInput_array();
+
+ 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();
+ v = &(src->getFloat_array()->getValue());
+ }
+ }
+ }
+ else if (strcmp(COMMON_PROFILE_INPUT_NORMAL, inputs[i]->getSemantic()) == 0)
+ {
+ n_offset = inputs[i]->getOffset();
+ //found normal array for this triangle list
+ const domURIFragmentType& uri = inputs[i]->getSource();
+ daeElementRef elem = uri.getElement();
+ domSource* src = (domSource*) elem.cast();
+ n = &(src->getFloat_array()->getValue());
+ }
+ else if (strcmp(COMMON_PROFILE_INPUT_TEXCOORD, inputs[i]->getSemantic()) == 0 && inputs[i]->getSet() == 0)
+ { //found texCoords
+ t_offset = inputs[i]->getOffset();
+ const domURIFragmentType& uri = inputs[i]->getSource();
+ daeElementRef elem = uri.getElement();
+ domSource* src = (domSource*) elem.cast();
+ t = &(src->getFloat_array()->getValue());
+ }
+ }
+
+ domP_Array& ps = poly->getP_array();
+
+ //make a triangle list in <verts>
+ for (U32 i = 0; i < ps.getCount(); ++i)
+ { //for each polygon
+ domListOfUInts& idx = ps[i]->getValue();
+ for (U32 j = 0; j < idx.getCount()/stride; ++j)
+ { //for each vertex
+ if (j > 2)
+ {
+ U32 size = verts.size();
+ LLVolumeFace::VertexData v0 = verts[size-3];
+ LLVolumeFace::VertexData v1 = verts[size-1];
+
+ verts.push_back(v0);
+ verts.push_back(v1);
+ }
+
+ LLVolumeFace::VertexData vert;
+
+
+ if (v)
+ {
+ U32 v_idx = idx[j*stride+v_offset]*3;
+ vert.getPosition().set(v->get(v_idx),
+ v->get(v_idx+1),
+ v->get(v_idx+2));
+ }
+
+ if (n)
+ {
+ U32 n_idx = idx[j*stride+n_offset]*3;
+ vert.getNormal().set(n->get(n_idx),
+ 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);
+ }
+ }
+
+ if (verts.empty())
+ {
+ return LLModel::NO_ERRORS;
+ }
+
+ face.mExtents[0] = verts[0].getPosition();
+ face.mExtents[1] = verts[0].getPosition();
+
+ //create a map of unique vertices to indices
+ std::map<LLVolumeFace::VertexData, U32> vert_idx;
+
+ U32 cur_idx = 0;
+ for (U32 i = 0; i < verts.size(); ++i)
+ {
+ std::map<LLVolumeFace::VertexData, U32>::iterator iter = vert_idx.find(verts[i]);
+ if (iter == vert_idx.end())
+ {
+ vert_idx[verts[i]] = cur_idx++;
+ }
+ }
+
+ 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());
+
+ for (std::map<LLVolumeFace::VertexData, U32>::iterator iter = vert_idx.begin(); iter != vert_idx.end(); ++iter)
+ {
+ new_verts[iter->second] = iter->first;
+ update_min_max(face.mExtents[0], face.mExtents[1], iter->first.getPosition());
+ }
+
+ //build index array from map
+ indices.resize(verts.size());
+
+ for (U32 i = 0; i < verts.size(); ++i)
+ {
+ indices[i] = vert_idx[verts[i]];
+ }
+
+ // DEBUG just build an expanded triangle list
+ /*for (U32 i = 0; i < verts.size(); ++i)
+ {
+ indices.push_back((U16) i);
+ update_min_max(face.mExtents[0], face.mExtents[1], verts[i].getPosition());
+ }*/
+
+ if (!new_verts.empty())
+ {
+ std::string material;
+
+ if (poly->getMaterial())
+ {
+ material = std::string(poly->getMaterial());
+ }
+
+ materials.push_back(material);
+ face_list.push_back(face);
+ face_list.rbegin()->fillFromLegacyData(new_verts, indices);
+ }
+
+ return LLModel::NO_ERRORS ;
+}
+
+//static
+std::string LLModel::getStatusString(U32 status)
+{
+ const static std::string status_strings[(S32)INVALID_STATUS] = {"status_no_error", "status_vertex_number_overflow"};
+
+ if(status < INVALID_STATUS)
+ {
+ if(status_strings[status] == std::string())
+ {
+ llerrs << "No valid status string for this status: " << (U32)status << llendl ;
+ }
+ return status_strings[status] ;
+ }
+
+ llerrs << "Invalid model status: " << (U32)status << llendl ;
+
+ return std::string() ;
+}
+
+void LLModel::addVolumeFacesFromDomMesh(domMesh* mesh)
+{
+ domTriangles_Array& tris = mesh->getTriangles_array();
+
+ for (U32 i = 0; i < tris.getCount(); ++i)
+ {
+ domTrianglesRef& tri = tris.get(i);
+
+ mStatus = load_face_from_dom_triangles(mVolumeFaces, mMaterialList, tri);
+
+ if(mStatus != NO_ERRORS)
+ {
+ mVolumeFaces.clear() ;
+ mMaterialList.clear() ;
+ return ; //abort
+ }
+ }
+
+ domPolylist_Array& polys = mesh->getPolylist_array();
+ 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)
+ {
+ mVolumeFaces.clear() ;
+ mMaterialList.clear() ;
+ 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)
+ {
+ mVolumeFaces.clear() ;
+ mMaterialList.clear() ;
+ return ; //abort
+ }
+ }
+
+}
+
+BOOL LLModel::createVolumeFacesFromDomMesh(domMesh* mesh)
+{
+ if (mesh)
+ {
+ mVolumeFaces.clear();
+ mMaterialList.clear();
+
+ addVolumeFacesFromDomMesh(mesh);
+
+ if (getNumVolumeFaces() > 0)
+ {
+ optimizeVolumeFaces();
+ normalizeVolumeFaces();
+
+ if (getNumVolumeFaces() > 0)
+ {
+ return TRUE;
+ }
+ }
+ }
+ else
+ {
+ llwarns << "no mesh found" << llendl;
+ }
+
+ return FALSE;
+}
+
+void LLModel::offsetMesh( const LLVector3& pivotPoint )
+{
+ LLVector4a pivot( pivotPoint[VX], pivotPoint[VY], pivotPoint[VZ] );
+
+ for (std::vector<LLVolumeFace>::iterator faceIt = mVolumeFaces.begin(); faceIt != mVolumeFaces.end(); )
+ {
+ std::vector<LLVolumeFace>:: iterator currentFaceIt = faceIt++;
+ LLVolumeFace& face = *currentFaceIt;
+ LLVector4a *pos = (LLVector4a*) face.mPositions;
+
+ for (U32 i=0; i<face.mNumVertices; ++i )
+ {
+ pos[i].add( pivot );
+ }
+ }
+}
+
+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);
+ }
+ }
+#endif
+}
+
+// Shrink the model to fit
+// on a 1x1x1 cube centered at the origin.
+// The positions and extents
+// multiplied by mNormalizedScale
+// and offset by mNormalizedTranslation
+// to be the "original" extents and position.
+// Also, the positions will fit
+// within the unit cube.
+void LLModel::normalizeVolumeFaces()
+{
+
+ // ensure we don't have too many faces
+ if (mVolumeFaces.size() > LL_SCULPT_MESH_MAX_FACES)
+ mVolumeFaces.resize(LL_SCULPT_MESH_MAX_FACES);
+
+ if (!mVolumeFaces.empty())
+ {
+ 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
+ // of the volume along each axis.
+ min = mVolumeFaces[0].mExtents[0];
+ max = mVolumeFaces[0].mExtents[1];
+
+ for (U32 i = 1; i < mVolumeFaces.size(); ++i)
+ {
+ 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]);
+ }
+
+ // Now that we have the extents of the model
+ // we can compute the offset needed to center
+ // the model at the origin.
+
+ // Compute center of the model
+ // and make it negative to get translation
+ // needed to center at origin.
+ LLVector4a trans;
+ trans.setAdd(min, max);
+ trans.mul(-0.5f);
+
+ // Compute the total size along all
+ // axes of the model.
+ LLVector4a size;
+ size.setSub(max, min);
+
+ // Prevent division by zero.
+ F32 x = size[0];
+ F32 y = size[1];
+ F32 z = size[2];
+ F32 w = size[3];
+ if (fabs(x)<F_APPROXIMATELY_ZERO)
+ {
+ x = 1.0;
+ }
+ if (fabs(y)<F_APPROXIMATELY_ZERO)
+ {
+ y = 1.0;
+ }
+ if (fabs(z)<F_APPROXIMATELY_ZERO)
+ {
+ z = 1.0;
+ }
+ size.set(x,y,z,w);
+
+ // Compute scale as reciprocal of size
+ LLVector4a scale;
+ 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];
+
+ // We shrink the extents so
+ // that they fall within
+ // the unit cube.
+ face.mExtents[0].add(trans);
+ face.mExtents[0].mul(scale);
+
+ face.mExtents[1].add(trans);
+ face.mExtents[1].mul(scale);
+
+ // 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);
+ norm[j].mul(inv_scale);
+ norm[j].normalize3();
+ }
+ }
+
+ // mNormalizedScale is the scale at which
+ // we would need to multiply the model
+ // by to get the original size of the
+ // model instead of the normalized size.
+ LLVector4a normalized_scale;
+ normalized_scale.splat(1.f);
+ normalized_scale.div(scale);
+ mNormalizedScale.set(normalized_scale.getF32ptr());
+ mNormalizedTranslation.set(trans.getF32ptr());
+ mNormalizedTranslation *= -1.f;
+ }
+}
+
+void LLModel::getNormalizedScaleTranslation(LLVector3& scale_out, LLVector3& translation_out)
+{
+ scale_out = mNormalizedScale;
+ translation_out = mNormalizedTranslation;
+}
+
+void LLModel::setNumVolumeFaces(S32 count)
+{
+ mVolumeFaces.resize(count);
+}
+
+void LLModel::setVolumeFaceData(
+ S32 f,
+ LLStrider<LLVector3> pos,
+ LLStrider<LLVector3> norm,
+ LLStrider<LLVector2> tc,
+ LLStrider<U16> ind,
+ U32 num_verts,
+ U32 num_indices)
+{
+ LLVolumeFace& face = mVolumeFaces[f];
+
+ face.resizeVertices(num_verts);
+ 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));
+ U32 size = (num_indices*2+0xF)&~0xF;
+ LLVector4a::memcpyNonAliased16((F32*) face.mIndices, (F32*) ind.get(), size);
+}
+
+void LLModel::appendFaces(LLModel *model, LLMatrix4 &transform, LLMatrix4& norm_mat)
+{
+ if (mVolumeFaces.empty())
+ {
+ setNumVolumeFaces(1);
+ }
+
+ LLVolumeFace& face = mVolumeFaces[mVolumeFaces.size()-1];
+
+
+ for (S32 i = 0; i < model->getNumFaces(); ++i)
+ {
+ face.appendFace(model->getVolumeFace(i), transform, norm_mat);
+ }
+
+}
+
+void LLModel::appendFace(const LLVolumeFace& src_face, std::string src_material, LLMatrix4& mat, LLMatrix4& norm_mat)
+{
+ S32 rindex = getNumVolumeFaces()-1;
+ if (rindex == -1 ||
+ mVolumeFaces[rindex].mNumVertices + src_face.mNumVertices >= 65536)
+ { //empty or overflow will occur, append new face
+ LLVolumeFace cur_face;
+ cur_face.appendFace(src_face, mat, norm_mat);
+ addFace(cur_face);
+ mMaterialList.push_back(src_material);
+ }
+ else
+ { //append to existing end face
+ mVolumeFaces.rbegin()->appendFace(src_face, mat, norm_mat);
+ }
+}
+
+void LLModel::addFace(const LLVolumeFace& face)
+{
+ if (face.mNumVertices == 0)
+ {
+ llerrs << "Cannot add empty face." << llendl;
+ }
+
+ mVolumeFaces.push_back(face);
+
+ if (mVolumeFaces.size() > MAX_MODEL_FACES)
+ {
+ llerrs << "Model prims cannot have more than " << MAX_MODEL_FACES << " faces!" << llendl;
+ }
+}
+
+
+void LLModel::generateNormals(F32 angle_cutoff)
+{
+ //generate normals for all faces by:
+ // 1 - Create faceted copy of face with no texture coordinates
+ // 2 - Weld vertices in faceted copy that are shared between triangles with less than "angle_cutoff" difference between normals
+ // 3 - Generate smoothed set of normals based on welding results
+ // 4 - Create faceted copy of face with texture coordinates
+ // 5 - Copy smoothed normals to faceted copy, using closest normal to triangle normal where more than one normal exists for a given position
+ // 6 - Remove redundant vertices from new faceted (now smooth) copy
+
+ angle_cutoff = cosf(angle_cutoff);
+ for (U32 j = 0; j < mVolumeFaces.size(); ++j)
+ {
+ LLVolumeFace& vol_face = mVolumeFaces[j];
+
+ if (vol_face.mNumIndices > 65535)
+ {
+ llwarns << "Too many vertices for normal generation to work." << llendl;
+ continue;
+ }
+
+ //create faceted copy of current face with no texture coordinates (step 1)
+ LLVolumeFace faceted;
+
+ LLVector4a* src_pos = (LLVector4a*) vol_face.mPositions;
+ //LLVector4a* src_norm = (LLVector4a*) vol_face.mNormals;
+
+
+ faceted.resizeVertices(vol_face.mNumIndices);
+ faceted.resizeIndices(vol_face.mNumIndices);
+ //bake out triangles into temporary face, clearing texture coordinates
+ for (U32 i = 0; i < vol_face.mNumIndices; ++i)
+ {
+ U32 idx = vol_face.mIndices[i];
+
+ faceted.mPositions[i] = src_pos[idx];
+ faceted.mTexCoords[i] = LLVector2(0,0);
+ faceted.mIndices[i] = i;
+ }
+
+ //generate normals for temporary face
+ for (U32 i = 0; i < faceted.mNumIndices; i += 3)
+ { //for each triangle
+ U16 i0 = faceted.mIndices[i+0];
+ U16 i1 = faceted.mIndices[i+1];
+ U16 i2 = faceted.mIndices[i+2];
+
+ LLVector4a& p0 = faceted.mPositions[i0];
+ LLVector4a& p1 = faceted.mPositions[i1];
+ LLVector4a& p2 = faceted.mPositions[i2];
+
+ LLVector4a& n0 = faceted.mNormals[i0];
+ LLVector4a& n1 = faceted.mNormals[i1];
+ LLVector4a& n2 = faceted.mNormals[i2];
+
+ LLVector4a lhs, rhs;
+ lhs.setSub(p1, p0);
+ rhs.setSub(p2, p0);
+
+ n0.setCross3(lhs, rhs);
+ n0.normalize3();
+ n1 = n0;
+ n2 = n0;
+ }
+
+ //weld vertices in temporary face, respecting angle_cutoff (step 2)
+ faceted.optimize(angle_cutoff);
+
+ //generate normals for welded face based on new topology (step 3)
+
+ for (U32 i = 0; i < faceted.mNumVertices; i++)
+ {
+ faceted.mNormals[i].clear();
+ }
+
+ for (U32 i = 0; i < faceted.mNumIndices; i += 3)
+ { //for each triangle
+ U16 i0 = faceted.mIndices[i+0];
+ U16 i1 = faceted.mIndices[i+1];
+ U16 i2 = faceted.mIndices[i+2];
+
+ LLVector4a& p0 = faceted.mPositions[i0];
+ LLVector4a& p1 = faceted.mPositions[i1];
+ LLVector4a& p2 = faceted.mPositions[i2];
+
+ LLVector4a& n0 = faceted.mNormals[i0];
+ LLVector4a& n1 = faceted.mNormals[i1];
+ LLVector4a& n2 = faceted.mNormals[i2];
+
+ LLVector4a lhs, rhs;
+ lhs.setSub(p1, p0);
+ rhs.setSub(p2, p0);
+
+ LLVector4a n;
+ n.setCross3(lhs, rhs);
+
+ n0.add(n);
+ n1.add(n);
+ n2.add(n);
+ }
+
+ //normalize normals and build point map
+ LLVolumeFace::VertexMapData::PointMap point_map;
+
+ for (U32 i = 0; i < faceted.mNumVertices; ++i)
+ {
+ faceted.mNormals[i].normalize3();
+
+ LLVolumeFace::VertexMapData v;
+ v.setPosition(faceted.mPositions[i]);
+ v.setNormal(faceted.mNormals[i]);
+
+ point_map[LLVector3(v.getPosition().getF32ptr())].push_back(v);
+ }
+
+ //create faceted copy of current face with texture coordinates (step 4)
+ LLVolumeFace new_face;
+
+ //bake out triangles into new face
+ new_face.resizeIndices(vol_face.mNumIndices);
+ new_face.resizeVertices(vol_face.mNumIndices);
+
+ for (U32 i = 0; i < vol_face.mNumIndices; ++i)
+ {
+ U32 idx = vol_face.mIndices[i];
+ 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;
+ }
+
+ //generate normals for new face
+ for (U32 i = 0; i < new_face.mNumIndices; i += 3)
+ { //for each triangle
+ U16 i0 = new_face.mIndices[i+0];
+ U16 i1 = new_face.mIndices[i+1];
+ U16 i2 = new_face.mIndices[i+2];
+
+ LLVector4a& p0 = new_face.mPositions[i0];
+ LLVector4a& p1 = new_face.mPositions[i1];
+ LLVector4a& p2 = new_face.mPositions[i2];
+
+ LLVector4a& n0 = new_face.mNormals[i0];
+ LLVector4a& n1 = new_face.mNormals[i1];
+ LLVector4a& n2 = new_face.mNormals[i2];
+
+ LLVector4a lhs, rhs;
+ lhs.setSub(p1, p0);
+ rhs.setSub(p2, p0);
+
+ n0.setCross3(lhs, rhs);
+ n0.normalize3();
+ n1 = n0;
+ n2 = n0;
+ }
+
+ //swap out normals in new_face with best match from point map (step 5)
+ for (U32 i = 0; i < new_face.mNumVertices; ++i)
+ {
+ //LLVolumeFace::VertexData v = new_face.mVertices[i];
+
+ LLVector4a ref_norm = new_face.mNormals[i];
+
+ LLVolumeFace::VertexMapData::PointMap::iterator iter = point_map.find(LLVector3(new_face.mPositions[i].getF32ptr()));
+
+ if (iter != point_map.end())
+ {
+ F32 best = -2.f;
+ for (U32 k = 0; k < iter->second.size(); ++k)
+ {
+ 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)
+ {
+ best = cur;
+ new_face.mNormals[i] = n;
+ }
+ }
+ }
+ }
+
+ //remove redundant vertices from new face (step 6)
+ new_face.optimize();
+
+ mVolumeFaces[j] = new_face;
+ }
+}
+
+//static
+std::string LLModel::getElementLabel(daeElement *element)
+{ // try to get a decent label for this element
+ // if we have a name attribute, use it
+ std::string name = element->getAttribute("name");
+ if (name.length())
+ {
+ return name;
+ }
+
+ // if we have an ID attribute, use it
+ if (element->getID())
+ {
+ return std::string(element->getID());
+ }
+
+ // if we have a parent, use it
+ daeElement* parent = element->getParent();
+ if (parent)
+ {
+ // if parent has a name, use it
+ std::string name = parent->getAttribute("name");
+ if (name.length())
+ {
+ return name;
+ }
+
+ // if parent has an ID, use it
+ if (parent->getID())
+ {
+ return std::string(parent->getID());
+ }
+ }
+
+ // try to use our type
+ daeString element_name = element->getElementName();
+ if (element_name)
+ {
+ return std::string(element_name);
+ }
+
+ // if all else fails, use "object"
+ return std::string("object");
+}
+
+//static
+LLModel* LLModel::loadModelFromDomMesh(domMesh *mesh)
+{
+ LLVolumeParams volume_params;
+ volume_params.setType(LL_PCODE_PROFILE_SQUARE, LL_PCODE_PATH_LINE);
+ LLModel* ret = new LLModel(volume_params, 0.f);
+ ret->createVolumeFacesFromDomMesh(mesh);
+ ret->mLabel = getElementLabel(mesh);
+ return ret;
+}
+
+std::string LLModel::getName() const
+{
+ if (!mRequestedLabel.empty())
+ return mRequestedLabel;
+ else
+ return mLabel;
+}
+
+//static
+LLSD LLModel::writeModel(
+ std::ostream& ostr,
+ LLModel* physics,
+ LLModel* high,
+ LLModel* medium,
+ LLModel* low,
+ LLModel* impostor,
+ const LLModel::Decomposition& decomp,
+ BOOL upload_skin,
+ BOOL upload_joints,
+ BOOL nowrite)
+{
+ LLSD mdl;
+
+ LLModel* model[] =
+ {
+ impostor,
+ low,
+ medium,
+ high,
+ physics
+ };
+
+ bool skinning = upload_skin && high && !high->mSkinWeights.empty();
+
+ if (skinning)
+ { //write skinning block
+ mdl["skin"] = high->mSkinInfo.asLLSD(upload_joints);
+ }
+
+ if (!decomp.mBaseHull.empty() ||
+ !decomp.mHull.empty())
+ {
+ mdl["decomposition"] = decomp.asLLSD();
+ }
+
+ for (U32 idx = 0; idx < MODEL_NAMES_LENGTH; ++idx)
+ {
+ if (model[idx] && model[idx]->getNumVolumeFaces() > 0)
+ {
+ LLVector3 min_pos = LLVector3(model[idx]->getVolumeFace(0).mPositions[0].getF32ptr());
+ LLVector3 max_pos = min_pos;
+
+ //find position domain
+ for (S32 i = 0; i < model[idx]->getNumVolumeFaces(); ++i)
+ { //for each face
+ const LLVolumeFace& face = model[idx]->getVolumeFace(i);
+ for (U32 j = 0; j < face.mNumVertices; ++j)
+ {
+ update_min_max(min_pos, max_pos, face.mPositions[j].getF32ptr());
+ }
+ }
+
+ LLVector3 pos_range = max_pos - min_pos;
+
+ for (S32 i = 0; i < model[idx]->getNumVolumeFaces(); ++i)
+ { //for each face
+ const LLVolumeFace& face = model[idx]->getVolumeFace(i);
+ if (!face.mNumVertices)
+ { //don't export an empty face
+ continue;
+ }
+ LLSD::Binary verts(face.mNumVertices*3*2);
+ LLSD::Binary tc(face.mNumVertices*2*2);
+ LLSD::Binary normals(face.mNumVertices*3*2);
+ LLSD::Binary indices(face.mNumIndices*2);
+
+ U32 vert_idx = 0;
+ U32 norm_idx = 0;
+ 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)
+ {
+ update_min_max(min_tc, max_tc, ftc[j]);
+ }
+
+ LLVector2 tc_range = max_tc - min_tc;
+
+ for (U32 j = 0; j < face.mNumVertices; ++j)
+ { //for each vert
+
+ F32* pos = face.mPositions[j].getF32ptr();
+ F32* norm = face.mNormals[j].getF32ptr();
+
+ //position + normal
+ 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);
+
+ U8* buff = (U8*) &val;
+ //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;
+
+ //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);
+
+ U8* buff = (U8*) &val;
+ //write to binary buffer
+ tc[tc_idx++] = buff[0];
+ tc[tc_idx++] = buff[1];
+ }
+
+ }
+
+ U32 idx_idx = 0;
+ for (U32 j = 0; j < face.mNumIndices; ++j)
+ {
+ U8* buff = (U8*) &(face.mIndices[j]);
+ indices[idx_idx++] = buff[0];
+ indices[idx_idx++] = buff[1];
+ }
+
+ //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]["TexCoord0Domain"]["Min"] = min_tc.getValue();
+ mdl[model_names[idx]][i]["TexCoord0Domain"]["Max"] = max_tc.getValue();
+
+ 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)
+ {
+ //write out skin weights
+
+ //each influence list entry is up to 4 24-bit values
+ // first 8 bits is bone index
+ // last 16 bits is bone influence weight
+ // a bone index of 0xFF signifies no more influences for this vertex
+
+ std::stringstream ostr;
+
+ for (U32 j = 0; j < face.mNumVertices; ++j)
+ {
+ LLVector3 pos(face.mPositions[j].getF32ptr());
+
+ 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)
+ {
+ if (iter->mJointIdx < 255 && iter->mJointIdx >= 0)
+ {
+ U8 idx = (U8) iter->mJointIdx;
+ ostr.write((const char*) &idx, 1);
+
+ U16 influence = (U16) (iter->mWeight*65535);
+ ostr.write((const char*) &influence, 2);
+
+ ++count;
+ }
+ }
+ U8 end_list = 0xFF;
+ if (count < 4)
+ {
+ ostr.write((const char*) &end_list, 1);
+ }
+ }
+
+ //copy ostr to binary buffer
+ std::string data = ostr.str();
+ const U8* buff = (U8*) data.data();
+ U32 bytes = data.size();
+
+ LLSD::Binary w(bytes);
+ for (U32 j = 0; j < bytes; ++j)
+ {
+ w[j] = buff[j];
+ }
+
+ mdl[model_names[idx]][i]["Weights"] = w;
+ }
+ }
+ }
+ }
+
+ return writeModelToStream(ostr, mdl, nowrite);
+}
+
+LLSD LLModel::writeModelToStream(std::ostream& ostr, LLSD& mdl, BOOL nowrite)
+{
+ U32 bytes = 0;
+
+ std::string::size_type cur_offset = 0;
+
+ LLSD header;
+
+ std::string skin;
+
+ if (mdl.has("skin"))
+ { //write out skin block
+ skin = zip_llsd(mdl["skin"]);
+
+ U32 size = skin.size();
+ if (size > 0)
+ {
+ header["skin"]["offset"] = (LLSD::Integer) cur_offset;
+ header["skin"]["size"] = (LLSD::Integer) size;
+ cur_offset += size;
+ bytes += size;
+ }
+ else
+ {
+ llerrs << "WTF?" << llendl;
+ }
+ }
+
+ std::string decomposition;
+
+ if (mdl.has("decomposition"))
+ { //write out convex decomposition
+ decomposition = zip_llsd(mdl["decomposition"]);
+
+ U32 size = decomposition.size();
+ if (size > 0)
+ {
+ header["decomposition"]["offset"] = (LLSD::Integer) cur_offset;
+ header["decomposition"]["size"] = (LLSD::Integer) size;
+ cur_offset += size;
+ bytes += size;
+ }
+ }
+
+ std::string out[MODEL_NAMES_LENGTH];
+
+ for (S32 i = 0; i < MODEL_NAMES_LENGTH; i++)
+ {
+ if (mdl.has(model_names[i]))
+ {
+ out[i] = zip_llsd(mdl[model_names[i]]);
+
+ U32 size = out[i].size();
+
+ header[model_names[i]]["offset"] = (LLSD::Integer) cur_offset;
+ header[model_names[i]]["size"] = (LLSD::Integer) size;
+ cur_offset += size;
+ bytes += size;
+ }
+ else
+ {
+ header[model_names[i]]["offset"] = -1;
+ header[model_names[i]]["size"] = 0;
+ }
+ }
+
+ if (!nowrite)
+ {
+ LLSDSerialize::toBinary(header, ostr);
+
+ if (!skin.empty())
+ { //write skin block
+ ostr.write((const char*) skin.data(), header["skin"]["size"].asInteger());
+ }
+
+ if (!decomposition.empty())
+ { //write decomposition block
+ ostr.write((const char*) decomposition.data(), header["decomposition"]["size"].asInteger());
+ }
+
+ for (S32 i = 0; i < MODEL_NAMES_LENGTH; i++)
+ {
+ if (!out[i].empty())
+ {
+ ostr.write((const char*) out[i].data(), header[model_names[i]]["size"].asInteger());
+ }
+ }
+ }
+
+ return header;
+}
+
+LLModel::weight_list& LLModel::getJointInfluences(const LLVector3& pos)
+{
+ weight_map::iterator iter = mSkinWeights.find(pos);
+
+ if (iter != mSkinWeights.end())
+ {
+ if ((iter->first - pos).magVec() > 0.1f)
+ {
+ llerrs << "WTF?" << llendl;
+ }
+
+ return iter->second;
+ }
+ else
+ { //no exact match found, get closest point
+ const F32 epsilon = 2.f/65536;
+ weight_map::iterator iter_up = mSkinWeights.lower_bound(pos);
+ weight_map::iterator iter_down = ++iter_up;
+
+ weight_map::iterator best = iter_up;
+
+ F32 min_dist = (iter->first - pos).magVecSquared();
+
+ bool done = false;
+ while (!done)
+ { //search up and down mSkinWeights from lower bound of pos until a
+ //match is found within epsilon. If no match is found within epsilon,
+ //return closest match
+ done = true;
+ if (iter_up != mSkinWeights.end() && ++iter_up != mSkinWeights.end())
+ {
+ done = false;
+ F32 dist = (iter_up->first - pos).magVecSquared();
+
+ if (dist < epsilon)
+ {
+ return iter_up->second;
+ }
+
+ if (dist < min_dist)
+ {
+ best = iter_up;
+ min_dist = dist;
+ }
+ }
+
+ if (iter_down != mSkinWeights.begin() && --iter_down != mSkinWeights.begin())
+ {
+ done = false;
+
+ F32 dist = (iter_down->first - pos).magVecSquared();
+
+ if (dist < epsilon)
+ {
+ return iter_down->second;
+ }
+
+ if (dist < min_dist)
+ {
+ best = iter_down;
+ min_dist = dist;
+ }
+
+ }
+ }
+
+ return best->second;
+ }
+}
+
+void LLModel::setConvexHullDecomposition(
+ const LLModel::convex_hull_decomposition& decomp)
+{
+ mPhysics.mHull = decomp;
+ mPhysics.mMesh.clear();
+ updateHullCenters();
+}
+
+void LLModel::updateHullCenters()
+{
+ mHullCenter.resize(mPhysics.mHull.size());
+ mHullPoints = 0;
+ mCenterOfHullCenters.clear();
+
+ for (U32 i = 0; i < mPhysics.mHull.size(); ++i)
+ {
+ LLVector3 cur_center;
+
+ for (U32 j = 0; j < mPhysics.mHull[i].size(); ++j)
+ {
+ cur_center += mPhysics.mHull[i][j];
+ }
+ mCenterOfHullCenters += cur_center;
+ cur_center *= 1.f/mPhysics.mHull[i].size();
+ mHullCenter[i] = cur_center;
+ mHullPoints += mPhysics.mHull[i].size();
+ }
+
+ if (mHullPoints > 0)
+ {
+ mCenterOfHullCenters *= 1.f / mHullPoints;
+ llassert(mPhysics.asLLSD().has("HullList"));
+ }
+}
+
+bool LLModel::loadModel(std::istream& is)
+{
+ mSculptLevel = -1; // default is an error occured
+
+ LLSD header;
+ {
+ if (!LLSDSerialize::fromBinary(header, is, 1024*1024*1024))
+ {
+ llwarns << "Mesh header parse error. Not a valid mesh asset!" << llendl;
+ return false;
+ }
+ }
+
+ std::string nm[] =
+ {
+ "lowest_lod",
+ "low_lod",
+ "medium_lod",
+ "high_lod",
+ "physics_shape",
+ };
+
+ const S32 MODEL_LODS = 5;
+
+ S32 lod = llclamp((S32) mDetail, 0, MODEL_LODS);
+
+ if (header[nm[lod]]["offset"].asInteger() == -1 ||
+ header[nm[lod]]["size"].asInteger() == 0 )
+ { //cannot load requested LOD
+ return false;
+ }
+
+ bool has_skin = header["skin"]["offset"].asInteger() >=0 &&
+ header["skin"]["size"].asInteger() > 0;
+
+ if (lod == LLModel::LOD_HIGH)
+ { //try to load skin info and decomp info
+ std::ios::pos_type cur_pos = is.tellg();
+ loadSkinInfo(header, is);
+ is.seekg(cur_pos);
+ }
+
+ if (lod == LLModel::LOD_PHYSICS)
+ {
+ std::ios::pos_type cur_pos = is.tellg();
+ loadDecomposition(header, is);
+ is.seekg(cur_pos);
+ }
+
+ is.seekg(header[nm[lod]]["offset"].asInteger(), std::ios_base::cur);
+
+ if (unpackVolumeFaces(is, header[nm[lod]]["size"].asInteger()))
+ {
+ if (has_skin)
+ {
+ //build out mSkinWeight from face info
+ for (S32 i = 0; i < getNumVolumeFaces(); ++i)
+ {
+ const LLVolumeFace& face = getVolumeFace(i);
+
+ if (face.mWeights)
+ {
+ for (S32 j = 0; j < face.mNumVertices; ++j)
+ {
+ LLVector4a& w = face.mWeights[j];
+
+ std::vector<JointWeight> wght;
+
+ for (S32 k = 0; k < 4; ++k)
+ {
+ S32 idx = (S32) w[k];
+ F32 f = w[k] - idx;
+ if (f > 0.f)
+ {
+ wght.push_back(JointWeight(idx, f));
+ }
+ }
+
+ if (!wght.empty())
+ {
+ LLVector3 pos(face.mPositions[j].getF32ptr());
+ mSkinWeights[pos] = wght;
+ }
+ }
+ }
+ }
+ }
+ return true;
+ }
+
+ return false;
+
+}
+
+
+bool LLModel::loadSkinInfo(LLSD& header, std::istream &is)
+{
+ S32 offset = header["skin"]["offset"].asInteger();
+ S32 size = header["skin"]["size"].asInteger();
+
+ if (offset >= 0 && size > 0)
+ {
+ is.seekg(offset, std::ios_base::cur);
+
+ LLSD skin_data;
+
+ if (unzip_llsd(skin_data, is, size))
+ {
+ mSkinInfo.fromLLSD(skin_data);
+ return true;
+ }
+ }
+
+ return false;
+}
+
+bool LLModel::loadDecomposition(LLSD& header, std::istream& is)
+{
+ S32 offset = header["decomposition"]["offset"].asInteger();
+ S32 size = header["decomposition"]["size"].asInteger();
+
+ if (offset >= 0 && size > 0)
+ {
+ is.seekg(offset, std::ios_base::cur);
+
+ LLSD data;
+
+ if (unzip_llsd(data, is, size))
+ {
+ mPhysics.fromLLSD(data);
+ updateHullCenters();
+ }
+ }
+
+ return true;
+}
+
+
+LLMeshSkinInfo::LLMeshSkinInfo(LLSD& skin)
+{
+ fromLLSD(skin);
+}
+
+void LLMeshSkinInfo::fromLLSD(LLSD& skin)
+{
+ if (skin.has("joint_names"))
+ {
+ for (U32 i = 0; i < skin["joint_names"].size(); ++i)
+ {
+ mJointNames.push_back(skin["joint_names"][i]);
+ }
+ }
+
+ if (skin.has("inverse_bind_matrix"))
+ {
+ for (U32 i = 0; i < skin["inverse_bind_matrix"].size(); ++i)
+ {
+ LLMatrix4 mat;
+ for (U32 j = 0; j < 4; j++)
+ {
+ for (U32 k = 0; k < 4; k++)
+ {
+ mat.mMatrix[j][k] = skin["inverse_bind_matrix"][i][j*4+k].asReal();
+ }
+ }
+
+ mInvBindMatrix.push_back(mat);
+ }
+ }
+
+ if (skin.has("bind_shape_matrix"))
+ {
+ for (U32 j = 0; j < 4; j++)
+ {
+ for (U32 k = 0; k < 4; k++)
+ {
+ mBindShapeMatrix.mMatrix[j][k] = skin["bind_shape_matrix"][j*4+k].asReal();
+ }
+ }
+ }
+
+ if (skin.has("alt_inverse_bind_matrix"))
+ {
+ for (U32 i = 0; i < skin["alt_inverse_bind_matrix"].size(); ++i)
+ {
+ LLMatrix4 mat;
+ for (U32 j = 0; j < 4; j++)
+ {
+ for (U32 k = 0; k < 4; k++)
+ {
+ mat.mMatrix[j][k] = skin["alt_inverse_bind_matrix"][i][j*4+k].asReal();
+ }
+ }
+
+ mAlternateBindMatrix.push_back(mat);
+ }
+ }
+
+ if (skin.has("pelvis_offset"))
+ {
+ mPelvisOffset = skin["pelvis_offset"].asReal();
+ }
+}
+
+LLSD LLMeshSkinInfo::asLLSD(bool include_joints) const
+{
+ LLSD ret;
+
+ for (U32 i = 0; i < mJointNames.size(); ++i)
+ {
+ ret["joint_names"][i] = mJointNames[i];
+
+ for (U32 j = 0; j < 4; j++)
+ {
+ for (U32 k = 0; k < 4; k++)
+ {
+ ret["inverse_bind_matrix"][i][j*4+k] = mInvBindMatrix[i].mMatrix[j][k];
+ }
+ }
+ }
+
+ for (U32 i = 0; i < 4; i++)
+ {
+ for (U32 j = 0; j < 4; j++)
+ {
+ ret["bind_shape_matrix"][i*4+j] = mBindShapeMatrix.mMatrix[i][j];
+ }
+ }
+
+ if ( include_joints && mAlternateBindMatrix.size() > 0 )
+ {
+ for (U32 i = 0; i < mJointNames.size(); ++i)
+ {
+ for (U32 j = 0; j < 4; j++)
+ {
+ for (U32 k = 0; k < 4; k++)
+ {
+ ret["alt_inverse_bind_matrix"][i][j*4+k] = mAlternateBindMatrix[i].mMatrix[j][k];
+ }
+ }
+ }
+
+ ret["pelvis_offset"] = mPelvisOffset;
+ }
+
+ return ret;
+}
+
+LLModel::Decomposition::Decomposition(LLSD& data)
+{
+ fromLLSD(data);
+}
+
+void LLModel::Decomposition::fromLLSD(LLSD& decomp)
+{
+ if (decomp.has("HullList"))
+ {
+ // 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();
+
+ U16* p = (U16*) &position[0];
+
+ mHull.resize(hulls.size());
+
+ LLVector3 min;
+ LLVector3 max;
+ LLVector3 range;
+
+ min.setValue(decomp["Min"]);
+ max.setValue(decomp["Max"]);
+ range = max-min;
+
+
+ for (U32 i = 0; i < hulls.size(); ++i)
+ {
+ U16 count = (hulls[i] == 0) ? 256 : hulls[i];
+
+ std::set<U64> valid;
+
+ //must have at least 4 points
+ //llassert(count > 3);
+
+ for (U32 j = 0; j < count; ++j)
+ {
+ U64 test = (U64) p[0] | ((U64) p[1] << 16) | ((U64) p[2] << 32);
+ //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],
+ (F32) p[2]/65535.f*range.mV[2]+min.mV[2]));
+ p += 3;
+
+
+ }
+
+ //each hull must contain at least 4 unique points
+ //llassert(valid.size() > 3);
+ }
+ }
+
+ if (decomp.has("Hull"))
+ {
+ const LLSD::Binary& position = decomp["Hull"].asBinary();
+
+ U16* p = (U16*) &position[0];
+
+ LLVector3 min;
+ LLVector3 max;
+ LLVector3 range;
+
+ 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;
+
+ U16 count = position.size()/6;
+
+ for (U32 j = 0; j < count; ++j)
+ {
+ mBaseHull.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],
+ (F32) p[2]/65535.f*range.mV[2]+min.mV[2]));
+ p += 3;
+ }
+ }
+ else
+ {
+ //empty base hull mesh to indicate decomposition has been loaded
+ //but contains no base hull
+ mBaseHullMesh.clear();;
+ }
+}
+
+LLSD LLModel::Decomposition::asLLSD() const
+{
+ LLSD ret;
+
+ if (mBaseHull.empty() && mHull.empty())
+ { //nothing to write
+ return ret;
+ }
+
+ //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
+
+
+ //get minimum and maximum
+ LLVector3 min;
+
+ if (mHull.empty())
+ {
+ min = mBaseHull[0];
+ }
+ else
+ {
+ min = mHull[0][0];
+ }
+
+ LLVector3 max = min;
+
+ LLSD::Binary hulls(mHull.size());
+
+ U32 total = 0;
+
+ for (U32 i = 0; i < mHull.size(); ++i)
+ {
+ U32 size = mHull[i].size();
+ total += size;
+ hulls[i] = (U8) (size);
+
+ for (U32 j = 0; j < mHull[i].size(); ++j)
+ {
+ update_min_max(min, max, mHull[i][j]);
+ }
+ }
+
+ for (U32 i = 0; i < mBaseHull.size(); ++i)
+ {
+ update_min_max(min, max, mBaseHull[i]);
+ }
+
+ ret["Min"] = min.getValue();
+ ret["Max"] = max.getValue();
+
+ if (!hulls.empty())
+ {
+ ret["HullList"] = hulls;
+ }
+
+ if (total > 0)
+ {
+ LLSD::Binary p(total*3*2);
+
+ LLVector3 range = max-min;
+
+ U32 vert_idx = 0;
+
+ for (U32 i = 0; i < mHull.size(); ++i)
+ {
+ std::set<U64> valid;
+
+ llassert(!mHull[i].empty());
+
+ for (U32 j = 0; j < mHull[i].size(); ++j)
+ {
+ U64 test = 0;
+ 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);
+
+ 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);
+
+ U8* buff = (U8*) &val;
+ //write to binary buffer
+ p[vert_idx++] = buff[0];
+ p[vert_idx++] = buff[1];
+
+ //makes sure we haven't run off the end of the array
+ llassert(vert_idx <= p.size());
+ }
+ }
+
+ //must have at least 4 unique points
+ llassert(valid.size() > 3);
+ }
+
+ ret["Position"] = p;
+ }
+
+ 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)
+ {
+ 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);
+
+ U8* buff = (U8*) &val;
+ //write to binary buffer
+ p[vert_idx++] = buff[0];
+ p[vert_idx++] = buff[1];
+
+ if (vert_idx > p.size())
+ {
+ llerrs << "WTF?" << llendl;
+ }
+ }
+ }
+
+ ret["Hull"] = p;
+ }
+
+ return ret;
+}
+
+void LLModel::Decomposition::merge(const LLModel::Decomposition* rhs)
+{
+ if (!rhs)
+ {
+ return;
+ }
+
+ if (mMeshID != rhs->mMeshID)
+ {
+ llerrs << "Attempted to merge with decomposition of some other mesh." << llendl;
+ }
+
+ if (mBaseHull.empty())
+ { //take base hull and decomposition from rhs
+ mHull = rhs->mHull;
+ mBaseHull = rhs->mBaseHull;
+ mMesh = rhs->mMesh;
+ mBaseHullMesh = rhs->mBaseHullMesh;
+ }
+
+ if (mPhysicsShapeMesh.empty())
+ { //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
new file mode 100644
index 0000000000..23f4b5cb42
--- /dev/null
+++ b/indra/llprimitive/llmodel.h
@@ -0,0 +1,255 @@
+/**
+ * @file llmodel.h
+ * @brief Model handling class definitions
+ *
+ * $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_LLMODEL_H
+#define LL_LLMODEL_H
+
+#include "llpointer.h"
+#include "llvolume.h"
+#include "v4math.h"
+#include "m4math.h"
+
+class daeElement;
+class domMesh;
+
+#define MAX_MODEL_FACES 8
+
+
+class LLMeshSkinInfo
+{
+public:
+ LLUUID mMeshID;
+ std::vector<std::string> mJointNames;
+ std::vector<LLMatrix4> mInvBindMatrix;
+ std::vector<LLMatrix4> mAlternateBindMatrix;
+ std::map<std::string, U32> mJointMap;
+
+ LLMeshSkinInfo() { }
+ LLMeshSkinInfo(LLSD& data);
+ void fromLLSD(LLSD& data);
+ LLSD asLLSD(bool include_joints) const;
+ LLMatrix4 mBindShapeMatrix;
+ float mPelvisOffset;
+};
+
+class LLModel : public LLVolume
+{
+public:
+
+ enum
+ {
+ LOD_IMPOSTOR = 0,
+ LOD_LOW,
+ LOD_MEDIUM,
+ LOD_HIGH,
+ LOD_PHYSICS,
+ NUM_LODS
+ };
+
+ enum EModelStatus
+ {
+ NO_ERRORS = 0,
+ VERTEX_NUMBER_OVERFLOW, //vertex number is >= 65535.
+ INVALID_STATUS
+ } ;
+
+ //convex_hull_decomposition is a vector of convex hulls
+ //each convex hull is a set of points
+ typedef std::vector<std::vector<LLVector3> > convex_hull_decomposition;
+ typedef std::vector<LLVector3> hull;
+
+ class PhysicsMesh
+ {
+ public:
+ std::vector<LLVector3> mPositions;
+ std::vector<LLVector3> mNormals;
+
+ void clear()
+ {
+ mPositions.clear();
+ mNormals.clear();
+ }
+
+ bool empty() const
+ {
+ return mPositions.empty();
+ }
+ };
+
+ class Decomposition
+ {
+ public:
+ Decomposition() { }
+ Decomposition(LLSD& data);
+ void fromLLSD(LLSD& data);
+ LLSD asLLSD() const;
+
+ void merge(const Decomposition* rhs);
+
+ LLUUID mMeshID;
+ LLModel::convex_hull_decomposition mHull;
+ LLModel::hull mBaseHull;
+
+ std::vector<LLModel::PhysicsMesh> mMesh;
+ LLModel::PhysicsMesh mBaseHullMesh;
+ LLModel::PhysicsMesh mPhysicsShapeMesh;
+ };
+
+ LLModel(LLVolumeParams& params, F32 detail);
+ ~LLModel();
+
+ bool loadModel(std::istream& is);
+ bool loadSkinInfo(LLSD& header, std::istream& is);
+ bool loadDecomposition(LLSD& header, std::istream& is);
+
+ static LLSD writeModel(
+ std::ostream& ostr,
+ LLModel* physics,
+ LLModel* high,
+ LLModel* medium,
+ LLModel* low,
+ LLModel* imposotr,
+ const LLModel::Decomposition& decomp,
+ BOOL upload_skin,
+ BOOL upload_joints,
+ BOOL nowrite = FALSE);
+
+ static LLSD writeModelToStream(
+ std::ostream& ostr,
+ LLSD& mdl,
+ BOOL nowrite = FALSE);
+
+ static LLModel* loadModelFromDomMesh(domMesh* mesh);
+ static std::string getElementLabel(daeElement* element);
+ std::string getName() const;
+ EModelStatus getStatus() const {return mStatus;}
+ static std::string getStatusString(U32 status) ;
+
+ void appendFaces(LLModel* model, LLMatrix4& transform, LLMatrix4& normal_transform);
+ void appendFace(const LLVolumeFace& src_face, std::string src_material, LLMatrix4& mat, LLMatrix4& norm_mat);
+
+ void setNumVolumeFaces(S32 count);
+ void setVolumeFaceData(
+ S32 f,
+ LLStrider<LLVector3> pos,
+ LLStrider<LLVector3> norm,
+ LLStrider<LLVector2> tc,
+ LLStrider<U16> ind,
+ U32 num_verts,
+ U32 num_indices);
+
+ void generateNormals(F32 angle_cutoff);
+
+ void addFace(const LLVolumeFace& face);
+
+ void normalizeVolumeFaces();
+ void optimizeVolumeFaces();
+ void offsetMesh( const LLVector3& pivotPoint );
+ void getNormalizedScaleTranslation(LLVector3& scale_out, LLVector3& translation_out);
+ std::vector<std::string> mMaterialList;
+
+ //data used for skin weights
+ class JointWeight
+ {
+ public:
+ S32 mJointIdx;
+ F32 mWeight;
+
+ JointWeight()
+ {
+ mJointIdx = 0;
+ mWeight = 0.f;
+ }
+
+ JointWeight(S32 idx, F32 weight)
+ : mJointIdx(idx), mWeight(weight)
+ {
+ }
+
+ bool operator<(const JointWeight& rhs) const
+ {
+ if (mWeight == rhs.mWeight)
+ {
+ return mJointIdx < rhs.mJointIdx;
+ }
+
+ return mWeight < rhs.mWeight;
+ }
+
+ };
+
+ struct CompareWeightGreater
+ {
+ bool operator()(const JointWeight& lhs, const JointWeight& rhs)
+ {
+ return rhs < lhs; // strongest = first
+ }
+ };
+
+ //copy of position array for this model -- mPosition[idx].mV[X,Y,Z]
+ std::vector<LLVector3> mPosition;
+
+ //map of positions to skin weights --- mSkinWeights[pos].mV[0..4] == <joint_index>.<weight>
+ //joint_index corresponds to mJointList
+ typedef std::vector<JointWeight> weight_list;
+ typedef std::map<LLVector3, weight_list > weight_map;
+ weight_map mSkinWeights;
+
+ //get list of weight influences closest to given position
+ weight_list& getJointInfluences(const LLVector3& pos);
+
+ LLMeshSkinInfo mSkinInfo;
+
+ std::string mRequestedLabel; // name requested in UI, if any.
+ std::string mLabel; // name computed from dae.
+
+ LLVector3 mNormalizedScale;
+ LLVector3 mNormalizedTranslation;
+
+ float mPelvisOffset;
+ // convex hull decomposition
+ S32 mDecompID;
+
+ void setConvexHullDecomposition(
+ const convex_hull_decomposition& decomp);
+ void updateHullCenters();
+
+ LLVector3 mCenterOfHullCenters;
+ std::vector<LLVector3> mHullCenter;
+ U32 mHullPoints;
+
+ //ID for storing this model in a .slm file
+ S32 mLocalID;
+
+ Decomposition mPhysics;
+
+ EModelStatus mStatus ;
+protected:
+ void addVolumeFacesFromDomMesh(domMesh* mesh);
+ virtual BOOL createVolumeFacesFromDomMesh(domMesh *mesh);
+};
+
+#endif //LL_LLMODEL_H
diff --git a/indra/llprimitive/llprimitive.cpp b/indra/llprimitive/llprimitive.cpp
index f9ef897aa3..30532247ac 100644
--- a/indra/llprimitive/llprimitive.cpp
+++ b/indra/llprimitive/llprimitive.cpp
@@ -738,7 +738,11 @@ BOOL LLPrimitive::setVolume(const LLVolumeParams &volume_params, const S32 detai
setNumTEs(mVolumep->getNumFaces());
return TRUE;
}
-
+
+#if 0
+ // #if 0'd out by davep
+ // this is a lot of cruft to set texture entry values that just stay the same for LOD switch
+ // or immediately get overridden by an object update message, also crashes occasionally
U32 old_face_mask = mVolumep->mFaceMask;
S32 face_bit = 0;
@@ -936,6 +940,13 @@ BOOL LLPrimitive::setVolume(const LLVolumeParams &volume_params, const S32 detai
setTE(te_num, *(old_tes.getTexture(face_mapping[face_bit])));
}
}
+#else
+ // build the new object
+ sVolumeManager->unrefVolume(mVolumep);
+ mVolumep = volumep;
+
+ setNumTEs(mVolumep->getNumFaces());
+#endif
return TRUE;
}
@@ -1078,7 +1089,7 @@ BOOL LLPrimitive::packTEMessage(LLMessageSystem *mesgsys) const
U8 packed_buffer[MAX_TE_BUFFER];
U8 *cur_ptr = packed_buffer;
- S32 last_face_index = getNumTEs() - 1;
+ S32 last_face_index = llmin((U32) getNumTEs(), MAX_TES) - 1;
if (last_face_index > -1)
{
@@ -1359,7 +1370,7 @@ S32 LLPrimitive::unpackTEMessage(LLDataPacker &dp)
return retval;
}
- face_count = getNumTEs();
+ face_count = llmin((U32) getNumTEs(), MAX_TES);
U32 i;
cur_ptr += unpackTEField(cur_ptr, packed_buffer+size, (U8 *)image_data, 16, face_count, MVT_LLUUID);
diff --git a/indra/llprimitive/llprimitive.h b/indra/llprimitive/llprimitive.h
index d981b248fa..76faa1b8c5 100644
--- a/indra/llprimitive/llprimitive.h
+++ b/indra/llprimitive/llprimitive.h
@@ -323,7 +323,7 @@ public:
const LLVolume *getVolumeConst() const { return mVolumep; } // HACK for Windoze confusion about ostream operator in LLVolume
LLVolume *getVolume() const { return mVolumep; }
virtual BOOL setVolume(const LLVolumeParams &volume_params, const S32 detail, bool unique_volume = false);
-
+
// Modify texture entry properties
inline BOOL validTE(const U8 te_num) const;
LLTextureEntry* getTE(const U8 te_num) const;
@@ -444,6 +444,7 @@ protected:
U8 mNumTEs; // # of faces on the primitve
U32 mMiscFlags; // home for misc bools
+public:
static LLVolumeMgr* sVolumeManager;
};
diff --git a/indra/llrender/llfontgl.cpp b/indra/llrender/llfontgl.cpp
index 13008292f6..180ae4dfa6 100644
--- a/indra/llrender/llfontgl.cpp
+++ b/indra/llrender/llfontgl.cpp
@@ -271,7 +271,6 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons
}
}
-
const LLFontGlyphInfo* next_glyph = NULL;
const S32 GLYPH_BATCH_SIZE = 30;
@@ -555,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 c86c89fa9b..a460912e70 100644
--- a/indra/llrender/llgl.cpp
+++ b/indra/llrender/llgl.cpp
@@ -105,7 +105,6 @@ LLMatrix4 gGLObliqueProjectionInverse;
#define LL_GL_NAME_POOLING 0
-LLGLNamePool::pool_list_t LLGLNamePool::sInstances;
std::list<LLGLUpdate*> LLGLUpdate::sGLQ;
#if (LL_WINDOWS || LL_LINUX || LL_SOLARIS) && !LL_MESA_HEADLESS
@@ -157,30 +156,27 @@ PFNGLGETQUERYOBJECTUIVARBPROC glGetQueryObjectuivARB = NULL;
PFNGLPOINTPARAMETERFARBPROC glPointParameterfARB = NULL;
PFNGLPOINTPARAMETERFVARBPROC glPointParameterfvARB = NULL;
-// GL_EXT_framebuffer_object
-PFNGLISRENDERBUFFEREXTPROC glIsRenderbufferEXT = NULL;
-PFNGLBINDRENDERBUFFEREXTPROC glBindRenderbufferEXT = NULL;
-PFNGLDELETERENDERBUFFERSEXTPROC glDeleteRenderbuffersEXT = NULL;
-PFNGLGENRENDERBUFFERSEXTPROC glGenRenderbuffersEXT = NULL;
-PFNGLRENDERBUFFERSTORAGEEXTPROC glRenderbufferStorageEXT = NULL;
-PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC glGetRenderbufferParameterivEXT = NULL;
-PFNGLISFRAMEBUFFEREXTPROC glIsFramebufferEXT = NULL;
-PFNGLBINDFRAMEBUFFEREXTPROC glBindFramebufferEXT = NULL;
-PFNGLDELETEFRAMEBUFFERSEXTPROC glDeleteFramebuffersEXT = NULL;
-PFNGLGENFRAMEBUFFERSEXTPROC glGenFramebuffersEXT = NULL;
-PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC glCheckFramebufferStatusEXT = NULL;
-PFNGLFRAMEBUFFERTEXTURE1DEXTPROC glFramebufferTexture1DEXT = NULL;
-PFNGLFRAMEBUFFERTEXTURE2DEXTPROC glFramebufferTexture2DEXT = NULL;
-PFNGLFRAMEBUFFERTEXTURE3DEXTPROC glFramebufferTexture3DEXT = NULL;
-PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC glFramebufferRenderbufferEXT = NULL;
-PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC glGetFramebufferAttachmentParameterivEXT = NULL;
-PFNGLGENERATEMIPMAPEXTPROC glGenerateMipmapEXT = NULL;
-
-// GL_EXT_framebuffer_multisample
-PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC glRenderbufferStorageMultisampleEXT = NULL;
-
-// GL_EXT_framebuffer_blit
-PFNGLBLITFRAMEBUFFEREXTPROC glBlitFramebufferEXT = NULL;
+// GL_ARB_framebuffer_object
+PFNGLISRENDERBUFFERPROC glIsRenderbuffer = NULL;
+PFNGLBINDRENDERBUFFERPROC glBindRenderbuffer = NULL;
+PFNGLDELETERENDERBUFFERSPROC glDeleteRenderbuffers = NULL;
+PFNGLGENRENDERBUFFERSPROC glGenRenderbuffers = NULL;
+PFNGLRENDERBUFFERSTORAGEPROC glRenderbufferStorage = NULL;
+PFNGLGETRENDERBUFFERPARAMETERIVPROC glGetRenderbufferParameteriv = NULL;
+PFNGLISFRAMEBUFFERPROC glIsFramebuffer = NULL;
+PFNGLBINDFRAMEBUFFERPROC glBindFramebuffer = NULL;
+PFNGLDELETEFRAMEBUFFERSPROC glDeleteFramebuffers = NULL;
+PFNGLGENFRAMEBUFFERSPROC glGenFramebuffers = NULL;
+PFNGLCHECKFRAMEBUFFERSTATUSPROC glCheckFramebufferStatus = NULL;
+PFNGLFRAMEBUFFERTEXTURE1DPROC glFramebufferTexture1D = NULL;
+PFNGLFRAMEBUFFERTEXTURE2DPROC glFramebufferTexture2D = NULL;
+PFNGLFRAMEBUFFERTEXTURE3DPROC glFramebufferTexture3D = NULL;
+PFNGLFRAMEBUFFERRENDERBUFFERPROC glFramebufferRenderbuffer = NULL;
+PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC glGetFramebufferAttachmentParameteriv = NULL;
+PFNGLGENERATEMIPMAPPROC glGenerateMipmap = NULL;
+PFNGLBLITFRAMEBUFFERPROC glBlitFramebuffer = NULL;
+PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC glRenderbufferStorageMultisample = NULL;
+PFNGLFRAMEBUFFERTEXTURELAYERPROC glFramebufferTextureLayer = NULL;
// GL_EXT_blend_func_separate
PFNGLBLENDFUNCSEPARATEEXTPROC glBlendFuncSeparateEXT = NULL;
@@ -319,11 +315,12 @@ LLGLManager::LLGLManager() :
mIsDisabled(FALSE),
mHasMultitexture(FALSE),
+ mHasATIMemInfo(FALSE),
+ mHasNVXMemInfo(FALSE),
mNumTextureUnits(1),
mHasMipMapGeneration(FALSE),
mHasCompressedTextures(FALSE),
mHasFramebufferObject(FALSE),
- mHasFramebufferMultisample(FALSE),
mHasBlendFuncSeparate(FALSE),
mHasVertexBufferObject(FALSE),
@@ -331,7 +328,9 @@ LLGLManager::LLGLManager() :
mHasShaderObjects(FALSE),
mHasVertexShader(FALSE),
mHasFragmentShader(FALSE),
+ mNumTextureImageUnits(0),
mHasOcclusionQuery(FALSE),
+ mHasOcclusionQuery2(FALSE),
mHasPointParameters(FALSE),
mHasDrawBuffers(FALSE),
mHasTextureRectangle(FALSE),
@@ -503,6 +502,20 @@ bool LLGLManager::initGL()
// This is called here because it depends on the setting of mIsGF2or4MX, and sets up mHasMultitexture.
initExtensions();
+ if (mHasATIMemInfo)
+ { //ask the gl how much vram is free at startup and attempt to use no more than half of that
+ S32 meminfo[4];
+ glGetIntegerv(GL_TEXTURE_FREE_MEMORY_ATI, meminfo);
+
+ mVRAM = meminfo[0]/1024;
+ }
+ else if (mHasNVXMemInfo)
+ {
+ S32 dedicated_memory;
+ glGetIntegerv(GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX, &dedicated_memory);
+ mVRAM = dedicated_memory/1024;
+ }
+
if (mHasMultitexture)
{
GLint num_tex_units;
@@ -522,6 +535,13 @@ bool LLGLManager::initGL()
return false;
}
+ if (mHasFragmentShader)
+ {
+ GLint num_tex_image_units;
+ glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS_ARB, &num_tex_image_units);
+ mNumTextureImageUnits = num_tex_image_units;
+ }
+
setToDebugGPU();
initGLStates();
@@ -669,11 +689,6 @@ void LLGLManager::initExtensions()
# else
mHasFramebufferObject = FALSE;
# endif // GL_EXT_framebuffer_object
-# ifdef GL_EXT_framebuffer_multisample
- mHasFramebufferMultisample = TRUE;
-# else
- mHasFramebufferMultisample = FALSE;
-# endif // GL_EXT_framebuffer_multisample
# ifdef GL_ARB_draw_buffers
mHasDrawBuffers = TRUE;
#else
@@ -701,6 +716,8 @@ void LLGLManager::initExtensions()
mHasTextureRectangle = FALSE;
#else // LL_MESA_HEADLESS
mHasMultitexture = glh_init_extensions("GL_ARB_multitexture");
+ mHasATIMemInfo = ExtensionExists("GL_ATI_meminfo", gGLHExts.mSysExts);
+ mHasNVXMemInfo = ExtensionExists("GL_NVX_gpu_memory_info", gGLHExts.mSysExts);
mHasMipMapGeneration = glh_init_extensions("GL_SGIS_generate_mipmap");
mHasSeparateSpecularColor = glh_init_extensions("GL_EXT_separate_specular_color");
mHasAnisotropic = glh_init_extensions("GL_EXT_texture_filter_anisotropic");
@@ -709,12 +726,19 @@ void LLGLManager::initExtensions()
mHasARBEnvCombine = ExtensionExists("GL_ARB_texture_env_combine", gGLHExts.mSysExts);
mHasCompressedTextures = glh_init_extensions("GL_ARB_texture_compression");
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);
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
- mHasFramebufferObject = ExtensionExists("GL_EXT_framebuffer_object", gGLHExts.mSysExts)
- && ExtensionExists("GL_EXT_packed_depth_stencil", gGLHExts.mSysExts);
- mHasFramebufferMultisample = mHasFramebufferObject && ExtensionExists("GL_EXT_framebuffer_multisample", gGLHExts.mSysExts);
+#ifdef GL_ARB_framebuffer_object
+ mHasFramebufferObject = ExtensionExists("GL_ARB_framebuffer_object", gGLHExts.mSysExts);
+#else
+ mHasFramebufferObject = ExtensionExists("GL_EXT_framebuffer_object", gGLHExts.mSysExts) &&
+ ExtensionExists("GL_EXT_framebuffer_blit", gGLHExts.mSysExts) &&
+ ExtensionExists("GL_EXT_framebuffer_multisample", gGLHExts.mSysExts) &&
+ ExtensionExists("GL_EXT_packed_depth_stencil", gGLHExts.mSysExts);
+#endif
+
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);
@@ -739,7 +763,6 @@ void LLGLManager::initExtensions()
mHasCompressedTextures = FALSE;
mHasVertexBufferObject = FALSE;
mHasFramebufferObject = FALSE;
- mHasFramebufferMultisample = FALSE;
mHasDrawBuffers = FALSE;
mHasBlendFuncSeparate = FALSE;
mHasMipMapGeneration = FALSE;
@@ -793,10 +816,9 @@ void LLGLManager::initExtensions()
if (strchr(blacklist,'p')) mHasPointParameters = FALSE;//S
if (strchr(blacklist,'q')) mHasFramebufferObject = FALSE;//S
if (strchr(blacklist,'r')) mHasDrawBuffers = FALSE;//S
- if (strchr(blacklist,'s')) mHasFramebufferMultisample = FALSE;
- if (strchr(blacklist,'t')) mHasTextureRectangle = FALSE;
- if (strchr(blacklist,'u')) mHasBlendFuncSeparate = FALSE;//S
- if (strchr(blacklist,'v')) mHasDepthClamp = FALSE;
+ if (strchr(blacklist,'s')) mHasTextureRectangle = FALSE;
+ if (strchr(blacklist,'t')) mHasBlendFuncSeparate = FALSE;//S
+ if (strchr(blacklist,'u')) mHasDepthClamp = FALSE;
}
#endif // LL_LINUX || LL_SOLARIS
@@ -829,6 +851,10 @@ void LLGLManager::initExtensions()
{
LL_INFOS("RenderInit") << "Couldn't initialize GL_ARB_occlusion_query" << LL_ENDL;
}
+ if (!mHasOcclusionQuery2)
+ {
+ LL_INFOS("RenderInit") << "Couldn't initialize GL_ARB_occlusion_query2" << LL_ENDL;
+ }
if (!mHasPointParameters)
{
LL_INFOS("RenderInit") << "Couldn't initialize GL_ARB_point_parameters" << LL_ENDL;
@@ -860,11 +886,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);
@@ -896,28 +924,26 @@ void LLGLManager::initExtensions()
if (mHasFramebufferObject)
{
llinfos << "initExtensions() FramebufferObject-related procs..." << llendl;
- glIsRenderbufferEXT = (PFNGLISRENDERBUFFEREXTPROC) GLH_EXT_GET_PROC_ADDRESS("glIsRenderbufferEXT");
- glBindRenderbufferEXT = (PFNGLBINDRENDERBUFFEREXTPROC) GLH_EXT_GET_PROC_ADDRESS("glBindRenderbufferEXT");
- glDeleteRenderbuffersEXT = (PFNGLDELETERENDERBUFFERSEXTPROC) GLH_EXT_GET_PROC_ADDRESS("glDeleteRenderbuffersEXT");
- glGenRenderbuffersEXT = (PFNGLGENRENDERBUFFERSEXTPROC) GLH_EXT_GET_PROC_ADDRESS("glGenRenderbuffersEXT");
- glRenderbufferStorageEXT = (PFNGLRENDERBUFFERSTORAGEEXTPROC) GLH_EXT_GET_PROC_ADDRESS("glRenderbufferStorageEXT");
- glGetRenderbufferParameterivEXT = (PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC) GLH_EXT_GET_PROC_ADDRESS("glGetRenderbufferParameterivEXT");
- glIsFramebufferEXT = (PFNGLISFRAMEBUFFEREXTPROC) GLH_EXT_GET_PROC_ADDRESS("glIsFramebufferEXT");
- glBindFramebufferEXT = (PFNGLBINDFRAMEBUFFEREXTPROC) GLH_EXT_GET_PROC_ADDRESS("glBindFramebufferEXT");
- glDeleteFramebuffersEXT = (PFNGLDELETEFRAMEBUFFERSEXTPROC) GLH_EXT_GET_PROC_ADDRESS("glDeleteFramebuffersEXT");
- glGenFramebuffersEXT = (PFNGLGENFRAMEBUFFERSEXTPROC) GLH_EXT_GET_PROC_ADDRESS("glGenFramebuffersEXT");
- glCheckFramebufferStatusEXT = (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) GLH_EXT_GET_PROC_ADDRESS("glCheckFramebufferStatusEXT");
- glFramebufferTexture1DEXT = (PFNGLFRAMEBUFFERTEXTURE1DEXTPROC) GLH_EXT_GET_PROC_ADDRESS("glFramebufferTexture1DEXT");
- glFramebufferTexture2DEXT = (PFNGLFRAMEBUFFERTEXTURE2DEXTPROC) GLH_EXT_GET_PROC_ADDRESS("glFramebufferTexture2DEXT");
- glFramebufferTexture3DEXT = (PFNGLFRAMEBUFFERTEXTURE3DEXTPROC) GLH_EXT_GET_PROC_ADDRESS("glFramebufferTexture3DEXT");
- glFramebufferRenderbufferEXT = (PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC) GLH_EXT_GET_PROC_ADDRESS("glFramebufferRenderbufferEXT");
- glGetFramebufferAttachmentParameterivEXT = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) GLH_EXT_GET_PROC_ADDRESS("glGetFramebufferAttachmentParameterivEXT");
- glGenerateMipmapEXT = (PFNGLGENERATEMIPMAPEXTPROC) GLH_EXT_GET_PROC_ADDRESS("glGenerateMipmapEXT");
- }
- if (mHasFramebufferMultisample)
- {
- glRenderbufferStorageMultisampleEXT = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) GLH_EXT_GET_PROC_ADDRESS("glRenderbufferStorageMultisampleEXT");
- glBlitFramebufferEXT = (PFNGLBLITFRAMEBUFFEREXTPROC) GLH_EXT_GET_PROC_ADDRESS("glBlitFramebufferEXT");
+ glIsRenderbuffer = (PFNGLISRENDERBUFFERPROC) GLH_EXT_GET_PROC_ADDRESS("glIsRenderbuffer");
+ glBindRenderbuffer = (PFNGLBINDRENDERBUFFERPROC) GLH_EXT_GET_PROC_ADDRESS("glBindRenderbuffer");
+ glDeleteRenderbuffers = (PFNGLDELETERENDERBUFFERSPROC) GLH_EXT_GET_PROC_ADDRESS("glDeleteRenderbuffers");
+ glGenRenderbuffers = (PFNGLGENRENDERBUFFERSPROC) GLH_EXT_GET_PROC_ADDRESS("glGenRenderbuffers");
+ glRenderbufferStorage = (PFNGLRENDERBUFFERSTORAGEPROC) GLH_EXT_GET_PROC_ADDRESS("glRenderbufferStorage");
+ glGetRenderbufferParameteriv = (PFNGLGETRENDERBUFFERPARAMETERIVPROC) GLH_EXT_GET_PROC_ADDRESS("glGetRenderbufferParameteriv");
+ glIsFramebuffer = (PFNGLISFRAMEBUFFERPROC) GLH_EXT_GET_PROC_ADDRESS("glIsFramebuffer");
+ glBindFramebuffer = (PFNGLBINDFRAMEBUFFERPROC) GLH_EXT_GET_PROC_ADDRESS("glBindFramebuffer");
+ glDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC) GLH_EXT_GET_PROC_ADDRESS("glDeleteFramebuffers");
+ glGenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC) GLH_EXT_GET_PROC_ADDRESS("glGenFramebuffers");
+ glCheckFramebufferStatus = (PFNGLCHECKFRAMEBUFFERSTATUSPROC) GLH_EXT_GET_PROC_ADDRESS("glCheckFramebufferStatus");
+ glFramebufferTexture1D = (PFNGLFRAMEBUFFERTEXTURE1DPROC) GLH_EXT_GET_PROC_ADDRESS("glFramebufferTexture1D");
+ glFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC) GLH_EXT_GET_PROC_ADDRESS("glFramebufferTexture2D");
+ glFramebufferTexture3D = (PFNGLFRAMEBUFFERTEXTURE3DPROC) GLH_EXT_GET_PROC_ADDRESS("glFramebufferTexture3D");
+ glFramebufferRenderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFERPROC) GLH_EXT_GET_PROC_ADDRESS("glFramebufferRenderbuffer");
+ glGetFramebufferAttachmentParameteriv = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) GLH_EXT_GET_PROC_ADDRESS("glGetFramebufferAttachmentParameteriv");
+ glGenerateMipmap = (PFNGLGENERATEMIPMAPPROC) GLH_EXT_GET_PROC_ADDRESS("glGenerateMipmap");
+ glBlitFramebuffer = (PFNGLBLITFRAMEBUFFERPROC) GLH_EXT_GET_PROC_ADDRESS("glBlitFramebuffer");
+ glRenderbufferStorageMultisample = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) GLH_EXT_GET_PROC_ADDRESS("glRenderbufferStorageMultisample");
+ glFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC) GLH_EXT_GET_PROC_ADDRESS("glFramebufferTextureLayer");
}
if (mHasDrawBuffers)
{
@@ -1875,12 +1901,17 @@ void parse_gl_version( S32* major, S32* minor, S32* release, std::string* vendor
}
}
-LLGLUserClipPlane::LLGLUserClipPlane(const LLPlane& p, const glh::matrix4f& modelview, const glh::matrix4f& projection)
+LLGLUserClipPlane::LLGLUserClipPlane(const LLPlane& p, const glh::matrix4f& modelview, const glh::matrix4f& projection, bool apply)
{
- mModelview = modelview;
- mProjection = projection;
+ mApply = apply;
- setPlane(p.mV[0], p.mV[1], p.mV[2], p.mV[3]);
+ if (mApply)
+ {
+ mModelview = modelview;
+ mProjection = projection;
+
+ setPlane(p[0], p[1], p[2], p[3]);
+ }
}
void LLGLUserClipPlane::setPlane(F32 a, F32 b, F32 c, F32 d)
@@ -1911,31 +1942,20 @@ void LLGLUserClipPlane::setPlane(F32 a, F32 b, F32 c, F32 d)
LLGLUserClipPlane::~LLGLUserClipPlane()
{
- glMatrixMode(GL_PROJECTION);
- glPopMatrix();
- glMatrixMode(GL_MODELVIEW);
+ if (mApply)
+ {
+ glMatrixMode(GL_PROJECTION);
+ glPopMatrix();
+ glMatrixMode(GL_MODELVIEW);
+ }
}
LLGLNamePool::LLGLNamePool()
{
}
-void LLGLNamePool::registerPool(LLGLNamePool* pool)
-{
- pool_list_t::iterator iter = std::find(sInstances.begin(), sInstances.end(), pool);
- if (iter == sInstances.end())
- {
- sInstances.push_back(pool);
- }
-}
-
LLGLNamePool::~LLGLNamePool()
{
- pool_list_t::iterator iter = std::find(sInstances.begin(), sInstances.end(), this);
- if (iter != sInstances.end())
- {
- sInstances.erase(iter);
- }
}
void LLGLNamePool::upkeep()
@@ -2004,20 +2024,22 @@ void LLGLNamePool::release(GLuint name)
void LLGLNamePool::upkeepPools()
{
LLMemType mt(LLMemType::MTYPE_UPKEEP_POOLS);
- for (pool_list_t::iterator iter = sInstances.begin(); iter != sInstances.end(); ++iter)
+ tracker_t::LLInstanceTrackerScopedGuard guard;
+ for (tracker_t::instance_iter iter = guard.beginInstances(); iter != guard.endInstances(); ++iter)
{
- LLGLNamePool* pool = *iter;
- pool->upkeep();
+ LLGLNamePool & pool = *iter;
+ pool.upkeep();
}
}
//static
void LLGLNamePool::cleanupPools()
{
- for (pool_list_t::iterator iter = sInstances.begin(); iter != sInstances.end(); ++iter)
+ tracker_t::LLInstanceTrackerScopedGuard guard;
+ for (tracker_t::instance_iter iter = guard.beginInstances(); iter != guard.endInstances(); ++iter)
{
- LLGLNamePool* pool = *iter;
- pool->cleanup();
+ LLGLNamePool & pool = *iter;
+ pool.cleanup();
}
}
@@ -2106,11 +2128,14 @@ void LLGLDepthTest::checkState()
}
}
-LLGLSquashToFarClip::LLGLSquashToFarClip(glh::matrix4f P)
+LLGLSquashToFarClip::LLGLSquashToFarClip(glh::matrix4f P, U32 layer)
{
+
+ F32 depth = 0.99999f - 0.0001f * layer;
+
for (U32 i = 0; i < 4; i++)
{
- P.element(2, i) = P.element(3, i) * 0.99999f;
+ P.element(2, i) = P.element(3, i) * depth;
}
glMatrixMode(GL_PROJECTION);
diff --git a/indra/llrender/llgl.h b/indra/llrender/llgl.h
index 684fd50883..1d7ab188fc 100644
--- a/indra/llrender/llgl.h
+++ b/indra/llrender/llgl.h
@@ -40,6 +40,7 @@
#include "v4math.h"
#include "llplane.h"
#include "llgltypes.h"
+#include "llinstancetracker.h"
#include "llglheaders.h"
#include "glh/glh_linear.h"
@@ -76,11 +77,12 @@ public:
// Extensions used by everyone
BOOL mHasMultitexture;
+ BOOL mHasATIMemInfo;
+ BOOL mHasNVXMemInfo;
S32 mNumTextureUnits;
BOOL mHasMipMapGeneration;
BOOL mHasCompressedTextures;
BOOL mHasFramebufferObject;
- BOOL mHasFramebufferMultisample;
BOOL mHasBlendFuncSeparate;
// ARB Extensions
@@ -89,7 +91,9 @@ public:
BOOL mHasShaderObjects;
BOOL mHasVertexShader;
BOOL mHasFragmentShader;
+ S32 mNumTextureImageUnits;
BOOL mHasOcclusionQuery;
+ BOOL mHasOcclusionQuery2;
BOOL mHasPointParameters;
BOOL mHasDrawBuffers;
BOOL mHasDepthClamp;
@@ -299,12 +303,14 @@ class LLGLUserClipPlane
{
public:
- LLGLUserClipPlane(const LLPlane& plane, const glh::matrix4f& modelview, const glh::matrix4f& projection);
+ LLGLUserClipPlane(const LLPlane& plane, const glh::matrix4f& modelview, const glh::matrix4f& projection, bool apply = true);
~LLGLUserClipPlane();
void setPlane(F32 a, F32 b, F32 c, F32 d);
private:
+ bool mApply;
+
glh::matrix4f mProjection;
glh::matrix4f mModelview;
};
@@ -320,7 +326,7 @@ private:
class LLGLSquashToFarClip
{
public:
- LLGLSquashToFarClip(glh::matrix4f projection);
+ LLGLSquashToFarClip(glh::matrix4f projection, U32 layer = 0);
~LLGLSquashToFarClip();
};
@@ -328,9 +334,11 @@ public:
Generic pooling scheme for things which use GL names (used for occlusion queries and vertex buffer objects).
Prevents thrashing of GL name caches by avoiding calls to glGenFoo and glDeleteFoo.
*/
-class LLGLNamePool
+class LLGLNamePool : public LLInstanceTracker<LLGLNamePool>
{
public:
+ typedef LLInstanceTracker<LLGLNamePool> tracker_t;
+
struct NameEntry
{
GLuint name;
@@ -357,13 +365,11 @@ public:
GLuint allocate();
void release(GLuint name);
- static void registerPool(LLGLNamePool* pool);
static void upkeepPools();
static void cleanupPools();
protected:
typedef std::vector<LLGLNamePool*> pool_list_t;
- static pool_list_t sInstances;
virtual GLuint allocateName() = 0;
virtual void releaseName(GLuint name) = 0;
@@ -418,4 +424,67 @@ extern BOOL gClothRipple;
extern BOOL gHeadlessClient;
extern BOOL gGLActive;
+// Deal with changing glext.h definitions for newer SDK versions, specifically
+// with MAC OSX 10.5 -> 10.6
+
+
+#ifndef GL_DEPTH_ATTACHMENT
+#define GL_DEPTH_ATTACHMENT GL_DEPTH_ATTACHMENT_EXT
+#endif
+
+#ifndef GL_STENCIL_ATTACHMENT
+#define GL_STENCIL_ATTACHMENT GL_STENCIL_ATTACHMENT_EXT
+#endif
+
+#ifndef GL_FRAMEBUFFER
+#define GL_FRAMEBUFFER GL_FRAMEBUFFER_EXT
+#define GL_DRAW_FRAMEBUFFER GL_DRAW_FRAMEBUFFER_EXT
+#define GL_READ_FRAMEBUFFER GL_READ_FRAMEBUFFER_EXT
+#define GL_FRAMEBUFFER_COMPLETE GL_FRAMEBUFFER_COMPLETE_EXT
+#define GL_FRAMEBUFFER_UNSUPPORTED GL_FRAMEBUFFER_UNSUPPORTED_EXT
+#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT
+#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT
+#define glGenFramebuffers glGenFramebuffersEXT
+#define glBindFramebuffer glBindFramebufferEXT
+#define glCheckFramebufferStatus glCheckFramebufferStatusEXT
+#define glBlitFramebuffer glBlitFramebufferEXT
+#define glDeleteFramebuffers glDeleteFramebuffersEXT
+#define glFramebufferRenderbuffer glFramebufferRenderbufferEXT
+#define glFramebufferTexture2D glFramebufferTexture2DEXT
+#endif
+
+#ifndef GL_RENDERBUFFER
+#define GL_RENDERBUFFER GL_RENDERBUFFER_EXT
+#define glGenRenderbuffers glGenRenderbuffersEXT
+#define glBindRenderbuffer glBindRenderbufferEXT
+#define glRenderbufferStorage glRenderbufferStorageEXT
+#define glRenderbufferStorageMultisample glRenderbufferStorageMultisampleEXT
+#define glDeleteRenderbuffers glDeleteRenderbuffersEXT
+#endif
+
+#ifndef GL_COLOR_ATTACHMENT
+#define GL_COLOR_ATTACHMENT GL_COLOR_ATTACHMENT_EXT
+#endif
+
+#ifndef GL_COLOR_ATTACHMENT0
+#define GL_COLOR_ATTACHMENT0 GL_COLOR_ATTACHMENT0_EXT
+#endif
+
+#ifndef GL_COLOR_ATTACHMENT1
+#define GL_COLOR_ATTACHMENT1 GL_COLOR_ATTACHMENT1_EXT
+#endif
+
+#ifndef GL_COLOR_ATTACHMENT2
+#define GL_COLOR_ATTACHMENT2 GL_COLOR_ATTACHMENT2_EXT
+#endif
+
+#ifndef GL_COLOR_ATTACHMENT3
+#define GL_COLOR_ATTACHMENT3 GL_COLOR_ATTACHMENT3_EXT
+#endif
+
+
+#ifndef GL_DEPTH24_STENCIL8
+#define GL_DEPTH24_STENCIL8 GL_DEPTH24_STENCIL8_EXT
+#endif
+
#endif // LL_LLGL_H
diff --git a/indra/llrender/llglheaders.h b/indra/llrender/llglheaders.h
index 576969b81a..d8140a124d 100644
--- a/indra/llrender/llglheaders.h
+++ b/indra/llrender/llglheaders.h
@@ -1,25 +1,25 @@
-/**
+/**
* @file llglheaders.h
* @brief LLGL definitions
*
* $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$
*/
@@ -449,30 +449,27 @@ extern PFNGLGETCOMPRESSEDTEXIMAGEARBPROC glGetCompressedTexImageARB;
//GL_EXT_blend_func_separate
extern PFNGLBLENDFUNCSEPARATEEXTPROC glBlendFuncSeparateEXT;
-//GL_EXT_framebuffer_object
-extern PFNGLISRENDERBUFFEREXTPROC glIsRenderbufferEXT;
-extern PFNGLBINDRENDERBUFFEREXTPROC glBindRenderbufferEXT;
-extern PFNGLDELETERENDERBUFFERSEXTPROC glDeleteRenderbuffersEXT;
-extern PFNGLGENRENDERBUFFERSEXTPROC glGenRenderbuffersEXT;
-extern PFNGLRENDERBUFFERSTORAGEEXTPROC glRenderbufferStorageEXT;
-extern PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC glGetRenderbufferParameterivEXT;
-extern PFNGLISFRAMEBUFFEREXTPROC glIsFramebufferEXT;
-extern PFNGLBINDFRAMEBUFFEREXTPROC glBindFramebufferEXT;
-extern PFNGLDELETEFRAMEBUFFERSEXTPROC glDeleteFramebuffersEXT;
-extern PFNGLGENFRAMEBUFFERSEXTPROC glGenFramebuffersEXT;
-extern PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC glCheckFramebufferStatusEXT;
-extern PFNGLFRAMEBUFFERTEXTURE1DEXTPROC glFramebufferTexture1DEXT;
-extern PFNGLFRAMEBUFFERTEXTURE2DEXTPROC glFramebufferTexture2DEXT;
-extern PFNGLFRAMEBUFFERTEXTURE3DEXTPROC glFramebufferTexture3DEXT;
-extern PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC glFramebufferRenderbufferEXT;
-extern PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC glGetFramebufferAttachmentParameterivEXT;
-extern PFNGLGENERATEMIPMAPEXTPROC glGenerateMipmapEXT;
-
-// GL_EXT_framebuffer_multisample
-extern PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC glRenderbufferStorageMultisampleEXT;
-
-// GL_EXT_framebuffer_blit
-extern PFNGLBLITFRAMEBUFFEREXTPROC glBlitFramebufferEXT;
+//GL_ARB_framebuffer_object
+extern PFNGLISRENDERBUFFERPROC glIsRenderbuffer;
+extern PFNGLBINDRENDERBUFFERPROC glBindRenderbuffer;
+extern PFNGLDELETERENDERBUFFERSPROC glDeleteRenderbuffers;
+extern PFNGLGENRENDERBUFFERSPROC glGenRenderbuffers;
+extern PFNGLRENDERBUFFERSTORAGEPROC glRenderbufferStorage;
+extern PFNGLGETRENDERBUFFERPARAMETERIVPROC glGetRenderbufferParameteriv;
+extern PFNGLISFRAMEBUFFERPROC glIsFramebuffer;
+extern PFNGLBINDFRAMEBUFFERPROC glBindFramebuffer;
+extern PFNGLDELETEFRAMEBUFFERSPROC glDeleteFramebuffers;
+extern PFNGLGENFRAMEBUFFERSPROC glGenFramebuffers;
+extern PFNGLCHECKFRAMEBUFFERSTATUSPROC glCheckFramebufferStatus;
+extern PFNGLFRAMEBUFFERTEXTURE1DPROC glFramebufferTexture1D;
+extern PFNGLFRAMEBUFFERTEXTURE2DPROC glFramebufferTexture2D;
+extern PFNGLFRAMEBUFFERTEXTURE3DPROC glFramebufferTexture3D;
+extern PFNGLFRAMEBUFFERRENDERBUFFERPROC glFramebufferRenderbuffer;
+extern PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC glGetFramebufferAttachmentParameteriv;
+extern PFNGLGENERATEMIPMAPPROC glGenerateMipmap;
+extern PFNGLBLITFRAMEBUFFERPROC glBlitFramebuffer;
+extern PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC glRenderbufferStorageMultisample;
+extern PFNGLFRAMEBUFFERTEXTURELAYERPROC glFramebufferTextureLayer;
//GL_ARB_draw_buffers
extern PFNGLDRAWBUFFERSARBPROC glDrawBuffersARB;
@@ -651,30 +648,27 @@ extern PFNGLGETATTRIBLOCATIONARBPROC glGetAttribLocationARB;
//GL_EXT_blend_func_separate
extern PFNGLBLENDFUNCSEPARATEEXTPROC glBlendFuncSeparateEXT;
-//GL_EXT_framebuffer_object
-extern PFNGLISRENDERBUFFEREXTPROC glIsRenderbufferEXT;
-extern PFNGLBINDRENDERBUFFEREXTPROC glBindRenderbufferEXT;
-extern PFNGLDELETERENDERBUFFERSEXTPROC glDeleteRenderbuffersEXT;
-extern PFNGLGENRENDERBUFFERSEXTPROC glGenRenderbuffersEXT;
-extern PFNGLRENDERBUFFERSTORAGEEXTPROC glRenderbufferStorageEXT;
-extern PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC glGetRenderbufferParameterivEXT;
-extern PFNGLISFRAMEBUFFEREXTPROC glIsFramebufferEXT;
-extern PFNGLBINDFRAMEBUFFEREXTPROC glBindFramebufferEXT;
-extern PFNGLDELETEFRAMEBUFFERSEXTPROC glDeleteFramebuffersEXT;
-extern PFNGLGENFRAMEBUFFERSEXTPROC glGenFramebuffersEXT;
-extern PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC glCheckFramebufferStatusEXT;
-extern PFNGLFRAMEBUFFERTEXTURE1DEXTPROC glFramebufferTexture1DEXT;
-extern PFNGLFRAMEBUFFERTEXTURE2DEXTPROC glFramebufferTexture2DEXT;
-extern PFNGLFRAMEBUFFERTEXTURE3DEXTPROC glFramebufferTexture3DEXT;
-extern PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC glFramebufferRenderbufferEXT;
-extern PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC glGetFramebufferAttachmentParameterivEXT;
-extern PFNGLGENERATEMIPMAPEXTPROC glGenerateMipmapEXT;
-
-// GL_EXT_framebuffer_multisample
-extern PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC glRenderbufferStorageMultisampleEXT;
-
-// GL_EXT_framebuffer_blit
-extern PFNGLBLITFRAMEBUFFEREXTPROC glBlitFramebufferEXT;
+//GL_ARB_framebuffer_object
+extern PFNGLISRENDERBUFFERPROC glIsRenderbuffer;
+extern PFNGLBINDRENDERBUFFERPROC glBindRenderbuffer;
+extern PFNGLDELETERENDERBUFFERSPROC glDeleteRenderbuffers;
+extern PFNGLGENRENDERBUFFERSPROC glGenRenderbuffers;
+extern PFNGLRENDERBUFFERSTORAGEPROC glRenderbufferStorage;
+extern PFNGLGETRENDERBUFFERPARAMETERIVPROC glGetRenderbufferParameteriv;
+extern PFNGLISFRAMEBUFFERPROC glIsFramebuffer;
+extern PFNGLBINDFRAMEBUFFERPROC glBindFramebuffer;
+extern PFNGLDELETEFRAMEBUFFERSPROC glDeleteFramebuffers;
+extern PFNGLGENFRAMEBUFFERSPROC glGenFramebuffers;
+extern PFNGLCHECKFRAMEBUFFERSTATUSPROC glCheckFramebufferStatus;
+extern PFNGLFRAMEBUFFERTEXTURE1DPROC glFramebufferTexture1D;
+extern PFNGLFRAMEBUFFERTEXTURE2DPROC glFramebufferTexture2D;
+extern PFNGLFRAMEBUFFERTEXTURE3DPROC glFramebufferTexture3D;
+extern PFNGLFRAMEBUFFERRENDERBUFFERPROC glFramebufferRenderbuffer;
+extern PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC glGetFramebufferAttachmentParameteriv;
+extern PFNGLGENERATEMIPMAPPROC glGenerateMipmap;
+extern PFNGLBLITFRAMEBUFFERPROC glBlitFramebuffer;
+extern PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC glRenderbufferStorageMultisample;
+extern PFNGLFRAMEBUFFERTEXTURELAYERPROC glFramebufferTextureLayer;
//GL_ARB_draw_buffers
extern PFNGLDRAWBUFFERSARBPROC glDrawBuffersARB;
@@ -697,7 +691,7 @@ extern PFNGLDRAWBUFFERSARBPROC glDrawBuffersARB;
#include <AvailabilityMacros.h>
//GL_EXT_blend_func_separate
-extern void glBlendFuncSeparateEXT(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER;
+extern void glBlendFuncSeparateEXT(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha) ;
// GL_EXT_framebuffer_object
extern GLboolean glIsRenderbufferEXT(GLuint renderbuffer) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER;
@@ -718,6 +712,9 @@ extern void glFramebufferRenderbufferEXT(GLenum target, GLenum attachment, GLenu
extern void glGetFramebufferAttachmentParameterivEXT(GLenum target, GLenum attachment, GLenum pname, GLint *params) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER;
extern void glGenerateMipmapEXT(GLenum target) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER;
+#ifndef GL_ARB_framebuffer_object
+#define glGenerateMipmap glGenerateMipmapEXT
+#endif
// GL_ARB_draw_buffers
extern void glDrawBuffersARB(GLsizei n, const GLenum* bufs) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER;
@@ -840,4 +837,22 @@ extern void glGetBufferPointervARB (GLenum, GLenum, GLvoid* *);
#define GL_DEPTH_CLAMP 0x864F
#endif
+//GL_NVX_gpu_memory_info constants
+#ifndef GL_NVX_gpu_memory_info
+#define GL_NVX_gpu_memory_info
+#define GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX 0x9047
+#define GL_GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX 0x9048
+#define GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX 0x9049
+#define GL_GPU_MEMORY_INFO_EVICTION_COUNT_NVX 0x904A
+#define GL_GPU_MEMORY_INFO_EVICTED_MEMORY_NVX 0x904B
+#endif
+
+//GL_ATI_meminfo constants
+#ifndef GL_ATI_meminfo
+#define GL_ATI_meminfo
+#define GL_VBO_FREE_MEMORY_ATI 0x87FB
+#define GL_TEXTURE_FREE_MEMORY_ATI 0x87FC
+#define GL_RENDERBUFFER_FREE_MEMORY_ATI 0x87FD
+#endif
+
#endif // LL_LLGLHEADERS_H
diff --git a/indra/llrender/llglslshader.cpp b/indra/llrender/llglslshader.cpp
index 16534fa9a5..257bcd9380 100644
--- a/indra/llrender/llglslshader.cpp
+++ b/indra/llrender/llglslshader.cpp
@@ -55,7 +55,7 @@ BOOL shouldChange(const LLVector4& v1, const LLVector4& v2)
LLShaderFeatures::LLShaderFeatures()
: calculatesLighting(false), isShiny(false), isFullbright(false), hasWaterFog(false),
-hasTransport(false), hasSkinning(false), hasAtmospherics(false), isSpecular(false),
+hasTransport(false), hasSkinning(false), hasObjectSkinning(false), hasAtmospherics(false), isSpecular(false),
hasGamma(false), hasLighting(false), calculatesAtmospherics(false)
{
}
@@ -118,7 +118,7 @@ BOOL LLGLSLShader::createShader(vector<string> * attributes,
{
GLhandleARB shaderhandle = LLShaderMgr::instance()->loadShaderFile((*fileIter).first, mShaderLevel, (*fileIter).second);
LL_DEBUGS("ShaderLoading") << "SHADER FILE: " << (*fileIter).first << " mShaderLevel=" << mShaderLevel << LL_ENDL;
- if (mShaderLevel > 0)
+ if (shaderhandle > 0)
{
attachObject(shaderhandle);
}
@@ -698,17 +698,46 @@ void LLGLSLShader::uniformMatrix4fv(U32 index, U32 count, GLboolean transpose, c
GLint LLGLSLShader::getUniformLocation(const string& uniform)
{
+ GLint ret = -1;
if (mProgramObject > 0)
{
std::map<string, GLint>::iterator iter = mUniformMap.find(uniform);
if (iter != mUniformMap.end())
{
- llassert(iter->second == glGetUniformLocationARB(mProgramObject, uniform.c_str()));
- return iter->second;
+ if (gDebugGL)
+ {
+ stop_glerror();
+ if (iter->second != glGetUniformLocationARB(mProgramObject, uniform.c_str()))
+ {
+ llerrs << "Uniform does not match." << llendl;
+ }
+ stop_glerror();
+ }
+ ret = iter->second;
}
}
- return -1;
+ /*if (gDebugGL)
+ {
+ if (ret == -1 && ret != glGetUniformLocationARB(mProgramObject, uniform.c_str()))
+ {
+ llerrs << "Uniform map invalid." << llendl;
+ }
+ }*/
+
+ return ret;
+}
+
+GLint LLGLSLShader::getAttribLocation(U32 attrib)
+{
+ if (attrib < mAttribute.size())
+ {
+ return mAttribute[attrib];
+ }
+ else
+ {
+ return -1;
+ }
}
void LLGLSLShader::uniform1i(const string& uniform, GLint v)
@@ -882,7 +911,9 @@ void LLGLSLShader::uniformMatrix4fv(const string& uniform, U32 count, GLboolean
if (location >= 0)
{
+ stop_glerror();
glUniformMatrix4fvARB(location, count, transpose, v);
+ stop_glerror();
}
}
diff --git a/indra/llrender/llglslshader.h b/indra/llrender/llglslshader.h
index c11bd50716..d46ddbbe18 100644
--- a/indra/llrender/llglslshader.h
+++ b/indra/llrender/llglslshader.h
@@ -42,6 +42,7 @@ public:
bool hasWaterFog; // implies no gamma
bool hasTransport; // implies no lighting (it's possible to have neither though)
bool hasSkinning;
+ bool hasObjectSkinning;
bool hasAtmospherics;
bool hasGamma;
@@ -103,7 +104,7 @@ public:
void vertexAttrib4fv(U32 index, GLfloat* v);
GLint getUniformLocation(const std::string& uniform);
-
+ GLint getAttribLocation(U32 attrib);
GLint mapUniformTextureChannel(GLint location, GLenum type);
diff --git a/indra/llrender/llglstates.h b/indra/llrender/llglstates.h
index d5a29dcd0c..e26aead676 100644
--- a/indra/llrender/llglstates.h
+++ b/indra/llrender/llglstates.h
@@ -238,9 +238,11 @@ public:
class LLGLSSpecular
{
public:
+ F32 mShininess;
LLGLSSpecular(const LLColor4& color, F32 shininess)
{
- if (shininess > 0.0f)
+ mShininess = shininess;
+ if (mShininess > 0.0f)
{
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, color.mV);
S32 shiny = (S32)(shininess*128.f);
@@ -250,32 +252,14 @@ public:
}
~LLGLSSpecular()
{
- glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, LLColor4(0.f,0.f,0.f,0.f).mV);
- glMateriali(GL_FRONT_AND_BACK, GL_SHININESS, 0);
+ if (mShininess > 0.f)
+ {
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, LLColor4(0.f,0.f,0.f,0.f).mV);
+ glMateriali(GL_FRONT_AND_BACK, GL_SHININESS, 0);
+ }
}
};
//----------------------------------------------------------------------------
-
-class LLGLSBlendFunc : public LLGLSPipeline {
-protected:
- GLint mSavedSrc, mSavedDst;
- LLGLEnable mBlend;
-
-public:
- LLGLSBlendFunc(GLenum srcFunc, GLenum dstFunc) :
- mBlend(GL_BLEND)
- {
- glGetIntegerv(GL_BLEND_SRC, &mSavedSrc);
- glGetIntegerv(GL_BLEND_DST, &mSavedDst);
- glBlendFunc(srcFunc, dstFunc);
- }
-
- ~LLGLSBlendFunc(void) {
- glBlendFunc(mSavedSrc, mSavedDst);
- }
-};
-
-
#endif
diff --git a/indra/llrender/llimagegl.cpp b/indra/llrender/llimagegl.cpp
index d4ffd6f88e..d408077c68 100644
--- a/indra/llrender/llimagegl.cpp
+++ b/indra/llrender/llimagegl.cpp
@@ -1710,6 +1710,7 @@ void LLImageGL::analyzeAlpha(const void* data_in, U32 w, U32 h)
sample[asum/(16*4)] += 4;
}
+
rowstart += 2 * w * mAlphaStride;
}
length *= 2; // we sampled everything twice, essentially
diff --git a/indra/llrender/llrender.cpp b/indra/llrender/llrender.cpp
index 8eb160f4e7..c37139ac4c 100644
--- a/indra/llrender/llrender.cpp
+++ b/indra/llrender/llrender.cpp
@@ -47,6 +47,7 @@ U32 LLRender::sUICalls = 0;
U32 LLRender::sUIVerts = 0;
static const U32 LL_NUM_TEXTURE_LAYERS = 16;
+static const U32 LL_NUM_LIGHT_UNITS = 8;
static GLenum sGLTextureType[] =
{
@@ -118,14 +119,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);
+
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);
}
@@ -166,7 +182,11 @@ void LLTexUnit::enable(eTextureType type)
mCurrTexType = type;
gGL.flush();
- glEnable(sGLTextureType[type]);
+
+ if (mIndex < gGLManager.mNumTextureUnits)
+ {
+ glEnable(sGLTextureType[type]);
+ }
}
}
@@ -179,7 +199,12 @@ void LLTexUnit::disable(void)
activate();
unbind(mCurrTexType);
gGL.flush();
- glDisable(sGLTextureType[mCurrTexType]);
+
+ if (mIndex < gGLManager.mNumTextureUnits)
+ {
+ glDisable(sGLTextureType[mCurrTexType]);
+ }
+
mCurrTexType = TT_NONE;
}
}
@@ -747,6 +772,130 @@ void LLTexUnit::debugTextureUnit(void)
}
}
+LLLightState::LLLightState(S32 index)
+: mIndex(index),
+ mEnabled(false),
+ mConstantAtten(1.f),
+ mLinearAtten(0.f),
+ mQuadraticAtten(0.f),
+ mSpotExponent(0.f),
+ mSpotCutoff(180.f)
+{
+ if (mIndex == 0)
+ {
+ mDiffuse.set(1,1,1,1);
+ mSpecular.set(1,1,1,1);
+ }
+
+ mAmbient.set(0,0,0,1);
+ mPosition.set(0,0,1,0);
+ mSpotDirection.set(0,0,-1);
+
+}
+
+void LLLightState::enable()
+{
+ if (!mEnabled)
+ {
+ glEnable(GL_LIGHT0+mIndex);
+ mEnabled = true;
+ }
+}
+
+void LLLightState::disable()
+{
+ if (mEnabled)
+ {
+ glDisable(GL_LIGHT0+mIndex);
+ mEnabled = false;
+ }
+}
+
+void LLLightState::setDiffuse(const LLColor4& diffuse)
+{
+ if (mDiffuse != diffuse)
+ {
+ mDiffuse = diffuse;
+ glLightfv(GL_LIGHT0+mIndex, GL_DIFFUSE, mDiffuse.mV);
+ }
+}
+
+void LLLightState::setAmbient(const LLColor4& ambient)
+{
+ if (mAmbient != ambient)
+ {
+ mAmbient = ambient;
+ glLightfv(GL_LIGHT0+mIndex, GL_AMBIENT, mAmbient.mV);
+ }
+}
+
+void LLLightState::setSpecular(const LLColor4& specular)
+{
+ if (mSpecular != specular)
+ {
+ mSpecular = specular;
+ glLightfv(GL_LIGHT0+mIndex, GL_SPECULAR, mSpecular.mV);
+ }
+}
+
+void LLLightState::setPosition(const LLVector4& position)
+{
+ //always set position because modelview matrix may have changed
+ mPosition = position;
+ glLightfv(GL_LIGHT0+mIndex, GL_POSITION, mPosition.mV);
+}
+
+void LLLightState::setConstantAttenuation(const F32& atten)
+{
+ if (mConstantAtten != atten)
+ {
+ mConstantAtten = atten;
+ glLightf(GL_LIGHT0+mIndex, GL_CONSTANT_ATTENUATION, atten);
+ }
+}
+
+void LLLightState::setLinearAttenuation(const F32& atten)
+{
+ if (mLinearAtten != atten)
+ {
+ mLinearAtten = atten;
+ glLightf(GL_LIGHT0+mIndex, GL_LINEAR_ATTENUATION, atten);
+ }
+}
+
+void LLLightState::setQuadraticAttenuation(const F32& atten)
+{
+ if (mQuadraticAtten != atten)
+ {
+ mQuadraticAtten = atten;
+ glLightf(GL_LIGHT0+mIndex, GL_QUADRATIC_ATTENUATION, atten);
+ }
+}
+
+void LLLightState::setSpotExponent(const F32& exponent)
+{
+ if (mSpotExponent != exponent)
+ {
+ mSpotExponent = exponent;
+ glLightf(GL_LIGHT0+mIndex, GL_SPOT_EXPONENT, exponent);
+ }
+}
+
+void LLLightState::setSpotCutoff(const F32& cutoff)
+{
+ if (mSpotCutoff != cutoff)
+ {
+ mSpotCutoff = cutoff;
+ glLightf(GL_LIGHT0+mIndex, GL_SPOT_CUTOFF, cutoff);
+ }
+}
+
+void LLLightState::setSpotDirection(const LLVector3& direction)
+{
+ //always set direction because modelview matrix may have changed
+ mSpotDirection = direction;
+ glLightfv(GL_LIGHT0+mIndex, GL_SPOT_DIRECTION, direction.mV);
+}
LLRender::LLRender()
: mDirty(false),
@@ -768,6 +917,11 @@ LLRender::LLRender()
}
mDummyTexUnit = new LLTexUnit(-1);
+ for (U32 i = 0; i < LL_NUM_LIGHT_UNITS; ++i)
+ {
+ mLightState.push_back(new LLLightState(i));
+ }
+
for (U32 i = 0; i < 4; i++)
{
mCurrColorMask[i] = true;
@@ -795,6 +949,12 @@ void LLRender::shutdown()
mTexUnits.clear();
delete mDummyTexUnit;
mDummyTexUnit = NULL;
+
+ for (U32 i = 0; i < mLightState.size(); ++i)
+ {
+ delete mLightState[i];
+ }
+ mLightState.clear();
}
void LLRender::refreshState(void)
@@ -898,7 +1058,7 @@ LLVector3 LLRender::getUITranslation()
{
if (mUIOffset.empty())
{
- return LLVector3::zero;
+ return LLVector3(0,0,0);
}
return mUIOffset.back();
}
@@ -907,7 +1067,7 @@ LLVector3 LLRender::getUIScale()
{
if (mUIScale.empty())
{
- return LLVector3(1.f, 1.f, 1.f);
+ return LLVector3(1,1,1);
}
return mUIScale.back();
}
@@ -932,15 +1092,21 @@ void LLRender::setColorMask(bool writeColorR, bool writeColorG, bool writeColorB
{
flush();
- mCurrColorMask[0] = writeColorR;
- mCurrColorMask[1] = writeColorG;
- mCurrColorMask[2] = writeColorB;
- mCurrColorMask[3] = writeAlpha;
+ if (mCurrColorMask[0] != writeColorR ||
+ mCurrColorMask[1] != writeColorG ||
+ mCurrColorMask[2] != writeColorB ||
+ mCurrColorMask[3] != writeAlpha)
+ {
+ mCurrColorMask[0] = writeColorR;
+ mCurrColorMask[1] = writeColorG;
+ mCurrColorMask[2] = writeColorB;
+ mCurrColorMask[3] = writeAlpha;
- glColorMask(writeColorR ? GL_TRUE : GL_FALSE,
- writeColorG ? GL_TRUE : GL_FALSE,
- writeColorB ? GL_TRUE : GL_FALSE,
- writeAlpha ? GL_TRUE : GL_FALSE);
+ glColorMask(writeColorR ? GL_TRUE : GL_FALSE,
+ writeColorG ? GL_TRUE : GL_FALSE,
+ writeColorB ? GL_TRUE : GL_FALSE,
+ writeAlpha ? GL_TRUE : GL_FALSE);
+ }
}
void LLRender::setSceneBlendType(eBlendType type)
@@ -978,15 +1144,19 @@ void LLRender::setAlphaRejectSettings(eCompareFunc func, F32 value)
{
flush();
- mCurrAlphaFunc = func;
- mCurrAlphaFuncVal = value;
- if (func == CF_DEFAULT)
- {
- glAlphaFunc(GL_GREATER, 0.01f);
- }
- else
+ if (mCurrAlphaFunc != func ||
+ mCurrAlphaFuncVal != value)
{
- glAlphaFunc(sGLCompareFunc[func], value);
+ mCurrAlphaFunc = func;
+ mCurrAlphaFuncVal = value;
+ if (func == CF_DEFAULT)
+ {
+ glAlphaFunc(GL_GREATER, 0.01f);
+ }
+ else
+ {
+ glAlphaFunc(sGLCompareFunc[func], value);
+ }
}
}
@@ -1045,6 +1215,16 @@ LLTexUnit* LLRender::getTexUnit(U32 index)
}
}
+LLLightState* LLRender::getLight(U32 index)
+{
+ if (index < mLightState.size())
+ {
+ return mLightState[index];
+ }
+
+ return NULL;
+}
+
bool LLRender::verifyTexUnitActive(U32 unitToVerify)
{
if (mCurrTextureUnitIndex == unitToVerify)
diff --git a/indra/llrender/llrender.h b/indra/llrender/llrender.h
index 2767aa64a8..7ba14f7b40 100644
--- a/indra/llrender/llrender.h
+++ b/indra/llrender/llrender.h
@@ -37,6 +37,7 @@
#include "v2math.h"
#include "v3math.h"
#include "v4coloru.h"
+#include "v4math.h"
#include "llstrider.h"
#include "llpointer.h"
#include "llglheaders.h"
@@ -212,6 +213,41 @@ protected:
void setTextureCombiner(eTextureBlendOp op, eTextureBlendSrc src1, eTextureBlendSrc src2, bool isAlpha = false);
};
+class LLLightState
+{
+public:
+ LLLightState(S32 index);
+
+ void enable();
+ void disable();
+ void setDiffuse(const LLColor4& diffuse);
+ void setAmbient(const LLColor4& ambient);
+ void setSpecular(const LLColor4& specular);
+ void setPosition(const LLVector4& position);
+ void setConstantAttenuation(const F32& atten);
+ void setLinearAttenuation(const F32& atten);
+ void setQuadraticAttenuation(const F32& atten);
+ void setSpotExponent(const F32& exponent);
+ void setSpotCutoff(const F32& cutoff);
+ void setSpotDirection(const LLVector3& direction);
+
+protected:
+ S32 mIndex;
+ bool mEnabled;
+ LLColor4 mDiffuse;
+ LLColor4 mAmbient;
+ LLColor4 mSpecular;
+ LLVector4 mPosition;
+ LLVector3 mSpotDirection;
+
+ F32 mConstantAtten;
+ F32 mLinearAtten;
+ F32 mQuadraticAtten;
+
+ F32 mSpotExponent;
+ F32 mSpotCutoff;
+};
+
class LLRender
{
friend class LLTexUnit;
@@ -327,6 +363,8 @@ public:
void blendFunc(eBlendFactor color_sfactor, eBlendFactor color_dfactor,
eBlendFactor alpha_sfactor, eBlendFactor alpha_dfactor);
+ LLLightState* getLight(U32 index);
+
LLTexUnit* getTexUnit(U32 index);
U32 getCurrentTexUnitIndex(void) const { return mCurrTextureUnitIndex; }
@@ -363,6 +401,7 @@ private:
LLStrider<LLColor4U> mColorsp;
std::vector<LLTexUnit*> mTexUnits;
LLTexUnit* mDummyTexUnit;
+ std::vector<LLLightState*> mLightState;
eBlendFactor mCurrBlendColorSFactor;
eBlendFactor mCurrBlendColorDFactor;
diff --git a/indra/llrender/llrendertarget.cpp b/indra/llrender/llrendertarget.cpp
index 7205210fcc..da1e94df64 100644
--- a/indra/llrender/llrendertarget.cpp
+++ b/indra/llrender/llrendertarget.cpp
@@ -38,19 +38,20 @@ void check_framebuffer_status()
{
if (gDebugGL)
{
- GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
+ GLenum status = glCheckFramebufferStatus(GL_DRAW_FRAMEBUFFER);
switch (status)
{
- case GL_FRAMEBUFFER_COMPLETE_EXT:
+ case GL_FRAMEBUFFER_COMPLETE:
break;
default:
+ llwarns << "check_framebuffer_status failed -- " << std::hex << status << llendl;
ll_fail("check_framebuffer_status failed");
break;
}
}
}
-BOOL LLRenderTarget::sUseFBO = FALSE;
+bool LLRenderTarget::sUseFBO = false;
LLRenderTarget::LLRenderTarget() :
mResX(0),
@@ -59,8 +60,8 @@ LLRenderTarget::LLRenderTarget() :
mFBO(0),
mDepth(0),
mStencil(0),
- mUseDepth(FALSE),
- mRenderDepth(FALSE),
+ mUseDepth(false),
+ mRenderDepth(false),
mUsage(LLTexUnit::TT_TEXTURE),
mSamples(0),
mSampleBuffer(NULL)
@@ -78,7 +79,7 @@ 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)
{
stop_glerror();
mResX = resx;
@@ -99,24 +100,24 @@ void LLRenderTarget::allocate(U32 resx, U32 resy, U32 color_fmt, BOOL depth, BOO
stop_glerror();
}
- glGenFramebuffersEXT(1, (GLuint *) &mFBO);
+ glGenFramebuffers(1, (GLuint *) &mFBO);
if (mDepth)
{
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, mFBO);
+ glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
if (mStencil)
{
- glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, mDepth);
+ glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, mDepth);
stop_glerror();
- glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, mDepth);
+ glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, mDepth);
stop_glerror();
}
else
{
- glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, LLTexUnit::getInternalType(mUsage), mDepth, 0);
+ glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, LLTexUnit::getInternalType(mUsage), mDepth, 0);
stop_glerror();
}
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
+ glBindFramebuffer(GL_FRAMEBUFFER, 0);
}
stop_glerror();
@@ -168,14 +169,14 @@ void LLRenderTarget::addColorAttachment(U32 color_fmt)
}
if (mFBO)
{
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, mFBO);
- glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT+offset,
+ glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
+ glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0+offset,
LLTexUnit::getInternalType(mUsage), tex, 0);
stop_glerror();
check_framebuffer_status();
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
+ glBindFramebuffer(GL_FRAMEBUFFER, 0);
}
mTex.push_back(tex);
@@ -187,10 +188,10 @@ void LLRenderTarget::allocateDepth()
if (mStencil)
{
//use render buffers where stencil buffers are in play
- glGenRenderbuffersEXT(1, (GLuint *) &mDepth);
- glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, mDepth);
- glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH24_STENCIL8_EXT, mResX, mResY);
- glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0);
+ glGenRenderbuffers(1, (GLuint *) &mDepth);
+ glBindRenderbuffer(GL_RENDERBUFFER, mDepth);
+ glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, mResX, mResY);
+ glBindRenderbuffer(GL_RENDERBUFFER, 0);
}
else
{
@@ -198,7 +199,7 @@ void LLRenderTarget::allocateDepth()
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_ARB, mResX, mResY, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, NULL);
+ LLImageGL::setManualImage(internal_type, 0, GL_DEPTH_COMPONENT32, mResX, mResY, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, NULL);
}
}
@@ -209,54 +210,48 @@ void LLRenderTarget::shareDepthBuffer(LLRenderTarget& target)
llerrs << "Cannot share depth buffer between non FBO render targets." << llendl;
}
+ if (target.mDepth)
+ {
+ llerrs << "Attempting to override existing depth buffer. Detach existing buffer first." << llendl;
+ }
+
+ if (target.mUseDepth)
+ {
+ llerrs << "Attempting to override existing shared depth buffer. Detach existing buffer first." << llendl;
+ }
+
if (mDepth)
{
stop_glerror();
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, target.mFBO);
+ glBindFramebuffer(GL_FRAMEBUFFER, target.mFBO);
stop_glerror();
if (mStencil)
{
- glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, mDepth);
+ glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, mDepth);
stop_glerror();
- glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, mDepth);
+ glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, mDepth);
stop_glerror();
+ target.mStencil = true;
}
else
{
- glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, LLTexUnit::getInternalType(mUsage), mDepth, 0);
+ glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, LLTexUnit::getInternalType(mUsage), mDepth, 0);
stop_glerror();
- if (mStencil)
- {
- glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, LLTexUnit::getInternalType(mUsage), mDepth, 0);
- stop_glerror();
- }
}
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
+ glBindFramebuffer(GL_FRAMEBUFFER, 0);
- target.mUseDepth = TRUE;
+ target.mUseDepth = true;
}
}
void LLRenderTarget::release()
{
- if (mFBO)
- {
- glDeleteFramebuffersEXT(1, (GLuint *) &mFBO);
- mFBO = 0;
- }
-
- if (mTex.size() > 0)
- {
- LLImageGL::deleteTextures(mTex.size(), &mTex[0]);
- mTex.clear();
- }
-
if (mDepth)
{
if (mStencil)
{
- glDeleteRenderbuffersEXT(1, (GLuint*) &mDepth);
+ glDeleteRenderbuffers(1, (GLuint*) &mDepth);
stop_glerror();
}
else
@@ -266,6 +261,33 @@ void LLRenderTarget::release()
}
mDepth = 0;
}
+ else if (mUseDepth && mFBO)
+ { //detach shared depth buffer
+ glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
+ if (mStencil)
+ { //attached as a renderbuffer
+ glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, 0);
+ glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, 0);
+ mStencil = false;
+ }
+ else
+ { //attached as a texture
+ glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, LLTexUnit::getInternalType(mUsage), 0, 0);
+ }
+ mUseDepth = false;
+ }
+
+ if (mFBO)
+ {
+ glDeleteFramebuffers(1, (GLuint *) &mFBO);
+ mFBO = 0;
+ }
+
+ if (mTex.size() > 0)
+ {
+ LLImageGL::deleteTextures(mTex.size(), &mTex[0]);
+ mTex.clear();
+ }
mSampleBuffer = NULL;
sBoundTarget = NULL;
@@ -283,14 +305,14 @@ void LLRenderTarget::bindTarget()
}
else
{
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, mFBO);
+ glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
stop_glerror();
if (gGLManager.mHasDrawBuffers)
{ //setup multiple render targets
- GLenum drawbuffers[] = {GL_COLOR_ATTACHMENT0_EXT,
- GL_COLOR_ATTACHMENT1_EXT,
- GL_COLOR_ATTACHMENT2_EXT,
- GL_COLOR_ATTACHMENT3_EXT};
+ GLenum drawbuffers[] = {GL_COLOR_ATTACHMENT0,
+ GL_COLOR_ATTACHMENT1,
+ GL_COLOR_ATTACHMENT2,
+ GL_COLOR_ATTACHMENT3};
glDrawBuffersARB(mTex.size(), drawbuffers);
}
@@ -315,7 +337,7 @@ void LLRenderTarget::unbindTarget()
{
if (gGLManager.mHasFramebufferObject)
{
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
+ glBindFramebuffer(GL_FRAMEBUFFER, 0);
}
sBoundTarget = NULL;
}
@@ -349,19 +371,19 @@ U32 LLRenderTarget::getTexture(U32 attachment) const
{
llerrs << "Invalid attachment index." << llendl;
}
+ if (mTex.empty())
+ {
+ return 0;
+ }
return mTex[attachment];
}
void LLRenderTarget::bindTexture(U32 index, S32 channel)
{
- if (index > mTex.size()-1)
- {
- llerrs << "Invalid attachment index." << llendl;
- }
- gGL.getTexUnit(channel)->bindManual(mUsage, mTex[index]);
+ gGL.getTexUnit(channel)->bindManual(mUsage, getTexture(index));
}
-void LLRenderTarget::flush(BOOL fetch_depth)
+void LLRenderTarget::flush(bool fetch_depth)
{
gGL.flush();
if (!mFBO)
@@ -377,7 +399,7 @@ void LLRenderTarget::flush(BOOL fetch_depth)
}
gGL.getTexUnit(0)->bind(this);
- glCopyTexImage2D(LLTexUnit::getInternalType(mUsage), 0, GL_DEPTH24_STENCIL8_EXT, 0, 0, mResX, mResY, 0);
+ glCopyTexImage2D(LLTexUnit::getInternalType(mUsage), 0, GL_DEPTH24_STENCIL8, 0, 0, mResX, mResY, 0);
}
gGL.getTexUnit(0)->disable();
@@ -386,55 +408,59 @@ void LLRenderTarget::flush(BOOL fetch_depth)
{
stop_glerror();
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
+ glBindFramebuffer(GL_FRAMEBUFFER, 0);
stop_glerror();
if (mSampleBuffer)
{
- LLGLEnable multisample(GL_MULTISAMPLE_ARB);
+ LLGLEnable multisample(GL_MULTISAMPLE);
stop_glerror();
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, mFBO);
+ glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
stop_glerror();
check_framebuffer_status();
- glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, mSampleBuffer->mFBO);
+ glBindFramebuffer(GL_READ_FRAMEBUFFER, mSampleBuffer->mFBO);
check_framebuffer_status();
stop_glerror();
- glBlitFramebufferEXT(0, 0, mResX, mResY, 0, 0, mResX, mResY, GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, GL_NEAREST);
+ 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)
{
- glFramebufferTexture2DEXT(GL_DRAW_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,
+ glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
LLTexUnit::getInternalType(mUsage), mTex[i], 0);
stop_glerror();
- glFramebufferRenderbufferEXT(GL_READ_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_RENDERBUFFER_EXT, mSampleBuffer->mTex[i]);
+ glFramebufferRenderbuffer(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, mSampleBuffer->mTex[i]);
stop_glerror();
- glBlitFramebufferEXT(0, 0, mResX, mResY, 0, 0, mResX, mResY, GL_COLOR_BUFFER_BIT, GL_NEAREST);
+ 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)
{
- glFramebufferTexture2DEXT(GL_DRAW_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT+i,
+ glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0+i,
LLTexUnit::getInternalType(mUsage), mTex[i], 0);
stop_glerror();
- glFramebufferRenderbufferEXT(GL_READ_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT+i, GL_RENDERBUFFER_EXT, mSampleBuffer->mTex[i]);
+ glFramebufferRenderbuffer(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0+i, GL_RENDERBUFFER, mSampleBuffer->mTex[i]);
stop_glerror();
}
}
}
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
+ glBindFramebuffer(GL_FRAMEBUFFER, 0);
}
}
void LLRenderTarget::copyContents(LLRenderTarget& source, S32 srcX0, S32 srcY0, S32 srcX1, S32 srcY1,
S32 dstX0, S32 dstY0, S32 dstX1, S32 dstY1, U32 mask, U32 filter)
{
+ GLboolean write_depth = mask & GL_DEPTH_BUFFER_BIT ? TRUE : FALSE;
+
+ LLGLDepthTest depth(write_depth, write_depth);
+
gGL.flush();
if (!source.mFBO || !mFBO)
{
@@ -451,25 +477,25 @@ void LLRenderTarget::copyContents(LLRenderTarget& source, S32 srcX0, S32 srcY0,
{
stop_glerror();
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, source.mFBO);
+ 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();
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
+ glBindFramebuffer(GL_FRAMEBUFFER, 0);
stop_glerror();
}
else
{
- glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, source.mFBO);
+ glBindFramebuffer(GL_READ_FRAMEBUFFER, source.mFBO);
stop_glerror();
- glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, mFBO);
+ glBindFramebuffer(GL_DRAW_FRAMEBUFFER, mFBO);
stop_glerror();
check_framebuffer_status();
stop_glerror();
- glBlitFramebufferEXT(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
+ glBlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
stop_glerror();
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
+ glBindFramebuffer(GL_FRAMEBUFFER, 0);
stop_glerror();
}
}
@@ -484,22 +510,26 @@ void LLRenderTarget::copyContentsToFramebuffer(LLRenderTarget& source, S32 srcX0
llerrs << "Cannot copy framebuffer contents for non FBO render targets." << llendl;
}
{
- glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, source.mFBO);
+ GLboolean write_depth = mask & GL_DEPTH_BUFFER_BIT ? TRUE : FALSE;
+
+ LLGLDepthTest depth(write_depth, write_depth);
+
+ glBindFramebuffer(GL_READ_FRAMEBUFFER, source.mFBO);
stop_glerror();
- glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, 0);
+ glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
stop_glerror();
check_framebuffer_status();
stop_glerror();
- glBlitFramebufferEXT(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
+ glBlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
stop_glerror();
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
+ glBindFramebuffer(GL_FRAMEBUFFER, 0);
stop_glerror();
}
}
-BOOL LLRenderTarget::isComplete() const
+bool LLRenderTarget::isComplete() const
{
- return (!mTex.empty() || mDepth) ? TRUE : FALSE;
+ return (!mTex.empty() || mDepth) ? true : false;
}
void LLRenderTarget::getViewport(S32* viewport)
@@ -520,26 +550,26 @@ LLMultisampleBuffer::LLMultisampleBuffer()
LLMultisampleBuffer::~LLMultisampleBuffer()
{
- releaseSampleBuffer();
+ release();
}
-void LLMultisampleBuffer::releaseSampleBuffer()
+void LLMultisampleBuffer::release()
{
if (mFBO)
{
- glDeleteFramebuffersEXT(1, (GLuint *) &mFBO);
+ glDeleteFramebuffers(1, (GLuint *) &mFBO);
mFBO = 0;
}
if (mTex.size() > 0)
{
- glDeleteRenderbuffersEXT(mTex.size(), (GLuint *) &mTex[0]);
+ glDeleteRenderbuffers(mTex.size(), (GLuint *) &mTex[0]);
mTex.clear();
}
if (mDepth)
{
- glDeleteRenderbuffersEXT(1, (GLuint *) &mDepth);
+ glDeleteRenderbuffers(1, (GLuint *) &mDepth);
mDepth = 0;
}
}
@@ -556,13 +586,13 @@ void LLMultisampleBuffer::bindTarget(LLRenderTarget* ref)
ref = this;
}
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, mFBO);
+ glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
if (gGLManager.mHasDrawBuffers)
{ //setup multiple render targets
- GLenum drawbuffers[] = {GL_COLOR_ATTACHMENT0_EXT,
- GL_COLOR_ATTACHMENT1_EXT,
- GL_COLOR_ATTACHMENT2_EXT,
- GL_COLOR_ATTACHMENT3_EXT};
+ GLenum drawbuffers[] = {GL_COLOR_ATTACHMENT0,
+ GL_COLOR_ATTACHMENT1,
+ GL_COLOR_ATTACHMENT2,
+ GL_COLOR_ATTACHMENT3};
glDrawBuffersARB(ref->mTex.size(), drawbuffers);
}
@@ -573,12 +603,12 @@ void LLMultisampleBuffer::bindTarget(LLRenderTarget* ref)
sBoundTarget = this;
}
-void LLMultisampleBuffer::allocate(U32 resx, U32 resy, U32 color_fmt, BOOL depth, BOOL stencil, LLTexUnit::eTextureType usage, BOOL use_fbo )
+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 )
+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;
@@ -588,12 +618,7 @@ void LLMultisampleBuffer::allocate(U32 resx, U32 resy, U32 color_fmt, BOOL depth
mUseDepth = depth;
mStencil = stencil;
- releaseSampleBuffer();
-
- if (!gGLManager.mHasFramebufferMultisample)
- {
- llerrs << "Attempting to allocate unsupported render target type!" << llendl;
- }
+ release();
mSamples = samples;
@@ -614,23 +639,21 @@ void LLMultisampleBuffer::allocate(U32 resx, U32 resy, U32 color_fmt, BOOL depth
stop_glerror();
}
- glGenFramebuffersEXT(1, (GLuint *) &mFBO);
+ glGenFramebuffers(1, (GLuint *) &mFBO);
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, mFBO);
+ glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
if (mDepth)
{
- glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, mDepth);
+ glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, mDepth);
if (mStencil)
{
- glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, mDepth);
+ glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, mDepth);
}
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
}
-
+
stop_glerror();
-
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
+ glBindFramebuffer(GL_FRAMEBUFFER, 0);
stop_glerror();
}
@@ -652,30 +675,28 @@ void LLMultisampleBuffer::addColorAttachment(U32 color_fmt)
}
U32 tex;
- glGenRenderbuffersEXT(1, &tex);
+ glGenRenderbuffers(1, &tex);
- glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, tex);
- glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, mSamples, color_fmt, mResX, mResY);
+ glBindRenderbuffer(GL_RENDERBUFFER, tex);
+ glRenderbufferStorageMultisample(GL_RENDERBUFFER, mSamples, color_fmt, mResX, mResY);
stop_glerror();
if (mFBO)
{
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, mFBO);
- glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT+offset, GL_RENDERBUFFER_EXT, tex);
+ glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
+ glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0+offset, GL_RENDERBUFFER, tex);
stop_glerror();
- GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
+ GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
switch (status)
{
- case GL_FRAMEBUFFER_COMPLETE_EXT:
- break;
- case GL_FRAMEBUFFER_UNSUPPORTED_EXT:
- llerrs << "WTF?" << llendl;
+ case GL_FRAMEBUFFER_COMPLETE:
break;
default:
- llerrs << "WTF?" << llendl;
+ llerrs << "WTF? " << std::hex << status << llendl;
+ break;
}
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
+ glBindFramebuffer(GL_FRAMEBUFFER, 0);
}
mTex.push_back(tex);
@@ -683,15 +704,15 @@ void LLMultisampleBuffer::addColorAttachment(U32 color_fmt)
void LLMultisampleBuffer::allocateDepth()
{
- glGenRenderbuffersEXT(1, (GLuint* ) &mDepth);
- glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, mDepth);
+ glGenRenderbuffers(1, (GLuint* ) &mDepth);
+ glBindRenderbuffer(GL_RENDERBUFFER, mDepth);
if (mStencil)
{
- glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, mSamples, GL_DEPTH24_STENCIL8_EXT, mResX, mResY);
+ glRenderbufferStorageMultisample(GL_RENDERBUFFER, mSamples, GL_DEPTH24_STENCIL8, mResX, mResY);
}
else
{
- glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, mSamples, GL_DEPTH_COMPONENT16_ARB, mResX, mResY);
+ glRenderbufferStorageMultisample(GL_RENDERBUFFER, mSamples, GL_DEPTH_COMPONENT16, mResX, mResY);
}
}
diff --git a/indra/llrender/llrendertarget.h b/indra/llrender/llrendertarget.h
index ae8613d9be..12dd1c8b90 100644
--- a/indra/llrender/llrendertarget.h
+++ b/indra/llrender/llrendertarget.h
@@ -63,7 +63,7 @@ class LLRenderTarget
{
public:
//whether or not to use FBO implementation
- static BOOL sUseFBO;
+ static bool sUseFBO;
LLRenderTarget();
virtual ~LLRenderTarget();
@@ -71,7 +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);
+ 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);
@@ -88,7 +88,7 @@ public:
//free any allocated resources
//safe to call redundantly
- void release();
+ virtual void release();
//bind target for rendering
//applies appropriate viewport
@@ -115,7 +115,7 @@ public:
U32 getTexture(U32 attachment = 0) const;
U32 getDepth(void) const { return mDepth; }
- BOOL hasStencil() const { return mStencil; }
+ bool hasStencil() const { return mStencil; }
void bindTexture(U32 index, S32 channel);
@@ -125,7 +125,7 @@ public:
// call bindTarget once, do all your rendering, call flush once
// if fetch_depth is TRUE, every effort will be made to copy the depth buffer into
// the current depth texture. A depth texture will be allocated if needed.
- void flush(BOOL fetch_depth = FALSE);
+ void flush(bool fetch_depth = FALSE);
void copyContents(LLRenderTarget& source, S32 srcX0, S32 srcY0, S32 srcX1, S32 srcY1,
S32 dstX0, S32 dstY0, S32 dstX1, S32 dstY1, U32 mask, U32 filter);
@@ -136,7 +136,7 @@ public:
//Returns TRUE if target is ready to be rendered into.
//That is, if the target has been allocated with at least
//one renderable attachment (i.e. color buffer, depth buffer).
- BOOL isComplete() const;
+ bool isComplete() const;
static LLRenderTarget* getCurrentBoundTarget() { return sBoundTarget; }
@@ -147,9 +147,9 @@ protected:
std::vector<U32> mTex;
U32 mFBO;
U32 mDepth;
- BOOL mStencil;
- BOOL mUseDepth;
- BOOL mRenderDepth;
+ bool mStencil;
+ bool mUseDepth;
+ bool mRenderDepth;
LLTexUnit::eTextureType mUsage;
U32 mSamples;
LLMultisampleBuffer* mSampleBuffer;
@@ -164,12 +164,12 @@ public:
LLMultisampleBuffer();
virtual ~LLMultisampleBuffer();
- void releaseSampleBuffer();
+ 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 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();
};
diff --git a/indra/llrender/llshadermgr.cpp b/indra/llrender/llshadermgr.cpp
index c859d41e17..98a0a93084 100644
--- a/indra/llrender/llshadermgr.cpp
+++ b/indra/llrender/llshadermgr.cpp
@@ -146,6 +146,14 @@ BOOL LLShaderMgr::attachShaderFeatures(LLGLSLShader * shader)
return FALSE;
}
}
+
+ if (features->hasObjectSkinning)
+ {
+ if (!shader->attachObject("avatar/objectSkinV.glsl"))
+ {
+ return FALSE;
+ }
+ }
///////////////////////////////////////
// Attach Fragment Shader Features Next
@@ -220,7 +228,14 @@ BOOL LLShaderMgr::attachShaderFeatures(LLGLSLShader * shader)
else if (features->isFullbright)
{
- if (features->hasWaterFog)
+ if (features->isShiny && features->hasWaterFog)
+ {
+ if (!shader->attachObject("lighting/lightFullbrightShinyWaterF.glsl"))
+ {
+ return FALSE;
+ }
+ }
+ else if (features->hasWaterFog)
{
if (!shader->attachObject("lighting/lightFullbrightWaterF.glsl"))
{
@@ -300,18 +315,21 @@ void LLShaderMgr::dumpObjectLog(GLhandleARB ret, BOOL warns)
}
else
{
- LL_DEBUGS("ShaderLoading") << log << LL_ENDL;
+ LL_INFOS("ShaderLoading") << log << LL_ENDL;
}
}
}
GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shader_level, GLenum type)
{
- GLenum error;
- error = glGetError();
- if (error != GL_NO_ERROR)
+ GLenum error = GL_NO_ERROR;
+ if (gDebugGL)
{
- LL_WARNS("ShaderLoading") << "GL ERROR entering loadShaderFile(): " << error << LL_ENDL;
+ error = glGetError();
+ if (error != GL_NO_ERROR)
+ {
+ LL_WARNS("ShaderLoading") << "GL ERROR entering loadShaderFile(): " << error << LL_ENDL;
+ }
}
LL_DEBUGS("ShaderLoading") << "Loading shader file: " << filename << " class " << shader_level << LL_ENDL;
@@ -366,31 +384,39 @@ GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shade
//create shader object
GLhandleARB ret = glCreateShaderObjectARB(type);
- error = glGetError();
- if (error != GL_NO_ERROR)
+ if (gDebugGL)
{
- LL_WARNS("ShaderLoading") << "GL ERROR in glCreateShaderObjectARB: " << error << LL_ENDL;
+ error = glGetError();
+ if (error != GL_NO_ERROR)
+ {
+ LL_WARNS("ShaderLoading") << "GL ERROR in glCreateShaderObjectARB: " << error << LL_ENDL;
+ }
}
- else
+
+ //load source
+ glShaderSourceARB(ret, count, (const GLcharARB**) text, NULL);
+
+ if (gDebugGL)
{
- //load source
- glShaderSourceARB(ret, count, (const GLcharARB**) text, NULL);
error = glGetError();
if (error != GL_NO_ERROR)
{
LL_WARNS("ShaderLoading") << "GL ERROR in glShaderSourceARB: " << error << LL_ENDL;
}
- else
+ }
+
+ //compile source
+ glCompileShaderARB(ret);
+
+ if (gDebugGL)
+ {
+ error = glGetError();
+ if (error != GL_NO_ERROR)
{
- //compile source
- glCompileShaderARB(ret);
- error = glGetError();
- if (error != GL_NO_ERROR)
- {
- LL_WARNS("ShaderLoading") << "GL ERROR in glCompileShaderARB: " << error << LL_ENDL;
- }
+ LL_WARNS("ShaderLoading") << "GL ERROR in glCompileShaderARB: " << error << LL_ENDL;
}
}
+
//free memory
for (GLuint i = 0; i < count; i++)
{
@@ -401,13 +427,16 @@ GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shade
//check for errors
GLint success = GL_TRUE;
glGetObjectParameterivARB(ret, GL_OBJECT_COMPILE_STATUS_ARB, &success);
- error = glGetError();
- if (error != GL_NO_ERROR || success == GL_FALSE)
+ if (gDebugGL || success == GL_FALSE)
{
- //an error occured, print log
- LL_WARNS("ShaderLoading") << "GLSL Compilation Error: (" << error << ") in " << filename << LL_ENDL;
- dumpObjectLog(ret);
- ret = 0;
+ error = glGetError();
+ if (error != GL_NO_ERROR || success == GL_FALSE)
+ {
+ //an error occured, print log
+ LL_WARNS("ShaderLoading") << "GLSL Compilation Error: (" << error << ") in " << filename << LL_ENDL;
+ dumpObjectLog(ret);
+ ret = 0;
+ }
}
}
else
diff --git a/indra/llrender/llvertexbuffer.cpp b/indra/llrender/llvertexbuffer.cpp
index 1beb74eca6..8c9171ccf4 100644
--- a/indra/llrender/llvertexbuffer.cpp
+++ b/indra/llrender/llvertexbuffer.cpp
@@ -25,6 +25,7 @@
*/
#include "linden_common.h"
+#include "llmemory.h"
#include <boost/static_assert.hpp>
#include "llsys.h"
@@ -33,6 +34,7 @@
#include "llglheaders.h"
#include "llmemtype.h"
#include "llrender.h"
+#include "llvector4a.h"
//============================================================================
@@ -57,20 +59,24 @@ BOOL LLVertexBuffer::sIBOActive = FALSE;
U32 LLVertexBuffer::sAllocatedBytes = 0;
BOOL LLVertexBuffer::sMapped = FALSE;
BOOL LLVertexBuffer::sUseStreamDraw = TRUE;
+BOOL LLVertexBuffer::sPreferStreamDraw = FALSE;
+S32 LLVertexBuffer::sWeight4Loc = -1;
std::vector<U32> LLVertexBuffer::sDeleteList;
-S32 LLVertexBuffer::sTypeOffsets[LLVertexBuffer::TYPE_MAX] =
+
+S32 LLVertexBuffer::sTypeSize[LLVertexBuffer::TYPE_MAX] =
{
- sizeof(LLVector3), // TYPE_VERTEX,
- sizeof(LLVector3), // TYPE_NORMAL,
+ sizeof(LLVector4), // TYPE_VERTEX,
+ sizeof(LLVector4), // TYPE_NORMAL,
sizeof(LLVector2), // TYPE_TEXCOORD0,
sizeof(LLVector2), // TYPE_TEXCOORD1,
sizeof(LLVector2), // TYPE_TEXCOORD2,
sizeof(LLVector2), // TYPE_TEXCOORD3,
sizeof(LLColor4U), // TYPE_COLOR,
- sizeof(LLVector3), // TYPE_BINORMAL,
+ sizeof(LLVector4), // TYPE_BINORMAL,
sizeof(F32), // TYPE_WEIGHT,
+ sizeof(LLVector4), // TYPE_WEIGHT4,
sizeof(LLVector4), // TYPE_CLOTHWEIGHT,
};
@@ -139,11 +145,11 @@ void LLVertexBuffer::setupClientArrays(U32 data_mask)
}
else
{ //was disabled
- if (data_mask & mask[i])
+ if (data_mask & mask[i] && i > 0)
{ //needs to be enabled
glEnableClientState(array[i]);
}
- else if (gDebugGL && glIsEnabled(array[i]))
+ else if (gDebugGL && i > 0 && glIsEnabled(array[i]))
{ //needs to be disabled, make sure it was (DEBUG TEMPORARY)
if (gDebugSession)
{
@@ -205,18 +211,53 @@ void LLVertexBuffer::setupClientArrays(U32 data_mask)
glClientActiveTextureARB(GL_TEXTURE0_ARB);
}
+ if (sLastMask & MAP_WEIGHT4)
+ {
+ if (sWeight4Loc < 0)
+ {
+ llerrs << "Weighting disabled but vertex buffer still bound!" << llendl;
+ }
+
+ if (!(data_mask & MAP_WEIGHT4))
+ { //disable 4-component skin weight
+ glDisableVertexAttribArrayARB(sWeight4Loc);
+ }
+ }
+ else if (data_mask & MAP_WEIGHT4)
+ {
+ if (sWeight4Loc >= 0)
+ { //enable 4-component skin weight
+ glEnableVertexAttribArrayARB(sWeight4Loc);
+ }
+ }
+
+
sLastMask = data_mask;
}
}
-void LLVertexBuffer::drawRange(U32 mode, U32 start, U32 end, U32 count, U32 indices_offset) const
+//static
+void LLVertexBuffer::drawArrays(U32 mode, const std::vector<LLVector3>& pos, const std::vector<LLVector3>& norm)
{
- llassert(mRequestedNumVerts >= 0);
+ U32 count = pos.size();
+ llassert(norm.size() >= pos.size());
+
+ unbind();
+
+ setupClientArrays(MAP_VERTEX | MAP_NORMAL);
+
+ glVertexPointer(3, GL_FLOAT, 0, pos[0].mV);
+ glNormalPointer(GL_FLOAT, 0, norm[0].mV);
+
+ glDrawArrays(sGLMode[mode], 0, count);
+}
+void LLVertexBuffer::validateRange(U32 start, U32 end, U32 count, U32 indices_offset) const
+{
if (start >= (U32) mRequestedNumVerts ||
end >= (U32) mRequestedNumVerts)
{
- llerrs << "Bad vertex buffer draw range: [" << start << ", " << end << "]" << llendl;
+ llerrs << "Bad vertex buffer draw range: [" << start << ", " << end << "] vs " << mRequestedNumVerts << llendl;
}
llassert(mRequestedNumIndices >= 0);
@@ -227,6 +268,25 @@ void LLVertexBuffer::drawRange(U32 mode, U32 start, U32 end, U32 count, U32 indi
llerrs << "Bad index buffer draw range: [" << indices_offset << ", " << indices_offset+count << "]" << llendl;
}
+ if (gDebugGL && !useVBOs())
+ {
+ U16* idx = ((U16*) getIndicesPointer())+indices_offset;
+ for (U32 i = 0; i < count; ++i)
+ {
+ if (idx[i] < start || idx[i] > end)
+ {
+ llerrs << "Index out of range: " << idx[i] << " not in [" << start << ", " << end << "]" << llendl;
+ }
+ }
+ }
+}
+
+void LLVertexBuffer::drawRange(U32 mode, U32 start, U32 end, U32 count, U32 indices_offset) const
+{
+ validateRange(start, end, count, indices_offset);
+
+ llassert(mRequestedNumVerts >= 0);
+
if (mGLIndices != sGLRenderIndices)
{
llerrs << "Wrong index buffer bound." << llendl;
@@ -243,16 +303,17 @@ void LLVertexBuffer::drawRange(U32 mode, U32 start, U32 end, U32 count, U32 indi
return;
}
+ U16* idx = ((U16*) getIndicesPointer())+indices_offset;
+
stop_glerror();
glDrawRangeElements(sGLMode[mode], start, end, count, GL_UNSIGNED_SHORT,
- ((U16*) getIndicesPointer()) + indices_offset);
+ idx);
stop_glerror();
}
void LLVertexBuffer::draw(U32 mode, U32 count, U32 indices_offset) const
{
llassert(mRequestedNumIndices >= 0);
-
if (indices_offset >= (U32) mRequestedNumIndices ||
indices_offset + count > (U32) mRequestedNumIndices)
{
@@ -284,7 +345,6 @@ void LLVertexBuffer::draw(U32 mode, U32 count, U32 indices_offset) const
void LLVertexBuffer::drawArrays(U32 mode, U32 first, U32 count) const
{
llassert(mRequestedNumVerts >= 0);
-
if (first >= (U32) mRequestedNumVerts ||
first + count > (U32) mRequestedNumVerts)
{
@@ -323,10 +383,6 @@ void LLVertexBuffer::initClass(bool use_vbo, bool no_vbo_mapping)
}
sDisableVBOMapping = sEnableVBOs && no_vbo_mapping ;
- LLGLNamePool::registerPool(&sDynamicVBOPool);
- LLGLNamePool::registerPool(&sDynamicIBOPool);
- LLGLNamePool::registerPool(&sStreamVBOPool);
- LLGLNamePool::registerPool(&sStreamIBOPool);
}
//static
@@ -355,6 +411,8 @@ void LLVertexBuffer::cleanupClass()
LLMemType mt2(LLMemType::MTYPE_VERTEX_CLEANUP_CLASS);
unbind();
clientCopy(); // deletes GL buffers
+
+ //llassert_always(!sCount) ;
}
void LLVertexBuffer::clientCopy(F64 max_time)
@@ -399,22 +457,29 @@ LLVertexBuffer::LLVertexBuffer(U32 typemask, S32 usage) :
mUsage = 0;
}
- if (mUsage == GL_STREAM_DRAW_ARB && !sUseStreamDraw)
+ if (mUsage == GL_DYNAMIC_DRAW_ARB && sPreferStreamDraw)
{
- mUsage = 0;
+ mUsage = GL_STREAM_DRAW_ARB;
}
- S32 stride = calcStride(typemask, mOffsets);
+ //zero out offsets
+ for (U32 i = 0; i < TYPE_MAX; i++)
+ {
+ mOffsets[i] = 0;
+ }
mTypeMask = typemask;
- mStride = stride;
+ mSize = 0;
+ mAlignedOffset = 0;
+ mAlignedIndexOffset = 0;
+
sCount++;
}
//static
-S32 LLVertexBuffer::calcStride(const U32& typemask, S32* offsets)
+S32 LLVertexBuffer::calcOffsets(const U32& typemask, S32* offsets, S32 num_vertices)
{
- S32 stride = 0;
+ S32 offset = 0;
for (S32 i=0; i<TYPE_MAX; i++)
{
U32 mask = 1<<i;
@@ -422,13 +487,35 @@ S32 LLVertexBuffer::calcStride(const U32& typemask, S32* offsets)
{
if (offsets)
{
- offsets[i] = stride;
+ offsets[i] = offset;
+ offset += LLVertexBuffer::sTypeSize[i]*num_vertices;
+ offset = (offset + 0xF) & ~0xF;
}
- stride += sTypeOffsets[i];
}
}
- return stride;
+ return offset+16;
+}
+
+//static
+S32 LLVertexBuffer::calcVertexSize(const U32& typemask)
+{
+ S32 size = 0;
+ for (S32 i = 0; i < TYPE_MAX; i++)
+ {
+ U32 mask = 1<<i;
+ if (typemask & mask)
+ {
+ size += LLVertexBuffer::sTypeSize[i];
+ }
+ }
+
+ return size;
+}
+
+S32 LLVertexBuffer::getSize() const
+{
+ return mSize;
}
// protected, use unref()
@@ -542,8 +629,7 @@ void LLVertexBuffer::createGLBuffer()
{
static int gl_buffer_idx = 0;
mGLBuffer = ++gl_buffer_idx;
- mMappedData = new U8[size];
- memset(mMappedData, 0, size);
+ mMappedData = (U8*) ll_aligned_malloc_16(size);
}
}
@@ -564,16 +650,20 @@ void LLVertexBuffer::createGLIndices()
mEmpty = TRUE;
+ //pad by 16 bytes for aligned copies
+ size += 16;
+
if (useVBOs())
{
+ //pad by another 16 bytes for VBO pointer adjustment
+ size += 16;
mMappedIndexData = NULL;
genIndices();
mResized = TRUE;
}
else
{
- mMappedIndexData = new U8[size];
- memset(mMappedIndexData, 0, size);
+ mMappedIndexData = (U8*) ll_aligned_malloc_16(size);
static int gl_buffer_idx = 0;
mGLIndices = ++gl_buffer_idx;
}
@@ -596,7 +686,7 @@ void LLVertexBuffer::destroyGLBuffer()
}
else
{
- delete [] mMappedData;
+ ll_aligned_free_16(mMappedData);
mMappedData = NULL;
mEmpty = TRUE;
}
@@ -605,7 +695,7 @@ void LLVertexBuffer::destroyGLBuffer()
}
mGLBuffer = 0;
- unbind();
+ //unbind();
}
void LLVertexBuffer::destroyGLIndices()
@@ -621,11 +711,11 @@ void LLVertexBuffer::destroyGLIndices()
{
llerrs << "Vertex buffer destroyed while mapped." << llendl;
}
- releaseIndices();
+ releaseIndices();
}
else
{
- delete [] mMappedIndexData;
+ ll_aligned_free_16(mMappedIndexData);
mMappedIndexData = NULL;
mEmpty = TRUE;
}
@@ -634,7 +724,7 @@ void LLVertexBuffer::destroyGLIndices()
}
mGLIndices = 0;
- unbind();
+ //unbind();
}
void LLVertexBuffer::updateNumVerts(S32 nverts)
@@ -650,7 +740,7 @@ void LLVertexBuffer::updateNumVerts(S32 nverts)
}
mRequestedNumVerts = nverts;
-
+
if (!mDynamicSize)
{
mNumVerts = nverts;
@@ -665,7 +755,7 @@ void LLVertexBuffer::updateNumVerts(S32 nverts)
}
mNumVerts = nverts;
}
-
+ mSize = calcOffsets(mTypeMask, mOffsets, mNumVerts);
}
void LLVertexBuffer::updateNumIndices(S32 nindices)
@@ -696,6 +786,12 @@ void LLVertexBuffer::allocateBuffer(S32 nverts, S32 nindices, bool create)
{
LLMemType mt2(LLMemType::MTYPE_VERTEX_ALLOCATE_BUFFER);
+ if (nverts < 0 || nindices < 0 ||
+ nverts > 65536)
+ {
+ llerrs << "Bad vertex buffer allocation: " << nverts << " : " << nindices << llendl;
+ }
+
updateNumVerts(nverts);
updateNumIndices(nindices);
@@ -734,9 +830,6 @@ void LLVertexBuffer::resizeBuffer(S32 newnverts, S32 newnindices)
{
sAllocatedBytes -= getSize() + getIndicesSize();
- S32 oldsize = getSize();
- S32 old_index_size = getIndicesSize();
-
updateNumVerts(newnverts);
updateNumIndices(newnindices);
@@ -753,26 +846,10 @@ void LLVertexBuffer::resizeBuffer(S32 newnverts, S32 newnindices)
}
else
{
- //delete old buffer, keep GL buffer for now
if (!useVBOs())
{
- U8* old = mMappedData;
- mMappedData = new U8[newsize];
- if (old)
- {
- memcpy(mMappedData, old, llmin(newsize, oldsize));
- if (newsize > oldsize)
- {
- memset(mMappedData+oldsize, 0, newsize-oldsize);
- }
-
- delete [] old;
- }
- else
- {
- memset(mMappedData, 0, newsize);
- mEmpty = TRUE;
- }
+ ll_aligned_free_16(mMappedData);
+ mMappedData = (U8*) ll_aligned_malloc_16(newsize);
}
mResized = TRUE;
}
@@ -792,24 +869,8 @@ void LLVertexBuffer::resizeBuffer(S32 newnverts, S32 newnindices)
{
if (!useVBOs())
{
- //delete old buffer, keep GL buffer for now
- U8* old = mMappedIndexData;
- mMappedIndexData = new U8[new_index_size];
-
- if (old)
- {
- memcpy(mMappedIndexData, old, llmin(new_index_size, old_index_size));
- if (new_index_size > old_index_size)
- {
- memset(mMappedIndexData+old_index_size, 0, new_index_size - old_index_size);
- }
- delete [] old;
- }
- else
- {
- memset(mMappedIndexData, 0, new_index_size);
- mEmpty = TRUE;
- }
+ ll_aligned_free_16(mMappedIndexData);
+ mMappedIndexData = (U8*) ll_aligned_malloc_16(new_index_size);
}
mResized = TRUE;
}
@@ -850,8 +911,8 @@ void LLVertexBuffer::freeClientBuffer()
{
if(useVBOs() && sDisableVBOMapping && (mMappedData || mMappedIndexData))
{
- delete[] mMappedData ;
- delete[] mMappedIndexData ;
+ ll_aligned_free_16(mMappedData) ;
+ ll_aligned_free_16(mMappedIndexData) ;
mMappedData = NULL ;
mMappedIndexData = NULL ;
}
@@ -861,9 +922,7 @@ void LLVertexBuffer::allocateClientVertexBuffer()
{
if(!mMappedData)
{
- U32 size = getSize() ;
- mMappedData = new U8[size];
- memset(mMappedData, 0, size);
+ mMappedData = (U8*)ll_aligned_malloc_16(getSize());
}
}
@@ -871,9 +930,7 @@ void LLVertexBuffer::allocateClientIndexBuffer()
{
if(!mMappedIndexData)
{
- U32 size = getIndicesSize();
- mMappedIndexData = new U8[size];
- memset(mMappedIndexData, 0, size);
+ mMappedIndexData = (U8*)ll_aligned_malloc_16(getIndicesSize());
}
}
@@ -904,11 +961,15 @@ U8* LLVertexBuffer::mapVertexBuffer(S32 type, S32 access)
}
else
{
- mMappedData = (U8*) glMapBufferARB(GL_ARRAY_BUFFER_ARB, GL_WRITE_ONLY_ARB);
+ U8* src = (U8*) glMapBufferARB(GL_ARRAY_BUFFER_ARB, GL_WRITE_ONLY_ARB);
+ mMappedData = LL_NEXT_ALIGNED_ADDRESS<U8>(src);
+ mAlignedOffset = mMappedData - src;
+
+ stop_glerror();
}
- stop_glerror();
}
+
if (!mMappedData)
{
log_glerror();
@@ -920,7 +981,7 @@ U8* LLVertexBuffer::mapVertexBuffer(S32 type, S32 access)
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 ;
@@ -936,7 +997,7 @@ U8* LLVertexBuffer::mapVertexBuffer(S32 type, S32 access)
llerrs << "Invalid GL vertex buffer bound: " << buff << llendl;
}
-
+
llerrs << "glMapBuffer returned NULL (no vertex data)" << llendl;
}
else
@@ -977,9 +1038,11 @@ U8* LLVertexBuffer::mapIndexBuffer(S32 access)
}
else
{
- mMappedIndexData = (U8*) glMapBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, GL_WRITE_ONLY_ARB);
+ U8* src = (U8*) glMapBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, GL_WRITE_ONLY_ARB);
+ mMappedIndexData = LL_NEXT_ALIGNED_ADDRESS<U8>(src);
+ mAlignedIndexOffset = mMappedIndexData - src;
+ stop_glerror();
}
- stop_glerror();
}
if (!mMappedIndexData)
@@ -1070,7 +1133,6 @@ void LLVertexBuffer::unmapBuffer(S32 type)
//throw out client data (we won't be using it again)
mEmpty = TRUE;
mFinal = TRUE;
-
if(sDisableVBOMapping)
{
freeClientBuffer() ;
@@ -1108,7 +1170,7 @@ template <class T,S32 type> struct VertexBufferStrider
}
else if (vbo.hasDataType(type))
{
- S32 stride = vbo.getStride();
+ S32 stride = LLVertexBuffer::sTypeSize[type];
if (vbo.mapVertexBuffer(type) == NULL)
{
@@ -1116,7 +1178,7 @@ template <class T,S32 type> struct VertexBufferStrider
return FALSE;
}
- strider = (T*)(vbo.getMappedData() + vbo.getOffset(type) + index*stride);
+ strider = (T*)(vbo.getMappedData() + vbo.getOffset(type)+index*stride);
strider.setStride(stride);
return TRUE;
}
@@ -1128,7 +1190,6 @@ template <class T,S32 type> struct VertexBufferStrider
}
};
-
bool LLVertexBuffer::getVertexStrider(LLStrider<LLVector3>& strider, S32 index)
{
return VertexBufferStrider<LLVector3,TYPE_VERTEX>::get(*this, strider, index);
@@ -1169,28 +1230,15 @@ bool LLVertexBuffer::getWeightStrider(LLStrider<F32>& strider, S32 index)
{
return VertexBufferStrider<F32,TYPE_WEIGHT>::get(*this, strider, index);
}
-bool LLVertexBuffer::getClothWeightStrider(LLStrider<LLVector4>& strider, S32 index)
+
+bool LLVertexBuffer::getWeight4Strider(LLStrider<LLVector4>& strider, S32 index)
{
- return VertexBufferStrider<LLVector4,TYPE_CLOTHWEIGHT>::get(*this, strider, index);
+ return VertexBufferStrider<LLVector4,TYPE_WEIGHT4>::get(*this, strider, index);
}
-void LLVertexBuffer::setStride(S32 type, S32 new_stride)
+bool LLVertexBuffer::getClothWeightStrider(LLStrider<LLVector4>& strider, S32 index)
{
- LLMemType mt2(LLMemType::MTYPE_VERTEX_SET_STRIDE);
- if (mNumVerts)
- {
- llerrs << "LLVertexBuffer::setOffset called with mNumVerts = " << mNumVerts << llendl;
- }
- // This code assumes that setStride() will only be called once per VBO per type.
- S32 delta = new_stride - sTypeOffsets[type];
- for (S32 i=type+1; i<TYPE_MAX; i++)
- {
- if (mTypeMask & (1<<i))
- {
- mOffsets[i] += delta;
- }
- }
- mStride += delta;
+ return VertexBufferStrider<LLVector4,TYPE_CLOTHWEIGHT>::get(*this, strider, index);
}
//----------------------------------------------------------------------------
@@ -1389,8 +1437,7 @@ void LLVertexBuffer::setupVertexBuffer(U32 data_mask) const
{
LLMemType mt2(LLMemType::MTYPE_VERTEX_SETUP_VERTEX_BUFFER);
stop_glerror();
- U8* base = useVBOs() ? NULL : mMappedData;
- S32 stride = mStride;
+ U8* base = useVBOs() ? (U8*) mAlignedOffset : mMappedData;
if ((data_mask & mTypeMask) != data_mask)
{
@@ -1399,52 +1446,58 @@ void LLVertexBuffer::setupVertexBuffer(U32 data_mask) const
if (data_mask & MAP_NORMAL)
{
- glNormalPointer(GL_FLOAT, stride, (void*)(base + mOffsets[TYPE_NORMAL]));
+ glNormalPointer(GL_FLOAT, LLVertexBuffer::sTypeSize[TYPE_NORMAL], (void*)(base + mOffsets[TYPE_NORMAL]));
}
if (data_mask & MAP_TEXCOORD3)
{
glClientActiveTextureARB(GL_TEXTURE3_ARB);
- glTexCoordPointer(2,GL_FLOAT, stride, (void*)(base + mOffsets[TYPE_TEXCOORD3]));
+ glTexCoordPointer(2,GL_FLOAT, LLVertexBuffer::sTypeSize[TYPE_TEXCOORD3], (void*)(base + mOffsets[TYPE_TEXCOORD3]));
glClientActiveTextureARB(GL_TEXTURE0_ARB);
}
if (data_mask & MAP_TEXCOORD2)
{
glClientActiveTextureARB(GL_TEXTURE2_ARB);
- glTexCoordPointer(2,GL_FLOAT, stride, (void*)(base + mOffsets[TYPE_TEXCOORD2]));
+ glTexCoordPointer(2,GL_FLOAT, LLVertexBuffer::sTypeSize[TYPE_TEXCOORD2], (void*)(base + mOffsets[TYPE_TEXCOORD2]));
glClientActiveTextureARB(GL_TEXTURE0_ARB);
}
if (data_mask & MAP_TEXCOORD1)
{
glClientActiveTextureARB(GL_TEXTURE1_ARB);
- glTexCoordPointer(2,GL_FLOAT, stride, (void*)(base + mOffsets[TYPE_TEXCOORD1]));
+ glTexCoordPointer(2,GL_FLOAT, LLVertexBuffer::sTypeSize[TYPE_TEXCOORD1], (void*)(base + mOffsets[TYPE_TEXCOORD1]));
glClientActiveTextureARB(GL_TEXTURE0_ARB);
}
if (data_mask & MAP_BINORMAL)
{
glClientActiveTextureARB(GL_TEXTURE2_ARB);
- glTexCoordPointer(3,GL_FLOAT, stride, (void*)(base + mOffsets[TYPE_BINORMAL]));
+ glTexCoordPointer(3,GL_FLOAT, LLVertexBuffer::sTypeSize[TYPE_BINORMAL], (void*)(base + mOffsets[TYPE_BINORMAL]));
glClientActiveTextureARB(GL_TEXTURE0_ARB);
}
if (data_mask & MAP_TEXCOORD0)
{
- glTexCoordPointer(2,GL_FLOAT, stride, (void*)(base + mOffsets[TYPE_TEXCOORD0]));
+ glTexCoordPointer(2,GL_FLOAT, LLVertexBuffer::sTypeSize[TYPE_TEXCOORD0], (void*)(base + mOffsets[TYPE_TEXCOORD0]));
}
if (data_mask & MAP_COLOR)
{
- glColorPointer(4, GL_UNSIGNED_BYTE, stride, (void*)(base + mOffsets[TYPE_COLOR]));
+ glColorPointer(4, GL_UNSIGNED_BYTE, LLVertexBuffer::sTypeSize[TYPE_COLOR], (void*)(base + mOffsets[TYPE_COLOR]));
}
if (data_mask & MAP_WEIGHT)
{
- glVertexAttribPointerARB(1, 1, GL_FLOAT, FALSE, stride, (void*)(base + mOffsets[TYPE_WEIGHT]));
+ glVertexAttribPointerARB(1, 1, GL_FLOAT, FALSE, LLVertexBuffer::sTypeSize[TYPE_WEIGHT], (void*)(base + mOffsets[TYPE_WEIGHT]));
+ }
+
+ if (data_mask & MAP_WEIGHT4 && sWeight4Loc != -1)
+ {
+ glVertexAttribPointerARB(sWeight4Loc, 4, GL_FLOAT, FALSE, LLVertexBuffer::sTypeSize[TYPE_WEIGHT4], (void*)(base+mOffsets[TYPE_WEIGHT4]));
}
+
if (data_mask & MAP_CLOTHWEIGHT)
{
- glVertexAttribPointerARB(4, 4, GL_FLOAT, TRUE, stride, (void*)(base + mOffsets[TYPE_CLOTHWEIGHT]));
+ glVertexAttribPointerARB(4, 4, GL_FLOAT, TRUE, LLVertexBuffer::sTypeSize[TYPE_CLOTHWEIGHT], (void*)(base + mOffsets[TYPE_CLOTHWEIGHT]));
}
if (data_mask & MAP_VERTEX)
{
- glVertexPointer(3,GL_FLOAT, stride, (void*)(base + 0));
+ glVertexPointer(3,GL_FLOAT, LLVertexBuffer::sTypeSize[TYPE_VERTEX], (void*)(base + 0));
}
llglassertok();
diff --git a/indra/llrender/llvertexbuffer.h b/indra/llrender/llvertexbuffer.h
index c51ce7ac4e..a9f22193f8 100644
--- a/indra/llrender/llvertexbuffer.h
+++ b/indra/llrender/llvertexbuffer.h
@@ -56,42 +56,65 @@ protected:
virtual GLuint allocateName()
{
GLuint name;
+ stop_glerror();
glGenBuffersARB(1, &name);
+ stop_glerror();
return name;
}
virtual void releaseName(GLuint name)
{
+ stop_glerror();
glDeleteBuffersARB(1, &name);
+ stop_glerror();
}
};
//============================================================================
-// base class
+// base class
class LLVertexBuffer : public LLRefCount
{
public:
+ LLVertexBuffer(const LLVertexBuffer& rhs)
+ {
+ *this = rhs;
+ }
+
+ const LLVertexBuffer& operator=(const LLVertexBuffer& rhs)
+ {
+ llerrs << "Illegal operation!" << llendl;
+ return *this;
+ }
+
static LLVBOPool sStreamVBOPool;
static LLVBOPool sDynamicVBOPool;
static LLVBOPool sStreamIBOPool;
static LLVBOPool sDynamicIBOPool;
+ static S32 sWeight4Loc;
+
static BOOL sUseStreamDraw;
+ static BOOL sPreferStreamDraw;
static void initClass(bool use_vbo, bool no_vbo_mapping);
static void cleanupClass();
static void setupClientArrays(U32 data_mask);
+ static void drawArrays(U32 mode, const std::vector<LLVector3>& pos, const std::vector<LLVector3>& norm);
+
static void clientCopy(F64 max_time = 0.005); //copy data from client to GL
static void unbind(); //unbind any bound vertex buffer
//get the size of a vertex with the given typemask
- //if offsets is not NULL, its contents will be filled
- //with the offset of each vertex component in the buffer,
+ static S32 calcVertexSize(const U32& typemask);
+
+ //get the size of a buffer with the given typemask and vertex count
+ //fill offsets with the offset of each vertex component array into the buffer
// indexed by the following enum
- static S32 calcStride(const U32& typemask, S32* offsets = NULL);
+ static S32 calcOffsets(const U32& typemask, S32* offsets, S32 num_vertices);
+
enum {
TYPE_VERTEX,
TYPE_NORMAL,
@@ -103,6 +126,7 @@ public:
// These use VertexAttribPointer and should possibly be made generic
TYPE_BINORMAL,
TYPE_WEIGHT,
+ TYPE_WEIGHT4,
TYPE_CLOTHWEIGHT,
TYPE_MAX,
TYPE_INDEX,
@@ -118,6 +142,7 @@ public:
// These use VertexAttribPointer and should possibly be made generic
MAP_BINORMAL = (1<<TYPE_BINORMAL),
MAP_WEIGHT = (1<<TYPE_WEIGHT),
+ MAP_WEIGHT4 = (1<<TYPE_WEIGHT4),
MAP_CLOTHWEIGHT = (1<<TYPE_CLOTHWEIGHT),
};
@@ -172,6 +197,7 @@ public:
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 isEmpty() const { return mEmpty; }
@@ -181,33 +207,37 @@ public:
S32 getRequestedVerts() const { return mRequestedNumVerts; }
S32 getRequestedIndices() const { return mRequestedNumIndices; }
- U8* getIndicesPointer() const { return useVBOs() ? NULL : mMappedIndexData; }
- U8* getVerticesPointer() const { return useVBOs() ? NULL : mMappedData; }
- S32 getStride() const { return mStride; }
- S32 getTypeMask() const { return mTypeMask; }
- BOOL hasDataType(S32 type) const { return ((1 << type) & getTypeMask()) ? TRUE : FALSE; }
- S32 getSize() const { return mNumVerts*mStride; }
+ U8* getIndicesPointer() const { return useVBOs() ? (U8*) mAlignedIndexOffset : mMappedIndexData; }
+ U8* getVerticesPointer() const { return useVBOs() ? (U8*) mAlignedOffset : mMappedData; }
+ U32 getTypeMask() const { return mTypeMask; }
+ bool hasDataType(S32 type) const { return ((1 << type) & getTypeMask()); }
+ S32 getSize() const;
S32 getIndicesSize() const { return mNumIndices * sizeof(U16); }
U8* getMappedData() const { return mMappedData; }
U8* getMappedIndices() const { return mMappedIndexData; }
S32 getOffset(S32 type) const { return mOffsets[type]; }
S32 getUsage() const { return mUsage; }
- void setStride(S32 type, S32 new_stride);
-
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;
+ //for debugging, validate data in given range is valid
+ void validateRange(U32 start, U32 end, U32 count, U32 offset) const;
+
+
+
protected:
S32 mNumVerts; // Number of vertices allocated
S32 mNumIndices; // Number of indices allocated
S32 mRequestedNumVerts; // Number of vertices requested
S32 mRequestedNumIndices; // Number of indices requested
- S32 mStride;
+ ptrdiff_t mAlignedOffset;
+ ptrdiff_t mAlignedIndexOffset;
+ S32 mSize;
U32 mTypeMask;
S32 mUsage; // GL usage
U32 mGLBuffer; // GL VBO handle
@@ -248,12 +278,12 @@ public:
static BOOL sDisableVBOMapping; //disable glMapBufferARB
static BOOL sEnableVBOs;
- static BOOL sVBOActive;
- static BOOL sIBOActive;
- static S32 sTypeOffsets[TYPE_MAX];
+ static S32 sTypeSize[TYPE_MAX];
static U32 sGLMode[LLRender::NUM_MODES];
static U32 sGLRenderBuffer;
- static U32 sGLRenderIndices;
+ static U32 sGLRenderIndices;
+ static BOOL sVBOActive;
+ static BOOL sIBOActive;
static U32 sLastMask;
static U32 sAllocatedBytes;
static U32 sBindCount;
diff --git a/indra/llui/CMakeLists.txt b/indra/llui/CMakeLists.txt
index 33ab2e93b5..684e393cba 100644
--- a/indra/llui/CMakeLists.txt
+++ b/indra/llui/CMakeLists.txt
@@ -244,12 +244,12 @@ target_link_libraries(llui
${LLCOMMON_LIBRARIES} # must be after llimage, llwindow, llrender
)
-if(LL_TESTS)
- # Add 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)
+# 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
diff --git a/indra/llui/llbutton.h b/indra/llui/llbutton.h
index 16aa49b653..0cfc393e05 100644
--- a/indra/llui/llbutton.h
+++ b/indra/llui/llbutton.h
@@ -27,7 +27,6 @@
#ifndef LL_LLBUTTON_H
#define LL_LLBUTTON_H
-#include "lluuid.h"
#include "llcontrol.h"
#include "lluictrl.h"
#include "v4color.h"
@@ -53,6 +52,8 @@ S32 round_up(S32 grid, S32 value);
class LLUICtrlFactory;
+class LLUIImage;
+class LLUUID;
//
// Classes
diff --git a/indra/llui/llcombobox.cpp b/indra/llui/llcombobox.cpp
index 6f9893b07a..a4d1854bc8 100644
--- a/indra/llui/llcombobox.cpp
+++ b/indra/llui/llcombobox.cpp
@@ -231,6 +231,10 @@ void LLComboBox::resetDirty()
}
}
+bool LLComboBox::itemExists(const std::string& name)
+{
+ return mList->getItemByLabel(name);
+}
// add item "name" to menu
LLScrollListItem* LLComboBox::add(const std::string& name, EAddPosition pos, BOOL enabled)
diff --git a/indra/llui/llcombobox.h b/indra/llui/llcombobox.h
index e9ef9d07e4..64dbaea306 100644
--- a/indra/llui/llcombobox.h
+++ b/indra/llui/llcombobox.h
@@ -134,6 +134,7 @@ public:
LLScrollListItem* addSeparator(EAddPosition pos = ADD_BOTTOM);
BOOL remove( S32 index ); // remove item by index, return TRUE if found and removed
void removeall() { clearRows(); }
+ bool itemExists(const std::string& name);
void sortByName(BOOL ascending = TRUE); // Sort the entries in the combobox by name
diff --git a/indra/llui/llflatlistview.cpp b/indra/llui/llflatlistview.cpp
index c57c02f4b1..97a52fada4 100644
--- a/indra/llui/llflatlistview.cpp
+++ b/indra/llui/llflatlistview.cpp
@@ -87,9 +87,6 @@ bool LLFlatListView::addItem(LLPanel * item, const LLSD& value /*= LLUUID::null*
mItemsPanel->addChild(item);
break;
default:
- LL_WARNS("") << "Unsupported position." << LL_ENDL;
- delete new_pair;
- return false;
break;
}
diff --git a/indra/llui/llflatlistview.h b/indra/llui/llflatlistview.h
index 0515853698..92bf429031 100644
--- a/indra/llui/llflatlistview.h
+++ b/indra/llui/llflatlistview.h
@@ -450,8 +450,9 @@ private:
*/
class LLFlatListViewEx : public LLFlatListView
{
- LOG_CLASS(LLFlatListViewEx);
public:
+ LOG_CLASS(LLFlatListViewEx);
+
struct Params : public LLInitParam::Block<Params, LLFlatListView::Params>
{
/**
diff --git a/indra/llui/llfloaterreg.h b/indra/llui/llfloaterreg.h
index 94387fb41a..8414b92113 100644
--- a/indra/llui/llfloaterreg.h
+++ b/indra/llui/llfloaterreg.h
@@ -27,14 +27,9 @@
#define LLFLOATERREG_H
/// llcommon
-#include "llboost.h"
#include "llrect.h"
-#include "llstl.h"
#include "llsd.h"
-/// llui
-#include "lluictrl.h"
-
#include <boost/function.hpp>
//*******************************************************
@@ -43,6 +38,7 @@
//
class LLFloater;
+class LLUICtrl;
typedef boost::function<LLFloater* (const LLSD& key)> LLFloaterBuildFunc;
diff --git a/indra/llui/llfocusmgr.cpp b/indra/llui/llfocusmgr.cpp
index 43e5f6b051..724d190307 100644
--- a/indra/llui/llfocusmgr.cpp
+++ b/indra/llui/llfocusmgr.cpp
@@ -113,6 +113,16 @@ boost::signals2::connection LLFocusableElement::setTopLostCallback(const focus_s
+typedef std::list<LLHandle<LLView> > view_handle_list_t;
+typedef std::map<LLHandle<LLView>, LLHandle<LLView> > focus_history_map_t;
+struct LLFocusMgr::Impl
+{
+ // caching list of keyboard focus ancestors for calling onFocusReceived and onFocusLost
+ view_handle_list_t mCachedKeyboardFocusList;
+
+ focus_history_map_t mFocusHistory;
+};
+
LLFocusMgr gFocusMgr;
LLFocusMgr::LLFocusMgr()
@@ -123,10 +133,17 @@ LLFocusMgr::LLFocusMgr()
mDefaultKeyboardFocus( NULL ),
mKeystrokesOnly(FALSE),
mTopCtrl( NULL ),
- mAppHasFocus(TRUE) // Macs don't seem to notify us that we've gotten focus, so default to true
+ mAppHasFocus(TRUE), // Macs don't seem to notify us that we've gotten focus, so default to true
+ mImpl(new LLFocusMgr::Impl)
{
}
+LLFocusMgr::~LLFocusMgr()
+{
+ mImpl->mFocusHistory.clear();
+ delete mImpl;
+ mImpl = NULL;
+}
void LLFocusMgr::releaseFocusIfNeeded( LLView* view )
{
@@ -179,7 +196,7 @@ void LLFocusMgr::setKeyboardFocus(LLFocusableElement* new_focus, BOOL lock, BOOL
mKeyboardFocus = new_focus;
// list of the focus and it's ancestors
- view_handle_list_t old_focus_list = mCachedKeyboardFocusList;
+ view_handle_list_t old_focus_list = mImpl->mCachedKeyboardFocusList;
view_handle_list_t new_focus_list;
// walk up the tree to root and add all views to the new_focus_list
@@ -206,7 +223,7 @@ void LLFocusMgr::setKeyboardFocus(LLFocusableElement* new_focus, BOOL lock, BOOL
LLView* old_focus_view = old_focus_iter->get();
if (old_focus_view)
{
- mCachedKeyboardFocusList.pop_front();
+ mImpl->mCachedKeyboardFocusList.pop_front();
old_focus_view->onFocusLost();
}
}
@@ -219,7 +236,7 @@ void LLFocusMgr::setKeyboardFocus(LLFocusableElement* new_focus, BOOL lock, BOOL
LLView* new_focus_view = new_focus_riter->get();
if (new_focus_view)
{
- mCachedKeyboardFocusList.push_front(new_focus_view->getHandle());
+ mImpl->mCachedKeyboardFocusList.push_front(new_focus_view->getHandle());
new_focus_view->onFocusReceived();
}
}
@@ -254,7 +271,7 @@ void LLFocusMgr::setKeyboardFocus(LLFocusableElement* new_focus, BOOL lock, BOOL
if (focus_subtree)
{
LLView* focused_view = dynamic_cast<LLView*>(mKeyboardFocus);
- mFocusHistory[focus_subtree->getHandle()] = focused_view ? focused_view->getHandle() : LLHandle<LLView>();
+ mImpl->mFocusHistory[focus_subtree->getHandle()] = focused_view ? focused_view->getHandle() : LLHandle<LLView>();
}
}
@@ -456,8 +473,8 @@ LLUICtrl* LLFocusMgr::getLastFocusForGroup(LLView* subtree_root) const
{
if (subtree_root)
{
- focus_history_map_t::const_iterator found_it = mFocusHistory.find(subtree_root->getHandle());
- if (found_it != mFocusHistory.end())
+ focus_history_map_t::const_iterator found_it = mImpl->mFocusHistory.find(subtree_root->getHandle());
+ if (found_it != mImpl->mFocusHistory.end())
{
// found last focus for this subtree
return static_cast<LLUICtrl*>(found_it->second.get());
@@ -470,6 +487,6 @@ void LLFocusMgr::clearLastFocusForGroup(LLView* subtree_root)
{
if (subtree_root)
{
- mFocusHistory.erase(subtree_root->getHandle());
+ mImpl->mFocusHistory.erase(subtree_root->getHandle());
}
}
diff --git a/indra/llui/llfocusmgr.h b/indra/llui/llfocusmgr.h
index 22c1895075..25ae1d2579 100644
--- a/indra/llui/llfocusmgr.h
+++ b/indra/llui/llfocusmgr.h
@@ -74,7 +74,7 @@ class LLFocusMgr
{
public:
LLFocusMgr();
- ~LLFocusMgr() { mFocusHistory.clear(); }
+ ~LLFocusMgr();
// Mouse Captor
void setMouseCapture(LLMouseHandler* new_captor); // new_captor = NULL to release the mouse.
@@ -120,6 +120,8 @@ public:
bool keyboardFocusHasAccelerators() const;
+ struct Impl;
+
private:
LLUICtrl* mLockedView;
@@ -132,10 +134,6 @@ private:
LLFocusableElement* mDefaultKeyboardFocus;
BOOL mKeystrokesOnly;
- // caching list of keyboard focus ancestors for calling onFocusReceived and onFocusLost
- typedef std::list<LLHandle<LLView> > view_handle_list_t;
- view_handle_list_t mCachedKeyboardFocusList;
-
// Top View
LLUICtrl* mTopCtrl;
@@ -143,8 +141,7 @@ private:
BOOL mAppHasFocus;
- typedef std::map<LLHandle<LLView>, LLHandle<LLView> > focus_history_map_t;
- focus_history_map_t mFocusHistory;
+ Impl * mImpl;
};
extern LLFocusMgr gFocusMgr;
diff --git a/indra/llui/lliconctrl.h b/indra/llui/lliconctrl.h
index 669e126266..efa0925a4a 100644
--- a/indra/llui/lliconctrl.h
+++ b/indra/llui/lliconctrl.h
@@ -30,6 +30,7 @@
#include "lluuid.h"
#include "v4color.h"
#include "lluictrl.h"
+#include "lluiimage.h"
#include "stdenums.h"
class LLTextBox;
diff --git a/indra/llui/lllineeditor.cpp b/indra/llui/lllineeditor.cpp
index d99ee5a545..0196080d90 100644
--- a/indra/llui/lllineeditor.cpp
+++ b/indra/llui/lllineeditor.cpp
@@ -389,7 +389,11 @@ void LLLineEditor::setText(const LLStringExplicit &new_text)
setCursor(llmin((S32)mText.length(), getCursor()));
// Set current history line to end of history.
- if(mLineHistory.end() != mLineHistory.begin())
+ if (mLineHistory.empty())
+ {
+ mCurrentHistoryLine = mLineHistory.end();
+ }
+ else
{
mCurrentHistoryLine = mLineHistory.end() - 1;
}
diff --git a/indra/llui/lllineeditor.h b/indra/llui/lllineeditor.h
index 7b5fa218f2..fe191e5971 100644
--- a/indra/llui/lllineeditor.h
+++ b/indra/llui/lllineeditor.h
@@ -41,6 +41,7 @@
#include "lleditmenuhandler.h"
#include "lluictrl.h"
+#include "lluiimage.h"
#include "lluistring.h"
#include "llviewborder.h"
diff --git a/indra/llui/llloadingindicator.cpp b/indra/llui/llloadingindicator.cpp
index 7b29d92ea0..c4eec1835c 100644
--- a/indra/llui/llloadingindicator.cpp
+++ b/indra/llui/llloadingindicator.cpp
@@ -39,56 +39,24 @@
//static LLDefaultChildRegistry::Register<LLLoadingIndicator> r("loading_indicator");
///////////////////////////////////////////////////////////////////////////////
-// LLLoadingIndicator::Data class
+// LLLoadingIndicator class
///////////////////////////////////////////////////////////////////////////////
-/**
- * Pre-loaded images shared by all instances of the widget
- */
-class LLLoadingIndicator::Data: public LLSingleton<LLLoadingIndicator::Data>
+LLLoadingIndicator::LLLoadingIndicator(const Params& p)
+: LLUICtrl(p),
+ mImagesPerSec(p.images_per_sec > 0 ? p.images_per_sec : 1.0f),
+ mCurImageIdx(0)
{
-public:
- /*virtual*/ void initSingleton(); // from LLSingleton
-
- LLPointer<LLUIImage> getNextImage(S8& idx) const;
- U8 getImagesCount() const { return NIMAGES; }
-private:
-
- static const U8 NIMAGES = 12;
- LLPointer<LLUIImage> mImages[NIMAGES];
-};
+}
-// virtual
-// Called right after the instance gets constructed.
-void LLLoadingIndicator::Data::initSingleton()
+void LLLoadingIndicator::initFromParams(const Params& p)
{
- // Load images.
- for (U8 i = 0; i < NIMAGES; ++i)
+ for (LLInitParam::ParamIterator<LLUIImage*>::const_iterator it = p.images().image.begin(), end_it = p.images().image.end();
+ it != end_it;
+ ++it)
{
- std::string img_name = llformat("Progress_%d", i+1);
- mImages[i] = LLUI::getUIImage(img_name, 0);
- llassert(mImages[i]);
+ mImages.push_back(it->getValue());
}
-}
-
-LLPointer<LLUIImage> LLLoadingIndicator::Data::getNextImage(S8& idx) const
-{
- // Calculate next index, performing array bounds checking.
- idx = (idx >= NIMAGES || idx < 0) ? 0 : (idx + 1) % NIMAGES;
- return mImages[idx];
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// LLLoadingIndicator class
-///////////////////////////////////////////////////////////////////////////////
-
-LLLoadingIndicator::LLLoadingIndicator(const Params& p)
-: LLUICtrl(p)
- , mRotationsPerSec(p.rotations_per_sec > 0 ? p.rotations_per_sec : 1.0f)
- , mCurImageIdx(-1)
-{
- // Select initial image.
- mCurImagep = Data::instance().getNextImage(mCurImageIdx);
// Start timer for switching images.
start();
@@ -100,16 +68,21 @@ void LLLoadingIndicator::draw()
if (mImageSwitchTimer.getStarted() && mImageSwitchTimer.hasExpired())
{
// Switch to the next image.
- mCurImagep = Data::instance().getNextImage(mCurImageIdx);
+ if (!mImages.empty())
+ {
+ mCurImageIdx = (mCurImageIdx + 1) % mImages.size();
+ }
// Restart timer.
start();
}
+ LLUIImagePtr cur_image = mImages.empty() ? LLUIImagePtr(NULL) : mImages[mCurImageIdx];
+
// Draw current image.
- if( mCurImagep.notNull() )
+ if( cur_image.notNull() )
{
- mCurImagep->draw(getLocalRect(), LLColor4::white % getDrawContext().mAlpha);
+ cur_image->draw(getLocalRect(), LLColor4::white % getDrawContext().mAlpha);
}
LLUICtrl::draw();
@@ -123,6 +96,6 @@ void LLLoadingIndicator::stop()
void LLLoadingIndicator::start()
{
mImageSwitchTimer.start();
- F32 period = 1.0f / (Data::instance().getImagesCount() * mRotationsPerSec);
+ F32 period = 1.0f / (mImages.size() * mImagesPerSec);
mImageSwitchTimer.setTimerExpirySec(period);
}
diff --git a/indra/llui/llloadingindicator.h b/indra/llui/llloadingindicator.h
index 4e4a224ef6..4c47cc267c 100644
--- a/indra/llui/llloadingindicator.h
+++ b/indra/llui/llloadingindicator.h
@@ -28,6 +28,7 @@
#define LL_LLLOADINGINDICATOR_H
#include "lluictrl.h"
+#include "lluiimage.h"
///////////////////////////////////////////////////////////////////////////////
// class LLLoadingIndicator
@@ -36,8 +37,8 @@
/**
* Perpetual loading indicator (a la MacOSX or YouTube)
*
- * Number of rotations per second can be overriden
- * with the "roations_per_sec" parameter.
+ * Number of rotations per second can be overridden
+ * with the "images_per_sec" parameter.
*
* Can start/stop spinning.
*
@@ -49,11 +50,24 @@ class LLLoadingIndicator
{
LOG_CLASS(LLLoadingIndicator);
public:
+
+ struct Images : public LLInitParam::Block<Images>
+ {
+ Multiple<LLUIImage*> image;
+
+ Images()
+ : image("image")
+ {}
+ };
+
struct Params : public LLInitParam::Block<Params, LLUICtrl::Params>
{
- Optional<F32> rotations_per_sec;
+ Optional<F32> images_per_sec;
+ Batch<Images> images;
+
Params()
- : rotations_per_sec("rotations_per_sec", 1.0f)
+ : images_per_sec("images_per_sec", 1.0f),
+ images("images")
{}
};
@@ -74,14 +88,15 @@ public:
private:
LLLoadingIndicator(const Params&);
- friend class LLUICtrlFactory;
+ void initFromParams(const Params&);
- class Data;
+ friend class LLUICtrlFactory;
- F32 mRotationsPerSec;
+ F32 mImagesPerSec;
S8 mCurImageIdx;
- LLPointer<LLUIImage> mCurImagep;
LLFrameTimer mImageSwitchTimer;
+
+ std::vector<LLUIImagePtr> mImages;
};
#endif // LL_LLLOADINGINDICATOR_H
diff --git a/indra/llui/llmultislider.cpp b/indra/llui/llmultislider.cpp
index d4e6091ee0..f744e9db41 100644
--- a/indra/llui/llmultislider.cpp
+++ b/indra/llui/llmultislider.cpp
@@ -35,6 +35,7 @@
#include "llkeyboard.h" // for the MASK constants
#include "llcontrol.h"
#include "lluictrlfactory.h"
+#include "lluiimage.h"
#include <sstream>
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.h b/indra/llui/llpanel.h
index c1a1a06f39..7bbbeaf709 100644
--- a/indra/llui/llpanel.h
+++ b/indra/llui/llpanel.h
@@ -32,6 +32,7 @@
#include "llcallbackmap.h"
#include "lluictrl.h"
#include "llviewborder.h"
+#include "lluiimage.h"
#include "lluistring.h"
#include "v4color.h"
#include <list>
diff --git a/indra/llui/llprogressbar.cpp b/indra/llui/llprogressbar.cpp
index ead22686bc..84a890edfa 100644
--- a/indra/llui/llprogressbar.cpp
+++ b/indra/llui/llprogressbar.cpp
@@ -38,6 +38,7 @@
#include "llfocusmgr.h"
#include "lluictrlfactory.h"
+#include "lluiimage.h"
static LLDefaultChildRegistry::Register<LLProgressBar> r("progress_bar");
diff --git a/indra/llui/llprogressbar.h b/indra/llui/llprogressbar.h
index 3f308e7496..a8ec83ea00 100644
--- a/indra/llui/llprogressbar.h
+++ b/indra/llui/llprogressbar.h
@@ -27,8 +27,9 @@
#ifndef LL_LLPROGRESSBAR_H
#define LL_LLPROGRESSBAR_H
-#include "lluictrl.h"
#include "llframetimer.h"
+#include "lluictrl.h"
+#include "lluiimage.h"
class LLProgressBar
: public LLUICtrl
diff --git a/indra/llui/llslider.h b/indra/llui/llslider.h
index 68823ed68e..700c17ea3e 100644
--- a/indra/llui/llslider.h
+++ b/indra/llui/llslider.h
@@ -29,6 +29,7 @@
#include "llf32uictrl.h"
#include "v4color.h"
+#include "lluiimage.h"
class LLSlider : public LLF32UICtrl
{
diff --git a/indra/llui/llstyle.cpp b/indra/llui/llstyle.cpp
index 28a064e6b6..bb731f4f7e 100644
--- a/indra/llui/llstyle.cpp
+++ b/indra/llui/llstyle.cpp
@@ -88,7 +88,7 @@ void LLStyle::setVisible(BOOL is_visible)
mVisible = is_visible;
}
-LLUIImagePtr LLStyle::getImage() const
+LLPointer<LLUIImage> LLStyle::getImage() const
{
return mImagep;
}
diff --git a/indra/llui/llstyle.h b/indra/llui/llstyle.h
index 322edc343c..9f1eba79d8 100644
--- a/indra/llui/llstyle.h
+++ b/indra/llui/llstyle.h
@@ -30,6 +30,7 @@
#include "v4color.h"
#include "llui.h"
#include "llinitparam.h"
+#include "lluiimage.h"
class LLFontGL;
@@ -72,7 +73,7 @@ public:
void setLinkHREF(const std::string& href);
BOOL isLink() const;
- LLUIImagePtr getImage() const;
+ LLPointer<LLUIImage> getImage() const;
void setImage(const LLUUID& src);
void setImage(const std::string& name);
@@ -108,7 +109,7 @@ private:
const LLFontGL* mFont;
std::string mLink;
bool mIsLink;
- LLUIImagePtr mImagep;
+ LLPointer<LLUIImage> mImagep;
};
typedef LLPointer<LLStyle> LLStyleSP;
diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp
index 49537ef78f..349dbc3405 100644
--- a/indra/llui/lltextbase.cpp
+++ b/indra/llui/lltextbase.cpp
@@ -157,6 +157,7 @@ LLTextBase::Params::Params()
read_only("read_only", false),
v_pad("v_pad", 0),
h_pad("h_pad", 0),
+ clip("clip", true),
clip_partial("clip_partial", true),
line_spacing("line_spacing"),
max_text_length("max_length", 255),
@@ -199,6 +200,7 @@ LLTextBase::LLTextBase(const LLTextBase::Params &p)
mVAlign(p.font_valign),
mLineSpacingMult(p.line_spacing.multiple),
mLineSpacingPixels(p.line_spacing.pixels),
+ mClip(p.clip),
mClipPartial(p.clip_partial && !p.allow_scroll),
mTrackEnd( p.track_end ),
mScrollIndex(-1),
@@ -278,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 )
{
@@ -334,7 +336,7 @@ void LLTextBase::drawSelectionBackground()
// binary search for line that starts before top of visible buffer
line_list_t::const_iterator line_iter = std::lower_bound(mLineInfoList.begin(), mLineInfoList.end(), content_display_rect.mTop, compare_bottom());
- line_list_t::const_iterator end_iter = std::lower_bound(mLineInfoList.begin(), mLineInfoList.end(), content_display_rect.mBottom, compare_top());
+ line_list_t::const_iterator end_iter = std::upper_bound(mLineInfoList.begin(), mLineInfoList.end(), content_display_rect.mBottom, compare_top());
bool done = false;
@@ -512,7 +514,6 @@ void LLTextBase::drawText()
selection_right = llmax( mSelectionStart, mSelectionEnd );
}
- LLRect scrolled_view_rect = getVisibleDocumentRect();
std::pair<S32, S32> line_range = getVisibleLines(mClipPartial);
S32 first_line = line_range.first;
S32 last_line = line_range.second;
@@ -545,10 +546,9 @@ void LLTextBase::drawText()
line_end = next_start;
}
- LLRect text_rect(line.mRect.mLeft + mVisibleTextRect.mLeft - scrolled_view_rect.mLeft,
- line.mRect.mTop - scrolled_view_rect.mBottom + mVisibleTextRect.mBottom,
- llmin(mDocumentView->getRect().getWidth(), line.mRect.mRight) - scrolled_view_rect.mLeft,
- line.mRect.mBottom - scrolled_view_rect.mBottom + mVisibleTextRect.mBottom);
+ LLRect text_rect(line.mRect);
+ 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
S32 seg_start = line_start;
@@ -654,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() )
{
@@ -669,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())
{
@@ -716,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();
@@ -733,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);
@@ -856,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() );
@@ -993,14 +993,28 @@ void LLTextBase::draw()
updateScrollFromCursor();
}
- LLRect doc_rect;
+ LLRect text_rect;
if (mScroller)
{
- mScroller->localRectToOtherView(mScroller->getContentWindowRect(), &doc_rect, this);
+ mScroller->localRectToOtherView(mScroller->getContentWindowRect(), &text_rect, this);
}
else
{
- doc_rect = getLocalRect();
+ LLRect visible_lines_rect;
+ std::pair<S32, S32> line_range = getVisibleLines(mClipPartial);
+ for (S32 i = line_range.first; i < line_range.second; i++)
+ {
+ if (visible_lines_rect.isEmpty())
+ {
+ visible_lines_rect = mLineInfoList[i].mRect;
+ }
+ else
+ {
+ visible_lines_rect.unionWith(mLineInfoList[i].mRect);
+ }
+ }
+ text_rect = visible_lines_rect;
+ text_rect.translate(mDocumentView->getRect().mLeft, mDocumentView->getRect().mBottom);
}
if (mBGVisible)
@@ -1010,28 +1024,37 @@ void LLTextBase::draw()
LLRect bg_rect = mVisibleTextRect;
if (mScroller)
{
- bg_rect.intersectWith(doc_rect);
+ bg_rect.intersectWith(text_rect);
}
LLColor4 bg_color = mReadOnly
? mReadOnlyBgColor.get()
: hasFocus()
? mFocusBgColor.get()
: mWriteableBgColor.get();
- gl_rect_2d(doc_rect, bg_color % alpha, TRUE);
+ gl_rect_2d(text_rect, bg_color % alpha, TRUE);
}
- // draw document view
- LLUICtrl::draw();
-
- {
- // only clip if we support scrolling...
- // since convention is that text boxes never vertically truncate their contents
- // regardless of rect bounds
- LLLocalClipRect clip(doc_rect, mScroller != NULL);
+ bool should_clip = mClip || mScroller != NULL;
+ { LLLocalClipRect clip(text_rect, should_clip);
+
+ // draw document view
+ if (mScroller)
+ {
+ drawChild(mScroller);
+ }
+ else
+ {
+ drawChild(mDocumentView);
+ }
+
drawSelectionBackground();
drawText();
drawCursor();
}
+
+ mDocumentView->setVisible(FALSE);
+ LLUICtrl::draw();
+ mDocumentView->setVisible(TRUE);
}
@@ -1095,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));
}
@@ -1140,7 +1162,7 @@ void LLTextBase::reflow()
S32 first_line = getFirstVisibleLine();
// if scroll anchor not on first line, update it to first character of first line
- if (!mLineInfoList.empty()
+ if ((first_line < mLineInfoList.size())
&& (mScrollIndex < mLineInfoList[first_line].mDocIndexStart
|| mScrollIndex >= mLineInfoList[first_line].mDocIndexEnd))
{
@@ -1342,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;
@@ -1354,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;
@@ -1415,7 +1437,7 @@ S32 LLTextBase::getFirstVisibleLine() const
return iter - mLineInfoList.begin();
}
-std::pair<S32, S32> LLTextBase::getVisibleLines(bool fully_visible)
+std::pair<S32, S32> LLTextBase::getVisibleLines(bool require_fully_visible)
{
LLRect visible_region = getVisibleDocumentRect();
line_list_t::const_iterator first_iter;
@@ -1424,14 +1446,14 @@ std::pair<S32, S32> LLTextBase::getVisibleLines(bool fully_visible)
// make sure we have an up-to-date mLineInfoList
reflow();
- if (fully_visible)
+ if (require_fully_visible)
{
first_iter = std::lower_bound(mLineInfoList.begin(), mLineInfoList.end(), visible_region.mTop, compare_top());
- last_iter = std::lower_bound(mLineInfoList.begin(), mLineInfoList.end(), visible_region.mBottom, compare_bottom());
+ last_iter = std::upper_bound(mLineInfoList.begin(), mLineInfoList.end(), visible_region.mBottom, compare_bottom());
}
else
{
- first_iter = std::lower_bound(mLineInfoList.begin(), mLineInfoList.end(), visible_region.mTop, compare_bottom());
+ first_iter = std::upper_bound(mLineInfoList.begin(), mLineInfoList.end(), visible_region.mTop, compare_bottom());
last_iter = std::lower_bound(mLineInfoList.begin(), mLineInfoList.end(), visible_region.mBottom, compare_top());
}
return std::pair<S32, S32>(first_iter - mLineInfoList.begin(), last_iter - mLineInfoList.begin());
@@ -1632,8 +1654,11 @@ 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);
+
start = match.getStart();
end = match.getEnd()+1;
@@ -1655,10 +1680,6 @@ void LLTextBase::appendTextImpl(const std::string &new_text, const LLStyle::Para
std::string subtext=text.substr(0,start);
appendAndHighlightText(subtext, part, style_params);
}
-
- // inserts an avatar icon preceding the Url if appropriate
- LLTextUtil::processUrlMatch(&match,this);
-
// output the styled Url
appendAndHighlightTextImpl(match.getLabel(), part, link_params, match.underlineOnHoverOnly());
@@ -1926,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
@@ -1937,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())
{
@@ -1947,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;
@@ -1969,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;
@@ -1998,11 +2022,10 @@ S32 LLTextBase::getDocIndexFromLocalCoord( S32 local_x, S32 local_y, BOOL round,
pos = segment_line_start + offset;
break;
}
- else if (hit_past_end_of_line && segmentp->getEnd() > line_iter->mDocIndexEnd - 1)
+ else if (hit_past_end_of_line && segmentp->getEnd() >= line_iter->mDocIndexEnd)
{
// segment wraps to next line, so just set doc pos to the end of the line
- // segment wraps to next line, so just set doc pos to start of next line (represented by mDocIndexEnd)
- pos = llmin(getLength(), line_iter->mDocIndexEnd);
+ pos = llclamp(line_iter->mDocIndexEnd - 1, 0, getLength());
break;
}
start_x += text_width;
@@ -2405,10 +2428,37 @@ LLRect LLTextBase::getVisibleDocumentRect() const
{
return mScroller->getVisibleContentRect();
}
- else
+ else if (mClip)
{
- // entire document rect is visible when not scrolling
+ LLRect visible_text_rect = getVisibleTextRect();
+ LLRect doc_rect = mDocumentView->getRect();
+ visible_text_rect.translate(-doc_rect.mLeft, -doc_rect.mBottom);
+
+ // reject partially visible lines
+ LLRect visible_lines_rect;
+ for (line_list_t::const_iterator it = mLineInfoList.begin(), end_it = mLineInfoList.end();
+ it != end_it;
+ ++it)
+ {
+ bool line_visible = mClipPartial ? visible_text_rect.contains(it->mRect) : visible_text_rect.overlaps(it->mRect);
+ if (line_visible)
+ {
+ if (visible_lines_rect.isEmpty())
+ {
+ visible_lines_rect = it->mRect;
+ }
+ else
+ {
+ visible_lines_rect.unionWith(it->mRect);
+ }
+ }
+ }
+ return visible_lines_rect;
+ }
+ else
+ { // entire document rect is visible
// but offset according to height of widget
+
LLRect doc_rect = mDocumentView->getLocalRect();
doc_rect.mLeft -= mDocumentView->getRect().mLeft;
// adjust for height of text above widget baseline
@@ -2526,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);
@@ -2552,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 )
@@ -2569,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;
}
@@ -2914,11 +2964,18 @@ bool LLImageTextSegment::getDimensions(S32 first_char, S32 num_chars, S32& width
S32 LLImageTextSegment::getNumChars(S32 num_pixels, S32 segment_offset, S32 line_offset, S32 max_chars) const
{
LLUIImagePtr image = mStyle->getImage();
+
+ if (image.isNull())
+ {
+ return 1;
+ }
+
S32 image_width = image->getWidth();
if(line_offset == 0 || num_pixels>image_width + IMAGE_HPAD)
{
return 1;
}
+
return 0;
}
@@ -2928,18 +2985,21 @@ F32 LLImageTextSegment::draw(S32 start, S32 end, S32 selection_start, S32 select
{
LLColor4 color = LLColor4::white % mEditor.getDrawContext().mAlpha;
LLUIImagePtr image = mStyle->getImage();
- S32 style_image_height = image->getHeight();
- S32 style_image_width = image->getWidth();
- // Text is drawn from the top of the draw_rect downward
-
- S32 text_center = draw_rect.mTop - (draw_rect.getHeight() / 2);
- // Align image to center of draw rect
- S32 image_bottom = text_center - (style_image_height / 2);
- image->draw(draw_rect.mLeft, image_bottom,
- style_image_width, style_image_height, color);
-
- const S32 IMAGE_HPAD = 3;
- return draw_rect.mLeft + style_image_width + IMAGE_HPAD;
+ if (image.notNull())
+ {
+ S32 style_image_height = image->getHeight();
+ S32 style_image_width = image->getWidth();
+ // Text is drawn from the top of the draw_rect downward
+
+ S32 text_center = draw_rect.mTop - (draw_rect.getHeight() / 2);
+ // Align image to center of draw rect
+ S32 image_bottom = text_center - (style_image_height / 2);
+ image->draw(draw_rect.mLeft, image_bottom,
+ style_image_width, style_image_height, color);
+
+ const S32 IMAGE_HPAD = 3;
+ return draw_rect.mLeft + style_image_width + IMAGE_HPAD;
+ }
}
return 0.0;
}
diff --git a/indra/llui/lltextbase.h b/indra/llui/lltextbase.h
index aafcf8ceb0..7d545a1ba6 100644
--- a/indra/llui/lltextbase.h
+++ b/indra/llui/lltextbase.h
@@ -265,6 +265,7 @@ public:
use_ellipses,
parse_urls,
parse_highlights,
+ clip,
clip_partial;
Optional<S32> v_pad,
@@ -338,7 +339,7 @@ public:
void addDocumentChild(LLView* view);
void removeDocumentChild(LLView* view);
const LLView* getDocumentView() const { return mDocumentView; }
- LLRect getVisibleTextRect() { return mVisibleTextRect; }
+ LLRect getVisibleTextRect() const { return mVisibleTextRect; }
LLRect getTextBoundingRect();
LLRect getVisibleDocumentRect() const;
@@ -552,6 +553,7 @@ protected:
bool mTrackEnd; // if true, keeps scroll position at end of document during resize
bool mReadOnly;
bool mBGVisible; // render background?
+ bool mClip; // clip text to widget rect
bool mClipPartial; // false if we show lines that are partially inside bounding rect
bool mPlainText; // didn't use Image or Icon segments
S32 mMaxTextByteLength; // Maximum length mText is allowed to be in bytes
diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp
index 5a46c7c98e..9bd445988d 100644
--- a/indra/llui/lltexteditor.cpp
+++ b/indra/llui/lltexteditor.cpp
@@ -592,6 +592,10 @@ void LLTextEditor::indentSelectedLines( S32 spaces )
}
}
+ // Disabling parsing on the fly to avoid updating text segments
+ // until all indentation commands are executed.
+ mParseOnTheFly = FALSE;
+
// Find each start-of-line and indent it
do
{
@@ -617,6 +621,8 @@ void LLTextEditor::indentSelectedLines( S32 spaces )
}
while( cur < right );
+ mParseOnTheFly = TRUE;
+
if( (right < getLength()) && (text[right] == '\n') )
{
right++;
diff --git a/indra/llui/lltransutil.cpp b/indra/llui/lltransutil.cpp
index 9d0ff9d5cb..58fa8a0828 100644
--- a/indra/llui/lltransutil.cpp
+++ b/indra/llui/lltransutil.cpp
@@ -26,10 +26,11 @@
#include "linden_common.h"
+#include "lltransutil.h"
+
#include "lltrans.h"
#include "lluictrlfactory.h"
-
-#include "lltransutil.h"
+#include "llxmlnode.h"
bool LLTransUtil::parseStrings(const std::string& xml_filename, const std::set<std::string>& default_args)
diff --git a/indra/llui/llui.cpp b/indra/llui/llui.cpp
index 87669574c2..8020ca802b 100644
--- a/indra/llui/llui.cpp
+++ b/indra/llui/llui.cpp
@@ -1626,8 +1626,8 @@ void LLUI::cleanupClass()
{
if(sImageProvider)
{
- sImageProvider->cleanUp();
- }
+ sImageProvider->cleanUp();
+}
}
void LLUI::setPopupFuncs(const add_popup_t& add_popup, const remove_popup_t& remove_popup, const clear_popups_t& clear_popups)
@@ -2074,32 +2074,32 @@ const LLView* LLUI::resolvePath(const LLView* context, const std::string& path)
namespace LLInitParam
{
- TypedParam<LLUIColor >::TypedParam(BlockDescriptor& descriptor, const char* name, const LLUIColor& value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count)
- : super_t(descriptor, name, value, func, min_count, max_count),
+ ParamValue<LLUIColor, TypeValues<LLUIColor> >::ParamValue(const LLUIColor& color)
+ : super_t(color),
red("red"),
green("green"),
blue("blue"),
alpha("alpha"),
control("")
{
- setBlockFromValue();
+ updateBlockFromValue();
}
- void TypedParam<LLUIColor>::setValueFromBlock() const
+ void ParamValue<LLUIColor, TypeValues<LLUIColor> >::updateValueFromBlock()
{
if (control.isProvided())
{
- mData.mValue = LLUIColorTable::instance().getColor(control);
+ updateValue(LLUIColorTable::instance().getColor(control));
}
else
{
- mData.mValue = LLColor4(red, green, blue, alpha);
+ updateValue(LLColor4(red, green, blue, alpha));
}
}
- void TypedParam<LLUIColor>::setBlockFromValue()
+ void ParamValue<LLUIColor, TypeValues<LLUIColor> >::updateBlockFromValue()
{
- LLColor4 color = mData.mValue.get();
+ LLColor4 color = getValue();
red.set(color.mV[VRED], false);
green.set(color.mV[VGREEN], false);
blue.set(color.mV[VBLUE], false);
@@ -2107,38 +2107,32 @@ namespace LLInitParam
control.set("", false);
}
- void TypeValues<LLUIColor>::declareValues()
- {
- declare("white", LLColor4::white);
- declare("black", LLColor4::black);
- declare("red", LLColor4::red);
- declare("green", LLColor4::green);
- declare("blue", LLColor4::blue);
- }
-
bool ParamCompare<const LLFontGL*, false>::equals(const LLFontGL* a, const LLFontGL* b)
{
return !(a->getFontDesc() < b->getFontDesc())
&& !(b->getFontDesc() < a->getFontDesc());
}
- TypedParam<const LLFontGL*>::TypedParam(BlockDescriptor& descriptor, const char* _name, const LLFontGL*const value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count)
- : super_t(descriptor, _name, value, func, min_count, max_count),
+ ParamValue<const LLFontGL*, TypeValues<const LLFontGL*> >::ParamValue(const LLFontGL* fontp)
+ : super_t(fontp),
name("name"),
size("size"),
style("style")
{
- setBlockFromValue();
+ if (!fontp)
+ {
+ updateValue(LLFontGL::getFontDefault());
+ }
addSynonym(name, "");
- setBlockFromValue();
+ updateBlockFromValue();
}
- void TypedParam<const LLFontGL*>::setValueFromBlock() const
+ void ParamValue<const LLFontGL*, TypeValues<const LLFontGL*> >::updateValueFromBlock()
{
const LLFontGL* res_fontp = LLFontGL::getFontByName(name);
if (res_fontp)
{
- mData.mValue = res_fontp;
+ updateValue(res_fontp);
return;
}
@@ -2148,22 +2142,26 @@ namespace LLInitParam
const LLFontGL* fontp = LLFontGL::getFont(desc);
if (fontp)
{
- mData.mValue = fontp;
- }
+ updateValue(fontp);
+ }
+ else
+ {
+ updateValue(LLFontGL::getFontDefault());
+ }
}
- void TypedParam<const LLFontGL*>::setBlockFromValue()
+ void ParamValue<const LLFontGL*, TypeValues<const LLFontGL*> >::updateBlockFromValue()
{
- if (mData.mValue)
+ if (getValue())
{
- name.set(LLFontGL::nameFromFont(mData.mValue), false);
- size.set(LLFontGL::sizeFromFont(mData.mValue), false);
- style.set(LLFontGL::getStringFromStyle(mData.mValue->getFontDesc().getStyle()), false);
+ name.set(LLFontGL::nameFromFont(getValue()), false);
+ size.set(LLFontGL::sizeFromFont(getValue()), false);
+ style.set(LLFontGL::getStringFromStyle(getValue()->getFontDesc().getStyle()), false);
}
}
- TypedParam<LLRect>::TypedParam(BlockDescriptor& descriptor, const char* name, const LLRect& value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count)
- : super_t(descriptor, name, value, func, min_count, max_count),
+ ParamValue<LLRect, TypeValues<LLRect> >::ParamValue(const LLRect& rect)
+ : super_t(rect),
left("left"),
top("top"),
right("right"),
@@ -2171,10 +2169,10 @@ namespace LLInitParam
width("width"),
height("height")
{
- setBlockFromValue();
+ updateBlockFromValue();
}
- void TypedParam<LLRect>::setValueFromBlock() const
+ void ParamValue<LLRect, TypeValues<LLRect> >::updateValueFromBlock()
{
LLRect rect;
@@ -2235,40 +2233,41 @@ namespace LLInitParam
rect.mBottom = bottom;
rect.mTop = top;
}
- mData.mValue = rect;
+ updateValue(rect);
}
- void TypedParam<LLRect>::setBlockFromValue()
+ void ParamValue<LLRect, TypeValues<LLRect> >::updateBlockFromValue()
{
// because of the ambiguity in specifying a rect by position and/or dimensions
// we clear the "provided" flag so that values from xui/etc have priority
// over those calculated from the rect object
- left.set(mData.mValue.mLeft, false);
- right.set(mData.mValue.mRight, false);
- bottom.set(mData.mValue.mBottom, false);
- top.set(mData.mValue.mTop, false);
- width.set(mData.mValue.getWidth(), false);
- height.set(mData.mValue.getHeight(), false);
+ LLRect& value = getValue();
+ left.set(value.mLeft, false);
+ right.set(value.mRight, false);
+ bottom.set(value.mBottom, false);
+ top.set(value.mTop, false);
+ width.set(value.getWidth(), false);
+ height.set(value.getHeight(), false);
}
- TypedParam<LLCoordGL>::TypedParam(BlockDescriptor& descriptor, const char* name, LLCoordGL value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count)
- : super_t(descriptor, name, value, func, min_count, max_count),
+ ParamValue<LLCoordGL, TypeValues<LLCoordGL> >::ParamValue(const LLCoordGL& coord)
+ : super_t(coord),
x("x"),
y("y")
{
- setBlockFromValue();
+ updateBlockFromValue();
}
- void TypedParam<LLCoordGL>::setValueFromBlock() const
+ void ParamValue<LLCoordGL, TypeValues<LLCoordGL> >::updateValueFromBlock()
{
- mData.mValue.set(x, y);
+ updateValue(LLCoordGL(x, y));
}
- void TypedParam<LLCoordGL>::setBlockFromValue()
+ void ParamValue<LLCoordGL, TypeValues<LLCoordGL> >::updateBlockFromValue()
{
- x.set(mData.mValue.mX, false);
- y.set(mData.mValue.mY, false);
+ x.set(getValue().mX, false);
+ y.set(getValue().mY, false);
}
diff --git a/indra/llui/llui.h b/indra/llui/llui.h
index 50cb9e6632..c583d58d5a 100644
--- a/indra/llui/llui.h
+++ b/indra/llui/llui.h
@@ -33,15 +33,12 @@
#include "llrect.h"
#include "llcontrol.h"
#include "llcoord.h"
-#include "lluiimage.h" // *TODO: break this dependency, need to add #include "lluiimage.h" to all widgets that hold an Optional<LLUIImage*> in their paramblocks
#include "llinitparam.h"
#include "llregistry.h"
#include "lluicolor.h"
#include "lluicolortable.h"
#include <boost/signals2.hpp>
#include "lllazyvalue.h"
-#include "llhandle.h" // *TODO: remove this dependency, added as a
- // convenience when LLHandle moved to llhandle.h
#include "llframetimer.h"
// LLUIFactory
@@ -265,8 +262,6 @@ private:
// Moved LLLocalClipRect to lllocalcliprect.h
-// Moved all LLHandle-related code to llhandle.h
-
//RN: maybe this needs to moved elsewhere?
class LLImageProviderInterface
{
@@ -398,10 +393,10 @@ public:
namespace LLInitParam
{
template<>
- class TypedParam<LLRect>
- : public BlockValue<LLRect>
+ class ParamValue<LLRect, TypeValues<LLRect> >
+ : public CustomParamValue<LLRect>
{
- typedef BlockValue<LLRect> super_t;
+ typedef CustomParamValue<LLRect> super_t;
public:
Optional<S32> left,
top,
@@ -410,62 +405,43 @@ namespace LLInitParam
width,
height;
- TypedParam(BlockDescriptor& descriptor, const char* name, const LLRect& value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count);
+ ParamValue(const LLRect& value);
- void setValueFromBlock() const;
- void setBlockFromValue();
+ void updateValueFromBlock();
+ void updateBlockFromValue();
};
template<>
- struct TypeValues<LLUIColor> : public TypeValuesHelper<LLUIColor>
+ class ParamValue<LLUIColor, TypeValues<LLUIColor> >
+ : public CustomParamValue<LLUIColor>
{
- static void declareValues();
- };
+ typedef CustomParamValue<LLUIColor> super_t;
- template<>
- class TypedParam<LLUIColor>
- : public BlockValue<LLUIColor>
- {
- typedef BlockValue<LLUIColor> super_t;
public:
- Optional<F32> red,
- green,
- blue,
- alpha;
- Optional<std::string> control;
-
- TypedParam(BlockDescriptor& descriptor, const char* name, const LLUIColor& value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count);
- void setValueFromBlock() const;
- void setBlockFromValue();
+ Optional<F32> red,
+ green,
+ blue,
+ alpha;
+ Optional<std::string> control;
+
+ ParamValue(const LLUIColor& color);
+ void updateValueFromBlock();
+ void updateBlockFromValue();
};
- // provide a better default for Optional<const LLFontGL*> than NULL
- template <>
- struct DefaultInitializer<const LLFontGL*>
- {
- // return reference to a single default instance of T
- // built-in types will be initialized to zero, default constructor otherwise
- static const LLFontGL* get()
- {
- static const LLFontGL* sDefaultFont = LLFontGL::getFontDefault();
- return sDefaultFont;
- }
- };
-
-
template<>
- class TypedParam<const LLFontGL*>
- : public BlockValue<const LLFontGL*>
+ class ParamValue<const LLFontGL*, TypeValues<const LLFontGL*> >
+ : public CustomParamValue<const LLFontGL* >
{
- typedef BlockValue<const LLFontGL*> super_t;
+ typedef CustomParamValue<const LLFontGL*> super_t;
public:
Optional<std::string> name,
size,
style;
- TypedParam(BlockDescriptor& descriptor, const char* name, const LLFontGL* const value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count);
- void setValueFromBlock() const;
- void setBlockFromValue();
+ ParamValue(const LLFontGL* value);
+ void updateValueFromBlock();
+ void updateBlockFromValue();
};
template<>
@@ -494,17 +470,17 @@ namespace LLInitParam
template<>
- class TypedParam<LLCoordGL>
- : public BlockValue<LLCoordGL>
+ class ParamValue<LLCoordGL, TypeValues<LLCoordGL> >
+ : public CustomParamValue<LLCoordGL>
{
- typedef BlockValue<LLCoordGL> super_t;
+ typedef CustomParamValue<LLCoordGL> super_t;
public:
Optional<S32> x,
y;
- TypedParam(BlockDescriptor& descriptor, const char* name, LLCoordGL value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count);
- void setValueFromBlock() const;
- void setBlockFromValue();
+ ParamValue(const LLCoordGL& val);
+ void updateValueFromBlock();
+ void updateBlockFromValue();
};
}
diff --git a/indra/llui/lluiimage.cpp b/indra/llui/lluiimage.cpp
index 1ffad4806e..f37947a50b 100644
--- a/indra/llui/lluiimage.cpp
+++ b/indra/llui/lluiimage.cpp
@@ -155,32 +155,32 @@ void LLUIImage::onImageLoaded()
namespace LLInitParam
{
- void TypedParam<LLUIImage*>::setValueFromBlock() const
+ void ParamValue<LLUIImage*, TypeValues<LLUIImage*> >::updateValueFromBlock()
{
// The keyword "none" is specifically requesting a null image
// do not default to current value. Used to overwrite template images.
if (name() == "none")
{
- mData.mValue = NULL;
+ updateValue(NULL);
return;
}
LLUIImage* imagep = LLUI::getUIImage(name());
if (imagep)
{
- mData.mValue = imagep;
+ updateValue(imagep);
}
}
- void TypedParam<LLUIImage*>::setBlockFromValue()
+ void ParamValue<LLUIImage*, TypeValues<LLUIImage*> >::updateBlockFromValue()
{
- if (mData.mValue == NULL)
+ if (getValue() == NULL)
{
name.set("none", false);
}
else
{
- name.set(mData.mValue->getName(), false);
+ name.set(getValue()->getName(), false);
}
}
diff --git a/indra/llui/lluiimage.h b/indra/llui/lluiimage.h
index 38107c112d..139d88e0ac 100644
--- a/indra/llui/lluiimage.h
+++ b/indra/llui/lluiimage.h
@@ -92,22 +92,23 @@ protected:
namespace LLInitParam
{
template<>
- class TypedParam<LLUIImage*, TypeValues<LLUIImage*>, false>
- : public BlockValue<LLUIImage*>
+ class ParamValue<LLUIImage*, TypeValues<LLUIImage*> >
+ : public CustomParamValue<LLUIImage*>
{
typedef boost::add_reference<boost::add_const<LLUIImage*>::type>::type T_const_ref;
- typedef BlockValue<LLUIImage*> super_t;
+ typedef CustomParamValue<LLUIImage*> super_t;
public:
Optional<std::string> name;
- TypedParam(BlockDescriptor& descriptor, const char* name, super_t::value_assignment_t value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count)
- : super_t(descriptor, name, value, func, min_count, max_count)
+ ParamValue(LLUIImage* const& image)
+ : super_t(image)
{
- setBlockFromValue();
+ updateBlockFromValue();
+ addSynonym(name, "name");
}
- void setValueFromBlock() const;
- void setBlockFromValue();
+ void updateValueFromBlock();
+ void updateBlockFromValue();
};
// Need custom comparison function for our test app, which only loads
diff --git a/indra/llui/llview.cpp b/indra/llui/llview.cpp
index d73e87129e..245126d178 100644
--- a/indra/llui/llview.cpp
+++ b/indra/llui/llview.cpp
@@ -114,7 +114,8 @@ LLView::Params::Params()
}
LLView::LLView(const LLView::Params& p)
-: mName(p.name),
+: mVisible(p.visible),
+ mName(p.name),
mParentView(NULL),
mReshapeFlags(FOLLOWS_NONE),
mFromXUI(p.from_xui),
@@ -123,7 +124,6 @@ LLView::LLView(const LLView::Params& p)
mNextInsertionOrdinal(0),
mHoverCursor(getCursorFromString(p.hover_cursor)),
mEnabled(p.enabled),
- mVisible(p.visible),
mMouseOpaque(p.mouse_opaque),
mSoundFlags(p.sound_flags),
mUseBoundingRect(p.use_bounding_rect),
@@ -1299,7 +1299,13 @@ void LLView::drawChildren()
{
if (!mChildList.empty())
{
- LLRect rootRect = getRootView()->getRect();
+ static const LLRect* rootRect = NULL;
+
+ if (!mParentView)
+ {
+ rootRect = &mRect;
+ }
+
LLRect screenRect;
++sDepth;
@@ -1313,7 +1319,7 @@ void LLView::drawChildren()
{
// Only draw views that are within the root view
localRectToScreen(viewp->getRect(),&screenRect);
- if ( rootRect.overlaps(screenRect) && LLUI::sDirtyRect.overlaps(screenRect))
+ if ( rootRect->overlaps(screenRect) && LLUI::sDirtyRect.overlaps(screenRect))
{
LLUI::pushMatrix();
{
diff --git a/indra/llui/llview.h b/indra/llui/llview.h
index 61dc4b8030..594a5eec6b 100644
--- a/indra/llui/llview.h
+++ b/indra/llui/llview.h
@@ -34,6 +34,7 @@
#include "stdtypes.h"
#include "llcoord.h"
#include "llfontgl.h"
+#include "llhandle.h"
#include "llmortician.h"
#include "llmousehandler.h"
#include "llstring.h"
@@ -287,7 +288,7 @@ public:
void setAllChildrenEnabled(BOOL b);
virtual void setVisible(BOOL visible);
- BOOL getVisible() const { return mVisible; }
+ const BOOL& getVisible() const { return mVisible; }
virtual void setEnabled(BOOL enabled);
BOOL getEnabled() const { return mEnabled; }
/// 'available' in this context means 'visible and enabled': in other
@@ -543,11 +544,13 @@ private:
LLView* mParentView;
child_list_t mChildList;
- std::string mName;
// location in pixels, relative to surrounding structure, bottom,left=0,0
+ BOOL mVisible;
LLRect mRect;
LLRect mBoundingRect;
+
std::string mLayout;
+ std::string mName;
U32 mReshapeFlags;
@@ -569,8 +572,6 @@ private:
LLRootHandle<LLView> mHandle;
BOOL mLastVisible;
- BOOL mVisible;
-
S32 mNextInsertionOrdinal;
static LLWindow* sWindow; // All root views must know about their window.
diff --git a/indra/llui/llviewborder.cpp b/indra/llui/llviewborder.cpp
index 89cd34c37c..32d7ea7c25 100644
--- a/indra/llui/llviewborder.cpp
+++ b/indra/llui/llviewborder.cpp
@@ -28,6 +28,7 @@
#include "llrender.h"
#include "llfocusmgr.h"
#include "lluictrlfactory.h"
+#include "lluiimage.h"
static LLDefaultChildRegistry::Register<LLViewBorder> r("view_border");
diff --git a/indra/llui/llwindowshade.h b/indra/llui/llwindowshade.h
index 0047195929..09ffc2cd54 100644
--- a/indra/llui/llwindowshade.h
+++ b/indra/llui/llwindowshade.h
@@ -29,6 +29,7 @@
#include "lluictrl.h"
#include "llnotifications.h"
+#include "lluiimage.h"
class LLWindowShade : public LLUICtrl
{
diff --git a/indra/llui/tests/llurlentry_stub.cpp b/indra/llui/tests/llurlentry_stub.cpp
index ac2412c928..26b3b17577 100644
--- a/indra/llui/tests/llurlentry_stub.cpp
+++ b/indra/llui/tests/llurlentry_stub.cpp
@@ -114,32 +114,30 @@ namespace LLInitParam
const U8* block_addr = reinterpret_cast<const U8*>(enclosing_block);
mEnclosingBlockOffset = (U16)(my_addr - block_addr);
}
- void BaseBlock::setLastChangedParam(const Param& last_param, bool user_provided) {}
+ void BaseBlock::paramChanged(const Param& last_param, bool user_provided) {}
- void BaseBlock::addParam(BlockDescriptor& block_data, const ParamDescriptor& in_param, const char* char_name){}
+ void BaseBlock::addParam(BlockDescriptor& block_data, const ParamDescriptorPtr in_param, const char* char_name){}
+ void BaseBlock::addSynonym(Param& param, const std::string& synonym) {}
param_handle_t BaseBlock::getHandleFromParam(const Param* param) const {return 0;}
void BaseBlock::init(BlockDescriptor& descriptor, BlockDescriptor& base_descriptor, size_t block_size)
{
descriptor.mCurrentBlockPtr = this;
}
- bool BaseBlock::deserializeBlock(Parser& p, Parser::name_stack_range_t name_stack){ return true; }
- bool BaseBlock::serializeBlock(Parser& parser, Parser::name_stack_t name_stack, const LLInitParam::BaseBlock* diff_block) const { return true; }
- bool BaseBlock::inspectBlock(Parser& parser, Parser::name_stack_t name_stack) const { return true; }
- bool BaseBlock::merge(BlockDescriptor& block_data, const BaseBlock& other, bool overwrite) { return true; }
+ bool BaseBlock::deserializeBlock(Parser& p, Parser::name_stack_range_t name_stack, S32 generation){ return true; }
+ void BaseBlock::serializeBlock(Parser& parser, Parser::name_stack_t name_stack, const LLInitParam::BaseBlock* diff_block) const {}
+ bool BaseBlock::inspectBlock(Parser& parser, Parser::name_stack_t name_stack, S32 min_value, S32 max_value) const { return true; }
+ bool BaseBlock::mergeBlock(BlockDescriptor& block_data, const BaseBlock& other, bool overwrite) { return true; }
bool BaseBlock::validateBlock(bool emit_errors) const { return true; }
- TypedParam<LLUIColor >::TypedParam(BlockDescriptor& descriptor, const char* name, const LLUIColor& value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count)
- : super_t(descriptor, name, value, func, min_count, max_count)
+ ParamValue<LLUIColor, TypeValues<LLUIColor> >::ParamValue(const LLUIColor& color)
+ : super_t(color)
{}
- void TypedParam<LLUIColor>::setValueFromBlock() const
+ void ParamValue<LLUIColor, TypeValues<LLUIColor> >::updateValueFromBlock()
{}
- void TypedParam<LLUIColor>::setBlockFromValue()
- {}
-
- void TypeValues<LLUIColor>::declareValues()
+ void ParamValue<LLUIColor, TypeValues<LLUIColor> >::updateBlockFromValue()
{}
bool ParamCompare<const LLFontGL*, false>::equals(const LLFontGL* a, const LLFontGL* b)
@@ -147,14 +145,14 @@ namespace LLInitParam
return false;
}
- TypedParam<const LLFontGL*>::TypedParam(BlockDescriptor& descriptor, const char* _name, const LLFontGL*const value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count)
- : super_t(descriptor, _name, value, func, min_count, max_count)
+ ParamValue<const LLFontGL*, TypeValues<const LLFontGL*> >::ParamValue(const LLFontGL* fontp)
+ : super_t(fontp)
{}
- void TypedParam<const LLFontGL*>::setValueFromBlock() const
+ void ParamValue<const LLFontGL*, TypeValues<const LLFontGL*> >::updateValueFromBlock()
{}
- void TypedParam<const LLFontGL*>::setBlockFromValue()
+ void ParamValue<const LLFontGL*, TypeValues<const LLFontGL*> >::updateBlockFromValue()
{}
void TypeValues<LLFontGL::HAlign>::declareValues()
@@ -166,10 +164,10 @@ namespace LLInitParam
void TypeValues<LLFontGL::ShadowType>::declareValues()
{}
- void TypedParam<LLUIImage*>::setValueFromBlock() const
+ void ParamValue<LLUIImage*, TypeValues<LLUIImage*> >::updateValueFromBlock()
{}
- void TypedParam<LLUIImage*>::setBlockFromValue()
+ void ParamValue<LLUIImage*, TypeValues<LLUIImage*> >::updateBlockFromValue()
{}
diff --git a/indra/llui/tests/llurlentry_test.cpp b/indra/llui/tests/llurlentry_test.cpp
index 8f0a48018f..2f814f4200 100644
--- a/indra/llui/tests/llurlentry_test.cpp
+++ b/indra/llui/tests/llurlentry_test.cpp
@@ -70,6 +70,22 @@ S32 LLUIImage::getHeight() const
return 0;
}
+namespace LLInitParam
+{
+ S32 Parser::sNextParseGeneration = 0;
+ BlockDescriptor::BlockDescriptor() {}
+ ParamDescriptor::ParamDescriptor(param_handle_t p,
+ merge_func_t merge_func,
+ deserialize_func_t deserialize_func,
+ serialize_func_t serialize_func,
+ validation_func_t validation_func,
+ inspect_func_t inspect_func,
+ S32 min_count,
+ S32 max_count){}
+ ParamDescriptor::~ParamDescriptor() {}
+
+}
+
namespace tut
{
struct LLUrlEntryData
diff --git a/indra/llui/tests/llurlmatch_test.cpp b/indra/llui/tests/llurlmatch_test.cpp
index fdaab00f18..e09ef33d49 100644
--- a/indra/llui/tests/llurlmatch_test.cpp
+++ b/indra/llui/tests/llurlmatch_test.cpp
@@ -66,11 +66,25 @@ namespace LLInitParam
BaseBlock::BaseBlock() {}
BaseBlock::~BaseBlock() {}
- void BaseBlock::setLastChangedParam(const Param& last_param, bool user_provided) {}
-
- void BaseBlock::addParam(BlockDescriptor& block_data, const ParamDescriptor& in_param, const char* char_name){}
+ S32 Parser::sNextParseGeneration = 0;
+
+ BlockDescriptor::BlockDescriptor() {}
+ ParamDescriptor::ParamDescriptor(param_handle_t p,
+ merge_func_t merge_func,
+ deserialize_func_t deserialize_func,
+ serialize_func_t serialize_func,
+ validation_func_t validation_func,
+ inspect_func_t inspect_func,
+ S32 min_count,
+ S32 max_count){}
+ ParamDescriptor::~ParamDescriptor() {}
+
+ void BaseBlock::paramChanged(const Param& last_param, bool user_provided) {}
+
+ void BaseBlock::addParam(BlockDescriptor& block_data, const ParamDescriptorPtr in_param, const char* char_name){}
param_handle_t BaseBlock::getHandleFromParam(const Param* param) const {return 0;}
-
+ void BaseBlock::addSynonym(Param& param, const std::string& synonym) {}
+
void BaseBlock::init(BlockDescriptor& descriptor, BlockDescriptor& base_descriptor, size_t block_size)
{
descriptor.mCurrentBlockPtr = this;
@@ -84,23 +98,20 @@ namespace LLInitParam
mEnclosingBlockOffset = (U16)(my_addr - block_addr);
}
- bool BaseBlock::deserializeBlock(Parser& p, Parser::name_stack_range_t name_stack){ return true; }
- bool BaseBlock::serializeBlock(Parser& parser, Parser::name_stack_t name_stack, const LLInitParam::BaseBlock* diff_block) const { return true; }
- bool BaseBlock::inspectBlock(Parser& parser, Parser::name_stack_t name_stack) const { return true; }
- bool BaseBlock::merge(BlockDescriptor& block_data, const BaseBlock& other, bool overwrite) { return true; }
+ bool BaseBlock::deserializeBlock(Parser& p, Parser::name_stack_range_t name_stack, S32 generation){ return true; }
+ void BaseBlock::serializeBlock(Parser& parser, Parser::name_stack_t name_stack, const LLInitParam::BaseBlock* diff_block) const {}
+ bool BaseBlock::inspectBlock(Parser& parser, Parser::name_stack_t name_stack, S32 min_count, S32 max_count) const { return true; }
+ bool BaseBlock::mergeBlock(BlockDescriptor& block_data, const BaseBlock& other, bool overwrite) { return true; }
bool BaseBlock::validateBlock(bool emit_errors) const { return true; }
- TypedParam<LLUIColor >::TypedParam(BlockDescriptor& descriptor, const char* name, const LLUIColor& value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count)
- : super_t(descriptor, name, value, func, min_count, max_count)
+ ParamValue<LLUIColor, TypeValues<LLUIColor> >::ParamValue(const LLUIColor& color)
+ : super_t(color)
{}
- void TypedParam<LLUIColor>::setValueFromBlock() const
+ void ParamValue<LLUIColor, TypeValues<LLUIColor> >::updateValueFromBlock()
{}
- void TypedParam<LLUIColor>::setBlockFromValue()
- {}
-
- void TypeValues<LLUIColor>::declareValues()
+ void ParamValue<LLUIColor, TypeValues<LLUIColor> >::updateBlockFromValue()
{}
bool ParamCompare<const LLFontGL*, false>::equals(const LLFontGL* a, const LLFontGL* b)
@@ -108,14 +119,15 @@ namespace LLInitParam
return false;
}
- TypedParam<const LLFontGL*>::TypedParam(BlockDescriptor& descriptor, const char* _name, const LLFontGL*const value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count)
- : super_t(descriptor, _name, value, func, min_count, max_count)
+
+ ParamValue<const LLFontGL*, TypeValues<const LLFontGL*> >::ParamValue(const LLFontGL* fontp)
+ : super_t(fontp)
{}
- void TypedParam<const LLFontGL*>::setValueFromBlock() const
+ void ParamValue<const LLFontGL*, TypeValues<const LLFontGL*> >::updateValueFromBlock()
{}
- void TypedParam<const LLFontGL*>::setBlockFromValue()
+ void ParamValue<const LLFontGL*, TypeValues<const LLFontGL*> >::updateBlockFromValue()
{}
void TypeValues<LLFontGL::HAlign>::declareValues()
@@ -127,10 +139,10 @@ namespace LLInitParam
void TypeValues<LLFontGL::ShadowType>::declareValues()
{}
- void TypedParam<LLUIImage*>::setValueFromBlock() const
+ void ParamValue<LLUIImage*, TypeValues<LLUIImage*> >::updateValueFromBlock()
{}
- void TypedParam<LLUIImage*>::setBlockFromValue()
+ void ParamValue<LLUIImage*, TypeValues<LLUIImage*> >::updateBlockFromValue()
{}
bool ParamCompare<LLUIImage*, false>::equals(
diff --git a/indra/llvfs/CMakeLists.txt b/indra/llvfs/CMakeLists.txt
index 722f4e2bfd..b6d1ce61e5 100644
--- a/indra/llvfs/CMakeLists.txt
+++ b/indra/llvfs/CMakeLists.txt
@@ -12,6 +12,7 @@ include_directories(
set(llvfs_SOURCE_FILES
lldir.cpp
+ lldiriterator.cpp
lllfsthread.cpp
llpidlock.cpp
llvfile.cpp
@@ -24,6 +25,7 @@ set(llvfs_HEADER_FILES
lldir.h
lldirguard.h
+ lldiriterator.h
lllfsthread.h
llpidlock.h
llvfile.h
@@ -60,6 +62,11 @@ list(APPEND llvfs_SOURCE_FILES ${llvfs_HEADER_FILES})
add_library (llvfs ${llvfs_SOURCE_FILES})
+target_link_libraries(llvfs
+ ${BOOST_FILESYSTEM_LIBRARY}
+ ${BOOST_SYSTEM_LIBRARY}
+ )
+
if (DARWIN)
include(CMakeFindFrameworks)
find_library(CARBON_LIBRARY Carbon)
@@ -67,17 +74,17 @@ if (DARWIN)
endif (DARWIN)
-if(LL_TESTS)
- # Add 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}")
-endif(LL_TESTS)
+# 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}")
+endif (LL_TESTS)
diff --git a/indra/llvfs/lldir.cpp b/indra/llvfs/lldir.cpp
index 341c96f6ea..f3ac17d612 100644
--- a/indra/llvfs/lldir.cpp
+++ b/indra/llvfs/lldir.cpp
@@ -40,6 +40,8 @@
#include "lltimer.h" // ms_sleep()
#include "lluuid.h"
+#include "lldiriterator.h"
+
#if LL_WINDOWS
#include "lldir_win32.h"
LLDir_Win32 gDirUtil;
@@ -83,7 +85,9 @@ S32 LLDir::deleteFilesInDir(const std::string &dirname, const std::string &mask)
std::string filename;
std::string fullpath;
S32 result;
- while (getNextFileInDir(dirname, mask, filename))
+
+ LLDirIterator iter(dirname, mask);
+ while (iter.next(filename))
{
fullpath = dirname;
fullpath += getDirDelimiter();
diff --git a/indra/llvfs/lldir.h b/indra/llvfs/lldir.h
index 42996fd051..5ee8bdb542 100644
--- a/indra/llvfs/lldir.h
+++ b/indra/llvfs/lldir.h
@@ -75,31 +75,6 @@ class LLDir
// pure virtual functions
virtual U32 countFilesInDir(const std::string &dirname, const std::string &mask) = 0;
- /// Walk the files in a directory, with file pattern matching
- virtual BOOL getNextFileInDir(const std::string& dirname, ///< directory path - must end in trailing slash!
- const std::string& mask, ///< file pattern string (use "*" for all)
- std::string& fname ///< output: found file name
- ) = 0;
- /**<
- * @returns true if a file was found, false if the entire directory has been scanned.
- *
- * @note that this function is NOT thread safe
- *
- * This function may not be used to scan part of a directory, then start a new search of a different
- * directory, and then restart the first search where it left off; the entire search must run to
- * completion or be abandoned - there is no restart.
- *
- * @bug: See http://jira.secondlife.com/browse/VWR-23697
- * and/or the tests in test/lldir_test.cpp
- * This is known to fail with patterns that have both:
- * a wildcard left of a . and more than one sequential ? right of a .
- * the pattern foo.??x appears to work
- * but *.??x or foo?.??x do not
- *
- * @todo this really should be rewritten as an iterator object, and the
- * filtering should be done in a platform-independent way.
- */
-
virtual std::string getCurPath() = 0;
virtual BOOL fileExists(const std::string &filename) const = 0;
diff --git a/indra/llvfs/lldir_linux.cpp b/indra/llvfs/lldir_linux.cpp
index 73f2336f94..407f3b93fb 100644
--- a/indra/llvfs/lldir_linux.cpp
+++ b/indra/llvfs/lldir_linux.cpp
@@ -93,11 +93,11 @@ LLDir_Linux::LLDir_Linux()
#else
mAppRODataDir = tmp_str;
#endif
- std::string::size_type indra_pos = mExecutableDir.find("/indra");
- if (indra_pos != std::string::npos)
+ std::string::size_type build_dir_pos = mExecutableDir.rfind("/build-linux-");
+ if (build_dir_pos != std::string::npos)
{
// ...we're in a dev checkout
- mSkinBaseDir = mExecutableDir.substr(0, indra_pos) + "/indra/newview/skins";
+ mSkinBaseDir = mExecutableDir.substr(0, build_dir_pos) + "/indra/newview/skins";
llinfos << "Running in dev checkout with mSkinBaseDir "
<< mSkinBaseDir << llendl;
}
@@ -242,68 +242,6 @@ U32 LLDir_Linux::countFilesInDir(const std::string &dirname, const std::string &
return (file_count);
}
-// get the next file in the directory
-BOOL LLDir_Linux::getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname)
-{
- glob_t g;
- BOOL result = FALSE;
- fname = "";
-
- if(!(dirname == mCurrentDir))
- {
- // different dir specified, close old search
- mCurrentDirIndex = -1;
- mCurrentDirCount = -1;
- mCurrentDir = dirname;
- }
-
- std::string tmp_str;
- tmp_str = dirname;
- tmp_str += mask;
-
- if(glob(tmp_str.c_str(), GLOB_NOSORT, NULL, &g) == 0)
- {
- if(g.gl_pathc > 0)
- {
- if((int)g.gl_pathc != mCurrentDirCount)
- {
- // Number of matches has changed since the last search, meaning a file has been added or deleted.
- // Reset the index.
- mCurrentDirIndex = -1;
- mCurrentDirCount = g.gl_pathc;
- }
-
- mCurrentDirIndex++;
-
- if(mCurrentDirIndex < (int)g.gl_pathc)
- {
-// llinfos << "getNextFileInDir: returning number " << mCurrentDirIndex << ", path is " << g.gl_pathv[mCurrentDirIndex] << llendl;
-
- // The API wants just the filename, not the full path.
- //fname = g.gl_pathv[mCurrentDirIndex];
-
- char *s = strrchr(g.gl_pathv[mCurrentDirIndex], '/');
-
- if(s == NULL)
- s = g.gl_pathv[mCurrentDirIndex];
- else if(s[0] == '/')
- s++;
-
- fname = s;
-
- result = TRUE;
- }
- }
-
- globfree(&g);
- }
-
- return(result);
-}
-
-
-
-
std::string LLDir_Linux::getCurPath()
{
char tmp_str[LL_MAX_PATH]; /* Flawfinder: ignore */
diff --git a/indra/llvfs/lldir_linux.h b/indra/llvfs/lldir_linux.h
index a34de1241d..7603239867 100644
--- a/indra/llvfs/lldir_linux.h
+++ b/indra/llvfs/lldir_linux.h
@@ -47,7 +47,6 @@ public:
virtual std::string getCurPath();
virtual U32 countFilesInDir(const std::string &dirname, const std::string &mask);
- virtual BOOL getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname);
/*virtual*/ BOOL fileExists(const std::string &filename) const;
/*virtual*/ std::string getLLPluginLauncher();
diff --git a/indra/llvfs/lldir_mac.cpp b/indra/llvfs/lldir_mac.cpp
index 445285aa43..489bc3e4a7 100644
--- a/indra/llvfs/lldir_mac.cpp
+++ b/indra/llvfs/lldir_mac.cpp
@@ -150,11 +150,11 @@ LLDir_Mac::LLDir_Mac()
CFURLRef resourcesURLRef = CFBundleCopyResourcesDirectoryURL(mainBundleRef);
CFURLRefToLLString(resourcesURLRef, mAppRODataDir, true);
- U32 indra_pos = mExecutableDir.find("/indra");
- if (indra_pos != std::string::npos)
+ U32 build_dir_pos = mExecutableDir.rfind("/build-darwin-");
+ if (build_dir_pos != std::string::npos)
{
// ...we're in a dev checkout
- mSkinBaseDir = mExecutableDir.substr(0, indra_pos)
+ mSkinBaseDir = mExecutableDir.substr(0, build_dir_pos)
+ "/indra/newview/skins";
llinfos << "Running in dev checkout with mSkinBaseDir "
<< mSkinBaseDir << llendl;
@@ -258,99 +258,6 @@ U32 LLDir_Mac::countFilesInDir(const std::string &dirname, const std::string &ma
return (file_count);
}
-// get the next file in the directory
-BOOL LLDir_Mac::getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname)
-{
- glob_t g;
- BOOL result = FALSE;
- fname = "";
-
- if(!(dirname == mCurrentDir))
- {
- // different dir specified, close old search
- mCurrentDirIndex = -1;
- mCurrentDirCount = -1;
- mCurrentDir = dirname;
- }
-
- std::string tmp_str;
- tmp_str = dirname;
- tmp_str += mask;
-
- if(glob(tmp_str.c_str(), GLOB_NOSORT, NULL, &g) == 0)
- {
- if(g.gl_pathc > 0)
- {
- if(g.gl_pathc != mCurrentDirCount)
- {
- // Number of matches has changed since the last search, meaning a file has been added or deleted.
- // Reset the index.
- mCurrentDirIndex = -1;
- mCurrentDirCount = g.gl_pathc;
- }
-
- mCurrentDirIndex++;
-
- if(mCurrentDirIndex < g.gl_pathc)
- {
-// llinfos << "getNextFileInDir: returning number " << mCurrentDirIndex << ", path is " << g.gl_pathv[mCurrentDirIndex] << llendl;
-
- // The API wants just the filename, not the full path.
- //fname = g.gl_pathv[mCurrentDirIndex];
-
- char *s = strrchr(g.gl_pathv[mCurrentDirIndex], '/');
-
- if(s == NULL)
- s = g.gl_pathv[mCurrentDirIndex];
- else if(s[0] == '/')
- s++;
-
- fname = s;
-
- result = TRUE;
- }
- }
-
- globfree(&g);
- }
-
- return(result);
-}
-
-
-
-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 b456d3afca..d190d70be4 100644
--- a/indra/llvfs/lldir_mac.h
+++ b/indra/llvfs/lldir_mac.h
@@ -44,10 +44,8 @@ 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 getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname);
virtual BOOL fileExists(const std::string &filename) const;
/*virtual*/ std::string getLLPluginLauncher();
diff --git a/indra/llvfs/lldir_solaris.cpp b/indra/llvfs/lldir_solaris.cpp
index 515fd66b6e..21f8c3acdb 100644
--- a/indra/llvfs/lldir_solaris.cpp
+++ b/indra/llvfs/lldir_solaris.cpp
@@ -260,68 +260,6 @@ U32 LLDir_Solaris::countFilesInDir(const std::string &dirname, const std::string
return (file_count);
}
-// get the next file in the directory
-BOOL LLDir_Solaris::getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname)
-{
- glob_t g;
- BOOL result = FALSE;
- fname = "";
-
- if(!(dirname == mCurrentDir))
- {
- // different dir specified, close old search
- mCurrentDirIndex = -1;
- mCurrentDirCount = -1;
- mCurrentDir = dirname;
- }
-
- std::string tmp_str;
- tmp_str = dirname;
- tmp_str += mask;
-
- if(glob(tmp_str.c_str(), GLOB_NOSORT, NULL, &g) == 0)
- {
- if(g.gl_pathc > 0)
- {
- if((int)g.gl_pathc != mCurrentDirCount)
- {
- // Number of matches has changed since the last search, meaning a file has been added or deleted.
- // Reset the index.
- mCurrentDirIndex = -1;
- mCurrentDirCount = g.gl_pathc;
- }
-
- mCurrentDirIndex++;
-
- if(mCurrentDirIndex < (int)g.gl_pathc)
- {
-// llinfos << "getNextFileInDir: returning number " << mCurrentDirIndex << ", path is " << g.gl_pathv[mCurrentDirIndex] << llendl;
-
- // The API wants just the filename, not the full path.
- //fname = g.gl_pathv[mCurrentDirIndex];
-
- char *s = strrchr(g.gl_pathv[mCurrentDirIndex], '/');
-
- if(s == NULL)
- s = g.gl_pathv[mCurrentDirIndex];
- else if(s[0] == '/')
- s++;
-
- fname = s;
-
- result = TRUE;
- }
- }
-
- globfree(&g);
- }
-
- return(result);
-}
-
-
-
-
std::string LLDir_Solaris::getCurPath()
{
char tmp_str[LL_MAX_PATH]; /* Flawfinder: ignore */
diff --git a/indra/llvfs/lldir_solaris.h b/indra/llvfs/lldir_solaris.h
index 70fac6f818..0b58a45b15 100644
--- a/indra/llvfs/lldir_solaris.h
+++ b/indra/llvfs/lldir_solaris.h
@@ -47,7 +47,6 @@ public:
virtual std::string getCurPath();
virtual U32 countFilesInDir(const std::string &dirname, const std::string &mask);
- virtual BOOL getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname);
/*virtual*/ BOOL fileExists(const std::string &filename) const;
private:
diff --git a/indra/llvfs/lldir_win32.cpp b/indra/llvfs/lldir_win32.cpp
index 4e2a55f4b3..7709945123 100644
--- a/indra/llvfs/lldir_win32.cpp
+++ b/indra/llvfs/lldir_win32.cpp
@@ -240,67 +240,6 @@ U32 LLDir_Win32::countFilesInDir(const std::string &dirname, const std::string &
return (file_count);
}
-
-// get the next file in the directory
-BOOL LLDir_Win32::getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname)
-{
- BOOL fileFound = FALSE;
- fname = "";
-
- WIN32_FIND_DATAW FileData;
- llutf16string pathname = utf8str_to_utf16str(dirname) + utf8str_to_utf16str(mask);
-
- if (pathname != mCurrentDir)
- {
- // different dir specified, close old search
- if (!mCurrentDir.empty())
- {
- FindClose(mDirSearch_h);
- }
- mCurrentDir = pathname;
-
- // and open new one
- // Check error opening Directory structure
- if ((mDirSearch_h = FindFirstFile(pathname.c_str(), &FileData)) != INVALID_HANDLE_VALUE)
- {
- fileFound = TRUE;
- }
- }
-
- // Loop to skip over the current (.) and parent (..) directory entries
- // (apparently returned in Win7 but not XP)
- do
- {
- if ( fileFound
- && ( (lstrcmp(FileData.cFileName, (LPCTSTR)TEXT(".")) == 0)
- ||(lstrcmp(FileData.cFileName, (LPCTSTR)TEXT("..")) == 0)
- )
- )
- {
- fileFound = FALSE;
- }
- } while ( mDirSearch_h != INVALID_HANDLE_VALUE
- && !fileFound
- && (fileFound = FindNextFile(mDirSearch_h, &FileData)
- )
- );
-
- if (!fileFound && GetLastError() == ERROR_NO_MORE_FILES)
- {
- // No more files, so reset to beginning of directory
- FindClose(mDirSearch_h);
- mCurrentDir[0] = '\000';
- }
-
- if (fileFound)
- {
- // convert from TCHAR to char
- fname = utf16str_to_utf8str(FileData.cFileName);
- }
-
- return fileFound;
-}
-
std::string LLDir_Win32::getCurPath()
{
WCHAR w_str[MAX_PATH];
diff --git a/indra/llvfs/lldir_win32.h b/indra/llvfs/lldir_win32.h
index b170ebbcd7..62fb4713ab 100644
--- a/indra/llvfs/lldir_win32.h
+++ b/indra/llvfs/lldir_win32.h
@@ -44,15 +44,12 @@ public:
/*virtual*/ std::string getCurPath();
/*virtual*/ U32 countFilesInDir(const std::string &dirname, const std::string &mask);
- /*virtual*/ BOOL getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname);
/*virtual*/ BOOL fileExists(const std::string &filename) const;
/*virtual*/ std::string getLLPluginLauncher();
/*virtual*/ std::string getLLPluginFilename(std::string base_name);
private:
- BOOL getNextFileInDir(const llutf16string &dirname, const std::string &mask, std::string &fname);
-
void* mDirSearch_h;
llutf16string mCurrentDir;
};
diff --git a/indra/llvfs/lldiriterator.cpp b/indra/llvfs/lldiriterator.cpp
index 5536ed8f69..041436ed92 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;
}
diff --git a/indra/llvfs/llvfile.cpp b/indra/llvfs/llvfile.cpp
index a8db7b235e..ca749c5eaf 100644
--- a/indra/llvfs/llvfile.cpp
+++ b/indra/llvfs/llvfile.cpp
@@ -314,7 +314,7 @@ BOOL LLVFile::setMaxSize(S32 size)
if (!mVFS->checkAvailable(size))
{
- LLFastTimer t(FTM_VFILE_WAIT);
+ //LLFastTimer t(FTM_VFILE_WAIT);
S32 count = 0;
while (sVFSThread->getPending() > 1000)
{
@@ -422,7 +422,7 @@ bool LLVFile::isLocked(EVFSLock lock)
void LLVFile::waitForLock(EVFSLock lock)
{
- LLFastTimer t(FTM_VFILE_WAIT);
+ //LLFastTimer t(FTM_VFILE_WAIT);
// spin until the lock clears
while (isLocked(lock))
{
diff --git a/indra/llvfs/llvfs.cpp b/indra/llvfs/llvfs.cpp
index c1fe21c57d..82c926620a 100644
--- a/indra/llvfs/llvfs.cpp
+++ b/indra/llvfs/llvfs.cpp
@@ -26,6 +26,8 @@
#include "linden_common.h"
+#include "llvfs.h"
+
#include <sys/stat.h>
#include <set>
#include <map>
@@ -39,8 +41,6 @@
#include <sys/file.h>
#endif
-#include "llvfs.h"
-
#include "llstl.h"
#include "lltimer.h"
@@ -1711,7 +1711,8 @@ void LLVFS::audit()
BOOL vfs_corrupt = FALSE;
- std::vector<U8> buffer(index_size);
+ // since we take the address of element 0, we need to have at least one element.
+ std::vector<U8> buffer(llmax<size_t>(index_size,1U));
if (fread(&buffer[0], 1, index_size, mIndexFP) != index_size)
{
@@ -2035,6 +2036,9 @@ std::string get_extension(LLAssetType::EType type)
case LLAssetType::AT_ANIMATION:
extension = ".lla";
break;
+ case LLAssetType::AT_MESH:
+ extension = ".slm";
+ break;
default:
// Just use the asset server filename extension in most cases
extension += ".";
diff --git a/indra/llvfs/tests/lldir_test.cpp b/indra/llvfs/tests/lldir_test.cpp
index 8788bd63e8..ea321c5ae9 100644
--- a/indra/llvfs/tests/lldir_test.cpp
+++ b/indra/llvfs/tests/lldir_test.cpp
@@ -28,6 +28,7 @@
#include "linden_common.h"
#include "../lldir.h"
+#include "../lldiriterator.h"
#include "../test/lltut.h"
@@ -259,13 +260,12 @@ namespace tut
std::string makeTestFile( const std::string& dir, const std::string& file )
{
- std::string delim = gDirUtilp->getDirDelimiter();
- std::string path = dir + delim + file;
+ std::string path = dir + file;
LLFILE* handle = LLFile::fopen( path, "w" );
ensure("failed to open test file '"+path+"'", handle != NULL );
// Harbison & Steele, 4th ed., p. 366: "If an error occurs, fputs
// returns EOF; otherwise, it returns some other, nonnegative value."
- ensure("failed to write to test file '"+path+"'", fputs("test file", handle) >= 0);
+ ensure("failed to write to test file '"+path+"'", EOF != fputs("test file", handle) );
fclose(handle);
return path;
}
@@ -290,7 +290,7 @@ namespace tut
}
static const char* DirScanFilename[5] = { "file1.abc", "file2.abc", "file1.xyz", "file2.xyz", "file1.mno" };
-
+
void scanTest(const std::string& directory, const std::string& pattern, bool correctResult[5])
{
@@ -300,7 +300,8 @@ namespace tut
bool filesFound[5] = { false, false, false, false, false };
//std::cerr << "searching '"+directory+"' for '"+pattern+"'\n";
- while ( found <= 5 && gDirUtilp->getNextFileInDir(directory, pattern, scanResult) )
+ LLDirIterator iter(directory, pattern);
+ while ( found <= 5 && iter.next(scanResult) )
{
found++;
//std::cerr << " found '"+scanResult+"'\n";
@@ -334,15 +335,15 @@ namespace tut
template<> template<>
void LLDirTest_object_t::test<5>()
- // getNextFileInDir
+ // LLDirIterator::next
{
std::string delim = gDirUtilp->getDirDelimiter();
std::string dirTemp = LLFile::tmpdir();
// Create the same 5 file names of the two directories
- std::string dir1 = makeTestDir(dirTemp + "getNextFileInDir");
- std::string dir2 = makeTestDir(dirTemp + "getNextFileInDir");
+ std::string dir1 = makeTestDir(dirTemp + "LLDirIterator");
+ std::string dir2 = makeTestDir(dirTemp + "LLDirIterator");
std::string dir1files[5];
std::string dir2files[5];
for (int i=0; i<5; i++)
@@ -380,19 +381,17 @@ namespace tut
scanTest(dir2, "file?.x?z", expected7);
// Scan dir2 and see if any file?.??c files are found
- // THESE FAIL ON Mac and Windows, SO ARE COMMENTED OUT FOR NOW
- // bool expected8[5] = { true, true, false, false, false };
- // scanTest(dir2, "file?.??c", expected8);
- // scanTest(dir2, "*.??c", expected8);
+ bool expected8[5] = { true, true, false, false, false };
+ scanTest(dir2, "file?.??c", expected8);
+ scanTest(dir2, "*.??c", expected8);
// Scan dir1 and see if any *.?n? files are found
bool expected9[5] = { false, false, false, false, true };
scanTest(dir1, "*.?n?", expected9);
// Scan dir1 and see if any *.???? files are found
- // THIS ONE FAILS ON WINDOWS (returns three charater suffixes) SO IS COMMENTED OUT FOR NOW
- // bool expected10[5] = { false, false, false, false, false };
- // scanTest(dir1, "*.????", expected10);
+ bool expected10[5] = { false, false, false, false, false };
+ scanTest(dir1, "*.????", expected10);
// Scan dir1 and see if any ?????.* files are found
bool expected11[5] = { true, true, true, true, true };
@@ -402,6 +401,15 @@ namespace tut
bool expected12[5] = { false, false, true, true, false };
scanTest(dir1, "??l??.xyz", expected12);
+ bool expected13[5] = { true, false, true, false, false };
+ scanTest(dir1, "file1.{abc,xyz}", expected13);
+
+ bool expected14[5] = { true, true, false, false, false };
+ scanTest(dir1, "file[0-9].abc", expected14);
+
+ bool expected15[5] = { true, true, false, false, false };
+ scanTest(dir1, "file[!a-z].abc", expected15);
+
// clean up all test files and directories
for (int i=0; i<5; i++)
{
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/llwindow/llwindowmacosx.cpp b/indra/llwindow/llwindowmacosx.cpp
index affd7276cc..cb2abc5bc0 100644
--- a/indra/llwindow/llwindowmacosx.cpp
+++ b/indra/llwindow/llwindowmacosx.cpp
@@ -108,9 +108,6 @@ static long getDictLong (CFDictionaryRef refDict, CFStringRef key);
static EventTypeSpec WindowHandlerEventList[] =
{
// Window-related events
- // { kEventClassWindow, kEventWindowCollapsing },
- // { kEventClassWindow, kEventWindowCollapsed },
- // { kEventClassWindow, kEventWindowShown },
{ kEventClassWindow, kEventWindowActivated },
{ kEventClassWindow, kEventWindowDeactivated },
{ kEventClassWindow, kEventWindowShown },
@@ -121,8 +118,7 @@ static EventTypeSpec WindowHandlerEventList[] =
{ kEventClassWindow, kEventWindowClose },
{ kEventClassWindow, kEventWindowBoundsChanging },
{ kEventClassWindow, kEventWindowBoundsChanged },
- // { kEventClassWindow, kEventWindowZoomed },
- // { kEventClassWindow, kEventWindowDrawContent },
+ { kEventClassWindow, kEventWindowGetIdealSize },
// Mouse events
{ kEventClassMouse, kEventMouseDown },
@@ -248,6 +244,7 @@ LLWindowMacOSX::LLWindowMacOSX(LLWindowCallbacks* callbacks,
mCursorIgnoreNextDelta = FALSE;
mNeedsResize = FALSE;
mOverrideAspectRatio = 0.f;
+ mMaximized = FALSE;
mMinimized = FALSE;
mTSMDocument = NULL; // Just in case.
mLanguageTextInputAllowed = FALSE;
@@ -455,24 +452,23 @@ BOOL LLWindowMacOSX::createContext(int x, int y, int width, int height, int bits
if(!mFullscreen && (mWindow == NULL))
{
- Rect window_rect;
//int displayWidth = CGDisplayPixelsWide(mDisplay);
//int displayHeight = CGDisplayPixelsHigh(mDisplay);
//const int menuBarPlusTitleBar = 44; // Ugly magic number.
LL_DEBUGS("Window") << "createContext: creating window" << LL_ENDL;
- window_rect.left = (long) x;
- window_rect.right = (long) x + width;
- window_rect.top = (long) y;
- window_rect.bottom = (long) y + height;
+ mPreviousWindowRect.left = (long) x;
+ mPreviousWindowRect.right = (long) x + width;
+ mPreviousWindowRect.top = (long) y;
+ mPreviousWindowRect.bottom = (long) y + height;
//-----------------------------------------------------------------------
// Create the window
//-----------------------------------------------------------------------
mWindow = NewCWindow(
NULL,
- &window_rect,
+ &mPreviousWindowRect,
mWindowTitle,
false, // Create the window invisible. Whoever calls createContext() should show it after any moving/resizing.
// noGrowDocProc, // Window with no grow box and no zoom box
@@ -481,8 +477,7 @@ BOOL LLWindowMacOSX::createContext(int x, int y, int width, int height, int bits
kFirstWindowOfClass,
true,
(long)this);
-
-
+
if (!mWindow)
{
setupFailure("Window creation error", "Error", OSMB_OK);
@@ -541,20 +536,20 @@ BOOL LLWindowMacOSX::createContext(int x, int y, int width, int height, int bits
GLint fullscreenAttrib[] =
{
AGL_RGBA,
- AGL_FULLSCREEN,
- // AGL_NO_RECOVERY, // MBW -- XXX -- Not sure if we want this attribute
- AGL_SAMPLE_BUFFERS_ARB, mFSAASamples > 0 ? 1 : 0,
- AGL_SAMPLES_ARB, mFSAASamples,
- AGL_DOUBLEBUFFER,
- AGL_CLOSEST_POLICY,
- AGL_ACCELERATED,
- AGL_RED_SIZE, 8,
- AGL_GREEN_SIZE, 8,
- AGL_BLUE_SIZE, 8,
- AGL_ALPHA_SIZE, 8,
- AGL_DEPTH_SIZE, 24,
- AGL_STENCIL_SIZE, 8,
- AGL_NONE
+ AGL_FULLSCREEN,
+ AGL_NO_RECOVERY,
+ AGL_SAMPLE_BUFFERS_ARB, mFSAASamples > 0 ? 1 : 0,
+ AGL_SAMPLES_ARB, mFSAASamples,
+ AGL_DOUBLEBUFFER,
+ AGL_CLOSEST_POLICY,
+ AGL_ACCELERATED,
+ AGL_RED_SIZE, 8,
+ AGL_GREEN_SIZE, 8,
+ AGL_BLUE_SIZE, 8,
+ AGL_ALPHA_SIZE, 8,
+ AGL_DEPTH_SIZE, 24,
+ AGL_STENCIL_SIZE, 8,
+ AGL_NONE
};
LL_DEBUGS("Window") << "createContext: creating fullscreen pixelformat" << LL_ENDL;
@@ -567,21 +562,28 @@ BOOL LLWindowMacOSX::createContext(int x, int y, int width, int height, int bits
}
else
{
+ // NOTE from Leslie:
+ //
+ // AGL_NO_RECOVERY, when combined with AGL_ACCELERATED prevents software rendering
+ // fallback which means we won't hvae shaders that compile and link but then don't
+ // work. The drawback is that our shader compilation will be a bit more finicky though.
+
GLint windowedAttrib[] =
{
AGL_RGBA,
- AGL_DOUBLEBUFFER,
- AGL_CLOSEST_POLICY,
- AGL_ACCELERATED,
- AGL_SAMPLE_BUFFERS_ARB, mFSAASamples > 0 ? 1 : 0,
- AGL_SAMPLES_ARB, mFSAASamples,
- AGL_RED_SIZE, 8,
- AGL_GREEN_SIZE, 8,
- AGL_BLUE_SIZE, 8,
- AGL_ALPHA_SIZE, 8,
- AGL_DEPTH_SIZE, 24,
- AGL_STENCIL_SIZE, 8,
- AGL_NONE
+ AGL_NO_RECOVERY,
+ AGL_DOUBLEBUFFER,
+ AGL_CLOSEST_POLICY,
+ AGL_ACCELERATED,
+ AGL_SAMPLE_BUFFERS_ARB, mFSAASamples > 0 ? 1 : 0,
+ AGL_SAMPLES_ARB, mFSAASamples,
+ AGL_RED_SIZE, 8,
+ AGL_GREEN_SIZE, 8,
+ AGL_BLUE_SIZE, 8,
+ AGL_ALPHA_SIZE, 8,
+ AGL_DEPTH_SIZE, 24,
+ AGL_STENCIL_SIZE, 8,
+ AGL_NONE
};
LL_DEBUGS("Window") << "createContext: creating windowed pixelformat" << LL_ENDL;
@@ -1093,31 +1095,22 @@ BOOL LLWindowMacOSX::getVisible()
BOOL LLWindowMacOSX::getMinimized()
{
- BOOL result = FALSE;
-
- // Since the set of states where we want to act "minimized" is non-trivial, it's easier to
- // track things locally than to try and retrieve the state from the window manager.
- result = mMinimized;
-
- return(result);
+ return mMinimized;
}
BOOL LLWindowMacOSX::getMaximized()
{
- BOOL result = FALSE;
-
- if (mWindow)
- {
- // TODO
- }
-
- return(result);
+ return mMaximized;
}
BOOL LLWindowMacOSX::maximize()
{
- // TODO
- return FALSE;
+ if (mWindow && !mMaximized)
+ {
+ ZoomWindow(mWindow, inContent, true);
+ }
+
+ return mMaximized;
}
BOOL LLWindowMacOSX::getFullscreen()
@@ -2559,7 +2552,24 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e
GetEventParameter(event, kEventParamCurrentBounds, typeQDRectangle, NULL, sizeof(Rect), NULL, &currentBounds);
GetEventParameter(event, kEventParamPreviousBounds, typeQDRectangle, NULL, sizeof(Rect), NULL, &previousBounds);
-
+
+ // Put an offset into window un-maximize operation since the kEventWindowGetIdealSize
+ // event only allows the specification of size and not position.
+ if (mMaximized)
+ {
+ short leftOffset = mPreviousWindowRect.left - currentBounds.left;
+ currentBounds.left += leftOffset;
+ currentBounds.right += leftOffset;
+
+ short topOffset = mPreviousWindowRect.top - currentBounds.top;
+ currentBounds.top += topOffset;
+ currentBounds.bottom += topOffset;
+ }
+ else
+ {
+ // Store off the size for future un-maximize operations
+ mPreviousWindowRect = previousBounds;
+ }
if ((currentBounds.right - currentBounds.left) < MIN_WIDTH)
{
@@ -2578,13 +2588,43 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e
case kEventWindowBoundsChanged:
{
+ // Get new window bounds
Rect newBounds;
-
GetEventParameter(event, kEventParamCurrentBounds, typeQDRectangle, NULL, sizeof(Rect), NULL, &newBounds);
+
+ // Get previous window bounds
+ Rect oldBounds;
+ GetEventParameter(event, kEventParamPreviousBounds, typeQDRectangle, NULL, sizeof(Rect), NULL, &oldBounds);
+
+ // Determine if the new size is larger than the old
+ bool newBoundsLarger = ((newBounds.right - newBounds.left) >= (oldBounds.right - oldBounds.left));
+ newBoundsLarger &= ((newBounds.bottom - newBounds.top) >= (oldBounds.bottom - oldBounds.top));
+
+ // Check to see if this is a zoom event (+ button on window pane)
+ unsigned int eventParams;
+ GetEventParameter(event, kEventParamAttributes, typeUInt32, NULL, sizeof(int), NULL, &eventParams);
+ bool isZoomEvent = ((eventParams & kWindowBoundsChangeZoom) != 0);
+
+ // Maximized flag is if zoom event and increasing window size
+ mMaximized = (isZoomEvent && newBoundsLarger);
+
aglUpdateContext(mContext);
+
mCallbacks->handleResize(this, newBounds.right - newBounds.left, newBounds.bottom - newBounds.top);
-
-
+ }
+ break;
+
+ case kEventWindowGetIdealSize:
+ // Only recommend a new ideal size when un-maximizing
+ if (mMaximized == TRUE)
+ {
+ Point nonMaximizedSize;
+
+ nonMaximizedSize.v = mPreviousWindowRect.bottom - mPreviousWindowRect.top;
+ nonMaximizedSize.h = mPreviousWindowRect.right - mPreviousWindowRect.left;
+
+ SetEventParameter(event, kEventParamDimensions, typeQDPoint, sizeof(Point), &nonMaximizedSize);
+ result = noErr;
}
break;
diff --git a/indra/llwindow/llwindowmacosx.h b/indra/llwindow/llwindowmacosx.h
index 6dc093b4be..6c9e075a21 100644
--- a/indra/llwindow/llwindowmacosx.h
+++ b/indra/llwindow/llwindowmacosx.h
@@ -156,7 +156,6 @@ protected:
static pascal Boolean staticMoveEventComparator( EventRef event, void* data);
OSStatus eventHandler (EventHandlerCallRef myHandler, EventRef event);
void adjustCursorDecouple(bool warpingMouse = false);
- void fixWindowSize(void);
void stopDockTileBounce();
static MASK modifiersToMask(SInt16 modifiers);
@@ -182,6 +181,7 @@ protected:
EventComparatorUPP mMoveEventCampartorUPP;
Rect mOldMouseClip; // Screen rect to which the mouse cursor was globally constrained before we changed it in clipMouse()
+ Rect mPreviousWindowRect; // Save previous window for un-maximize event
Str255 mWindowTitle;
double mOriginalAspectRatio;
BOOL mSimulatedRightClick;
@@ -195,6 +195,7 @@ protected:
BOOL mNeedsResize; // Constructor figured out the window is too big, it needs a resize.
LLCoordScreen mNeedsResizeSize;
F32 mOverrideAspectRatio;
+ BOOL mMaximized;
BOOL mMinimized;
U32 mFSAASamples;
BOOL mForceRebuild;
diff --git a/indra/llxml/CMakeLists.txt b/indra/llxml/CMakeLists.txt
index eb5166ee71..21cdf5f926 100644
--- a/indra/llxml/CMakeLists.txt
+++ b/indra/llxml/CMakeLists.txt
@@ -45,27 +45,25 @@ target_link_libraries( llxml
${EXPAT_LIBRARIES}
)
+# tests
-if(LL_TESTS)
- # tests
+if (LL_TESTS)
+ # unit tests
- # unit tests
+ SET(llxml_TEST_SOURCE_FILES
+ # none yet!
+ )
+ LL_ADD_PROJECT_UNIT_TESTS(llxml "${llxml_TEST_SOURCE_FILES}")
- SET(llxml_TEST_SOURCE_FILES
- # none yet!
- )
- LL_ADD_PROJECT_UNIT_TESTS(llxml "${llxml_TEST_SOURCE_FILES}")
+ # integration tests
- # integration tests
+ # set(TEST_DEBUG on)
+ set(test_libs
+ ${LLXML_LIBRARIES}
+ ${WINDOWS_LIBRARIES}
+ ${LLMATH_LIBRARIES}
+ ${LLCOMMON_LIBRARIES}
+ )
- # set(TEST_DEBUG on)
- set(test_libs
- ${LLXML_LIBRARIES}
- ${WINDOWS_LIBRARIES}
- ${LLMATH_LIBRARIES}
- ${LLCOMMON_LIBRARIES}
- )
-
- LL_ADD_INTEGRATION_TEST(llcontrol "" "${test_libs}")
-
-endif(LL_TESTS)
+ LL_ADD_INTEGRATION_TEST(llcontrol "" "${test_libs}")
+endif (LL_TESTS)
diff --git a/indra/llxml/llcontrol.cpp b/indra/llxml/llcontrol.cpp
index 6e4364a20d..0809d95628 100644
--- a/indra/llxml/llcontrol.cpp
+++ b/indra/llxml/llcontrol.cpp
@@ -837,9 +837,7 @@ U32 LLControlGroup::saveToFile(const std::string& filename, BOOL nondefault_only
U32 LLControlGroup::loadFromFile(const std::string& filename, bool set_default_values, bool save_values)
{
- std::string name;
LLSD settings;
- LLSD control_map;
llifstream infile;
infile.open(filename);
if(!infile.is_open())
@@ -863,8 +861,8 @@ U32 LLControlGroup::loadFromFile(const std::string& filename, bool set_default_v
for(LLSD::map_const_iterator itr = settings.beginMap(); itr != settings.endMap(); ++itr)
{
bool persist = true;
- name = (*itr).first;
- control_map = (*itr).second;
+ std::string const & name = itr->first;
+ LLSD const & control_map = itr->second;
if(control_map.has("Persist"))
{
diff --git a/indra/llxuixml/llinitparam.cpp b/indra/llxuixml/llinitparam.cpp
index fcdbaa4309..b3312798dd 100644
--- a/indra/llxuixml/llinitparam.cpp
+++ b/indra/llxuixml/llinitparam.cpp
@@ -44,8 +44,51 @@ namespace LLInitParam
}
//
+ // ParamDescriptor
+ //
+ ParamDescriptor::ParamDescriptor(param_handle_t p,
+ merge_func_t merge_func,
+ deserialize_func_t deserialize_func,
+ serialize_func_t serialize_func,
+ validation_func_t validation_func,
+ inspect_func_t inspect_func,
+ S32 min_count,
+ S32 max_count)
+ : mParamHandle(p),
+ mMergeFunc(merge_func),
+ mDeserializeFunc(deserialize_func),
+ mSerializeFunc(serialize_func),
+ mValidationFunc(validation_func),
+ mInspectFunc(inspect_func),
+ mMinCount(min_count),
+ mMaxCount(max_count),
+ mGeneration(0),
+ mUserData(NULL)
+ {}
+
+ ParamDescriptor::ParamDescriptor()
+ : mParamHandle(0),
+ mMergeFunc(NULL),
+ mDeserializeFunc(NULL),
+ mSerializeFunc(NULL),
+ mValidationFunc(NULL),
+ mInspectFunc(NULL),
+ mMinCount(0),
+ mMaxCount(0),
+ mGeneration(0),
+ mUserData(NULL)
+ {}
+
+ ParamDescriptor::~ParamDescriptor()
+ {
+ delete mUserData;
+ }
+
+ //
// Parser
//
+ S32 Parser::sNextParseGeneration = 0;
+
Parser::~Parser()
{}
@@ -73,6 +116,12 @@ namespace LLInitParam
std::copy(src_block_data.mAllParams.begin(), src_block_data.mAllParams.end(), std::back_inserter(mAllParams));
}
+ BlockDescriptor::BlockDescriptor()
+ : mMaxParamOffset(0),
+ mInitializationState(UNINITIALIZED),
+ mCurrentBlockPtr(NULL)
+ {}
+
//
// BaseBlock
//
@@ -115,7 +164,7 @@ namespace LLInitParam
bool BaseBlock::submitValue(const Parser::name_stack_t& name_stack, Parser& p, bool silent)
{
- if (!deserializeBlock(p, std::make_pair(name_stack.begin(), name_stack.end())))
+ if (!deserializeBlock(p, std::make_pair(name_stack.begin(), name_stack.end()), -1))
{
if (!silent)
{
@@ -145,7 +194,7 @@ namespace LLInitParam
return true;
}
- bool BaseBlock::serializeBlock(Parser& parser, Parser::name_stack_t name_stack, const LLInitParam::BaseBlock* diff_block) const
+ void BaseBlock::serializeBlock(Parser& parser, Parser::name_stack_t name_stack, const LLInitParam::BaseBlock* diff_block) const
{
// named param is one like LLView::Params::follows
// unnamed param is like LLView::Params::rect - implicit
@@ -212,11 +261,9 @@ namespace LLInitParam
name_stack.pop_back();
}
}
-
- return true;
}
- bool BaseBlock::inspectBlock(Parser& parser, Parser::name_stack_t name_stack) const
+ bool BaseBlock::inspectBlock(Parser& parser, Parser::name_stack_t name_stack, S32 min_count, S32 max_count) const
{
// named param is one like LLView::Params::follows
// unnamed param is like LLView::Params::rect - implicit
@@ -273,11 +320,13 @@ namespace LLInitParam
return true;
}
- bool BaseBlock::deserializeBlock(Parser& p, Parser::name_stack_range_t name_stack)
+ bool BaseBlock::deserializeBlock(Parser& p, Parser::name_stack_range_t name_stack, S32 parent_generation)
{
BlockDescriptor& block_data = mostDerivedBlockDescriptor();
bool names_left = name_stack.first != name_stack.second;
+ S32 parse_generation = name_stack.first == name_stack.second ? -1 : name_stack.first->second;
+
if (names_left)
{
const std::string& top_name = name_stack.first->first;
@@ -294,7 +343,7 @@ namespace LLInitParam
Parser::name_stack_range_t new_name_stack(name_stack.first, name_stack.second);
++new_name_stack.first;
- return deserialize_func(*paramp, p, new_name_stack, name_stack.first == name_stack.second ? -1 : name_stack.first->second);
+ return deserialize_func(*paramp, p, new_name_stack, parse_generation);
}
}
@@ -306,7 +355,7 @@ namespace LLInitParam
Param* paramp = getParamFromHandle((*it)->mParamHandle);
ParamDescriptor::deserialize_func_t deserialize_func = (*it)->mDeserializeFunc;
- if (deserialize_func && deserialize_func(*paramp, p, name_stack, name_stack.first == name_stack.second ? -1 : name_stack.first->second))
+ if (deserialize_func && deserialize_func(*paramp, p, name_stack, parse_generation))
{
return true;
}
@@ -324,32 +373,32 @@ namespace LLInitParam
}
//static
- void BaseBlock::addParam(BlockDescriptor& block_data, const ParamDescriptor& in_param, const char* char_name)
+ void BaseBlock::addParam(BlockDescriptor& block_data, const ParamDescriptorPtr in_param, const char* char_name)
{
- // create a copy of the paramdescriptor in allparams
+ // create a copy of the param descriptor in mAllParams
// so other data structures can store a pointer to it
block_data.mAllParams.push_back(in_param);
- ParamDescriptor& param(block_data.mAllParams.back());
+ ParamDescriptorPtr param(block_data.mAllParams.back());
std::string name(char_name);
- if ((size_t)param.mParamHandle > block_data.mMaxParamOffset)
+ if ((size_t)param->mParamHandle > block_data.mMaxParamOffset)
{
llerrs << "Attempted to register param with block defined for parent class, make sure to derive from LLInitParam::Block<YOUR_CLASS, PARAM_BLOCK_BASE_CLASS>" << llendl;
}
if (name.empty())
{
- block_data.mUnnamedParams.push_back(&param);
+ block_data.mUnnamedParams.push_back(param);
}
else
{
// don't use insert, since we want to overwrite existing entries
- block_data.mNamedParams[name] = &param;
+ block_data.mNamedParams[name] = param;
}
- if (param.mValidationFunc)
+ if (param->mValidationFunc)
{
- block_data.mValidationList.push_back(std::make_pair(param.mParamHandle, param.mValidationFunc));
+ block_data.mValidationList.push_back(std::make_pair(param->mParamHandle, param->mValidationFunc));
}
}
@@ -367,7 +416,7 @@ namespace LLInitParam
llerrs << "Attempted to register param with block defined for parent class, make sure to derive from LLInitParam::Block<YOUR_CLASS, PARAM_BLOCK_BASE_CLASS>" << llendl;
}
- ParamDescriptor* param_descriptor = findParamDescriptor(handle);
+ ParamDescriptorPtr param_descriptor = findParamDescriptor(param);
if (param_descriptor)
{
if (synonym.empty())
@@ -382,7 +431,7 @@ namespace LLInitParam
}
}
- void BaseBlock::setLastChangedParam(const Param& last_param, bool user_provided)
+ void BaseBlock::paramChanged(const Param& changed_param, bool user_provided)
{
if (user_provided)
{
@@ -404,22 +453,23 @@ namespace LLInitParam
return LLStringUtil::null;
}
- ParamDescriptor* BaseBlock::findParamDescriptor(param_handle_t handle)
+ ParamDescriptorPtr BaseBlock::findParamDescriptor(const Param& param)
{
+ param_handle_t handle = getHandleFromParam(&param);
BlockDescriptor& descriptor = mostDerivedBlockDescriptor();
BlockDescriptor::all_params_list_t::iterator end_it = descriptor.mAllParams.end();
for (BlockDescriptor::all_params_list_t::iterator it = descriptor.mAllParams.begin();
it != end_it;
++it)
{
- if (it->mParamHandle == handle) return &(*it);
+ if ((*it)->mParamHandle == handle) return *it;
}
- return NULL;
+ return ParamDescriptorPtr();
}
// take all provided params from other and apply to self
// NOTE: this requires that "other" is of the same derived type as this
- bool BaseBlock::merge(BlockDescriptor& block_data, const BaseBlock& other, bool overwrite)
+ bool BaseBlock::mergeBlock(BlockDescriptor& block_data, const BaseBlock& other, bool overwrite)
{
bool some_param_changed = false;
BlockDescriptor::all_params_list_t::const_iterator end_it = block_data.mAllParams.end();
@@ -427,19 +477,14 @@ namespace LLInitParam
it != end_it;
++it)
{
- const Param* other_paramp = other.getParamFromHandle(it->mParamHandle);
- ParamDescriptor::merge_func_t merge_func = it->mMergeFunc;
+ const Param* other_paramp = other.getParamFromHandle((*it)->mParamHandle);
+ ParamDescriptor::merge_func_t merge_func = (*it)->mMergeFunc;
if (merge_func)
{
- Param* paramp = getParamFromHandle(it->mParamHandle);
+ Param* paramp = getParamFromHandle((*it)->mParamHandle);
some_param_changed |= merge_func(*paramp, *other_paramp, overwrite);
}
}
return some_param_changed;
}
-
- bool ParamCompare<LLSD, false>::equals(const LLSD &a, const LLSD &b)
- {
- return false;
- }
}
diff --git a/indra/llxuixml/llinitparam.h b/indra/llxuixml/llinitparam.h
index 1f9045754a..a853999e94 100644
--- a/indra/llxuixml/llinitparam.h
+++ b/indra/llxuixml/llinitparam.h
@@ -1,5 +1,5 @@
/**
-f * @file llinitparam.h
+ * @file llinitparam.h
* @brief parameter block abstraction for creating complex objects and
* parsing construction parameters from xml and LLSD
*
@@ -29,18 +29,14 @@ f * @file llinitparam.h
#define LL_LLPARAM_H
#include <vector>
-
-#include <stddef.h>
#include <boost/function.hpp>
-#include <boost/bind.hpp>
#include <boost/type_traits/is_convertible.hpp>
#include <boost/unordered_map.hpp>
-#include "llregistry.h"
-#include "llmemory.h"
-
+#include <boost/shared_ptr.hpp>
namespace LLInitParam
{
+ template<typename T> const T& defaultValue() { static T value; return value; }
template <typename T, bool IS_BOOST_FUNCTION = boost::is_convertible<T, boost::function_base>::value >
struct ParamCompare
@@ -61,122 +57,119 @@ namespace LLInitParam
}
};
- // default constructor adaptor for InitParam Values
- // constructs default instances of the given type, returned by const reference
- template <typename T>
- struct DefaultInitializer
+ template<>
+ struct ParamCompare<LLSD, false>
{
- typedef const T& T_const_ref;
- // return reference to a single default instance of T
- // built-in types will be initialized to zero, default constructor otherwise
- static T_const_ref get() { static T t = T(); return t; }
+ static bool equals(const LLSD &a, const LLSD &b) { return false; }
};
// helper functions and classes
typedef ptrdiff_t param_handle_t;
+ // empty default implementation of key cache
+ // leverages empty base class optimization
template <typename T>
class TypeValues
{
public:
- // empty default implemenation of key cache
- class KeyCache
+ typedef std::map<std::string, T> value_name_map_t;
+
+ void setValueName(const std::string& key) {}
+ std::string getValueName() const { return ""; }
+ void clearValueName() const {}
+
+ static bool getValueFromName(const std::string& name, T& value)
{
- public:
- void setKey(const std::string& key) {}
- std::string getKey() const { return ""; }
- void clearKey(){}
- };
+ return false;
+ }
- static bool get(const std::string& name, T& value)
+ static bool valueNamesExist()
{
return false;
}
- static bool empty()
+ static std::vector<std::string>* getPossibleValues()
{
- return true;
+ return NULL;
}
- static std::vector<std::string>* getPossibleValues() { return NULL; }
+ static value_name_map_t* getValueNames() {return NULL;}
};
template <typename T, typename DERIVED_TYPE = TypeValues<T> >
class TypeValuesHelper
- : public LLRegistrySingleton<std::string, T, DERIVED_TYPE >
{
- typedef LLRegistrySingleton<std::string, T, DERIVED_TYPE> super_t;
- typedef LLSingleton<DERIVED_TYPE> singleton_t;
public:
+ typedef typename std::map<std::string, T> value_name_map_t;
//TODO: cache key by index to save on param block size
- class KeyCache
+ void setValueName(const std::string& value_name)
{
- public:
- void setKey(const std::string& key)
- {
- mKey = key;
- }
-
- void clearKey()
- {
- mKey = "";
- }
+ mValueName = value_name;
+ }
- std::string getKey() const
- {
- return mKey;
- }
+ std::string getValueName() const
+ {
+ return mValueName;
+ }
- private:
- std::string mKey;
- };
+ void clearValueName() const
+ {
+ mValueName.clear();
+ }
- static bool get(const std::string& name, T& value)
+ static bool getValueFromName(const std::string& name, T& value)
{
- if (!singleton_t::instance().exists(name)) return false;
+ value_name_map_t* map = getValueNames();
+ typename value_name_map_t::iterator found_it = map->find(name);
+ if (found_it == map->end()) return false;
- value = *singleton_t::instance().getValue(name);
+ value = found_it->second;
return true;
}
- static bool empty()
+ static bool valueNamesExist()
{
- return singleton_t::instance().LLRegistry<std::string, T>::empty();
+ return !getValueNames()->empty();
}
- //override this to add name value pairs
- static void declareValues() {}
-
- void initSingleton()
+ static value_name_map_t* getValueNames()
{
- DERIVED_TYPE::declareValues();
- }
+ static value_name_map_t sMap;
+ static bool sInitialized = false;
- static const std::vector<std::string>* getPossibleValues()
- {
- // in order to return a pointer to a member, we lazily
- // evaluate the result and store it in mValues here
- if (singleton_t::instance().mValues.empty())
+ if (!sInitialized)
{
- typename super_t::Registrar::registry_map_t::const_iterator it;
- for (it = super_t::defaultRegistrar().beginItems(); it != super_t::defaultRegistrar().endItems(); ++it)
- {
- singleton_t::instance().mValues.push_back(it->first);
- }
+ sInitialized = true;
+ DERIVED_TYPE::declareValues();
}
- return &singleton_t::instance().mValues;
+ return &sMap;
}
+ static std::vector<std::string>* getPossibleValues()
+ {
+ static std::vector<std::string> sValues;
+
+ value_name_map_t* map = getValueNames();
+ for (typename value_name_map_t::iterator it = map->begin(), end_it = map->end();
+ it != end_it;
+ ++it)
+ {
+ sValues.push_back(it->first);
+ }
+ return &sValues;
+ }
- protected:
static void declare(const std::string& name, const T& value)
{
- super_t::defaultRegistrar().add(name, value);
+ (*getValueNames())[name] = value;
}
- private:
- std::vector<std::string> mValues;
+ protected:
+ static void getName(const std::string& name, const T& value)
+ {}
+
+ mutable std::string mValueName;
};
class Parser
@@ -193,9 +186,9 @@ namespace LLInitParam
}
};
- typedef std::vector<std::pair<std::string, S32> > name_stack_t;
+ typedef std::vector<std::pair<std::string, S32> > name_stack_t;
typedef std::pair<name_stack_t::const_iterator, name_stack_t::const_iterator> name_stack_range_t;
- typedef std::vector<std::string> possible_values_t;
+ typedef std::vector<std::string> possible_values_t;
typedef bool (*parser_read_func_t)(Parser& parser, void* output);
typedef bool (*parser_write_func_t)(Parser& parser, const void*, const name_stack_t&);
@@ -207,7 +200,7 @@ namespace LLInitParam
Parser(parser_read_func_map_t& read_map, parser_write_func_map_t& write_map, parser_inspect_func_map_t& inspect_map)
: mParseSilently(false),
- mParseGeneration(0),
+ mParseGeneration(sNextParseGeneration),
mParserReadFuncs(&read_map),
mParserWriteFuncs(&write_map),
mParserInspectFuncs(&inspect_map)
@@ -252,7 +245,7 @@ namespace LLInitParam
void setParseSilently(bool silent) { mParseSilently = silent; }
S32 getParseGeneration() { return mParseGeneration; }
- S32 newParseGeneration() { return ++mParseGeneration; }
+ S32 newParseGeneration() { return mParseGeneration = ++sNextParseGeneration; }
protected:
@@ -276,6 +269,8 @@ namespace LLInitParam
parser_write_func_map_t* mParserWriteFuncs;
parser_inspect_func_map_t* mParserInspectFuncs;
S32 mParseGeneration;
+
+ static S32 sNextParseGeneration;
};
// used to indicate no matching value to a given name when parsing
@@ -295,12 +290,13 @@ namespace LLInitParam
Param(class BaseBlock* enclosing_block);
// store pointer to enclosing block as offset to reduce space and allow for quick copying
- BaseBlock& enclosingBlock() const
+ class BaseBlock& enclosingBlock() const
{
const U8* my_addr = reinterpret_cast<const U8*>(this);
// get address of enclosing BLOCK class using stored offset to enclosing BaseBlock class
- return *const_cast<BaseBlock*>(
- reinterpret_cast<const BaseBlock*>(my_addr - (ptrdiff_t)(S32)mEnclosingBlockOffset));
+ return *const_cast<class BaseBlock*>
+ (reinterpret_cast<const class BaseBlock*>
+ (my_addr - (ptrdiff_t)(S32)mEnclosingBlockOffset));
}
private:
@@ -313,7 +309,11 @@ namespace LLInitParam
// various callbacks and constraints associated with an individual param
struct ParamDescriptor
{
- public:
+ struct UserData
+ {
+ virtual ~UserData() {}
+ };
+
typedef bool(*merge_func_t)(Param&, const Param&, bool);
typedef bool(*deserialize_func_t)(Param&, Parser&, const Parser::name_stack_range_t&, S32);
typedef void(*serialize_func_t)(const Param&, Parser&, Parser::name_stack_t&, const Param* diff_param);
@@ -321,40 +321,18 @@ namespace LLInitParam
typedef bool(*validation_func_t)(const Param*);
ParamDescriptor(param_handle_t p,
- merge_func_t merge_func,
- deserialize_func_t deserialize_func,
- serialize_func_t serialize_func,
- validation_func_t validation_func,
- inspect_func_t inspect_func,
- S32 min_count,
- S32 max_count)
- : mParamHandle(p),
- mMergeFunc(merge_func),
- mDeserializeFunc(deserialize_func),
- mSerializeFunc(serialize_func),
- mValidationFunc(validation_func),
- mInspectFunc(inspect_func),
- mMinCount(min_count),
- mMaxCount(max_count),
- mGeneration(0),
- mNumRefs(0)
- {}
+ merge_func_t merge_func,
+ deserialize_func_t deserialize_func,
+ serialize_func_t serialize_func,
+ validation_func_t validation_func,
+ inspect_func_t inspect_func,
+ S32 min_count,
+ S32 max_count);
- ParamDescriptor()
- : mParamHandle(0),
- mMergeFunc(NULL),
- mDeserializeFunc(NULL),
- mSerializeFunc(NULL),
- mValidationFunc(NULL),
- mInspectFunc(NULL),
- mMinCount(0),
- mMaxCount(0),
- mGeneration(0),
- mNumRefs(0)
- {}
+ ParamDescriptor();
+ ~ParamDescriptor();
param_handle_t mParamHandle;
-
merge_func_t mMergeFunc;
deserialize_func_t mDeserializeFunc;
serialize_func_t mSerializeFunc;
@@ -364,17 +342,16 @@ namespace LLInitParam
S32 mMaxCount;
S32 mGeneration;
S32 mNumRefs;
+ UserData* mUserData;
};
+ typedef boost::shared_ptr<ParamDescriptor> ParamDescriptorPtr;
+
// each derived Block class keeps a static data structure maintaining offsets to various params
class BlockDescriptor
{
public:
- BlockDescriptor()
- : mMaxParamOffset(0),
- mInitializationState(UNINITIALIZED),
- mCurrentBlockPtr(NULL)
- {}
+ BlockDescriptor();
typedef enum e_initialization_state
{
@@ -385,12 +362,10 @@ namespace LLInitParam
void aggregateBlockData(BlockDescriptor& src_block_data);
- public:
- typedef boost::unordered_map<const std::string, ParamDescriptor*> param_map_t; // references param descriptors stored in mAllParams
- typedef std::vector<ParamDescriptor*> param_list_t;
-
- typedef std::list<ParamDescriptor> all_params_list_t;// references param descriptors stored in mAllParams
- typedef std::vector<std::pair<param_handle_t, ParamDescriptor::validation_func_t> > param_validation_list_t;
+ typedef boost::unordered_map<const std::string, ParamDescriptorPtr> param_map_t;
+ typedef std::vector<ParamDescriptorPtr> param_list_t;
+ typedef std::list<ParamDescriptorPtr> all_params_list_t;
+ typedef std::vector<std::pair<param_handle_t, ParamDescriptor::validation_func_t> > param_validation_list_t;
param_map_t mNamedParams; // parameters with associated names
param_list_t mUnnamedParams; // parameters with_out_ associated names
@@ -456,6 +431,7 @@ namespace LLInitParam
Param* getParamFromHandle(const param_handle_t param_handle)
{
if (param_handle == 0) return NULL;
+
U8* baseblock_address = reinterpret_cast<U8*>(this);
return reinterpret_cast<Param*>(baseblock_address + param_handle);
}
@@ -469,14 +445,13 @@ namespace LLInitParam
void addSynonym(Param& param, const std::string& synonym);
// Blocks can override this to do custom tracking of changes
- virtual void setLastChangedParam(const Param& last_param, bool user_provided);
+ virtual void paramChanged(const Param& changed_param, bool user_provided);
S32 getLastChangeVersion() const { return mChangeVersion; }
- bool isDefault() const { return mChangeVersion == 0; }
- bool deserializeBlock(Parser& p, Parser::name_stack_range_t name_stack);
- bool serializeBlock(Parser& p, Parser::name_stack_t name_stack = Parser::name_stack_t(), const BaseBlock* diff_block = NULL) const;
- bool inspectBlock(Parser& p, Parser::name_stack_t name_stack = Parser::name_stack_t()) const;
+ bool deserializeBlock(Parser& p, Parser::name_stack_range_t name_stack, S32 generation);
+ void serializeBlock(Parser& p, Parser::name_stack_t name_stack = Parser::name_stack_t(), const BaseBlock* diff_block = NULL) const;
+ bool inspectBlock(Parser& p, Parser::name_stack_t name_stack = Parser::name_stack_t(), S32 min_count = 0, S32 max_count = S32_MAX) const;
virtual const BlockDescriptor& mostDerivedBlockDescriptor() const { return selfBlockDescriptor(); }
virtual BlockDescriptor& mostDerivedBlockDescriptor() { return selfBlockDescriptor(); }
@@ -493,13 +468,20 @@ namespace LLInitParam
return false;
}
- static void addParam(BlockDescriptor& block_data, const ParamDescriptor& param, const char* name);
+ static void addParam(BlockDescriptor& block_data, ParamDescriptorPtr param, const char* name);
+
+ ParamDescriptorPtr findParamDescriptor(const Param& param);
+
protected:
void init(BlockDescriptor& descriptor, BlockDescriptor& base_descriptor, size_t block_size);
+ bool mergeBlockParam(bool param_provided, BlockDescriptor& block_data, const BaseBlock& other, bool overwrite)
+ {
+ return mergeBlock(block_data, other, overwrite);
+ }
// take all provided params from other and apply to self
- bool merge(BlockDescriptor& block_data, const BaseBlock& other, bool overwrite);
+ bool mergeBlock(BlockDescriptor& block_data, const BaseBlock& other, bool overwrite);
// can be updated in getters
mutable S32 mChangeVersion;
@@ -512,63 +494,133 @@ namespace LLInitParam
private:
const std::string& getParamName(const BlockDescriptor& block_data, const Param* paramp) const;
- ParamDescriptor* findParamDescriptor(param_handle_t handle);
- };
-
-
- template<typename T>
- struct ParamIterator
- {
- typedef typename std::vector<T>::const_iterator const_iterator;
- typedef typename std::vector<T>::iterator iterator;
};
// these templates allow us to distinguish between template parameters
// that derive from BaseBlock and those that don't
- // this is supposedly faster than boost::is_convertible and its ilk
template<typename T, typename Void = void>
- struct IsBaseBlock
+ struct IsBlock
{
static const bool value = false;
};
template<typename T>
- struct IsBaseBlock<T, typename T::baseblock_base_class_t>
+ struct IsBlock<T, typename T::baseblock_base_class_t>
{
static const bool value = true;
};
+ template<typename T, typename NAME_VALUE_LOOKUP, bool VALUE_IS_BLOCK = IsBlock<T>::value>
+ class ParamValue : public NAME_VALUE_LOOKUP
+ {
+ public:
+ typedef const T& value_assignment_t;
+
+ ParamValue(): mValue() {}
+ ParamValue(const T& other) : mValue(other) {}
+
+ void setValue(value_assignment_t val)
+ {
+ mValue = val;
+ }
+
+ value_assignment_t getValue() const
+ {
+ return mValue;
+ }
+
+ T& getValue()
+ {
+ return mValue;
+ }
+
+ private:
+ T mValue;
+ };
+
+ template<typename T, typename NAME_VALUE_LOOKUP>
+ class ParamValue<T, NAME_VALUE_LOOKUP, true>
+ : public T,
+ public NAME_VALUE_LOOKUP
+ {
+ public:
+ typedef const T& value_assignment_t;
+
+ S32 mKeyVersion;
+ mutable S32 mValidatedVersion;
+ mutable bool mValidated; // lazy validation flag
+
+ ParamValue()
+ : T(),
+ mKeyVersion(0),
+ mValidatedVersion(-1),
+ mValidated(false)
+ {}
+
+ ParamValue(const T& other)
+ : T(other),
+ mKeyVersion(0),
+ mValidatedVersion(-1),
+ mValidated(false)
+ {
+ }
+
+ void setValue(value_assignment_t val)
+ {
+ *this = val;
+ }
+
+ value_assignment_t getValue() const
+ {
+ return *this;
+ }
+
+ T& getValue()
+ {
+ return *this;
+ }
+ };
+
+ template<typename T, typename NAME_VALUE_LOOKUP = TypeValues<T> >
+ struct ParamIterator
+ {
+ typedef typename std::vector<ParamValue<T, NAME_VALUE_LOOKUP> >::const_iterator const_iterator;
+ typedef typename std::vector<ParamValue<T, NAME_VALUE_LOOKUP> >::iterator iterator;
+ };
+
// specialize for custom parsing/decomposition of specific classes
// e.g. TypedParam<LLRect> has left, top, right, bottom, etc...
template<typename T,
typename NAME_VALUE_LOOKUP = TypeValues<T>,
bool HAS_MULTIPLE_VALUES = false,
- bool VALUE_IS_BLOCK = IsBaseBlock<T>::value>
+ bool VALUE_IS_BLOCK = IsBlock<ParamValue<T, NAME_VALUE_LOOKUP> >::value>
class TypedParam
- : public Param
+ : public Param,
+ public ParamValue<T, NAME_VALUE_LOOKUP>
{
public:
- typedef const T& value_const_ref_t;
- typedef value_const_ref_t value_assignment_t;
- typedef typename NAME_VALUE_LOOKUP::KeyCache key_cache_t;
+ typedef const T& value_assignment_t;
typedef TypedParam<T, NAME_VALUE_LOOKUP, HAS_MULTIPLE_VALUES, VALUE_IS_BLOCK> self_t;
+ typedef NAME_VALUE_LOOKUP name_value_lookup_t;
+ typedef ParamValue<T, NAME_VALUE_LOOKUP> param_value_t;
TypedParam(BlockDescriptor& block_descriptor, const char* name, value_assignment_t value, ParamDescriptor::validation_func_t validate_func, S32 min_count, S32 max_count)
: Param(block_descriptor.mCurrentBlockPtr)
{
if (LL_UNLIKELY(block_descriptor.mInitializationState == BlockDescriptor::INITIALIZING))
{
- ParamDescriptor param_descriptor(block_descriptor.mCurrentBlockPtr->getHandleFromParam(this),
+ ParamDescriptorPtr param_descriptor = ParamDescriptorPtr(new ParamDescriptor(
+ block_descriptor.mCurrentBlockPtr->getHandleFromParam(this),
&mergeWith,
&deserializeParam,
&serializeParam,
validate_func,
&inspectParam,
- min_count, max_count);
+ min_count, max_count));
BaseBlock::addParam(block_descriptor, param_descriptor, name);
}
- mData.mValue = value;
+ setValue(value);
}
bool isProvided() const { return Param::anyProvided(); }
@@ -579,27 +631,27 @@ namespace LLInitParam
// no further names in stack, attempt to parse value now
if (name_stack.first == name_stack.second)
{
- if (parser.readValue(typed_param.mData.mValue))
+ if (parser.readValue(typed_param.getValue()))
{
- typed_param.mData.clearKey();
+ typed_param.clearValueName();
typed_param.setProvided(true);
- typed_param.enclosingBlock().setLastChangedParam(param, true);
+ typed_param.enclosingBlock().paramChanged(param, true);
return true;
}
// try to parse a known named value
- if(!NAME_VALUE_LOOKUP::empty())
+ if(name_value_lookup_t::valueNamesExist())
{
// try to parse a known named value
std::string name;
if (parser.readValue(name))
{
// try to parse a per type named value
- if (NAME_VALUE_LOOKUP::get(name, typed_param.mData.mValue))
+ if (name_value_lookup_t::getValueFromName(name, typed_param.getValue()))
{
- typed_param.mData.setKey(name);
+ typed_param.setValueName(name);
typed_param.setProvided(true);
- typed_param.enclosingBlock().setLastChangedParam(param, true);
+ typed_param.enclosingBlock().paramChanged(param, true);
return true;
}
@@ -619,13 +671,13 @@ namespace LLInitParam
name_stack.back().second = parser.newParseGeneration();
}
- std::string key = typed_param.mData.getKey();
+ std::string key = typed_param.getValueName();
// first try to write out name of name/value pair
if (!key.empty())
{
- if (!diff_param || !ParamCompare<std::string>::equals(static_cast<const self_t*>(diff_param)->mData.getKey(), key))
+ if (!diff_param || !ParamCompare<std::string>::equals(static_cast<const self_t*>(diff_param)->getValueName(), key))
{
if (!parser.writeValue(key, name_stack))
{
@@ -634,8 +686,9 @@ namespace LLInitParam
}
}
// then try to serialize value directly
- else if (!diff_param || !ParamCompare<T>::equals(typed_param.get(), static_cast<const self_t*>(diff_param)->get())) {
- if (!parser.writeValue(typed_param.mData.mValue, name_stack))
+ else if (!diff_param || !ParamCompare<T>::equals(typed_param.getValue(), static_cast<const self_t*>(diff_param)->getValue()))
+ {
+ if (!parser.writeValue(typed_param.getValue(), name_stack))
{
return;
}
@@ -647,18 +700,18 @@ namespace LLInitParam
// tell parser about our actual type
parser.inspectValue<T>(name_stack, min_count, max_count, NULL);
// then tell it about string-based alternatives ("red", "blue", etc. for LLColor4)
- if (NAME_VALUE_LOOKUP::getPossibleValues())
+ if (name_value_lookup_t::getPossibleValues())
{
- parser.inspectValue<std::string>(name_stack, min_count, max_count, NAME_VALUE_LOOKUP::getPossibleValues());
+ parser.inspectValue<std::string>(name_stack, min_count, max_count, name_value_lookup_t::getPossibleValues());
}
}
void set(value_assignment_t val, bool flag_as_provided = true)
{
- mData.mValue = val;
- mData.clearKey();
+ setValue(val);
+ param_value_t::clearValueName();
setProvided(flag_as_provided);
- Param::enclosingBlock().setLastChangedParam(*this, flag_as_provided);
+ Param::enclosingBlock().paramChanged(*this, flag_as_provided);
}
void setIfNotProvided(value_assignment_t val, bool flag_as_provided = true)
@@ -670,65 +723,56 @@ namespace LLInitParam
}
// implicit conversion
- operator value_assignment_t() const { return get(); }
+ operator value_assignment_t() const { return param_value_t::getValue(); }
// explicit conversion
- value_assignment_t operator()() const { return get(); }
+ value_assignment_t operator()() const { return param_value_t::getValue(); }
protected:
- value_assignment_t get() const
- {
- return mData.mValue;
- }
static bool mergeWith(Param& dst, const Param& src, bool overwrite)
{
const self_t& src_typed_param = static_cast<const self_t&>(src);
self_t& dst_typed_param = static_cast<self_t&>(dst);
+
if (src_typed_param.isProvided()
&& (overwrite || !dst_typed_param.isProvided()))
{
- dst_typed_param.mData.clearKey();
- dst_typed_param.set(src_typed_param.get());
+ dst_typed_param.clearValueName();
+ dst_typed_param.set(src_typed_param.getValue());
return true;
}
return false;
}
-
- struct Data : public key_cache_t
- {
- T mValue;
- };
-
- Data mData;
};
// parameter that is a block
template <typename T, typename NAME_VALUE_LOOKUP>
class TypedParam<T, NAME_VALUE_LOOKUP, false, true>
- : public T,
- public Param
+ : public Param,
+ public ParamValue<T, NAME_VALUE_LOOKUP>
{
public:
typedef const T value_const_t;
typedef T value_t;
- typedef value_const_t& value_const_ref_t;
- typedef value_const_ref_t value_assignment_t;
- typedef typename NAME_VALUE_LOOKUP::KeyCache key_cache_t;
+ typedef value_const_t& value_assignment_t;
typedef TypedParam<T, NAME_VALUE_LOOKUP, false, true> self_t;
+ typedef NAME_VALUE_LOOKUP name_value_lookup_t;
+ typedef ParamValue<T, NAME_VALUE_LOOKUP> param_value_t;
TypedParam(BlockDescriptor& block_descriptor, const char* name, value_assignment_t value, ParamDescriptor::validation_func_t validate_func, S32 min_count, S32 max_count)
: Param(block_descriptor.mCurrentBlockPtr),
- T(value)
+ param_value_t(value)
{
if (LL_UNLIKELY(block_descriptor.mInitializationState == BlockDescriptor::INITIALIZING))
{
- ParamDescriptor param_descriptor(block_descriptor.mCurrentBlockPtr->getHandleFromParam(this),
+ ParamDescriptorPtr param_descriptor = ParamDescriptorPtr(new ParamDescriptor(
+ block_descriptor.mCurrentBlockPtr->getHandleFromParam(this),
&mergeWith,
&deserializeParam,
&serializeParam,
validate_func,
&inspectParam,
- min_count, max_count);
+ min_count, max_count));
BaseBlock::addParam(block_descriptor, param_descriptor, name);
}
}
@@ -737,25 +781,27 @@ namespace LLInitParam
{
self_t& typed_param = static_cast<self_t&>(param);
// attempt to parse block...
- if(typed_param.deserializeBlock(parser, name_stack))
+ if(typed_param.deserializeBlock(parser, name_stack, generation))
{
- typed_param.mData.clearKey();
- typed_param.enclosingBlock().setLastChangedParam(param, true);
+ typed_param.clearValueName();
+ typed_param.enclosingBlock().paramChanged(param, true);
+ typed_param.setProvided(true);
return true;
}
- if(!NAME_VALUE_LOOKUP::empty())
+ if(name_value_lookup_t::valueNamesExist())
{
// try to parse a known named value
std::string name;
if (parser.readValue(name))
{
// try to parse a per type named value
- if (NAME_VALUE_LOOKUP::get(name, typed_param))
+ if (name_value_lookup_t::getValueFromName(name, typed_param.getValue()))
{
- typed_param.enclosingBlock().setLastChangedParam(param, true);
- typed_param.mData.setKey(name);
- typed_param.mData.mKeyVersion = typed_param.getLastChangeVersion();
+ typed_param.enclosingBlock().paramChanged(param, true);
+ typed_param.setValueName(name);
+ typed_param.setProvided(true);
+ typed_param.mKeyVersion = typed_param.getLastChangeVersion();
return true;
}
@@ -767,13 +813,15 @@ namespace LLInitParam
static void serializeParam(const Param& param, Parser& parser, Parser::name_stack_t& name_stack, const Param* diff_param)
{
const self_t& typed_param = static_cast<const self_t&>(param);
+ if (!typed_param.isProvided()) return;
+
if (!name_stack.empty())
{
name_stack.back().second = parser.newParseGeneration();
}
- std::string key = typed_param.mData.getKey();
- if (!key.empty() && typed_param.mData.mKeyVersion == typed_param.getLastChangeVersion())
+ std::string key = typed_param.getValueName();
+ if (!key.empty() && typed_param.mKeyVersion == typed_param.getLastChangeVersion())
{
if (!parser.writeValue(key, name_stack))
{
@@ -790,33 +838,33 @@ namespace LLInitParam
{
// I am a param that is also a block, so just recurse into my contents
const self_t& typed_param = static_cast<const self_t&>(param);
- typed_param.inspectBlock(parser, name_stack);
+ typed_param.inspectBlock(parser, name_stack, min_count, max_count);
}
// a param-that-is-a-block is provided when the user has set one of its child params
// *and* the block as a whole validates
bool isProvided() const
{
- // only validate block when it hasn't already passed validation and user has supplied *some* value
- if (Param::anyProvided() && mData.mValidatedVersion < T::getLastChangeVersion())
+ // only validate block when it hasn't already passed validation with current data
+ if (Param::anyProvided() && param_value_t::mValidatedVersion < param_value_t::getLastChangeVersion())
{
// a sub-block is "provided" when it has been filled in enough to be valid
- mData.mValidated = T::validateBlock(false);
- mData.mValidatedVersion = T::getLastChangeVersion();
+ param_value_t::mValidated = param_value_t::validateBlock(false);
+ param_value_t::mValidatedVersion = param_value_t::getLastChangeVersion();
}
- return Param::anyProvided() && mData.mValidated;
+ return Param::anyProvided() && param_value_t::mValidated;
}
// assign block contents to this param-that-is-a-block
void set(value_assignment_t val, bool flag_as_provided = true)
{
- value_t::operator=(val);
- mData.clearKey();
+ setValue(val);
+ param_value_t::clearValueName();
// force revalidation of block by clearing known provided version
// next call to isProvided() will update provision status based on validity
- mData.mValidatedVersion = 0;
+ param_value_t::mValidatedVersion = -1;
setProvided(flag_as_provided);
- Param::enclosingBlock().setLastChangedParam(*this, flag_as_provided);
+ Param::enclosingBlock().paramChanged(*this, flag_as_provided);
}
void setIfNotProvided(value_assignment_t val, bool flag_as_provided = true)
@@ -828,10 +876,10 @@ namespace LLInitParam
}
// propagate changed status up to enclosing block
- /*virtual*/ void setLastChangedParam(const Param& last_param, bool user_provided)
+ /*virtual*/ void paramChanged(const Param& changed_param, bool user_provided)
{
- T::setLastChangedParam(last_param, user_provided);
- Param::enclosingBlock().setLastChangedParam(*this, user_provided);
+ ParamValue<T, NAME_VALUE_LOOKUP>::paramChanged(changed_param, user_provided);
+ Param::enclosingBlock().paramChanged(*this, user_provided);
if (user_provided)
{
// a child param has been explicitly changed
@@ -841,41 +889,30 @@ namespace LLInitParam
}
// implicit conversion
- operator value_assignment_t() const { return get(); }
+ operator value_assignment_t() const { return param_value_t::getValue(); }
// explicit conversion
- value_assignment_t operator()() const { return get(); }
+ value_assignment_t operator()() const { return param_value_t::getValue(); }
protected:
- value_assignment_t get() const
- {
- return *this;
- }
static bool mergeWith(Param& dst, const Param& src, bool overwrite)
{
const self_t& src_typed_param = static_cast<const self_t&>(src);
self_t& dst_typed_param = static_cast<self_t&>(dst);
- if (dst_typed_param.T::merge(T::selfBlockDescriptor(), src_typed_param, overwrite))
+
+ if (src_typed_param.anyProvided())
{
- dst_typed_param.mData.clearKey();
- return true;
+ bool param_provided = src_typed_param.isProvided() && (overwrite || !dst_typed_param.isProvided());
+ if (dst_typed_param.mergeBlockParam(param_provided, param_value_t::selfBlockDescriptor(), src_typed_param, overwrite))
+ {
+ dst_typed_param.clearValueName();
+ dst_typed_param.setProvided(true);
+ dst_typed_param.enclosingBlock().paramChanged(dst_typed_param, true);
+ return true;
+ }
}
return false;
}
-
- struct Data : public key_cache_t
- {
- S32 mKeyVersion;
- mutable S32 mValidatedVersion;
- mutable bool mValidated; // lazy validation flag
-
- Data()
- : mKeyVersion(0),
- mValidatedVersion(0),
- mValidated(false)
- {}
- };
- Data mData;
};
// container of non-block parameters
@@ -885,29 +922,28 @@ namespace LLInitParam
{
public:
typedef TypedParam<VALUE_TYPE, NAME_VALUE_LOOKUP, true, false> self_t;
- typedef typename std::vector<VALUE_TYPE> container_t;
+ typedef ParamValue<VALUE_TYPE, NAME_VALUE_LOOKUP> param_value_t;
+ typedef typename std::vector<param_value_t> container_t;
typedef const container_t& value_assignment_t;
typedef VALUE_TYPE value_t;
- typedef value_t& value_ref_t;
- typedef const value_t& value_const_ref_t;
+ typedef NAME_VALUE_LOOKUP name_value_lookup_t;
- typedef typename NAME_VALUE_LOOKUP::KeyCache key_cache_t;
-
TypedParam(BlockDescriptor& block_descriptor, const char* name, value_assignment_t value, ParamDescriptor::validation_func_t validate_func, S32 min_count, S32 max_count)
- : Param(block_descriptor.mCurrentBlockPtr),
- mValues(value)
+ : Param(block_descriptor.mCurrentBlockPtr)
{
- mCachedKeys.resize(mValues.size());
+ std::copy(value.begin(), value.end(), std::back_inserter(mValues));
+
if (LL_UNLIKELY(block_descriptor.mInitializationState == BlockDescriptor::INITIALIZING))
{
- ParamDescriptor param_descriptor(block_descriptor.mCurrentBlockPtr->getHandleFromParam(this),
+ ParamDescriptorPtr param_descriptor = ParamDescriptorPtr(new ParamDescriptor(
+ block_descriptor.mCurrentBlockPtr->getHandleFromParam(this),
&mergeWith,
&deserializeParam,
&serializeParam,
validate_func,
&inspectParam,
- min_count, max_count);
+ min_count, max_count));
BaseBlock::addParam(block_descriptor, param_descriptor, name);
}
}
@@ -924,29 +960,22 @@ namespace LLInitParam
// attempt to read value directly
if (parser.readValue(value))
{
- typed_param.mValues.push_back(value);
- // save an empty name/value key as a placeholder
- typed_param.mCachedKeys.push_back(key_cache_t());
- typed_param.enclosingBlock().setLastChangedParam(param, true);
- typed_param.setProvided(true);
+ typed_param.add(value);
return true;
}
// try to parse a known named value
- if(!NAME_VALUE_LOOKUP::empty())
+ if(name_value_lookup_t::valueNamesExist())
{
// try to parse a known named value
std::string name;
if (parser.readValue(name))
{
// try to parse a per type named value
- if (NAME_VALUE_LOOKUP::get(name, typed_param.mValues))
+ if (name_value_lookup_t::getValueFromName(name, typed_param.mValues))
{
- typed_param.mValues.push_back(value);
- typed_param.mCachedKeys.push_back(key_cache_t());
- typed_param.mCachedKeys.back().setKey(name);
- typed_param.enclosingBlock().setLastChangedParam(param, true);
- typed_param.setProvided(true);
+ typed_param.add(value);
+ typed_param.mValues.back().setValueName(name);
return true;
}
@@ -961,25 +990,27 @@ namespace LLInitParam
const self_t& typed_param = static_cast<const self_t&>(param);
if (!typed_param.isProvided() || name_stack.empty()) return;
- const_iterator it = typed_param.mValues.begin();
- for (typename std::vector<key_cache_t>::const_iterator key_it = typed_param.mCachedKeys.begin();
- it != typed_param.mValues.end();
- ++key_it, ++it)
+ for (const_iterator it = typed_param.mValues.begin(), end_it = typed_param.mValues.end();
+ it != end_it;
+ ++it)
{
- std::string key = key_it->get();
+ std::string key = it->getValue();
name_stack.back().second = parser.newParseGeneration();
- if(!key.empty())
+ if(key.empty())
+ // not parsed via name values, write out value directly
{
- if(!parser.writeValue(key, name_stack))
+ if (!parser.writeValue(*it, name_stack))
{
- return;
+ break;
}
}
- // not parse via name values, write out value directly
- else if (!parser.writeValue(*it, name_stack))
+ else
{
- return;
+ if(!parser.writeValue(key, name_stack))
+ {
+ break;
+ }
}
}
}
@@ -987,19 +1018,17 @@ namespace LLInitParam
static void inspectParam(const Param& param, Parser& parser, Parser::name_stack_t& name_stack, S32 min_count, S32 max_count)
{
parser.inspectValue<VALUE_TYPE>(name_stack, min_count, max_count, NULL);
- if (NAME_VALUE_LOOKUP::getPossibleValues())
+ if (name_value_lookup_t::getPossibleValues())
{
- parser.inspectValue<std::string>(name_stack, min_count, max_count, NAME_VALUE_LOOKUP::getPossibleValues());
+ parser.inspectValue<std::string>(name_stack, min_count, max_count, name_value_lookup_t::getPossibleValues());
}
}
void set(value_assignment_t val, bool flag_as_provided = true)
{
mValues = val;
- mCachedKeys.clear();
- mCachedKeys.resize(mValues.size());
setProvided(flag_as_provided);
- Param::enclosingBlock().setLastChangedParam(*this, flag_as_provided);
+ Param::enclosingBlock().paramChanged(*this, flag_as_provided);
}
@@ -1011,23 +1040,23 @@ namespace LLInitParam
}
}
- value_ref_t add()
+ value_t& add()
{
- mValues.push_back(value_t());
- mCachedKeys.push_back(key_cache_t());
+ mValues.push_back(param_value_t(value_t()));
setProvided(true);
+ Param::enclosingBlock().paramChanged(*this, true);
return mValues.back();
}
- void add(value_const_ref_t item)
+ void add(const value_t& item)
{
- mValues.push_back(item);
- mCachedKeys.push_back(key_cache_t());
+ mValues.push_back(param_value_t(item));
setProvided(true);
+ Param::enclosingBlock().paramChanged(*this, true);
}
// implicit conversion
- operator value_assignment_t() const { return self_t::get(); }
+ operator value_assignment_t() const { return mValues; }
typedef typename container_t::iterator iterator;
typedef typename container_t::const_iterator const_iterator;
@@ -1044,27 +1073,31 @@ namespace LLInitParam
}
protected:
- value_assignment_t get() const
- {
- return mValues;
- }
-
static bool mergeWith(Param& dst, const Param& src, bool overwrite)
{
const self_t& src_typed_param = static_cast<const self_t&>(src);
self_t& dst_typed_param = static_cast<self_t&>(dst);
- if (src_typed_param.isProvided()
- && (overwrite || !dst_typed_param.isProvided()))
+ if (overwrite)
{
- dst_typed_param.set(src_typed_param.get());
- return true;
+ std::copy(src_typed_param.begin(), src_typed_param.end(), std::back_inserter(dst_typed_param.mValues));
}
- return false;
+ else
+ {
+ container_t new_values(src_typed_param.mValues);
+ std::copy(dst_typed_param.begin(), dst_typed_param.end(), std::back_inserter(new_values));
+ std::swap(dst_typed_param.mValues, new_values);
+ }
+
+ if (src_typed_param.begin() != src_typed_param.end())
+ {
+ dst_typed_param.setProvided(true);
+ dst_typed_param.enclosingBlock().paramChanged(dst_typed_param, true);
+ }
+ return true;
}
container_t mValues;
- std::vector<key_cache_t> mCachedKeys;
};
// container of block parameters
@@ -1074,80 +1107,76 @@ namespace LLInitParam
{
public:
typedef TypedParam<VALUE_TYPE, NAME_VALUE_LOOKUP, true, true> self_t;
- typedef typename std::vector<VALUE_TYPE> container_t;
+ typedef ParamValue<VALUE_TYPE, NAME_VALUE_LOOKUP> param_value_t;
+ typedef typename std::vector<param_value_t> container_t;
typedef const container_t& value_assignment_t;
-
typedef VALUE_TYPE value_t;
- typedef value_t& value_ref_t;
- typedef const value_t& value_const_ref_t;
-
- typedef typename NAME_VALUE_LOOKUP::KeyCache key_cache_t;
+ typedef NAME_VALUE_LOOKUP name_value_lookup_t;
TypedParam(BlockDescriptor& block_descriptor, const char* name, value_assignment_t value, ParamDescriptor::validation_func_t validate_func, S32 min_count, S32 max_count)
: Param(block_descriptor.mCurrentBlockPtr),
- mValues(value),
- mLastParamGeneration(0)
+ mLastParseGeneration(0)
{
- mCachedKeys.resize(mValues.size());
+ std::copy(value.begin(), value.end(), back_inserter(mValues));
+
if (LL_UNLIKELY(block_descriptor.mInitializationState == BlockDescriptor::INITIALIZING))
{
- ParamDescriptor param_descriptor(block_descriptor.mCurrentBlockPtr->getHandleFromParam(this),
+ ParamDescriptorPtr param_descriptor = ParamDescriptorPtr(new ParamDescriptor(
+ block_descriptor.mCurrentBlockPtr->getHandleFromParam(this),
&mergeWith,
&deserializeParam,
&serializeParam,
validate_func,
&inspectParam,
- min_count, max_count);
+ min_count, max_count));
BaseBlock::addParam(block_descriptor, param_descriptor, name);
}
}
bool isProvided() const { return Param::anyProvided(); }
- value_ref_t operator[](S32 index) { return mValues[index]; }
- value_const_ref_t operator[](S32 index) const { return mValues[index]; }
-
static bool deserializeParam(Param& param, Parser& parser, const Parser::name_stack_range_t& name_stack, S32 generation)
{
self_t& typed_param = static_cast<self_t&>(param);
bool new_value = false;
- if (generation != typed_param.mLastParamGeneration || typed_param.mValues.empty())
+
+ if (generation != typed_param.mLastParseGeneration
+ || typed_param.mValues.empty())
{
new_value = true;
typed_param.mValues.push_back(value_t());
- typed_param.mCachedKeys.push_back(Data());
}
- value_ref_t value = typed_param.mValues.back();
+ param_value_t& value = typed_param.mValues.back();
// attempt to parse block...
- if(value.deserializeBlock(parser, name_stack))
+ if(value.deserializeBlock(parser, name_stack, generation))
{
if (new_value)
{ // successfully parsed new value, let's keep it
- typed_param.mLastParamGeneration = generation;
+ typed_param.mLastParseGeneration = generation;
}
- typed_param.enclosingBlock().setLastChangedParam(param, true);
+ typed_param.enclosingBlock().paramChanged(param, true);
typed_param.setProvided(true);
return true;
}
- else if(!NAME_VALUE_LOOKUP::empty())
+ else if(name_value_lookup_t::valueNamesExist())
{
// try to parse a known named value
std::string name;
if (parser.readValue(name))
{
// try to parse a per type named value
- if (NAME_VALUE_LOOKUP::get(name, value))
+ if (name_value_lookup_t::getValueFromName(name, value.getValue()))
{
if (new_value)
{ // successfully parsed new value, let's keep it
- typed_param.mLastParamGeneration = generation;
+ typed_param.mLastParseGeneration = generation;
}
- typed_param.mCachedKeys.back().setKey(name);
- typed_param.mCachedKeys.back().mKeyVersion = value.getLastChangeVersion();
- typed_param.enclosingBlock().setLastChangedParam(param, true);
+ typed_param.mValues.back().setValueName(name);
+ typed_param.mValues.back().mKeyVersion = value.getLastChangeVersion();
+ typed_param.enclosingBlock().paramChanged(param, true);
typed_param.setProvided(true);
return true;
}
@@ -1158,7 +1187,6 @@ namespace LLInitParam
if (new_value)
{ // failed to parse new value, pop it off
typed_param.mValues.pop_back();
- typed_param.mCachedKeys.pop_back();
}
return false;
@@ -1169,26 +1197,22 @@ namespace LLInitParam
const self_t& typed_param = static_cast<const self_t&>(param);
if (!typed_param.isProvided() || name_stack.empty()) return;
- const_iterator it = typed_param.mValues.begin();
- for (typename std::vector<Data>::const_iterator key_it = typed_param.mCachedKeys.begin();
- it != typed_param.mValues.end();
- ++key_it, ++it)
+ for (const_iterator it = typed_param.mValues.begin(), end_it = typed_param.mValues.end();
+ it != end_it;
+ ++it)
{
name_stack.back().second = parser.newParseGeneration();
- std::string key = key_it->getKey();
- if (!key.empty() && key_it->mKeyVersion == it->getLastChangeVersion())
+ std::string key = it->getValueName();
+ if (!key.empty() && it->mKeyVersion == it->getLastChangeVersion())
{
- if(!parser.writeValue(key, name_stack))
- {
- return;
- }
+ parser.writeValue(key, name_stack);
}
// Not parsed via named values, write out value directly
// NOTE: currently we don't worry about removing default values in Multiple
- else if (!it->serializeBlock(parser, name_stack, NULL))
+ else
{
- return;
+ it->serializeBlock(parser, name_stack, NULL);
}
}
}
@@ -1196,16 +1220,14 @@ namespace LLInitParam
static void inspectParam(const Param& param, Parser& parser, Parser::name_stack_t& name_stack, S32 min_count, S32 max_count)
{
// I am a vector of blocks, so describe my contents recursively
- value_t().inspectBlock(parser, name_stack);
+ param_value_t(value_t()).inspectBlock(parser, name_stack, min_count, max_count);
}
void set(value_assignment_t val, bool flag_as_provided = true)
{
mValues = val;
- mCachedKeys.clear();
- mCachedKeys.resize(mValues.size());
setProvided(flag_as_provided);
- Param::enclosingBlock().setLastChangedParam(*this, flag_as_provided);
+ Param::enclosingBlock().paramChanged(*this, flag_as_provided);
}
void setIfNotProvided(value_assignment_t val, bool flag_as_provided = true)
@@ -1216,23 +1238,23 @@ namespace LLInitParam
}
}
- value_ref_t add()
+ value_t& add()
{
mValues.push_back(value_t());
- mCachedKeys.push_back(Data());
setProvided(true);
+ Param::enclosingBlock().paramChanged(*this, true);
return mValues.back();
}
- void add(value_const_ref_t item)
+ void add(const value_t& item)
{
mValues.push_back(item);
- mCachedKeys.push_back(Data());
setProvided(true);
+ Param::enclosingBlock().paramChanged(*this, true);
}
// implicit conversion
- operator value_assignment_t() const { return self_t::get(); }
+ operator value_assignment_t() const { return mValues; }
typedef typename container_t::iterator iterator;
typedef typename container_t::const_iterator const_iterator;
@@ -1246,8 +1268,8 @@ namespace LLInitParam
U32 numValidElements() const
{
U32 count = 0;
- for (const_iterator it = mValues.begin();
- it != mValues.end();
+ for (const_iterator it = mValues.begin(), end_it = mValues.end();
+ it != end_it;
++it)
{
if(it->validateBlock(false)) count++;
@@ -1256,74 +1278,77 @@ namespace LLInitParam
}
protected:
- value_assignment_t get() const
- {
- return mValues;
- }
static bool mergeWith(Param& dst, const Param& src, bool overwrite)
{
const self_t& src_typed_param = static_cast<const self_t&>(src);
self_t& dst_typed_param = static_cast<self_t&>(dst);
- if (src_typed_param.isProvided()
- && (overwrite || !dst_typed_param.isProvided()))
+ if (overwrite)
{
- dst_typed_param.set(src_typed_param.get());
- return true;
+ std::copy(src_typed_param.begin(), src_typed_param.end(), std::back_inserter(dst_typed_param.mValues));
+ }
+ else
+ {
+ container_t new_values(src_typed_param.mValues);
+ std::copy(dst_typed_param.begin(), dst_typed_param.end(), std::back_inserter(new_values));
+ std::swap(dst_typed_param.mValues, new_values);
}
- return false;
- }
- struct Data : public key_cache_t
- {
- S32 mKeyVersion; // version of block for which key was last valid
+ if (src_typed_param.begin() != src_typed_param.end())
+ {
+ dst_typed_param.setProvided(true);
+ dst_typed_param.enclosingBlock().paramChanged(dst_typed_param, true);
+ }
- Data() : mKeyVersion(0) {}
- };
+ return true;
+ }
container_t mValues;
- std::vector<Data> mCachedKeys;
- S32 mLastParamGeneration;
+ S32 mLastParseGeneration;
};
template <typename DERIVED_BLOCK>
class Choice : public BaseBlock
{
- typedef Choice<DERIVED_BLOCK> self_t;
- typedef Choice<DERIVED_BLOCK> enclosing_block_t;
+ typedef Choice<DERIVED_BLOCK> self_t;
+ typedef Choice<DERIVED_BLOCK> enclosing_block_t;
LOG_CLASS(self_t);
public:
// take all provided params from other and apply to self
bool overwriteFrom(const self_t& other)
{
- return merge(selfBlockDescriptor(), other, true);
+ return mergeBlock(selfBlockDescriptor(), other, true);
}
// take all provided params that are not already provided, and apply to self
bool fillFrom(const self_t& other)
{
- return merge(selfBlockDescriptor(), other, false);
+ return mergeBlock(selfBlockDescriptor(), other, false);
}
- // merge with other block
- bool merge(BlockDescriptor& block_data, const self_t& other, bool overwrite)
+ bool mergeBlockParam(bool param_provided, BlockDescriptor& block_data, const self_t& other, bool overwrite)
{
- // only merge a choice if we are overwriting with other's contents
- if (overwrite)
+ if (param_provided)
{
- mCurChoice = other.mCurChoice;
- return BaseBlock::merge(selfBlockDescriptor(), other, overwrite);
+ return mergeBlock(block_data, other, overwrite);
}
return false;
}
+ // merge with other block
+ bool mergeBlock(BlockDescriptor& block_data, const self_t& other, bool overwrite)
+ {
+ mCurChoice = other.mCurChoice;
+ return BaseBlock::mergeBlock(selfBlockDescriptor(), other, overwrite);
+ }
+
// clear out old choice when param has changed
- /*virtual*/ void setLastChangedParam(const Param& last_param, bool user_provided)
+ /*virtual*/ void paramChanged(const Param& changed_param, bool user_provided)
{
- param_handle_t changed_param_handle = BaseBlock::getHandleFromParam(&last_param);
+ param_handle_t changed_param_handle = BaseBlock::getHandleFromParam(&changed_param);
// if we have a new choice...
if (changed_param_handle != mCurChoice)
{
@@ -1335,7 +1360,7 @@ namespace LLInitParam
}
mCurChoice = changed_param_handle;
}
- BaseBlock::setLastChangedParam(last_param, user_provided);
+ BaseBlock::paramChanged(changed_param, user_provided);
}
virtual const BlockDescriptor& mostDerivedBlockDescriptor() const { return selfBlockDescriptor(); }
@@ -1358,20 +1383,21 @@ namespace LLInitParam
friend class Choice<DERIVED_BLOCK>;
typedef Alternative<T, NAME_VALUE_LOOKUP> self_t;
- typedef TypedParam<T, NAME_VALUE_LOOKUP, false, IsBaseBlock<T>::value> super_t;
+ typedef TypedParam<T, NAME_VALUE_LOOKUP, false, IsBlock<ParamValue<T, NAME_VALUE_LOOKUP> >::value> super_t;
typedef typename super_t::value_assignment_t value_assignment_t;
- explicit Alternative(const char* name, value_assignment_t val = DefaultInitializer<T>::get())
+ explicit Alternative(const char* name, value_assignment_t val = defaultValue<T>())
: super_t(DERIVED_BLOCK::selfBlockDescriptor(), name, val, NULL, 0, 1),
mOriginalValue(val)
{
// assign initial choice to first declared option
DERIVED_BLOCK* blockp = ((DERIVED_BLOCK*)DERIVED_BLOCK::selfBlockDescriptor().mCurrentBlockPtr);
- if (LL_UNLIKELY(
- DERIVED_BLOCK::selfBlockDescriptor().mInitializationState == BlockDescriptor::INITIALIZING
- && blockp->mCurChoice == 0))
+ if (LL_UNLIKELY(DERIVED_BLOCK::selfBlockDescriptor().mInitializationState == BlockDescriptor::INITIALIZING))
{
- blockp->mCurChoice = Param::enclosingBlock().getHandleFromParam(this);
+ if(blockp->mCurChoice == 0)
+ {
+ blockp->mCurChoice = Param::enclosingBlock().getHandleFromParam(this);
+ }
}
}
@@ -1390,7 +1416,7 @@ namespace LLInitParam
{
if (static_cast<enclosing_block_t&>(Param::enclosingBlock()).getCurrentChoice() == this)
{
- return super_t::get();
+ return super_t::getValue();
}
return mOriginalValue;
}
@@ -1399,7 +1425,7 @@ namespace LLInitParam
{
if (static_cast<enclosing_block_t&>(Param::enclosingBlock()).getCurrentChoice() == this)
{
- return super_t::get();
+ return super_t::getValue();
}
return mOriginalValue;
}
@@ -1433,8 +1459,8 @@ namespace LLInitParam
class Block
: public BASE_BLOCK
{
- typedef Block<DERIVED_BLOCK, BASE_BLOCK> self_t;
- typedef Block<DERIVED_BLOCK, BASE_BLOCK> block_t;
+ typedef Block<DERIVED_BLOCK, BASE_BLOCK> self_t;
+ typedef Block<DERIVED_BLOCK, BASE_BLOCK> block_t;
public:
typedef BASE_BLOCK base_block_t;
@@ -1442,13 +1468,13 @@ namespace LLInitParam
// take all provided params from other and apply to self
bool overwriteFrom(const self_t& other)
{
- return BaseBlock::merge(selfBlockDescriptor(), other, true);
+ return static_cast<DERIVED_BLOCK*>(this)->mergeBlock(selfBlockDescriptor(), other, true);
}
// take all provided params that are not already provided, and apply to self
bool fillFrom(const self_t& other)
{
- return BaseBlock::merge(selfBlockDescriptor(), other, false);
+ return static_cast<DERIVED_BLOCK*>(this)->mergeBlock(selfBlockDescriptor(), other, false);
}
virtual const BlockDescriptor& mostDerivedBlockDescriptor() const { return selfBlockDescriptor(); }
@@ -1468,10 +1494,10 @@ namespace LLInitParam
class Optional : public TypedParam<T, NAME_VALUE_LOOKUP, false>
{
public:
- typedef TypedParam<T, NAME_VALUE_LOOKUP, false, IsBaseBlock<T>::value> super_t;
+ typedef TypedParam<T, NAME_VALUE_LOOKUP, false, IsBlock<ParamValue<T, NAME_VALUE_LOOKUP> >::value> super_t;
typedef typename super_t::value_assignment_t value_assignment_t;
- explicit Optional(const char* name = "", value_assignment_t val = DefaultInitializer<T>::get())
+ explicit Optional(const char* name = "", value_assignment_t val = defaultValue<T>())
: super_t(DERIVED_BLOCK::selfBlockDescriptor(), name, val, NULL, 0, 1)
{
//#pragma message("Parsing LLInitParam::Block::Optional")
@@ -1483,7 +1509,7 @@ namespace LLInitParam
return *this;
}
- DERIVED_BLOCK& operator()(typename super_t::value_assignment_t val)
+ DERIVED_BLOCK& operator()(value_assignment_t val)
{
super_t::set(val);
return static_cast<DERIVED_BLOCK&>(Param::enclosingBlock());
@@ -1495,12 +1521,12 @@ namespace LLInitParam
class Mandatory : public TypedParam<T, NAME_VALUE_LOOKUP, false>
{
public:
- typedef TypedParam<T, NAME_VALUE_LOOKUP, false, IsBaseBlock<T>::value> super_t;
+ typedef TypedParam<T, NAME_VALUE_LOOKUP, false, IsBlock<ParamValue<T, NAME_VALUE_LOOKUP> >::value> super_t;
typedef Mandatory<T, NAME_VALUE_LOOKUP> self_t;
typedef typename super_t::value_assignment_t value_assignment_t;
// mandatory parameters require a name to be parseable
- explicit Mandatory(const char* name = "", value_assignment_t val = DefaultInitializer<T>::get())
+ explicit Mandatory(const char* name = "", value_assignment_t val = defaultValue<T>())
: super_t(DERIVED_BLOCK::selfBlockDescriptor(), name, val, &validate, 1, 1)
{}
@@ -1529,15 +1555,15 @@ namespace LLInitParam
class Multiple : public TypedParam<T, NAME_VALUE_LOOKUP, true>
{
public:
- typedef TypedParam<T, NAME_VALUE_LOOKUP, true, IsBaseBlock<T>::value> super_t;
+ typedef TypedParam<T, NAME_VALUE_LOOKUP, true, IsBlock<ParamValue<T, NAME_VALUE_LOOKUP> >::value> super_t;
typedef Multiple<T, RANGE, NAME_VALUE_LOOKUP> self_t;
typedef typename super_t::container_t container_t;
typedef typename super_t::value_assignment_t value_assignment_t;
typedef typename super_t::iterator iterator;
typedef typename super_t::const_iterator const_iterator;
- explicit Multiple(const char* name = "", value_assignment_t val = DefaultInitializer<container_t>::get())
- : super_t(DERIVED_BLOCK::selfBlockDescriptor(), name, val, &validate, RANGE::minCount(), RANGE::maxCount())
+ explicit Multiple(const char* name = "")
+ : super_t(DERIVED_BLOCK::selfBlockDescriptor(), name, container_t(), &validate, RANGE::minCount(), RANGE::maxCount())
{}
Multiple& operator=(value_assignment_t val)
@@ -1545,7 +1571,7 @@ namespace LLInitParam
set(val);
return *this;
}
-
+
DERIVED_BLOCK& operator()(typename super_t::value_assignment_t val)
{
super_t::set(val);
@@ -1559,6 +1585,96 @@ namespace LLInitParam
}
};
+ template <typename T, typename RANGE = BaseBlock::AnyAmount, typename NAME_VALUE_LOOKUP = TypeValues<T> >
+ class Batch : private TypedParam<T, NAME_VALUE_LOOKUP, false>
+ {
+ public:
+ typedef ParamValue<T, NAME_VALUE_LOOKUP> param_value_t;
+ typedef TypedParam<T, NAME_VALUE_LOOKUP, false, IsBlock<param_value_t>::value> super_t;
+ typedef Batch<T, RANGE, NAME_VALUE_LOOKUP> self_t;
+ typedef typename super_t::value_assignment_t value_assignment_t;
+ typedef typename super_t::value_t value_t;
+
+ struct BatchDefaultValue : public ParamDescriptor::UserData
+ {
+ BatchDefaultValue(const T& value)
+ : mValue(value)
+ {}
+
+ T mValue;
+ };
+
+ explicit Batch(const char* name, value_assignment_t val)
+ : super_t(DERIVED_BLOCK::selfBlockDescriptor(), name, val, NULL, 0, 1),
+ mLastParseGeneration(-1)
+ {
+ BlockDescriptor& block_descriptor = DERIVED_BLOCK::selfBlockDescriptor();
+ if (LL_UNLIKELY(block_descriptor.mInitializationState == BlockDescriptor::INITIALIZING))
+ {
+ ParamDescriptorPtr param_descriptorp = block_descriptor.mCurrentBlockPtr->findParamDescriptor(*this);
+
+ if (param_descriptorp)
+ {
+ param_descriptorp->mDeserializeFunc = &deserializeParam;
+ param_descriptorp->mUserData = new BatchDefaultValue(new param_value_t(val));
+ }
+ }
+ }
+
+ explicit Batch(const char* name = "")
+ : super_t(DERIVED_BLOCK::selfBlockDescriptor(), name, defaultValue<T>(), NULL, 0, 1),
+ mLastParseGeneration(-1)
+ {
+ BlockDescriptor& block_descriptor = DERIVED_BLOCK::selfBlockDescriptor();
+ if (LL_UNLIKELY(block_descriptor.mInitializationState == BlockDescriptor::INITIALIZING))
+ {
+ ParamDescriptorPtr param_descriptorp = block_descriptor.mCurrentBlockPtr->findParamDescriptor(*this);
+
+ if (param_descriptorp)
+ {
+ param_descriptorp->mDeserializeFunc = &deserializeParam;
+ }
+ }
+ }
+
+ Batch& operator=(value_assignment_t val)
+ {
+ set(val);
+ return *this;
+ }
+
+ DERIVED_BLOCK& operator()(value_assignment_t val)
+ {
+ super_t::set(val);
+ return static_cast<DERIVED_BLOCK&>(Param::enclosingBlock());
+ }
+
+ using super_t::operator();
+
+ private:
+ static bool deserializeParam(Param& param, Parser& parser, const Parser::name_stack_range_t& name_stack, S32 generation)
+ {
+ self_t& typed_param = static_cast<self_t&>(param);
+
+ if (generation != typed_param.mLastParseGeneration)
+ {
+ ParamDescriptorPtr descriptor = typed_param.enclosingBlock().findParamDescriptor(param);
+ if (descriptor && static_cast<BatchDefaultValue*>(descriptor->mUserData))
+ {
+ static_cast<param_value_t&>(typed_param) = (static_cast<BatchDefaultValue*>(descriptor->mUserData))->mValue;
+ }
+ else
+ {
+ static_cast<param_value_t&>(typed_param) = param_value_t(value_t());
+ }
+ typed_param.mLastParseGeneration = generation;
+ }
+ return super_t::deserializeParam(param, parser, name_stack, generation);
+ }
+
+ S32 mLastParseGeneration;
+ };
+
class Deprecated : public Param
{
public:
@@ -1568,13 +1684,14 @@ namespace LLInitParam
BlockDescriptor& block_descriptor = DERIVED_BLOCK::selfBlockDescriptor();
if (LL_UNLIKELY(block_descriptor.mInitializationState == BlockDescriptor::INITIALIZING))
{
- ParamDescriptor param_descriptor(block_descriptor.mCurrentBlockPtr->getHandleFromParam(this),
+ ParamDescriptorPtr param_descriptor = ParamDescriptorPtr(new ParamDescriptor(
+ block_descriptor.mCurrentBlockPtr->getHandleFromParam(this),
NULL,
&deserializeParam,
NULL,
NULL,
NULL,
- 0, S32_MAX);
+ 0, S32_MAX));
BaseBlock::addParam(block_descriptor, param_descriptor, name);
}
}
@@ -1602,137 +1719,91 @@ namespace LLInitParam
}
};
- template<typename T, typename DERIVED = TypedParam<T> >
- class BlockValue
- : public Block<TypedParam<T, TypeValues<T>, false> >,
- public Param
+ template<typename T>
+ class CustomParamValue
+ : public Block<ParamValue<T, TypeValues<T> > >,
+ public TypeValues<T>
{
public:
typedef enum e_value_age
{
- OLDER_THAN_BLOCK, // mData.mValue needs to be refreshed from the block parameters
- NEWER_THAN_BLOCK, // mData.mValue holds the authoritative value (which has been replicated to the block parameters via setBlockFromValue)
- SAME_AS_BLOCK // mData.mValue is derived from the block parameters, which are authoritative
+ VALUE_NEEDS_UPDATE, // mValue needs to be refreshed from the block parameters
+ VALUE_AUTHORITATIVE, // mValue holds the authoritative value (which has been replicated to the block parameters via updateBlockFromValue)
+ BLOCK_AUTHORITATIVE // mValue is derived from the block parameters, which are authoritative
} EValueAge;
- typedef BlockValue<T> self_t;
- typedef Block<TypedParam<T, TypeValues<T>, false> > block_t;
- typedef const T& value_const_ref_t;
- typedef value_const_ref_t value_assignment_t;
- typedef typename TypeValues<T>::KeyCache key_cache_t;
-
- BlockValue(BlockDescriptor& block_descriptor, const char* name, value_assignment_t value, ParamDescriptor::validation_func_t validate_func, S32 min_count, S32 max_count)
- : Param(block_descriptor.mCurrentBlockPtr),
- mData(value, NEWER_THAN_BLOCK)
- {
- if (LL_UNLIKELY(block_descriptor.mInitializationState == BlockDescriptor::INITIALIZING))
- {
- ParamDescriptor param_descriptor(block_descriptor.mCurrentBlockPtr->getHandleFromParam(this),
- &mergeWith,
- &deserializeParam,
- &serializeParam,
- validate_func,
- &inspectParam,
- min_count, max_count);
- BaseBlock::addParam(block_descriptor, param_descriptor, name);
- }
- }
+ typedef ParamValue<T, TypeValues<T> > derived_t;
+ typedef CustomParamValue<T> self_t;
+ typedef Block<derived_t> block_t;
+ typedef const T& value_assignment_t;
- // implicit conversion
- operator value_assignment_t() const { return get(); }
- // explicit conversion
- value_assignment_t operator()() const { return get(); }
+ CustomParamValue(const T& value = T())
+ : mValue(value),
+ mValueAge(VALUE_AUTHORITATIVE),
+ mKeyVersion(0),
+ mValidatedVersion(-1)
+ {}
- static bool deserializeParam(Param& param, Parser& parser, const Parser::name_stack_range_t& name_stack, S32 generation)
+ bool deserializeBlock(Parser& parser, Parser::name_stack_range_t name_stack, S32 generation)
{
- DERIVED& typed_param = static_cast<DERIVED&>(param);
+ derived_t& typed_param = static_cast<derived_t&>(*this);
// type to apply parse direct value T
if (name_stack.first == name_stack.second)
{
- if(parser.readValue(typed_param.mData.mValue))
+ if(parser.readValue(typed_param.mValue))
{
- typed_param.enclosingBlock().setLastChangedParam(param, true);
- typed_param.setProvided(true);
- typed_param.mData.clearKey();
- typed_param.mData.mValueAge = NEWER_THAN_BLOCK;
- typed_param.setBlockFromValue();
+ typed_param.clearValueName();
+ typed_param.mValueAge = VALUE_AUTHORITATIVE;
+ typed_param.updateBlockFromValue();
return true;
}
-
- if(!TypeValues<T>::empty())
- {
- // try to parse a known named value
- std::string name;
- if (parser.readValue(name))
- {
- // try to parse a per type named value
- if (TypeValues<T>::get(name, typed_param.mData.mValue))
- {
- typed_param.mData.setKey(name);
- typed_param.enclosingBlock().setLastChangedParam(param, true);
- typed_param.setProvided(true);
- typed_param.mData.mValueAge = NEWER_THAN_BLOCK;
- typed_param.setBlockFromValue();
-
- return true;
- }
- }
- }
}
// fall back on parsing block components for T
// if we deserialized at least one component...
- if (typed_param.BaseBlock::deserializeBlock(parser, name_stack))
+ if (typed_param.BaseBlock::deserializeBlock(parser, name_stack, generation))
{
- // ...our block is provided, and considered changed
- typed_param.enclosingBlock().setLastChangedParam(param, true);
- typed_param.setProvided(true);
return true;
}
+
return false;
}
- static void serializeParam(const Param& param, Parser& parser, Parser::name_stack_t& name_stack, const Param* diff_param)
+ void serializeBlock(Parser& parser, Parser::name_stack_t name_stack = Parser::name_stack_t(), const BaseBlock* diff_block = NULL) const
{
- const self_t& typed_param = static_cast<const self_t&>(param);
-
- if (!typed_param.isProvided()) return;
+ const self_t& typed_param = static_cast<const self_t&>(*this);
+ const self_t* diff_param = static_cast<const self_t*>(diff_block);
- std::string key = typed_param.mData.getKey();
+ std::string key = typed_param.getValueName();
// first try to write out name of name/value pair
if (!key.empty())
{
- if (!diff_param || !ParamCompare<std::string>::equals(static_cast<const self_t*>(diff_param)->mData.getKey(), key))
+ if (!diff_param || !ParamCompare<std::string>::equals(diff_param->getValueName(), key))
{
- if (!parser.writeValue(key, name_stack))
- {
- return;
- }
+ parser.writeValue(key, name_stack);
}
}
// then try to serialize value directly
- else if (!diff_param || !ParamCompare<T>::equals(typed_param.get(), (static_cast<const self_t*>(diff_param))->get()))
+ else if (!diff_param || !ParamCompare<T>::equals(typed_param.getValue(), diff_param->getValue()))
{
- if (parser.writeValue(typed_param.mData.mValue, name_stack))
+ if (!parser.writeValue(typed_param.getValue(), name_stack))
{
- return;
+ //RN: *always* serialize provided components of BlockValue (don't pass diff_param on),
+ // since these tend to be viewed as the constructor arguments for the value T. It seems
+ // cleaner to treat the uniqueness of a BlockValue according to the generated value, and
+ // not the individual components. This way <color red="0" green="1" blue="0"/> will not
+ // be exported as <color green="1"/>, since it was probably the intent of the user to
+ // be specific about the RGB color values. This also fixes an issue where we distinguish
+ // between rect.left not being provided and rect.left being explicitly set to 0 (same as default)
+ block_t::serializeBlock(parser, name_stack, NULL);
}
-
- //RN: *always* serialize provided components of BlockValue (don't pass diff_param on),
- // since these tend to be viewed as the constructor arguments for the value T. It seems
- // cleaner to treat the uniqueness of a BlockValue according to the generated value, and
- // not the individual components. This way <color red="0" green="1" blue="0"/> will not
- // be exported as <color green="1"/>, since it was probably the intent of the user to
- // be specific about the RGB color values. This also fixes an issue where we distinguish
- // between rect.left not being provided and rect.left being explicitly set to 0 (same as default)
- typed_param.BaseBlock::serializeBlock(parser, name_stack, NULL);
}
}
- static void inspectParam(const Param& param, Parser& parser, Parser::name_stack_t& name_stack, S32 min_count, S32 max_count)
+ bool inspectBlock(Parser& parser, Parser::name_stack_t name_stack = Parser::name_stack_t(), S32 min_count = 0, S32 max_count = S32_MAX) const
{
// first, inspect with actual type...
parser.inspectValue<T>(name_stack, min_count, max_count, NULL);
@@ -1742,25 +1813,19 @@ namespace LLInitParam
parser.inspectValue<std::string>(name_stack, min_count, max_count, TypeValues<T>::getPossibleValues());
}
// then recursively inspect contents...
- const self_t& typed_param = static_cast<const self_t&>(param);
- typed_param.inspectBlock(parser, name_stack);
+ return block_t::inspectBlock(parser, name_stack, min_count, max_count);
}
-
- bool isProvided() const
+ bool validateBlock(bool emit_errors = true) const
{
- if (!Param::anyProvided()) return false;
-
- // block has an updated parameter
- // if cached value is stale, regenerate from params
- if (mData.mValueAge == OLDER_THAN_BLOCK)
+ if (mValueAge == VALUE_NEEDS_UPDATE)
{
- if (block_t::validateBlock(false))
+ if (block_t::validateBlock(emit_errors))
{
- static_cast<const DERIVED*>(this)->setValueFromBlock();
// clear stale keyword associated with old value
- mData.clearKey();
- mData.mValueAge = SAME_AS_BLOCK;
+ TypeValues<T>::clearValueName();
+ mValueAge = BLOCK_AUTHORITATIVE;
+ static_cast<derived_t*>(const_cast<self_t*>(this))->updateValueFromBlock();
return true;
}
else
@@ -1777,104 +1842,84 @@ namespace LLInitParam
}
}
- void set(value_assignment_t val, bool flag_as_provided = true)
+ // propagate change status up to enclosing block
+ /*virtual*/ void paramChanged(const Param& changed_param, bool user_provided)
+ {
+ BaseBlock::paramChanged(changed_param, user_provided);
+ if (user_provided)
{
- Param::enclosingBlock().setLastChangedParam(*this, flag_as_provided);
+ // a parameter changed, so our value is out of date
+ mValueAge = VALUE_NEEDS_UPDATE;
+ }
+ }
+ void setValue(value_assignment_t val)
+ {
+ derived_t& typed_param = static_cast<derived_t&>(*this);
// set param version number to be up to date, so we ignore block contents
- mData.mValueAge = NEWER_THAN_BLOCK;
-
- mData.mValue = val;
- mData.clearKey();
- setProvided(flag_as_provided);
- static_cast<DERIVED*>(this)->setBlockFromValue();
+ mValueAge = VALUE_AUTHORITATIVE;
+ mValue = val;
+ typed_param.clearValueName();
+ static_cast<derived_t*>(const_cast<self_t*>(this))->updateBlockFromValue();
}
- void setIfNotProvided(value_assignment_t val, bool flag_as_provided = true)
+ value_assignment_t getValue() const
{
- // don't override any user provided value
- if (!isProvided())
- {
- set(val, flag_as_provided);
- }
+ validateBlock(true);
+ return mValue;
}
- // propagate change status up to enclosing block
- /*virtual*/ void setLastChangedParam(const Param& last_param, bool user_provided)
- {
- BaseBlock::setLastChangedParam(last_param, user_provided);
- Param::enclosingBlock().setLastChangedParam(*this, user_provided);
- if (user_provided)
- {
- setProvided(true); // some component provided
- // a parameter changed, so our value is out of date
- mData.mValueAge = OLDER_THAN_BLOCK;
- }
+ T& getValue()
+ {
+ validateBlock(true);
+ return mValue;
}
+ S32 mKeyVersion;
+
protected:
- value_assignment_t get() const
- {
- // if some parameters were provided, issue warnings on invalid blocks
- if (Param::anyProvided() && (mData.mValueAge == OLDER_THAN_BLOCK))
- {
- // go ahead and issue warnings at this point if any param is invalid
- if(block_t::validateBlock(true))
- {
- static_cast<const DERIVED*>(this)->setValueFromBlock();
- mData.clearKey();
- mData.mValueAge = SAME_AS_BLOCK;
- }
- }
- return mData.mValue;
+ // use this from within updateValueFromBlock() to set the value without making it authoritative
+ void updateValue(value_assignment_t value)
+ {
+ mValue = value;
}
-
- struct Data : public key_cache_t
+ bool mergeBlockParam(bool param_provided, BlockDescriptor& block_data, const BaseBlock& other, bool overwrite)
{
- Data(const T& value, EValueAge age)
- : mValue(value),
- mValueAge(age)
- {}
-
- T mValue;
- EValueAge mValueAge;
- };
-
- // mutable to allow lazy updates on get
- mutable Data mData;
+ if (param_provided)
+ {
+ return mergeBlock(block_data, other, overwrite);
+ }
+ return false;
+ }
- private:
- static bool mergeWith(Param& dst, const Param& src, bool overwrite)
+ bool mergeBlock(BlockDescriptor& block_data, const BaseBlock& other, bool overwrite)
{
- const DERIVED& src_typed_param = static_cast<const DERIVED&>(src);
- DERIVED& dst_typed_param = static_cast<DERIVED&>(dst);
+ const derived_t& src_typed_param = static_cast<const derived_t&>(other);
- if (src_typed_param.isProvided()
- && (overwrite || !dst_typed_param.isProvided()))
+ if (src_typed_param.mValueAge == VALUE_AUTHORITATIVE)
{
- if (src_typed_param.mData.mValueAge == NEWER_THAN_BLOCK)
- {
- // copy value over
- dst_typed_param.set(src_typed_param.get());
- }
- else
- {
- // merge individual parameters into destination
- dst_typed_param.merge(block_t::selfBlockDescriptor(), src_typed_param, overwrite);
- }
+ // copy value over
+ setValue(src_typed_param.getValue());
return true;
}
- return false;
+ else
+ {
+ // merge individual parameters into destination
+ return block_t::mergeBlock(block_t::selfBlockDescriptor(), src_typed_param, overwrite);
+ }
}
- };
- template<>
- struct ParamCompare<LLSD, false>
- {
- static bool equals(const LLSD &a, const LLSD &b);
+ mutable S32 mValidatedVersion;
+ mutable bool mValidated; // lazy validation flag
+
+ private:
+
+ mutable T mValue;
+ mutable EValueAge mValueAge;
};
}
+
#endif // LL_LLPARAM_H
diff --git a/indra/llxuixml/lltrans.cpp b/indra/llxuixml/lltrans.cpp
index e13d73c640..5388069c24 100644
--- a/indra/llxuixml/lltrans.cpp
+++ b/indra/llxuixml/lltrans.cpp
@@ -30,6 +30,8 @@
#include "llfasttimer.h" // for call count statistics
#include "llxuiparser.h"
+#include "llsd.h"
+#include "llxmlnode.h"
#include <map>
@@ -154,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+")";
}
}
@@ -182,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 5b127b53cf..128b51d383 100644
--- a/indra/llxuixml/lltrans.h
+++ b/indra/llxuixml/lltrans.h
@@ -29,8 +29,12 @@
#include <map>
+#include "llpointer.h"
#include "llstring.h"
-#include "llxmlnode.h"
+
+class LLXMLNode;
+
+class LLSD;
/**
* @brief String template loaded from strings.xml
@@ -61,9 +65,9 @@ public:
* @param default_args Set of strings (expected to be in the file) to use as default replacement args, e.g. "SECOND_LIFE"
* @returns true if the file was parsed successfully, true if something went wrong
*/
- static bool parseStrings(LLXMLNodePtr& root, const std::set<std::string>& default_args);
+ static bool parseStrings(LLPointer<LLXMLNode> & root, const std::set<std::string>& default_args);
- static bool parseLanguageStrings(LLXMLNodePtr &root);
+ static bool parseLanguageStrings(LLPointer<LLXMLNode> & root);
/**
* @brief Returns a translated string
@@ -72,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/llxuixml/llxuiparser.h b/indra/llxuixml/llxuiparser.h
index 7a748d8aea..0c38c4da93 100644
--- a/indra/llxuixml/llxuiparser.h
+++ b/indra/llxuixml/llxuiparser.h
@@ -28,7 +28,6 @@
#define LLXUIPARSER_H
#include "llinitparam.h"
-#include "llfasttimer.h"
#include "llregistry.h"
#include "llpointer.h"
@@ -95,6 +94,7 @@ public:
};
+class LLXUIParserImpl;
class LLXUIParser : public LLInitParam::Parser
{
@@ -176,6 +176,7 @@ private:
// ordering of child elements from base file to localized diff file. Then we can use a pair
// of coroutines to perform matching of xml nodes during parsing. Not sure if the overhead
// of coroutines would offset the gain from SAX parsing
+class LLSimpleXUIParserImpl;
class LLSimpleXUIParser : public LLInitParam::Parser
{
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/media_plugins/webkit/media_plugin_webkit.cpp b/indra/media_plugins/webkit/media_plugin_webkit.cpp
index 9ba8edbb59..27f3c7260e 100644
--- a/indra/media_plugins/webkit/media_plugin_webkit.cpp
+++ b/indra/media_plugins/webkit/media_plugin_webkit.cpp
@@ -1168,6 +1168,66 @@ void MediaPluginWebKit::receiveMessage(const char *message_string)
authResponse(message_in);
}
else
+ if(message_name == "js_expose_object")
+ {
+#if LLQTWEBKIT_API_VERSION >= 9
+ bool expose_object = message_in.getValueBoolean( "expose" );
+ LLQtWebKit::getInstance()->setExposeObject( expose_object );
+#endif
+ }
+ else
+ if(message_name == "js_values_valid")
+ {
+#if LLQTWEBKIT_API_VERSION >= 9
+ bool valid = message_in.getValueBoolean( "valid" );
+ LLQtWebKit::getInstance()->setValuesValid( valid );
+#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 );
+#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 );
+#endif
+ }
+ else
+ if(message_name == "js_agent_orientation")
+ {
+#if LLQTWEBKIT_API_VERSION >= 9
+ F32 angle = message_in.getValueReal("angle");
+ LLQtWebKit::getInstance()->setAgentOrientation( angle );
+#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 );
+#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 );
+#endif
+ }
+ else
{
// std::cerr << "MediaPluginWebKit::receiveMessage: unknown media message: " << message_string << std::endl;
}
@@ -1324,4 +1384,3 @@ int init_media_plugin(LLPluginInstance::sendMessageFunction host_send_func, void
return 0;
}
-
diff --git a/indra/media_plugins/winmmshim/forwarding_api.cpp b/indra/media_plugins/winmmshim/forwarding_api.cpp
index eff7e20451..495e08942b 100644
--- a/indra/media_plugins/winmmshim/forwarding_api.cpp
+++ b/indra/media_plugins/winmmshim/forwarding_api.cpp
@@ -389,90 +389,105 @@ void init_function_pointers(HMODULE winmm_handle)
extern "C" {
LRESULT WINAPI CloseDriver( HDRVR hDriver, LPARAM lParam1, LPARAM lParam2)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"CloseDriver\n");
return CloseDriver_orig( hDriver, lParam1, lParam2);
}
HDRVR WINAPI OpenDriver( LPCWSTR szDriverName, LPCWSTR szSectionName, LPARAM lParam2)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"OpenDriver\n");
return OpenDriver_orig( szDriverName, szSectionName, lParam2);
}
LRESULT WINAPI SendDriverMessage( HDRVR hDriver, UINT message, LPARAM lParam1, LPARAM lParam2)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"SendDriverMessage\n");
return SendDriverMessage_orig( hDriver, message, lParam1, lParam2);
}
HMODULE WINAPI DrvGetModuleHandle( HDRVR hDriver)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"DrvGetModuleHandle\n");
return DrvGetModuleHandle_orig( hDriver);
}
HMODULE WINAPI GetDriverModuleHandle( HDRVR hDriver)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"GetDriverModuleHandle\n");
return GetDriverModuleHandle_orig( hDriver);
}
LRESULT WINAPI DefDriverProc( DWORD_PTR dwDriverIdentifier, HDRVR hdrvr, UINT uMsg, LPARAM lParam1, LPARAM lParam2)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"DefDriverProc\n");
return DefDriverProc_orig( dwDriverIdentifier, hdrvr, uMsg, lParam1, lParam2);
}
BOOL WINAPI DriverCallback( DWORD dwCallBack, DWORD dwFlags, HDRVR hdrvr, DWORD msg, DWORD dwUser, DWORD dwParam1, DWORD dwParam2)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"DriverCallback\n");
return DriverCallback_orig(dwCallBack, dwFlags, hdrvr, msg, dwUser, dwParam1, dwParam2);
}
UINT WINAPI mmsystemGetVersion(void)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mmsystemGetVersion\n");
return mmsystemGetVersion_orig();
}
BOOL WINAPI sndPlaySoundA( LPCSTR pszSound, UINT fuSound)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"sndPlaySoundA\n");
return sndPlaySoundA_orig( pszSound, fuSound);
}
BOOL WINAPI sndPlaySoundW( LPCWSTR pszSound, UINT fuSound)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"sndPlaySoundW\n");
return sndPlaySoundW_orig( pszSound, fuSound);
}
BOOL WINAPI PlaySoundA( LPCSTR pszSound, HMODULE hmod, DWORD fdwSound)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"PlaySoundA\n");
return PlaySoundA_orig( pszSound, hmod, fdwSound);
}
BOOL WINAPI PlaySoundW( LPCWSTR pszSound, HMODULE hmod, DWORD fdwSound)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"PlaySoundW\n");
return PlaySoundW_orig( pszSound, hmod, fdwSound);
}
UINT WINAPI waveOutGetNumDevs(void)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"waveOutGetNumDevs\n");
return waveOutGetNumDevs_orig();
}
MMRESULT WINAPI waveOutGetDevCapsA( UINT_PTR uDeviceID, LPWAVEOUTCAPSA pwoc, UINT cbwoc)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"waveOutGetDevCapsA\n");
return waveOutGetDevCapsA_orig( uDeviceID, pwoc, cbwoc);
}
MMRESULT WINAPI waveOutGetDevCapsW( UINT_PTR uDeviceID, LPWAVEOUTCAPSW pwoc, UINT cbwoc)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"waveOutGetDevCapsW\n");
return waveOutGetDevCapsW_orig( uDeviceID, pwoc, cbwoc);
}
@@ -480,24 +495,28 @@ extern "C" {
MMRESULT WINAPI waveOutGetVolume( HWAVEOUT hwo, LPDWORD pdwVolume)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"waveOutGetVolume\n");
return waveOutGetVolume_orig( hwo, pdwVolume);
}
MMRESULT WINAPI waveOutSetVolume( HWAVEOUT hwo, DWORD dwVolume)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"waveOutSetVolume\n");
return waveOutSetVolume_orig( hwo, dwVolume);
}
MMRESULT WINAPI waveOutGetErrorTextA( MMRESULT mmrError, LPSTR pszText, UINT cchText)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"waveOutGetErrorTextA\n");
return waveOutGetErrorTextA_orig( mmrError, pszText, cchText);
}
MMRESULT WINAPI waveOutGetErrorTextW( MMRESULT mmrError, LPWSTR pszText, UINT cchText)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"waveOutGetErrorTextW\n");
return waveOutGetErrorTextW_orig( mmrError, pszText, cchText);
}
@@ -516,12 +535,14 @@ extern "C" {
MMRESULT WINAPI waveOutPrepareHeader( HWAVEOUT hwo, LPWAVEHDR pwh, UINT cbwh)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"waveOutPrepareHeader\n");
return waveOutPrepareHeader_orig( hwo, pwh, cbwh);
}
MMRESULT WINAPI waveOutUnprepareHeader( HWAVEOUT hwo, LPWAVEHDR pwh, UINT cbwh)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"waveOutUnprepareHeader\n");
return waveOutUnprepareHeader_orig( hwo, pwh, cbwh);
}
@@ -535,834 +556,973 @@ extern "C" {
MMRESULT WINAPI waveOutPause( HWAVEOUT hwo)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"waveOutPause\n");
return waveOutPause_orig( hwo);
}
MMRESULT WINAPI waveOutRestart( HWAVEOUT hwo)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"waveOutRestart\n");
return waveOutRestart_orig( hwo);
}
MMRESULT WINAPI waveOutReset( HWAVEOUT hwo)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"waveOutReset\n");
return waveOutReset_orig( hwo);
}
MMRESULT WINAPI waveOutBreakLoop( HWAVEOUT hwo)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"waveOutBreakLoop\n");
return waveOutBreakLoop_orig( hwo);
}
MMRESULT WINAPI waveOutGetPosition( HWAVEOUT hwo, LPMMTIME pmmt, UINT cbmmt)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"waveOutGetPosition\n");
return waveOutGetPosition_orig( hwo, pmmt, cbmmt);
}
MMRESULT WINAPI waveOutGetPitch( HWAVEOUT hwo, LPDWORD pdwPitch)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"waveOutGetPitch\n");
return waveOutGetPitch_orig( hwo, pdwPitch);
}
MMRESULT WINAPI waveOutSetPitch( HWAVEOUT hwo, DWORD dwPitch)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"waveOutSetPitch\n");
return waveOutSetPitch_orig( hwo, dwPitch);
}
MMRESULT WINAPI waveOutGetPlaybackRate( HWAVEOUT hwo, LPDWORD pdwRate)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"waveOutGetPlaybackRate\n");
return waveOutGetPlaybackRate_orig( hwo, pdwRate);
}
MMRESULT WINAPI waveOutSetPlaybackRate( HWAVEOUT hwo, DWORD dwRate)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"waveOutSetPlaybackRate\n");
return waveOutSetPlaybackRate_orig( hwo, dwRate);
}
MMRESULT WINAPI waveOutGetID( HWAVEOUT hwo, LPUINT puDeviceID)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"waveOutGetID\n");
return waveOutGetID_orig( hwo, puDeviceID);
}
MMRESULT WINAPI waveOutMessage( HWAVEOUT hwo, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"waveOutMessage\n");
return waveOutMessage_orig( hwo, uMsg, dw1, dw2);
}
UINT WINAPI waveInGetNumDevs(void)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"waveInGetNumDevs\n");
return waveInGetNumDevs_orig();
}
MMRESULT WINAPI waveInGetDevCapsA( UINT_PTR uDeviceID, LPWAVEINCAPSA pwic, UINT cbwic)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"waveInGetDevCapsA\n");
return waveInGetDevCapsA_orig( uDeviceID, pwic, cbwic);
}
MMRESULT WINAPI waveInGetDevCapsW( UINT_PTR uDeviceID, LPWAVEINCAPSW pwic, UINT cbwic)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"waveInGetDevCapsW\n");
return waveInGetDevCapsW_orig( uDeviceID, pwic, cbwic);
}
MMRESULT WINAPI waveInGetErrorTextA(MMRESULT mmrError, LPSTR pszText, UINT cchText)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"waveInGetErrorTextA\n");
return waveInGetErrorTextA_orig(mmrError, pszText, cchText);
}
MMRESULT WINAPI waveInGetErrorTextW(MMRESULT mmrError, LPWSTR pszText, UINT cchText)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"waveInGetErrorTextW\n");
return waveInGetErrorTextW_orig(mmrError, pszText, cchText);
}
MMRESULT WINAPI waveInOpen( LPHWAVEIN phwi, UINT uDeviceID, LPCWAVEFORMATEX pwfx, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"waveInOpen\n");
return waveInOpen_orig(phwi, uDeviceID, pwfx, dwCallback, dwInstance, fdwOpen);
}
MMRESULT WINAPI waveInClose( HWAVEIN hwi)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"waveInClose\n");
return waveInClose_orig( hwi);
}
MMRESULT WINAPI waveInPrepareHeader( HWAVEIN hwi, LPWAVEHDR pwh, UINT cbwh)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"waveInPrepareHeader\n");
return waveInPrepareHeader_orig( hwi, pwh, cbwh);
}
MMRESULT WINAPI waveInUnprepareHeader( HWAVEIN hwi, LPWAVEHDR pwh, UINT cbwh)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"waveInUnprepareHeader\n");
return waveInUnprepareHeader_orig( hwi, pwh, cbwh);
}
MMRESULT WINAPI waveInAddBuffer( HWAVEIN hwi, LPWAVEHDR pwh, UINT cbwh)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"waveInAddBuffer\n");
return waveInAddBuffer_orig( hwi, pwh, cbwh);
}
MMRESULT WINAPI waveInStart( HWAVEIN hwi)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"waveInStart\n");
return waveInStart_orig( hwi);
}
MMRESULT WINAPI waveInStop( HWAVEIN hwi)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"waveInStop\n");
return waveInStop_orig(hwi);
}
MMRESULT WINAPI waveInReset( HWAVEIN hwi)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"waveInReset\n");
return waveInReset_orig(hwi);
}
MMRESULT WINAPI waveInGetPosition( HWAVEIN hwi, LPMMTIME pmmt, UINT cbmmt)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"waveInGetPosition\n");
return waveInGetPosition_orig( hwi, pmmt, cbmmt);
}
MMRESULT WINAPI waveInGetID( HWAVEIN hwi, LPUINT puDeviceID)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"waveInGetID\n");
return waveInGetID_orig( hwi, puDeviceID);
}
MMRESULT WINAPI waveInMessage( HWAVEIN hwi, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"waveInMessage\n");
return waveInMessage_orig( hwi, uMsg, dw1, dw2);
}
UINT WINAPI midiOutGetNumDevs(void)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiOutGetNumDevs\n");
return midiOutGetNumDevs_orig();
}
MMRESULT WINAPI midiStreamOpen( LPHMIDISTRM phms, LPUINT puDeviceID, DWORD cMidi, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiStreamOpen\n");
return midiStreamOpen_orig( phms, puDeviceID, cMidi, dwCallback, dwInstance, fdwOpen);
}
MMRESULT WINAPI midiStreamClose( HMIDISTRM hms)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiStreamClose\n");
return midiStreamClose_orig( hms);
}
MMRESULT WINAPI midiStreamProperty( HMIDISTRM hms, LPBYTE lppropdata, DWORD dwProperty)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiStreamProperty\n");
return midiStreamProperty_orig( hms, lppropdata, dwProperty);
}
MMRESULT WINAPI midiStreamPosition( HMIDISTRM hms, LPMMTIME lpmmt, UINT cbmmt)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiStreamPosition\n");
return midiStreamPosition_orig( hms, lpmmt, cbmmt);
}
MMRESULT WINAPI midiStreamOut( HMIDISTRM hms, LPMIDIHDR pmh, UINT cbmh)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiStreamOut\n");
return midiStreamOut_orig( hms, pmh, cbmh);
}
MMRESULT WINAPI midiStreamPause( HMIDISTRM hms)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiStreamPause\n");
return midiStreamPause_orig( hms);
}
MMRESULT WINAPI midiStreamRestart( HMIDISTRM hms)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiStreamRestart\n");
return midiStreamRestart_orig( hms);
}
MMRESULT WINAPI midiStreamStop( HMIDISTRM hms)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiStreamStop\n");
return midiStreamStop_orig( hms);
}
MMRESULT WINAPI midiConnect( HMIDI hmi, HMIDIOUT hmo, LPVOID pReserved)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiConnect\n");
return midiConnect_orig( hmi, hmo, pReserved);
}
MMRESULT WINAPI midiDisconnect( HMIDI hmi, HMIDIOUT hmo, LPVOID pReserved)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiDisconnect\n");
return midiDisconnect_orig( hmi, hmo, pReserved);
}
MMRESULT WINAPI midiOutGetDevCapsA( UINT_PTR uDeviceID, LPMIDIOUTCAPSA pmoc, UINT cbmoc)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiOutGetDevCapsA\n");
return midiOutGetDevCapsA_orig( uDeviceID, pmoc, cbmoc);
}
MMRESULT WINAPI midiOutGetDevCapsW( UINT_PTR uDeviceID, LPMIDIOUTCAPSW pmoc, UINT cbmoc)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiOutGetDevCapsW\n");
return midiOutGetDevCapsW_orig( uDeviceID, pmoc, cbmoc);
}
MMRESULT WINAPI midiOutGetVolume( HMIDIOUT hmo, LPDWORD pdwVolume)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiOutGetVolume\n");
return midiOutGetVolume_orig( hmo, pdwVolume);
}
MMRESULT WINAPI midiOutSetVolume( HMIDIOUT hmo, DWORD dwVolume)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiOutSetVolume\n");
return midiOutSetVolume_orig( hmo, dwVolume);
}
MMRESULT WINAPI midiOutGetErrorTextA( MMRESULT mmrError, LPSTR pszText, UINT cchText)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiOutGetErrorTextA\n");
return midiOutGetErrorTextA_orig( mmrError, pszText, cchText);
}
MMRESULT WINAPI midiOutGetErrorTextW( MMRESULT mmrError, LPWSTR pszText, UINT cchText)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiOutGetErrorTextW\n");
return midiOutGetErrorTextW_orig( mmrError, pszText, cchText);
}
MMRESULT WINAPI midiOutOpen( LPHMIDIOUT phmo, UINT uDeviceID, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiOutOpen\n");
return midiOutOpen_orig(phmo, uDeviceID, dwCallback, dwInstance, fdwOpen);
}
MMRESULT WINAPI midiOutClose( HMIDIOUT hmo)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiOutClose\n");
return midiOutClose_orig( hmo);
}
MMRESULT WINAPI midiOutPrepareHeader( HMIDIOUT hmo, LPMIDIHDR pmh, UINT cbmh)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiOutPrepareHeader\n");
return midiOutPrepareHeader_orig( hmo, pmh, cbmh);
}
MMRESULT WINAPI midiOutUnprepareHeader(HMIDIOUT hmo, LPMIDIHDR pmh, UINT cbmh)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiOutUnprepareHeader\n");
return midiOutUnprepareHeader_orig(hmo, pmh, cbmh);
}
MMRESULT WINAPI midiOutShortMsg( HMIDIOUT hmo, DWORD dwMsg)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiOutShortMsg\n");
return midiOutShortMsg_orig( hmo, dwMsg);
}
MMRESULT WINAPI midiOutLongMsg(HMIDIOUT hmo, LPMIDIHDR pmh, UINT cbmh)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiOutLongMsg\n");
return midiOutLongMsg_orig(hmo, pmh, cbmh);
}
MMRESULT WINAPI midiOutReset( HMIDIOUT hmo)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiOutReset\n");
return midiOutReset_orig( hmo);
}
MMRESULT WINAPI midiOutCachePatches( HMIDIOUT hmo, UINT uBank, LPWORD pwpa, UINT fuCache)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiOutCachePatches\n");
return midiOutCachePatches_orig( hmo, uBank, pwpa, fuCache);
}
MMRESULT WINAPI midiOutCacheDrumPatches( HMIDIOUT hmo, UINT uPatch, LPWORD pwkya, UINT fuCache)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiOutCacheDrumPatches\n");
return midiOutCacheDrumPatches_orig( hmo, uPatch, pwkya, fuCache);
}
MMRESULT WINAPI midiOutGetID( HMIDIOUT hmo, LPUINT puDeviceID)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiOutGetID\n");
return midiOutGetID_orig( hmo, puDeviceID);
}
MMRESULT WINAPI midiOutMessage( HMIDIOUT hmo, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiOutMessage\n");
return midiOutMessage_orig( hmo, uMsg, dw1, dw2);
}
UINT WINAPI midiInGetNumDevs(void)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiInGetNumDevs\n");
return midiInGetNumDevs_orig();
}
MMRESULT WINAPI midiInGetDevCapsA( UINT_PTR uDeviceID, LPMIDIINCAPSA pmic, UINT cbmic)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiInGetDevCapsA\n");
return midiInGetDevCapsA_orig( uDeviceID, pmic, cbmic);
}
MMRESULT WINAPI midiInGetDevCapsW( UINT_PTR uDeviceID, LPMIDIINCAPSW pmic, UINT cbmic)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiInGetDevCapsW\n");
return midiInGetDevCapsW_orig( uDeviceID, pmic, cbmic);
}
MMRESULT WINAPI midiInGetErrorTextA( MMRESULT mmrError, LPSTR pszText, UINT cchText)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiInGetErrorTextA\n");
return midiInGetErrorTextA_orig( mmrError, pszText, cchText);
}
MMRESULT WINAPI midiInGetErrorTextW( MMRESULT mmrError, LPWSTR pszText, UINT cchText)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiInGetErrorTextW\n");
return midiInGetErrorTextW_orig( mmrError, pszText, cchText);
}
MMRESULT WINAPI midiInOpen( LPHMIDIIN phmi, UINT uDeviceID, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiInOpen\n");
return midiInOpen_orig(phmi, uDeviceID, dwCallback, dwInstance, fdwOpen);
}
MMRESULT WINAPI midiInClose( HMIDIIN hmi)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiInClose\n");
return midiInClose_orig( hmi);
}
MMRESULT WINAPI midiInPrepareHeader( HMIDIIN hmi, LPMIDIHDR pmh, UINT cbmh)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiInPrepareHeader\n");
return midiInPrepareHeader_orig( hmi, pmh, cbmh);
}
MMRESULT WINAPI midiInUnprepareHeader( HMIDIIN hmi, LPMIDIHDR pmh, UINT cbmh)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiInUnprepareHeader\n");
return midiInUnprepareHeader_orig( hmi, pmh, cbmh);
}
MMRESULT WINAPI midiInAddBuffer( HMIDIIN hmi, LPMIDIHDR pmh, UINT cbmh)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiInAddBuffer\n");
return midiInAddBuffer_orig( hmi, pmh, cbmh);
}
MMRESULT WINAPI midiInStart( HMIDIIN hmi)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiInStart\n");
return midiInStart_orig( hmi);
}
MMRESULT WINAPI midiInStop( HMIDIIN hmi)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiInStop\n");
return midiInStop_orig(hmi);
}
MMRESULT WINAPI midiInReset( HMIDIIN hmi)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiInReset\n");
return midiInReset_orig( hmi);
}
MMRESULT WINAPI midiInGetID( HMIDIIN hmi, LPUINT puDeviceID)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiInGetID\n");
return midiInGetID_orig( hmi, puDeviceID);
}
MMRESULT WINAPI midiInMessage( HMIDIIN hmi, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiInMessage\n");
return midiInMessage_orig( hmi, uMsg, dw1, dw2);
}
UINT WINAPI auxGetNumDevs(void)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"auxGetNumDevs\n");
return auxGetNumDevs_orig();
}
MMRESULT WINAPI auxGetDevCapsA( UINT_PTR uDeviceID, LPAUXCAPSA pac, UINT cbac)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"auxGetDevCapsA\n");
return auxGetDevCapsA_orig( uDeviceID, pac, cbac);
}
MMRESULT WINAPI auxGetDevCapsW( UINT_PTR uDeviceID, LPAUXCAPSW pac, UINT cbac)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"auxGetDevCapsW\n");
return auxGetDevCapsW_orig( uDeviceID, pac, cbac);
}
MMRESULT WINAPI auxSetVolume( UINT uDeviceID, DWORD dwVolume)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"auxSetVolume\n");
return auxSetVolume_orig( uDeviceID, dwVolume);
}
MMRESULT WINAPI auxGetVolume( UINT uDeviceID, LPDWORD pdwVolume)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"auxGetVolume\n");
return auxGetVolume_orig( uDeviceID, pdwVolume);
}
MMRESULT WINAPI auxOutMessage( UINT uDeviceID, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"auxOutMessage\n");
return auxOutMessage_orig( uDeviceID, uMsg, dw1, dw2);
}
UINT WINAPI mixerGetNumDevs(void)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mixerGetNumDevs\n");
return mixerGetNumDevs_orig();
}
MMRESULT WINAPI mixerGetDevCapsA( UINT_PTR uMxId, LPMIXERCAPSA pmxcaps, UINT cbmxcaps)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mixerGetDevCapsA\n");
return mixerGetDevCapsA_orig( uMxId, pmxcaps, cbmxcaps);
}
MMRESULT WINAPI mixerGetDevCapsW( UINT_PTR uMxId, LPMIXERCAPSW pmxcaps, UINT cbmxcaps)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mixerGetDevCapsW\n");
return mixerGetDevCapsW_orig( uMxId, pmxcaps, cbmxcaps);
}
MMRESULT WINAPI mixerOpen( LPHMIXER phmx, UINT uMxId, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mixerOpen\n");
return mixerOpen_orig( phmx, uMxId, dwCallback, dwInstance, fdwOpen);
}
MMRESULT WINAPI mixerClose( HMIXER hmx)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mixerClose\n");
return mixerClose_orig( hmx);
}
DWORD WINAPI mixerMessage( HMIXER hmx, UINT uMsg, DWORD_PTR dwParam1, DWORD_PTR dwParam2)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mixerMessage\n");
return mixerMessage_orig( hmx, uMsg, dwParam1, dwParam2);
}
MMRESULT WINAPI mixerGetLineInfoA( HMIXEROBJ hmxobj, LPMIXERLINEA pmxl, DWORD fdwInfo)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mixerGetLineInfoA\n");
return mixerGetLineInfoA_orig( hmxobj, pmxl, fdwInfo);
}
MMRESULT WINAPI mixerGetLineInfoW( HMIXEROBJ hmxobj, LPMIXERLINEW pmxl, DWORD fdwInfo)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mixerGetLineInfoW\n");
return mixerGetLineInfoW_orig( hmxobj, pmxl, fdwInfo);
}
MMRESULT WINAPI mixerGetID( HMIXEROBJ hmxobj, UINT FAR *puMxId, DWORD fdwId)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mixerGetID\n");
return mixerGetID_orig( hmxobj, puMxId, fdwId);
}
MMRESULT WINAPI mixerGetLineControlsA( HMIXEROBJ hmxobj, LPMIXERLINECONTROLSA pmxlc, DWORD fdwControls)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mixerGetLineControlsA\n");
return mixerGetLineControlsA_orig( hmxobj, pmxlc, fdwControls);
}
MMRESULT WINAPI mixerGetLineControlsW( HMIXEROBJ hmxobj, LPMIXERLINECONTROLSW pmxlc, DWORD fdwControls)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mixerGetLineControlsW\n");
return mixerGetLineControlsW_orig( hmxobj, pmxlc, fdwControls);
}
MMRESULT WINAPI mixerGetControlDetailsA( HMIXEROBJ hmxobj, LPMIXERCONTROLDETAILS pmxcd, DWORD fdwDetails)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mixerGetControlDetailsA\n");
return mixerGetControlDetailsA_orig( hmxobj, pmxcd, fdwDetails);
}
MMRESULT WINAPI mixerGetControlDetailsW( HMIXEROBJ hmxobj, LPMIXERCONTROLDETAILS pmxcd, DWORD fdwDetails)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mixerGetControlDetailsW\n");
return mixerGetControlDetailsW_orig( hmxobj, pmxcd, fdwDetails);
}
MMRESULT WINAPI mixerSetControlDetails( HMIXEROBJ hmxobj, LPMIXERCONTROLDETAILS pmxcd, DWORD fdwDetails)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mixerSetControlDetails\n");
return mixerSetControlDetails_orig( hmxobj, pmxcd, fdwDetails);
}
DWORD WINAPI mmGetCurrentTask(void)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mmGetCurrentTask\n");
return mmGetCurrentTask_orig();
}
void WINAPI mmTaskBlock(DWORD val)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mmTaskBlock\n");
return mmTaskBlock_orig(val);
}
UINT WINAPI mmTaskCreate(LPTASKCALLBACK a, HANDLE* b, DWORD_PTR c)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mmTaskCreate\n");
return mmTaskCreate_orig(a, b, c);
}
BOOL WINAPI mmTaskSignal(DWORD a)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mmTaskSignal\n");
return mmTaskSignal_orig(a);
}
VOID WINAPI mmTaskYield()
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mmTaskYield\n");
mmTaskYield_orig();
}
MMRESULT WINAPI timeGetSystemTime( LPMMTIME pmmt, UINT cbmmt)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"timeGetSystemTime\n");
return timeGetSystemTime_orig( pmmt, cbmmt);
}
DWORD WINAPI timeGetTime(void)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"timeGetTime\n");
return timeGetTime_orig();
}
MMRESULT WINAPI timeSetEvent( UINT uDelay, UINT uResolution, LPTIMECALLBACK fptc, DWORD_PTR dwUser, UINT fuEvent)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"timeSetEvent\n");
return timeSetEvent_orig(uDelay, uResolution, fptc, dwUser, fuEvent);
}
MMRESULT WINAPI timeKillEvent( UINT uTimerID)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"timeKillEvent\n");
return timeKillEvent_orig( uTimerID);
}
MMRESULT WINAPI timeGetDevCaps( LPTIMECAPS ptc, UINT cbtc)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"timeGetDevCaps\n");
return timeGetDevCaps_orig( ptc, cbtc);
}
MMRESULT WINAPI timeBeginPeriod( UINT uPeriod)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"timeBeginPeriod\n");
return timeBeginPeriod_orig( uPeriod);
}
MMRESULT WINAPI timeEndPeriod( UINT uPeriod)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"timeEndPeriod\n");
return timeEndPeriod_orig( uPeriod);
}
UINT WINAPI joyGetNumDevs(void)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"joyGetNumDevs\n");
return joyGetNumDevs_orig();
}
MMRESULT WINAPI joyConfigChanged(DWORD dwFlags)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"joyConfigChanged\n");
return joyConfigChanged_orig(dwFlags);
}
MMRESULT WINAPI joyGetDevCapsA( UINT_PTR uJoyID, LPJOYCAPSA pjc, UINT cbjc)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"joyGetDevCapsA\n");
return joyGetDevCapsA_orig( uJoyID, pjc, cbjc);
}
MMRESULT WINAPI joyGetDevCapsW( UINT_PTR uJoyID, LPJOYCAPSW pjc, UINT cbjc)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"joyGetDevCapsW\n");
return joyGetDevCapsW_orig( uJoyID, pjc, cbjc);
}
MMRESULT WINAPI joyGetPos( UINT uJoyID, LPJOYINFO pji)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"joyGetPos\n");
return joyGetPos_orig( uJoyID, pji);
}
MMRESULT WINAPI joyGetPosEx( UINT uJoyID, LPJOYINFOEX pji)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"joyGetPosEx\n");
return joyGetPosEx_orig( uJoyID, pji);
}
MMRESULT WINAPI joyGetThreshold( UINT uJoyID, LPUINT puThreshold)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"joyGetThreshold\n");
return joyGetThreshold_orig( uJoyID, puThreshold);
}
MMRESULT WINAPI joyReleaseCapture( UINT uJoyID)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"joyReleaseCapture\n");
return joyReleaseCapture_orig( uJoyID);
}
MMRESULT WINAPI joySetCapture( HWND hwnd, UINT uJoyID, UINT uPeriod, BOOL fChanged)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"joySetCapture\n");
return joySetCapture_orig(hwnd, uJoyID, uPeriod, fChanged);
}
MMRESULT WINAPI joySetThreshold( UINT uJoyID, UINT uThreshold)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"joySetThreshold\n");
return joySetThreshold_orig( uJoyID, uThreshold);
}
BOOL WINAPI mciDriverNotify(HWND hwndCallback, UINT uDeviceID, UINT uStatus)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mciDriverNotify\n");
return mciDriverNotify_orig(hwndCallback, uDeviceID, uStatus);
}
UINT WINAPI mciDriverYield(UINT uDeviceID)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mciDriverYield\n");
return mciDriverYield_orig(uDeviceID);
}
FOURCC WINAPI mmioStringToFOURCCA( LPCSTR sz, UINT uFlags)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mmioStringToFOURCCA\n");
return mmioStringToFOURCCA_orig( sz, uFlags);
}
FOURCC WINAPI mmioStringToFOURCCW( LPCWSTR sz, UINT uFlags)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mmioStringToFOURCCW\n");
return mmioStringToFOURCCW_orig( sz, uFlags);
}
LPMMIOPROC WINAPI mmioInstallIOProcA( FOURCC fccIOProc, LPMMIOPROC pIOProc, DWORD dwFlags)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mmioInstallIOProcA\n");
return mmioInstallIOProcA_orig( fccIOProc, pIOProc, dwFlags);
}
LPMMIOPROC WINAPI mmioInstallIOProcW( FOURCC fccIOProc, LPMMIOPROC pIOProc, DWORD dwFlags)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mmioInstallIOProcW\n");
return mmioInstallIOProcW_orig( fccIOProc, pIOProc, dwFlags);
}
HMMIO WINAPI mmioOpenA( LPSTR pszFileName, LPMMIOINFO pmmioinfo, DWORD fdwOpen)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mmioOpenA\n");
return mmioOpenA_orig( pszFileName, pmmioinfo, fdwOpen);
}
HMMIO WINAPI mmioOpenW( LPWSTR pszFileName, LPMMIOINFO pmmioinfo, DWORD fdwOpen)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mmioOpenW\n");
return mmioOpenW_orig( pszFileName, pmmioinfo, fdwOpen);
}
MMRESULT WINAPI mmioRenameA( LPCSTR pszFileName, LPCSTR pszNewFileName, LPCMMIOINFO pmmioinfo, DWORD fdwRename)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mmioRenameA\n");
return mmioRenameA_orig( pszFileName, pszNewFileName, pmmioinfo, fdwRename);
}
MMRESULT WINAPI mmioRenameW( LPCWSTR pszFileName, LPCWSTR pszNewFileName, LPCMMIOINFO pmmioinfo, DWORD fdwRename)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mmioRenameW\n");
return mmioRenameW_orig( pszFileName, pszNewFileName, pmmioinfo, fdwRename);
}
MMRESULT WINAPI mmioClose( HMMIO hmmio, UINT fuClose)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mmioClose\n");
return mmioClose_orig( hmmio, fuClose);
}
LONG WINAPI mmioRead( HMMIO hmmio, HPSTR pch, LONG cch)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mmioRead\n");
return mmioRead_orig( hmmio, pch, cch);
}
LONG WINAPI mmioWrite( HMMIO hmmio, const char _huge* pch, LONG cch)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mmioWrite\n");
return mmioWrite_orig( hmmio, pch, cch);
}
LONG WINAPI mmioSeek( HMMIO hmmio, LONG lOffset, int iOrigin)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mmioSeek\n");
return mmioSeek_orig(hmmio, lOffset, iOrigin);
}
MMRESULT WINAPI mmioGetInfo( HMMIO hmmio, LPMMIOINFO pmmioinfo, UINT fuInfo)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mmioGetInfo\n");
return mmioGetInfo_orig( hmmio, pmmioinfo, fuInfo);
}
MMRESULT WINAPI mmioSetInfo( HMMIO hmmio, LPCMMIOINFO pmmioinfo, UINT fuInfo)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mmioSetInfo\n");
return mmioSetInfo_orig( hmmio, pmmioinfo, fuInfo);
}
MMRESULT WINAPI mmioSetBuffer( HMMIO hmmio, LPSTR pchBuffer, LONG cchBuffer, UINT fuBuffer)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mmioSetBuffer\n");
return mmioSetBuffer_orig(hmmio, pchBuffer, cchBuffer, fuBuffer);
}
MMRESULT WINAPI mmioFlush( HMMIO hmmio, UINT fuFlush)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mmioFlush\n");
return mmioFlush_orig( hmmio, fuFlush);
}
MMRESULT WINAPI mmioAdvance( HMMIO hmmio, LPMMIOINFO pmmioinfo, UINT fuAdvance)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mmioAdvance\n");
return mmioAdvance_orig( hmmio, pmmioinfo, fuAdvance);
}
LRESULT WINAPI mmioSendMessage( HMMIO hmmio, UINT uMsg, LPARAM lParam1, LPARAM lParam2)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mmioSendMessage\n");
return mmioSendMessage_orig(hmmio, uMsg, lParam1, lParam2);
}
MMRESULT WINAPI mmioDescend( HMMIO hmmio, LPMMCKINFO pmmcki, const MMCKINFO FAR* pmmckiParent, UINT fuDescend)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mmioDescend\n");
return mmioDescend_orig(hmmio, pmmcki, pmmckiParent, fuDescend);
}
MMRESULT WINAPI mmioAscend( HMMIO hmmio, LPMMCKINFO pmmcki, UINT fuAscend)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mmioAscend\n");
return mmioAscend_orig( hmmio, pmmcki, fuAscend);
}
MMRESULT WINAPI mmioCreateChunk(HMMIO hmmio, LPMMCKINFO pmmcki, UINT fuCreate)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mmioCreateChunk\n");
return mmioCreateChunk_orig(hmmio, pmmcki, fuCreate);
}
MCIERROR WINAPI mciSendCommandA( MCIDEVICEID mciId, UINT uMsg, DWORD_PTR dwParam1, DWORD_PTR dwParam2)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mciSendCommandA\n");
return mciSendCommandA_orig( mciId, uMsg, dwParam1, dwParam2);
}
MCIERROR WINAPI mciSendCommandW( MCIDEVICEID mciId, UINT uMsg, DWORD_PTR dwParam1, DWORD_PTR dwParam2)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mciSendCommandW\n");
return mciSendCommandW_orig( mciId, uMsg, dwParam1, dwParam2);
}
MCIERROR WINAPI mciSendStringA( LPCSTR lpstrCommand, LPSTR lpstrReturnString, UINT uReturnLength, HWND hwndCallback)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mciSendStringA\n");
return mciSendStringA_orig( lpstrCommand, lpstrReturnString, uReturnLength, hwndCallback);
}
MCIERROR WINAPI mciSendStringW( LPCWSTR lpstrCommand, LPWSTR lpstrReturnString, UINT uReturnLength, HWND hwndCallback)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mciSendStringW\n");
return mciSendStringW_orig( lpstrCommand, lpstrReturnString, uReturnLength, hwndCallback);
}
@@ -1375,72 +1535,84 @@ extern "C" {
MCIDEVICEID WINAPI mciGetDeviceIDW( LPCWSTR pszDevice)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mciGetDeviceIDW\n");
return mciGetDeviceIDW_orig( pszDevice);
}
MCIDEVICEID WINAPI mciGetDeviceIDFromElementIDA( DWORD dwElementID, LPCSTR lpstrType )
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mciGetDeviceIDFromElementIDA\n");
return mciGetDeviceIDFromElementIDA_orig( dwElementID, lpstrType );
}
MCIDEVICEID WINAPI mciGetDeviceIDFromElementIDW( DWORD dwElementID, LPCWSTR lpstrType )
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mciGetDeviceIDFromElementIDW\n");
return mciGetDeviceIDFromElementIDW_orig( dwElementID, lpstrType );
}
DWORD_PTR WINAPI mciGetDriverData(UINT uDeviceID)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mciGetDriverData\n");
return mciGetDriverData_orig(uDeviceID);
}
BOOL WINAPI mciGetErrorStringA( MCIERROR mcierr, LPSTR pszText, UINT cchText)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mciGetErrorStringA\n");
return mciGetErrorStringA_orig( mcierr, pszText, cchText);
}
BOOL WINAPI mciGetErrorStringW( MCIERROR mcierr, LPWSTR pszText, UINT cchText)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mciGetErrorStringW\n");
return mciGetErrorStringW_orig( mcierr, pszText, cchText);
}
BOOL WINAPI mciSetDriverData(UINT uDeviceID, DWORD_PTR dwData)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mciSetDriverData_type\n");
return mciSetDriverData_orig( uDeviceID, dwData );
}
BOOL WINAPI mciSetYieldProc( MCIDEVICEID mciId, YIELDPROC fpYieldProc, DWORD dwYieldData)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mciSetYieldProc\n");
return mciSetYieldProc_orig(mciId, fpYieldProc, dwYieldData);
}
BOOL WINAPI mciFreeCommandResource(UINT uTable)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mciFreeCommandResource\n");
return mciFreeCommandResource_orig(uTable);
}
HTASK WINAPI mciGetCreatorTask( MCIDEVICEID mciId)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mciGetCreatorTask\n");
return mciGetCreatorTask_orig( mciId);
}
YIELDPROC WINAPI mciGetYieldProc( MCIDEVICEID mciId, LPDWORD pdwYieldData)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mciGetYieldProc\n");
return mciGetYieldProc_orig( mciId, pdwYieldData);
}
UINT WINAPI mciLoadCommandResource(HINSTANCE hInstance, LPCWSTR lpResName, UINT uType)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mciLoadCommandResource");
return mciLoadCommandResource_orig(hInstance, lpResName, uType);
}
@@ -1448,6 +1620,7 @@ extern "C" {
BOOL WINAPI mciExecute(LPCSTR pszCommand)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mciExecute\n");
return mciExecute_orig(pszCommand);
}
diff --git a/indra/media_plugins/winmmshim/forwarding_api.h b/indra/media_plugins/winmmshim/forwarding_api.h
index 89a6b347f3..076a08f769 100644
--- a/indra/media_plugins/winmmshim/forwarding_api.h
+++ b/indra/media_plugins/winmmshim/forwarding_api.h
@@ -30,6 +30,7 @@
#include <mmsystem.h>
void init_function_pointers(HMODULE winmm_handle);
+void ll_winmm_shim_initialize();
typedef VOID (*LPTASKCALLBACK)(DWORD_PTR dwInst);
diff --git a/indra/media_plugins/winmmshim/winmm_shim.cpp b/indra/media_plugins/winmmshim/winmm_shim.cpp
index 9563a3b664..47a1e5c018 100644
--- a/indra/media_plugins/winmmshim/winmm_shim.cpp
+++ b/indra/media_plugins/winmmshim/winmm_shim.cpp
@@ -32,14 +32,21 @@ using std::wstring;
static float sVolumeLevel = 1.f;
static bool sMute = false;
+static CRITICAL_SECTION sCriticalSection;
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
+ InitializeCriticalSection(&sCriticalSection);
+ return TRUE;
+}
+
+void ll_winmm_shim_initialize(){
static bool initialized = false;
// do this only once
+ EnterCriticalSection(&sCriticalSection);
if (!initialized)
{ // bind to original winmm.dll
TCHAR system_path[MAX_PATH];
@@ -54,13 +61,15 @@ BOOL APIENTRY DllMain( HMODULE hModule,
{ // we have a dll, let's get out pointers!
initialized = true;
init_function_pointers(winmm_handle);
- return true;
+ ::OutputDebugStringA("WINMM_SHIM.DLL: real winmm.dll initialized successfully\n");
+ }
+ else
+ {
+ // failed to initialize real winmm.dll
+ ::OutputDebugStringA("WINMM_SHIM.DLL: Failed to initialize real winmm.dll\n");
}
-
- // failed to initialize real winmm.dll
- return false;
}
- return true;
+ LeaveCriticalSection(&sCriticalSection);
}
@@ -79,6 +88,7 @@ extern "C"
MMRESULT WINAPI waveOutOpen( LPHWAVEOUT phwo, UINT uDeviceID, LPCWAVEFORMATEX pwfx, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen)
{
+ ll_winmm_shim_initialize();
if (pwfx->wFormatTag != WAVE_FORMAT_PCM
|| (pwfx->wBitsPerSample != 8 && pwfx->wBitsPerSample != 16))
{ // uncompressed 8 and 16 bit sound are the only types we support
@@ -97,6 +107,7 @@ extern "C"
MMRESULT WINAPI waveOutClose( HWAVEOUT hwo)
{
+ ll_winmm_shim_initialize();
wave_out_map_t::iterator found_it = sWaveOuts.find(hwo);
if (found_it != sWaveOuts.end())
{ // forget what we know about this handle
@@ -108,6 +119,7 @@ extern "C"
MMRESULT WINAPI waveOutWrite( HWAVEOUT hwo, LPWAVEHDR pwh, UINT cbwh)
{
+ ll_winmm_shim_initialize();
MMRESULT result = MMSYSERR_NOERROR;
if (sMute)
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index b1cb10665b..523ea8a394 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -17,6 +17,7 @@ include(JsonCpp)
include(LLAudio)
include(LLCharacter)
include(LLCommon)
+include(LLConvexDecomposition)
include(LLImage)
include(LLImageJ2COJ)
include(LLInventory)
@@ -40,14 +41,17 @@ include(UnixInstall)
include(LLKDU)
include(ViewerMiscLibs)
include(LLLogin)
+include(GLOD)
include(CMakeCopyIfDifferent)
include_directories(
${DBUSGLIB_INCLUDE_DIRS}
${JSONCPP_INCLUDE_DIRS}
+ ${GLOD_INCLUDE_DIR}
${LLAUDIO_INCLUDE_DIRS}
${LLCHARACTER_INCLUDE_DIRS}
${LLCOMMON_INCLUDE_DIRS}
+ ${LLCONVEXDECOMP_INCLUDE_DIRS}
${FMOD_INCLUDE_DIR}
${LLIMAGE_INCLUDE_DIRS}
${LLKDU_INCLUDE_DIRS}
@@ -66,10 +70,14 @@ include_directories(
${LSCRIPT_INCLUDE_DIRS}/lscript_compile
${LLLOGIN_INCLUDE_DIRS}
${UPDATER_INCLUDE_DIRS}
+ ${LIBS_PREBUILT_DIR}/include/collada
${OPENAL_LIB_INCLUDE_DIRS}
+ ${LIBS_PREBUILT_DIR}/include/collada/1.4
)
set(viewer_SOURCE_FILES
+ groupchatlistener.cpp
+ llaccountingquotamanager.cpp
llagent.cpp
llagentaccess.cpp
llagentcamera.cpp
@@ -195,6 +203,8 @@ set(viewer_SOURCE_FILES
llfloatermediabrowser.cpp
llfloatermediasettings.cpp
llfloatermemleak.cpp
+ llfloatermodelpreview.cpp
+ llfloatermodelwizard.cpp
llfloaternamedesc.cpp
llfloaternotificationsconsole.cpp
llfloateropenobject.cpp
@@ -214,6 +224,7 @@ set(viewer_SOURCE_FILES
llfloatersettingsdebug.cpp
llfloatersidetraytab.cpp
llfloatersnapshot.cpp
+ llfloatersounddevices.cpp
llfloatertelehub.cpp
llfloatertestinspectors.cpp
llfloatertestlistview.cpp
@@ -233,6 +244,7 @@ set(viewer_SOURCE_FILES
llfolderviewitem.cpp
llfollowcam.cpp
llfriendcard.cpp
+ llgesturelistener.cpp
llgesturemgr.cpp
llgiveinventory.cpp
llglsandbox.cpp
@@ -298,6 +310,7 @@ set(viewer_SOURCE_FILES
llmediadataclient.cpp
llmemoryview.cpp
llmenucommands.cpp
+ llmeshrepository.cpp
llmimetypes.cpp
llmorphview.cpp
llmoveview.cpp
@@ -309,6 +322,7 @@ set(viewer_SOURCE_FILES
llnearbychat.cpp
llnearbychatbar.cpp
llnearbychathandler.cpp
+ llnearbychatbarlistener.cpp
llnetmap.cpp
llnotificationalerthandler.cpp
llnotificationgrouphandler.cpp
@@ -381,6 +395,7 @@ set(viewer_SOURCE_FILES
llparticipantlist.cpp
llpatchvertexarray.cpp
llphysicsmotion.cpp
+ llphysicsshapebuilderutil.cpp
llplacesinventorybridge.cpp
llplacesinventorypanel.cpp
llpopupview.cpp
@@ -400,6 +415,7 @@ set(viewer_SOURCE_FILES
llremoteparcelrequest.cpp
llsavedsettingsglue.cpp
llsaveoutfitcombobtn.cpp
+ llsceneview.cpp
llscreenchannel.cpp
llscriptfloater.cpp
llscrollingpanelparam.cpp
@@ -612,6 +628,8 @@ endif (LINUX)
set(viewer_HEADER_FILES
CMakeLists.txt
ViewerInstall.cmake
+ groupchatlistener.h
+ llaccountingquotamanager.h
llagent.h
llagentaccess.h
llagentcamera.h
@@ -739,6 +757,8 @@ set(viewer_HEADER_FILES
llfloatermediabrowser.h
llfloatermediasettings.h
llfloatermemleak.h
+ llfloatermodelpreview.h
+ llfloatermodelwizard.h
llfloaternamedesc.h
llfloaternotificationsconsole.h
llfloateropenobject.h
@@ -758,6 +778,7 @@ set(viewer_HEADER_FILES
llfloatersettingsdebug.h
llfloatersidetraytab.h
llfloatersnapshot.h
+ llfloatersounddevices.h
llfloatertelehub.h
llfloatertestinspectors.h
llfloatertestlistview.h
@@ -778,6 +799,7 @@ set(viewer_HEADER_FILES
llfolderviewitem.h
llfollowcam.h
llfriendcard.h
+ llgesturelistener.h
llgesturemgr.h
llgiveinventory.h
llgroupactions.h
@@ -842,6 +864,7 @@ set(viewer_HEADER_FILES
llmediadataclient.h
llmemoryview.h
llmenucommands.h
+ llmeshrepository.h
llmimetypes.h
llmorphview.h
llmoveview.h
@@ -853,6 +876,7 @@ set(viewer_HEADER_FILES
llnearbychat.h
llnearbychatbar.h
llnearbychathandler.h
+ llnearbychatbarlistener.h
llnetmap.h
llnotificationhandler.h
llnotificationmanager.h
@@ -919,6 +943,7 @@ set(viewer_HEADER_FILES
llparticipantlist.h
llpatchvertexarray.h
llphysicsmotion.h
+ llphysicsshapebuilderutil.h
llplacesinventorybridge.h
llplacesinventorypanel.h
llpolymesh.h
@@ -940,6 +965,7 @@ set(viewer_HEADER_FILES
llrootview.h
llsavedsettingsglue.h
llsaveoutfitcombobtn.h
+ llsceneview.h
llscreenchannel.h
llscriptfloater.h
llscrollingpanelparam.h
@@ -1439,11 +1465,11 @@ 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\""
- LINK_FLAGS "/debug /NODEFAULTLIB:LIBCMT /SUBSYSTEM:WINDOWS"
+ LINK_FLAGS "/debug /NODEFAULTLIB:LIBCMT /SUBSYSTEM:WINDOWS /INCLUDE:__tcmalloc"
LINK_FLAGS_DEBUG "/NODEFAULTLIB:\"LIBCMT;LIBCMTD;MSVCRT\" /INCREMENTAL:NO"
LINK_FLAGS_RELEASE ""
)
@@ -1482,6 +1508,12 @@ if (WINDOWS)
${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/libapr-1.dll
${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/libaprutil-1.dll
${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/libapriconv-1.dll
+ ${SHARED_LIB_STAGING_DIR}/Release/glod.dll
+ ${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/glod.dll
+ ${SHARED_LIB_STAGING_DIR}/Debug/glod.dll
+ ${SHARED_LIB_STAGING_DIR}/Release/libcollada14dom22.dll
+ ${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/libcollada14dom22.dll
+ ${SHARED_LIB_STAGING_DIR}/Debug/libcollada14dom22-d.dll
${SHARED_LIB_STAGING_DIR}/Release/openjpeg.dll
${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/openjpeg.dll
${SHARED_LIB_STAGING_DIR}/Debug/openjpegd.dll
@@ -1654,6 +1686,7 @@ endif (WINDOWS)
# that they depend upon. -brad
target_link_libraries(${VIEWER_BINARY_NAME}
${UPDATER_LIBRARIES}
+ ${GOOGLE_PERFTOOLS_LIBRARIES}
${LLAUDIO_LIBRARIES}
${LLCHARACTER_LIBRARIES}
${LLIMAGE_LIBRARIES}
@@ -1678,6 +1711,7 @@ target_link_libraries(${VIEWER_BINARY_NAME}
${DBUSGLIB_LIBRARIES}
${OPENGL_LIBRARIES}
${FMODWRAPPER_LIBRARY} # must come after LLAudio
+ ${GLOD_LIBRARIES}
${OPENGL_LIBRARIES}
${JSONCPP_LIBRARIES}
${SDL_LIBRARY}
@@ -1689,7 +1723,8 @@ target_link_libraries(${VIEWER_BINARY_NAME}
${OPENSSL_LIBRARIES}
${CRYPTO_LIBRARIES}
${LLLOGIN_LIBRARIES}
- ${GOOGLE_PERFTOOLS_LIBRARIES}
+ ${LLCONVEXDECOMP_LIBRARY}
+ ${TCMALLOC_LIBRARIES}
)
if (USE_KDU)
@@ -1745,6 +1780,8 @@ if (LINUX)
${COPY_INPUT_DEPENDENCIES}
)
+ if (PACKAGE)
+ endif (PACKAGE)
add_custom_command(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/.${product}.copy_touched
COMMAND ${PYTHON_EXECUTABLE}
diff --git a/indra/newview/English.lproj/InfoPlist.strings b/indra/newview/English.lproj/InfoPlist.strings
index 4bf67b1367..5c7cacedec 100644
--- a/indra/newview/English.lproj/InfoPlist.strings
+++ b/indra/newview/English.lproj/InfoPlist.strings
@@ -2,6 +2,6 @@
CFBundleName = "Second Life";
-CFBundleShortVersionString = "Second Life version 2.1.1.0";
-CFBundleGetInfoString = "Second Life version 2.1.1.0, Copyright 2004-2010 Linden Research, Inc.";
+CFBundleShortVersionString = "Second Life version 2.1.0.13828";
+CFBundleGetInfoString = "Second Life version 2.1.0.13828, Copyright 2004-2009 Linden Research, Inc.";
diff --git a/indra/newview/Info-SecondLife.plist b/indra/newview/Info-SecondLife.plist
index 3cda7467dd..f7b11b217c 100644
--- a/indra/newview/Info-SecondLife.plist
+++ b/indra/newview/Info-SecondLife.plist
@@ -60,7 +60,7 @@
</dict>
</array>
<key>CFBundleVersion</key>
- <string>2.1.1.0</string>
+ <string>2.1.0.13828</string>
<key>CSResourcesFileMapped</key>
<true/>
</dict>
diff --git a/indra/newview/app_settings/high_graphics.xml b/indra/newview/app_settings/high_graphics.xml
index 4e137d971a..5bc2e1b7e6 100644
--- a/indra/newview/app_settings/high_graphics.xml
+++ b/indra/newview/app_settings/high_graphics.xml
@@ -4,15 +4,15 @@
<RenderAvatarCloth value="FALSE"/>
<!--Default for now-->
<RenderAvatarLODFactor value="1.0"/>
- <!--Default for now-->
- <RenderAvatarPhysicsLODFactor value="0.9"/>
+ <!--Default for now-->
+ <RenderAvatarPhysicsLODFactor value="0.9"/>
<!--NO SHADERS-->
<RenderAvatarVP value="TRUE"/>
<!--Short Range-->
<RenderFarClip value="128"/>
<!--Default for now-->
<RenderFlexTimeFactor value="1"/>
- <!--256... but they don't use this-->
+ <!--256... but they do not use this-->
<RenderGlowResolutionPow value="9"/>
<!--Low number-->
<RenderMaxPartCount value="4096"/>
@@ -26,8 +26,6 @@
<RenderTerrainLODFactor value="2"/>
<!--Default for now-->
<RenderTreeLODFactor value="0.5"/>
- <!--Default for now-->
- <RenderUseFBO value="1"/>
<!--Try Impostors-->
<RenderUseImpostors value="TRUE"/>
<!--Default for now-->
@@ -36,11 +34,10 @@
<VertexShaderEnable value="TRUE"/>
<!--NO SHADERS-->
<WindLightUseAtmosShaders value="TRUE"/>
- <!--Deferred Shading-->
- <RenderDeferred value="FALSE"/>
- <!--SSAO Disabled-->
- <RenderDeferredSSAO value="FALSE"/>
- <!--Sun Shadows-->
- <RenderShadowDetail value="0"/>
-
+ <!--Deferred Shading-->
+ <RenderDeferred value="FALSE"/>
+ <!--SSAO Disabled-->
+ <RenderDeferredSSAO value="FALSE"/>
+ <!--Sun Shadows-->
+ <RenderShadowDetail value="0"/>
</settings>
diff --git a/indra/newview/app_settings/low_graphics.xml b/indra/newview/app_settings/low_graphics.xml
index 79463b475c..ca1dae0b86 100644
--- a/indra/newview/app_settings/low_graphics.xml
+++ b/indra/newview/app_settings/low_graphics.xml
@@ -4,17 +4,17 @@
<RenderAvatarCloth value="FALSE"/>
<!--Default for now-->
<RenderAvatarLODFactor value="0.5"/>
- <!--Default for now-->
- <RenderAvatarPhysicsLODFactor value="0.0"/>
- <!--Default for now-->
- <RenderAvatarMaxVisible value="3"/>
+ <!--Default for now-->
+ <RenderAvatarPhysicsLODFactor value="0.0"/>
+ <!--Default for now-->
+ <RenderAvatarMaxVisible value="3"/>
<!--NO SHADERS-->
<RenderAvatarVP value="FALSE"/>
<!--Short Range-->
<RenderFarClip value="64"/>
<!--Default for now-->
<RenderFlexTimeFactor value="0.5"/>
- <!--256... but they don't use this-->
+ <!--256... but they do not use this-->
<RenderGlowResolutionPow value="8"/>
<!--Low number-->
<RenderMaxPartCount value="1024"/>
@@ -28,8 +28,6 @@
<RenderTerrainLODFactor value="1.0"/>
<!--Default for now-->
<RenderTreeLODFactor value="0.5"/>
- <!--Default for now-->
- <RenderUseFBO value="0"/>
<!--Try Impostors-->
<RenderUseImpostors value="TRUE"/>
<!--Default for now-->
@@ -38,11 +36,10 @@
<VertexShaderEnable value="FALSE"/>
<!--NO SHADERS-->
<WindLightUseAtmosShaders value="FALSE"/>
- <!--No Deferred Shading-->
- <RenderDeferred value="FALSE"/>
- <!--SSAO Disabled-->
- <RenderDeferredSSAO value="FALSE"/>
- <!--No Shadows-->
- <RenderShadowDetail value="0"/>
-
+ <!--No Deferred Shading-->
+ <RenderDeferred value="FALSE"/>
+ <!--SSAO Disabled-->
+ <RenderDeferredSSAO value="FALSE"/>
+ <!--No Shadows-->
+ <RenderShadowDetail value="0"/>
</settings>
diff --git a/indra/newview/app_settings/mid_graphics.xml b/indra/newview/app_settings/mid_graphics.xml
index ab1e2a2e1c..01822fe64c 100644
--- a/indra/newview/app_settings/mid_graphics.xml
+++ b/indra/newview/app_settings/mid_graphics.xml
@@ -4,15 +4,15 @@
<RenderAvatarCloth value="FALSE"/>
<!--Default for now-->
<RenderAvatarLODFactor value="0.5"/>
- <!--Default for now-->
- <RenderAvatarPhysicsLODFactor value="0.75"/>
+ <!--Default for now-->
+ <RenderAvatarPhysicsLODFactor value="0.75"/>
<!--NO SHADERS-->
<RenderAvatarVP value="TRUE"/>
<!--Short Range-->
<RenderFarClip value="96"/>
<!--Default for now-->
<RenderFlexTimeFactor value="1"/>
- <!--256... but they don't use this-->
+ <!--256... but they do not use this-->
<RenderGlowResolutionPow value="8"/>
<!--Low number-->
<RenderMaxPartCount value="2048"/>
@@ -26,8 +26,6 @@
<RenderTerrainLODFactor value="1.0"/>
<!--Default for now-->
<RenderTreeLODFactor value="0.5"/>
- <!--Default for now-->
- <RenderUseFBO value="0"/>
<!--Try Impostors-->
<RenderUseImpostors value="TRUE"/>
<!--Default for now-->
@@ -36,11 +34,10 @@
<VertexShaderEnable value="TRUE"/>
<!--NO SHADERS-->
<WindLightUseAtmosShaders value="FALSE"/>
- <!--No Deferred Shading-->
- <RenderDeferred value="FALSE"/>
- <!--SSAO Disabled-->
- <RenderDeferredSSAO value="FALSE"/>
- <!--No Shadows-->
- <RenderShadowDetail value="0"/>
-
+ <!--No Deferred Shading-->
+ <RenderDeferred value="FALSE"/>
+ <!--SSAO Disabled-->
+ <RenderDeferredSSAO value="FALSE"/>
+ <!--No Shadows-->
+ <RenderShadowDetail value="0"/>
</settings>
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index bb4f2664cd..ac6ea0f860 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -652,17 +652,6 @@
<key>Value</key>
<integer>1</integer>
</map>
- <key>AvatarPhysicsTest</key>
- <map>
- <key>Comment</key>
- <string>Simulate continuous physics behavior on all nearby avatars.</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
<key>AvatarSex</key>
<map>
<key>Comment</key>
@@ -719,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>
@@ -1344,7 +1344,68 @@
<key>Value</key>
<integer>0</integer>
</map>
- <key>CertStore</key>
+
+ <key>CameraFocusTransitionTime</key>
+ <map>
+ <key>Comment</key>
+ <string>How many seconds it takes the camera to transition between focal distances</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0.5</real>
+ </map>
+
+ <key>CameraFNumber</key>
+ <map>
+ <key>Comment</key>
+ <string>Camera f-number value for DoF effect</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>9.0</real>
+ </map>
+
+ <key>CameraFocalLength</key>
+ <map>
+ <key>Comment</key>
+ <string>Camera focal length for DoF effect (in millimeters)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>50</real>
+ </map>
+
+ <key>CameraFieldOfView</key>
+ <map>
+ <key>Comment</key>
+ <string>Vertical camera field of view for DoF effect (in degrees)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>60.0</real>
+ </map>
+
+ <key>CameraAspectRatio</key>
+ <map>
+ <key>Comment</key>
+ <string>Camera aspect ratio for DoF effect</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>1.5</real>
+ </map>
+
+ <key>CertStore</key>
<map>
<key>Comment</key>
<string>Specifies the Certificate Store for certificate trust verification</string>
@@ -1866,7 +1927,7 @@
<key>DebugShowRenderInfo</key>
<map>
<key>Comment</key>
- <string>Show depth buffer contents</string>
+ <string>Show stats about current scene</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -1874,6 +1935,17 @@
<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>
@@ -2986,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>
@@ -3184,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>
@@ -3919,7 +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>
+ <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>
@@ -4295,6 +4367,39 @@
<key>Value</key>
<real>0.25</real>
</map>
+ <key>Jpeg2000AdvancedCompression</key>
+ <map>
+ <key>Comment</key>
+ <string>Use advanced Jpeg2000 compression options (precincts, blocks, ordering, markers)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>Jpeg2000PrecinctsSize</key>
+ <map>
+ <key>Comment</key>
+ <string>Size of image precincts. Assumed square and same for all levels. Must be power of 2.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>256</integer>
+ </map>
+ <key>Jpeg2000BlocksSize</key>
+ <map>
+ <key>Comment</key>
+ <string>Size of encoding blocks. Assumed square and same for all levels. Must be power of 2. Max 64, Min 4.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>64</integer>
+ </map>
<key>KeepAspectForSnapshot</key>
<map>
<key>Comment</key>
@@ -5462,7 +5567,40 @@
<key>Value</key>
<real>0</real>
</map>
- <key>MigrateCacheDirectory</key>
+ <key>MeshEnabled</key>
+ <map>
+ <key>Comment</key>
+ <string>Expose UI for mesh functionality (may require restart to take effect).</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <real>1</real>
+ </map>
+ <key>MeshImportUseSLM</key>
+ <map>
+ <key>Comment</key>
+ <string>Use cached copy of last upload for a dae if available instead of loading dae file from scratch.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <real>0</real>
+ </map>
+ <key>MeshUseWholeModelUpload</key>
+ <map>
+ <key>Comment</key>
+ <string>Upload model in its entirety instead of mesh-by-mesh (new caps)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <real>0</real>
+ </map>
+ <key>MigrateCacheDirectory</key>
<map>
<key>Comment</key>
<string>Check for old version of disk cache to migrate to current location</string>
@@ -6125,6 +6263,66 @@
<key>Value</key>
<real>0.0</real>
</map>
+ <key>ObjectCostHighThreshold</key>
+ <map>
+ <key>Comment</key>
+ <string>Threshold at which object cost is considered high (displayed in red).</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>50.0</real>
+ </map>
+ <key>ObjectCostLowColor</key>
+ <map>
+ <key>Comment</key>
+ <string>Color for object with a low object cost.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Color4</string>
+ <key>Value</key>
+ <array>
+ <real>0.0</real>
+ <real>0.5</real>
+ <real>1.0</real>
+ <real>0.5</real>
+ </array>
+ </map>
+ <key>ObjectCostMidColor</key>
+ <map>
+ <key>Comment</key>
+ <string>Color for object with a medium object cost.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Color4</string>
+ <key>Value</key>
+ <array>
+ <real>1.0</real>
+ <real>0.75</real>
+ <real>0.0</real>
+ <real>0.65</real>
+ </array>
+ </map>
+ <key>ObjectCostHighColor</key>
+ <map>
+ <key>Comment</key>
+ <string>Color for object a high object cost.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Color4</string>
+ <key>Value</key>
+ <array>
+ <real>1.0</real>
+ <real>0.0</real>
+ <real>0.0</real>
+ <real>0.75</real>
+ </array>
+ </map>
+
<key>ParcelMediaAutoPlayEnable</key>
<map>
<key>Comment</key>
@@ -6360,7 +6558,177 @@
<key>Value</key>
<integer>13</integer>
</map>
- <key>PrimMediaMasterEnabled</key>
+
+ <key>PreviewAmbientColor</key>
+ <map>
+ <key>Comment</key>
+ <string>Ambient color of preview render.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Color4</string>
+ <key>Value</key>
+ <array>
+ <real>0.0</real>
+ <real>0.0</real>
+ <real>0.0</real>
+ <real>1.0</real>
+ </array>
+ </map>
+
+
+ <key>PreviewDiffuse0</key>
+ <map>
+ <key>Comment</key>
+ <string>Diffise color of preview light 0.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Color4</string>
+ <key>Value</key>
+ <array>
+ <real>1.0</real>
+ <real>1.0</real>
+ <real>1.0</real>
+ <real>1.0</real>
+ </array>
+ </map>
+
+ <key>PreviewDiffuse1</key>
+ <map>
+ <key>Comment</key>
+ <string>Diffise color of preview light 1.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Color4</string>
+ <key>Value</key>
+ <array>
+ <real>0.25</real>
+ <real>0.25</real>
+ <real>0.25</real>
+ <real>1.0</real>
+ </array>
+ </map>
+
+ <key>PreviewDiffuse2</key>
+ <map>
+ <key>Comment</key>
+ <string>Diffise color of preview light 2.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Color4</string>
+ <key>Value</key>
+ <array>
+ <real>1.0</real>
+ <real>1.0</real>
+ <real>1.0</real>
+ <real>1.0</real>
+ </array>
+ </map>
+
+ <key>PreviewSpecular0</key>
+ <map>
+ <key>Comment</key>
+ <string>Diffise color of preview light 0.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Color4</string>
+ <key>Value</key>
+ <array>
+ <real>1.0</real>
+ <real>1.0</real>
+ <real>1.0</real>
+ <real>1.0</real>
+ </array>
+ </map>
+
+ <key>PreviewSpecular1</key>
+ <map>
+ <key>Comment</key>
+ <string>Diffise color of preview light 1.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Color4</string>
+ <key>Value</key>
+ <array>
+ <real>1.0</real>
+ <real>1.0</real>
+ <real>1.0</real>
+ <real>1.0</real>
+ </array>
+ </map>
+
+ <key>PreviewSpecular2</key>
+ <map>
+ <key>Comment</key>
+ <string>Diffise color of preview light 2.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Color4</string>
+ <key>Value</key>
+ <array>
+ <real>1.0</real>
+ <real>1.0</real>
+ <real>1.0</real>
+ <real>1.0</real>
+ </array>
+ </map>
+
+
+ <key>PreviewDirection0</key>
+ <map>
+ <key>Comment</key>
+ <string>Direction of light 0 for preview render.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Vector3</string>
+ <key>Value</key>
+ <array>
+ <real>-0.75</real>
+ <real>1</real>
+ <real>1.0</real>
+ </array>
+ </map>
+
+ <key>PreviewDirection1</key>
+ <map>
+ <key>Comment</key>
+ <string>Direction of light 1 for preview render.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Vector3</string>
+ <key>Value</key>
+ <array>
+ <real>0.5</real>
+ <real>-0.6</real>
+ <real>0.4</real>
+ </array>
+ </map>
+
+ <key>PreviewDirection2</key>
+ <map>
+ <key>Comment</key>
+ <string>Direction of light 2 for preview render.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Vector3</string>
+ <key>Value</key>
+ <array>
+ <real>0.5</real>
+ <real>-0.8</real>
+ <real>0.3</real>
+ </array>
+ </map>
+
+ <key>PrimMediaMasterEnabled</key>
<map>
<key>Comment</key>
<string>Whether or not Media on a Prim is enabled.</string>
@@ -6844,7 +7212,31 @@
<key>Value</key>
<integer>1</integer>
</map>
-
+ <key>RenderPerformanceTest</key>
+ <map>
+ <key>Comment</key>
+ <string>Disable rendering of everything but in-world content for
+ performance testing</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+
+ <key>RenderLocalLights</key>
+ <map>
+ <key>Comment</key>
+ <string>Whether or not to render local lights.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+
<key>RenderShadowNearDist</key>
<map>
<key>Comment</key>
@@ -6981,7 +7373,7 @@
<string>Vector3</string>
<key>Value</key>
<array>
- <real>0.40</real>
+ <real>0.80</real>
<real>1.00</real>
<real>0.00</real>
</array>
@@ -7041,7 +7433,18 @@
<key>Value</key>
<integer>0</integer>
</map>
- <key>RenderDebugPipeline</key>
+ <key>RenderDebugNormalScale</key>
+ <map>
+ <key>Comment</key>
+ <string>Scale of normals in debug display.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0.03</real>
+ </map>
+ <key>RenderDebugPipeline</key>
<map>
<key>Comment</key>
<string>Enable strict pipeline debugging.</string>
@@ -7074,6 +7477,7 @@
<key>Value</key>
<integer>0</integer>
</map>
+
<key>RenderAnimateRes</key>
<map>
<key>Comment</key>
@@ -7085,7 +7489,31 @@
<key>Value</key>
<integer>0</integer>
</map>
-
+
+ <key>RenderBakeSunlight</key>
+ <map>
+ <key>Comment</key>
+ <string>Bake sunlight into vertex buffers for static objects.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+
+ <key>RenderNoAlpha</key>
+ <map>
+ <key>Comment</key>
+ <string>Disable rendering of alpha objects (render all alpha objects as alpha masks).</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+
<key>RenderAnimateTrees</key>
<map>
<key>Comment</key>
@@ -7242,6 +7670,18 @@
<real>16.0</real>
</map>
+ <key>RenderMinimumLODTriangleCount</key>
+ <map>
+ <key>Comment</key>
+ <string>Triangle count threshold at which automatic LOD generation stops</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <real>16</real>
+ </map>
+
<key>RenderEdgeDepthCutoff</key>
<map>
<key>Comment</key>
@@ -7332,7 +7772,6 @@
<key>Value</key>
<real>0.01</real>
</map>
-
<key>RenderShadowBiasError</key>
<map>
<key>Comment</key>
@@ -7355,6 +7794,18 @@
<key>Value</key>
<real>0</real>
</map>
+
+ <key>RenderDepthOfField</key>
+ <map>
+ <key>Comment</key>
+ <string>Whether to use depth of field effect when lighting and shadows are enabled</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>RenderSpotLightsInNondeferred</key>
<map>
@@ -7377,7 +7828,7 @@
<key>Type</key>
<string>F32</string>
<key>Value</key>
- <real>0.0</real>
+ <real>-0.001</real>
</map>
<key>RenderSpotShadowOffset</key>
<map>
@@ -7599,30 +8050,6 @@
<integer>1</integer>
</map>
- <key>RenderDeferredLocalLights</key>
- <map>
- <key>Comment</key>
- <string>Execute local lighting shader in deferred renderer.</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>1</integer>
- </map>
-
- <key>RenderDeferredFullscreenLights</key>
- <map>
- <key>Comment</key>
- <string>Execute local lighting shader in deferred renderer.</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>1</integer>
- </map>
-
<key>RenderDeferredSunWash</key>
<map>
<key>Comment</key>
@@ -7665,7 +8092,7 @@
<key>Type</key>
<string>F32</string>
<key>Value</key>
- <real>1.1</real>
+ <real>0.8</real>
</map>
<key>RenderShadowGaussian</key>
@@ -7715,7 +8142,7 @@
<key>Type</key>
<string>F32</string>
<key>Value</key>
- <real>0.1</real>
+ <real>0</real>
</map>
<key>RenderGIAmbiance</key>
@@ -7935,9 +8362,9 @@
<string>Vector3</string>
<key>Value</key>
<array>
- <real>0.299</real>
- <real>0.587</real>
- <real>0.114</real>
+ <real>1</real>
+ <real>0</real>
+ <real>0</real>
</array>
</map>
<key>RenderGlowMaxExtractAlpha</key>
@@ -7949,7 +8376,7 @@
<key>Type</key>
<string>F32</string>
<key>Value</key>
- <real>0.065</real>
+ <real>0.25</real>
</map>
<key>RenderGlowMinLuminance</key>
<map>
@@ -7960,7 +8387,7 @@
<key>Type</key>
<string>F32</string>
<key>Value</key>
- <real>2.5</real>
+ <real>9999</real>
</map>
<key>RenderGlowResolutionPow</key>
<map>
@@ -8074,7 +8501,7 @@
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
- <integer>1</integer>
+ <integer>0</integer>
</map>
<key>RenderHideGroupTitle</key>
<map>
@@ -8440,17 +8867,6 @@
<key>Value</key>
<integer>0</integer>
</map>
- <key>RenderUseFBO</key>
- <map>
- <key>Comment</key>
- <string>Whether we want to use GL_EXT_framebuffer_objects.</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>1</integer>
- </map>
<key>RenderUseTriStrips</key>
<map>
<key>Comment</key>
@@ -8539,7 +8955,18 @@
<key>Value</key>
<integer>1</integer>
</map>
- <key>RenderVolumeLODFactor</key>
+ <key>RenderPreferStreamDraw</key>
+ <map>
+ <key>Comment</key>
+ <string>Use GL_STREAM_DRAW in place of GL_DYNAMIC_DRAW</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>RenderVolumeLODFactor</key>
<map>
<key>Comment</key>
<string>Controls level of detail of primitives (multiplier for current screen area when calculated level of detail)</string>
@@ -8616,7 +9043,51 @@
<key>Value</key>
<real>1.0</real>
</map>
- <key>SafeMode</key>
+ <key>MeshStreamingCostScaler</key>
+ <map>
+ <key>Comment</key>
+ <string>DEBUG</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>3.0</real>
+ </map>
+ <key>MeshThreadCount</key>
+ <map>
+ <key>Comment</key>
+ <string>Number of threads to use for loading meshes.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <integer>8</integer>
+ </map>
+ <key>MeshMaxConcurrentRequests</key>
+ <map>
+ <key>Comment</key>
+ <string>Number of threads to use for loading meshes.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <integer>32</integer>
+ </map>
+ <key>RunMultipleThreads</key>
+ <map>
+ <key>Comment</key>
+ <string>If TRUE keep background threads active during render</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>SafeMode</key>
<map>
<key>Comment</key>
<string>Reset preferences, run in safe mode.</string>
@@ -9903,6 +10374,17 @@
<key>Value</key>
<string>pilot.txt</string>
</map>
+ <key>StatsPilotXMLFile</key>
+ <map>
+ <key>Comment</key>
+ <string>Filename for stats logging extended autopilot path</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>pilot.xml</string>
+ </map>
<key>StatsQuitAfterRuns</key>
<map>
<key>Comment</key>
@@ -11386,7 +11868,7 @@
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
- <integer>1</integer>
+ <integer>0</integer>
</map>
<key>SpeakerParticipantDefaultOrder</key>
<map>
@@ -11673,10 +12155,10 @@
<key>Value</key>
<integer>0</integer>
</map>
- <key>VoiceCallsRejectAll</key>
+ <key>VoiceCallsRejectGroup</key>
<map>
<key>Comment</key>
- <string>Silently reject all incoming voice calls.</string>
+ <string>Silently reject all incoming group voice calls.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -11924,7 +12406,7 @@
<key>Type</key>
<string>S32</string>
<key>Value</key>
- <integer>-1</integer>
+ <integer>20</integer>
</map>
<key>WaterEditPresets</key>
<map>
@@ -12272,6 +12754,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>
@@ -12568,6 +13061,17 @@
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
+ </map>
+ <key>EnablePlaceProfile</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable viewing of place profile from web link</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
</map>
<key>EnablePicks</key>
<map>
@@ -12624,6 +13128,39 @@
<key>Value</key>
<integer>1</integer>
</map>
+ <key>EnableInventory</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable opening inventory from web link</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>EnableSearch</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable opening search from web link</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>EnableAppearance</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable opening appearance from web link</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
<key>SearchFromAddressBar</key>
<map>
<key>Comment</key>
@@ -12701,5 +13238,27 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>OpenIMOnVoice</key>
+ <map>
+ <key>Comment</key>
+ <string>Open the corresponding IM window when connecting to a voice call.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>AllowBottomTrayButtonReordering</key>
+ <map>
+ <key>Comment</key>
+ <string>Allow user to move and hide bottom tray buttons</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
</map>
</llsd>
diff --git a/indra/newview/app_settings/settings_crash_behavior.xml b/indra/newview/app_settings/settings_crash_behavior.xml
index cc7f5ac88b..97651ff4ca 100644
--- a/indra/newview/app_settings/settings_crash_behavior.xml
+++ b/indra/newview/app_settings/settings_crash_behavior.xml
@@ -9,7 +9,7 @@
<key>Type</key>
<string>S32</string>
<key>Value</key>
- <integer>0</integer>
+ <integer>1</integer>
</map>
</map>
</llsd>
diff --git a/indra/newview/app_settings/settings_minimal.xml b/indra/newview/app_settings/settings_minimal.xml
index 490da2c9d4..70a75cb4ca 100644
--- a/indra/newview/app_settings/settings_minimal.xml
+++ b/indra/newview/app_settings/settings_minimal.xml
@@ -45,15 +45,6 @@
<key>Value</key>
<integer>0</integer>
</map>
- <key>EnableVoiceChat</key>
- <map>
- <key>Comment</key>
- <string>Enable talking to other residents with a microphone</string>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
<key>HelpURLFormat</key>
<map>
<key>Comment</key>
@@ -117,10 +108,10 @@
<key>Value</key>
<integer>0</integer>
</map>
- <key>VoiceCallsRejectAll</key>
+ <key>VoiceCallsRejectGroup</key>
<map>
<key>Comment</key>
- <string>Silently reject all incoming voice calls.</string>
+ <string>Silently reject all incoming group voice calls.</string>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
@@ -133,7 +124,7 @@
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
- <integer>1</integer>
+ <integer>0</integer>
</map>
<key>ScriptsCanShowUI</key>
<map>
@@ -248,6 +239,17 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>EnablePlaceProfile</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable viewing of place profile from web link</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>EnablePicks</key>
<map>
<key>Comment</key>
@@ -290,7 +292,7 @@
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
- <integer>0</integer>
+ <integer>1</integer>
</map>
<key>EnableAvatarShare</key>
<map>
@@ -303,6 +305,39 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>EnableInventory</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable opening inventory from web link</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>EnableSearch</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable opening search from web link</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>EnableAppearance</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable opening appearance from web link</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>DoubleClickShowWorldMap</key>
<map>
<key>Comment</key>
@@ -402,5 +437,27 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>OpenIMOnVoice</key>
+ <map>
+ <key>Comment</key>
+ <string>Open the corresponding IM window when connecting to a voice call.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>AllowBottomTrayButtonReordering</key>
+ <map>
+ <key>Comment</key>
+ <string>Allow user to move and hide bottom tray buttons</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
</map>
</llsd>
diff --git a/indra/newview/app_settings/settings_per_account.xml b/indra/newview/app_settings/settings_per_account.xml
index 8efec1cff0..ff24efaf2c 100644
--- a/indra/newview/app_settings/settings_per_account.xml
+++ b/indra/newview/app_settings/settings_per_account.xml
@@ -44,6 +44,17 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>LastPostcardRecipient</key>
+ <map>
+ <key>Comment</key>
+ <string>Last recipient of postcard</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string />
+ </map>
<key>LogNearbyChat</key>
<map>
<key>Comment</key>
diff --git a/indra/newview/app_settings/shaders/class1/avatar/avatarF.glsl b/indra/newview/app_settings/shaders/class1/avatar/avatarF.glsl
index 5de9cb0790..3f6b8b3323 100644
--- a/indra/newview/app_settings/shaders/class1/avatar/avatarF.glsl
+++ b/indra/newview/app_settings/shaders/class1/avatar/avatarF.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 7e9818e54a..1ad87badfe 100644
--- a/indra/newview/app_settings/shaders/class1/avatar/avatarSkinV.glsl
+++ b/indra/newview/app_settings/shaders/class1/avatar/avatarSkinV.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 9f06301cc7..a15846f192 100644
--- a/indra/newview/app_settings/shaders/class1/avatar/avatarV.glsl
+++ b/indra/newview/app_settings/shaders/class1/avatar/avatarV.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 0feb88535a..05fe100372 100644
--- a/indra/newview/app_settings/shaders/class1/avatar/eyeballF.glsl
+++ b/indra/newview/app_settings/shaders/class1/avatar/eyeballF.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 30a2f10f62..4b8a7604a1 100644
--- a/indra/newview/app_settings/shaders/class1/avatar/eyeballV.glsl
+++ b/indra/newview/app_settings/shaders/class1/avatar/eyeballV.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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
new file mode 100644
index 0000000000..ef823c28b1
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl
@@ -0,0 +1,30 @@
+/**
+ * @file objectSkinV.glsl
+ *
+ * Copyright (c) 2007-$CurrentYear$, Linden Research, Inc.
+ * $License$
+ */
+
+#version 120
+
+attribute vec4 object_weight;
+
+uniform mat4 matrixPalette[32];
+
+mat4 getObjectSkinnedTransform()
+{
+ int i;
+
+ vec4 w = fract(object_weight);
+ vec4 index = floor(object_weight);
+
+ float scale = 1.0/(w.x+w.y+w.z+w.w);
+ w *= scale;
+
+ mat4 mat = matrixPalette[int(index.x)]*w.x;
+ mat += matrixPalette[int(index.y)]*w.y;
+ mat += matrixPalette[int(index.z)]*w.z;
+ mat += matrixPalette[int(index.w)]*w.w;
+
+ return mat;
+}
diff --git a/indra/newview/app_settings/shaders/class1/avatar/pickAvatarF.glsl b/indra/newview/app_settings/shaders/class1/avatar/pickAvatarF.glsl
index bcd710dc57..27ac59a840 100644
--- a/indra/newview/app_settings/shaders/class1/avatar/pickAvatarF.glsl
+++ b/indra/newview/app_settings/shaders/class1/avatar/pickAvatarF.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 299def1927..f1aa549a47 100644
--- a/indra/newview/app_settings/shaders/class1/avatar/pickAvatarV.glsl
+++ b/indra/newview/app_settings/shaders/class1/avatar/pickAvatarV.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 171a0e76f7..3b12a07a27 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl
@@ -4,11 +4,12 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/LicenseInfo$
*/
+
+#version 120
#extension GL_ARB_texture_rectangle : enable
uniform sampler2D diffuseMap;
-uniform sampler2D noiseMap;
uniform sampler2DRect depthMap;
uniform mat4 shadow_matrix[6];
@@ -22,7 +23,7 @@ varying vec3 vary_ambient;
varying vec3 vary_directional;
varying vec3 vary_fragcoord;
varying vec3 vary_position;
-varying vec3 vary_light;
+varying vec3 vary_pointlight_col;
uniform mat4 inv_proj;
@@ -44,18 +45,19 @@ void main()
vec2 frag = vary_fragcoord.xy/vary_fragcoord.z*0.5+0.5;
frag *= screen_res;
- vec3 samp_pos = getPosition(frag).xyz;
-
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 = texture2D(diffuseMap, gl_TexCoord[0].xy) * col;
+ vec4 color = diff * col;
color.rgb = atmosLighting(color.rgb);
color.rgb = scaleSoftClip(color.rgb);
- //gl_FragColor = gl_Color;
+ 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
new file mode 100644
index 0000000000..65d9209983
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/alphaSkinnedV.glsl
@@ -0,0 +1,112 @@
+/**
+ * @file alphaSkinnedV.glsl
+ *
+ * Copyright (c) 2007-$CurrentYear$, Linden Research, Inc.
+ * $License$
+ */
+
+#version 120
+
+vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
+mat4 getObjectSkinnedTransform();
+void calcAtmospherics(vec3 inPositionEye);
+
+float calcDirectionalLight(vec3 n, vec3 l);
+
+vec3 atmosAmbient(vec3 light);
+vec3 atmosAffectDirectionalLight(float lightIntensity);
+vec3 scaleDownLight(vec3 light);
+vec3 scaleUpLight(vec3 light);
+
+varying vec3 vary_position;
+varying vec3 vary_ambient;
+varying vec3 vary_directional;
+varying vec3 vary_normal;
+varying vec3 vary_fragcoord;
+varying vec3 vary_pointlight_col;
+
+uniform float near_clip;
+
+float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight)
+{
+ //get light vector
+ vec3 lv = lp.xyz-v;
+
+ //get distance
+ float d = length(lv);
+
+ float 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);
+ 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
+
+ //angular attenuation
+ da *= calcDirectionalLight(n, lv);
+ }
+
+ return da;
+}
+
+void main()
+{
+ gl_TexCoord[0] = gl_MultiTexCoord0;
+
+ vec4 pos;
+ vec3 norm;
+
+ mat4 trans = getObjectSkinnedTransform();
+ trans = gl_ModelViewMatrix * trans;
+
+ pos = trans * gl_Vertex;
+
+ norm = gl_Vertex.xyz + gl_Normal.xyz;
+ norm = normalize(( trans*vec4(norm, 1.0) ).xyz-pos.xyz);
+
+ vec4 frag_pos = gl_ProjectionMatrix * pos;
+ gl_Position = frag_pos;
+
+ vary_position = pos.xyz;
+ vary_normal = norm;
+
+ calcAtmospherics(pos.xyz);
+
+ vec4 col = vec4(0.0, 0.0, 0.0, gl_Color.a);
+
+ // Collect normal lights
+ col.rgb += gl_LightSource[2].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[2].position, gl_LightSource[2].spotDirection.xyz, gl_LightSource[2].linearAttenuation, gl_LightSource[2].quadraticAttenuation, gl_LightSource[2].specular.a);
+ col.rgb += gl_LightSource[3].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[3].position, gl_LightSource[3].spotDirection.xyz, gl_LightSource[3].linearAttenuation, gl_LightSource[3].quadraticAttenuation ,gl_LightSource[3].specular.a);
+ col.rgb += gl_LightSource[4].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[4].position, gl_LightSource[4].spotDirection.xyz, gl_LightSource[4].linearAttenuation, gl_LightSource[4].quadraticAttenuation, gl_LightSource[4].specular.a);
+ col.rgb += gl_LightSource[5].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[5].position, gl_LightSource[5].spotDirection.xyz, gl_LightSource[5].linearAttenuation, gl_LightSource[5].quadraticAttenuation, gl_LightSource[5].specular.a);
+ col.rgb += gl_LightSource[6].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[6].position, gl_LightSource[6].spotDirection.xyz, gl_LightSource[6].linearAttenuation, gl_LightSource[6].quadraticAttenuation, gl_LightSource[6].specular.a);
+ col.rgb += gl_LightSource[7].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[7].position, gl_LightSource[7].spotDirection.xyz, gl_LightSource[7].linearAttenuation, gl_LightSource[7].quadraticAttenuation, gl_LightSource[7].specular.a);
+
+ vary_pointlight_col = col.rgb*gl_Color.rgb;
+
+ col.rgb = vec3(0,0,0);
+
+ // Add windlight lights
+ col.rgb = atmosAmbient(vec3(0.));
+
+ vary_ambient = col.rgb*gl_Color.rgb;
+ vary_directional = gl_Color.rgb*atmosAffectDirectionalLight(max(calcDirectionalLight(norm, gl_LightSource[0].position.xyz), (1.0-gl_Color.a)*(1.0-gl_Color.a)));
+
+ col.rgb = min(col.rgb*gl_Color.rgb, 1.0);
+
+ gl_FrontColor = col;
+
+ gl_FogFragCoord = pos.z;
+
+ vary_fragcoord.xyz = frag_pos.xyz + vec3(0,0,near_clip);
+}
+
+
diff --git a/indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl b/indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl
index fabbce0824..2691fc8ded 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl
@@ -5,11 +5,12 @@
* $/LicenseInfo$
*/
+#version 120
+
vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
void calcAtmospherics(vec3 inPositionEye);
float calcDirectionalLight(vec3 n, vec3 l);
-float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float is_pointlight);
vec3 atmosAmbient(vec3 light);
vec3 atmosAffectDirectionalLight(float lightIntensity);
@@ -21,11 +22,42 @@ varying vec3 vary_directional;
varying vec3 vary_fragcoord;
varying vec3 vary_position;
varying vec3 vary_light;
+varying vec3 vary_pointlight_col;
uniform float near_clip;
uniform float shadow_offset;
uniform float shadow_bias;
+float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight)
+{
+ //get light vector
+ vec3 lv = lp.xyz-v;
+
+ //get distance
+ float d = length(lv);
+
+ float 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);
+ 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
+
+ //angular attenuation
+ da *= calcDirectionalLight(n, lv);
+ }
+
+ return da;
+}
+
void main()
{
//transform vertex
@@ -36,33 +68,35 @@ void main()
vec4 pos = (gl_ModelViewMatrix * gl_Vertex);
vec3 norm = normalize(gl_NormalMatrix * gl_Normal);
- vary_position = pos.xyz + norm.xyz * (-pos.z/64.0*shadow_offset+shadow_bias);
+ float dp_directional_light = max(0.0, dot(norm, gl_LightSource[0].position.xyz));
+ vary_position = pos.xyz + gl_LightSource[0].position.xyz * (1.0-dp_directional_light)*shadow_offset;
calcAtmospherics(pos.xyz);
//vec4 color = calcLighting(pos.xyz, norm, gl_Color, vec4(0.));
-
vec4 col = vec4(0.0, 0.0, 0.0, gl_Color.a);
- // Collect normal lights (need to be divided by two, as we later multiply by 2)
- col.rgb += gl_LightSource[2].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[2].position, gl_LightSource[2].spotDirection.xyz, gl_LightSource[2].linearAttenuation, gl_LightSource[2].specular.a);
- col.rgb += gl_LightSource[3].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[3].position, gl_LightSource[3].spotDirection.xyz, gl_LightSource[3].linearAttenuation, gl_LightSource[3].specular.a);
- col.rgb += gl_LightSource[4].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[4].position, gl_LightSource[4].spotDirection.xyz, gl_LightSource[4].linearAttenuation, gl_LightSource[4].specular.a);
- col.rgb += gl_LightSource[5].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[5].position, gl_LightSource[5].spotDirection.xyz, gl_LightSource[5].linearAttenuation, gl_LightSource[5].specular.a);
- col.rgb += gl_LightSource[6].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[6].position, gl_LightSource[6].spotDirection.xyz, gl_LightSource[6].linearAttenuation, gl_LightSource[6].specular.a);
- col.rgb += gl_LightSource[7].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[7].position, gl_LightSource[7].spotDirection.xyz, gl_LightSource[7].linearAttenuation, gl_LightSource[7].specular.a);
- col.rgb += gl_LightSource[1].diffuse.rgb*calcDirectionalLight(norm, gl_LightSource[1].position.xyz);
- col.rgb = scaleDownLight(col.rgb);
+ // Collect normal lights
+ col.rgb += gl_LightSource[2].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[2].position, gl_LightSource[2].spotDirection.xyz, gl_LightSource[2].linearAttenuation, gl_LightSource[2].quadraticAttenuation, gl_LightSource[2].specular.a);
+ col.rgb += gl_LightSource[3].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[3].position, gl_LightSource[3].spotDirection.xyz, gl_LightSource[3].linearAttenuation, gl_LightSource[3].quadraticAttenuation ,gl_LightSource[3].specular.a);
+ col.rgb += gl_LightSource[4].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[4].position, gl_LightSource[4].spotDirection.xyz, gl_LightSource[4].linearAttenuation, gl_LightSource[4].quadraticAttenuation, gl_LightSource[4].specular.a);
+ col.rgb += gl_LightSource[5].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[5].position, gl_LightSource[5].spotDirection.xyz, gl_LightSource[5].linearAttenuation, gl_LightSource[5].quadraticAttenuation, gl_LightSource[5].specular.a);
+ col.rgb += gl_LightSource[6].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[6].position, gl_LightSource[6].spotDirection.xyz, gl_LightSource[6].linearAttenuation, gl_LightSource[6].quadraticAttenuation, gl_LightSource[6].specular.a);
+ col.rgb += gl_LightSource[7].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[7].position, gl_LightSource[7].spotDirection.xyz, gl_LightSource[7].linearAttenuation, gl_LightSource[7].quadraticAttenuation, gl_LightSource[7].specular.a);
+ vary_pointlight_col = col.rgb*gl_Color.rgb;
+
+ col.rgb = vec3(0,0,0);
+
// Add windlight lights
- col.rgb += atmosAmbient(vec3(0.));
+ col.rgb = atmosAmbient(vec3(0.));
vary_light = gl_LightSource[0].position.xyz;
vary_ambient = col.rgb*gl_Color.rgb;
vary_directional.rgb = gl_Color.rgb*atmosAffectDirectionalLight(max(calcDirectionalLight(norm, gl_LightSource[0].position.xyz), (1.0-gl_Color.a)*(1.0-gl_Color.a)));
- col.rgb = min(col.rgb*gl_Color.rgb, 1.0);
+ col.rgb = col.rgb*gl_Color.rgb;
gl_FrontColor = col;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/attachmentShadowF.glsl b/indra/newview/app_settings/shaders/class1/deferred/attachmentShadowF.glsl
new file mode 100644
index 0000000000..164322c3a7
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/attachmentShadowF.glsl
@@ -0,0 +1,18 @@
+/**
+ * @file avatarShadowF.glsl
+ *
+ * Copyright (c) 2007-$CurrentYear$, Linden Research, Inc.
+ * $License$
+ */
+
+#version 120
+
+uniform sampler2D diffuseMap;
+
+
+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);
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/deferred/attachmentShadowV.glsl b/indra/newview/app_settings/shaders/class1/deferred/attachmentShadowV.glsl
new file mode 100644
index 0000000000..5ae41cb730
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/attachmentShadowV.glsl
@@ -0,0 +1,27 @@
+/**
+ * @file attachmentShadowV.glsl
+ *
+ * Copyright (c) 2007-$CurrentYear$, Linden Research, Inc.
+ * $License$
+ */
+
+#version 120
+
+mat4 getObjectSkinnedTransform();
+
+void main()
+{
+ //transform vertex
+ gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
+
+ mat4 mat = getObjectSkinnedTransform();
+
+ mat = gl_ModelViewMatrix * mat;
+ vec3 pos = (mat*gl_Vertex).xyz;
+
+ gl_FrontColor = gl_Color;
+
+ vec4 p = gl_ProjectionMatrix * vec4(pos, 1.0);
+ p.z = max(p.z, -p.w+0.01);
+ gl_Position = p;
+}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaF.glsl b/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaF.glsl
deleted file mode 100644
index 82ce6d7377..0000000000
--- a/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaF.glsl
+++ /dev/null
@@ -1,68 +0,0 @@
-/**
- * @file avatarAlphaF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * $/LicenseInfo$
- */
-
-uniform sampler2D diffuseMap;
-uniform sampler2DShadow shadowMap0;
-uniform sampler2DShadow shadowMap1;
-uniform sampler2DShadow shadowMap2;
-uniform sampler2DShadow shadowMap3;
-uniform sampler2D noiseMap;
-
-uniform mat4 shadow_matrix[6];
-uniform vec4 shadow_clip;
-
-vec3 atmosLighting(vec3 light);
-vec3 scaleSoftClip(vec3 light);
-
-varying vec3 vary_ambient;
-varying vec3 vary_directional;
-varying vec4 vary_position;
-varying vec3 vary_normal;
-
-void main()
-{
- float shadow = 1.0;
- vec4 pos = vary_position;
- vec3 norm = normalize(vary_normal);
-
- vec3 nz = texture2D(noiseMap, gl_FragCoord.xy/128.0).xyz;
-
- if (pos.z > -shadow_clip.w)
- {
-
- if (pos.z < -shadow_clip.z)
- {
- vec4 lpos = shadow_matrix[3]*pos;
- shadow = shadow2DProj(shadowMap3, lpos).x;
- }
- else if (pos.z < -shadow_clip.y)
- {
- vec4 lpos = shadow_matrix[2]*pos;
- shadow = shadow2DProj(shadowMap2, lpos).x;
- }
- else if (pos.z < -shadow_clip.x)
- {
- vec4 lpos = shadow_matrix[1]*pos;
- shadow = shadow2DProj(shadowMap1, lpos).x;
- }
- else
- {
- vec4 lpos = shadow_matrix[0]*pos;
- shadow = shadow2DProj(shadowMap0, lpos).x;
- }
- }
-
-
- vec4 col = vec4(vary_ambient + vary_directional*shadow, gl_Color.a);
- vec4 color = texture2D(diffuseMap, gl_TexCoord[0].xy) * col;
-
- color.rgb = atmosLighting(color.rgb);
-
- color.rgb = scaleSoftClip(color.rgb);
-
- gl_FragColor = color;
-}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaV.glsl b/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaV.glsl
index 21ddc2fad8..a012cb5030 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaV.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/LicenseInfo$
*/
+
+#version 120
vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
mat4 getSkinnedTransform();
@@ -17,10 +19,43 @@ vec3 atmosAffectDirectionalLight(float lightIntensity);
vec3 scaleDownLight(vec3 light);
vec3 scaleUpLight(vec3 light);
-varying vec4 vary_position;
+varying vec3 vary_position;
varying vec3 vary_ambient;
varying vec3 vary_directional;
-varying vec3 vary_normal;
+varying vec3 vary_fragcoord;
+varying vec3 vary_pointlight_col;
+
+uniform float near_clip;
+
+float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight)
+{
+ //get light vector
+ vec3 lv = lp.xyz-v;
+
+ //get distance
+ float d = length(lv);
+
+ float 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);
+ 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
+
+ //angular attenuation
+ da *= calcDirectionalLight(n, lv);
+ }
+
+ return da;
+}
void main()
{
@@ -40,9 +75,10 @@ void main()
norm.z = dot(trans[2].xyz, gl_Normal);
norm = normalize(norm);
- gl_Position = gl_ProjectionMatrix * pos;
- vary_position = pos;
- vary_normal = norm;
+ vec4 frag_pos = gl_ProjectionMatrix * pos;
+ gl_Position = frag_pos;
+
+ vary_position = pos.xyz;
calcAtmospherics(pos.xyz);
@@ -50,18 +86,20 @@ void main()
vec4 col = vec4(0.0, 0.0, 0.0, gl_Color.a);
- // Collect normal lights (need to be divided by two, as we later multiply by 2)
- col.rgb += gl_LightSource[2].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[2].position, gl_LightSource[2].spotDirection.xyz, gl_LightSource[2].linearAttenuation, gl_LightSource[2].specular.a);
- col.rgb += gl_LightSource[3].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[3].position, gl_LightSource[3].spotDirection.xyz, gl_LightSource[3].linearAttenuation, gl_LightSource[3].specular.a);
- col.rgb += gl_LightSource[4].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[4].position, gl_LightSource[4].spotDirection.xyz, gl_LightSource[4].linearAttenuation, gl_LightSource[4].specular.a);
- col.rgb += gl_LightSource[5].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[5].position, gl_LightSource[5].spotDirection.xyz, gl_LightSource[5].linearAttenuation, gl_LightSource[5].specular.a);
- col.rgb += gl_LightSource[6].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[6].position, gl_LightSource[6].spotDirection.xyz, gl_LightSource[6].linearAttenuation, gl_LightSource[6].specular.a);
- col.rgb += gl_LightSource[7].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[7].position, gl_LightSource[7].spotDirection.xyz, gl_LightSource[7].linearAttenuation, gl_LightSource[7].specular.a);
- col.rgb += gl_LightSource[1].diffuse.rgb*calcDirectionalLight(norm, gl_LightSource[1].position.xyz);
- col.rgb = scaleDownLight(col.rgb);
+ // Collect normal lights
+ col.rgb += gl_LightSource[2].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[2].position, gl_LightSource[2].spotDirection.xyz, gl_LightSource[2].linearAttenuation, gl_LightSource[2].quadraticAttenuation, gl_LightSource[2].specular.a);
+ col.rgb += gl_LightSource[3].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[3].position, gl_LightSource[3].spotDirection.xyz, gl_LightSource[3].linearAttenuation, gl_LightSource[3].quadraticAttenuation ,gl_LightSource[3].specular.a);
+ col.rgb += gl_LightSource[4].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[4].position, gl_LightSource[4].spotDirection.xyz, gl_LightSource[4].linearAttenuation, gl_LightSource[4].quadraticAttenuation, gl_LightSource[4].specular.a);
+ col.rgb += gl_LightSource[5].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[5].position, gl_LightSource[5].spotDirection.xyz, gl_LightSource[5].linearAttenuation, gl_LightSource[5].quadraticAttenuation, gl_LightSource[5].specular.a);
+ col.rgb += gl_LightSource[6].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[6].position, gl_LightSource[6].spotDirection.xyz, gl_LightSource[6].linearAttenuation, gl_LightSource[6].quadraticAttenuation, gl_LightSource[6].specular.a);
+ col.rgb += gl_LightSource[7].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[7].position, gl_LightSource[7].spotDirection.xyz, gl_LightSource[7].linearAttenuation, gl_LightSource[7].quadraticAttenuation, gl_LightSource[7].specular.a);
+ vary_pointlight_col = col.rgb*gl_Color.rgb;
+
+ col.rgb = vec3(0,0,0);
+
// Add windlight lights
- col.rgb += atmosAmbient(vec3(0.));
+ col.rgb = atmosAmbient(vec3(0.));
vary_ambient = col.rgb*gl_Color.rgb;
vary_directional = gl_Color.rgb*atmosAffectDirectionalLight(max(calcDirectionalLight(norm, gl_LightSource[0].position.xyz), (1.0-gl_Color.a)*(1.0-gl_Color.a)));
@@ -71,7 +109,8 @@ void main()
gl_FrontColor = col;
gl_FogFragCoord = pos.z;
-
+
+ vary_fragcoord.xyz = frag_pos.xyz + vec3(0,0,near_clip);
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/avatarF.glsl b/indra/newview/app_settings/shaders/class1/deferred/avatarF.glsl
index e376892e0a..9748727147 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/avatarF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/avatarF.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 d88e3ecfd8..1b7ae06888 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/avatarShadowF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/avatarShadowF.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/LicenseInfo$
*/
+
+#version 120
uniform sampler2D diffuseMap;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/avatarShadowV.glsl b/indra/newview/app_settings/shaders/class1/deferred/avatarShadowV.glsl
index 2af8c8f5f7..cf6579a40d 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/avatarShadowV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/avatarShadowV.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/LicenseInfo$
*/
+
+#version 120
mat4 getSkinnedTransform();
diff --git a/indra/newview/app_settings/shaders/class1/deferred/avatarV.glsl b/indra/newview/app_settings/shaders/class1/deferred/avatarV.glsl
index 988226fb7c..69c93799b5 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/avatarV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/avatarV.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 258a9b7c40..d9f021b114 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/blurLightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/blurLightF.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/LicenseInfo$
*/
+
+#version 120
#extension GL_ARB_texture_rectangle : enable
@@ -37,44 +39,49 @@ vec4 getPosition(vec2 pos_screen)
void main()
{
- vec3 norm = texture2DRect(normalMap, vary_fragcoord.xy).xyz;
+ 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(vary_fragcoord.xy).xyz;
- vec4 ccol = texture2DRect(lightMap, vary_fragcoord.xy).rgba;
+ vec3 pos = getPosition(tc).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 tc = vary_fragcoord.xy + kern[i].z*dlt;
- vec3 samppos = getPosition(tc).xyz;
+ vec2 samptc = tc + kern[i].z*dlt;
+ vec3 samppos = getPosition(samptc).xyz;
float d = dot(norm.xyz, samppos.xyz-pos.xyz);// dist from plane
- if (d*d <= 0.003)
+ if (d*d <= pointplanedist_tolerance_pow2)
{
- col += texture2DRect(lightMap, tc)*kern[i].xyxx;
+ col += texture2DRect(lightMap, samptc)*kern[i].xyxx;
defined_weight += kern[i].xy;
}
}
for (int i = 1; i < 4; i++)
{
- vec2 tc = vary_fragcoord.xy - kern[i].z*dlt;
- vec3 samppos = getPosition(tc).xyz;
+ vec2 samptc = tc - kern[i].z*dlt;
+ vec3 samppos = getPosition(samptc).xyz;
float d = dot(norm.xyz, samppos.xyz-pos.xyz);// dist from plane
- if (d*d <= 0.003)
+ if (d*d <= pointplanedist_tolerance_pow2)
{
- col += texture2DRect(lightMap, tc)*kern[i].xyxx;
+ 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 b1b3f55f00..c2d05c601a 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/blurLightV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/blurLightV.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 35f334d58e..37bfaac32c 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/bumpF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/bumpF.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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
new file mode 100644
index 0000000000..d884f2e4a5
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/bumpSkinnedV.glsl
@@ -0,0 +1,37 @@
+/**
+ * @file bumpV.glsl
+ *
+ * Copyright (c) 2007-$CurrentYear$, Linden Research, Inc.
+ * $License$
+ */
+
+#version 120
+
+varying vec3 vary_mat0;
+varying vec3 vary_mat1;
+varying vec3 vary_mat2;
+
+mat4 getObjectSkinnedTransform();
+
+void main()
+{
+ gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
+
+ mat4 mat = getObjectSkinnedTransform();
+
+ mat = gl_ModelViewMatrix * mat;
+
+ vec3 pos = (mat*gl_Vertex).xyz;
+
+
+ vec3 n = normalize((mat * vec4(gl_Normal.xyz+gl_Vertex.xyz, 1.0)).xyz-pos.xyz);
+ vec3 b = normalize((mat * vec4(gl_MultiTexCoord2.xyz+gl_Vertex.xyz, 1.0)).xyz-pos.xyz);
+ vec3 t = cross(b, n);
+
+ vary_mat0 = vec3(t.x, b.x, n.x);
+ vary_mat1 = vec3(t.y, b.y, n.y);
+ vary_mat2 = vec3(t.z, b.z, n.z);
+
+ gl_Position = gl_ProjectionMatrix*vec4(pos, 1.0);
+ gl_FrontColor = gl_Color;
+}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/bumpV.glsl b/indra/newview/app_settings/shaders/class1/deferred/bumpV.glsl
index 6c8550cb5b..9b109b2db6 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/bumpV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/bumpV.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/LicenseInfo$
*/
+
+#version 120
varying vec3 vary_mat0;
varying vec3 vary_mat1;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/diffuseF.glsl b/indra/newview/app_settings/shaders/class1/deferred/diffuseF.glsl
index 9bd622a506..35cfb80c93 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/diffuseF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/diffuseF.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/LicenseInfo$
*/
+
+#version 120
uniform sampler2D diffuseMap;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/diffuseSkinnedV.glsl b/indra/newview/app_settings/shaders/class1/deferred/diffuseSkinnedV.glsl
new file mode 100644
index 0000000000..9a45c03237
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/diffuseSkinnedV.glsl
@@ -0,0 +1,33 @@
+/**
+ * @file diffuseSkinnedV.glsl
+ *
+ * Copyright (c) 2007-$CurrentYear$, Linden Research, Inc.
+ * $License$
+ */
+
+#version 120
+
+varying vec3 vary_normal;
+
+mat4 getObjectSkinnedTransform();
+
+void main()
+{
+ gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
+
+ mat4 mat = getObjectSkinnedTransform();
+
+ mat = gl_ModelViewMatrix * mat;
+ vec3 pos = (mat*gl_Vertex).xyz;
+
+ vec4 norm = gl_Vertex;
+ norm.xyz += gl_Normal.xyz;
+ norm.xyz = (mat*norm).xyz;
+ norm.xyz = normalize(norm.xyz-pos.xyz);
+
+ vary_normal = norm.xyz;
+
+ gl_FrontColor = gl_Color;
+
+ gl_Position = gl_ProjectionMatrix*vec4(pos, 1.0);
+}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/diffuseV.glsl b/indra/newview/app_settings/shaders/class1/deferred/diffuseV.glsl
index bd58096317..03d3322cb6 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/diffuseV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/diffuseV.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/LicenseInfo$
*/
+
+#version 120
varying vec3 vary_normal;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl
index f53e15c6cc..3429877397 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/LicenseInfo$
*/
+
+#version 120
#extension GL_ARB_texture_rectangle : enable
diff --git a/indra/newview/app_settings/shaders/class1/deferred/fullbrightV.glsl b/indra/newview/app_settings/shaders/class1/deferred/fullbrightV.glsl
index dc8b2c6be4..6c38d220e2 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/fullbrightV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/fullbrightV.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/LicenseInfo$
*/
+
+#version 120
void calcAtmospherics(vec3 inPositionEye);
diff --git a/indra/newview/app_settings/shaders/class1/deferred/giF.glsl b/indra/newview/app_settings/shaders/class1/deferred/giF.glsl
index e64e29a0d2..75b555e8ae 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/giF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/giF.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 543527612e..8dc1410ea5 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/giV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/giV.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 7f365fedc8..e3c15a2ab2 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/impostorF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/impostorF.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/LicenseInfo$
*/
+
+#version 120
uniform sampler2D diffuseMap;
uniform sampler2D normalMap;
@@ -12,7 +14,7 @@ uniform sampler2D specularMap;
void main()
{
vec4 col = texture2D(diffuseMap, gl_TexCoord[0].xy);
- gl_FragData[0] = vec4(col.rgb, col.a <= 0.5 ? 0.0 : 0.005);
+ gl_FragData[0] = vec4(col.rgb, col.a * 0.005);
gl_FragData[1] = texture2D(specularMap, gl_TexCoord[0].xy);
gl_FragData[2] = vec4(texture2D(normalMap, gl_TexCoord[0].xy).xyz, 0.0);
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/impostorV.glsl b/indra/newview/app_settings/shaders/class1/deferred/impostorV.glsl
index 4fc27d4412..37148b3f1a 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/impostorV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/impostorV.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 acb3014d18..78df54d5dc 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/luminanceF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/luminanceF.glsl
@@ -5,6 +5,8 @@
* $/LicenseInfo$
*/
+#version 120
+
uniform sampler2DRect diffuseMap;
varying vec2 vary_fragcoord;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/luminanceV.glsl b/indra/newview/app_settings/shaders/class1/deferred/luminanceV.glsl
index 6368def830..0c820bfc6c 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/luminanceV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/luminanceV.glsl
@@ -5,6 +5,9 @@
* $/LicenseInfo$
*/
+#version 120
+
+
varying vec2 vary_fragcoord;
uniform vec2 screen_res;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl
index 6fca08ae6a..609fc4f14f 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl
@@ -5,6 +5,8 @@
* $/LicenseInfo$
*/
+#version 120
+
#extension GL_ARB_texture_rectangle : enable
uniform sampler2DRect depthMap;
@@ -21,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;
@@ -61,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/class2/deferred/blurLightV.glsl b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightV.glsl
index b1b3f55f00..2e3e84dd15 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/blurLightV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightV.glsl
@@ -1,17 +1,20 @@
/**
- * @file blurLightF.glsl
+ * @file multiPointLightV.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/LicenseInfo$
*/
-varying vec2 vary_fragcoord;
-uniform vec2 screen_res;
+#version 120
+
+varying vec4 vary_fragcoord;
void main()
{
//transform vertex
- gl_Position = ftransform();
vec4 pos = gl_ModelViewProjectionMatrix * gl_Vertex;
- vary_fragcoord = (pos.xy*0.5+0.5)*screen_res;
+ vary_fragcoord = pos;
+
+ gl_Position = pos;
+ gl_FrontColor = gl_Color;
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl
index 43da16436b..22ed9dcd40 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/LicenseInfo$
*/
+
+ #version 120
#extension GL_ARB_texture_rectangle : enable
diff --git a/indra/newview/app_settings/shaders/class1/deferred/pointLightV.glsl b/indra/newview/app_settings/shaders/class1/deferred/pointLightV.glsl
index e056c3e896..8e74feb615 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/pointLightV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/pointLightV.glsl
@@ -5,6 +5,8 @@
* $/LicenseInfo$
*/
+#version 120
+
varying vec4 vary_light;
varying vec4 vary_fragcoord;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl b/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl
index 650e1a91a8..77f1b2224c 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl
@@ -4,54 +4,134 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/LicenseInfo$
*/
+
+#version 120
#extension GL_ARB_texture_rectangle : enable
uniform sampler2DRect diffuseRect;
-uniform sampler2DRect localLightMap;
-uniform sampler2DRect sunLightMap;
-uniform sampler2DRect giLightMap;
-uniform sampler2D luminanceMap;
-uniform sampler2DRect lightMap;
+uniform sampler2DRect edgeMap;
+uniform sampler2DRect depthMap;
+uniform sampler2DRect normalMap;
+uniform sampler2D bloomMap;
-uniform vec3 lum_quad;
-uniform float lum_lod;
-uniform vec4 ambient;
-
-uniform vec3 gi_quad;
+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;
-void main()
+float getDepth(vec2 pos_screen)
{
- vec2 tc = vary_fragcoord.xy;
- vec3 lum = texture2DLod(luminanceMap, tc/screen_res, lum_lod).rgb;
- float luminance = lum.r;
- luminance = luminance*lum_quad.y+lum_quad.z;
+ float z = texture2DRect(depthMap, pos_screen.xy).a;
+ z = z*2.0-1.0;
+ vec4 ndc = vec4(0.0, 0.0, z, 1.0);
+ vec4 p = inv_proj*ndc;
+ return p.z/p.w;
+}
- vec4 diff = texture2DRect(diffuseRect, vary_fragcoord.xy);
+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;
+}
- float ambocc = texture2DRect(lightMap, vary_fragcoord.xy).g;
-
- vec3 gi_col = texture2DRect(giLightMap, vary_fragcoord.xy).rgb;
- gi_col = gi_col*gi_col*gi_quad.x + gi_col*gi_quad.y+gi_quad.z*ambocc*ambient.rgb;
- gi_col *= diff;
+void dofSampleNear(inout vec4 diff, inout float w, float cur_sc, vec2 tc)
+{
+ float d = getDepth(tc);
- vec4 sun_col = texture2DRect(sunLightMap, vary_fragcoord.xy);
+ float sc = calc_cof(d);
- vec3 local_col = texture2DRect(localLightMap, vary_fragcoord.xy).rgb;
+ float wg = 0.25;
+ vec4 s = texture2DRect(diffuseRect, tc);
+ // de-weight dull areas to make highlights 'pop'
+ wg += s.r+s.g+s.b;
+
+ diff += wg*s;
+
+ w += wg;
+}
+
+void dofSample(inout vec4 diff, inout float w, float min_sc, float cur_depth, vec2 tc)
+{
+ float d = getDepth(tc);
+
+ float sc = calc_cof(d);
+
+ if (sc > min_sc //sampled pixel is more "out of focus" than current sample radius
+ || d < cur_depth) //sampled pixel is further away than current pixel
+ {
+ float wg = 0.25;
- sun_col *= 1.0/min(luminance, 1.0);
- gi_col *= 1.0/luminance;
+ vec4 s = texture2DRect(diffuseRect, tc);
+ // de-weight dull areas to make highlights 'pop'
+ wg += s.r+s.g+s.b;
+
+ diff += wg*s;
+
+ w += wg;
+ }
+}
+
+
+void main()
+{
+ vec3 norm = texture2DRect(normalMap, vary_fragcoord.xy).xyz;
+ norm = vec3((norm.xy-0.5)*2.0,norm.z); // unpack norm
- vec3 col = sun_col.rgb+gi_col+local_col;
+ vec2 tc = vary_fragcoord.xy;
- gl_FragColor.rgb = col.rgb;
- col.rgb = max(col.rgb-vec3(1.0,1.0,1.0), vec3(0.0, 0.0, 0.0));
+ float depth = getDepth(tc);
- gl_FragColor.a = 0.0; // max(dot(col.rgb,col.rgb)*lum_quad.x, sun_col.a);
+ vec4 diff = texture2DRect(diffuseRect, vary_fragcoord.xy);
- //gl_FragColor.rgb = vec3(lum_lod);
+ {
+ float w = 1.0;
+
+ float sc = calc_cof(depth);
+ sc = min(abs(sc), 10.0);
+
+ float fd = depth*0.5f;
+
+ float PI = 3.14159265358979323846264;
+
+ // sample quite uniformly spaced points within a circle, for a circular 'bokeh'
+ //if (depth < focal_distance)
+ {
+ while (sc > 0.5)
+ {
+ int its = int(max(1.0,(sc*3.7)));
+ for (int i=0; i<its; ++i)
+ {
+ float ang = sc+i*2*PI/its; // sc is added for rotary perturbance
+ float samp_x = sc*sin(ang);
+ float samp_y = sc*cos(ang);
+ // you could test sample coords against an interesting non-circular aperture shape here, if desired.
+ dofSample(diff, w, sc, depth, vary_fragcoord.xy + vec2(samp_x,samp_y));
+ }
+ sc -= 1.0;
+ }
+ }
+
+ diff /= w;
+ }
+
+ vec4 bloom = texture2D(bloomMap, vary_fragcoord.xy/screen_res);
+ gl_FragColor = diff + bloom;
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/postDeferredNoDoFF.glsl b/indra/newview/app_settings/shaders/class1/deferred/postDeferredNoDoFF.glsl
new file mode 100644
index 0000000000..ab48d08bbb
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/postDeferredNoDoFF.glsl
@@ -0,0 +1,24 @@
+/**
+ * @file postDeferredF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/LicenseInfo$
+ */
+
+#version 120
+
+#extension GL_ARB_texture_rectangle : enable
+
+uniform sampler2DRect diffuseRect;
+uniform sampler2D bloomMap;
+
+uniform vec2 screen_res;
+varying vec2 vary_fragcoord;
+
+void main()
+{
+ vec4 diff = texture2DRect(diffuseRect, 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 0ec81dcb02..12983baa94 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/postDeferredV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/postDeferredV.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 e8e58f50e1..63b3c9f205 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/postgiF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/postgiF.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 e5f6217644..ae57227fe5 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/postgiV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/postgiV.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 378a3295ec..6674c4a5aa 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/shadowF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/shadowF.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 666f909f01..db3bddc6be 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/shadowV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/shadowV.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/LicenseInfo$
*/
+
+#version 120
varying vec4 post_pos;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl
index 5fbeceba81..29340c7e9f 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/LicenseInfo$
*/
+
+#version 120
#extension GL_ARB_texture_rectangle : enable
@@ -268,14 +270,10 @@ void main()
vec4 diffuse = texture2DRect(diffuseRect, tc);
vec4 spec = texture2DRect(specularRect, vary_fragcoord.xy);
- vec2 scol_ambocc = texture2DRect(lightMap, vary_fragcoord.xy).rg;
- float scol = max(scol_ambocc.r, diffuse.a);
- float ambocc = scol_ambocc.g;
-
- calcAtmospherics(pos.xyz, ambocc);
+ calcAtmospherics(pos.xyz, 1.0);
vec3 col = atmosAmbient(vec3(0));
- col += atmosAffectDirectionalLight(max(min(da, scol), diffuse.a));
+ col += atmosAffectDirectionalLight(max(min(da, 1.0), diffuse.a));
col *= diffuse.rgb;
@@ -285,7 +283,7 @@ void main()
//
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;
+ vec3 dumbshiny = vary_SunlitColor*texture2D(lightFunc, vec2(sa, spec.a)).a;
/*
// screen-space cheap fakey reflection map
diff --git a/indra/newview/app_settings/shaders/class1/deferred/softenLightV.glsl b/indra/newview/app_settings/shaders/class1/deferred/softenLightV.glsl
index 9d187b46e2..8f0bcca76b 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/softenLightV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/softenLightV.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/LicenseInfo$
*/
+
+#version 120
uniform vec2 screen_res;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/sunLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/sunLightF.glsl
index d4d686bbb7..00093836a2 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/sunLightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/sunLightF.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/LicenseInfo$
*/
+
+#version 120
//class 1, no shadow, no SSAO, should never be called
diff --git a/indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOF.glsl b/indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOF.glsl
index cdbed4b791..cd91351ad4 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOF.glsl
@@ -4,6 +4,8 @@
* Copyright (c) 2007-$CurrentYear$, Linden Research, Inc.
* $License$
*/
+
+#version 120
#extension GL_ARB_texture_rectangle : enable
@@ -13,8 +15,6 @@ uniform sampler2DRect depthMap;
uniform sampler2DRect normalMap;
uniform sampler2D noiseMap;
-uniform sampler2D lightFunc;
-
// Inputs
uniform mat4 shadow_matrix[6];
@@ -51,57 +51,49 @@ float calcAmbientOcclusion(vec4 pos, vec3 norm)
{
float ret = 1.0;
- float dist = dot(pos.xyz,pos.xyz);
-
- if (dist < 64.0*64.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 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;
+ 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 angle_hidden = 0.0;
+ int points = 0;
- float scale = min(ssao_radius / -pos_world.z, ssao_max_radius);
+ float scale = min(ssao_radius / -pos_world.z, ssao_max_radius);
- // it was found that keeping # of samples a constant was the fastest, probably due to compiler optimizations (unrolling?)
- for (int i = 0; i < 8; i++)
- {
- vec2 samppos_screen = pos_screen + scale * reflect(kern[i], noise_reflect);
- vec3 samppos_world = getPosition(samppos_screen).xyz;
+ // it was found that keeping # of samples a constant was the fastest, probably due to compiler optimizations unrolling?)
+ for (int i = 0; i < 8; i++)
+ {
+ vec2 samppos_screen = pos_screen + scale * reflect(kern[i], noise_reflect);
+ vec3 samppos_world = getPosition(samppos_screen).xyz;
- vec3 diff = pos_world - samppos_world;
- float dist2 = dot(diff, diff);
+ 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)
+ // assume each sample corresponds to an occluding sphere with constant radius, constant x-sectional area
+ // --> solid angle shrinking by the square of distance
+ //radius is somewhat arbitrary, can approx with just some constant k * 1 / dist^2
+ //(k should vary inversely with # of samples, but this is taken care of later)
- //if (dot((samppos_world - 0.05*norm - pos_world), norm) > 0.0) // -0.05*norm to shift sample point back slightly for flat surfaces
- // angle_hidden += min(1.0/dist2, ssao_factor_inv); // dist != 0 follows from conditional. max of 1.0 (= ssao_factor_inv * ssao_factor)
- angle_hidden = angle_hidden + float(dot((samppos_world - 0.05*norm - pos_world), norm) > 0.0) * min(1.0/dist2, ssao_factor_inv);
+ angle_hidden = angle_hidden + float(dot((samppos_world - 0.05*norm - pos_world), norm) > 0.0) * min(1.0/dist2, ssao_factor_inv);
- // 'blocked' samples (significantly closer to camera relative to pos_world) are "no data", not "no occlusion"
- points = points + int(diff.z > -1.0);
- }
+ // 'blocked' samples (significantly closer to camera relative to pos_world) are "no data", not "no occlusion"
+ points = points + int(diff.z > -1.0);
+ }
- angle_hidden = min(ssao_factor*angle_hidden/float(points), 1.0);
+ angle_hidden = min(ssao_factor*angle_hidden/float(points), 1.0);
- ret = (1.0 - (float(points != 0) * angle_hidden));
- ret += max((dist-32.0*32.0)/(32.0*32.0), 0.0);
- }
+ ret = (1.0 - (float(points != 0) * angle_hidden));
return min(ret, 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 9d092d9cea..9beb513ad8 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/sunLightV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/sunLightV.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 9ba508a30c..0edae47918 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/terrainF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/terrainF.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 789e53b789..a6163063be 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/terrainV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/terrainV.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 1c1725a95c..c54d9a1e3e 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/treeF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/treeF.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 45832e350f..29689ecbaf 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/treeV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/treeV.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 ea531de24a..e76f598d09 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/waterF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/waterF.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 e002d75ebe..649e392630 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/waterV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/waterV.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 2d40a19fa6..f2023fa5ea 100644
--- a/indra/newview/app_settings/shaders/class1/effects/glowExtractF.glsl
+++ b/indra/newview/app_settings/shaders/class1/effects/glowExtractF.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/LicenseInfo$
*/
+
+#version 120
#extension GL_ARB_texture_rectangle : enable
diff --git a/indra/newview/app_settings/shaders/class1/effects/glowExtractV.glsl b/indra/newview/app_settings/shaders/class1/effects/glowExtractV.glsl
index fe45898ed2..0ca0608b45 100644
--- a/indra/newview/app_settings/shaders/class1/effects/glowExtractV.glsl
+++ b/indra/newview/app_settings/shaders/class1/effects/glowExtractV.glsl
@@ -5,6 +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 5b4e8b3ecc..65fc2e9f99 100644
--- a/indra/newview/app_settings/shaders/class1/effects/glowF.glsl
+++ b/indra/newview/app_settings/shaders/class1/effects/glowF.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 97696e4719..0bd44cec90 100644
--- a/indra/newview/app_settings/shaders/class1/effects/glowV.glsl
+++ b/indra/newview/app_settings/shaders/class1/effects/glowV.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 3a852239fb..ac00f15b35 100644
--- a/indra/newview/app_settings/shaders/class1/environment/terrainF.glsl
+++ b/indra/newview/app_settings/shaders/class1/environment/terrainF.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 0d781fd849..1e19ee7699 100644
--- a/indra/newview/app_settings/shaders/class1/environment/terrainV.glsl
+++ b/indra/newview/app_settings/shaders/class1/environment/terrainV.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 99c340d91a..34f78565a5 100644
--- a/indra/newview/app_settings/shaders/class1/environment/terrainWaterF.glsl
+++ b/indra/newview/app_settings/shaders/class1/environment/terrainWaterF.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 66458ec66d..0dfac84a6e 100644
--- a/indra/newview/app_settings/shaders/class1/environment/underWaterF.glsl
+++ b/indra/newview/app_settings/shaders/class1/environment/underWaterF.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 5f1fbee1df..4e9c09b1ea 100644
--- a/indra/newview/app_settings/shaders/class1/environment/waterF.glsl
+++ b/indra/newview/app_settings/shaders/class1/environment/waterF.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 e5eb25f3fa..a34cf23790 100644
--- a/indra/newview/app_settings/shaders/class1/environment/waterFogF.glsl
+++ b/indra/newview/app_settings/shaders/class1/environment/waterFogF.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 608a7a5807..161c794c68 100644
--- a/indra/newview/app_settings/shaders/class1/environment/waterV.glsl
+++ b/indra/newview/app_settings/shaders/class1/environment/waterV.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 5ac9e96601..6f821f893d 100644
--- a/indra/newview/app_settings/shaders/class1/interface/highlightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/interface/highlightF.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 c5f69c4ad4..d1c98bf70c 100644
--- a/indra/newview/app_settings/shaders/class1/interface/highlightV.glsl
+++ b/indra/newview/app_settings/shaders/class1/interface/highlightV.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 ad128dae8d..9c59e8c3ad 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/lightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightF.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 1742b9fc1c..1fee99c446 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightF.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 68b6603b4a..fb5da21c72 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyF.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyF.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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
new file mode 100644
index 0000000000..1bdaccf9b8
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyWaterF.glsl
@@ -0,0 +1,17 @@
+/**
+ * @file lightFullbrightShinyWaterF.glsl
+ *
+ * Copyright (c) 2007-$CurrentYear$, Linden Research, Inc.
+ * $License$
+ */
+
+
+#version 120
+
+uniform sampler2D diffuseMap;
+uniform samplerCube environmentMap;
+
+void fullbright_shiny_lighting_water()
+{
+ gl_FragColor = texture2D(diffuseMap, gl_TexCoord[0].xy);
+}
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightWaterF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightWaterF.glsl
index 693ed289f2..2e94d3bbf1 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightWaterF.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightWaterF.glsl
@@ -5,6 +5,8 @@
* $/LicenseInfo$
*/
+
+#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 b888e70325..714f9a2551 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/lightFuncSpecularV.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightFuncSpecularV.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 4b6d95e177..65b45f8081 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/lightFuncV.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightFuncV.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 b127b1f8ea..7f65ea76f7 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/lightShinyF.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightShinyF.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 05ad3256af..8f13e6dc04 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/lightShinyWaterF.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightShinyWaterF.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 b1a7cb46ff..56f31f6a79 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/lightSpecularV.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightSpecularV.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 f6afa6a3ae..64d549ff52 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/lightV.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightV.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 e5e6ddc2d8..c5d084c132 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/lightWaterF.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightWaterF.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 a0649aea88..732d246471 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/sumLightsSpecularV.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/sumLightsSpecularV.glsl
@@ -4,6 +4,9 @@
* $LicenseInfo:firstyear=2005&license=viewerlgpl$
* $/LicenseInfo$
*/
+
+#version 120
+
float calcDirectionalLightSpecular(inout vec4 specular, vec3 view, vec3 n, vec3 l, vec3 lightCol, float da);
vec3 atmosAmbient(vec3 light);
vec3 atmosAffectDirectionalLight(float lightIntensity);
diff --git a/indra/newview/app_settings/shaders/class1/lighting/sumLightsV.glsl b/indra/newview/app_settings/shaders/class1/lighting/sumLightsV.glsl
index c7d40d853f..73e1a1ec26 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/sumLightsV.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/sumLightsV.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2005&license=viewerlgpl$
* $/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 9da4c2c92b..afc3dc89bf 100644
--- a/indra/newview/app_settings/shaders/class1/objects/fullbrightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/fullbrightF.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 1c8a9a1a30..3dc4294f67 100644
--- a/indra/newview/app_settings/shaders/class1/objects/fullbrightShinyF.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/fullbrightShinyF.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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
new file mode 100644
index 0000000000..f0baeeeee5
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/objects/fullbrightShinySkinnedV.glsl
@@ -0,0 +1,39 @@
+/**
+ * @file shinySimpleSkinnedV.glsl
+ *
+ * Copyright (c) 2007-$CurrentYear$, Linden Research, Inc.
+ * $License$
+ */
+
+#version 120
+
+void calcAtmospherics(vec3 inPositionEye);
+mat4 getObjectSkinnedTransform();
+
+attribute vec4 object_weight;
+
+void main()
+{
+ mat4 mat = getObjectSkinnedTransform();
+
+ mat = gl_ModelViewMatrix * mat;
+ vec3 pos = (mat*gl_Vertex).xyz;
+
+ vec4 norm = gl_Vertex;
+ norm.xyz += gl_Normal.xyz;
+ norm.xyz = (mat*norm).xyz;
+ norm.xyz = normalize(norm.xyz-pos.xyz);
+
+ vec3 ref = reflect(pos.xyz, -norm.xyz);
+
+ gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
+ gl_TexCoord[1] = gl_TextureMatrix[1]*vec4(ref,1.0);
+
+ calcAtmospherics(pos.xyz);
+
+ gl_FrontColor = gl_Color;
+
+ gl_Position = gl_ProjectionMatrix*vec4(pos, 1.0);
+
+ gl_FogFragCoord = pos.z;
+}
diff --git a/indra/newview/app_settings/shaders/class1/objects/fullbrightShinyV.glsl b/indra/newview/app_settings/shaders/class1/objects/fullbrightShinyV.glsl
index 032def63b3..02367b9439 100644
--- a/indra/newview/app_settings/shaders/class1/objects/fullbrightShinyV.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/fullbrightShinyV.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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
new file mode 100644
index 0000000000..5daf66fb31
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/objects/fullbrightShinyWaterF.glsl
@@ -0,0 +1,15 @@
+/**
+ * @file fullbrightShinyWaterF.glsl
+ *
+ * Copyright (c) 2007-$CurrentYear$, Linden Research, Inc.
+ * $License$
+ */
+
+#version 120
+
+void fullbright_shiny_lighting_water();
+
+void main()
+{
+ 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
new file mode 100644
index 0000000000..02ff3cc2a9
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/objects/fullbrightSkinnedV.glsl
@@ -0,0 +1,37 @@
+/**
+ * @file fullbrightSkinnedV.glsl
+ *
+ * Copyright (c) 2007-$CurrentYear$, Linden Research, Inc.
+ * $License$
+ */
+
+#version 120
+
+void calcAtmospherics(vec3 inPositionEye);
+mat4 getObjectSkinnedTransform();
+
+attribute vec4 object_weight;
+
+void main()
+{
+ //transform vertex
+ gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
+
+ mat4 mat = getObjectSkinnedTransform();
+
+ mat = gl_ModelViewMatrix * mat;
+ vec3 pos = (mat*gl_Vertex).xyz;
+
+ vec4 norm = gl_Vertex;
+ norm.xyz += gl_Normal.xyz;
+ norm.xyz = (mat*norm).xyz;
+ norm.xyz = normalize(norm.xyz-pos.xyz);
+
+ calcAtmospherics(pos.xyz);
+
+ gl_FrontColor = gl_Color;
+
+ gl_Position = gl_ProjectionMatrix*vec4(pos, 1.0);
+
+ gl_FogFragCoord = pos.z;
+}
diff --git a/indra/newview/app_settings/shaders/class1/objects/fullbrightV.glsl b/indra/newview/app_settings/shaders/class1/objects/fullbrightV.glsl
index 914e417ca0..38e07dbd80 100644
--- a/indra/newview/app_settings/shaders/class1/objects/fullbrightV.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/fullbrightV.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 df76e9e1eb..afaac4f69c 100644
--- a/indra/newview/app_settings/shaders/class1/objects/fullbrightWaterF.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/fullbrightWaterF.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 6bcd44506d..2cf7a69baa 100644
--- a/indra/newview/app_settings/shaders/class1/objects/shinyF.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/shinyF.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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
new file mode 100644
index 0000000000..4146646058
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/objects/shinySimpleSkinnedV.glsl
@@ -0,0 +1,39 @@
+/**
+ * @file shinySimpleSkinnedV.glsl
+ *
+ * Copyright (c) 2007-$CurrentYear$, Linden Research, Inc.
+ * $License$
+ */
+
+#version 120
+
+vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
+void calcAtmospherics(vec3 inPositionEye);
+mat4 getObjectSkinnedTransform();
+
+attribute vec4 object_weight;
+
+void main()
+{
+ mat4 mat = getObjectSkinnedTransform();
+
+ mat = gl_ModelViewMatrix * mat;
+ vec3 pos = (mat*gl_Vertex).xyz;
+
+ vec4 norm = gl_Vertex;
+ norm.xyz += gl_Normal.xyz;
+ norm.xyz = (mat*norm).xyz;
+ norm.xyz = normalize(norm.xyz-pos.xyz);
+
+ vec3 ref = reflect(pos.xyz, -norm.xyz);
+
+ gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
+ gl_TexCoord[1] = gl_TextureMatrix[1]*vec4(ref,1.0);
+
+ calcAtmospherics(pos.xyz);
+
+ vec4 color = calcLighting(pos.xyz, norm.xyz, gl_Color, vec4(0.));
+ gl_FrontColor = color;
+
+ gl_Position = gl_ProjectionMatrix*vec4(pos, 1.0);
+}
diff --git a/indra/newview/app_settings/shaders/class1/objects/shinyV.glsl b/indra/newview/app_settings/shaders/class1/objects/shinyV.glsl
index 074892c98e..6ea83b721d 100644
--- a/indra/newview/app_settings/shaders/class1/objects/shinyV.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/shinyV.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/LicenseInfo$
*/
+
+#version 120
void calcAtmospherics(vec3 inPositionEye);
@@ -12,7 +14,7 @@ uniform vec4 origin;
void main()
{
//transform vertex
- gl_Position = ftransform(); //gl_ModelViewProjectionMatrix * gl_Vertex;
+ gl_Position = ftransform();
vec4 pos = (gl_ModelViewMatrix * gl_Vertex);
vec3 norm = normalize(gl_NormalMatrix * gl_Normal);
diff --git a/indra/newview/app_settings/shaders/class1/objects/shinyWaterF.glsl b/indra/newview/app_settings/shaders/class1/objects/shinyWaterF.glsl
index 54b30573e7..e3babe2210 100644
--- a/indra/newview/app_settings/shaders/class1/objects/shinyWaterF.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/shinyWaterF.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 61c2ce4272..d449d37c0c 100644
--- a/indra/newview/app_settings/shaders/class1/objects/simpleF.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/simpleF.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/LicenseInfo$
*/
+
+#version 120
void default_lighting();
diff --git a/indra/newview/app_settings/shaders/class1/objects/simpleSkinnedV.glsl b/indra/newview/app_settings/shaders/class1/objects/simpleSkinnedV.glsl
new file mode 100644
index 0000000000..be38a14d52
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/objects/simpleSkinnedV.glsl
@@ -0,0 +1,39 @@
+/**
+ * @file simpleSkinnedV.glsl
+ *
+ * Copyright (c) 2007-$CurrentYear$, Linden Research, Inc.
+ * $License$
+ */
+
+#version 120
+
+vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
+void calcAtmospherics(vec3 inPositionEye);
+mat4 getObjectSkinnedTransform();
+
+attribute vec4 object_weight;
+
+void main()
+{
+ //transform vertex
+ gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
+
+ mat4 mat = getObjectSkinnedTransform();
+
+ mat = gl_ModelViewMatrix * mat;
+ vec3 pos = (mat*gl_Vertex).xyz;
+
+ vec4 norm = gl_Vertex;
+ norm.xyz += gl_Normal.xyz;
+ norm.xyz = (mat*norm).xyz;
+ norm.xyz = normalize(norm.xyz-pos.xyz);
+
+ calcAtmospherics(pos.xyz);
+
+ vec4 color = calcLighting(pos.xyz, norm.xyz, gl_Color, vec4(0.));
+ gl_FrontColor = color;
+
+ gl_Position = gl_ProjectionMatrix*vec4(pos, 1.0);
+
+ gl_FogFragCoord = pos.z;
+}
diff --git a/indra/newview/app_settings/shaders/class1/objects/simpleV.glsl b/indra/newview/app_settings/shaders/class1/objects/simpleV.glsl
index ced1a4be01..0d8e14e2e3 100644
--- a/indra/newview/app_settings/shaders/class1/objects/simpleV.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/simpleV.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 5e44212aed..68bd81e029 100644
--- a/indra/newview/app_settings/shaders/class1/objects/simpleWaterF.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/simpleWaterF.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 7a05b8c8c6..f337bde329 100644
--- a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsF.glsl
+++ b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsF.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2005&license=viewerlgpl$
* $/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 874f2b4843..4b402a7028 100644
--- a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsHelpersV.glsl
+++ b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsHelpersV.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2005&license=viewerlgpl$
* $/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 7ead9ddf26..20948b1e46 100644
--- a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsV.glsl
+++ b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsV.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2005&license=viewerlgpl$
* $/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 f6032f8d41..8a2c2a7186 100644
--- a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsF.glsl
+++ b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsF.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 a696ddf607..a1dd4ed5fe 100644
--- a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsV.glsl
+++ b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsV.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 4a1899798a..7aed1fd3b5 100644
--- a/indra/newview/app_settings/shaders/class1/windlight/gammaF.glsl
+++ b/indra/newview/app_settings/shaders/class1/windlight/gammaF.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 b78b90545e..6780dc4d3e 100644
--- a/indra/newview/app_settings/shaders/class1/windlight/transportF.glsl
+++ b/indra/newview/app_settings/shaders/class1/windlight/transportF.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2005&license=viewerlgpl$
* $/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 47300f0b39..172c2ca078 100644
--- a/indra/newview/app_settings/shaders/class2/avatar/eyeballV.glsl
+++ b/indra/newview/app_settings/shaders/class2/avatar/eyeballV.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 e2d7cd94da..6dfc1b952c 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/LicenseInfo$
*/
+
+#version 120
#extension GL_ARB_texture_rectangle : enable
@@ -12,7 +14,6 @@ uniform sampler2DRectShadow shadowMap0;
uniform sampler2DRectShadow shadowMap1;
uniform sampler2DRectShadow shadowMap2;
uniform sampler2DRectShadow shadowMap3;
-uniform sampler2D noiseMap;
uniform sampler2DRect depthMap;
uniform mat4 shadow_matrix[6];
@@ -27,7 +28,7 @@ varying vec3 vary_ambient;
varying vec3 vary_directional;
varying vec3 vary_fragcoord;
varying vec3 vary_position;
-varying vec3 vary_light;
+varying vec3 vary_pointlight_col;
uniform float shadow_bias;
@@ -68,8 +69,6 @@ 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 = vec4(vary_position, 1.0);
@@ -106,16 +105,21 @@ void main()
}
}
+ vec4 diff= texture2D(diffuseMap, gl_TexCoord[0].xy);
+
vec4 col = vec4(vary_ambient + vary_directional.rgb*shadow, gl_Color.a);
- vec4 color = texture2D(diffuseMap, gl_TexCoord[0].xy) * col;
+ 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 = vec4(1,0,1,1)*shadow;
+ //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
new file mode 100644
index 0000000000..dfb36980b0
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class2/deferred/alphaSkinnedV.glsl
@@ -0,0 +1,115 @@
+/**
+ * @file alphaSkinnedV.glsl
+ *
+ * Copyright (c) 2007-$CurrentYear$, Linden Research, Inc.
+ * $License$
+ */
+
+#version 120
+
+vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
+void calcAtmospherics(vec3 inPositionEye);
+
+float calcDirectionalLight(vec3 n, vec3 l);
+mat4 getObjectSkinnedTransform();
+vec3 atmosAmbient(vec3 light);
+vec3 atmosAffectDirectionalLight(float lightIntensity);
+vec3 scaleDownLight(vec3 light);
+vec3 scaleUpLight(vec3 light);
+
+varying vec3 vary_ambient;
+varying vec3 vary_directional;
+varying vec3 vary_fragcoord;
+varying vec3 vary_position;
+varying vec3 vary_pointlight_col;
+
+uniform float near_clip;
+uniform float shadow_offset;
+uniform float shadow_bias;
+
+float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight)
+{
+ //get light vector
+ vec3 lv = lp.xyz-v;
+
+ //get distance
+ float d = length(lv);
+
+ float 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);
+ 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
+
+ //angular attenuation
+ da *= calcDirectionalLight(n, lv);
+ }
+
+ return da;
+}
+
+void main()
+{
+ gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
+
+ mat4 mat = getObjectSkinnedTransform();
+
+ mat = gl_ModelViewMatrix * mat;
+
+ vec3 pos = (mat*gl_Vertex).xyz;
+
+ gl_Position = gl_ProjectionMatrix * vec4(pos, 1.0);
+
+ vec4 n = gl_Vertex;
+ n.xyz += gl_Normal.xyz;
+ n.xyz = (mat*n).xyz;
+ n.xyz = normalize(n.xyz-pos.xyz);
+
+ vec3 norm = n.xyz;
+
+ float dp_directional_light = max(0.0, dot(norm, gl_LightSource[0].position.xyz));
+ vary_position = pos.xyz + gl_LightSource[0].position.xyz * (1.0-dp_directional_light)*shadow_offset;
+
+ calcAtmospherics(pos.xyz);
+
+ //vec4 color = calcLighting(pos.xyz, norm, gl_Color, vec4(0.));
+ vec4 col = vec4(0.0, 0.0, 0.0, gl_Color.a);
+
+ // Collect normal lights
+ col.rgb += gl_LightSource[2].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[2].position, gl_LightSource[2].spotDirection.xyz, gl_LightSource[2].linearAttenuation, gl_LightSource[2].quadraticAttenuation, gl_LightSource[2].specular.a);
+ col.rgb += gl_LightSource[3].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[3].position, gl_LightSource[3].spotDirection.xyz, gl_LightSource[3].linearAttenuation, gl_LightSource[3].quadraticAttenuation ,gl_LightSource[3].specular.a);
+ col.rgb += gl_LightSource[4].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[4].position, gl_LightSource[4].spotDirection.xyz, gl_LightSource[4].linearAttenuation, gl_LightSource[4].quadraticAttenuation, gl_LightSource[4].specular.a);
+ col.rgb += gl_LightSource[5].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[5].position, gl_LightSource[5].spotDirection.xyz, gl_LightSource[5].linearAttenuation, gl_LightSource[5].quadraticAttenuation, gl_LightSource[5].specular.a);
+ col.rgb += gl_LightSource[6].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[6].position, gl_LightSource[6].spotDirection.xyz, gl_LightSource[6].linearAttenuation, gl_LightSource[6].quadraticAttenuation, gl_LightSource[6].specular.a);
+ col.rgb += gl_LightSource[7].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[7].position, gl_LightSource[7].spotDirection.xyz, gl_LightSource[7].linearAttenuation, gl_LightSource[7].quadraticAttenuation, gl_LightSource[7].specular.a);
+
+ vary_pointlight_col = col.rgb*gl_Color.rgb;
+
+ col.rgb = vec3(0,0,0);
+
+ // Add windlight lights
+ col.rgb = atmosAmbient(vec3(0.));
+
+ vary_ambient = col.rgb*gl_Color.rgb;
+ vary_directional.rgb = gl_Color.rgb*atmosAffectDirectionalLight(max(calcDirectionalLight(norm, gl_LightSource[0].position.xyz), (1.0-gl_Color.a)*(1.0-gl_Color.a)));
+
+ col.rgb = min(col.rgb*gl_Color.rgb, 1.0);
+
+ gl_FrontColor = col;
+
+ gl_FogFragCoord = pos.z;
+
+ pos.xyz = (gl_ModelViewProjectionMatrix * gl_Vertex).xyz;
+ vary_fragcoord.xyz = pos.xyz + vec3(0,0,near_clip);
+
+}
+
diff --git a/indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl b/indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl
index 45f727951e..f6160815eb 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl
@@ -4,12 +4,13 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/LicenseInfo$
*/
+
+#version 120
vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
void calcAtmospherics(vec3 inPositionEye);
float calcDirectionalLight(vec3 n, vec3 l);
-float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float is_pointlight);
vec3 atmosAmbient(vec3 light);
vec3 atmosAffectDirectionalLight(float lightIntensity);
@@ -20,12 +21,42 @@ varying vec3 vary_ambient;
varying vec3 vary_directional;
varying vec3 vary_fragcoord;
varying vec3 vary_position;
-varying vec3 vary_light;
+varying vec3 vary_pointlight_col;
uniform float near_clip;
uniform float shadow_offset;
uniform float shadow_bias;
+float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight)
+{
+ //get light vector
+ vec3 lv = lp.xyz-v;
+
+ //get distance
+ float d = length(lv);
+
+ float 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);
+ 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
+
+ //angular attenuation
+ da *= calcDirectionalLight(n, lv);
+ }
+
+ return da;
+}
+
void main()
{
//transform vertex
@@ -44,25 +75,25 @@ void main()
//vec4 color = calcLighting(pos.xyz, norm, gl_Color, vec4(0.));
vec4 col = vec4(0.0, 0.0, 0.0, gl_Color.a);
- // Collect normal lights (need to be divided by two, as we later multiply by 2)
- col.rgb += gl_LightSource[2].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[2].position, gl_LightSource[2].spotDirection.xyz, gl_LightSource[2].linearAttenuation, gl_LightSource[2].specular.a);
- col.rgb += gl_LightSource[3].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[3].position, gl_LightSource[3].spotDirection.xyz, gl_LightSource[3].linearAttenuation, gl_LightSource[3].specular.a);
- col.rgb += gl_LightSource[4].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[4].position, gl_LightSource[4].spotDirection.xyz, gl_LightSource[4].linearAttenuation, gl_LightSource[4].specular.a);
- col.rgb += gl_LightSource[5].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[5].position, gl_LightSource[5].spotDirection.xyz, gl_LightSource[5].linearAttenuation, gl_LightSource[5].specular.a);
- col.rgb += gl_LightSource[6].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[6].position, gl_LightSource[6].spotDirection.xyz, gl_LightSource[6].linearAttenuation, gl_LightSource[6].specular.a);
- col.rgb += gl_LightSource[7].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[7].position, gl_LightSource[7].spotDirection.xyz, gl_LightSource[7].linearAttenuation, gl_LightSource[7].specular.a);
- col.rgb += gl_LightSource[1].diffuse.rgb*calcDirectionalLight(norm, gl_LightSource[1].position.xyz);
- col.rgb = scaleDownLight(col.rgb);
+ // Collect normal lights
+ col.rgb += gl_LightSource[2].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[2].position, gl_LightSource[2].spotDirection.xyz, gl_LightSource[2].linearAttenuation, gl_LightSource[2].quadraticAttenuation, gl_LightSource[2].specular.a);
+ col.rgb += gl_LightSource[3].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[3].position, gl_LightSource[3].spotDirection.xyz, gl_LightSource[3].linearAttenuation, gl_LightSource[3].quadraticAttenuation ,gl_LightSource[3].specular.a);
+ col.rgb += gl_LightSource[4].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[4].position, gl_LightSource[4].spotDirection.xyz, gl_LightSource[4].linearAttenuation, gl_LightSource[4].quadraticAttenuation, gl_LightSource[4].specular.a);
+ col.rgb += gl_LightSource[5].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[5].position, gl_LightSource[5].spotDirection.xyz, gl_LightSource[5].linearAttenuation, gl_LightSource[5].quadraticAttenuation, gl_LightSource[5].specular.a);
+ col.rgb += gl_LightSource[6].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[6].position, gl_LightSource[6].spotDirection.xyz, gl_LightSource[6].linearAttenuation, gl_LightSource[6].quadraticAttenuation, gl_LightSource[6].specular.a);
+ col.rgb += gl_LightSource[7].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[7].position, gl_LightSource[7].spotDirection.xyz, gl_LightSource[7].linearAttenuation, gl_LightSource[7].quadraticAttenuation, gl_LightSource[7].specular.a);
+ vary_pointlight_col = col.rgb*gl_Color.rgb;
+
+ col.rgb = vec3(0,0,0);
+
// Add windlight lights
- col.rgb += atmosAmbient(vec3(0.));
-
- vary_light = gl_LightSource[0].position.xyz;
+ col.rgb = atmosAmbient(vec3(0.));
vary_ambient = col.rgb*gl_Color.rgb;
vary_directional.rgb = gl_Color.rgb*atmosAffectDirectionalLight(max(calcDirectionalLight(norm, gl_LightSource[0].position.xyz), (1.0-gl_Color.a)*(1.0-gl_Color.a)));
- col.rgb = min(col.rgb*gl_Color.rgb, 1.0);
+ col.rgb = col.rgb*gl_Color.rgb;
gl_FrontColor = col;
diff --git a/indra/newview/app_settings/shaders/class2/deferred/avatarAlphaF.glsl b/indra/newview/app_settings/shaders/class2/deferred/avatarAlphaF.glsl
deleted file mode 100644
index 5ecbbd2c4f..0000000000
--- a/indra/newview/app_settings/shaders/class2/deferred/avatarAlphaF.glsl
+++ /dev/null
@@ -1,98 +0,0 @@
-/**
- * @file avatarAlphaF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * $/LicenseInfo$
- */
-
-#extension GL_ARB_texture_rectangle : enable
-
-uniform sampler2D diffuseMap;
-uniform sampler2DRectShadow shadowMap0;
-uniform sampler2DRectShadow shadowMap1;
-uniform sampler2DRectShadow shadowMap2;
-uniform sampler2DRectShadow shadowMap3;
-uniform sampler2D noiseMap;
-
-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_position;
-varying vec3 vary_normal;
-
-uniform float shadow_bias;
-
-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()
-{
- float shadow = 1.0;
- vec4 pos = vec4(vary_position, 1.0);
- vec3 norm = normalize(vary_normal);
-
- //vec3 nz = texture2D(noiseMap, gl_FragCoord.xy/128.0).xyz;
-
- 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 col = vec4(vary_ambient + vary_directional*shadow, gl_Color.a);
- vec4 color = texture2D(diffuseMap, gl_TexCoord[0].xy) * col;
-
- color.rgb = atmosLighting(color.rgb);
-
- color.rgb = scaleSoftClip(color.rgb);
-
- gl_FragColor = color;
-}
diff --git a/indra/newview/app_settings/shaders/class2/deferred/avatarAlphaV.glsl b/indra/newview/app_settings/shaders/class2/deferred/avatarAlphaV.glsl
index d7d1111ba8..0ae09df0c6 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/avatarAlphaV.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/avatarAlphaV.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/LicenseInfo$
*/
+
+#version 120
vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
mat4 getSkinnedTransform();
@@ -20,12 +22,43 @@ vec3 scaleUpLight(vec3 light);
varying vec3 vary_position;
varying vec3 vary_ambient;
varying vec3 vary_directional;
-varying vec3 vary_normal;
+varying vec3 vary_fragcoord;
+varying vec3 vary_pointlight_col;
uniform float near_clip;
uniform float shadow_offset;
uniform float shadow_bias;
+float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight)
+{
+ //get light vector
+ vec3 lv = lp.xyz-v;
+
+ //get distance
+ float d = length(lv);
+
+ float 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);
+ 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
+
+ //angular attenuation
+ da *= calcDirectionalLight(n, lv);
+ }
+
+ return da;
+}
+
void main()
{
gl_TexCoord[0] = gl_MultiTexCoord0;
@@ -48,7 +81,6 @@ void main()
float dp_directional_light = max(0.0, dot(norm, gl_LightSource[0].position.xyz));
vary_position = pos.xyz + gl_LightSource[0].position.xyz * (1.0-dp_directional_light)*shadow_offset;
- vary_normal = norm;
calcAtmospherics(pos.xyz);
@@ -56,18 +88,20 @@ void main()
vec4 col = vec4(0.0, 0.0, 0.0, gl_Color.a);
- // Collect normal lights (need to be divided by two, as we later multiply by 2)
- col.rgb += gl_LightSource[2].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[2].position, gl_LightSource[2].spotDirection.xyz, gl_LightSource[2].linearAttenuation, gl_LightSource[2].specular.a);
- col.rgb += gl_LightSource[3].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[3].position, gl_LightSource[3].spotDirection.xyz, gl_LightSource[3].linearAttenuation, gl_LightSource[3].specular.a);
- col.rgb += gl_LightSource[4].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[4].position, gl_LightSource[4].spotDirection.xyz, gl_LightSource[4].linearAttenuation, gl_LightSource[4].specular.a);
- col.rgb += gl_LightSource[5].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[5].position, gl_LightSource[5].spotDirection.xyz, gl_LightSource[5].linearAttenuation, gl_LightSource[5].specular.a);
- col.rgb += gl_LightSource[6].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[6].position, gl_LightSource[6].spotDirection.xyz, gl_LightSource[6].linearAttenuation, gl_LightSource[6].specular.a);
- col.rgb += gl_LightSource[7].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[7].position, gl_LightSource[7].spotDirection.xyz, gl_LightSource[7].linearAttenuation, gl_LightSource[7].specular.a);
- col.rgb += gl_LightSource[1].diffuse.rgb*calcDirectionalLight(norm, gl_LightSource[1].position.xyz);
- col.rgb = scaleDownLight(col.rgb);
+ // Collect normal lights
+ col.rgb += gl_LightSource[2].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[2].position, gl_LightSource[2].spotDirection.xyz, gl_LightSource[2].linearAttenuation, gl_LightSource[2].quadraticAttenuation, gl_LightSource[2].specular.a);
+ col.rgb += gl_LightSource[3].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[3].position, gl_LightSource[3].spotDirection.xyz, gl_LightSource[3].linearAttenuation, gl_LightSource[3].quadraticAttenuation ,gl_LightSource[3].specular.a);
+ col.rgb += gl_LightSource[4].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[4].position, gl_LightSource[4].spotDirection.xyz, gl_LightSource[4].linearAttenuation, gl_LightSource[4].quadraticAttenuation, gl_LightSource[4].specular.a);
+ col.rgb += gl_LightSource[5].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[5].position, gl_LightSource[5].spotDirection.xyz, gl_LightSource[5].linearAttenuation, gl_LightSource[5].quadraticAttenuation, gl_LightSource[5].specular.a);
+ col.rgb += gl_LightSource[6].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[6].position, gl_LightSource[6].spotDirection.xyz, gl_LightSource[6].linearAttenuation, gl_LightSource[6].quadraticAttenuation, gl_LightSource[6].specular.a);
+ col.rgb += gl_LightSource[7].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[7].position, gl_LightSource[7].spotDirection.xyz, gl_LightSource[7].linearAttenuation, gl_LightSource[7].quadraticAttenuation, gl_LightSource[7].specular.a);
+ vary_pointlight_col = col.rgb*gl_Color.rgb;
+
+ col.rgb = vec3(0,0,0);
+
// Add windlight lights
- col.rgb += atmosAmbient(vec3(0.));
+ col.rgb = atmosAmbient(vec3(0.));
vary_ambient = col.rgb*gl_Color.rgb;
vary_directional = gl_Color.rgb*atmosAffectDirectionalLight(max(calcDirectionalLight(norm, gl_LightSource[0].position.xyz), (1.0-gl_Color.a)*(1.0-gl_Color.a)));
@@ -77,7 +111,7 @@ void main()
gl_FrontColor = col;
gl_FogFragCoord = pos.z;
-
+ vary_fragcoord.xyz = pos.xyz + vec3(0,0,near_clip);
}
diff --git a/indra/newview/app_settings/shaders/class2/deferred/blurLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/blurLightF.glsl
deleted file mode 100644
index 258a9b7c40..0000000000
--- a/indra/newview/app_settings/shaders/class2/deferred/blurLightF.glsl
+++ /dev/null
@@ -1,81 +0,0 @@
-/**
- * @file blurLightF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * $/LicenseInfo$
- */
-
-#extension GL_ARB_texture_rectangle : enable
-
-uniform sampler2DRect depthMap;
-uniform sampler2DRect 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;
-
-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()
-{
- vec3 norm = texture2DRect(normalMap, vary_fragcoord.xy).xyz;
- norm = vec3((norm.xy-0.5)*2.0,norm.z); // unpack norm
- vec3 pos = getPosition(vary_fragcoord.xy).xyz;
- vec4 ccol = texture2DRect(lightMap, vary_fragcoord.xy).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;
-
- for (int i = 1; i < 4; i++)
- {
- vec2 tc = vary_fragcoord.xy + kern[i].z*dlt;
- vec3 samppos = getPosition(tc).xyz;
- float d = dot(norm.xyz, samppos.xyz-pos.xyz);// dist from plane
- if (d*d <= 0.003)
- {
- col += texture2DRect(lightMap, tc)*kern[i].xyxx;
- defined_weight += kern[i].xy;
- }
- }
- for (int i = 1; i < 4; i++)
- {
- vec2 tc = vary_fragcoord.xy - kern[i].z*dlt;
- vec3 samppos = getPosition(tc).xyz;
- float d = dot(norm.xyz, samppos.xyz-pos.xyz);// dist from plane
- if (d*d <= 0.003)
- {
- col += texture2DRect(lightMap, tc)*kern[i].xyxx;
- defined_weight += kern[i].xy;
- }
- }
-
-
-
- col /= defined_weight.xyxx;
-
- gl_FragColor = col;
-}
-
diff --git a/indra/newview/app_settings/shaders/class2/deferred/edgeF.glsl b/indra/newview/app_settings/shaders/class2/deferred/edgeF.glsl
index ff32a15c54..3155f3f929 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/edgeF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/edgeF.glsl
@@ -4,14 +4,14 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/LicenseInfo$
*/
+
+#version 120
#extension GL_ARB_texture_rectangle : enable
uniform sampler2DRect depthMap;
uniform sampler2DRect normalMap;
-uniform float gi_dist_cutoff;
-
varying vec2 vary_fragcoord;
uniform float depth_cutoff;
diff --git a/indra/newview/app_settings/shaders/class2/deferred/edgeV.glsl b/indra/newview/app_settings/shaders/class2/deferred/edgeV.glsl
index 74f2bd9818..b3413c301f 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/edgeV.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/edgeV.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/LicenseInfo$
*/
+
+#version 120
varying vec2 vary_fragcoord;
uniform vec2 screen_res;
diff --git a/indra/newview/app_settings/shaders/class2/deferred/postDeferredF.glsl b/indra/newview/app_settings/shaders/class2/deferred/postDeferredF.glsl
deleted file mode 100644
index 757e3e7aab..0000000000
--- a/indra/newview/app_settings/shaders/class2/deferred/postDeferredF.glsl
+++ /dev/null
@@ -1,59 +0,0 @@
-/**
- * @file postDeferredF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * $/LicenseInfo$
- */
-
-uniform sampler2DRect diffuseRect;
-uniform sampler2DRect localLightMap;
-uniform sampler2DRect sunLightMap;
-uniform sampler2DRect giLightMap;
-uniform sampler2D luminanceMap;
-uniform sampler2DRect lightMap;
-
-uniform vec3 gi_lum_quad;
-uniform vec3 sun_lum_quad;
-uniform vec3 lum_quad;
-uniform float lum_lod;
-uniform vec4 ambient;
-
-uniform vec3 gi_quad;
-
-uniform vec2 screen_res;
-varying vec2 vary_fragcoord;
-
-void main()
-{
- vec2 tc = vary_fragcoord.xy;
- vec3 lcol = texture2DLod(luminanceMap, tc/screen_res, lum_lod).rgb;
-
- float lum = sqrt(lcol.r)*lum_quad.x+lcol.r*lcol.r*lum_quad.y+lcol.r*lum_quad.z;
-
- vec4 diff = texture2DRect(diffuseRect, vary_fragcoord.xy);
-
- float ambocc = texture2DRect(lightMap, vary_fragcoord.xy).g;
-
- vec3 gi_col = texture2DRect(giLightMap, vary_fragcoord.xy).rgb;
- gi_col = gi_col*gi_col*gi_quad.x + gi_col*gi_quad.y+gi_quad.z*ambocc*ambient.rgb;
- gi_col *= diff;
-
- vec4 sun_col = texture2DRect(sunLightMap, vary_fragcoord.xy);
-
- vec3 local_col = texture2DRect(localLightMap, vary_fragcoord.xy).rgb;
-
-
- float sun_lum = 1.0-lum;
- sun_lum = sun_lum*sun_lum*sun_lum_quad.x + sun_lum*sun_lum_quad.y+sun_lum_quad.z;
-
- float gi_lum = lum;
- gi_lum = gi_lum*gi_lum*gi_lum_quad.x+gi_lum*gi_lum_quad.y+gi_lum_quad.z;
- gi_col *= 1.0/gi_lum;
-
- vec3 col = sun_col.rgb*(1.0+max(sun_lum,0.0))+gi_col+local_col;
-
- gl_FragColor.rgb = col.rgb;
- gl_FragColor.a = max(sun_lum*min(sun_col.r+sun_col.g+sun_col.b, 1.0), sun_col.a);
-
- //gl_FragColor.rgb = texture2DRect(giLightMap, vary_fragcoord.xy).rgb;
-}
diff --git a/indra/newview/app_settings/shaders/class2/deferred/postDeferredV.glsl b/indra/newview/app_settings/shaders/class2/deferred/postDeferredV.glsl
deleted file mode 100644
index 0ec81dcb02..0000000000
--- a/indra/newview/app_settings/shaders/class2/deferred/postDeferredV.glsl
+++ /dev/null
@@ -1,17 +0,0 @@
-/**
- * @file postDeferredV.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * $/LicenseInfo$
- */
-
-varying vec2 vary_fragcoord;
-uniform vec2 screen_res;
-
-void main()
-{
- //transform vertex
- gl_Position = ftransform();
- vec4 pos = gl_ModelViewProjectionMatrix * gl_Vertex;
- vary_fragcoord = (pos.xy*0.5+0.5)*screen_res;
-}
diff --git a/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl
index 1067be1e6e..0160e84278 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/LicenseInfo$
*/
+
+#version 120
#extension GL_ARB_texture_rectangle : enable
diff --git a/indra/newview/app_settings/shaders/class2/deferred/softenLightV.glsl b/indra/newview/app_settings/shaders/class2/deferred/softenLightV.glsl
index 9d187b46e2..8f0bcca76b 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/softenLightV.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/softenLightV.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 d0e242c2d4..50b9ef276e 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl
@@ -4,7 +4,7 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/LicenseInfo$
*/
-
+
#version 120
#extension GL_ARB_texture_rectangle : enable
diff --git a/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl
index f565d3bdb9..4369b3b34f 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/LicenseInfo$
*/
+
+#version 120
#extension GL_ARB_texture_rectangle : enable
@@ -17,9 +19,6 @@ uniform sampler2DRectShadow shadowMap2;
uniform sampler2DRectShadow shadowMap3;
uniform sampler2DShadow shadowMap4;
uniform sampler2DShadow shadowMap5;
-uniform sampler2D noiseMap;
-
-uniform sampler2D lightFunc;
// Inputs
diff --git a/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl b/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl
index 4e33a1af45..847b36b1ac 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl
@@ -4,6 +4,8 @@
* Copyright (c) 2007-$CurrentYear$, Linden Research, Inc.
* $License$
*/
+
+#version 120
#extension GL_ARB_texture_rectangle : enable
@@ -19,8 +21,6 @@ uniform sampler2DShadow shadowMap4;
uniform sampler2DShadow shadowMap5;
uniform sampler2D noiseMap;
-uniform sampler2D lightFunc;
-
// Inputs
uniform mat4 shadow_matrix[6];
uniform vec4 shadow_clip;
@@ -60,58 +60,50 @@ vec4 getPosition(vec2 pos_screen)
float calcAmbientOcclusion(vec4 pos, vec3 norm)
{
float ret = 1.0;
-
- float dist = dot(pos.xyz,pos.xyz);
-
- if (dist < 64.0*64.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;
+ 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 angle_hidden = 0.0;
+ int points = 0;
- float scale = min(ssao_radius / -pos_world.z, ssao_max_radius);
+ float scale = min(ssao_radius / -pos_world.z, ssao_max_radius);
- // it was found that keeping # of samples a constant was the fastest, probably due to compiler optimizations (unrolling?)
- for (int i = 0; i < 8; i++)
- {
- vec2 samppos_screen = pos_screen + scale * reflect(kern[i], noise_reflect);
- vec3 samppos_world = getPosition(samppos_screen).xyz;
+ // it was found that keeping # of samples a constant was the fastest, probably due to compiler optimizations (unrolling?)
+ for (int i = 0; i < 8; i++)
+ {
+ vec2 samppos_screen = pos_screen + scale * reflect(kern[i], noise_reflect);
+ vec3 samppos_world = getPosition(samppos_screen).xyz;
- vec3 diff = pos_world - samppos_world;
- float dist2 = dot(diff, diff);
+ 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)
+ // assume each sample corresponds to an occluding sphere with constant radius, constant x-sectional area
+ // --> solid angle shrinking by the square of distance
+ //radius is somewhat arbitrary, can approx with just some constant k * 1 / dist^2
+ //(k should vary inversely with # of samples, but this is taken care of later)
- //if (dot((samppos_world - 0.05*norm - pos_world), norm) > 0.0) // -0.05*norm to shift sample point back slightly for flat surfaces
- // angle_hidden += min(1.0/dist2, ssao_factor_inv); // dist != 0 follows from conditional. max of 1.0 (= ssao_factor_inv * ssao_factor)
- angle_hidden = angle_hidden + float(dot((samppos_world - 0.05*norm - pos_world), norm) > 0.0) * min(1.0/dist2, ssao_factor_inv);
+ angle_hidden = angle_hidden + float(dot((samppos_world - 0.05*norm - pos_world), norm) > 0.0) * min(1.0/dist2, ssao_factor_inv);
- // 'blocked' samples (significantly closer to camera relative to pos_world) are "no data", not "no occlusion"
- points = points + int(diff.z > -1.0);
- }
+ // 'blocked' samples (significantly closer to camera relative to pos_world) are "no data", not "no occlusion"
+ points = points + int(diff.z > -1.0);
+ }
- angle_hidden = min(ssao_factor*angle_hidden/float(points), 1.0);
+ angle_hidden = min(ssao_factor*angle_hidden/float(points), 1.0);
- ret = (1.0 - (float(points != 0) * angle_hidden));
- ret += max((dist-32.0*32.0)/(32.0*32.0), 0.0);
- }
+ ret = (1.0 - (float(points != 0) * angle_hidden));
return min(ret, 1.0);
}
diff --git a/indra/newview/app_settings/shaders/class2/deferred/sunLightV.glsl b/indra/newview/app_settings/shaders/class2/deferred/sunLightV.glsl
index 9d092d9cea..9beb513ad8 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/sunLightV.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/sunLightV.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 4173709298..a4ad0bfa15 100644
--- a/indra/newview/app_settings/shaders/class2/effects/blurF.glsl
+++ b/indra/newview/app_settings/shaders/class2/effects/blurF.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 f66609527d..d471a6c5e5 100644
--- a/indra/newview/app_settings/shaders/class2/effects/blurV.glsl
+++ b/indra/newview/app_settings/shaders/class2/effects/blurV.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 df41dae757..66880b958e 100644
--- a/indra/newview/app_settings/shaders/class2/effects/colorFilterF.glsl
+++ b/indra/newview/app_settings/shaders/class2/effects/colorFilterF.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 e836caf93f..c35c500d62 100644
--- a/indra/newview/app_settings/shaders/class2/effects/drawQuadV.glsl
+++ b/indra/newview/app_settings/shaders/class2/effects/drawQuadV.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 06d5fc9797..e77baa5bee 100644
--- a/indra/newview/app_settings/shaders/class2/effects/extractF.glsl
+++ b/indra/newview/app_settings/shaders/class2/effects/extractF.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 0a2767ad02..8e0eec6f5e 100644
--- a/indra/newview/app_settings/shaders/class2/effects/nightVisionF.glsl
+++ b/indra/newview/app_settings/shaders/class2/effects/nightVisionF.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 29ad9a995b..98a50e22fc 100644
--- a/indra/newview/app_settings/shaders/class2/effects/simpleF.glsl
+++ b/indra/newview/app_settings/shaders/class2/effects/simpleF.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 32259acf1b..bbb8951f3a 100644
--- a/indra/newview/app_settings/shaders/class2/environment/terrainF.glsl
+++ b/indra/newview/app_settings/shaders/class2/environment/terrainF.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 2234f0bd89..84906c16bf 100644
--- a/indra/newview/app_settings/shaders/class2/environment/terrainV.glsl
+++ b/indra/newview/app_settings/shaders/class2/environment/terrainV.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 1650912fc8..7590c542ef 100644
--- a/indra/newview/app_settings/shaders/class2/environment/terrainWaterF.glsl
+++ b/indra/newview/app_settings/shaders/class2/environment/terrainWaterF.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 9e936a3790..900f1a6cb8 100644
--- a/indra/newview/app_settings/shaders/class2/environment/underWaterF.glsl
+++ b/indra/newview/app_settings/shaders/class2/environment/underWaterF.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 e477107c0b..f4f6b6e90f 100644
--- a/indra/newview/app_settings/shaders/class2/environment/waterF.glsl
+++ b/indra/newview/app_settings/shaders/class2/environment/waterF.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 7bcdcf5d5b..9f3328cbf0 100644
--- a/indra/newview/app_settings/shaders/class2/environment/waterFogF.glsl
+++ b/indra/newview/app_settings/shaders/class2/environment/waterFogF.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 269d11a085..342bc2ab66 100644
--- a/indra/newview/app_settings/shaders/class2/lighting/lightF.glsl
+++ b/indra/newview/app_settings/shaders/class2/lighting/lightF.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/LicenseInfo$
*/
+
+#version 120
uniform sampler2D diffuseMap;
diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightF.glsl
index 9ffe3c6f4a..dad18b5883 100644
--- a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightF.glsl
+++ b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightF.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/LicenseInfo$
*/
+
+#version 120
uniform sampler2D diffuseMap;
diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyF.glsl
index b7181dec3a..73ff81e03a 100644
--- a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyF.glsl
+++ b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyF.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/LicenseInfo$
*/
+
+#version 120
uniform sampler2D diffuseMap;
uniform samplerCube environmentMap;
diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyWaterF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyWaterF.glsl
new file mode 100644
index 0000000000..9b4b584369
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyWaterF.glsl
@@ -0,0 +1,31 @@
+/**
+ * @file lightFullbrightShinyWaterF.glsl
+ *
+ * Copyright (c) 2007-$CurrentYear$, Linden Research, Inc.
+ * $License$
+ */
+
+#version 120
+
+uniform sampler2D diffuseMap;
+uniform samplerCube environmentMap;
+
+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 ee38790cc4..3d46c8d874 100644
--- a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightWaterF.glsl
+++ b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightWaterF.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/LicenseInfo$
*/
+
+#version 120
uniform sampler2D diffuseMap;
diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightShinyF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightShinyF.glsl
index b96b5d75bc..ebe21320b4 100644
--- a/indra/newview/app_settings/shaders/class2/lighting/lightShinyF.glsl
+++ b/indra/newview/app_settings/shaders/class2/lighting/lightShinyF.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/LicenseInfo$
*/
+
+#version 120
uniform sampler2D diffuseMap;
uniform samplerCube environmentMap;
diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightShinyWaterF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightShinyWaterF.glsl
index 0f5b2d6fcf..7f48e2cf1d 100644
--- a/indra/newview/app_settings/shaders/class2/lighting/lightShinyWaterF.glsl
+++ b/indra/newview/app_settings/shaders/class2/lighting/lightShinyWaterF.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/LicenseInfo$
*/
+
+#version 120
uniform sampler2D diffuseMap;
diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightSpecularV.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightSpecularV.glsl
index 6400b45d9e..ad1dc4da77 100644
--- a/indra/newview/app_settings/shaders/class2/lighting/lightSpecularV.glsl
+++ b/indra/newview/app_settings/shaders/class2/lighting/lightSpecularV.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 89ef510d7c..a0f6e019ef 100644
--- a/indra/newview/app_settings/shaders/class2/lighting/lightV.glsl
+++ b/indra/newview/app_settings/shaders/class2/lighting/lightV.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 016258bd18..97eba92d7b 100644
--- a/indra/newview/app_settings/shaders/class2/lighting/lightWaterF.glsl
+++ b/indra/newview/app_settings/shaders/class2/lighting/lightWaterF.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/LicenseInfo$
*/
+
+#version 120
uniform sampler2D diffuseMap;
diff --git a/indra/newview/app_settings/shaders/class2/lighting/sumLightsSpecularV.glsl b/indra/newview/app_settings/shaders/class2/lighting/sumLightsSpecularV.glsl
index 8cfeeb1cf9..fde32ed035 100644
--- a/indra/newview/app_settings/shaders/class2/lighting/sumLightsSpecularV.glsl
+++ b/indra/newview/app_settings/shaders/class2/lighting/sumLightsSpecularV.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2005&license=viewerlgpl$
* $/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 a512b9d6fb..8fe49e3be0 100644
--- a/indra/newview/app_settings/shaders/class2/lighting/sumLightsV.glsl
+++ b/indra/newview/app_settings/shaders/class2/lighting/sumLightsV.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2005&license=viewerlgpl$
* $/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/shinyV.glsl b/indra/newview/app_settings/shaders/class2/objects/shinyV.glsl
index c428bbb28e..4cebb06df0 100644
--- a/indra/newview/app_settings/shaders/class2/objects/shinyV.glsl
+++ b/indra/newview/app_settings/shaders/class2/objects/shinyV.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/LicenseInfo$
*/
+
+#version 120
vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
diff --git a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsF.glsl b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsF.glsl
index 8baff24dbd..77d15fba9a 100644
--- a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsF.glsl
+++ b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsF.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 6883edc1f1..8c5b864cbe 100644
--- a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsHelpersV.glsl
+++ b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsHelpersV.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2005&license=viewerlgpl$
* $/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 f5c513bbdd..8d365c15ca 100644
--- a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsV.glsl
+++ b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsV.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2005&license=viewerlgpl$
* $/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 d0b60e918e..cf9ef30632 100644
--- a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsVarsF.glsl
+++ b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsVarsF.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 4b4baf50d0..398f1556a0 100644
--- a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsVarsV.glsl
+++ b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsVarsV.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 2a559440fc..13207997b2 100644
--- a/indra/newview/app_settings/shaders/class2/windlight/cloudsF.glsl
+++ b/indra/newview/app_settings/shaders/class2/windlight/cloudsF.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2005&license=viewerlgpl$
* $/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 865c0e9da8..267ef36d4d 100644
--- a/indra/newview/app_settings/shaders/class2/windlight/cloudsV.glsl
+++ b/indra/newview/app_settings/shaders/class2/windlight/cloudsV.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2005&license=viewerlgpl$
* $/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 ce4bd2358f..a658edd21f 100644
--- a/indra/newview/app_settings/shaders/class2/windlight/gammaF.glsl
+++ b/indra/newview/app_settings/shaders/class2/windlight/gammaF.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 b69a88a45f..77ca4868a6 100644
--- a/indra/newview/app_settings/shaders/class2/windlight/skyF.glsl
+++ b/indra/newview/app_settings/shaders/class2/windlight/skyF.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2005&license=viewerlgpl$
* $/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 397db01378..03bca8f27e 100644
--- a/indra/newview/app_settings/shaders/class2/windlight/skyV.glsl
+++ b/indra/newview/app_settings/shaders/class2/windlight/skyV.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2005&license=viewerlgpl$
* $/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 b30313bdc8..7f1ad4d5b4 100644
--- a/indra/newview/app_settings/shaders/class2/windlight/transportF.glsl
+++ b/indra/newview/app_settings/shaders/class2/windlight/transportF.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 c85ba0c734..a003e2a1f1 100644
--- a/indra/newview/app_settings/shaders/class3/avatar/avatarV.glsl
+++ b/indra/newview/app_settings/shaders/class3/avatar/avatarV.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 d26b244fa3..fc370ef367 100644
--- a/indra/newview/app_settings/shaders/class3/deferred/giDownsampleF.glsl
+++ b/indra/newview/app_settings/shaders/class3/deferred/giDownsampleF.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 e5f6217644..ae57227fe5 100644
--- a/indra/newview/app_settings/shaders/class3/deferred/giDownsampleV.glsl
+++ b/indra/newview/app_settings/shaders/class3/deferred/giDownsampleV.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 735150a78c..951e3e97ae 100644
--- a/indra/newview/app_settings/shaders/class3/deferred/giF.glsl
+++ b/indra/newview/app_settings/shaders/class3/deferred/giF.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 e0f4a3e4f5..b2f8b2c633 100644
--- a/indra/newview/app_settings/shaders/class3/deferred/giFinalF.glsl
+++ b/indra/newview/app_settings/shaders/class3/deferred/giFinalF.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 fbf2c17370..19c4e07b8b 100644
--- a/indra/newview/app_settings/shaders/class3/deferred/giFinalV.glsl
+++ b/indra/newview/app_settings/shaders/class3/deferred/giFinalV.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 543527612e..8dc1410ea5 100644
--- a/indra/newview/app_settings/shaders/class3/deferred/giV.glsl
+++ b/indra/newview/app_settings/shaders/class3/deferred/giV.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 d9483bc6e4..5f3bf68b24 100644
--- a/indra/newview/app_settings/shaders/class3/deferred/luminanceF.glsl
+++ b/indra/newview/app_settings/shaders/class3/deferred/luminanceF.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 6368def830..a24eda35dc 100644
--- a/indra/newview/app_settings/shaders/class3/deferred/luminanceV.glsl
+++ b/indra/newview/app_settings/shaders/class3/deferred/luminanceV.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 51ab579e3c..ab99a88971 100644
--- a/indra/newview/app_settings/shaders/class3/deferred/postDeferredF.glsl
+++ b/indra/newview/app_settings/shaders/class3/deferred/postDeferredF.glsl
@@ -4,7 +4,9 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/LicenseInfo$
*/
-
+
+#version 120
+
#extension GL_ARB_texture_rectangle : enable
uniform sampler2DRect diffuseRect;
diff --git a/indra/newview/app_settings/shaders/class3/deferred/postDeferredV.glsl b/indra/newview/app_settings/shaders/class3/deferred/postDeferredV.glsl
index 0ec81dcb02..12983baa94 100644
--- a/indra/newview/app_settings/shaders/class3/deferred/postDeferredV.glsl
+++ b/indra/newview/app_settings/shaders/class3/deferred/postDeferredV.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 24fa07f251..f037754708 100644
--- a/indra/newview/app_settings/shaders/class3/deferred/postgiF.glsl
+++ b/indra/newview/app_settings/shaders/class3/deferred/postgiF.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 e5f6217644..ae57227fe5 100644
--- a/indra/newview/app_settings/shaders/class3/deferred/postgiV.glsl
+++ b/indra/newview/app_settings/shaders/class3/deferred/postgiV.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 a2db247331..ce32f66000 100644
--- a/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl
+++ b/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 9d187b46e2..8f0bcca76b 100644
--- a/indra/newview/app_settings/shaders/class3/deferred/softenLightV.glsl
+++ b/indra/newview/app_settings/shaders/class3/deferred/softenLightV.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 1c1725a95c..c54d9a1e3e 100644
--- a/indra/newview/app_settings/shaders/class3/deferred/treeF.glsl
+++ b/indra/newview/app_settings/shaders/class3/deferred/treeF.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* $/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 2b44aedd5a..04533fdce1 100644
--- a/indra/newview/app_settings/shaders/class3/lighting/sumLightsSpecularV.glsl
+++ b/indra/newview/app_settings/shaders/class3/lighting/sumLightsSpecularV.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2005&license=viewerlgpl$
* $/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 329b0c4305..73bc18b866 100644
--- a/indra/newview/app_settings/shaders/class3/lighting/sumLightsV.glsl
+++ b/indra/newview/app_settings/shaders/class3/lighting/sumLightsV.glsl
@@ -4,6 +4,8 @@
* $LicenseInfo:firstyear=2005&license=viewerlgpl$
* $/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/ultra_graphics.xml b/indra/newview/app_settings/ultra_graphics.xml
index e1f3ca5769..71459e5470 100644
--- a/indra/newview/app_settings/ultra_graphics.xml
+++ b/indra/newview/app_settings/ultra_graphics.xml
@@ -4,15 +4,15 @@
<RenderAvatarCloth value="TRUE"/>
<!--Default for now-->
<RenderAvatarLODFactor value="1.0"/>
- <!--Default for now-->
- <RenderAvatarPhysicsLODFactor value="1.0"/>
+ <!--Default for now-->
+ <RenderAvatarPhysicsLODFactor value="1.0"/>
<!--NO SHADERS-->
<RenderAvatarVP value="TRUE"/>
<!--Short Range-->
<RenderFarClip value="256"/>
<!--Default for now-->
<RenderFlexTimeFactor value="1"/>
- <!--256... but they don't use this-->
+ <!--256... but they do not use this-->
<RenderGlowResolutionPow value="9"/>
<!--Low number-->
<RenderMaxPartCount value="4096"/>
@@ -26,8 +26,6 @@
<RenderTerrainLODFactor value="2.0"/>
<!--Default for now-->
<RenderTreeLODFactor value="1.0"/>
- <!--Default for now-->
- <RenderUseFBO value="1"/>
<!--Try Impostors-->
<RenderUseImpostors value="TRUE"/>
<!--Default for now-->
@@ -36,11 +34,10 @@
<VertexShaderEnable value="TRUE"/>
<!--NO SHADERS-->
<WindLightUseAtmosShaders value="TRUE"/>
- <!--Deferred Shading-->
- <RenderDeferred value="TRUE"/>
- <!--SSAO Enabled-->
- <RenderDeferredSSAO value="TRUE"/>
- <!--Full Shadows-->
- <RenderShadowDetail value="2"/>
-
+ <!--Deferred Shading-->
+ <RenderDeferred value="TRUE"/>
+ <!--SSAO Enabled-->
+ <RenderDeferredSSAO value="TRUE"/>
+ <!--Full Shadows-->
+ <RenderShadowDetail value="2"/>
</settings>
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/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml
index 85899603ee..5d6b10c047 100644
--- a/indra/newview/character/avatar_lad.xml
+++ b/indra/newview/character/avatar_lad.xml
@@ -4339,8 +4339,8 @@
wearable="shape"
edit_group="driven"
value_default="0"
- value_min="-2"
- value_max="2">
+ value_min="-3"
+ value_max="3">
<param_morph />
</param>
@@ -4352,8 +4352,8 @@
wearable="shape"
edit_group="driven"
value_default="0"
- value_min="-1"
- value_max="1">
+ value_min="-1.25"
+ value_max="1.25">
<param_morph />
</param>
@@ -11875,7 +11875,7 @@ render_pass="bump">
edit_group="physics_advanced"
value_default="0"
value_min="0"
- value_max=".1">
+ value_max="30">
<param_driver />
</param>
@@ -11887,9 +11887,9 @@ render_pass="bump">
label="Breast Physics Drag"
wearable="physics"
edit_group="physics_advanced"
- value_default=".15"
+ value_default="1"
value_min="0"
- value_max=".5">
+ value_max="10">
<param_driver />
</param>
@@ -11903,7 +11903,7 @@ render_pass="bump">
edit_group="physics_breasts_updown"
value_default="0"
value_min="0"
- value_max="1">
+ value_max="3">
<param_driver />
</param>
<param
@@ -11914,9 +11914,9 @@ render_pass="bump">
label="Breast Physics UpDown Spring"
wearable="physics"
edit_group="physics_breasts_updown"
- value_default=".1"
+ value_default="10"
value_min="0"
- value_max="1">
+ value_max="100">
<param_driver />
</param>
<param
@@ -11940,11 +11940,9 @@ render_pass="bump">
label="Breast Physics UpDown Damping"
wearable="physics"
edit_group="physics_breasts_updown"
- value_default=".05"
+ value_default=".2"
value_min="0"
- value_max=".1"
- camera_elevation=".3"
- camera_distance=".8">
+ value_max="1">
<param_driver />
</param>
@@ -11958,7 +11956,7 @@ render_pass="bump">
edit_group="physics_breasts_inout"
value_default="0"
value_min="0"
- value_max="1">
+ value_max="3">
<param_driver />
</param>
<param
@@ -11969,9 +11967,9 @@ render_pass="bump">
label="Breast Physics InOut Spring"
wearable="physics"
edit_group="physics_breasts_inout"
- value_default=".1"
+ value_default="10"
value_min="0"
- value_max="1">
+ value_max="100">
<param_driver />
</param>
<param
@@ -11995,9 +11993,9 @@ render_pass="bump">
label="Breast Physics InOut Damping"
wearable="physics"
edit_group="physics_breasts_inout"
- value_default=".05"
+ value_default=".2"
value_min="0"
- value_max=".1">
+ value_max="1">
<param_driver />
</param>
@@ -12022,7 +12020,7 @@ render_pass="bump">
edit_group="physics_advanced"
value_default="0"
value_min="0"
- value_max=".1">
+ value_max="30">
<param_driver />
</param>
<param
@@ -12032,9 +12030,9 @@ render_pass="bump">
label="Belly Physics Drag"
wearable="physics"
edit_group="physics_advanced"
- value_default=".15"
+ value_default="1"
value_min="0"
- value_max=".5">
+ value_max="10">
<param_driver />
</param>
<param
@@ -12046,7 +12044,7 @@ render_pass="bump">
edit_group="physics_belly_updown"
value_default="0"
value_min="0"
- value_max="1">
+ value_max="3">
<param_driver />
</param>
<param
@@ -12056,9 +12054,9 @@ render_pass="bump">
label="Belly Physics UpDown Spring"
wearable="physics"
edit_group="physics_belly_updown"
- value_default=".1"
+ value_default="10"
value_min="0"
- value_max="1">
+ value_max="100">
<param_driver />
</param>
<param
@@ -12080,9 +12078,9 @@ render_pass="bump">
label="Belly Physics UpDown Damping"
wearable="physics"
edit_group="physics_belly_updown"
- value_default=".05"
+ value_default=".2"
value_min="0"
- value_max=".1">
+ value_max="1">
<param_driver />
</param>
@@ -12107,7 +12105,7 @@ render_pass="bump">
edit_group="physics_advanced"
value_default="0"
value_min="0"
- value_max=".1">
+ value_max="30">
<param_driver />
</param>
<param
@@ -12117,9 +12115,9 @@ render_pass="bump">
label="Butt Physics Drag"
wearable="physics"
edit_group="physics_advanced"
- value_default=".15"
+ value_default="1"
value_min="0"
- value_max=".5">
+ value_max="10">
<param_driver />
</param>
@@ -12132,7 +12130,7 @@ render_pass="bump">
edit_group="physics_butt_updown"
value_default="0"
value_min="0"
- value_max="1">
+ value_max="3">
<param_driver />
</param>
<param
@@ -12142,9 +12140,9 @@ render_pass="bump">
label="Butt Physics UpDown Spring"
wearable="physics"
edit_group="physics_butt_updown"
- value_default=".1"
+ value_default="10"
value_min="0"
- value_max="1">
+ value_max="100">
<param_driver />
</param>
<param
@@ -12166,9 +12164,9 @@ render_pass="bump">
label="Butt Physics UpDown Damping"
wearable="physics"
edit_group="physics_butt_updown"
- value_default=".05"
+ value_default=".2"
value_min="0"
- value_max=".1">
+ value_max="1">
<param_driver />
</param>
@@ -12181,7 +12179,7 @@ render_pass="bump">
edit_group="physics_butt_leftright"
value_default="0"
value_min="0"
- value_max="1">
+ value_max="3">
<param_driver />
</param>
<param
@@ -12191,9 +12189,9 @@ render_pass="bump">
label="Butt Physics LeftRight Spring"
wearable="physics"
edit_group="physics_butt_leftright"
- value_default=".1"
+ value_default="10"
value_min="0"
- value_max="1">
+ value_max="100">
<param_driver />
</param>
<param
@@ -12215,9 +12213,9 @@ render_pass="bump">
label="Butt Physics LeftRight Damping"
wearable="physics"
edit_group="physics_butt_leftright"
- value_default=".05"
+ value_default=".2"
value_min="0"
- value_max=".1">
+ value_max="1">
<param_driver />
</param>
@@ -12231,7 +12229,7 @@ render_pass="bump">
edit_group="physics_breasts_leftright"
value_default="0"
value_min="0"
- value_max="1">
+ value_max="3">
<param_driver />
</param>
<param
@@ -12242,9 +12240,9 @@ render_pass="bump">
label="Breast Physics LeftRight Spring"
wearable="physics"
edit_group="physics_breasts_leftright"
- value_default=".1"
+ value_default="10"
value_min="0"
- value_max="1">
+ value_max="100">
<param_driver />
</param>
<param
@@ -12268,9 +12266,9 @@ render_pass="bump">
label="Breast Physics LeftRight Damping"
wearable="physics"
edit_group="physics_breasts_leftright"
- value_default=".05"
+ value_default=".2"
value_min="0"
- value_max=".1">
+ value_max="1">
<param_driver />
</param>
diff --git a/indra/newview/featuretable.txt b/indra/newview/featuretable.txt
index 15ad330418..dd8a88e558 100644
--- a/indra/newview/featuretable.txt
+++ b/indra/newview/featuretable.txt
@@ -1,4 +1,4 @@
-version 25
+version 27
// NOTE: This is mostly identical to featuretable_mac.txt with a few differences
// Should be combined into one table
@@ -40,6 +40,7 @@ RenderGround 1 1
RenderMaxPartCount 1 8192
RenderNightBrightness 1 1.0
RenderObjectBump 1 1
+RenderLocalLights 1 1
RenderReflectionDetail 1 4
RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 2.0
@@ -57,13 +58,12 @@ Disregard128DefaultDrawDistance 1 1
Disregard96DefaultDrawDistance 1 1
RenderTextureMemoryMultiple 1 1.0
RenderShaderLightingMaxLevel 1 3
+RenderDeferred 1 1
SkyUseClassicClouds 1 1
-RenderDeferred 1 0
-RenderDeferredSSAO 1 0
-RenderShadowDetail 1 0
+RenderDeferredSSAO 1 1
+RenderShadowDetail 1 2
WatchdogDisabled 1 1
RenderUseStreamVBO 1 1
-RenderUseFBO 1 1
//
// Low Graphics Settings
@@ -80,6 +80,7 @@ RenderFlexTimeFactor 1 0
RenderGlowResolutionPow 1 8
RenderMaxPartCount 1 0
RenderObjectBump 1 0
+RenderLocalLights 1 0
RenderReflectionDetail 1 0
RenderTerrainDetail 1 0
RenderTerrainLODFactor 1 1
@@ -94,7 +95,6 @@ SkyUseClassicClouds 1 0
RenderDeferred 1 0
RenderDeferredSSAO 1 0
RenderShadowDetail 1 0
-RenderUseFBO 1 0
//
// Mid Graphics Settings
@@ -110,6 +110,7 @@ RenderFlexTimeFactor 1 1.0
RenderGlowResolutionPow 1 8
RenderMaxPartCount 1 2048
RenderObjectBump 1 1
+RenderLocalLights 1 1
RenderReflectionDetail 1 0
RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 1.0
@@ -123,7 +124,6 @@ WLSkyDetail 1 48
RenderDeferred 1 0
RenderDeferredSSAO 1 0
RenderShadowDetail 1 0
-RenderUseFBO 1 0
//
// High Graphics Settings (purty)
@@ -132,13 +132,14 @@ list High
RenderAnisotropic 1 1
RenderAvatarCloth 1 0
RenderAvatarLODFactor 1 1.0
-RenderAvatarPhysicsLODFactor 1 0.9
+RenderAvatarPhysicsLODFactor 1 1.0
RenderAvatarVP 1 1
RenderFarClip 1 128
RenderFlexTimeFactor 1 1.0
RenderGlowResolutionPow 1 9
RenderMaxPartCount 1 4096
RenderObjectBump 1 1
+RenderLocalLights 1 1
RenderReflectionDetail 1 0
RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 2.0
@@ -152,7 +153,6 @@ WLSkyDetail 1 48
RenderDeferred 1 0
RenderDeferredSSAO 1 0
RenderShadowDetail 1 0
-RenderUseFBO 1 0
//
// Ultra graphics (REALLY PURTY!)
@@ -167,6 +167,7 @@ RenderFlexTimeFactor 1 1.0
RenderGlowResolutionPow 1 9
RenderMaxPartCount 1 8192
RenderObjectBump 1 1
+RenderLocalLights 1 1
RenderReflectionDetail 1 4
RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 2.0
@@ -177,10 +178,9 @@ RenderVolumeLODFactor 1 2.0
VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 1
WLSkyDetail 1 128
-RenderDeferred 1 0
-RenderDeferredSSAO 1 0
-RenderShadowDetail 1 0
-RenderUseFBO 1 0
+RenderDeferred 1 1
+RenderDeferredSSAO 1 1
+RenderShadowDetail 1 2
//
// Class Unknown Hardware (unknown)
@@ -238,6 +238,7 @@ RenderDeferred 0 0
RenderDeferredSSAO 0 0
RenderShadowDetail 0 0
+
//
// "Default" setups for safe, low, medium, high
//
@@ -246,6 +247,7 @@ RenderAnisotropic 1 0
RenderAvatarCloth 0 0
RenderAvatarVP 0 0
RenderObjectBump 0 0
+RenderLocalLights 1 0
RenderMaxPartCount 1 1024
RenderTerrainDetail 1 0
RenderUseImpostors 0 0
@@ -255,8 +257,8 @@ WindLightUseAtmosShaders 0 0
RenderDeferred 0 0
RenderDeferredSSAO 0 0
RenderShadowDetail 0 0
-RenderUseFBO 1 0
+
//
// CPU based feature masks
//
@@ -277,6 +279,9 @@ RenderObjectBump 0 0
list OpenGLPre15
RenderVBOEnable 1 0
+list OpenGLPre30
+RenderDeferred 0 0
+
list Intel
RenderAnisotropic 1 0
@@ -462,6 +467,11 @@ 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
+RenderVBOEnable 1 0
/// Tweaked NVIDIA
@@ -562,3 +572,4 @@ list NVIDIA_GeForce_Go_7800
RenderShaderLightingMaxLevel 1 2
list NVIDIA_GeForce_Go_7900
RenderShaderLightingMaxLevel 1 2
+
diff --git a/indra/newview/featuretable_linux.txt b/indra/newview/featuretable_linux.txt
index a2cd4b834c..058bdcc730 100644
--- a/indra/newview/featuretable_linux.txt
+++ b/indra/newview/featuretable_linux.txt
@@ -1,4 +1,4 @@
-version 22
+version 23
// NOTE: This is mostly identical to featuretable_mac.txt with a few differences
// Should be combined into one table
@@ -26,6 +26,7 @@ list all
RenderAnisotropic 1 1
RenderAvatarCloth 1 1
RenderAvatarLODFactor 1 1.0
+RenderAvatarPhysicsLODFactor 1 1.0
RenderAvatarMaxVisible 1 12
RenderAvatarVP 1 1
RenderCubeMap 1 1
@@ -36,6 +37,7 @@ RenderFogRatio 1 4.0
RenderGamma 1 0
RenderGlowResolutionPow 1 9
RenderGround 1 1
+RenderLocalLights 1 1
RenderMaxPartCount 1 8192
RenderNightBrightness 1 1.0
RenderObjectBump 1 1
@@ -57,11 +59,9 @@ Disregard96DefaultDrawDistance 1 1
RenderTextureMemoryMultiple 1 1.0
SkyUseClassicClouds 1 1
RenderShaderLightingMaxLevel 1 3
-RenderDeferred 1 0
-RenderDeferredSSAO 1 0
-RenderShadowDetail 1 0
-WatchdogDisabled 1 1
-RenderUseFBO 1 1
+RenderDeferred 1 1
+RenderDeferredSSAO 1 1
+RenderShadowDetail 1 2
//
// Low Graphics Settings
@@ -70,11 +70,13 @@ list Low
RenderAnisotropic 1 0
RenderAvatarCloth 1 0
RenderAvatarLODFactor 1 0
+RenderAvatarPhysicsLODFactor 1 0
RenderAvatarMaxVisible 1 3
RenderAvatarVP 1 0
RenderFarClip 1 64
RenderFlexTimeFactor 1 0
RenderGlowResolutionPow 1 8
+RenderLocalLights 1 0
RenderMaxPartCount 1 0
RenderObjectBump 1 0
RenderReflectionDetail 1 0
@@ -91,7 +93,6 @@ SkyUseClassicClouds 1 0
RenderDeferred 1 0
RenderDeferredSSAO 1 0
RenderShadowDetail 1 0
-RenderUseFBO 1 0
//
// Mid Graphics Settings
@@ -100,10 +101,12 @@ list Mid
RenderAnisotropic 1 0
RenderAvatarCloth 1 0
RenderAvatarLODFactor 1 0.5
+RenderAvatarPhysicsLODFactor 1 0.75
RenderAvatarVP 1 1
RenderFarClip 1 96
RenderFlexTimeFactor 1 1.0
RenderGlowResolutionPow 1 8
+RenderLocalLights 1 1
RenderMaxPartCount 1 2048
RenderObjectBump 1 1
RenderReflectionDetail 1 0
@@ -119,7 +122,6 @@ WLSkyDetail 1 48
RenderDeferred 1 0
RenderDeferredSSAO 1 0
RenderShadowDetail 1 0
-RenderUseFBO 1 0
//
// High Graphics Settings (purty)
@@ -128,10 +130,12 @@ list High
RenderAnisotropic 1 1
RenderAvatarCloth 1 0
RenderAvatarLODFactor 1 1.0
+RenderAvatarPhysicsLODFactor 1 1.0
RenderAvatarVP 1 1
RenderFarClip 1 128
RenderFlexTimeFactor 1 1.0
RenderGlowResolutionPow 1 9
+RenderLocalLights 1 1
RenderMaxPartCount 1 4096
RenderObjectBump 1 1
RenderReflectionDetail 1 0
@@ -147,7 +151,6 @@ WLSkyDetail 1 48
RenderDeferred 1 0
RenderDeferredSSAO 1 0
RenderShadowDetail 1 0
-RenderUseFBO 1 0
//
// Ultra graphics (REALLY PURTY!)
@@ -156,10 +159,12 @@ list Ultra
RenderAnisotropic 1 1
RenderAvatarCloth 1 1
RenderAvatarLODFactor 1 1.0
+RenderAvatarPhysicsLODFactor 1 1.0
RenderAvatarVP 1 1
RenderFarClip 1 256
RenderFlexTimeFactor 1 1.0
RenderGlowResolutionPow 1 9
+RenderLocalLights 1 1
RenderMaxPartCount 1 8192
RenderObjectBump 1 1
RenderReflectionDetail 1 4
@@ -172,10 +177,9 @@ RenderVolumeLODFactor 1 2.0
VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 1
WLSkyDetail 1 128
-RenderDeferred 1 0
-RenderDeferredSSAO 1 0
-RenderShadowDetail 1 0
-RenderUseFBO 1 0
+RenderDeferred 1 1
+RenderDeferredSSAO 1 1
+RenderShadowDetail 1 2
//
// Class Unknown Hardware (unknown)
@@ -250,7 +254,6 @@ WindLightUseAtmosShaders 0 0
RenderDeferred 0 0
RenderDeferredSSAO 0 0
RenderShadowDetail 0 0
-RenderUseFBO 1 0
//
diff --git a/indra/newview/featuretable_mac.txt b/indra/newview/featuretable_mac.txt
index 3ad7f4e892..e2b979d9e9 100644
--- a/indra/newview/featuretable_mac.txt
+++ b/indra/newview/featuretable_mac.txt
@@ -1,4 +1,4 @@
-version 22
+version 23
// NOTE: This is mostly identical to featuretable_mac.txt with a few differences
// Should be combined into one table
@@ -24,10 +24,11 @@ version 22
//
list all
RenderAnisotropic 1 0
-RenderAvatarCloth 0 0
+RenderAvatarCloth 1 1
RenderAvatarLODFactor 1 1.0
+RenderAvatarPhysicsLODFactor 1 1.0
RenderAvatarMaxVisible 1 12
-RenderAvatarVP 1 0
+RenderAvatarVP 1 1
RenderCubeMap 1 1
RenderDelayVBUpdate 1 0
RenderFarClip 1 256
@@ -36,11 +37,11 @@ RenderFogRatio 1 4.0
RenderGamma 1 0
RenderGlowResolutionPow 1 9
RenderGround 1 1
-RenderLightingDetail 1 1
+RenderLocalLights 1 1
RenderMaxPartCount 1 8192
RenderNightBrightness 1 1.0
RenderObjectBump 1 1
-RenderReflectionDetail 1 3
+RenderReflectionDetail 1 4
RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 2.0
RenderTransparentWater 1 1
@@ -48,20 +49,21 @@ RenderTreeLODFactor 1 1.0
RenderUseImpostors 1 1
RenderVBOEnable 1 1
RenderVolumeLODFactor 1 2.0
-RenderWaterReflections 1 1
+UseStartScreen 1 1
UseOcclusion 1 1
VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 1
WLSkyDetail 1 128
-RenderUseCleverUI 1 1
Disregard128DefaultDrawDistance 1 1
Disregard96DefaultDrawDistance 1 1
RenderTextureMemoryMultiple 1 0.5
-Disregard128DefaultDrawDistance 1 1
-Disregard96DefaultDrawDistance 1 1
+RenderShaderLightingMaxLevel 1 3
SkyUseClassicClouds 1 1
+RenderDeferred 1 1
+RenderDeferredSSAO 1 1
+RenderShadowDetail 1 2
WatchdogDisabled 1 1
-RenderUseFBO 1 1
+RenderUseStreamVBO 1 1
//
// Low Graphics Settings
@@ -70,12 +72,13 @@ list Low
RenderAnisotropic 1 0
RenderAvatarCloth 1 0
RenderAvatarLODFactor 1 0
+RenderAvatarPhysicsLODFactor 1 0
RenderAvatarMaxVisible 1 3
RenderAvatarVP 1 0
RenderFarClip 1 64
RenderFlexTimeFactor 1 0
RenderGlowResolutionPow 1 8
-RenderLightingDetail 1 0
+RenderLocalLights 1 0
RenderMaxPartCount 1 0
RenderObjectBump 1 0
RenderReflectionDetail 1 0
@@ -85,12 +88,13 @@ RenderTransparentWater 1 0
RenderTreeLODFactor 1 0
RenderUseImpostors 1 1
RenderVolumeLODFactor 1 0.5
-RenderWaterReflections 1 0
VertexShaderEnable 1 0
WindLightUseAtmosShaders 1 0
WLSkyDetail 1 48
SkyUseClassicClouds 1 0
-RenderUseFBO 1 0
+RenderDeferred 1 0
+RenderDeferredSSAO 1 0
+RenderShadowDetail 1 0
//
// Mid Graphics Settings
@@ -99,11 +103,12 @@ list Mid
RenderAnisotropic 1 0
RenderAvatarCloth 1 0
RenderAvatarLODFactor 1 0.5
+RenderAvatarPhysicsLODFactor 1 0.75
RenderAvatarVP 1 1
RenderFarClip 1 96
RenderFlexTimeFactor 1 1.0
RenderGlowResolutionPow 1 8
-RenderLightingDetail 1 1
+RenderLocalLights 1 1
RenderMaxPartCount 1 2048
RenderObjectBump 1 1
RenderReflectionDetail 1 0
@@ -113,11 +118,12 @@ RenderTransparentWater 1 1
RenderTreeLODFactor 1 0.5
RenderUseImpostors 1 1
RenderVolumeLODFactor 1 1.125
-RenderWaterReflections 1 0
VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 0
WLSkyDetail 1 48
-RenderUseFBO 1 0
+RenderDeferred 1 0
+RenderDeferredSSAO 1 0
+RenderShadowDetail 1 0
//
// High Graphics Settings (purty)
@@ -126,11 +132,12 @@ list High
RenderAnisotropic 1 1
RenderAvatarCloth 1 0
RenderAvatarLODFactor 1 1.0
+RenderAvatarPhysicsLODFactor 1 1.0
RenderAvatarVP 1 1
RenderFarClip 1 128
RenderFlexTimeFactor 1 1.0
RenderGlowResolutionPow 1 9
-RenderLightingDetail 1 1
+RenderLocalLights 1 1
RenderMaxPartCount 1 4096
RenderObjectBump 1 1
RenderReflectionDetail 1 0
@@ -140,11 +147,12 @@ RenderTransparentWater 1 1
RenderTreeLODFactor 1 0.5
RenderUseImpostors 1 1
RenderVolumeLODFactor 1 1.125
-RenderWaterReflections 1 0
VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 1
WLSkyDetail 1 48
-RenderUseFBO 1 0
+RenderDeferred 1 0
+RenderDeferredSSAO 1 0
+RenderShadowDetail 1 2
//
// Ultra graphics (REALLY PURTY!)
@@ -153,25 +161,27 @@ list Ultra
RenderAnisotropic 1 1
RenderAvatarCloth 1 1
RenderAvatarLODFactor 1 1.0
+RenderAvatarPhysicsLODFactor 1 1.0
RenderAvatarVP 1 1
RenderFarClip 1 256
RenderFlexTimeFactor 1 1.0
RenderGlowResolutionPow 1 9
-RenderLightingDetail 1 1
+RenderLocalLights 1 1
RenderMaxPartCount 1 8192
RenderObjectBump 1 1
-RenderReflectionDetail 1 3
+RenderReflectionDetail 1 4
RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 2.0
RenderTransparentWater 1 1
RenderTreeLODFactor 1 1.0
RenderUseImpostors 1 1
RenderVolumeLODFactor 1 2.0
-RenderWaterReflections 1 1
VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 1
WLSkyDetail 1 128
-RenderUseFBO 1 0
+RenderDeferred 1 0
+RenderDeferredSSAO 1 0
+RenderShadowDetail 1 2
//
// Class Unknown Hardware (unknown)
@@ -209,9 +219,12 @@ RenderVBOEnable 1 1
list NoPixelShaders
RenderAvatarVP 0 0
RenderAvatarCloth 0 0
-RenderWaterReflections 0 0
+RenderReflectionDetail 0 0
VertexShaderEnable 0 0
WindLightUseAtmosShaders 0 0
+RenderDeferred 0 0
+RenderDeferredSSAO 0 0
+RenderShadowDetail 0 0
//
// No Vertex Shaders available
@@ -219,25 +232,31 @@ WindLightUseAtmosShaders 0 0
list NoVertexShaders
RenderAvatarVP 0 0
RenderAvatarCloth 0 0
-RenderWaterReflections 0 0
+RenderReflectionDetail 0 0
VertexShaderEnable 0 0
WindLightUseAtmosShaders 0 0
+RenderDeferred 0 0
+RenderDeferredSSAO 0 0
+RenderShadowDetail 0 0
+//
// "Default" setups for safe, low, medium, high
//
list safe
RenderAnisotropic 1 0
RenderAvatarCloth 0 0
RenderAvatarVP 0 0
-RenderLightingDetail 1 0
+RenderLocalLights 1 0
RenderObjectBump 0 0
RenderMaxPartCount 1 1024
RenderTerrainDetail 1 0
RenderUseImpostors 0 0
RenderVBOEnable 1 0
-RenderWaterReflections 0 0
+RenderReflectionDetail 0 0
WindLightUseAtmosShaders 0 0
-RenderUseFBO 1 0
+RenderDeferred 0 0
+RenderDeferredSSAO 0 0
+RenderShadowDetail 0 0
//
// CPU based feature masks
@@ -259,13 +278,19 @@ RenderObjectBump 0 0
list OpenGLPre15
RenderVBOEnable 1 0
+list TexUnit8orLess
+RenderDeferredSSAO 0 0
+
+list ATI
+RenderDeferredSSAO 0 0
+
list Intel
RenderAnisotropic 1 0
-RenderLightingDetail 1 0
+RenderLocalLights 1 0
list GeForce2
RenderAnisotropic 1 0
-RenderLightingDetail 1 0
+RenderLocalLights 1 0
RenderMaxPartCount 1 2048
RenderTerrainDetail 1 0
RenderVBOEnable 1 1
@@ -382,7 +407,6 @@ list ATI_Radeon_X1500
Disregard128DefaultDrawDistance 1 0
list ATI_Radeon_X1600
Disregard128DefaultDrawDistance 1 0
-RenderUseFBO 0 0
list ATI_Radeon_X1700
Disregard128DefaultDrawDistance 1 0
list ATI_Mobility_Radeon_X1xxx
diff --git a/indra/newview/featuretable_xp.txt b/indra/newview/featuretable_xp.txt
index 38e6bb1e5e..3339172a1a 100644
--- a/indra/newview/featuretable_xp.txt
+++ b/indra/newview/featuretable_xp.txt
@@ -1,4 +1,4 @@
-version 25
+version 27
// NOTE: This is mostly identical to featuretable_mac.txt with a few differences
// Should be combined into one table
@@ -26,6 +26,7 @@ list all
RenderAnisotropic 1 1
RenderAvatarCloth 1 1
RenderAvatarLODFactor 1 1.0
+RenderAvatarPhysicsLODFactor 1 1.0
RenderAvatarMaxVisible 1 12
RenderAvatarVP 1 1
RenderCubeMap 1 1
@@ -36,6 +37,7 @@ RenderFogRatio 1 4.0
RenderGamma 1 0
RenderGlowResolutionPow 1 9
RenderGround 1 1
+RenderLocalLights 1 1
RenderMaxPartCount 1 8192
RenderNightBrightness 1 1.0
RenderObjectBump 1 1
@@ -60,7 +62,6 @@ SkyUseClassicClouds 1 1
RenderDeferred 1 0
RenderDeferredSSAO 1 0
RenderShadowDetail 1 0
-RenderUseFBO 1 1
WatchdogDisabled 1 1
RenderUseStreamVBO 1 1
@@ -71,11 +72,13 @@ list Low
RenderAnisotropic 1 0
RenderAvatarCloth 1 0
RenderAvatarLODFactor 1 0
+RenderAvatarPhysicsLODFactor 1 0
RenderAvatarMaxVisible 1 3
RenderAvatarVP 1 0
RenderFarClip 1 64
RenderFlexTimeFactor 1 0
RenderGlowResolutionPow 1 8
+RenderLocalLights 1 0
RenderMaxPartCount 1 0
RenderObjectBump 1 0
RenderReflectionDetail 1 0
@@ -92,7 +95,6 @@ SkyUseClassicClouds 1 0
RenderDeferred 1 0
RenderDeferredSSAO 1 0
RenderShadowDetail 1 0
-RenderUseFBO 1 0
//
// Mid Graphics Settings
@@ -101,10 +103,12 @@ list Mid
RenderAnisotropic 1 0
RenderAvatarCloth 1 0
RenderAvatarLODFactor 1 0.5
+RenderAvatarPhysicsLODFactor 1 0.75
RenderAvatarVP 1 1
RenderFarClip 1 96
RenderFlexTimeFactor 1 1.0
RenderGlowResolutionPow 1 8
+RenderLocalLights 1 1
RenderMaxPartCount 1 2048
RenderObjectBump 1 1
RenderReflectionDetail 1 0
@@ -120,7 +124,6 @@ WLSkyDetail 1 48
RenderDeferred 1 0
RenderDeferredSSAO 1 0
RenderShadowDetail 1 0
-RenderUseFBO 1 0
//
// High Graphics Settings (purty)
@@ -129,10 +132,12 @@ list High
RenderAnisotropic 1 1
RenderAvatarCloth 1 0
RenderAvatarLODFactor 1 1.0
+RenderAvatarPhysicsLODFactor 1 1.0
RenderAvatarVP 1 1
RenderFarClip 1 128
RenderFlexTimeFactor 1 1.0
RenderGlowResolutionPow 1 9
+RenderLocalLights 1 1
RenderMaxPartCount 1 4096
RenderObjectBump 1 1
RenderReflectionDetail 1 0
@@ -147,8 +152,7 @@ WindLightUseAtmosShaders 1 1
WLSkyDetail 1 48
RenderDeferred 1 0
RenderDeferredSSAO 1 0
-RenderShadowDetail 1 0
-RenderUseFBO 1 0
+RenderShadowDetail 1 2
//
// Ultra graphics (REALLY PURTY!)
@@ -157,10 +161,12 @@ list Ultra
RenderAnisotropic 1 1
RenderAvatarCloth 1 1
RenderAvatarLODFactor 1 1.0
+RenderAvatarPhysicsLODFactor 1 1.0
RenderAvatarVP 1 1
RenderFarClip 1 256
RenderFlexTimeFactor 1 1.0
RenderGlowResolutionPow 1 9
+RenderLocalLights 1 1
RenderMaxPartCount 1 8192
RenderObjectBump 1 1
RenderReflectionDetail 1 4
@@ -175,8 +181,7 @@ WindLightUseAtmosShaders 1 1
WLSkyDetail 1 128
RenderDeferred 1 0
RenderDeferredSSAO 1 0
-RenderShadowDetail 1 0
-RenderUseFBO 1 0
+RenderShadowDetail 1 2
//
// Class Unknown Hardware (unknown)
@@ -251,7 +256,6 @@ WindLightUseAtmosShaders 0 0
RenderDeferred 0 0
RenderDeferredSSAO 0 0
RenderShadowDetail 0 0
-RenderUseFBO 1 0
//
// CPU based feature masks
@@ -273,6 +277,9 @@ RenderObjectBump 0 0
list OpenGLPre15
RenderVBOEnable 1 0
+list OpenGLPre30
+RenderDeferred 0 0
+
list Intel
RenderAnisotropic 1 0
@@ -459,6 +466,11 @@ 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
+RenderVBOEnable 1 0
/// Tweaked NVIDIA
diff --git a/indra/newview/gpu_table.txt b/indra/newview/gpu_table.txt
index da888bc64d..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,304 +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 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 4500 .*Quadro.*FX.*4500.* 3 1
-NVIDIA Quadro FX .*Quadro FX.* 1 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/installers/windows/installer_template.nsi b/indra/newview/installers/windows/installer_template.nsi
index 4e8ed807ee..b5d43021ec 100644
--- a/indra/newview/installers/windows/installer_template.nsi
+++ b/indra/newview/installers/windows/installer_template.nsi
@@ -211,6 +211,25 @@ continue_install:
FunctionEnd
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Checks for CPU valid (must have SSE2 support)
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+Function CheckCPUFlags
+ Call GetWindowsVersion
+ Pop $R0
+ StrCmp $R0 "2000" OK_SSE ; sse check not available on win2k.
+
+ Push $1
+ System::Call 'kernel32::IsProcessorFeaturePresent(i) i(10) .r1'
+ IntCmp $1 1 OK_SSE
+ MessageBox MB_OKCANCEL $(MissingSSE2) /SD IDOK IDOK OK_SSE
+ Quit
+
+ OK_SSE:
+ Pop $1
+ Return
+FunctionEnd
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Close the program, if running. Modifies no variables.
; Allows user to bail out of install process.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -744,6 +763,7 @@ StrCpy $INSTEXE "${INSTEXE}"
StrCpy $INSTSHORTCUT "${SHORTCUT}"
Call CheckWindowsVersion ; warn if on Windows 98/ME
+Call CheckCPUFlags ; Make sure we have SSE2 support
Call CheckIfAdministrator ; Make sure the user can install/uninstall
Call CheckIfAlreadyCurrent ; Make sure that we haven't already installed this version
Call CloseSecondLife ; Make sure we're not running
diff --git a/indra/newview/installers/windows/lang_en-us.nsi b/indra/newview/installers/windows/lang_en-us.nsi
index a01541377d..da0d7f54d2 100644
--- a/indra/newview/installers/windows/lang_en-us.nsi
+++ b/indra/newview/installers/windows/lang_en-us.nsi
Binary files differ
diff --git a/indra/newview/licenses-mac.txt b/indra/newview/licenses-mac.txt
index 1324fa1a86..af80bff5d9 100644
--- a/indra/newview/licenses-mac.txt
+++ b/indra/newview/licenses-mac.txt
@@ -315,516 +315,6 @@ This product includes cryptographic software written by Eric Young
Hudson (tjh@cryptsoft.com).
-===========
-Pth License
-===========
- ____ _ _
- | _ \| |_| |__ ``Ian Fleming was a UNIX fan!
- | |_) | __| '_ \ How do I know? Well, James Bond
- | __/| |_| | | | had the (license to kill) number 007,
- |_| \__|_| |_| i.e., he could execute anyone!''
-
- GNU Pth - The GNU Portable Threads
-
- LICENSE
- =======
-
- This library is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- For some people, it is not clear, what is the real intention of the
- author by using the GNU Lesser General Public License (LGPL) as the
- distribution license for GNU Pth. This is, because the LGPL and the
- GPL can be (and are often) interpreted very differently and some
- interpretations seem to be not compatible with others. So an explicit
- clarification for the use of the LGPL for GNU Pth from the authors
- point of view might be useful.
-
- The author places this library under the LGPL to make sure that it
- can be used both commercially and non-commercially provided that
- modifications to the code base are always donated back to the official
- code base under the same license conditions. Please keep in mind that
- especially using this library in code not staying under the GPL or
- the LGPL _is_ allowed and that any taint or license creap into code
- that uses the library is not the authors intention. It is just the
- case that _including_ this library into the source tree of other
- applications is a little bit more inconvinient because of the LGPL.
- But it has to be this way for good reasons. And keep in mind that
- inconvinient doesn't mean not allowed or even impossible.
-
- Even if you want to use this library in some BSD-style licensed
- packages, this _is_ possible as long as you are a little bit
- carefully. Usually this means you have to make sure that the code is
- still clearly separated into the source tree and that modifications to
- this source area are done under the conditions of the LGPL. Read below
- for more details on the conditions. Contact the author if you have
- more questions.
-
- The license text of the GNU Lesser General Public License follows:
- __________________________________________________________________________
-
- GNU LESSER GENERAL PUBLIC LICENSE
- Version 2.1, February 1999
-
- Copyright (C) 1991, 1999 Free Software Foundation, Inc.
- 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-[This is the first released version of the Lesser GPL. It also counts
- as the successor of the GNU Library Public License, version 2, hence
- the version number 2.1.]
-
- Preamble
-
- The licenses for most software are designed to take away your
-freedom to share and change it. By contrast, the GNU General Public
-Licenses are intended to guarantee your freedom to share and change
-free software--to make sure the software is free for all its users.
-
- This license, the Lesser General Public License, applies to some
-specially designated software packages--typically libraries--of the
-Free Software Foundation and other authors who decide to use it. You
-can use it too, but we suggest you first think carefully about whether
-this license or the ordinary General Public License is the better
-strategy to use in any particular case, based on the explanations below.
-
- When we speak of free software, we are referring to freedom of use,
-not price. Our General Public Licenses are designed to make sure that
-you have the freedom to distribute copies of free software (and charge
-for this service if you wish); that you receive source code or can get
-it if you want it; that you can change the software and use pieces of
-it in new free programs; and that you are informed that you can do
-these things.
-
- To protect your rights, we need to make restrictions that forbid
-distributors to deny you these rights or to ask you to surrender these
-rights. These restrictions translate to certain responsibilities for
-you if you distribute copies of the library or if you modify it.
-
- For example, if you distribute copies of the library, whether gratis
-or for a fee, you must give the recipients all the rights that we gave
-you. You must make sure that they, too, receive or can get the source
-code. If you link other code with the library, you must provide
-complete object files to the recipients, so that they can relink them
-with the library after making changes to the library and recompiling
-it. And you must show them these terms so they know their rights.
-
- We protect your rights with a two-step method: (1) we copyright the
-library, and (2) we offer you this license, which gives you legal
-permission to copy, distribute and/or modify the library.
-
- To protect each distributor, we want to make it very clear that
-there is no warranty for the free library. Also, if the library is
-modified by someone else and passed on, the recipients should know
-that what they have is not the original version, so that the original
-author's reputation will not be affected by problems that might be
-introduced by others.
-
- Finally, software patents pose a constant threat to the existence of
-any free program. We wish to make sure that a company cannot
-effectively restrict the users of a free program by obtaining a
-restrictive license from a patent holder. Therefore, we insist that
-any patent license obtained for a version of the library must be
-consistent with the full freedom of use specified in this license.
-
- Most GNU software, including some libraries, is covered by the
-ordinary GNU General Public License. This license, the GNU Lesser
-General Public License, applies to certain designated libraries, and
-is quite different from the ordinary General Public License. We use
-this license for certain libraries in order to permit linking those
-libraries into non-free programs.
-
- When a program is linked with a library, whether statically or using
-a shared library, the combination of the two is legally speaking a
-combined work, a derivative of the original library. The ordinary
-General Public License therefore permits such linking only if the
-entire combination fits its criteria of freedom. The Lesser General
-Public License permits more lax criteria for linking other code with
-the library.
-
- We call this license the "Lesser" General Public License because it
-does Less to protect the user's freedom than the ordinary General
-Public License. It also provides other free software developers Less
-of an advantage over competing non-free programs. These disadvantages
-are the reason we use the ordinary General Public License for many
-libraries. However, the Lesser license provides advantages in certain
-special circumstances.
-
- For example, on rare occasions, there may be a special need to
-encourage the widest possible use of a certain library, so that it becomes
-a de-facto standard. To achieve this, non-free programs must be
-allowed to use the library. A more frequent case is that a free
-library does the same job as widely used non-free libraries. In this
-case, there is little to gain by limiting the free library to free
-software only, so we use the Lesser General Public License.
-
- In other cases, permission to use a particular library in non-free
-programs enables a greater number of people to use a large body of
-free software. For example, permission to use the GNU C Library in
-non-free programs enables many more people to use the whole GNU
-operating system, as well as its variant, the GNU/Linux operating
-system.
-
- Although the Lesser General Public License is Less protective of the
-users' freedom, it does ensure that the user of a program that is
-linked with the Library has the freedom and the wherewithal to run
-that program using a modified version of the Library.
-
- The precise terms and conditions for copying, distribution and
-modification follow. Pay close attention to the difference between a
-"work based on the library" and a "work that uses the library". The
-former contains code derived from the library, whereas the latter must
-be combined with the library in order to run.
-
- GNU LESSER GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
- 0. This License Agreement applies to any software library or other
-program which contains a notice placed by the copyright holder or
-other authorized party saying it may be distributed under the terms of
-this Lesser General Public License (also called "this License").
-Each licensee is addressed as "you".
-
- A "library" means a collection of software functions and/or data
-prepared so as to be conveniently linked with application programs
-(which use some of those functions and data) to form executables.
-
- The "Library", below, refers to any such software library or work
-which has been distributed under these terms. A "work based on the
-Library" means either the Library or any derivative work under
-copyright law: that is to say, a work containing the Library or a
-portion of it, either verbatim or with modifications and/or translated
-straightforwardly into another language. (Hereinafter, translation is
-included without limitation in the term "modification".)
-
- "Source code" for a work means the preferred form of the work for
-making modifications to it. For a library, complete source code means
-all the source code for all modules it contains, plus any associated
-interface definition files, plus the scripts used to control compilation
-and installation of the library.
-
- Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope. The act of
-running a program using the Library is not restricted, and output from
-such a program is covered only if its contents constitute a work based
-on the Library (independent of the use of the Library in a tool for
-writing it). Whether that is true depends on what the Library does
-and what the program that uses the Library does.
-
- 1. You may copy and distribute verbatim copies of the Library's
-complete source code as you receive it, in any medium, provided that
-you conspicuously and appropriately publish on each copy an
-appropriate copyright notice and disclaimer of warranty; keep intact
-all the notices that refer to this License and to the absence of any
-warranty; and distribute a copy of this License along with the
-Library.
-
- You may charge a fee for the physical act of transferring a copy,
-and you may at your option offer warranty protection in exchange for a
-fee.
-
- 2. You may modify your copy or copies of the Library or any portion
-of it, thus forming a work based on the Library, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
- a) The modified work must itself be a software library.
-
- b) You must cause the files modified to carry prominent notices
- stating that you changed the files and the date of any change.
-
- c) You must cause the whole of the work to be licensed at no
- charge to all third parties under the terms of this License.
-
- d) If a facility in the modified Library refers to a function or a
- table of data to be supplied by an application program that uses
- the facility, other than as an argument passed when the facility
- is invoked, then you must make a good faith effort to ensure that,
- in the event an application does not supply such function or
- table, the facility still operates, and performs whatever part of
- its purpose remains meaningful.
-
- (For example, a function in a library to compute square roots has
- a purpose that is entirely well-defined independent of the
- application. Therefore, Subsection 2d requires that any
- application-supplied function or table used by this function must
- be optional: if the application does not supply it, the square
- root function must still compute square roots.)
-
-These requirements apply to the modified work as a whole. If
-identifiable sections of that work are not derived from the Library,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works. But when you
-distribute the same sections as part of a whole which is a work based
-on the Library, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote
-it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Library.
-
-In addition, mere aggregation of another work not based on the Library
-with the Library (or with a work based on the Library) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
- 3. You may opt to apply the terms of the ordinary GNU General Public
-License instead of this License to a given copy of the Library. To do
-this, you must alter all the notices that refer to this License, so
-that they refer to the ordinary GNU General Public License, version 2,
-instead of to this License. (If a newer version than version 2 of the
-ordinary GNU General Public License has appeared, then you can specify
-that version instead if you wish.) Do not make any other change in
-these notices.
-
- Once this change is made in a given copy, it is irreversible for
-that copy, so the ordinary GNU General Public License applies to all
-subsequent copies and derivative works made from that copy.
-
- This option is useful when you wish to copy part of the code of
-the Library into a program that is not a library.
-
- 4. You may copy and distribute the Library (or a portion or
-derivative of it, under Section 2) in object code or executable form
-under the terms of Sections 1 and 2 above provided that you accompany
-it with the complete corresponding machine-readable source code, which
-must be distributed under the terms of Sections 1 and 2 above on a
-medium customarily used for software interchange.
-
- If distribution of object code is made by offering access to copy
-from a designated place, then offering equivalent access to copy the
-source code from the same place satisfies the requirement to
-distribute the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
- 5. A program that contains no derivative of any portion of the
-Library, but is designed to work with the Library by being compiled or
-linked with it, is called a "work that uses the Library". Such a
-work, in isolation, is not a derivative work of the Library, and
-therefore falls outside the scope of this License.
-
- However, linking a "work that uses the Library" with the Library
-creates an executable that is a derivative of the Library (because it
-contains portions of the Library), rather than a "work that uses the
-library". The executable is therefore covered by this License.
-Section 6 states terms for distribution of such executables.
-
- When a "work that uses the Library" uses material from a header file
-that is part of the Library, the object code for the work may be a
-derivative work of the Library even though the source code is not.
-Whether this is true is especially significant if the work can be
-linked without the Library, or if the work is itself a library. The
-threshold for this to be true is not precisely defined by law.
-
- If such an object file uses only numerical parameters, data
-structure layouts and accessors, and small macros and small inline
-functions (ten lines or less in length), then the use of the object
-file is unrestricted, regardless of whether it is legally a derivative
-work. (Executables containing this object code plus portions of the
-Library will still fall under Section 6.)
-
- Otherwise, if the work is a derivative of the Library, you may
-distribute the object code for the work under the terms of Section 6.
-Any executables containing that work also fall under Section 6,
-whether or not they are linked directly with the Library itself.
-
- 6. As an exception to the Sections above, you may also combine or
-link a "work that uses the Library" with the Library to produce a
-work containing portions of the Library, and distribute that work
-under terms of your choice, provided that the terms permit
-modification of the work for the customer's own use and reverse
-engineering for debugging such modifications.
-
- You must give prominent notice with each copy of the work that the
-Library is used in it and that the Library and its use are covered by
-this License. You must supply a copy of this License. If the work
-during execution displays copyright notices, you must include the
-copyright notice for the Library among them, as well as a reference
-directing the user to the copy of this License. Also, you must do one
-of these things:
-
- a) Accompany the work with the complete corresponding
- machine-readable source code for the Library including whatever
- changes were used in the work (which must be distributed under
- Sections 1 and 2 above); and, if the work is an executable linked
- with the Library, with the complete machine-readable "work that
- uses the Library", as object code and/or source code, so that the
- user can modify the Library and then relink to produce a modified
- executable containing the modified Library. (It is understood
- that the user who changes the contents of definitions files in the
- Library will not necessarily be able to recompile the application
- to use the modified definitions.)
-
- b) Use a suitable shared library mechanism for linking with the
- Library. A suitable mechanism is one that (1) uses at run time a
- copy of the library already present on the user's computer system,
- rather than copying library functions into the executable, and (2)
- will operate properly with a modified version of the library, if
- the user installs one, as long as the modified version is
- interface-compatible with the version that the work was made with.
-
- c) Accompany the work with a written offer, valid for at
- least three years, to give the same user the materials
- specified in Subsection 6a, above, for a charge no more
- than the cost of performing this distribution.
-
- d) If distribution of the work is made by offering access to copy
- from a designated place, offer equivalent access to copy the above
- specified materials from the same place.
-
- e) Verify that the user has already received a copy of these
- materials or that you have already sent this user a copy.
-
- For an executable, the required form of the "work that uses the
-Library" must include any data and utility programs needed for
-reproducing the executable from it. However, as a special exception,
-the materials to be distributed need not include anything that is
-normally distributed (in either source or binary form) with the major
-components (compiler, kernel, and so on) of the operating system on
-which the executable runs, unless that component itself accompanies
-the executable.
-
- It may happen that this requirement contradicts the license
-restrictions of other proprietary libraries that do not normally
-accompany the operating system. Such a contradiction means you cannot
-use both them and the Library together in an executable that you
-distribute.
-
- 7. You may place library facilities that are a work based on the
-Library side-by-side in a single library together with other library
-facilities not covered by this License, and distribute such a combined
-library, provided that the separate distribution of the work based on
-the Library and of the other library facilities is otherwise
-permitted, and provided that you do these two things:
-
- a) Accompany the combined library with a copy of the same work
- based on the Library, uncombined with any other library
- facilities. This must be distributed under the terms of the
- Sections above.
-
- b) Give prominent notice with the combined library of the fact
- that part of it is a work based on the Library, and explaining
- where to find the accompanying uncombined form of the same work.
-
- 8. You may not copy, modify, sublicense, link with, or distribute
-the Library except as expressly provided under this License. Any
-attempt otherwise to copy, modify, sublicense, link with, or
-distribute the Library is void, and will automatically terminate your
-rights under this License. However, parties who have received copies,
-or rights, from you under this License will not have their licenses
-terminated so long as such parties remain in full compliance.
-
- 9. You are not required to accept this License, since you have not
-signed it. However, nothing else grants you permission to modify or
-distribute the Library or its derivative works. These actions are
-prohibited by law if you do not accept this License. Therefore, by
-modifying or distributing the Library (or any work based on the
-Library), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Library or works based on it.
-
- 10. Each time you redistribute the Library (or any work based on the
-Library), the recipient automatically receives a license from the
-original licensor to copy, distribute, link with or modify the Library
-subject to these terms and conditions. You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties with
-this License.
-
- 11. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Library at all. For example, if a patent
-license would not permit royalty-free redistribution of the Library by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Library.
-
-If any portion of this section is held invalid or unenforceable under any
-particular circumstance, the balance of the section is intended to apply,
-and the section as a whole is intended to apply in other circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system which is
-implemented by public license practices. Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
- 12. If the distribution and/or use of the Library is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Library under this License may add
-an explicit geographical distribution limitation excluding those countries,
-so that distribution is permitted only in or among countries not thus
-excluded. In such case, this License incorporates the limitation as if
-written in the body of this License.
-
- 13. The Free Software Foundation may publish revised and/or new
-versions of the Lesser General Public License from time to time.
-Such new versions will be similar in spirit to the present version,
-but may differ in detail to address new problems or concerns.
-
-Each version is given a distinguishing version number. If the Library
-specifies a version number of this License which applies to it and
-"any later version", you have the option of following the terms and
-conditions either of that version or of any later version published by
-the Free Software Foundation. If the Library does not specify a
-license version number, you may choose any version ever published by
-the Free Software Foundation.
-
- 14. If you wish to incorporate parts of the Library into other free
-programs whose distribution conditions are incompatible with these,
-write to the author to ask for permission. For software which is
-copyrighted by the Free Software Foundation, write to the Free
-Software Foundation; we sometimes make exceptions for this. Our
-decision will be guided by the two goals of preserving the free status
-of all derivatives of our free software and of promoting the sharing
-and reuse of software generally.
-
- NO WARRANTY
-
- 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
-WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
-EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
-OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
-KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
-LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
-THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
- 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
-WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
-AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
-FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
-CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
-LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
-RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
-FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGES.
-
- END OF TERMS AND CONDITIONS
-
-
=======================
Original SSLeay License
=======================
diff --git a/indra/newview/licenses-win32.txt b/indra/newview/licenses-win32.txt
index 7e6d4b4561..8736626907 100644
--- a/indra/newview/licenses-win32.txt
+++ b/indra/newview/licenses-win32.txt
@@ -769,3 +769,72 @@ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+=============
+GLOD license
+=============
+The GLOD Open-Source License Version 1.0 June 16, 2004
+
+Copyright (C) 2003-04 Jonathan Cohen, Nat Duca, Chris Niski, Johns
+Hopkins University and David Luebke, Brenden Schubert, University of
+Virginia. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, is permitted provided that the following conditions are
+met:
+
+1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer and
+ request.
+
+2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer and
+ request in the documentation and/or other materials provided with
+ the distribution.
+
+3. The name "GLOD" must not be used to endorse or promote products
+ derived from this software without prior written permission.
+
+4. Redistributions of any modified version of this source, whether in
+ source or binary form , must include a form of the following
+ acknowledgment: "This product is derived from the GLOD library,
+ which is available from http://www.cs.jhu.edu/~graphics/GLOD."
+
+5. Redistributions of any modified version of this source in binary
+ form must provide, free of charge, access to the modified version
+ of the code.
+
+6. This license shall be governed by and construed and enforced in
+ accordance with the laws of the State of Maryland, without
+ reference to its conflicts of law provisions. The exclusive
+ jurisdiction and venue for all legal actions relating to this
+ license shall be in courts of competent subject matter jurisdiction
+ located in the State of Maryland.
+
+TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, GLOD IS PROVIDED
+UNDER THIS LICENSE ON AN AS IS BASIS, WITHOUT WARRANTY OF ANY KIND,
+EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES
+THAT GLOD IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR
+PURPOSE OR NON-INFRINGING. ALL WARRANTIES ARE DISCLAIMED AND THE
+ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE CODE IS WITH
+YOU. SHOULD ANY CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE
+COPYRIGHT HOLDER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY
+NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY
+CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY CODE IS
+AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
+
+TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, IN NO EVENT SHALL
+THE COPYRIGHT HOLDER OR ANY OTHER CONTRIBUTOR BE LIABLE FOR ANY
+SPECIAL, INCIDENTAL, INDIRECT, OR CONSEQUENTIAL DAMAGES FOR LOSS OF
+PROFITS, REVENUE, OR FOR LOSS OF INFORMATION OR ANY OTHER LOSS.
+
+YOU EXPRESSLY AGREE TO FOREVER INDEMNIFY, DEFEND AND HOLD HARMLESS THE
+COPYRIGHT HOLDERS AND CONTRIBUTORS OF GLOD AGAINST ALL CLAIMS,
+DEMANDS, SUITS OR OTHER ACTIONS ARISING DIRECTLY OR INDIRECTLY FROM
+YOUR ACCEPTANCE AND USE OF GLOD.
+
+Although NOT REQUIRED, we would appreciate it if active users of GLOD
+put a link on their web site to the GLOD web site when possible.
+
+
diff --git a/indra/newview/linux_tools/wrapper.sh b/indra/newview/linux_tools/wrapper.sh
index d2df968544..283a28a0aa 100755
--- a/indra/newview/linux_tools/wrapper.sh
+++ b/indra/newview/linux_tools/wrapper.sh
@@ -92,23 +92,23 @@ cd "${RUN_PATH}"
## subprocesses that care.
export SAVED_LD_LIBRARY_PATH="${LD_LIBRARY_PATH}"
-if [ -n "$LL_TCMALLOC" ]; then
- tcmalloc_libs='/usr/lib/libtcmalloc.so.0 /usr/lib/libstacktrace.so.0 /lib/libpthread.so.0'
- all=1
- for f in $tcmalloc_libs; do
- if [ ! -f $f ]; then
- all=0
- fi
- done
- if [ $all != 1 ]; then
- echo 'Cannot use tcmalloc libraries: components missing' 1>&2
- else
- export LD_PRELOAD=$(echo $tcmalloc_libs | tr ' ' :)
- if [ -z "$HEAPCHECK" -a -z "$HEAPPROFILE" ]; then
- export HEAPCHECK=${HEAPCHECK:-normal}
- fi
- fi
-fi
+# if [ -n "$LL_TCMALLOC" ]; then
+# tcmalloc_libs='/usr/lib/libtcmalloc.so.0 /usr/lib/libstacktrace.so.0 /lib/libpthread.so.0'
+# all=1
+# for f in $tcmalloc_libs; do
+# if [ ! -f $f ]; then
+# all=0
+# fi
+# done
+# if [ $all != 1 ]; then
+# echo 'Cannot use tcmalloc libraries: components missing' 1>&2
+# else
+# export LD_PRELOAD=$(echo $tcmalloc_libs | tr ' ' :)
+# if [ -z "$HEAPCHECK" -a -z "$HEAPPROFILE" ]; then
+# export HEAPCHECK=${HEAPCHECK:-normal}
+# fi
+# fi
+#fi
export SL_ENV='LD_LIBRARY_PATH="`pwd`"/lib:"${LD_LIBRARY_PATH}"'
export SL_CMD='$LL_WRAPPER bin/do-not-directly-run-secondlife-bin'
diff --git a/indra/newview/llaccountingquotamanager.cpp b/indra/newview/llaccountingquotamanager.cpp
new file mode 100644
index 0000000000..0a171959e7
--- /dev/null
+++ b/indra/newview/llaccountingquotamanager.cpp
@@ -0,0 +1,258 @@
+/**
+ * @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 VOContent = content.has("Objects");
+ bool containsParcel = content.has("parcel");
+ bool containsSelection = content.has("selected");
+ //bool VORegion = content.has("region");
+
+ //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
+ S32 parcelId = 0;
+ S32 parcelOwner = 0;
+ if ( content["parcel"][i].has("parcel_id") )
+ {
+ parcelId = content["parcel"][i]["parcel_id"].asInteger();
+ }
+ 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 totalRenderCost = 0;
+ F32 totalPhysicsCost = 0;
+ F32 totalNetworkCost = 0;
+ F32 totalSimulationCost = 0;
+
+ if ( content["parcel"][i].has("owner") )
+ {
+ ownerRenderCost = content["parcel"][i]["owner"]["render"].asReal();
+ ownerPhysicsCost = content["parcel"][i]["owner"]["physics"].asReal();
+ ownerNetworkCost = content["parcel"][i]["owner"]["network"].asReal();
+ ownerSimulationCost = content["parcel"][i]["owner"]["simulation"].asReal();
+
+ }
+ if ( content["parcel"][i].has("group") )
+ {
+ groupRenderCost = content["parcel"][i]["group"]["render"].asReal();
+ groupPhysicsCost = content["parcel"][i]["group"]["physics"].asReal();
+ groupNetworkCost = content["parcel"][i]["group"]["network"].asReal();
+ groupSimulationCost = content["parcel"][i]["group"]["simulation"].asReal();
+
+ }
+ if ( content["parcel"][i].has("other") )
+ {
+ otherRenderCost = content["parcel"][i]["other"]["render"].asReal();
+ otherPhysicsCost = content["parcel"][i]["other"]["physics"].asReal();
+ otherNetworkCost = content["parcel"][i]["other"]["network"].asReal();
+ otherSimulationCost = content["parcel"][i]["other"]["simulation"].asReal();
+ }
+
+ if ( content["parcel"][i].has("total") )
+ {
+ totalRenderCost = content["parcel"][i]["total"]["render"].asReal();
+ totalPhysicsCost = content["parcel"][i]["total"]["physics"].asReal();
+ totalNetworkCost = content["parcel"][i]["total"]["network"].asReal();
+ totalSimulationCost = content["parcel"][i]["total"]["simulation"].asReal();
+
+ }
+
+ ParcelQuota parcelQuota( ownerRenderCost, ownerPhysicsCost, ownerNetworkCost, ownerSimulationCost,
+ groupRenderCost, groupPhysicsCost, groupNetworkCost, groupSimulationCost,
+ otherRenderCost, otherPhysicsCost, otherNetworkCost, otherSimulationCost,
+ totalRenderCost, totalPhysicsCost, totalNetworkCost, totalSimulationCost );
+ //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;
+
+ S32 localId = 0;
+
+ localId = content["selected"][i]["local_id"].asInteger();
+ renderCost = content["selected"][i]["render"].asReal();
+ physicsCost = content["selected"][i]["physics"].asReal();
+ networkCost = content["selected"][i]["network"].asReal();
+ simulationCost = content["selected"][i]["simulation"].asReal();
+
+ SelectionQuota selectionQuota( localId, renderCost, physicsCost, networkCost, simulationCost );
+
+ //Update the objects
+ //gObjectList.updateQuota( localId, 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 7d491a7774..446ded8096 100644
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -25,10 +25,12 @@
*/
#include "llviewerprecompiledheaders.h"
+
#include "llagent.h"
#include "pipeline.h"
+#include "llagentaccess.h"
#include "llagentcamera.h"
#include "llagentlistener.h"
#include "llagentwearables.h"
@@ -36,6 +38,7 @@
#include "llanimationstates.h"
#include "llbottomtray.h"
#include "llcallingcard.h"
+#include "llcapabilitylistener.h"
#include "llchannelmanager.h"
#include "llconsole.h"
#include "llfirstuse.h"
@@ -55,13 +58,16 @@
#include "llpaneltopinfobar.h"
#include "llparcel.h"
#include "llrendersphere.h"
+#include "llsdmessage.h"
#include "llsdutil.h"
#include "llsky.h"
+#include "llslurl.h"
#include "llsmoothstep.h"
#include "llstartup.h"
#include "llstatusbar.h"
#include "llteleportflags.h"
#include "lltool.h"
+#include "lltoolpie.h"
#include "lltoolmgr.h"
#include "lltrans.h"
#include "llurlentry.h"
@@ -73,6 +79,7 @@
#include "llviewerobjectlist.h"
#include "llviewerparcelmgr.h"
#include "llviewerstats.h"
+#include "llviewerwindow.h"
#include "llvoavatarself.h"
#include "llwindow.h"
#include "llworld.h"
@@ -171,7 +178,8 @@ LLAgent::LLAgent() :
mbRunning(false),
mbTeleportKeepsLookAt(false),
- mAgentAccess(gSavedSettings),
+ mAgentAccess(new LLAgentAccess(gSavedSettings)),
+ mTeleportSourceSLURL(new LLSLURL),
mTeleportState( TELEPORT_NONE ),
mRegionp(NULL),
@@ -198,6 +206,7 @@ LLAgent::LLAgent() :
mAutoPilot(FALSE),
mAutoPilotFlyOnStop(FALSE),
+ mAutoPilotAllowFlying(TRUE),
mAutoPilotTargetGlobal(),
mAutoPilotStopDistance(1.f),
mAutoPilotUseRotation(FALSE),
@@ -208,7 +217,7 @@ LLAgent::LLAgent() :
mAutoPilotFinishedCallback(NULL),
mAutoPilotCallbackData(NULL),
- mEffectColor(LLColor4(0.f, 1.f, 1.f, 1.f)),
+ mEffectColor(new LLUIColor(LLColor4(0.f, 1.f, 1.f, 1.f))),
mHaveHomePosition(FALSE),
mHomeRegionHandle( 0 ),
@@ -250,7 +259,7 @@ void LLAgent::init()
setFlying( gSavedSettings.getBOOL("FlyingAtExit") );
- mEffectColor = LLUIColorTable::instance().getColor("EffectColor");
+ *mEffectColor = LLUIColorTable::instance().getColor("EffectColor");
gSavedSettings.getControl("PreferredMaturity")->getValidateSignal()->connect(boost::bind(&LLAgent::validateMaturity, this, _2));
gSavedSettings.getControl("PreferredMaturity")->getSignal()->connect(boost::bind(&LLAgent::handleMaturity, this, _2));
@@ -274,9 +283,16 @@ LLAgent::~LLAgent()
cleanup();
delete mMouselookModeInSignal;
+ mMouselookModeInSignal = NULL;
delete mMouselookModeOutSignal;
+ mMouselookModeOutSignal = NULL;
- // *Note: this is where LLViewerCamera::getInstance() used to be deleted.
+ delete mAgentAccess;
+ mAgentAccess = NULL;
+ delete mEffectColor;
+ mEffectColor = NULL;
+ delete mTeleportSourceSLURL;
+ mTeleportSourceSLURL = NULL;
}
// Handle any actions that need to be performed when the main app gains focus
@@ -559,6 +575,8 @@ void LLAgent::setFlying(BOOL fly)
// static
void LLAgent::toggleFlying()
{
+ LLToolPie::instance().stopClickToWalk();
+
BOOL fly = !gAgent.getFlying();
gAgent.mMoveTimer.reset();
@@ -1207,17 +1225,32 @@ BOOL LLAgent::getBusy() const
//-----------------------------------------------------------------------------
// startAutoPilotGlobal()
//-----------------------------------------------------------------------------
-void LLAgent::startAutoPilotGlobal(const LLVector3d &target_global, const std::string& behavior_name, const LLQuaternion *target_rotation, void (*finish_callback)(BOOL, void *), void *callback_data, F32 stop_distance, F32 rot_threshold)
+void LLAgent::startAutoPilotGlobal(
+ const LLVector3d &target_global,
+ const std::string& behavior_name,
+ const LLQuaternion *target_rotation,
+ void (*finish_callback)(BOOL, void *),
+ void *callback_data,
+ 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();
@@ -1238,21 +1271,30 @@ void LLAgent::startAutoPilotGlobal(const LLVector3d &target_global, const std::s
else
{
// Guess at a reasonable stop distance.
- mAutoPilotStopDistance = fsqrtf( distance );
+ mAutoPilotStopDistance = (F32) sqrt( distance );
if (mAutoPilotStopDistance < 0.5f)
{
mAutoPilotStopDistance = 0.5f;
}
}
- 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"
@@ -1262,22 +1304,8 @@ void LLAgent::startAutoPilotGlobal(const LLVector3d &target_global, const std::s
}
mAutoPilot = TRUE;
- 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;
+ setAutoPilotTargetGlobal(target_global);
- 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;
@@ -1295,12 +1323,36 @@ void LLAgent::startAutoPilotGlobal(const LLVector3d &target_global, const std::s
//-----------------------------------------------------------------------------
-// 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;
@@ -1311,7 +1363,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);
}
@@ -1338,6 +1397,7 @@ void LLAgent::stopAutoPilot(BOOL user_cancel)
if (mAutoPilotFinishedCallback)
{
mAutoPilotFinishedCallback(!user_cancel && dist_vec(gAgent.getPositionGlobal(), mAutoPilotTargetGlobal) < mAutoPilotStopDistance, mAutoPilotCallbackData);
+ mAutoPilotFinishedCallback = NULL;
}
mLeaderID = LLUUID::null;
@@ -1377,7 +1437,7 @@ void LLAgent::autoPilot(F32 *delta_yaw)
if (!isAgentAvatarValid()) return;
- if (gAgentAvatarp->mInAir)
+ if (gAgentAvatarp->mInAir && mAutoPilotAllowFlying)
{
setFlying(TRUE);
}
@@ -2139,32 +2199,32 @@ void LLAgent::onAnimStop(const LLUUID& id)
bool LLAgent::isGodlike() const
{
- return mAgentAccess.isGodlike();
+ return mAgentAccess->isGodlike();
}
bool LLAgent::isGodlikeWithoutAdminMenuFakery() const
{
- return mAgentAccess.isGodlikeWithoutAdminMenuFakery();
+ return mAgentAccess->isGodlikeWithoutAdminMenuFakery();
}
U8 LLAgent::getGodLevel() const
{
- return mAgentAccess.getGodLevel();
+ return mAgentAccess->getGodLevel();
}
bool LLAgent::wantsPGOnly() const
{
- return mAgentAccess.wantsPGOnly();
+ return mAgentAccess->wantsPGOnly();
}
bool LLAgent::canAccessMature() const
{
- return mAgentAccess.canAccessMature();
+ return mAgentAccess->canAccessMature();
}
bool LLAgent::canAccessAdult() const
{
- return mAgentAccess.canAccessAdult();
+ return mAgentAccess->canAccessAdult();
}
bool LLAgent::canAccessMaturityInRegion( U64 region_handle ) const
@@ -2199,37 +2259,37 @@ bool LLAgent::canAccessMaturityAtGlobal( LLVector3d pos_global ) const
bool LLAgent::prefersPG() const
{
- return mAgentAccess.prefersPG();
+ return mAgentAccess->prefersPG();
}
bool LLAgent::prefersMature() const
{
- return mAgentAccess.prefersMature();
+ return mAgentAccess->prefersMature();
}
bool LLAgent::prefersAdult() const
{
- return mAgentAccess.prefersAdult();
+ return mAgentAccess->prefersAdult();
}
bool LLAgent::isTeen() const
{
- return mAgentAccess.isTeen();
+ return mAgentAccess->isTeen();
}
bool LLAgent::isMature() const
{
- return mAgentAccess.isMature();
+ return mAgentAccess->isMature();
}
bool LLAgent::isAdult() const
{
- return mAgentAccess.isAdult();
+ return mAgentAccess->isAdult();
}
void LLAgent::setTeen(bool teen)
{
- mAgentAccess.setTeen(teen);
+ mAgentAccess->setTeen(teen);
}
//static
@@ -2274,37 +2334,37 @@ bool LLAgent::sendMaturityPreferenceToServer(int preferredMaturity)
BOOL LLAgent::getAdminOverride() const
{
- return mAgentAccess.getAdminOverride();
+ return mAgentAccess->getAdminOverride();
}
void LLAgent::setMaturity(char text)
{
- mAgentAccess.setMaturity(text);
+ mAgentAccess->setMaturity(text);
}
void LLAgent::setAdminOverride(BOOL b)
{
- mAgentAccess.setAdminOverride(b);
+ mAgentAccess->setAdminOverride(b);
}
void LLAgent::setGodLevel(U8 god_level)
{
- mAgentAccess.setGodLevel(god_level);
+ mAgentAccess->setGodLevel(god_level);
}
void LLAgent::setAOTransition()
{
- mAgentAccess.setTransition();
+ mAgentAccess->setTransition();
}
const LLAgentAccess& LLAgent::getAgentAccess()
{
- return mAgentAccess;
+ return *mAgentAccess;
}
bool LLAgent::validateMaturity(const LLSD& newvalue)
{
- return mAgentAccess.canSetMaturity(newvalue.asInteger());
+ return mAgentAccess->canSetMaturity(newvalue.asInteger());
}
void LLAgent::handleMaturity(const LLSD& newvalue)
@@ -2636,12 +2696,12 @@ BOOL LLAgent::allowOperation(PermissionBit op,
const LLColor4 &LLAgent::getEffectColor()
{
- return mEffectColor;
+ return *mEffectColor;
}
void LLAgent::setEffectColor(const LLColor4 &color)
{
- mEffectColor = color;
+ *mEffectColor = color;
}
void LLAgent::initOriginGlobal(const LLVector3d &origin_global)
@@ -3469,7 +3529,7 @@ void LLAgent::setTeleportState(ETeleportState state)
case TELEPORT_MOVING:
// We're outa here. Save "back" slurl.
- LLAgentUI::buildSLURL(mTeleportSourceSLURL);
+ LLAgentUI::buildSLURL(*mTeleportSourceSLURL);
break;
case TELEPORT_ARRIVING:
@@ -3802,6 +3862,11 @@ void LLAgent::parseTeleportMessages(const std::string& xml_filename)
}//end for (all message sets in xml file)
}
+const void LLAgent::getTeleportSourceSLURL(LLSLURL& slurl) const
+{
+ slurl = *mTeleportSourceSLURL;
+}
+
void LLAgent::sendAgentUpdateUserInfo(bool im_via_email, const std::string& directory_visibility )
{
gMessageSystem->newMessageFast(_PREHASH_UpdateUserInfo);
diff --git a/indra/newview/llagent.h b/indra/newview/llagent.h
index 896408c0dd..67ed1923c0 100644
--- a/indra/newview/llagent.h
+++ b/indra/newview/llagent.h
@@ -29,15 +29,11 @@
#include "indra_constants.h"
#include "llevent.h" // LLObservable base class
-#include "llagentaccess.h"
#include "llagentconstants.h"
#include "llagentdata.h" // gAgentID, gAgentSessionID
-#include "llcharacter.h" // LLAnimPauseRequest
+#include "llcharacter.h"
#include "llcoordframe.h" // for mFrameAgent
-#include "llpointer.h"
-#include "lluicolor.h"
#include "llvoavatardefines.h"
-#include "llslurl.h"
#include <boost/signals2.hpp>
@@ -56,6 +52,10 @@ class LLFriendObserver;
class LLPickInfo;
class LLViewerObject;
class LLAgentDropGroupViewerNode;
+class LLAgentAccess;
+class LLSLURL;
+class LLPauseRequestHandle;
+class LLUIColor;
//--------------------------------------------------------------------
// Types
@@ -80,6 +80,8 @@ struct LLGroupData
class LLAgentListener;
+class LLAgentImpl;
+
//------------------------------------------------------------------------
// LLAgent
//------------------------------------------------------------------------
@@ -420,7 +422,7 @@ private:
camera_signal_t* mMouselookModeInSignal;
camera_signal_t* mMouselookModeOutSignal;
BOOL mCustomAnim; // Current animation is ANIM_AGENT_CUSTOMIZE ?
- LLAnimPauseRequest mPauseRequest;
+ LLPointer<LLPauseRequestHandle> mPauseRequest;
BOOL mViewsPushed; // Keep track of whether or not we have pushed views
/** Animation
@@ -467,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;
@@ -515,13 +527,13 @@ public:
public:
static void parseTeleportMessages(const std::string& xml_filename);
- const void getTeleportSourceSLURL(LLSLURL& slurl) const { slurl = mTeleportSourceSLURL; }
+ const void getTeleportSourceSLURL(LLSLURL& slurl) const;
public:
// ! TODO ! Define ERROR and PROGRESS enums here instead of exposing the mappings.
static std::map<std::string, std::string> sTeleportErrorMessages;
static std::map<std::string, std::string> sTeleportProgressMessages;
private:
- LLSLURL mTeleportSourceSLURL; // SLURL where last TP began
+ LLSLURL * mTeleportSourceSLURL; // SLURL where last TP began
//--------------------------------------------------------------------
// Teleport Actions
@@ -580,7 +592,7 @@ public:
// ! BACKWARDS COMPATIBILITY ! This function can go away after the AO transition (see llstartup.cpp).
void setAOTransition();
private:
- LLAgentAccess mAgentAccess;
+ LLAgentAccess * mAgentAccess;
//--------------------------------------------------------------------
// God
@@ -660,7 +672,7 @@ public:
const LLColor4 &getEffectColor();
void setEffectColor(const LLColor4 &color);
private:
- LLUIColor mEffectColor;
+ LLUIColor * mEffectColor;
/** Rendering
** **
diff --git a/indra/newview/llagentcamera.cpp b/indra/newview/llagentcamera.cpp
index 6c5c3bcdab..80085dad9d 100644
--- a/indra/newview/llagentcamera.cpp
+++ b/indra/newview/llagentcamera.cpp
@@ -390,10 +390,14 @@ LLVector3 LLAgentCamera::calcFocusOffset(LLViewerObject *object, LLVector3 origi
{
return original_focus_point - obj_pos;
}
-
LLQuaternion inv_obj_rot = ~obj_rot; // get inverse of rotation
- LLVector3 object_extents = object->getScale();
+ LLVector3 object_extents;
+ const LLVector4a* oe4 = object->mDrawable->getSpatialExtents();
+ LLVector4a size;
+ size.setSub(oe4[1], oe4[0]);
+ object_extents.set( size[0], size[1], size[2] );
+
// make sure they object extents are non-zero
object_extents.clamp(0.001f, F32_MAX);
@@ -551,7 +555,9 @@ BOOL LLAgentCamera::calcCameraMinDistance(F32 &obj_min_distance)
{
BOOL soft_limit = FALSE; // is the bounding box to be treated literally (volumes) or as an approximation (avatars)
- if (!mFocusObject || mFocusObject->isDead())
+ if (!mFocusObject || mFocusObject->isDead() ||
+ mFocusObject->isMesh() ||
+ gSavedSettings.getBOOL("DisableCameraConstraints"))
{
obj_min_distance = 0.f;
return TRUE;
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/llagentpilot.cpp b/indra/newview/llagentpilot.cpp
index 13e1023185..734c502fcf 100644
--- a/indra/newview/llagentpilot.cpp
+++ b/indra/newview/llagentpilot.cpp
@@ -34,12 +34,12 @@
#include "llagent.h"
#include "llappviewer.h"
#include "llviewercontrol.h"
+#include "llviewercamera.h"
+#include "llsdserialize.h"
+#include "llsdutil_math.h"
LLAgentPilot gAgentPilot;
-BOOL LLAgentPilot::sLoop = TRUE;
-BOOL LLAgentPilot::sReplaySession = FALSE;
-
LLAgentPilot::LLAgentPilot() :
mNumRuns(-1),
mQuitAfterRuns(FALSE),
@@ -47,7 +47,10 @@ LLAgentPilot::LLAgentPilot() :
mLastRecordTime(0.f),
mStarted(FALSE),
mPlaying(FALSE),
- mCurrentAction(0)
+ mCurrentAction(0),
+ mOverrideCamera(FALSE),
+ mLoop(TRUE),
+ mReplaySession(FALSE)
{
}
@@ -55,7 +58,26 @@ LLAgentPilot::~LLAgentPilot()
{
}
-void LLAgentPilot::load(const std::string& filename)
+void LLAgentPilot::load()
+{
+ std::string txt_filename = gSavedSettings.getString("StatsPilotFile");
+ std::string xml_filename = gSavedSettings.getString("StatsPilotXMLFile");
+ if (LLFile::isfile(xml_filename))
+ {
+ loadXML(xml_filename);
+ }
+ else if (LLFile::isfile(txt_filename))
+ {
+ loadTxt(txt_filename);
+ }
+ else
+ {
+ lldebugs << "no autopilot file found" << llendl;
+ return;
+ }
+}
+
+void LLAgentPilot::loadTxt(const std::string& filename)
{
if(filename.empty())
{
@@ -75,6 +97,7 @@ void LLAgentPilot::load(const std::string& filename)
llinfos << "Opening pilot file " << filename << llendl;
}
+ mActions.reset();
S32 num_actions;
file >> num_actions;
@@ -89,10 +112,59 @@ void LLAgentPilot::load(const std::string& filename)
mActions.put(new_action);
}
+ mOverrideCamera = false;
+
+ file.close();
+}
+
+void LLAgentPilot::loadXML(const std::string& filename)
+{
+ if(filename.empty())
+ {
+ return;
+ }
+
+ llifstream file(filename);
+
+ if (!file)
+ {
+ lldebugs << "Couldn't open " << filename
+ << ", aborting agentpilot load!" << llendl;
+ return;
+ }
+ else
+ {
+ llinfos << "Opening pilot file " << filename << llendl;
+ }
+
+ mActions.reset();
+ LLSD record;
+ while (!file.eof() && LLSDSerialize::fromXML(record, file))
+ {
+ Action action;
+ action.mTime = record["time"].asReal();
+ action.mType = (EActionType)record["type"].asInteger();
+ action.mCameraView = record["camera_view"].asReal();
+ action.mTarget = ll_vector3d_from_sd(record["target"]);
+ action.mCameraOrigin = ll_vector3_from_sd(record["camera_origin"]);
+ action.mCameraXAxis = ll_vector3_from_sd(record["camera_xaxis"]);
+ action.mCameraYAxis = ll_vector3_from_sd(record["camera_yaxis"]);
+ action.mCameraZAxis = ll_vector3_from_sd(record["camera_zaxis"]);
+ mActions.put(action);
+ }
+ mOverrideCamera = true;
file.close();
}
-void LLAgentPilot::save(const std::string& filename)
+void LLAgentPilot::save()
+{
+ std::string txt_filename = gSavedSettings.getString("StatsPilotFile");
+ std::string xml_filename = gSavedSettings.getString("StatsPilotXMLFile");
+ saveTxt(txt_filename);
+ saveXML(xml_filename);
+}
+
+void LLAgentPilot::saveTxt(const std::string& filename)
{
llofstream file;
file.open(filename);
@@ -108,12 +180,41 @@ void LLAgentPilot::save(const std::string& filename)
for (i = 0; i < mActions.count(); i++)
{
file << mActions[i].mTime << "\t" << mActions[i].mType << "\t";
- file << std::setprecision(32) << mActions[i].mTarget.mdV[VX] << "\t" << mActions[i].mTarget.mdV[VY] << "\t" << mActions[i].mTarget.mdV[VZ] << '\n';
+ file << std::setprecision(32) << mActions[i].mTarget.mdV[VX] << "\t" << mActions[i].mTarget.mdV[VY] << "\t" << mActions[i].mTarget.mdV[VZ];
+ file << '\n';
}
file.close();
}
+void LLAgentPilot::saveXML(const std::string& filename)
+{
+ llofstream file;
+ file.open(filename);
+
+ if (!file)
+ {
+ llinfos << "Couldn't open " << filename << ", aborting agentpilot save!" << llendl;
+ }
+
+ S32 i;
+ for (i = 0; i < mActions.count(); i++)
+ {
+ Action& action = mActions[i];
+ LLSD record;
+ record["time"] = (LLSD::Real)action.mTime;
+ record["type"] = (LLSD::Integer)action.mType;
+ record["camera_view"] = (LLSD::Real)action.mCameraView;
+ record["target"] = ll_sd_from_vector3d(action.mTarget);
+ record["camera_origin"] = ll_sd_from_vector3(action.mCameraOrigin);
+ record["camera_xaxis"] = ll_sd_from_vector3(action.mCameraXAxis);
+ record["camera_yaxis"] = ll_sd_from_vector3(action.mCameraYAxis);
+ record["camera_zaxis"] = ll_sd_from_vector3(action.mCameraZAxis);
+ LLSDSerialize::toXML(record, file);
+ }
+ file.close();
+}
+
void LLAgentPilot::startRecord()
{
mActions.reset();
@@ -125,7 +226,7 @@ void LLAgentPilot::startRecord()
void LLAgentPilot::stopRecord()
{
gAgentPilot.addAction(STRAIGHT);
- gAgentPilot.save(gSavedSettings.getString("StatsPilotFile"));
+ gAgentPilot.save();
mRecording = FALSE;
}
@@ -136,6 +237,12 @@ void LLAgentPilot::addAction(enum EActionType action_type)
action.mType = action_type;
action.mTarget = gAgent.getPositionGlobal();
action.mTime = mTimer.getElapsedTimeF32();
+ LLViewerCamera *cam = LLViewerCamera::getInstance();
+ action.mCameraView = cam->getView();
+ action.mCameraOrigin = cam->getOrigin();
+ action.mCameraXAxis = cam->getXAxis();
+ action.mCameraYAxis = cam->getYAxis();
+ action.mCameraZAxis = cam->getZAxis();
mLastRecordTime = (F32)action.mTime;
mActions.put(action);
}
@@ -152,6 +259,7 @@ void LLAgentPilot::startPlayback()
{
llinfos << "Starting playback, moving to waypoint 0" << llendl;
gAgent.startAutoPilotGlobal(mActions[0].mTarget);
+ moveCamera();
mStarted = FALSE;
}
else
@@ -172,12 +280,53 @@ void LLAgentPilot::stopPlayback()
gAgent.stopAutoPilot();
}
- if (sReplaySession)
+ if (mReplaySession)
{
LLAppViewer::instance()->forceQuit();
}
}
+void LLAgentPilot::moveCamera()
+{
+ if (!getOverrideCamera())
+ return;
+
+ if (mCurrentAction<mActions.count())
+ {
+ S32 start_index = llmax(mCurrentAction-1,0);
+ S32 end_index = mCurrentAction;
+ F32 t = 0.0;
+ F32 timedelta = mActions[end_index].mTime - mActions[start_index].mTime;
+ F32 tickelapsed = mTimer.getElapsedTimeF32()-mActions[start_index].mTime;
+ if (timedelta > 0.0)
+ {
+ t = tickelapsed/timedelta;
+ }
+
+ if ((t<0.0)||(t>1.0))
+ {
+ llwarns << "mCurrentAction is invalid, t = " << t << llendl;
+ return;
+ }
+
+ Action& start = mActions[start_index];
+ Action& end = mActions[end_index];
+
+ F32 view = lerp(start.mCameraView, end.mCameraView, t);
+ LLVector3 origin = lerp(start.mCameraOrigin, end.mCameraOrigin, t);
+ LLQuaternion start_quat(start.mCameraXAxis, start.mCameraYAxis, start.mCameraZAxis);
+ LLQuaternion end_quat(end.mCameraXAxis, end.mCameraYAxis, end.mCameraZAxis);
+ LLQuaternion quat = nlerp(t, start_quat, end_quat);
+ LLMatrix3 mat(quat);
+
+ LLViewerCamera::getInstance()->setView(view);
+ LLViewerCamera::getInstance()->setOrigin(origin);
+ LLViewerCamera::getInstance()->mXAxis = LLVector3(mat.mMatrix[0]);
+ LLViewerCamera::getInstance()->mYAxis = LLVector3(mat.mMatrix[1]);
+ LLViewerCamera::getInstance()->mZAxis = LLVector3(mat.mMatrix[2]);
+ }
+}
+
void LLAgentPilot::updateTarget()
{
if (mPlaying)
@@ -209,12 +358,13 @@ void LLAgentPilot::updateTarget()
if (mCurrentAction < mActions.count())
{
gAgent.startAutoPilotGlobal(mActions[mCurrentAction].mTarget);
+ moveCamera();
}
else
{
stopPlayback();
mNumRuns--;
- if (sLoop)
+ if (mLoop)
{
if ((mNumRuns < 0) || (mNumRuns > 0))
{
@@ -249,29 +399,8 @@ void LLAgentPilot::updateTarget()
}
}
-// static
-void LLAgentPilot::startRecord(void *)
-{
- gAgentPilot.startRecord();
-}
-
-void LLAgentPilot::saveRecord(void *)
+void LLAgentPilot::addWaypoint()
{
- gAgentPilot.stopRecord();
-}
-
-void LLAgentPilot::addWaypoint(void *)
-{
- gAgentPilot.addAction(STRAIGHT);
-}
-
-void LLAgentPilot::startPlayback(void *)
-{
- gAgentPilot.mNumRuns = -1;
- gAgentPilot.startPlayback();
+ addAction(STRAIGHT);
}
-void LLAgentPilot::stopPlayback(void *)
-{
- gAgentPilot.stopPlayback();
-}
diff --git a/indra/newview/llagentpilot.h b/indra/newview/llagentpilot.h
index f3d34246ae..dd1709ec0c 100644
--- a/indra/newview/llagentpilot.h
+++ b/indra/newview/llagentpilot.h
@@ -46,8 +46,12 @@ public:
LLAgentPilot();
virtual ~LLAgentPilot();
- void load(const std::string& filename);
- void save(const std::string& filename);
+ void load();
+ void loadTxt(const std::string& filename);
+ void loadXML(const std::string& filename);
+ void save();
+ void saveTxt(const std::string& filename);
+ void saveXML(const std::string& filename);
void startRecord();
void stopRecord();
@@ -56,19 +60,34 @@ public:
void startPlayback();
void stopPlayback();
+ bool isRecording() { return mRecording; }
+ bool isPlaying() { return mPlaying; }
+ bool getOverrideCamera() { return mOverrideCamera; }
+
void updateTarget();
- static void startRecord(void *);
- static void addWaypoint(void *);
- static void saveRecord(void *);
- static void startPlayback(void *);
- static void stopPlayback(void *);
- static BOOL sLoop;
- static BOOL sReplaySession;
+ void addWaypoint();
+ void moveCamera();
+
+ void setReplaySession(BOOL new_val) { mReplaySession = new_val; }
+ BOOL getReplaySession() { return mReplaySession; }
+
+ void setLoop(BOOL new_val) { mLoop = new_val; }
+ BOOL getLoop() { return mLoop; }
+
+ void setQuitAfterRuns(BOOL quit_val) { mQuitAfterRuns = quit_val; }
+ void setNumRuns(S32 num_runs) { mNumRuns = num_runs; }
+
+private:
+
+
+
+ BOOL mLoop;
+ BOOL mReplaySession;
S32 mNumRuns;
BOOL mQuitAfterRuns;
-private:
+
void setAutopilotTarget(const S32 id);
BOOL mRecording;
@@ -78,6 +97,8 @@ private:
BOOL mPlaying;
S32 mCurrentAction;
+ BOOL mOverrideCamera;
+
class Action
{
public:
@@ -85,10 +106,16 @@ private:
EActionType mType;
LLVector3d mTarget;
F64 mTime;
+ F32 mCameraView;
+ LLVector3 mCameraOrigin;
+ LLVector3 mCameraXAxis;
+ LLVector3 mCameraYAxis;
+ LLVector3 mCameraZAxis;
};
LLDynamicArray<Action> mActions;
LLTimer mTimer;
+
};
extern LLAgentPilot gAgentPilot;
diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp
index 1cf552e42c..1388d9aee0 100644
--- a/indra/newview/llappearancemgr.cpp
+++ b/indra/newview/llappearancemgr.cpp
@@ -110,6 +110,12 @@ public:
{
// support secondlife:///app/appearance/show, but for now we just
// make all secondlife:///app/appearance SLapps behave this way
+ if (!LLUI::sSettingGroups["config"]->getBOOL("EnableAppearance"))
+ {
+ LLNotificationsUtil::add("NoAppearance", LLSD(), LLSD(), std::string("SwitchToStandardSkinAndQuit"));
+ return true;
+ }
+
LLSideTray::getInstance()->showPanel("sidepanel_appearance", LLSD());
return true;
}
@@ -2767,75 +2773,6 @@ BOOL LLAppearanceMgr::getIsProtectedCOFItem(const LLUUID& obj_id) const
*/
}
-// Shim class to allow arbitrary boost::bind
-// expressions to be run as one-time idle callbacks.
-//
-// TODO: rework idle function spec to take a boost::function in the first place.
-class OnIdleCallbackOneTime
-{
-public:
- OnIdleCallbackOneTime(nullary_func_t callable):
- mCallable(callable)
- {
- }
- static void onIdle(void *data)
- {
- gIdleCallbacks.deleteFunction(onIdle, data);
- OnIdleCallbackOneTime* self = reinterpret_cast<OnIdleCallbackOneTime*>(data);
- self->call();
- delete self;
- }
- void call()
- {
- mCallable();
- }
-private:
- nullary_func_t mCallable;
-};
-
-void doOnIdleOneTime(nullary_func_t callable)
-{
- OnIdleCallbackOneTime* cb_functor = new OnIdleCallbackOneTime(callable);
- gIdleCallbacks.addFunction(&OnIdleCallbackOneTime::onIdle,cb_functor);
-}
-
-// Shim class to allow generic boost functions to be run as
-// recurring idle callbacks. Callable should return true when done,
-// false to continue getting called.
-//
-// TODO: rework idle function spec to take a boost::function in the first place.
-class OnIdleCallbackRepeating
-{
-public:
- OnIdleCallbackRepeating(bool_func_t callable):
- mCallable(callable)
- {
- }
- // Will keep getting called until the callable returns true.
- static void onIdle(void *data)
- {
- OnIdleCallbackRepeating* self = reinterpret_cast<OnIdleCallbackRepeating*>(data);
- bool done = self->call();
- if (done)
- {
- gIdleCallbacks.deleteFunction(onIdle, data);
- delete self;
- }
- }
- bool call()
- {
- return mCallable();
- }
-private:
- bool_func_t mCallable;
-};
-
-void doOnIdleRepeating(bool_func_t callable)
-{
- OnIdleCallbackRepeating* cb_functor = new OnIdleCallbackRepeating(callable);
- gIdleCallbacks.addFunction(&OnIdleCallbackRepeating::onIdle,cb_functor);
-}
-
class CallAfterCategoryFetchStage2: public LLInventoryFetchItemsObserver
{
public:
diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h
index c65d9dc9ee..4b1d95cf25 100644
--- a/indra/newview/llappearancemgr.h
+++ b/indra/newview/llappearancemgr.h
@@ -248,15 +248,6 @@ private:
LLUUID findDescendentCategoryIDByName(const LLUUID& parent_id,const std::string& name);
-typedef boost::function<void ()> nullary_func_t;
-typedef boost::function<bool ()> bool_func_t;
-
-// Call a given callable once in idle loop.
-void doOnIdleOneTime(nullary_func_t callable);
-
-// Repeatedly call a callable in idle loop until it returns true.
-void doOnIdleRepeating(bool_func_t callable);
-
// Invoke a given callable after category contents are fully fetched.
void callAfterCategoryFetch(const LLUUID& cat_id, nullary_func_t cb);
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index cbd996f909..d2582d524d 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -46,6 +46,7 @@
#include "llviewerstats.h"
#include "llviewerstatsrecorder.h"
#include "llmd5.h"
+#include "llmeshrepository.h"
#include "llpumpio.h"
#include "llmimetypes.h"
#include "llslurl.h"
@@ -75,6 +76,8 @@
#include "llteleporthistory.h"
#include "lllocationhistory.h"
#include "llfasttimerview.h"
+#include "llvector4a.h"
+#include "llviewermenufile.h"
#include "llvoicechannel.h"
#include "llvoavatarself.h"
#include "llsidetray.h"
@@ -82,13 +85,14 @@
#include "lltextutil.h"
#include "lllogininstance.h"
#include "llprogressview.h"
-
+#include "llvocache.h"
#include "llweb.h"
#include "llsecondlifeurls.h"
#include "llupdaterservice.h"
// Linden library includes
#include "llavatarnamecache.h"
+#include "lldiriterator.h"
#include "llimagej2c.h"
#include "llmemory.h"
#include "llprimitive.h"
@@ -132,7 +136,6 @@
#include "lltoolmgr.h"
#include "llassetstorage.h"
#include "llpolymesh.h"
-#include "llcachename.h"
#include "llaudioengine.h"
#include "llstreamingaudio.h"
#include "llviewermenu.h"
@@ -200,7 +203,6 @@
// Include for security api initialization
#include "llsecapi.h"
#include "llmachineid.h"
-
#include "llmainlooprepeater.h"
// *FIX: These extern globals should be cleaned up.
@@ -506,8 +508,8 @@ static void settings_to_globals()
LLSelectMgr::sRenderHiddenSelections = gSavedSettings.getBOOL("RenderHiddenSelections");
LLSelectMgr::sRenderLightRadius = gSavedSettings.getBOOL("RenderLightRadius");
- gAgentPilot.mNumRuns = gSavedSettings.getS32("StatsNumRuns");
- gAgentPilot.mQuitAfterRuns = gSavedSettings.getBOOL("StatsQuitAfterRuns");
+ gAgentPilot.setNumRuns(gSavedSettings.getS32("StatsNumRuns"));
+ gAgentPilot.setQuitAfterRuns(gSavedSettings.getBOOL("StatsQuitAfterRuns"));
gAgent.setHideGroupTitle(gSavedSettings.getBOOL("RenderHideGroupTitle"));
gDebugWindowProc = gSavedSettings.getBOOL("DebugWindowProc");
@@ -517,7 +519,8 @@ static void settings_to_globals()
static void settings_modify()
{
- LLRenderTarget::sUseFBO = gSavedSettings.getBOOL("RenderUseFBO");
+ LLRenderTarget::sUseFBO = gSavedSettings.getBOOL("RenderDeferred");
+ LLPipeline::sRenderDeferred = gSavedSettings.getBOOL("RenderDeferred");
LLVOAvatar::sUseImpostors = gSavedSettings.getBOOL("RenderUseImpostors");
LLVOSurfacePatch::sLODFactor = gSavedSettings.getF32("RenderTerrainLODFactor");
LLVOSurfacePatch::sLODFactor *= LLVOSurfacePatch::sLODFactor; //square lod factor to get exponential range of [1,4]
@@ -568,7 +571,7 @@ public:
std::string mFile;
LLFastTimerLogThread(std::string& test_name) : LLThread("fast timer log")
- {
+ {
std::string file_name = test_name + std::string(".slp");
mFile = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, file_name);
}
@@ -586,7 +589,6 @@ public:
os.close();
}
-
};
//virtual
@@ -672,6 +674,9 @@ bool LLAppViewer::init()
//
LLFastTimer::reset();
+ // initialize SSE options
+ LLVector4a::initClass();
+
// Need to do this initialization before we do anything else, since anything
// that touches files should really go through the lldir API
gDirUtilp->initAppDirs("SecondLife");
@@ -690,6 +695,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();
@@ -716,6 +723,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();
{
@@ -734,6 +743,8 @@ bool LLAppViewer::init()
}
initThreads();
+ LL_INFOS("InitInfo") << "Threads initialized." << LL_ENDL ;
+
writeSystemInfo();
// Initialize updater service (now that we have an io pump)
@@ -768,6 +779,7 @@ bool LLAppViewer::init()
gCrashSettings.setS32(CRASH_BEHAVIOR_SETTING, CRASH_BEHAVIOR_ALWAYS_SEND);
gCrashSettings.saveToFile(crash_settings_filename, FALSE);
}
+ LL_INFOS("InitInfo") << "Crash settings done." << LL_ENDL ;
/////////////////////////////////////////////////
// OS-specific login dialogs
@@ -816,6 +828,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();
@@ -865,6 +879,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.
@@ -885,15 +900,17 @@ 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();
-
+
//
// Initialize the window
//
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");
@@ -935,6 +952,18 @@ bool LLAppViewer::init()
return 0;
}
+ // Without SSE2 support we will crash almost immediately, warn here.
+ if (!gSysCPU.hasSSE2())
+ {
+ // can't use an alert here since we're exiting and
+ // all hell breaks lose.
+ OSMessageBox(
+ LLNotifications::instance().getGlobalString("UnsupportedCPUSSE2"),
+ LLStringUtil::null,
+ OSMB_OK);
+ return 0;
+ }
+
// alert the user if they are using unsupported hardware
if(!gSavedSettings.getBOOL("AlertedUnsupportedHardware"))
{
@@ -994,7 +1023,7 @@ bool LLAppViewer::init()
gDebugInfo["GraphicsCard"] = LLFeatureManager::getInstance()->getGPUString();
// Save the current version to the prefs file
- gSavedSettings.setString("LastRunVersion",
+ gSavedSettings.setString("LastRunVersion",
LLVersionInfo::getChannelAndVersion());
gSimLastTime = gRenderStartTime.getElapsedTimeF32();
@@ -1019,6 +1048,8 @@ 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
@@ -1072,7 +1103,7 @@ bool LLAppViewer::mainLoop()
gServicePump = new LLPumpIO(gAPRPoolp);
LLHTTPClient::setPump(*gServicePump);
LLCurl::setCAFile(gDirUtilp->getCAFile());
-
+
// Note: this is where gLocalSpeakerMgr and gActiveSpeakerMgr used to be instantiated.
LLVoiceChannel::initClass();
@@ -1162,11 +1193,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);
@@ -1316,6 +1347,7 @@ bool LLAppViewer::mainLoop()
break;
}
}
+ gMeshRepo.update() ;
if(!total_work_pending) //pause texture fetching threads if nothing to process.
{
@@ -1421,6 +1453,20 @@ bool LLAppViewer::cleanup()
// workaround for DEV-35406 crash on shutdown
LLEventPumps::instance().reset();
+ if (LLFastTimerView::sAnalyzePerformance)
+ {
+ llinfos << "Analyzing performance" << llendl;
+ std::string baseline_name = LLFastTimer::sLogName + "_baseline.slp";
+ std::string current_name = LLFastTimer::sLogName + ".slp";
+ std::string report_name = LLFastTimer::sLogName + "_report.csv";
+
+ LLFastTimerView::doAnalysis(
+ gDirUtilp->getExpandedFilename(LL_PATH_LOGS, baseline_name),
+ gDirUtilp->getExpandedFilename(LL_PATH_LOGS, current_name),
+ gDirUtilp->getExpandedFilename(LL_PATH_LOGS, report_name));
+ }
+ LLMetricPerformanceTesterBasic::cleanClass();
+
// remove any old breakpad minidump files from the log directory
if (! isError())
{
@@ -1459,6 +1505,9 @@ bool LLAppViewer::cleanup()
llinfos << "Cleaning Up" << llendflush;
+ // shut down mesh streamer
+ gMeshRepo.shutdown();
+
// Must clean up texture references before viewer window is destroyed.
if(LLHUDManager::instanceExists())
{
@@ -1727,6 +1776,8 @@ bool LLAppViewer::cleanup()
sTextureFetch->shutDownTextureCacheThread() ;
sTextureFetch->shutDownImageDecodeThread() ;
+ LLFilePickerThread::cleanupClass();
+
delete sTextureCache;
sTextureCache = NULL;
delete sTextureFetch;
@@ -1748,7 +1799,8 @@ bool LLAppViewer::cleanup()
gDirUtilp->getExpandedFilename(LL_PATH_LOGS, baseline_name),
gDirUtilp->getExpandedFilename(LL_PATH_LOGS, current_name),
gDirUtilp->getExpandedFilename(LL_PATH_LOGS, report_name));
- }
+ }
+
LLMetricPerformanceTesterBasic::cleanClass() ;
#if LL_RECORD_VIEWER_STATS
@@ -1876,6 +1928,11 @@ bool LLAppViewer::initThreads()
mFastTimerLogThread->start();
}
+ // Mesh streaming and caching
+ gMeshRepo.init();
+
+ LLFilePickerThread::initClass();
+
// *FIX: no error handling here!
return true;
}
@@ -2088,6 +2145,8 @@ bool LLAppViewer::initConfiguration()
gSavedSettings.setString("ClientSettingsFile",
gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, getSettingsFilename("Default", "Global")));
+ gSavedSettings.setString("VersionChannelName", LLVersionInfo::getChannel());
+
#ifndef LL_RELEASE_FOR_DOWNLOAD
// provide developer build only overrides for these control variables that are not
// persisted to settings.xml
@@ -2258,7 +2317,6 @@ bool LLAppViewer::initConfiguration()
{
LLVersionInfo::resetChannel(clp.getOption("channel")[0]);
}
-
// If we have specified crash on startup, set the global so we'll trigger the crash at the right time
if(clp.hasOption("crashonstartup"))
@@ -2269,12 +2327,12 @@ bool LLAppViewer::initConfiguration()
if (clp.hasOption("logperformance"))
{
LLFastTimer::sLog = TRUE;
- LLFastTimer::sLogName = std::string("performance");
+ LLFastTimer::sLogName = std::string("performance");
}
if (clp.hasOption("logmetrics"))
- {
- LLFastTimer::sMetricLog = TRUE ;
+ {
+ LLFastTimer::sMetricLog = TRUE ;
// '--logmetrics' can be specified with a named test metric argument so the data gathering is done only on that test
// In the absence of argument, every metric is gathered (makes for a rather slow run and hard to decipher report...)
std::string test_name = clp.getOption("logmetrics")[0];
@@ -2288,7 +2346,7 @@ bool LLAppViewer::initConfiguration()
{
LLFastTimer::sLogName = test_name;
}
- }
+ }
if (clp.hasOption("graphicslevel"))
{
@@ -2331,7 +2389,7 @@ bool LLAppViewer::initConfiguration()
if (clp.hasOption("replaysession"))
{
- LLAgentPilot::sReplaySession = TRUE;
+ gAgentPilot.setReplaySession(TRUE);
}
if (clp.hasOption("nonotifications"))
@@ -2458,7 +2516,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()))
{
@@ -2467,6 +2526,14 @@ bool LLAppViewer::initConfiguration()
}
}
+ // If automatic login from command line with --login switch
+ // init StartSLURL location. In interactive login, LLPanelLogin
+ // will take care of it.
+ if ((clp.hasOption("login") || clp.hasOption("autologin")) && !clp.hasOption("url") && !clp.hasOption("slurl"))
+ {
+ LLStartUp::setStartSLURL(LLSLURL(gSavedSettings.getString("LoginLocation")));
+ }
+
if (!gSavedSettings.getBOOL("AllowMultipleViewers"))
{
//
@@ -2530,7 +2597,7 @@ bool LLAppViewer::initConfiguration()
namespace {
// *TODO - decide if there's a better place for these functions.
- // do we need a file llupdaterui.cpp or something? -brad
+ // do we need a file llupdaterui.cpp or something? -brad
void apply_update_callback(LLSD const & notification, LLSD const & response)
{
@@ -2623,8 +2690,8 @@ namespace {
LLAppViewer::instance()->forceQuit();
}
- bool notify_update(LLSD const & evt)
- {
+ bool notify_update(LLSD const & evt)
+ {
std::string notification_name;
switch (evt["type"].asInteger())
{
@@ -2643,8 +2710,8 @@ namespace {
}
// let others also handle this event by default
- return false;
- }
+ return false;
+ }
bool on_bandwidth_throttle(LLUpdaterService * updater, LLSD const & evt)
{
@@ -2760,6 +2827,8 @@ 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;
@@ -2779,6 +2848,7 @@ bool LLAppViewer::initWindow()
{
LLWatchdog::getInstance()->init(watchdog_killer_callback);
}
+ LL_INFOS("AppInit") << "watchdog setting is done." << LL_ENDL;
LLNotificationsUI::LLNotificationManager::getInstance();
@@ -2801,6 +2871,8 @@ bool LLAppViewer::initWindow()
gSavedSettings.saveToFile( gSavedSettings.getString("ClientSettingsFile"), TRUE );
gPipeline.init();
+ LL_INFOS("AppInit") << "gPipeline Initialized" << LL_ENDL;
+
stop_glerror();
gViewerWindow->initGLDefaults();
@@ -2839,7 +2911,7 @@ bool LLAppViewer::initWindow()
// show viewer window
//gViewerWindow->mWindow->show();
-
+ LL_INFOS("AppInit") << "Window initialization done." << LL_ENDL;
return true;
}
@@ -2875,7 +2947,7 @@ void LLAppViewer::cleanupSavedSettings()
if (!maximized)
{
LLCoordScreen window_pos;
-
+
if (gViewerWindow->mWindow->getPosition(&window_pos))
{
gSavedSettings.setS32("WindowX", window_pos.mX);
@@ -2965,6 +3037,8 @@ void LLAppViewer::writeSystemInfo()
LL_INFOS("SystemInfo") << "OS: " << getOSInfo().getOSStringSimple() << LL_ENDL;
LL_INFOS("SystemInfo") << "OS info: " << getOSInfo() << LL_ENDL;
+ LL_INFOS("SystemInfo") << "Timers: " << LLFastTimer::sClockType << LL_ENDL;
+
writeDebugInfo(); // Save out debug_info.log early, in case of crash.
}
@@ -3423,8 +3497,10 @@ 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 + "*.*";
- while (gDirUtilp->getNextFileInDir(old_cache_dir, mask, file_name))
+ std::string mask = "*.*";
+
+ LLDirIterator iter(old_cache_dir, mask);
+ while (iter.next(file_name))
{
if (file_name == "." || file_name == "..") continue;
std::string source_path = old_cache_dir + delimiter + file_name;
@@ -3523,10 +3599,10 @@ bool LLAppViewer::initCache()
LLAppViewer::getTextureCache()->setReadOnly(read_only) ;
LLVOCache::getInstance()->setReadOnly(read_only);
- BOOL texture_cache_mismatch = FALSE ;
+ bool texture_cache_mismatch = false;
if (gSavedSettings.getS32("LocalCacheVersion") != LLAppViewer::getTextureCacheVersion())
{
- texture_cache_mismatch = TRUE ;
+ texture_cache_mismatch = true;
if(!read_only)
{
gSavedSettings.setS32("LocalCacheVersion", LLAppViewer::getTextureCacheVersion());
@@ -3540,7 +3616,9 @@ bool LLAppViewer::initCache()
gSavedSettings.getBOOL("PurgeCacheOnNextStartup"))
{
gSavedSettings.setBOOL("PurgeCacheOnNextStartup", false);
- mPurgeCache = true;
+ mPurgeCache = true;
+ // STORM-1141 force purgeAllTextures to get called to prevent a crash here. -brad
+ texture_cache_mismatch = true;
}
// We have moved the location of the cache directory over time.
@@ -3575,11 +3653,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;
@@ -3588,21 +3680,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;
@@ -3623,10 +3713,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;
@@ -3635,15 +3725,15 @@ 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;
- if (gDirUtilp->getNextFileInDir(dir, mask, found_file))
+ LLDirIterator iter(dir, mask);
+ if (iter.next(found_file))
{
old_vfs_data_file = dir + gDirUtilp->getDirDelimiter() + found_file;
@@ -3656,7 +3746,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)
@@ -3669,27 +3759,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)
{
@@ -3712,19 +3800,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;
}
@@ -3745,11 +3833,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
@@ -3932,6 +4020,8 @@ static LLFastTimer::DeclareTimer FTM_OBJECTLIST_UPDATE("Update Objectlist");
static LLFastTimer::DeclareTimer FTM_REGION_UPDATE("Update Region");
static LLFastTimer::DeclareTimer FTM_WORLD_UPDATE("Update World");
static LLFastTimer::DeclareTimer FTM_NETWORK("Network");
+static LLFastTimer::DeclareTimer FTM_AGENT_NETWORK("Agent Network");
+static LLFastTimer::DeclareTimer FTM_VLMANAGER("VL Manager");
///////////////////////////////////////////////////////
// idle()
@@ -3952,6 +4042,8 @@ void LLAppViewer::idle()
LLEventTimer::updateClass();
LLCriticalDamp::updateInterpolants();
LLMortician::updateClass();
+ LLFilePickerThread::clearDead(); //calls LLFilePickerThread::notify()
+
F32 dt_raw = idle_timer.getElapsedTimeAndResetF32();
// Cap out-of-control frame times
@@ -4287,8 +4379,12 @@ void LLAppViewer::idle()
LLWorld::getInstance()->updateParticles();
- if (LLViewerJoystick::getInstance()->getOverrideCamera())
+ if (gAgentPilot.isPlaying() && gAgentPilot.getOverrideCamera())
{
+ gAgentPilot.moveCamera();
+ }
+ else if (LLViewerJoystick::getInstance()->getOverrideCamera())
+ {
LLViewerJoystick::getInstance()->moveFlycam();
}
else
@@ -4526,6 +4622,11 @@ static F32 CheckMessagesMaxTime = CHECK_MESSAGES_DEFAULT_MAX_TIME;
#endif
static LLFastTimer::DeclareTimer FTM_IDLE_NETWORK("Idle Network");
+static LLFastTimer::DeclareTimer FTM_MESSAGE_ACKS("Message Acks");
+static LLFastTimer::DeclareTimer FTM_RETRANSMIT("Retransmit");
+static LLFastTimer::DeclareTimer FTM_TIMEOUT_CHECK("Timeout Check");
+static LLFastTimer::DeclareTimer FTM_DYNAMIC_THROTTLE("Dynamic Throttle");
+static LLFastTimer::DeclareTimer FTM_CHECK_REGION_CIRCUIT("Check Region Circuit");
void LLAppViewer::idleNetwork()
{
diff --git a/indra/newview/llappviewerlinux.cpp b/indra/newview/llappviewerlinux.cpp
index 523c2e3adf..714e0e6163 100644
--- a/indra/newview/llappviewerlinux.cpp
+++ b/indra/newview/llappviewerlinux.cpp
@@ -30,6 +30,7 @@
#include "llcommandlineparser.h"
+#include "lldiriterator.h"
#include "llmemtype.h"
#include "llurldispatcher.h" // SLURL from other app instance
#include "llviewernetwork.h"
@@ -504,7 +505,9 @@ std::string LLAppViewerLinux::generateSerialNumber()
// trawl /dev/disk/by-uuid looking for a good-looking UUID to grab
std::string this_name;
- while (gDirUtilp->getNextFileInDir(uuiddir, "*", this_name))
+
+ LLDirIterator iter(uuiddir, "*");
+ while (iter.next(this_name))
{
if (this_name.length() > best.length() ||
(this_name.length() == best.length() &&
diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp
index d328567a0e..445bd208ef 100644
--- a/indra/newview/llappviewerwin32.cpp
+++ b/indra/newview/llappviewerwin32.cpp
@@ -26,12 +26,6 @@
#include "llviewerprecompiledheaders.h"
-#if defined(_DEBUG)
-# if _MSC_VER >= 1400 // Visual C++ 2005 or later
-# define WINDOWS_CRT_MEM_CHECKS 1
-# endif
-#endif
-
#include "llappviewerwin32.h"
#include "llmemtype.h"
@@ -301,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) :
@@ -440,7 +455,11 @@ bool LLAppViewerWin32::initHardwareTest()
LL_WARNS("AppInit") << " Someone took over my exception handler (post hardware probe)!" << LL_ENDL;
}
- gGLManager.mVRAM = gDXHardware.getVRAM();
+ if (gGLManager.mVRAM == 0)
+ {
+ gGLManager.mVRAM = gDXHardware.getVRAM();
+ }
+
LL_INFOS("AppInit") << "Detected VRAM: " << gGLManager.mVRAM << LL_ENDL;
return true;
diff --git a/indra/newview/llassetuploadresponders.cpp b/indra/newview/llassetuploadresponders.cpp
index dd5bc74b2a..c08771c5e7 100644
--- a/indra/newview/llassetuploadresponders.cpp
+++ b/indra/newview/llassetuploadresponders.cpp
@@ -60,6 +60,7 @@
#include "llnotificationsutil.h"
#include "llscrolllistctrl.h"
#include "llsdserialize.h"
+#include "llsdutil.h"
#include "llvfs.h"
// When uploading multiple files, don't display any of them when uploading more than this number.
@@ -67,6 +68,106 @@ static const S32 FILE_COUNT_DISPLAY_THRESHOLD = 5;
void dialog_refresh_all();
+void on_new_single_inventory_upload_complete(
+ LLAssetType::EType asset_type,
+ LLInventoryType::EType inventory_type,
+ const std::string inventory_type_string,
+ const LLUUID& item_folder_id,
+ const std::string& item_name,
+ const std::string& item_description,
+ const LLSD& server_response,
+ S32 upload_price)
+{
+ if ( upload_price > 0 )
+ {
+ // this upload costed us L$, update our balance
+ // and display something saying that it cost L$
+ LLStatusBar::sendMoneyBalanceRequest();
+
+ LLSD args;
+ args["AMOUNT"] = llformat("%d", upload_price);
+ LLNotificationsUtil::add("UploadPayment", args);
+ }
+
+ if( item_folder_id.notNull() )
+ {
+ U32 everyone_perms = PERM_NONE;
+ U32 group_perms = PERM_NONE;
+ U32 next_owner_perms = PERM_ALL;
+ if( server_response.has("new_next_owner_mask") )
+ {
+ // The server provided creation perms so use them.
+ // Do not assume we got the perms we asked for in
+ // since the server may not have granted them all.
+ everyone_perms = server_response["new_everyone_mask"].asInteger();
+ group_perms = server_response["new_group_mask"].asInteger();
+ next_owner_perms = server_response["new_next_owner_mask"].asInteger();
+ }
+ else
+ {
+ // The server doesn't provide creation perms
+ // so use old assumption-based perms.
+ if( inventory_type_string != "snapshot")
+ {
+ next_owner_perms = PERM_MOVE | PERM_TRANSFER;
+ }
+ }
+
+ LLPermissions new_perms;
+ new_perms.init(
+ gAgent.getID(),
+ gAgent.getID(),
+ LLUUID::null,
+ LLUUID::null);
+
+ new_perms.initMasks(
+ PERM_ALL,
+ PERM_ALL,
+ everyone_perms,
+ group_perms,
+ next_owner_perms);
+
+ S32 creation_date_now = time_corrected();
+ LLPointer<LLViewerInventoryItem> item = new LLViewerInventoryItem(
+ server_response["new_inventory_item"].asUUID(),
+ item_folder_id,
+ new_perms,
+ server_response["new_asset"].asUUID(),
+ asset_type,
+ inventory_type,
+ item_name,
+ item_description,
+ LLSaleInfo::DEFAULT,
+ LLInventoryItemFlags::II_FLAGS_NONE,
+ creation_date_now);
+
+ gInventory.updateItem(item);
+ gInventory.notifyObservers();
+
+ // Show the preview panel for textures and sounds to let
+ // user know that the image (or snapshot) arrived intact.
+ LLInventoryPanel* panel = LLInventoryPanel::getActiveInventoryPanel();
+ if ( panel )
+ {
+ LLFocusableElement* focus = gFocusMgr.getKeyboardFocus();
+
+ panel->setSelection(
+ server_response["new_inventory_item"].asUUID(),
+ TAKE_FOCUS_NO);
+
+ // restore keyboard focus
+ gFocusMgr.setKeyboardFocus(focus);
+ }
+ }
+ else
+ {
+ llwarns << "Can't find a folder to put it in" << llendl;
+ }
+
+ // remove the "Uploading..." message
+ LLUploadDialog::modalUploadFinished();
+}
+
LLAssetUploadResponder::LLAssetUploadResponder(const LLSD &post_data,
const LLUUID& vfile_id,
LLAssetType::EType asset_type)
@@ -84,9 +185,10 @@ LLAssetUploadResponder::LLAssetUploadResponder(const LLSD &post_data,
}
}
-LLAssetUploadResponder::LLAssetUploadResponder(const LLSD &post_data,
- const std::string& file_name,
- LLAssetType::EType asset_type)
+LLAssetUploadResponder::LLAssetUploadResponder(
+ const LLSD &post_data,
+ const std::string& file_name,
+ LLAssetType::EType asset_type)
: LLHTTPClient::Responder(),
mPostData(post_data),
mFileName(file_name),
@@ -135,6 +237,7 @@ void LLAssetUploadResponder::result(const LLSD& content)
lldebugs << "LLAssetUploadResponder::result from capabilities" << llendl;
std::string state = content["state"];
+
if (state == "upload")
{
uploadUpload(content);
@@ -196,16 +299,36 @@ void LLAssetUploadResponder::uploadComplete(const LLSD& content)
{
}
-LLNewAgentInventoryResponder::LLNewAgentInventoryResponder(const LLSD& post_data,
- const LLUUID& vfile_id,
- LLAssetType::EType asset_type)
-: LLAssetUploadResponder(post_data, vfile_id, asset_type)
+LLNewAgentInventoryResponder::LLNewAgentInventoryResponder(
+ const LLSD& post_data,
+ const LLUUID& vfile_id,
+ LLAssetType::EType asset_type)
+ : LLAssetUploadResponder(post_data, vfile_id, asset_type)
{
}
-LLNewAgentInventoryResponder::LLNewAgentInventoryResponder(const LLSD& post_data, const std::string& file_name, LLAssetType::EType asset_type)
-: LLAssetUploadResponder(post_data, file_name, asset_type)
+LLNewAgentInventoryResponder::LLNewAgentInventoryResponder(
+ const LLSD& post_data,
+ const std::string& file_name,
+ LLAssetType::EType asset_type)
+ : LLAssetUploadResponder(post_data, file_name, asset_type)
+{
+}
+
+// virtual
+void LLNewAgentInventoryResponder::error(U32 statusNum, const std::string& reason)
{
+ LLAssetUploadResponder::error(statusNum, reason);
+ //LLImportColladaAssetCache::getInstance()->assetUploaded(mVFileID, LLUUID(), FALSE);
+}
+
+
+//virtual
+void LLNewAgentInventoryResponder::uploadFailure(const LLSD& content)
+{
+ LLAssetUploadResponder::uploadFailure(content);
+
+ //LLImportColladaAssetCache::getInstance()->assetUploaded(mVFileID, content["new_asset"], FALSE);
}
//virtual
@@ -219,95 +342,31 @@ void LLNewAgentInventoryResponder::uploadComplete(const LLSD& content)
LLAssetType::EType asset_type = LLAssetType::lookup(mPostData["asset_type"].asString());
LLInventoryType::EType inventory_type = LLInventoryType::lookup(mPostData["inventory_type"].asString());
- S32 expected_upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload();
+ S32 expected_upload_cost = 0;
// Update L$ and ownership credit information
// since it probably changed on the server
if (asset_type == LLAssetType::AT_TEXTURE ||
asset_type == LLAssetType::AT_SOUND ||
- asset_type == LLAssetType::AT_ANIMATION)
+ asset_type == LLAssetType::AT_ANIMATION ||
+ asset_type == LLAssetType::AT_MESH)
{
- LLStatusBar::sendMoneyBalanceRequest();
-
- LLSD args;
- args["AMOUNT"] = llformat("%d", expected_upload_cost);
- LLNotificationsUtil::add("UploadPayment", args);
+ expected_upload_cost =
+ LLGlobalEconomy::Singleton::getInstance()->getPriceUpload();
}
- // Actually add the upload to viewer inventory
- llinfos << "Adding " << content["new_inventory_item"].asUUID() << " "
- << content["new_asset"].asUUID() << " to inventory." << llendl;
- if(mPostData["folder_id"].asUUID().notNull())
- {
- //std::ostringstream out;
- //LLSDXMLFormatter *formatter = new LLSDXMLFormatter;
- //formatter->format(mPostData, out, LLSDFormatter::OPTIONS_PRETTY);
- //llinfos << "Post Data: " << out.str() << llendl;
+ on_new_single_inventory_upload_complete(
+ asset_type,
+ inventory_type,
+ mPostData["asset_type"].asString(),
+ mPostData["folder_id"].asUUID(),
+ mPostData["name"],
+ mPostData["description"],
+ content,
+ expected_upload_cost);
- U32 everyone_perms = PERM_NONE;
- U32 group_perms = PERM_NONE;
- U32 next_owner_perms = PERM_ALL;
- if(content.has("new_next_owner_mask"))
- {
- // This is a new sim that provides creation perms so use them.
- // Do not assume we got the perms we asked for in mPostData
- // since the sim may not have granted them all.
- everyone_perms = content["new_everyone_mask"].asInteger();
- group_perms = content["new_group_mask"].asInteger();
- next_owner_perms = content["new_next_owner_mask"].asInteger();
- }
- else
- {
- // This old sim doesn't provide creation perms so use old assumption-based perms.
- if(mPostData["inventory_type"].asString() != "snapshot")
- {
- next_owner_perms = PERM_MOVE | PERM_TRANSFER;
- }
- }
- LLPermissions new_perms;
- new_perms.init(gAgent.getID(), gAgent.getID(), LLUUID::null, LLUUID::null);
- new_perms.initMasks(PERM_ALL, PERM_ALL, everyone_perms, group_perms, next_owner_perms);
- S32 creation_date_now = time_corrected();
- LLPointer<LLViewerInventoryItem> item
- = new LLViewerInventoryItem(content["new_inventory_item"].asUUID(),
- mPostData["folder_id"].asUUID(),
- new_perms,
- content["new_asset"].asUUID(),
- asset_type,
- inventory_type,
- mPostData["name"].asString(),
- mPostData["description"].asString(),
- LLSaleInfo::DEFAULT,
- LLInventoryItemFlags::II_FLAGS_NONE,
- creation_date_now);
- gInventory.updateItem(item);
- gInventory.notifyObservers();
-
- // Show the preview panel for textures and sounds to let
- // user know that the image (or snapshot) arrived intact.
- LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel();
- if (active_panel)
- {
- active_panel->setSelection(content["new_inventory_item"].asUUID(), TAKE_FOCUS_NO);
- if((LLAssetType::AT_TEXTURE == asset_type || LLAssetType::AT_SOUND == asset_type)
- && LLFilePicker::instance().getFileCount() <= FILE_COUNT_DISPLAY_THRESHOLD)
- {
- active_panel->openSelected();
- }
- //LLFloaterInventory::dumpSelectionInformation((void*)view);
- // restore keyboard focus
- LLFocusableElement* focus = gFocusMgr.getKeyboardFocus();
- gFocusMgr.setKeyboardFocus(focus);
- }
- }
- else
- {
- llwarns << "Can't find a folder to put it in" << llendl;
- }
+ // continue uploading for bulk uploads
- // remove the "Uploading..." message
- LLUploadDialog::modalUploadFinished();
-
// *FIX: This is a pretty big hack. What this does is check the
// file picker if there are any more pending uploads. If so,
// upload that file.
@@ -324,19 +383,42 @@ void LLNewAgentInventoryResponder::uploadComplete(const LLSD& content)
// Continuing the horrible hack above, we need to extract the originally requested permissions data, if any,
// and use them for each next file to be uploaded. Note the requested perms are not the same as the
- // granted ones found in the given "content" structure but can still be found in mPostData. -MG
- U32 everyone_perms = mPostData.has("everyone_mask") ? mPostData.get("everyone_mask" ).asInteger() : PERM_NONE;
- U32 group_perms = mPostData.has("group_mask") ? mPostData.get("group_mask" ).asInteger() : PERM_NONE;
- U32 next_owner_perms = mPostData.has("next_owner_mask") ? mPostData.get("next_owner_mask").asInteger() : PERM_NONE;
+ U32 everyone_perms =
+ content.has("everyone_mask") ?
+ content["everyone_mask"].asInteger() :
+ PERM_NONE;
+
+ U32 group_perms =
+ content.has("group_mask") ?
+ content["group_mask"].asInteger() :
+ PERM_NONE;
+
+ U32 next_owner_perms =
+ content.has("next_owner_mask") ?
+ content["next_owner_mask"].asInteger() :
+ PERM_NONE;
+
std::string display_name = LLStringUtil::null;
LLAssetStorage::LLStoreAssetCallback callback = NULL;
void *userdata = NULL;
- upload_new_resource(next_file, asset_name, asset_name,
- 0, LLFolderType::FT_NONE, LLInventoryType::IT_NONE,
- next_owner_perms, group_perms,
- everyone_perms, display_name,
- callback, expected_upload_cost, userdata);
+
+ upload_new_resource(
+ next_file,
+ asset_name,
+ asset_name,
+ 0,
+ LLFolderType::FT_NONE,
+ LLInventoryType::IT_NONE,
+ next_owner_perms,
+ group_perms,
+ everyone_perms,
+ display_name,
+ callback,
+ LLGlobalEconomy::Singleton::getInstance()->getPriceUpload(),
+ userdata);
}
+
+ //LLImportColladaAssetCache::getInstance()->assetUploaded(mVFileID, content["new_asset"], TRUE);
}
LLSendTexLayerResponder::LLSendTexLayerResponder(const LLSD& post_data,
@@ -390,17 +472,19 @@ void LLSendTexLayerResponder::error(U32 statusNum, const std::string& reason)
mBakedUploadData = NULL; // deleted in onTextureUploadComplete()
}
-LLUpdateAgentInventoryResponder::LLUpdateAgentInventoryResponder(const LLSD& post_data,
- const LLUUID& vfile_id,
- LLAssetType::EType asset_type)
-: LLAssetUploadResponder(post_data, vfile_id, asset_type)
+LLUpdateAgentInventoryResponder::LLUpdateAgentInventoryResponder(
+ const LLSD& post_data,
+ const LLUUID& vfile_id,
+ LLAssetType::EType asset_type)
+ : LLAssetUploadResponder(post_data, vfile_id, asset_type)
{
}
-LLUpdateAgentInventoryResponder::LLUpdateAgentInventoryResponder(const LLSD& post_data,
- const std::string& file_name,
- LLAssetType::EType asset_type)
-: LLAssetUploadResponder(post_data, file_name, asset_type)
+LLUpdateAgentInventoryResponder::LLUpdateAgentInventoryResponder(
+ const LLSD& post_data,
+ const std::string& file_name,
+ LLAssetType::EType asset_type)
+ : LLAssetUploadResponder(post_data, file_name, asset_type)
{
}
@@ -583,3 +667,474 @@ void LLUpdateTaskInventoryResponder::uploadComplete(const LLSD& content)
break;
}
}
+
+
+/////////////////////////////////////////////////////
+// LLNewAgentInventoryVariablePriceResponder::Impl //
+/////////////////////////////////////////////////////
+class LLNewAgentInventoryVariablePriceResponder::Impl
+{
+public:
+ Impl(
+ const LLUUID& vfile_id,
+ LLAssetType::EType asset_type,
+ const LLSD& inventory_data) :
+ mVFileID(vfile_id),
+ mAssetType(asset_type),
+ mInventoryData(inventory_data),
+ mFileName("")
+ {
+ if (!gVFS->getExists(vfile_id, asset_type))
+ {
+ llwarns
+ << "LLAssetUploadResponder called with nonexistant "
+ << "vfile_id " << vfile_id << llendl;
+ mVFileID.setNull();
+ mAssetType = LLAssetType::AT_NONE;
+ }
+ }
+
+ Impl(
+ const std::string& file_name,
+ LLAssetType::EType asset_type,
+ const LLSD& inventory_data) :
+ mFileName(file_name),
+ mAssetType(asset_type),
+ mInventoryData(inventory_data)
+ {
+ mVFileID.setNull();
+ }
+
+ std::string getFilenameOrIDString() const
+ {
+ return (mFileName.empty() ? mVFileID.asString() : mFileName);
+ }
+
+ LLUUID getVFileID() const
+ {
+ return mVFileID;
+ }
+
+ std::string getFilename() const
+ {
+ return mFileName;
+ }
+
+ LLAssetType::EType getAssetType() const
+ {
+ return mAssetType;
+ }
+
+ LLInventoryType::EType getInventoryType() const
+ {
+ return LLInventoryType::lookup(
+ mInventoryData["inventory_type"].asString());
+ }
+
+ std::string getInventoryTypeString() const
+ {
+ return mInventoryData["inventory_type"].asString();
+ }
+
+ LLUUID getFolderID() const
+ {
+ return mInventoryData["folder_id"].asUUID();
+ }
+
+ std::string getItemName() const
+ {
+ return mInventoryData["name"].asString();
+ }
+
+ std::string getItemDescription() const
+ {
+ return mInventoryData["description"].asString();
+ }
+
+ void displayCannotUploadReason(const std::string& reason)
+ {
+ LLSD args;
+ args["FILE"] = getFilenameOrIDString();
+ args["REASON"] = reason;
+
+
+ LLNotificationsUtil::add("CannotUploadReason", args);
+ LLUploadDialog::modalUploadFinished();
+ }
+
+ void onApplicationLevelError(const LLSD& error)
+ {
+ static const std::string _IDENTIFIER = "identifier";
+
+ static const std::string _INSUFFICIENT_FUNDS =
+ "NewAgentInventory_InsufficientLindenDollarBalance";
+ static const std::string _MISSING_REQUIRED_PARAMETER =
+ "NewAgentInventory_MissingRequiredParamater";
+ static const std::string _INVALID_REQUEST_BODY =
+ "NewAgentInventory_InvalidRequestBody";
+ static const std::string _RESOURCE_COST_DIFFERS =
+ "NewAgentInventory_ResourceCostDiffers";
+
+ static const std::string _MISSING_PARAMETER = "missing_parameter";
+ static const std::string _INVALID_PARAMETER = "invalid_parameter";
+ static const std::string _MISSING_RESOURCE = "missing_resource";
+ static const std::string _INVALID_RESOURCE = "invalid_resource";
+
+ // TODO* Add the other error_identifiers
+
+ std::string error_identifier = error[_IDENTIFIER].asString();
+
+ // TODO*: Pull these user visible strings from an xml file
+ // to be localized
+ if ( _INSUFFICIENT_FUNDS == error_identifier )
+ {
+ displayCannotUploadReason("You do not have a sufficient L$ balance to complete this upload.");
+ }
+ else if ( _MISSING_REQUIRED_PARAMETER == error_identifier )
+ {
+ // Missing parameters
+ if (error.has(_MISSING_PARAMETER) )
+ {
+ std::string message =
+ "Upload request was missing required parameter '[P]'";
+ LLStringUtil::replaceString(
+ message,
+ "[P]",
+ error[_MISSING_PARAMETER].asString());
+
+ displayCannotUploadReason(message);
+ }
+ else
+ {
+ std::string message =
+ "Upload request was missing a required parameter";
+ displayCannotUploadReason(message);
+ }
+ }
+ else if ( _INVALID_REQUEST_BODY == error_identifier )
+ {
+ // Invalid request body, check to see if
+ // a particular parameter was invalid
+ if ( error.has(_INVALID_PARAMETER) )
+ {
+ std::string message = "Upload parameter '[P]' is invalid.";
+ LLStringUtil::replaceString(
+ message,
+ "[P]",
+ error[_INVALID_PARAMETER].asString());
+
+ // See if the server also responds with what resource
+ // is missing.
+ if ( error.has(_MISSING_RESOURCE) )
+ {
+ message += "\nMissing resource '[R]'.";
+
+ LLStringUtil::replaceString(
+ message,
+ "[R]",
+ error[_MISSING_RESOURCE].asString());
+ }
+ else if ( error.has(_INVALID_RESOURCE) )
+ {
+ message += "\nInvalid resource '[R]'.";
+
+ LLStringUtil::replaceString(
+ message,
+ "[R]",
+ error[_INVALID_RESOURCE].asString());
+ }
+
+ displayCannotUploadReason(message);
+ }
+ else
+ {
+ std::string message = "Upload request was malformed";
+ displayCannotUploadReason(message);
+ }
+ }
+ else if ( _RESOURCE_COST_DIFFERS == error_identifier )
+ {
+ displayCannotUploadReason("The resource cost associated with this upload is not consistent with the server.");
+ }
+ else
+ {
+ displayCannotUploadReason("Unknown Error");
+ }
+ }
+
+ void onTransportError()
+ {
+ displayCannotUploadReason(
+ "The server is experiencing unexpected difficulties.");
+ }
+
+ void onTransportError(const LLSD& error)
+ {
+ static const std::string _IDENTIFIER = "identifier";
+
+ static const std::string _SERVER_ERROR_AFTER_CHARGE =
+ "NewAgentInventory_ServerErrorAfterCharge";
+
+ std::string error_identifier = error[_IDENTIFIER].asString();
+
+ // TODO*: Pull the user visible strings from an xml file
+ // to be localized
+
+ if ( _SERVER_ERROR_AFTER_CHARGE == error_identifier )
+ {
+ displayCannotUploadReason(
+ "The server is experiencing unexpected difficulties. You may have been charged for the upload.");
+ }
+ else
+ {
+ displayCannotUploadReason(
+ "The server is experiencing unexpected difficulties.");
+ }
+ }
+
+ bool uploadConfirmationCallback(
+ const LLSD& notification,
+ const LLSD& response,
+ boost::intrusive_ptr<LLNewAgentInventoryVariablePriceResponder> responder)
+ {
+ S32 option;
+ std::string confirmation_url;
+
+ option = LLNotificationsUtil::getSelectedOption(
+ notification,
+ response);
+
+ confirmation_url =
+ notification["payload"]["confirmation_url"].asString();
+
+ // Yay! We are confirming or cancelling our upload
+ switch(option)
+ {
+ case 0:
+ {
+ confirmUpload(confirmation_url, responder);
+ }
+ break;
+ case 1:
+ default:
+ break;
+ }
+
+ return false;
+ }
+
+ void confirmUpload(
+ const std::string& confirmation_url,
+ boost::intrusive_ptr<LLNewAgentInventoryVariablePriceResponder> responder)
+ {
+ if ( getFilename().empty() )
+ {
+ // we have no filename, use virtual file ID instead
+ LLHTTPClient::postFile(
+ confirmation_url,
+ getVFileID(),
+ getAssetType(),
+ responder);
+ }
+ else
+ {
+ LLHTTPClient::postFile(
+ confirmation_url,
+ getFilename(),
+ responder);
+ }
+ }
+
+
+private:
+ std::string mFileName;
+
+ LLSD mInventoryData;
+ LLAssetType::EType mAssetType;
+ LLUUID mVFileID;
+};
+
+///////////////////////////////////////////////
+// LLNewAgentInventoryVariablePriceResponder //
+///////////////////////////////////////////////
+LLNewAgentInventoryVariablePriceResponder::LLNewAgentInventoryVariablePriceResponder(
+ const LLUUID& vfile_id,
+ LLAssetType::EType asset_type,
+ const LLSD& inventory_info)
+{
+ mImpl = new Impl(
+ vfile_id,
+ asset_type,
+ inventory_info);
+}
+
+LLNewAgentInventoryVariablePriceResponder::LLNewAgentInventoryVariablePriceResponder(
+ const std::string& file_name,
+ LLAssetType::EType asset_type,
+ const LLSD& inventory_info)
+{
+ mImpl = new Impl(
+ file_name,
+ asset_type,
+ inventory_info);
+}
+
+LLNewAgentInventoryVariablePriceResponder::~LLNewAgentInventoryVariablePriceResponder()
+{
+ delete mImpl;
+}
+
+void LLNewAgentInventoryVariablePriceResponder::errorWithContent(
+ U32 statusNum,
+ const std::string& reason,
+ const LLSD& content)
+{
+ lldebugs
+ << "LLNewAgentInventoryVariablePrice::error " << statusNum
+ << " reason: " << reason << llendl;
+
+ if ( content.has("error") )
+ {
+ static const std::string _ERROR = "error";
+
+ mImpl->onTransportError(content[_ERROR]);
+ }
+ else
+ {
+ mImpl->onTransportError();
+ }
+}
+
+void LLNewAgentInventoryVariablePriceResponder::result(const LLSD& content)
+{
+ // Parse out application level errors and the appropriate
+ // responses for them
+ static const std::string _ERROR = "error";
+ static const std::string _STATE = "state";
+
+ static const std::string _COMPLETE = "complete";
+ static const std::string _CONFIRM_UPLOAD = "confirm_upload";
+
+ static const std::string _UPLOAD_PRICE = "upload_price";
+ static const std::string _RESOURCE_COST = "resource_cost";
+ static const std::string _RSVP = "rsvp";
+
+ // Check for application level errors
+ if ( content.has(_ERROR) )
+ {
+ onApplicationLevelError(content[_ERROR]);
+ return;
+ }
+
+ std::string state = content[_STATE];
+ LLAssetType::EType asset_type = mImpl->getAssetType();
+
+ if ( _COMPLETE == state )
+ {
+ // rename file in VFS with new asset id
+ if (mImpl->getFilename().empty())
+ {
+ // rename the file in the VFS to the actual asset id
+ // llinfos << "Changing uploaded asset UUID to " << content["new_asset"].asUUID() << llendl;
+ gVFS->renameFile(
+ mImpl->getVFileID(),
+ asset_type,
+ content["new_asset"].asUUID(),
+ asset_type);
+ }
+
+ on_new_single_inventory_upload_complete(
+ asset_type,
+ mImpl->getInventoryType(),
+ mImpl->getInventoryTypeString(),
+ mImpl->getFolderID(),
+ mImpl->getItemName(),
+ mImpl->getItemDescription(),
+ content,
+ content[_UPLOAD_PRICE].asInteger());
+
+ // TODO* Add bulk (serial) uploading or add
+ // a super class of this that does so
+ }
+ else if ( _CONFIRM_UPLOAD == state )
+ {
+ showConfirmationDialog(
+ content[_UPLOAD_PRICE].asInteger(),
+ content[_RESOURCE_COST].asInteger(),
+ content[_RSVP].asString());
+ }
+ else
+ {
+ onApplicationLevelError("");
+ }
+}
+
+void LLNewAgentInventoryVariablePriceResponder::onApplicationLevelError(
+ const LLSD& error)
+{
+ mImpl->onApplicationLevelError(error);
+}
+
+void LLNewAgentInventoryVariablePriceResponder::showConfirmationDialog(
+ S32 upload_price,
+ S32 resource_cost,
+ const std::string& confirmation_url)
+{
+ if ( 0 == upload_price )
+ {
+ // don't show confirmation dialog for free uploads, I mean,
+ // they're free!
+
+ // The creating of a new instrusive_ptr(this)
+ // creates a new boost::intrusive_ptr
+ // which is a copy of this. This code is required because
+ // 'this' is always of type Class* and not the intrusive_ptr,
+ // and thus, a reference to 'this' is not registered
+ // by using just plain 'this'.
+
+ // Since LLNewAgentInventoryVariablePriceResponder is a
+ // reference counted class, it is possible (since the
+ // reference to a plain 'this' would be missed here) that,
+ // when using plain ol' 'this', that this object
+ // would be deleted before the callback is triggered
+ // and cause sadness.
+ mImpl->confirmUpload(
+ confirmation_url,
+ boost::intrusive_ptr<LLNewAgentInventoryVariablePriceResponder>(this));
+ }
+ else
+ {
+ LLSD substitutions;
+ LLSD payload;
+
+ substitutions["PRICE"] = upload_price;
+
+ payload["confirmation_url"] = confirmation_url;
+
+ // The creating of a new instrusive_ptr(this)
+ // creates a new boost::intrusive_ptr
+ // which is a copy of this. This code is required because
+ // 'this' is always of type Class* and not the intrusive_ptr,
+ // and thus, a reference to 'this' is not registered
+ // by using just plain 'this'.
+
+ // Since LLNewAgentInventoryVariablePriceResponder is a
+ // reference counted class, it is possible (since the
+ // reference to a plain 'this' would be missed here) that,
+ // when using plain ol' 'this', that this object
+ // would be deleted before the callback is triggered
+ // and cause sadness.
+ LLNotificationsUtil::add(
+ "UploadCostConfirmation",
+ substitutions,
+ payload,
+ boost::bind(
+ &LLNewAgentInventoryVariablePriceResponder::Impl::uploadConfirmationCallback,
+ mImpl,
+ _1,
+ _2,
+ boost::intrusive_ptr<LLNewAgentInventoryVariablePriceResponder>(this)));
+ }
+}
+
+
diff --git a/indra/newview/llassetuploadresponders.h b/indra/newview/llassetuploadresponders.h
index 752c0dfe45..70871b62e2 100644
--- a/indra/newview/llassetuploadresponders.h
+++ b/indra/newview/llassetuploadresponders.h
@@ -55,15 +55,58 @@ protected:
std::string mFileName;
};
+// TODO*: Remove this once deprecated
class LLNewAgentInventoryResponder : public LLAssetUploadResponder
{
public:
- LLNewAgentInventoryResponder(const LLSD& post_data,
- const LLUUID& vfile_id,
- LLAssetType::EType asset_type);
- LLNewAgentInventoryResponder(const LLSD& post_data, const std::string& file_name,
- LLAssetType::EType asset_type);
+ LLNewAgentInventoryResponder(
+ const LLSD& post_data,
+ const LLUUID& vfile_id,
+ LLAssetType::EType asset_type);
+ LLNewAgentInventoryResponder(
+ const LLSD& post_data,
+ const std::string& file_name,
+ LLAssetType::EType asset_type);
+ virtual void error(U32 statusNum, const std::string& reason);
virtual void uploadComplete(const LLSD& content);
+ virtual void uploadFailure(const LLSD& content);
+};
+
+// A base class which goes through and performs some default
+// actions for variable price uploads. If more specific actions
+// are needed (such as different confirmation messages, etc.)
+// the functions onApplicationLevelError and showConfirmationDialog.
+class LLNewAgentInventoryVariablePriceResponder :
+ public LLHTTPClient::Responder
+{
+public:
+ LLNewAgentInventoryVariablePriceResponder(
+ const LLUUID& vfile_id,
+ LLAssetType::EType asset_type,
+ const LLSD& inventory_info);
+
+ LLNewAgentInventoryVariablePriceResponder(
+ const std::string& file_name,
+ LLAssetType::EType asset_type,
+ const LLSD& inventory_info);
+ virtual ~LLNewAgentInventoryVariablePriceResponder();
+
+ void errorWithContent(
+ U32 statusNum,
+ const std::string& reason,
+ const LLSD& content);
+ void result(const LLSD& content);
+
+ virtual void onApplicationLevelError(
+ const LLSD& error);
+ virtual void showConfirmationDialog(
+ S32 upload_price,
+ S32 resource_cost,
+ const std::string& confirmation_url);
+
+private:
+ class Impl;
+ Impl* mImpl;
};
struct LLBakedUploadData;
diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp
index ca7ec7cc30..cbbdcb2983 100644..100755
--- a/indra/newview/llavataractions.cpp
+++ b/indra/newview/llavataractions.cpp
@@ -302,8 +302,14 @@ void LLAvatarActions::startConference(const uuid_vec_t& ids)
static void on_avatar_name_show_profile(const LLUUID& agent_id, const LLAvatarName& av_name)
{
- llinfos << "opening web profile for " << av_name.mUsername << llendl;
- std::string url = getProfileURL(av_name.mUsername);
+ std::string username = av_name.mUsername;
+ if (username.empty())
+ {
+ username = LLCacheName::buildUsername(av_name.mDisplayName);
+ }
+
+ llinfos << "opening web profile for " << username << llendl;
+ std::string url = getProfileURL(username);
// PROFILES: open in webkit window
LLWeb::loadWebURLInternal(url, "", agent_id.asString());
diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp
index 0371b7be71..01d19c5ba0 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"
@@ -218,7 +219,7 @@ LLBottomTray::LLBottomTray(const LLSD&)
mLandingTab(NULL),
mCheckForDrag(false)
{
- // Firstly add ourself to IMSession observers, so we catch session events
+ // Firstly add our self to IMSession observers, so we catch session events
// before chiclets do that.
LLIMMgr::getInstance()->addSessionObserver(this);
@@ -378,12 +379,13 @@ void LLBottomTray::onChange(EStatusType status, const std::string &channelURI, b
}
// We have to enable/disable right and left parts of speak button separately (EXT-4648)
- mSpeakBtn->setSpeakBtnEnabled(enable);
+ getChild<LLButton>("speak_btn")->setEnabled(enable);
+
// skipped to avoid button blinking
if (status != STATUS_JOINING && status!= STATUS_LEFT_CHANNEL)
{
bool voice_status = LLVoiceClient::getInstance()->voiceEnabled() && LLVoiceClient::getInstance()->isVoiceWorking();
- mSpeakBtn->setFlyoutBtnEnabled(voice_status);
+ getChild<LLButton>("speak_flyout_btn")->setEnabled(voice_status);
if (voice_status)
{
LLFirstUse::speak(true);
@@ -492,26 +494,6 @@ void LLBottomTray::updateContextMenu(S32 x, S32 y, MASK mask)
mBottomTrayContextMenu->setItemVisible("NearbyChatBar_Select_All", in_edit_box);
}
-void LLBottomTray::showGestureButton(BOOL visible)
-{
- setTrayButtonVisibleIfPossible(RS_BUTTON_GESTURES, visible);
-}
-
-void LLBottomTray::showMoveButton(BOOL visible)
-{
- setTrayButtonVisibleIfPossible(RS_BUTTON_MOVEMENT, visible);
-}
-
-void LLBottomTray::showCameraButton(BOOL visible)
-{
- setTrayButtonVisibleIfPossible(RS_BUTTON_CAMERA, visible);
-}
-
-void LLBottomTray::showSnapshotButton(BOOL visible)
-{
- setTrayButtonVisibleIfPossible(RS_BUTTON_SNAPSHOT, visible);
-}
-
void LLBottomTray::showSpeakButton(bool visible)
{
// Show/hide the button
@@ -556,6 +538,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");
@@ -566,17 +550,27 @@ BOOL LLBottomTray::postBuild()
setRightMouseDownCallback(boost::bind(&LLBottomTray::showBottomTrayContextMenu,this, _2, _3,_4));
mSpeakPanel = getChild<LLPanel>("speak_panel");
- mSpeakBtn = getChild<LLSpeakButton>("talk");
- LLHints::registerHintTarget("speak_btn", mSpeakBtn->getHandle());
+ mSpeakBtn = findChild<LLSpeakButton>("talk");
+ if (mSpeakBtn)
+ {
+ LLHints::registerHintTarget("speak_btn", mSpeakBtn->getHandle());
+
+ // Localization tool doesn't understand custom buttons like <talk_button>
+ mSpeakBtn->setSpeakToolTip( getString("SpeakBtnToolTip") );
+ mSpeakBtn->setShowToolTip( getString("VoiceControlBtnToolTip") );
+ }
+ else
+ {
+ LLTransientFloaterMgr::getInstance()->addControlView(getChild<LLButton>("speak_btn"));
+ LLTransientFloaterMgr::getInstance()->addControlView(getChild<LLButton>("flyout_btn"));
+ }
+
// Both parts of speak button should be initially disabled because
// it takes some time between logging in to world and connecting to voice channel.
- mSpeakBtn->setSpeakBtnEnabled(false);
- mSpeakBtn->setFlyoutBtnEnabled(false);
+ getChild<LLButton>("speak_btn")->setEnabled(false);
+ getChild<LLButton>("speak_flyout_btn")->setEnabled(false);
- // Localization tool doesn't understand custom buttons like <talk_button>
- mSpeakBtn->setSpeakToolTip( getString("SpeakBtnToolTip") );
- mSpeakBtn->setShowToolTip( getString("VoiceControlBtnToolTip") );
// Registering Chat Bar to receive Voice client status change notifications.
LLVoiceClient::getInstance()->addObserver(this);
@@ -760,6 +754,8 @@ void LLBottomTray::updateButtonsOrdersAfterDnD()
void LLBottomTray::saveButtonsOrder()
{
+ if (!gSavedSettings.getBOOL("AllowBottomTrayButtonReordering")) return;
+
std::string user_dir = gDirUtilp->getLindenUserDir();
if (user_dir.empty()) return;
@@ -780,6 +776,8 @@ void LLBottomTray::saveButtonsOrder()
void LLBottomTray::loadButtonsOrder()
{
+ if (!gSavedSettings.getBOOL("AllowBottomTrayButtonReordering")) return;
+
// load per-resident sorting information
std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, SORTING_DATA_FILE_NAME);
@@ -872,6 +870,10 @@ void LLBottomTray::draw()
getChild<LLButton>("show_help_btn")->setToggleState(help_floater_visible);
+ bool openmic = LLVoiceClient::getInstance()->getUserPTTState();
+ bool voiceenabled = LLVoiceClient::getInstance()->voiceEnabled();
+ getChild<LLButton>("speak_btn")->setToggleState(openmic && voiceenabled);
+ getChild<LLOutputMonitorCtrl>("chat_zone_indicator")->setIsMuted(!voiceenabled);
}
@@ -936,15 +938,14 @@ void LLBottomTray::log(LLView* panel, const std::string& descr)
{
if (NULL == panel) return;
LLView* layout = panel->getParent();
- lldebugs << descr << ": "
+ LL_DEBUGS("Bottom Tray Rects") << descr << ": "
<< "panel: " << panel->getName()
<< ", rect: " << panel->getRect()
- << "layout: " << layout->getName()
+ << " layout: " << layout->getName()
<< ", rect: " << layout->getRect()
- << llendl
- ;
+ << LL_ENDL;
}
void LLBottomTray::reshape(S32 width, S32 height, BOOL called_from_parent)
@@ -964,7 +965,9 @@ void LLBottomTray::reshape(S32 width, S32 height, BOOL called_from_parent)
if (mNearbyChatBar) log(mNearbyChatBar, "before");
if (mChicletPanel) log(mChicletPanel, "before");
- // stores width size on which bottom tray is less than width required by its children. EXT-991
+ // Difference between bottom tray width required to fit its children and the actual width. (see EXT-991)
+ // Positive value means that bottom tray is not wide enough.
+ // Negative value means that there is free space.
static S32 extra_shrink_width = 0;
bool should_be_reshaped = true;
@@ -986,11 +989,9 @@ void LLBottomTray::reshape(S32 width, S32 height, BOOL called_from_parent)
// bottom tray is narrowed
if (delta_width < 0)
{
- if (extra_shrink_width > 0)
+ if (extra_shrink_width > 0) // not enough space
{
- // is world rect was extra shrunk and decreasing again only update this value
- // to delta_width negative
- extra_shrink_width -= delta_width; // use "-=" because delta_width is negative
+ extra_shrink_width += llabs(delta_width);
should_be_reshaped = false;
}
else
@@ -1001,13 +1002,13 @@ void LLBottomTray::reshape(S32 width, S32 height, BOOL called_from_parent)
width += extra_shrink_width;
}
}
- // bottom tray is widen
+ // bottom tray is widened
else
{
if (extra_shrink_width > delta_width)
{
- // Less than minimum width is more than increasing (delta_width)
- // only reduce it value and make no reshape
+ // Still not enough space.
+ // Only subtract the delta from the required delta and don't reshape.
extra_shrink_width -= delta_width;
should_be_reshaped = false;
}
@@ -1047,6 +1048,7 @@ void LLBottomTray::reshape(S32 width, S32 height, BOOL called_from_parent)
{
mDesiredNearbyChatWidth = new_width;
processChatbarCustomization(new_width);
+ lldebugs << "Setting nearby chat bar width to " << new_width << " px" << llendl;
mChatBarContainer->reshape(new_width, mChatBarContainer->getRect().getHeight());
}
needs_restore_custom_state = false;
@@ -1058,30 +1060,28 @@ S32 LLBottomTray::processWidthDecreased(S32 delta_width)
{
bool still_should_be_processed = true;
- const S32 chiclet_panel_width = mChicletPanel->getParent()->getRect().getWidth();
- const S32 chiclet_panel_min_width = mChicletPanel->getMinWidth();
+ const S32 chiclet_panel_shrink_headroom = getChicletPanelShrinkHeadroom();
// There are four steps of processing width decrease. If in one of them required width was reached,
// further are not needed.
// 1. Decreasing width of chiclet panel.
- if (chiclet_panel_width > chiclet_panel_min_width)
+ if (chiclet_panel_shrink_headroom > 0)
{
// we have some space to decrease chiclet panel
- S32 panel_delta_min = chiclet_panel_width - chiclet_panel_min_width;
-
- S32 delta_panel = llmin(-delta_width, panel_delta_min);
+ S32 shrink_by = llmin(-delta_width, chiclet_panel_shrink_headroom);
lldebugs << "delta_width: " << delta_width
- << ", panel_delta_min: " << panel_delta_min
- << ", delta_panel: " << delta_panel
+ << ", panel_delta_min: " << chiclet_panel_shrink_headroom
+ << ", shrink_by: " << shrink_by
<< llendl;
- // is chiclet panel width enough to process resizing?
- delta_width += panel_delta_min;
+ // is chiclet panel wide enough to process resizing?
+ delta_width += chiclet_panel_shrink_headroom;
still_should_be_processed = delta_width < 0;
- mChicletPanel->getParent()->reshape(mChicletPanel->getParent()->getRect().getWidth() - delta_panel, mChicletPanel->getParent()->getRect().getHeight());
+ lldebugs << "Shrinking chiclet panel by " << shrink_by << " px" << llendl;
+ mChicletPanel->getParent()->reshape(mChicletPanel->getParent()->getRect().getWidth() - shrink_by, mChicletPanel->getParent()->getRect().getHeight());
log(mChicletPanel, "after processing panel decreasing via chiclet panel");
lldebugs << "RS_CHICLET_PANEL"
@@ -1105,7 +1105,7 @@ S32 LLBottomTray::processWidthDecreased(S32 delta_width)
S32 delta_panel = llmin(-delta_width, panel_delta_min);
- // whether chatbar panel width is enough to process resizing?
+ // is chatbar panel wide enough to process resizing?
delta_width += panel_delta_min;
still_should_be_processed = delta_width < 0;
@@ -1113,6 +1113,7 @@ S32 LLBottomTray::processWidthDecreased(S32 delta_width)
// chatbar should only be shrunk here, not stretched
if(delta_panel > 0)
{
+ lldebugs << "Shrinking nearby chat bar by " << delta_panel << " px " << llendl;
mChatBarContainer->reshape(mNearbyChatBar->getRect().getWidth() - delta_panel, mChatBarContainer->getRect().getHeight());
}
@@ -1144,6 +1145,7 @@ S32 LLBottomTray::processWidthDecreased(S32 delta_width)
{
S32 compensative_width = nearby_needed_width > buttons_freed_width ? buttons_freed_width : nearby_needed_width;
log(mNearbyChatBar, "before applying compensative width");
+ lldebugs << "Extending nearby chat bar by " << compensative_width << " px" << llendl;
mChatBarContainer->reshape(mChatBarContainer->getRect().getWidth() + compensative_width, mChatBarContainer->getRect().getHeight() );
log(mNearbyChatBar, "after applying compensative width");
lldebugs << buttons_freed_width << llendl;
@@ -1158,52 +1160,46 @@ void LLBottomTray::processWidthIncreased(S32 delta_width)
{
if (delta_width <= 0) return;
- const S32 chiclet_panel_width = mChicletPanel->getParent()->getRect().getWidth();
- static const S32 chiclet_panel_min_width = mChicletPanel->getMinWidth();
+ // how much room we have to show hidden buttons
+ S32 available_width = delta_width + getChicletPanelShrinkHeadroom();
- const S32 available_width_chiclet = chiclet_panel_width - chiclet_panel_min_width;
+ lldebugs << "Distributing (" << getChicletPanelShrinkHeadroom()
+ << " + " << delta_width << ") = " << available_width << " px" << llendl;
- // how many room we have to show hidden buttons
- S32 total_available_width = delta_width + available_width_chiclet;
+ // 1. Try showing buttons that have been auto-hidden.
+ S32 processed_width = processShowButtons(available_width);
+ lldebugs << "processed_width = " << processed_width << ", delta_width = " << delta_width << llendl;
- lldebugs << "Processing extending, available width:"
- << ", chiclets - " << available_width_chiclet
- << ", total - " << total_available_width
- << llendl;
+ lldebugs << "Available_width after showing buttons: " << available_width << llendl;
- S32 available_width = total_available_width;
-
- processShowButtons(available_width);
-
- // if we have to show/extend some buttons but resized delta width is not enough...
- S32 processed_width = total_available_width - available_width;
+ // If the newly shown buttons have consumed more than delta_width pixels,
+ // shrink the chiclet panel.
if (processed_width > delta_width)
{
- // ... let's shrink nearby chat & chiclet panels
- S32 required_to_process_width = processed_width;
-
// 1. use delta width of resizing
- required_to_process_width -= delta_width;
+ S32 shrink_by = processed_width - delta_width;
// 2. use width available via decreasing of chiclet panel
- if (required_to_process_width > 0)
+ if (shrink_by > 0)
{
- mChicletPanel->getParent()->reshape(mChicletPanel->getParent()->getRect().getWidth() - required_to_process_width, mChicletPanel->getParent()->getRect().getHeight());
+ lldebugs << "Shrinking chiclet panel by " << shrink_by << " px" << llendl;
+ mChicletPanel->getParent()->reshape(mChicletPanel->getParent()->getRect().getWidth() - shrink_by, mChicletPanel->getParent()->getRect().getHeight());
log(mChicletPanel, "after applying compensative width for chiclets: ");
- lldebugs << required_to_process_width << llendl;
+ lldebugs << shrink_by << llendl;
}
+ // shown buttons take some space, rest should be processed by nearby chatbar & chiclet panels
+ delta_width -= processed_width;
}
- // shown buttons take some space, rest should be processed by nearby chatbar & chiclet panels
- delta_width -= processed_width;
-
-
- // how many space can nearby chatbar take?
- S32 chatbar_panel_width_ = mChatBarContainer->getRect().getWidth();
- if (delta_width > 0 && chatbar_panel_width_ < mDesiredNearbyChatWidth)
+ // 2. Expand the nearby chat bar if needed.
+ S32 chatbar_panel_width = mChatBarContainer->getRect().getWidth();
+ lldebugs << "delta_width = " << delta_width
+ << ", chatbar_panel_width = " << chatbar_panel_width
+ << ", mDesiredNearbyChatWidth = " << mDesiredNearbyChatWidth << llendl;
+ if (delta_width > 0 && chatbar_panel_width < mDesiredNearbyChatWidth)
{
- S32 delta_panel_max = mDesiredNearbyChatWidth - chatbar_panel_width_;
+ S32 delta_panel_max = mDesiredNearbyChatWidth - chatbar_panel_width;
S32 delta_panel = llmin(delta_width, delta_panel_max);
lldebugs << "Unprocesed delta width: " << delta_width
<< ", can be applied to chatbar: " << delta_panel_max
@@ -1211,17 +1207,25 @@ void LLBottomTray::processWidthIncreased(S32 delta_width)
<< llendl;
delta_width -= delta_panel_max;
- mChatBarContainer->reshape(chatbar_panel_width_ + delta_panel, mChatBarContainer->getRect().getHeight());
+ lldebugs << "Extending nearby chat bar by " << delta_panel << " px " << llendl;
+ mChatBarContainer->reshape(chatbar_panel_width + delta_panel, mChatBarContainer->getRect().getHeight());
log(mNearbyChatBar, "applied unprocessed delta width");
}
+
+ // 3. Expand buttons that have been auto-shrunk,
+ // if we haven't yet consumed all the available headroom.
if (delta_width > 0)
{
- processExtendButtons(delta_width);
+ S32 available_width = delta_width + getChicletPanelShrinkHeadroom();
+ processExtendButtons(available_width);
}
}
-void LLBottomTray::processShowButtons(S32& available_width)
+S32 LLBottomTray::processShowButtons(S32& available_width)
{
+ lldebugs << "Distributing " << available_width << " px" << llendl;
+ S32 original_available_width = available_width;
+
// process buttons from left to right
resize_state_vec_t::const_iterator it = mButtonsProcessOrder.begin();
const resize_state_vec_t::const_iterator it_end = mButtonsProcessOrder.end();
@@ -1234,37 +1238,20 @@ void LLBottomTray::processShowButtons(S32& available_width)
// try to show next button
processShowButton(*it, available_width);
}
+
+ return original_available_width - available_width;
}
bool LLBottomTray::processShowButton(EResizeState shown_object_type, S32& available_width)
{
- lldebugs << "Trying to show object type: " << shown_object_type << llendl;
-
- LLPanel* panel = getButtonPanel(shown_object_type);
- if (NULL == panel)
+ // Check if the button was previously auto-hidden (due to lack of space).
+ if (!isAutoHidden(shown_object_type))
{
- lldebugs << "There is no object to process for state: " << shown_object_type << llendl;
return false;
}
- bool can_be_shown = canButtonBeShown(shown_object_type);
- if (can_be_shown)
- {
- //validate if we have enough room to show this button
- const S32 required_width = panel->getRect().getWidth();
- can_be_shown = available_width >= required_width;
- if (can_be_shown)
- {
- available_width -= required_width;
- setTrayButtonVisible(shown_object_type, true);
-
- lldebugs << "processed object type: " << shown_object_type
- << ", rest available width: " << available_width
- << llendl;
- mResizeState &= ~shown_object_type;
- }
- }
- return can_be_shown;
+ // Ok. Try showing the button.
+ return showButton(shown_object_type, available_width);
}
void LLBottomTray::processHideButtons(S32& required_width, S32& buttons_freed_width)
@@ -1289,7 +1276,6 @@ void LLBottomTray::processHideButton(EResizeState processed_object_type, S32& re
LLPanel* panel = getButtonPanel(processed_object_type);
if (NULL == panel)
{
- lldebugs << "There is no object to process for state: " << processed_object_type << llendl;
return;
}
@@ -1304,7 +1290,7 @@ void LLBottomTray::processHideButton(EResizeState processed_object_type, S32& re
setTrayButtonVisible(processed_object_type, false);
- mResizeState |= processed_object_type;
+ setAutoHidden(processed_object_type, true);
lldebugs << "processing object type: " << processed_object_type
<< ", buttons_freed_width: " << buttons_freed_width
@@ -1345,7 +1331,11 @@ void LLBottomTray::processShrinkButtons(S32& required_width, S32& buttons_freed_
if (possible_shrink_width > 0)
{
- mSpeakBtn->setLabelVisible(false);
+ if (mSpeakBtn)
+ {
+ mSpeakBtn->setLabelVisible(false);
+ }
+
mSpeakPanel->reshape(panel_width - possible_shrink_width, mSpeakPanel->getRect().getHeight());
required_width += possible_shrink_width;
@@ -1369,7 +1359,6 @@ void LLBottomTray::processShrinkButton(EResizeState processed_object_type, S32&
LLPanel* panel = getButtonPanel(processed_object_type);
if (NULL == panel)
{
- lldebugs << "There is no object to process for type: " << processed_object_type << llendl;
return;
}
@@ -1414,122 +1403,130 @@ void LLBottomTray::processShrinkButton(EResizeState processed_object_type, S32&
void LLBottomTray::processExtendButtons(S32& available_width)
{
// do not allow extending any buttons if we have some buttons hidden via resize
- if (mResizeState & RS_BUTTONS_CAN_BE_HIDDEN) return;
+ if (isAutoHidden(RS_BUTTONS_CAN_BE_HIDDEN)) return;
- // process buttons from left to right
- resize_state_vec_t::const_iterator it = mButtonsProcessOrder.begin();
- const resize_state_vec_t::const_iterator it_end = mButtonsProcessOrder.end();
+ lldebugs << "Distributing " << available_width << " px" << llendl;
- // iterate through buttons in the mButtonsProcessOrder first
- for (; it != it_end; ++it)
+ // First try extending the Speak button.
+ if (available_width > 0)
{
- // is there available space?
- if (available_width <= 0) break;
-
- // try to extend next button
- processExtendButton(*it, available_width);
+ if (!processExtendSpeakButton(available_width))
+ {
+ // The Speak button needs extension but lacks some space.
+ // Don't extend other buttons in this case: the Speak button
+ // should consume the available headroom first.
+ return;
+ }
}
- const S32 chiclet_panel_width = mChicletPanel->getParent()->getRect().getWidth();
- static const S32 chiclet_panel_min_width = mChicletPanel->getMinWidth();
- const S32 available_width_chiclet = chiclet_panel_width - chiclet_panel_min_width;
+ // Then process the other buttons from left to right.
+ if (available_width > 0)
+ {
+ resize_state_vec_t::const_iterator it = mButtonsProcessOrder.begin();
+ const resize_state_vec_t::const_iterator it_end = mButtonsProcessOrder.end();
+
+ // iterate through buttons in the mButtonsProcessOrder first
+ for (; it != it_end; ++it)
+ {
+ // is there available space?
+ if (available_width <= 0) break;
- // then try to extend Speak button
- if (available_width > 0 || available_width_chiclet > 0)
+ // try to extend next button
+ processExtendButton(*it, available_width);
+ }
+ }
+}
+
+bool LLBottomTray::processExtendSpeakButton(S32& available_width)
+{
+ if (available_width <= 0)
{
- S32 panel_max_width = mObjectDefaultWidthMap[RS_BUTTON_SPEAK];
- S32 panel_width = mSpeakPanel->getRect().getWidth();
- S32 possible_extend_width = panel_max_width - panel_width;
+ llassert(available_width > 0);
+ return true;
+ }
+
+ const S32 panel_max_width = mObjectDefaultWidthMap[RS_BUTTON_SPEAK];
+ const S32 panel_width = mSpeakPanel->getRect().getWidth();
+ const S32 required_headroom = panel_max_width - panel_width;
- if (possible_extend_width >= 0 && possible_extend_width <= available_width + available_width_chiclet) // HACK: this button doesn't change size so possible_extend_width will be 0
+ if (panel_width < panel_max_width) // if the button isn't extended already
+ {
+ if (available_width < required_headroom) // not enough space
{
- mSpeakBtn->setLabelVisible(true);
- mSpeakPanel->reshape(panel_max_width, mSpeakPanel->getRect().getHeight());
- log(mSpeakBtn, "speak button is extended");
+ lldebugs << "Need (" << required_headroom << " - " << available_width << ") = "
+ << (required_headroom - available_width) << " more px"
+ << " to extend the Speak button"<< llendl;
- if( available_width > possible_extend_width)
- {
- available_width -= possible_extend_width;
- }
- else
- {
- S32 required_width = possible_extend_width - available_width;
- available_width = 0;
- mChicletPanel->getParent()->reshape(mChicletPanel->getParent()->getRect().getWidth() - required_width, mChicletPanel->getParent()->getRect().getHeight());
- }
- lldebugs << "Extending Speak button panel: " << mSpeakPanel->getName()
- << ", extended width: " << possible_extend_width
- << ", rest width to process: " << available_width
- << llendl;
+ return false; // Don't extend other buttons until we extend Speak.
}
+
+ // Reshape the Speak button to its maximum width.
+ if (mSpeakBtn) mSpeakBtn->setLabelVisible(true);
+ mSpeakPanel->reshape(panel_max_width, mSpeakPanel->getRect().getHeight());
+
+ available_width -= required_headroom;
+ llassert(available_width >= 0);
+
+ lldebugs << "Extending Speak button panel: " << mSpeakPanel->getName()
+ << ", extended width: " << required_headroom
+ << ", rest width to process: " << available_width
+ << llendl;
}
+
+ return true;
}
void LLBottomTray::processExtendButton(EResizeState processed_object_type, S32& available_width)
{
+ llassert(available_width >= 0);
+
LLPanel* panel = getButtonPanel(processed_object_type);
if (NULL == panel)
{
- lldebugs << "There is no object to process for type: " << processed_object_type << llendl;
return;
}
if (!panel->getVisible()) return;
+ // Widen the button up to its maximum width, but by not more than <available_width> px.
S32 panel_max_width = mObjectDefaultWidthMap[processed_object_type];
S32 panel_width = panel->getRect().getWidth();
- S32 possible_extend_width = panel_max_width - panel_width;
+ S32 required_headroom = panel_max_width - panel_width;
- if (possible_extend_width > 0)
+ S32 extend_by = llmin(available_width, required_headroom);
+ if (extend_by > 0)
{
- // let calculate real width to extend
+ panel->reshape(panel_width + extend_by, panel->getRect().getHeight());
- // 1. apply all possible width
- available_width -= possible_extend_width;
-
- // 2. it it is too much...
- if (available_width < 0)
- {
- // reduce applied extended width to the excessive value.
- possible_extend_width += available_width;
- available_width = 0;
- }
- panel->reshape(panel_width + possible_extend_width, panel->getRect().getHeight());
+ // Decrease amount of headroom available for other panels.
+ available_width -= extend_by;
- lldebugs << "Extending panel: " << panel->getName()
- << ", extended width: " << possible_extend_width
- << ", rest width to process: " << available_width
+ lldebugs << "Extending " << panel->getName()
+ << " by " << extend_by
+ << " px; remaining available width: " << available_width
<< llendl;
}
}
bool LLBottomTray::canButtonBeShown(EResizeState processed_object_type) const
{
- // 0. Check if passed button was previously hidden on resize
- bool can_be_shown = mResizeState & processed_object_type;
- if (can_be_shown)
- {
- // Yes, it was. Lets now check that all buttons before it (that can be hidden on resize)
- // are already shown
-
- // process buttons in direct order (from left to right)
- resize_state_vec_t::const_iterator it = mButtonsProcessOrder.begin();
- const resize_state_vec_t::const_iterator it_end = mButtonsProcessOrder.end();
+ // Check that all buttons (that can be hidden on resize)
+ // to the left of the given one are already shown.
- // 1. Find and accumulate all buttons types before one passed into the method.
- MASK buttons_before_mask = RS_NORESIZE;
- for (; it != it_end; ++it)
- {
- const EResizeState button_type = *it;
- if (button_type == processed_object_type) break;
+ // process buttons in direct order (from left to right)
+ resize_state_vec_t::const_iterator it = mButtonsProcessOrder.begin();
+ const resize_state_vec_t::const_iterator it_end = mButtonsProcessOrder.end();
- buttons_before_mask |= button_type;
- }
+ MASK buttons_before_mask = RS_NORESIZE;
+ for (; it != it_end; ++it)
+ {
+ const EResizeState button_type = *it;
+ if (button_type == processed_object_type) break;
- // 2. Check if some previous buttons are still hidden on resize
- can_be_shown = !(buttons_before_mask & mResizeState);
+ buttons_before_mask |= button_type;
}
- return can_be_shown;
+
+ return !isAutoHidden(buttons_before_mask);
}
void LLBottomTray::initResizeStateContainers()
@@ -1539,21 +1536,35 @@ void LLBottomTray::initResizeStateContainers()
mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_GESTURES, getChild<LLPanel>("gesture_panel")));
mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_MOVEMENT, getChild<LLPanel>("movement_panel")));
mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_CAMERA, getChild<LLPanel>("cam_panel")));
+ mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_DESTINATIONS, getChild<LLPanel>("destinations_panel")));
+ mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_AVATARS, getChild<LLPanel>("avatar_panel")));
mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_SNAPSHOT, getChild<LLPanel>("snapshot_panel")));
mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_BUILD, getChild<LLPanel>("build_btn_panel")));
mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_SEARCH, getChild<LLPanel>("search_btn_panel")));
mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_WORLD_MAP, getChild<LLPanel>("world_map_btn_panel")));
mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_MINI_MAP, getChild<LLPanel>("mini_map_btn_panel")));
+ mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_SPLITTER_1, getChild<LLPanel>("splitter_panel_1")));
+ mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_PEOPLE, getChild<LLPanel>("people_panel")));
+ mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_PROFILE, getChild<LLPanel>("profile_panel")));
+ mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_SPLITTER_2, getChild<LLPanel>("splitter_panel_2")));
+ mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_HOWTO, getChild<LLPanel>("howto_panel")));
// init an order of processed buttons
- mButtonsProcessOrder.push_back(RS_BUTTON_GESTURES);
- mButtonsProcessOrder.push_back(RS_BUTTON_MOVEMENT);
- mButtonsProcessOrder.push_back(RS_BUTTON_CAMERA);
+ mButtonsProcessOrder.push_back(RS_BUTTON_DESTINATIONS);
+ mButtonsProcessOrder.push_back(RS_BUTTON_AVATARS);
mButtonsProcessOrder.push_back(RS_BUTTON_SNAPSHOT);
mButtonsProcessOrder.push_back(RS_BUTTON_BUILD);
mButtonsProcessOrder.push_back(RS_BUTTON_SEARCH);
mButtonsProcessOrder.push_back(RS_BUTTON_WORLD_MAP);
mButtonsProcessOrder.push_back(RS_BUTTON_MINI_MAP);
+ mButtonsProcessOrder.push_back(RS_BUTTON_SPLITTER_1);
+ mButtonsProcessOrder.push_back(RS_BUTTON_PEOPLE);
+ mButtonsProcessOrder.push_back(RS_BUTTON_PROFILE);
+ mButtonsProcessOrder.push_back(RS_BUTTON_SPLITTER_2);
+ mButtonsProcessOrder.push_back(RS_BUTTON_HOWTO);
+ mButtonsProcessOrder.push_back(RS_BUTTON_MOVEMENT);
+ mButtonsProcessOrder.push_back(RS_BUTTON_CAMERA);
+ mButtonsProcessOrder.push_back(RS_BUTTON_GESTURES);
mButtonsOrder.push_back(RS_BUTTON_SPEAK);
mButtonsOrder.insert(mButtonsOrder.end(), mButtonsProcessOrder.begin(), mButtonsProcessOrder.end());
@@ -1583,7 +1594,7 @@ void LLBottomTray::initResizeStateContainers()
// because it resets chatbar's width according to resize logic.
void LLBottomTray::initButtonsVisibility()
{
- setVisibleAndFitWidths(RS_BUTTON_SPEAK, gSavedSettings.getBOOL("EnableVoiceChat"));
+ setVisibleAndFitWidths(RS_BUTTON_SPEAK, gSavedSettings.getBOOL("EnableVoiceChat") || !mSpeakBtn );
setVisibleAndFitWidths(RS_BUTTON_GESTURES, gSavedSettings.getBOOL("ShowGestureButton"));
setVisibleAndFitWidths(RS_BUTTON_MOVEMENT, gSavedSettings.getBOOL("ShowMoveButton"));
setVisibleAndFitWidths(RS_BUTTON_CAMERA, gSavedSettings.getBOOL("ShowCameraButton"));
@@ -1592,11 +1603,17 @@ void LLBottomTray::initButtonsVisibility()
setVisibleAndFitWidths(RS_BUTTON_SEARCH, gSavedSettings.getBOOL("ShowSearchButton"));
setVisibleAndFitWidths(RS_BUTTON_WORLD_MAP, gSavedSettings.getBOOL("ShowWorldMapButton"));
setVisibleAndFitWidths(RS_BUTTON_MINI_MAP, gSavedSettings.getBOOL("ShowMiniMapButton"));
+ lldebugs << "mResizeState = " << resizeStateMaskToString(mResizeState) << llendl;
}
void LLBottomTray::setButtonsControlsAndListeners()
{
- gSavedSettings.getControl("EnableVoiceChat")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_SPEAK, _2));
+ // always show the speak panel if using the basic skin
+ if (mSpeakBtn)
+ {
+ gSavedSettings.getControl("EnableVoiceChat")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_SPEAK, _2));
+ }
+
gSavedSettings.getControl("ShowGestureButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_GESTURES, _2));
gSavedSettings.getControl("ShowMoveButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_MOVEMENT, _2));
gSavedSettings.getControl("ShowCameraButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_CAMERA, _2));
@@ -1623,12 +1640,53 @@ bool LLBottomTray::toggleShowButton(LLBottomTray::EResizeState button_type, cons
return true;
}
+bool LLBottomTray::showButton(EResizeState button_type, S32& available_width)
+{
+ LLPanel* panel = getButtonPanel(button_type);
+ if (NULL == panel)
+ {
+ return false;
+ }
+
+ if (panel->getVisible())
+ {
+ return false;
+ }
+
+ // Check if none of the buttons to the left of the given one was auto-hidden.
+ // (we auto-show the buttons left to right).
+ if (!canButtonBeShown(button_type))
+ {
+ return false;
+ }
+
+ // Make sure we have enough room to show this button.
+ const S32 required_width = panel->getRect().getWidth();
+ if (available_width < required_width)
+ {
+ lldebugs << "Need " << (required_width - available_width) << " more px to show " << resizeStateToString(button_type) << llendl;
+ return false;
+ }
+
+ // All good. Show the button.
+ setTrayButtonVisible(button_type, true);
+
+ // Let the caller know that there is now less available space.
+ available_width -= required_width;
+
+ lldebugs << "Showing button " << resizeStateToString(button_type)
+ << ", remaining available width: " << available_width
+ << llendl;
+ setAutoHidden(button_type, false);
+
+ return true;
+}
+
void LLBottomTray::setTrayButtonVisible(EResizeState shown_object_type, bool visible)
{
LLPanel* panel = getButtonPanel(shown_object_type);
if (NULL == panel)
{
- lldebugs << "There is no object to show for state: " << shown_object_type << llendl;
return;
}
@@ -1659,7 +1717,6 @@ bool LLBottomTray::setVisibleAndFitWidths(EResizeState object_type, bool visible
LLPanel* cur_panel = getButtonPanel(object_type);
if (NULL == cur_panel)
{
- lldebugs << "There is no object to process for state: " << object_type << llendl;
return false;
}
@@ -1668,17 +1725,13 @@ bool LLBottomTray::setVisibleAndFitWidths(EResizeState object_type, bool visible
if (visible)
{
// Assume that only chiclet panel can be auto-resized
- const S32 available_width =
- mChicletPanel->getParent()->getRect().getWidth() - mChicletPanel->getMinWidth();
+ const S32 available_width = getChicletPanelShrinkHeadroom();
S32 preferred_width = mObjectDefaultWidthMap[object_type];
S32 current_width = cur_panel->getRect().getWidth();
S32 result_width = 0;
bool decrease_width = false;
- // Mark this button to be shown
- mResizeState |= object_type;
-
if (preferred_width > 0 && available_width >= preferred_width)
{
result_width = preferred_width;
@@ -1722,7 +1775,11 @@ bool LLBottomTray::setVisibleAndFitWidths(EResizeState object_type, bool visible
}
else
{
- // Nothing can be done, give up...
+ lldebugs << "Need " << (minimal_width - available_width - possible_shrunk_width)
+ << " more px to show " << resizeStateToString(object_type) << llendl;
+
+ // Make the button uppear when we have more available space.
+ setAutoHidden(object_type, true);
return false;
}
}
@@ -1733,7 +1790,7 @@ bool LLBottomTray::setVisibleAndFitWidths(EResizeState object_type, bool visible
current_width = result_width;
}
- is_set = processShowButton(object_type, current_width);
+ is_set = showButton(object_type, current_width);
// Shrink buttons if needed
if (is_set && decrease_width)
@@ -1748,7 +1805,8 @@ bool LLBottomTray::setVisibleAndFitWidths(EResizeState object_type, bool visible
setTrayButtonVisible(object_type, false);
// Mark button NOT to show while future bottom tray extending
- mResizeState &= ~object_type;
+ lldebugs << "Removing " << resizeStateToString(object_type) << " from mResizeState" << llendl;
+ setAutoHidden(object_type, false);
// Extend other buttons if need
if (delta_width)
@@ -1805,12 +1863,14 @@ void LLBottomTray::processChatbarCustomization(S32 new_width)
if (delta_width == 0) return;
+ {
+ static unsigned dbg_cnt = 0;
+ lldebugs << llformat("*** (%03d) ************************************* %d", delta_width, ++dbg_cnt) << llendl;
+ }
+
mDesiredNearbyChatWidth = new_width;
- LLView * chiclet_layout_panel = mChicletPanel->getParent();
- const S32 chiclet_min_width = get_panel_min_width(mToolbarStack, chiclet_layout_panel);
- const S32 chiclet_panel_width = chiclet_layout_panel->getRect().getWidth();
- const S32 available_chiclet_shrink_width = chiclet_panel_width - chiclet_min_width;
+ const S32 available_chiclet_shrink_width = getChicletPanelShrinkHeadroom();
llassert(available_chiclet_shrink_width >= 0);
if (delta_width > 0) // panel gets narrowly
@@ -1829,29 +1889,99 @@ void LLBottomTray::processChatbarCustomization(S32 new_width)
}
}
+S32 LLBottomTray::getChicletPanelShrinkHeadroom() const
+{
+ static const S32 min_width = mChicletPanel->getMinWidth();
+ const S32 cur_width = mChicletPanel->getParent()->getRect().getWidth();
+
+ S32 shrink_headroom = cur_width - min_width;
+ llassert(shrink_headroom >= 0); // the panel cannot get narrower than the minimum
+ return shrink_headroom;
+}
+
// static
std::string LLBottomTray::resizeStateToString(EResizeState state)
{
+ const char *rs_string = "UNKNOWN_BUTTON";
+
switch (state)
{
- case RS_NORESIZE: return "RS_NORESIZE";
- case RS_CHICLET_PANEL: return "RS_CHICLET_PANEL";
- case RS_CHATBAR_INPUT: return "RS_CHATBAR_INPUT";
- case RS_BUTTON_SNAPSHOT: return "RS_BUTTON_SNAPSHOT";
- case RS_BUTTON_CAMERA: return "RS_BUTTON_CAMERA";
- case RS_BUTTON_MOVEMENT: return "RS_BUTTON_MOVEMENT";
- case RS_BUTTON_GESTURES: return "RS_BUTTON_GESTURES";
- case RS_BUTTON_SPEAK: return "RS_BUTTON_SPEAK";
- case RS_IM_WELL: return "RS_IM_WELL";
- case RS_NOTIFICATION_WELL: return "RS_NOTIFICATION_WELL";
- case RS_BUTTON_BUILD: return "RS_BUTTON_BUILD";
- case RS_BUTTON_SEARCH: return "RS_BUTTON_SEARCH";
- case RS_BUTTON_WORLD_MAP: return "RS_BUTTON_WORLD_MAP";
- case RS_BUTTON_MINI_MAP: return "RS_BUTTON_MINI_MAP";
- case RS_BUTTONS_CAN_BE_HIDDEN: return "RS_BUTTONS_CAN_BE_HIDDEN";
- // No default to track additions.
- }
- return "UNKNOWN_BUTTON";
+ case RS_NORESIZE: rs_string = "RS_NORESIZE"; break;
+ case RS_CHICLET_PANEL: rs_string = "RS_CHICLET_PANEL"; break;
+ case RS_CHATBAR_INPUT: rs_string = "RS_CHATBAR_INPUT"; break;
+ case RS_BUTTON_SNAPSHOT: rs_string = "RS_BUTTON_SNAPSHOT"; break;
+ case RS_BUTTON_CAMERA: rs_string = "RS_BUTTON_CAMERA"; break;
+ case RS_BUTTON_MOVEMENT: rs_string = "RS_BUTTON_MOVEMENT"; break;
+ case RS_BUTTON_GESTURES: rs_string = "RS_BUTTON_GESTURES"; break;
+ case RS_BUTTON_SPEAK: rs_string = "RS_BUTTON_SPEAK"; break;
+ case RS_IM_WELL: rs_string = "RS_IM_WELL"; break;
+ case RS_NOTIFICATION_WELL: rs_string = "RS_NOTIFICATION_WELL"; break;
+ case RS_BUTTON_BUILD: rs_string = "RS_BUTTON_BUILD"; break;
+ case RS_BUTTON_SEARCH: rs_string = "RS_BUTTON_SEARCH"; break;
+ case RS_BUTTON_WORLD_MAP: rs_string = "RS_BUTTON_WORLD_MAP"; break;
+ case RS_BUTTON_MINI_MAP: rs_string = "RS_BUTTON_MINI_MAP"; break;
+ case RS_BUTTON_DESTINATIONS: rs_string = "RS_BUTTON_DESTINATIONS"; break;
+ case RS_BUTTON_AVATARS: rs_string = "RS_BUTTON_AVATARS"; break;
+ case RS_BUTTON_PEOPLE: rs_string = "RS_BUTTON_PEOPLE"; break;
+ case RS_BUTTON_PROFILE: rs_string = "RS_BUTTON_PROFILE"; break;
+ case RS_BUTTON_HOWTO: rs_string = "RS_BUTTON_HOWTO"; break;
+ case RS_BUTTON_SPLITTER_1: rs_string = "RS_BUTTON_SPLITTER_1"; break;
+ case RS_BUTTON_SPLITTER_2: rs_string = "RS_BUTTON_SPLITTER_2"; break;
+ case RS_BUTTONS_CAN_BE_HIDDEN: rs_string = "RS_BUTTONS_CAN_BE_HIDDEN"; break;
+ // No default to track additions.
+ }
+
+ return rs_string;
+}
+
+// static
+std::string LLBottomTray::resizeStateMaskToString(MASK mask)
+{
+ std::string res;
+
+ bool add_delimiter = false;
+ for (U32 i = 0; i < 16; i++)
+ {
+ EResizeState state = (EResizeState) (1 << i);
+ if (mask & state)
+ {
+ if (!add_delimiter)
+ {
+ add_delimiter = true;
+ }
+ else
+ {
+ res += ", ";
+ }
+
+ res += resizeStateToString(state);
+ }
+ }
+
+ if (res.empty())
+ {
+ res = resizeStateToString(RS_NORESIZE);
+ }
+
+ res += llformat(" (0x%X)", mask);
+ return res;
+}
+
+bool LLBottomTray::isAutoHidden(MASK button_types) const
+{
+ return (mResizeState & button_types) != 0;
+}
+
+void LLBottomTray::setAutoHidden(MASK button_types, bool hide)
+{
+ if (hide)
+ {
+ mResizeState |= button_types;
+ }
+ else
+ {
+ mResizeState &= ~button_types;
+ }
}
//EOF
diff --git a/indra/newview/llbottomtray.h b/indra/newview/llbottomtray.h
index 04e5f5e9e0..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
@@ -112,10 +113,6 @@ public:
void showBottomTrayContextMenu(S32 x, S32 y, MASK mask);
- void showGestureButton(BOOL visible);
- void showMoveButton(BOOL visible);
- void showCameraButton(BOOL visible);
- void showSnapshotButton(BOOL visible);
void showSpeakButton(bool visible);
void toggleMovementControls();
@@ -144,22 +141,29 @@ public:
private:
- typedef enum e_resize_status_type
+ typedef enum e_resize_state
{
- RS_NORESIZE = 0x0000
- , RS_CHICLET_PANEL = 0x0001
- , RS_CHATBAR_INPUT = 0x0002
- , RS_BUTTON_SNAPSHOT = 0x0004
- , RS_BUTTON_CAMERA = 0x0008
- , RS_BUTTON_MOVEMENT = 0x0010
- , RS_BUTTON_GESTURES = 0x0020
- , RS_BUTTON_SPEAK = 0x0040
- , RS_IM_WELL = 0x0080
- , RS_NOTIFICATION_WELL = 0x0100
- , RS_BUTTON_BUILD = 0x0200
- , RS_BUTTON_SEARCH = 0x0400
- , RS_BUTTON_WORLD_MAP = 0x0800
- , RS_BUTTON_MINI_MAP = 0x1000
+ RS_NORESIZE = 0x0000,
+ RS_CHICLET_PANEL = 0x0001,
+ RS_CHATBAR_INPUT = 0x0002,
+ RS_BUTTON_SNAPSHOT = 0x0004,
+ RS_BUTTON_CAMERA = 0x0008,
+ RS_BUTTON_MOVEMENT = 0x0010,
+ RS_BUTTON_GESTURES = 0x0020,
+ RS_BUTTON_SPEAK = 0x0040,
+ RS_IM_WELL = 0x0080,
+ RS_NOTIFICATION_WELL = 0x0100,
+ RS_BUTTON_BUILD = 0x0200,
+ RS_BUTTON_SEARCH = 0x0400,
+ RS_BUTTON_WORLD_MAP = 0x0800,
+ RS_BUTTON_MINI_MAP = 0x1000,
+ RS_BUTTON_DESTINATIONS = 0x2000,
+ RS_BUTTON_AVATARS = 0x4000,
+ RS_BUTTON_PEOPLE = 0x8000,
+ RS_BUTTON_PROFILE = 0x10000,
+ RS_BUTTON_HOWTO = 0x20000,
+ RS_BUTTON_SPLITTER_1 = 0x40000,
+ RS_BUTTON_SPLITTER_2 = 0x80000,
/*
Once new button that can be hidden on resize is added don't forget to update related places:
@@ -170,10 +174,11 @@ private:
/**
* Specifies buttons which can be hidden when bottom tray is shrunk.
* They are: Gestures, Movement (Move), Camera (View), Snapshot
- * new: Build, Search, Map, World Map, Mini-Map.
+ * new: Build, Search, Map, World Map, Mini-Map, destinations, avatars
*/
- , RS_BUTTONS_CAN_BE_HIDDEN = RS_BUTTON_SNAPSHOT | RS_BUTTON_CAMERA | RS_BUTTON_MOVEMENT | RS_BUTTON_GESTURES
+ RS_BUTTONS_CAN_BE_HIDDEN = RS_BUTTON_SNAPSHOT | RS_BUTTON_CAMERA | RS_BUTTON_MOVEMENT | RS_BUTTON_GESTURES
| RS_BUTTON_BUILD | RS_BUTTON_SEARCH | RS_BUTTON_WORLD_MAP | RS_BUTTON_MINI_MAP
+ | RS_BUTTON_DESTINATIONS | RS_BUTTON_AVATARS
}EResizeState;
// Below are three methods that were introduced to handle drag'n'drop
@@ -240,8 +245,9 @@ private:
*
* @params[in, out] available_width - reference to available width to be used to show buttons.
* @see processShowButton()
+ * @return consumed pixels (difference in available width).
*/
- void processShowButtons(S32& available_width);
+ S32 processShowButtons(S32& available_width);
/**
* Tries to show panel with specified button using available width.
@@ -317,6 +323,20 @@ private:
void processExtendButtons(S32& available_width);
/**
+ * Extends the Speak button if there is anough headroom.
+ *
+ * Unlike other buttons, the Speak buttons has only two possible widths:
+ * the minimal one (without label) and the maximal (default) one.
+ *
+ * If the button is at its minimum width there is not enough headroom to
+ * reshape it to the maximum width, the method does nothing.
+ *
+ * @param available_width Available headroom.
+ * @return false if the button requires extension but there's not enough headroom, true otherwise.
+ */
+ bool processExtendSpeakButton(S32& available_width);
+
+ /**
* Extends shown button to increase total taken space.
*
* @params[in] processed_object_type - type of button to be extended.
@@ -365,6 +385,16 @@ private:
static bool toggleShowButton(EResizeState button_type, const LLSD& new_visibility);
/**
+ * Show the button if there is enough space.
+ *
+ * @param[in] button_type - type of button to be shown.
+ * @param[in, out] available_width amount of available space on the bottom bar.
+ *
+ * @return true if button was shown, false that's not possible (not enough space, etc)
+ */
+ bool showButton(EResizeState button_type, S32& available_width);
+
+ /**
* Sets passed visibility to object specified by resize type.
*/
void setTrayButtonVisible(EResizeState shown_object_type, bool visible);
@@ -417,9 +447,27 @@ private:
*/
void processChatbarCustomization(S32 new_width);
+ /**
+ * @return difference between current chiclet panel width and the minimum.
+ */
+ S32 getChicletPanelShrinkHeadroom() const;
+
/// Get button name for debugging.
static std::string resizeStateToString(EResizeState state);
+ /// Dump a mask for debugging
+ static std::string resizeStateMaskToString(MASK mask);
+
+ /// @return true if any of the the passed buttons have been auto-hidden due to lack of available space.
+ bool isAutoHidden(MASK button_types) const;
+
+ /**
+ * (Un)Mark the buttons as hidden.
+ *
+ * Auto-hidden buttons are those that re-appear as soon as we have enough available space.
+ */
+ void setAutoHidden(MASK button_types, bool hide);
+
/// Buttons automatically hidden due to lack of space.
MASK mResizeState;
@@ -508,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/llcallbacklist.cpp b/indra/newview/llcallbacklist.cpp
index a54c77b4a0..357a6582d1 100644
--- a/indra/newview/llcallbacklist.cpp
+++ b/indra/newview/llcallbacklist.cpp
@@ -115,6 +115,71 @@ void LLCallbackList::callFunctions()
}
}
+// Shim class to allow arbitrary boost::bind
+// expressions to be run as one-time idle callbacks.
+class OnIdleCallbackOneTime
+{
+public:
+ OnIdleCallbackOneTime(nullary_func_t callable):
+ mCallable(callable)
+ {
+ }
+ static void onIdle(void *data)
+ {
+ gIdleCallbacks.deleteFunction(onIdle, data);
+ OnIdleCallbackOneTime* self = reinterpret_cast<OnIdleCallbackOneTime*>(data);
+ self->call();
+ delete self;
+ }
+ void call()
+ {
+ mCallable();
+ }
+private:
+ nullary_func_t mCallable;
+};
+
+void doOnIdleOneTime(nullary_func_t callable)
+{
+ OnIdleCallbackOneTime* cb_functor = new OnIdleCallbackOneTime(callable);
+ gIdleCallbacks.addFunction(&OnIdleCallbackOneTime::onIdle,cb_functor);
+}
+
+// Shim class to allow generic boost functions to be run as
+// recurring idle callbacks. Callable should return true when done,
+// false to continue getting called.
+class OnIdleCallbackRepeating
+{
+public:
+ OnIdleCallbackRepeating(bool_func_t callable):
+ mCallable(callable)
+ {
+ }
+ // Will keep getting called until the callable returns true.
+ static void onIdle(void *data)
+ {
+ OnIdleCallbackRepeating* self = reinterpret_cast<OnIdleCallbackRepeating*>(data);
+ bool done = self->call();
+ if (done)
+ {
+ gIdleCallbacks.deleteFunction(onIdle, data);
+ delete self;
+ }
+ }
+ bool call()
+ {
+ return mCallable();
+ }
+private:
+ bool_func_t mCallable;
+};
+
+void doOnIdleRepeating(bool_func_t callable)
+{
+ OnIdleCallbackRepeating* cb_functor = new OnIdleCallbackRepeating(callable);
+ gIdleCallbacks.addFunction(&OnIdleCallbackRepeating::onIdle,cb_functor);
+}
+
#ifdef _DEBUG
void test1(void *data)
diff --git a/indra/newview/llcallbacklist.h b/indra/newview/llcallbacklist.h
index 07ac21f5e9..97f3bfd9ee 100644
--- a/indra/newview/llcallbacklist.h
+++ b/indra/newview/llcallbacklist.h
@@ -52,6 +52,15 @@ protected:
callback_list_t mCallbackList;
};
+typedef boost::function<void ()> nullary_func_t;
+typedef boost::function<bool ()> bool_func_t;
+
+// Call a given callable once in idle loop.
+void doOnIdleOneTime(nullary_func_t callable);
+
+// Repeatedly call a callable in idle loop until it returns true.
+void doOnIdleRepeating(bool_func_t callable);
+
extern LLCallbackList gIdleCallbacks;
#endif
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/llchiclet.cpp b/indra/newview/llchiclet.cpp
index 885d553524..3000209aad 100644
--- a/indra/newview/llchiclet.cpp
+++ b/indra/newview/llchiclet.cpp
@@ -483,8 +483,9 @@ void LLIMChiclet::setShowSpeaker(bool show)
if(needs_resize)
{
mShowSpeaker = show;
- toggleSpeakerControl();
}
+
+ toggleSpeakerControl();
}
void LLIMChiclet::enableCounterControl(bool enable)
@@ -1183,6 +1184,10 @@ void LLChicletPanel::onCurrentVoiceChannelChanged(const LLUUID& session_id)
if(chiclet)
{
chiclet->setShowSpeaker(true);
+ if (gSavedSettings.getBOOL("OpenIMOnVoice"))
+ {
+ LLIMFloater::show(chiclet->getSessionId());
+ }
}
}
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/lldateutil.cpp b/indra/newview/lldateutil.cpp
index fcc73a07bc..18ae6107e7 100644
--- a/indra/newview/lldateutil.cpp
+++ b/indra/newview/lldateutil.cpp
@@ -32,9 +32,9 @@
#include "llui.h"
static S32 DAYS_PER_MONTH_NOLEAP[] =
- { 31, 28, 21, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
+ { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
static S32 DAYS_PER_MONTH_LEAP[] =
- { 31, 29, 21, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
+ { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
static S32 days_from_month(S32 year, S32 month)
{
diff --git a/indra/newview/lldebugview.cpp b/indra/newview/lldebugview.cpp
index 0876c3fd99..b6d67899f8 100644
--- a/indra/newview/lldebugview.cpp
+++ b/indra/newview/lldebugview.cpp
@@ -39,7 +39,9 @@
#include "llviewerwindow.h"
#include "llappviewer.h"
#include "llmemoryview.h"
+#include "llsceneview.h"
#include "llviewertexture.h"
+
//
// Globals
//
@@ -83,6 +85,13 @@ void LLDebugView::init()
addChild(mFastTimerView);
mFastTimerView->setRect(rect);
+ gSceneView = new LLSceneView(r);
+ gSceneView->setFollowsTop();
+ gSceneView->setFollowsLeft();
+ gSceneView->setVisible(FALSE);
+ addChild(gSceneView);
+ gSceneView->setRect(rect);
+
r.setLeftTopAndSize(25, rect.getHeight() - 50, (S32) (gViewerWindow->getWindowRectScaled().getWidth() * 0.75f),
(S32) (gViewerWindow->getWindowRectScaled().getHeight() * 0.75f));
LLMemoryView::Params mp;
@@ -103,6 +112,9 @@ void LLDebugView::init()
addChild(gTextureView);
//gTextureView->reshape(r.getWidth(), r.getHeight(), TRUE);
+
+
+
if(gAuditTexture)
{
r.set(150, rect.getHeight() - 50, 900 + LLImageGL::sTextureLoadedCounter.size() * 30, 100);
@@ -133,6 +145,7 @@ LLDebugView::~LLDebugView()
// These have already been deleted. Fix the globals appropriately.
gDebugView = NULL;
gTextureView = NULL;
+ gSceneView = NULL;
gTextureSizeView = NULL;
gTextureCategoryView = NULL;
}
diff --git a/indra/newview/lldrawable.cpp b/indra/newview/lldrawable.cpp
index 8106fada11..bdc12ec0e3 100644
--- a/indra/newview/lldrawable.cpp
+++ b/indra/newview/lldrawable.cpp
@@ -35,6 +35,7 @@
#include "llcriticaldamp.h"
#include "llface.h"
#include "lllightconstants.h"
+#include "llmatrix4a.h"
#include "llsky.h"
#include "llsurfacepatch.h"
#include "llviewercamera.h"
@@ -85,6 +86,7 @@ void LLDrawable::incrementVisible()
sCurVisible++;
sCurPixelAngle = (F32) gViewerWindow->getWindowHeightRaw()/LLViewerCamera::getInstance()->getView();
}
+
void LLDrawable::init()
{
// mXform
@@ -115,6 +117,11 @@ void LLDrawable::initClass()
void LLDrawable::destroy()
{
+ if (gDebugGL)
+ {
+ gPipeline.checkReferences(this);
+ }
+
if (isDead())
{
sNumZombieDrawables--;
@@ -133,6 +140,7 @@ void LLDrawable::destroy()
{
llinfos << "- Zombie drawables: " << sNumZombieDrawables << llendl;
}*/
+
}
void LLDrawable::markDead()
@@ -170,6 +178,11 @@ LLVOVolume* LLDrawable::getVOVolume() const
}
}
+const LLMatrix4& LLDrawable::getRenderMatrix() const
+{
+ return isRoot() ? getWorldMatrix() : getParent()->getWorldMatrix();
+}
+
BOOL LLDrawable::isLight() const
{
LLViewerObject* objectp = mVObjp;
@@ -183,20 +196,30 @@ BOOL LLDrawable::isLight() const
}
}
+static LLFastTimer::DeclareTimer FTM_CLEANUP_DRAWABLE("Cleanup Drawable");
+static LLFastTimer::DeclareTimer FTM_DEREF_DRAWABLE("Deref");
+static LLFastTimer::DeclareTimer FTM_DELETE_FACES("Faces");
+
void LLDrawable::cleanupReferences()
{
- LLFastTimer t(FTM_PIPELINE);
+ LLFastTimer t(FTM_CLEANUP_DRAWABLE);
- std::for_each(mFaces.begin(), mFaces.end(), DeletePointer());
- mFaces.clear();
+ {
+ LLFastTimer t(FTM_DELETE_FACES);
+ std::for_each(mFaces.begin(), mFaces.end(), DeletePointer());
+ mFaces.clear();
+ }
gObjectList.removeDrawable(this);
gPipeline.unlinkDrawable(this);
- // Cleanup references to other objects
- mVObjp = NULL;
- mParent = NULL;
+ {
+ LLFastTimer t(FTM_DEREF_DRAWABLE);
+ // Cleanup references to other objects
+ mVObjp = NULL;
+ mParent = NULL;
+ }
}
void LLDrawable::cleanupDeadDrawables()
@@ -685,13 +708,15 @@ void LLDrawable::updateDistance(LLCamera& camera, bool force_update)
LLVOVolume* volume = getVOVolume();
if (volume)
{
- volume->updateRelativeXform();
- pos = volume->getRelativeXform().getTranslation();
- if (isStatic())
+ if (getSpatialGroup())
{
- pos += volume->getRegion()->getOriginAgent();
+ pos.set(getPositionGroup().getF32ptr());
}
-
+ else
+ {
+ pos = getPositionAgent();
+ }
+
if (isState(LLDrawable::HAS_ALPHA))
{
for (S32 i = 0; i < getNumFaces(); i++)
@@ -699,21 +724,23 @@ void LLDrawable::updateDistance(LLCamera& camera, bool force_update)
LLFace* facep = getFace(i);
if (force_update || facep->getPoolType() == LLDrawPool::POOL_ALPHA)
{
- LLVector3 box = (facep->mExtents[1] - facep->mExtents[0]) * 0.25f;
+ LLVector4a box;
+ box.setSub(facep->mExtents[1], facep->mExtents[0]);
+ box.mul(0.25f);
LLVector3 v = (facep->mCenterLocal-camera.getOrigin());
const LLVector3& at = camera.getAtAxis();
for (U32 j = 0; j < 3; j++)
{
- v.mV[j] -= box.mV[j] * at.mV[j];
+ v.mV[j] -= box[j] * at.mV[j];
}
facep->mDistance = v * camera.getAtAxis();
}
}
- }
+ }
}
else
{
- pos = LLVector3(getPositionGroup());
+ pos = LLVector3(getPositionGroup().getF32ptr());
}
pos -= camera.getOrigin();
@@ -739,7 +766,7 @@ void LLDrawable::updateTexture()
if (getVOVolume())
{
- if (isActive())
+ /*if (isActive())
{
if (isRoot())
{
@@ -749,7 +776,7 @@ void LLDrawable::updateTexture()
{
getParent()->mQuietCount = 0;
}
- }
+ }*/
gPipeline.markRebuild(this, LLDrawable::REBUILD_MATERIAL, TRUE);
}
@@ -762,7 +789,7 @@ BOOL LLDrawable::updateGeometry(BOOL priority)
return res;
}
-void LLDrawable::shiftPos(const LLVector3 &shift_vector)
+void LLDrawable::shiftPos(const LLVector4a &shift_vector)
{
if (isDead())
{
@@ -794,20 +821,19 @@ void LLDrawable::shiftPos(const LLVector3 &shift_vector)
for (S32 i = 0; i < getNumFaces(); i++)
{
LLFace *facep = getFace(i);
- facep->mCenterAgent += shift_vector;
- facep->mExtents[0] += shift_vector;
- facep->mExtents[1] += shift_vector;
+ facep->mCenterAgent += LLVector3(shift_vector.getF32ptr());
+ facep->mExtents[0].add(shift_vector);
+ facep->mExtents[1].add(shift_vector);
if (!volume && facep->hasGeometry())
{
- facep->mVertexBuffer = NULL;
- facep->mLastVertexBuffer = NULL;
+ facep->clearVertexBuffer();
}
}
- mExtents[0] += shift_vector;
- mExtents[1] += shift_vector;
- mPositionGroup += LLVector3d(shift_vector);
+ mExtents[0].add(shift_vector);
+ mExtents[1].add(shift_vector);
+ mPositionGroup.add(shift_vector);
}
else if (mSpatialBridge)
{
@@ -815,9 +841,9 @@ void LLDrawable::shiftPos(const LLVector3 &shift_vector)
}
else if (isAvatar())
{
- mExtents[0] += shift_vector;
- mExtents[1] += shift_vector;
- mPositionGroup += LLVector3d(shift_vector);
+ mExtents[0].add(shift_vector);
+ mExtents[1].add(shift_vector);
+ mPositionGroup.add(shift_vector);
}
mVObjp->onShift(shift_vector);
@@ -829,21 +855,26 @@ const LLVector3& LLDrawable::getBounds(LLVector3& min, LLVector3& max) const
return mXform.getPositionW();
}
-const LLVector3* LLDrawable::getSpatialExtents() const
+const LLVector4a* LLDrawable::getSpatialExtents() const
{
return mExtents;
}
-void LLDrawable::setSpatialExtents(LLVector3 min, LLVector3 max)
+void LLDrawable::setSpatialExtents(const LLVector3& min, const LLVector3& max)
+{
+ mExtents[0].load3(min.mV);
+ mExtents[1].load3(max.mV);
+}
+
+void LLDrawable::setSpatialExtents(const LLVector4a& min, const LLVector4a& max)
{
- LLVector3 size = max - min;
mExtents[0] = min;
- mExtents[1] = max;
+ mExtents[1] = max;
}
-void LLDrawable::setPositionGroup(const LLVector3d& pos)
+void LLDrawable::setPositionGroup(const LLVector4a& pos)
{
- mPositionGroup.setVec(pos);
+ mPositionGroup = pos;
}
void LLDrawable::updateSpatialExtents()
@@ -857,7 +888,7 @@ void LLDrawable::updateSpatialExtents()
if (mSpatialBridge.notNull())
{
- mPositionGroup.setVec(0,0,0);
+ mPositionGroup.splat(0.f);
}
}
@@ -910,6 +941,18 @@ void LLDrawable::setSpatialGroup(LLSpatialGroup *groupp)
{
mSpatialGroupp->setState(LLSpatialGroup::GEOM_DIRTY);
}*/
+
+ if (mSpatialGroupp != groupp && getVOVolume())
+ { //NULL out vertex buffer references for volumes on spatial group change to maintain
+ //requirement that every face vertex buffer is either NULL or points to a vertex buffer
+ //contained by its drawable's spatial group
+ for (S32 i = 0; i < getNumFaces(); ++i)
+ {
+ LLFace* facep = getFace(i);
+ facep->clearVertexBuffer();
+ }
+ }
+
mSpatialGroupp = groupp;
}
@@ -1027,7 +1070,7 @@ BOOL LLDrawable::isVisible() const
//=======================================
LLSpatialBridge::LLSpatialBridge(LLDrawable* root, BOOL render_by_group, U32 data_mask)
-: LLSpatialPartition(data_mask, render_by_group, FALSE)
+: LLSpatialPartition(data_mask, render_by_group, GL_STREAM_DRAW_ARB)
{
mDrawable = root;
root->setSpatialBridge(this);
@@ -1068,59 +1111,72 @@ void LLSpatialBridge::updateSpatialExtents()
root->rebound();
}
- LLXformMatrix* mat = mDrawable->getXform();
-
- LLVector3 offset = root->mBounds[0];
- LLVector3 size = root->mBounds[1];
+ LLVector4a offset;
+ LLVector4a size = root->mBounds[1];
- LLVector3 center = LLVector3(0,0,0) * mat->getWorldMatrix();
- LLQuaternion rotation = LLQuaternion(mat->getWorldMatrix());
+ //VECTORIZE THIS
+ LLMatrix4a mat;
+ mat.loadu(mDrawable->getXform()->getWorldMatrix());
+
+ LLVector4a t;
+ t.splat(0.f);
+
+ LLVector4a center;
+ mat.affineTransform(t, center);
- offset *= rotation;
- center += offset;
+ mat.rotate(root->mBounds[0], offset);
+ center.add(offset);
- LLVector3 v[4];
+ LLVector4a v[4];
+
//get 4 corners of bounding box
- v[0] = (size * rotation);
- v[1] = (LLVector3(-size.mV[0], -size.mV[1], size.mV[2]) * rotation);
- v[2] = (LLVector3(size.mV[0], -size.mV[1], -size.mV[2]) * rotation);
- v[3] = (LLVector3(-size.mV[0], size.mV[1], -size.mV[2]) * rotation);
+ mat.rotate(size,v[0]);
- LLVector3& newMin = mExtents[0];
- LLVector3& newMax = mExtents[1];
+ LLVector4a scale;
+
+ scale.set(-1.f, -1.f, 1.f);
+ scale.mul(size);
+ mat.rotate(scale, v[1]);
+
+ scale.set(1.f, -1.f, -1.f);
+ scale.mul(size);
+ mat.rotate(scale, v[2]);
+
+ scale.set(-1.f, 1.f, -1.f);
+ scale.mul(size);
+ mat.rotate(scale, v[3]);
+
+
+ LLVector4a& newMin = mExtents[0];
+ LLVector4a& newMax = mExtents[1];
newMin = newMax = center;
for (U32 i = 0; i < 4; i++)
{
- for (U32 j = 0; j < 3; j++)
- {
- F32 delta = fabsf(v[i].mV[j]);
- F32 min = center.mV[j] - delta;
- F32 max = center.mV[j] + delta;
-
- if (min < newMin.mV[j])
- {
- newMin.mV[j] = min;
- }
-
- if (max > newMax.mV[j])
- {
- newMax.mV[j] = max;
- }
- }
- }
+ LLVector4a delta;
+ delta.setAbs(v[i]);
+ LLVector4a min;
+ min.setSub(center, delta);
+ LLVector4a max;
+ max.setAdd(center, delta);
- LLVector3 diagonal = newMax - newMin;
- mRadius = diagonal.magVec() * 0.5f;
+ newMin.setMin(newMin, min);
+ newMax.setMax(newMax, max);
+ }
+
+ LLVector4a diagonal;
+ diagonal.setSub(newMax, newMin);
+ mRadius = diagonal.getLength3().getF32() * 0.5f;
- mPositionGroup.setVec((newMin + newMax) * 0.5f);
+ mPositionGroup.setAdd(newMin,newMax);
+ mPositionGroup.mul(0.5f);
updateBinRadius();
}
void LLSpatialBridge::updateBinRadius()
{
- mBinRadius = llmin((F32) mOctree->getSize().mdV[0]*0.5f, 256.f);
+ mBinRadius = llmin( mOctree->getSize()[0]*0.5f, 256.f);
}
LLCamera LLSpatialBridge::transformCamera(LLCamera& camera)
@@ -1261,8 +1317,12 @@ void LLSpatialBridge::setVisible(LLCamera& camera_in, std::vector<LLDrawable*>*
LLSpatialGroup* group = (LLSpatialGroup*) mOctree->getListener(0);
group->rebound();
- LLVector3 center = (mExtents[0] + mExtents[1]) * 0.5f;
- LLVector3 size = (mExtents[1]-mExtents[0]) * 0.5f;
+ LLVector4a center;
+ center.setAdd(mExtents[0], mExtents[1]);
+ center.mul(0.5f);
+ LLVector4a size;
+ size.setSub(mExtents[1], mExtents[0]);
+ size.mul(0.5f);
if ((LLPipeline::sShadowRender && camera_in.AABBInFrustum(center, size)) ||
LLPipeline::sImpostorRender ||
@@ -1375,11 +1435,11 @@ BOOL LLSpatialBridge::updateMove()
return TRUE;
}
-void LLSpatialBridge::shiftPos(const LLVector3& vec)
+void LLSpatialBridge::shiftPos(const LLVector4a& vec)
{
- mExtents[0] += vec;
- mExtents[1] += vec;
- mPositionGroup += LLVector3d(vec);
+ mExtents[0].add(vec);
+ mExtents[1].add(vec);
+ mPositionGroup.add(vec);
}
void LLSpatialBridge::cleanupReferences()
@@ -1497,7 +1557,7 @@ F32 LLHUDBridge::calcPixelArea(LLSpatialGroup* group, LLCamera& camera)
}
-void LLHUDBridge::shiftPos(const LLVector3& vec)
+void LLHUDBridge::shiftPos(const LLVector4a& vec)
{
//don't shift hud bridges on region crossing
}
diff --git a/indra/newview/lldrawable.h b/indra/newview/lldrawable.h
index 2cea41df0a..9ebe1a45b4 100644
--- a/indra/newview/lldrawable.h
+++ b/indra/newview/lldrawable.h
@@ -35,6 +35,7 @@
#include "v4math.h"
#include "m4math.h"
#include "v4coloru.h"
+#include "llvector4a.h"
#include "llquaternion.h"
#include "xform.h"
#include "llmemtype.h"
@@ -61,6 +62,17 @@ const U32 SILHOUETTE_HIGHLIGHT = 0;
class LLDrawable : public LLRefCount
{
public:
+ LLDrawable(const LLDrawable& rhs)
+ {
+ *this = rhs;
+ }
+
+ const LLDrawable& operator=(const LLDrawable& rhs)
+ {
+ llerrs << "Illegal operation!" << llendl;
+ return *this;
+ }
+
static void initClass();
LLDrawable() { init(); }
@@ -84,19 +96,19 @@ public:
LLVOVolume* getVOVolume() const; // cast mVObjp tp LLVOVolume if OK
const LLMatrix4& getWorldMatrix() const { return mXform.getWorldMatrix(); }
- const LLMatrix4& getRenderMatrix() const { return isRoot() ? getWorldMatrix() : getParent()->getWorldMatrix(); }
+ const LLMatrix4& getRenderMatrix() const;
void setPosition(LLVector3 v) const { }
const LLVector3& getPosition() const { return mXform.getPosition(); }
const LLVector3& getWorldPosition() const { return mXform.getPositionW(); }
const LLVector3 getPositionAgent() const;
- const LLVector3d& getPositionGroup() const { return mPositionGroup; }
+ const LLVector4a& getPositionGroup() const { return mPositionGroup; }
const LLVector3& getScale() const { return mCurrentScale; }
void setScale(const LLVector3& scale) { mCurrentScale = scale; }
const LLQuaternion& getWorldRotation() const { return mXform.getWorldRotation(); }
const LLQuaternion& getRotation() const { return mXform.getRotation(); }
F32 getIntensity() const { return llmin(mXform.getScale().mV[0], 4.f); }
S32 getLOD() const { return mVObjp ? mVObjp->getLOD() : 1; }
- F64 getBinRadius() const { return mBinRadius; }
+ F32 getBinRadius() const { return mBinRadius; }
void getMinMax(LLVector3& min,LLVector3& max) const { mXform.getMinMax(min,max); }
LLXformMatrix* getXform() { return &mXform; }
@@ -150,7 +162,7 @@ public:
void updateSpecialHoverCursor(BOOL enabled);
- virtual void shiftPos(const LLVector3 &shift_vector);
+ virtual void shiftPos(const LLVector4a &shift_vector);
S32 getGeneration() const { return mGeneration; }
@@ -168,11 +180,12 @@ public:
const LLVector3& getBounds(LLVector3& min, LLVector3& max) const;
virtual void updateSpatialExtents();
virtual void updateBinRadius();
- const LLVector3* getSpatialExtents() const;
- void setSpatialExtents(LLVector3 min, LLVector3 max);
- void setPositionGroup(const LLVector3d& pos);
- void setPositionGroup(const LLVector3& pos) { setPositionGroup(LLVector3d(pos)); }
+ const LLVector4a* getSpatialExtents() const;
+ void setSpatialExtents(const LLVector3& min, const LLVector3& max);
+ void setSpatialExtents(const LLVector4a& min, const LLVector4a& max);
+ void setPositionGroup(const LLVector4a& pos);
+
void setRenderType(S32 type) { mRenderType = type; }
BOOL isRenderType(S32 type) { return mRenderType == type; }
S32 getRenderType() { return mRenderType; }
@@ -232,37 +245,44 @@ public:
typedef enum e_drawable_flags
{
- IN_REBUILD_Q1 = 0x00000002,
- IN_REBUILD_Q2 = 0x00000004,
- IN_LIGHT_Q = 0x00000008,
- EARLY_MOVE = 0x00000010,
- MOVE_UNDAMPED = 0x00000020,
- ON_MOVE_LIST = 0x00000040,
- USE_BACKLIGHT = 0x00000080,
- UV = 0x00000100,
- UNLIT = 0x00000200,
- LIGHT = 0x00000400,
- LIGHTING_BUILT = 0x00000800,
- REBUILD_VOLUME = 0x00001000, //volume changed LOD or parameters, or vertex buffer changed
- REBUILD_TCOORD = 0x00002000, //texture coordinates changed
- REBUILD_COLOR = 0x00004000, //color changed
- REBUILD_POSITION= 0x00010000, //vertex positions/normals changed
+ IN_REBUILD_Q1 = 0x00000001,
+ IN_REBUILD_Q2 = 0x00000002,
+ IN_LIGHT_Q = 0x00000004,
+ EARLY_MOVE = 0x00000008,
+ MOVE_UNDAMPED = 0x00000010,
+ ON_MOVE_LIST = 0x00000020,
+ USE_BACKLIGHT = 0x00000040,
+ UV = 0x00000080,
+ UNLIT = 0x00000100,
+ LIGHT = 0x00000200,
+ LIGHTING_BUILT = 0x00000400,
+ REBUILD_VOLUME = 0x00000800, //volume changed LOD or parameters, or vertex buffer changed
+ REBUILD_TCOORD = 0x00001000, //texture coordinates changed
+ REBUILD_COLOR = 0x00002000, //color changed
+ REBUILD_POSITION= 0x00004000, //vertex positions/normals changed
REBUILD_GEOMETRY= REBUILD_POSITION|REBUILD_TCOORD|REBUILD_COLOR,
REBUILD_MATERIAL= REBUILD_TCOORD|REBUILD_COLOR,
REBUILD_ALL = REBUILD_GEOMETRY|REBUILD_VOLUME,
- ON_SHIFT_LIST = 0x00100000,
- BLOCKER = 0x00400000,
- ACTIVE = 0x00800000,
- DEAD = 0x01000000,
- INVISIBLE = 0x02000000, // stay invisible until flag is cleared
- NEARBY_LIGHT = 0x04000000, // In gPipeline.mNearbyLightSet
- BUILT = 0x08000000,
- FORCE_INVISIBLE = 0x10000000, // stay invis until CLEAR_INVISIBLE is set (set of orphaned)
- CLEAR_INVISIBLE = 0x20000000, // clear FORCE_INVISIBLE next draw frame
- REBUILD_SHADOW = 0x40000000,
- HAS_ALPHA = 0x80000000,
+ REBUILD_RIGGED = 0x00008000,
+ ON_SHIFT_LIST = 0x00010000,
+ BLOCKER = 0x00020000,
+ ACTIVE = 0x00040000,
+ DEAD = 0x00080000,
+ INVISIBLE = 0x00100000, // stay invisible until flag is cleared
+ NEARBY_LIGHT = 0x00200000, // In gPipeline.mNearbyLightSet
+ BUILT = 0x00400000,
+ FORCE_INVISIBLE = 0x00800000, // stay invis until CLEAR_INVISIBLE is set (set of orphaned)
+ CLEAR_INVISIBLE = 0x01000000, // clear FORCE_INVISIBLE next draw frame
+ REBUILD_SHADOW = 0x02000000,
+ HAS_ALPHA = 0x04000000,
+ RIGGED = 0x08000000,
} EDrawableFlags;
+private: //aligned members
+ LLVector4a mExtents[2];
+ LLVector4a mPositionGroup;
+
+public:
LLXformMatrix mXform;
// vis data
@@ -292,9 +312,7 @@ private:
mutable U32 mVisible;
F32 mRadius;
- LLVector3 mExtents[2];
- LLVector3d mPositionGroup;
- F64 mBinRadius;
+ F32 mBinRadius;
S32 mGeneration;
LLVector3 mCurrentScale;
diff --git a/indra/newview/lldrawpool.cpp b/indra/newview/lldrawpool.cpp
index ba576ff97f..25e4bc847c 100644
--- a/indra/newview/lldrawpool.cpp
+++ b/indra/newview/lldrawpool.cpp
@@ -243,11 +243,6 @@ void LLFacePool::dirtyTextures(const std::set<LLViewerFetchedTexture*>& textures
{
}
-BOOL LLFacePool::moveFace(LLFace *face, LLDrawPool *poolp, BOOL copy_data)
-{
- return TRUE;
-}
-
// static
S32 LLFacePool::drawLoop(face_array_t& face_list)
{
diff --git a/indra/newview/lldrawpool.h b/indra/newview/lldrawpool.h
index 1d6f99d346..d3fd9ead0d 100644
--- a/indra/newview/lldrawpool.h
+++ b/indra/newview/lldrawpool.h
@@ -47,14 +47,14 @@ public:
{
// Correspond to LLPipeline render type
POOL_SIMPLE = 1,
+ POOL_GROUND,
+ POOL_FULLBRIGHT,
+ POOL_BUMP,
POOL_TERRAIN,
- POOL_TREE,
POOL_SKY,
POOL_WL_SKY,
- POOL_GROUND,
+ POOL_TREE,
POOL_GRASS,
- POOL_FULLBRIGHT,
- POOL_BUMP,
POOL_INVISIBLE, // see below *
POOL_AVATAR,
POOL_VOIDWATER,
@@ -182,8 +182,6 @@ public:
virtual void resetDrawOrders();
void resetAll();
- BOOL moveFace(LLFace *face, LLDrawPool *poolp, BOOL copy_data = FALSE);
-
void destroy();
void buildEdges();
diff --git a/indra/newview/lldrawpoolalpha.cpp b/indra/newview/lldrawpoolalpha.cpp
index a2428d2de0..8b5a2ce781 100644
--- a/indra/newview/lldrawpoolalpha.cpp
+++ b/indra/newview/lldrawpoolalpha.cpp
@@ -103,16 +103,40 @@ void LLDrawPoolAlpha::renderDeferred(S32 pass)
S32 LLDrawPoolAlpha::getNumPostDeferredPasses()
{
- return 1;
+ if (LLPipeline::sImpostorRender)
+ { //skip depth buffer filling pass when rendering impostors
+ return 1;
+ }
+ else if (gSavedSettings.getBOOL("RenderDepthOfField"))
+ {
+ return 2;
+ }
+ else
+ {
+ return 1;
+ }
}
void LLDrawPoolAlpha::beginPostDeferredPass(S32 pass)
{
LLFastTimer t(FTM_RENDER_ALPHA);
- simple_shader = &gDeferredAlphaProgram;
- fullbright_shader = &gDeferredFullbrightProgram;
-
+ if (pass == 0)
+ {
+ simple_shader = &gDeferredAlphaProgram;
+ fullbright_shader = &gDeferredFullbrightProgram;
+ }
+ else
+ {
+ //update depth buffer sampler
+ gPipeline.mScreen.flush();
+ gPipeline.mDeferredDepth.copyContents(gPipeline.mDeferredScreen, 0, 0, gPipeline.mDeferredScreen.getWidth(), gPipeline.mDeferredScreen.getHeight(),
+ 0, 0, gPipeline.mDeferredDepth.getWidth(), gPipeline.mDeferredDepth.getHeight(), GL_DEPTH_BUFFER_BIT, GL_NEAREST);
+ gPipeline.mDeferredDepth.bindTarget();
+ simple_shader = NULL;
+ fullbright_shader = NULL;
+ }
+
deferred_render = TRUE;
if (mVertexShaderLevel > 0)
{
@@ -124,6 +148,13 @@ void LLDrawPoolAlpha::beginPostDeferredPass(S32 pass)
void LLDrawPoolAlpha::endPostDeferredPass(S32 pass)
{
+
+ if (pass == 1)
+ {
+ gPipeline.mDeferredDepth.flush();
+ gPipeline.mScreen.bindTarget();
+ }
+
deferred_render = FALSE;
endRenderPass(pass);
}
@@ -174,9 +205,16 @@ void LLDrawPoolAlpha::render(S32 pass)
LLGLSPipelineAlpha gls_pipeline_alpha;
- gGL.setColorMask(true, true);
+ if (deferred_render && pass == 1)
+ { //depth only
+ gGL.setColorMask(false, false);
+ }
+ else
+ {
+ gGL.setColorMask(true, true);
+ }
- if (LLPipeline::sAutoMaskAlphaNonDeferred && !deferred_render)
+ if (LLPipeline::sAutoMaskAlphaNonDeferred)
{
mColorSFactor = LLRender::BF_ONE; // }
mColorDFactor = LLRender::BF_ZERO; // } these are like disabling blend on the color channels, but we're still blending on the alpha channel so that we can suppress glow
@@ -192,7 +230,10 @@ void LLDrawPoolAlpha::render(S32 pass)
simple_shader->bind();
pushBatches(LLRenderPass::PASS_ALPHA_MASK, getVertexDataMask());
}
- fullbright_shader->bind();
+ if (fullbright_shader)
+ {
+ fullbright_shader->bind();
+ }
pushBatches(LLRenderPass::PASS_FULLBRIGHT_ALPHA_MASK, getVertexDataMask());
LLGLSLShader::bindNoShader();
}
@@ -206,18 +247,42 @@ void LLDrawPoolAlpha::render(S32 pass)
gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);
}
- LLGLDepthTest depth(GL_TRUE, LLDrawPoolWater::sSkipScreenCopy ? GL_TRUE : GL_FALSE);
+ LLGLDepthTest depth(GL_TRUE, LLDrawPoolWater::sSkipScreenCopy ||
+ (deferred_render && pass == 1) ? GL_TRUE : GL_FALSE);
- mColorSFactor = LLRender::BF_SOURCE_ALPHA; // } regular alpha blend
- mColorDFactor = LLRender::BF_ONE_MINUS_SOURCE_ALPHA; // }
- mAlphaSFactor = LLRender::BF_ZERO; // } glow suppression
- mAlphaDFactor = LLRender::BF_ONE_MINUS_SOURCE_ALPHA; // }
- gGL.blendFunc(mColorSFactor, mColorDFactor, mAlphaSFactor, mAlphaDFactor);
+ if (deferred_render && pass == 1)
+ {
+ gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.33f);
+ gGL.blendFunc(LLRender::BF_SOURCE_ALPHA, LLRender::BF_ONE_MINUS_SOURCE_ALPHA);
+ }
+ else
+ {
+ mColorSFactor = LLRender::BF_SOURCE_ALPHA; // } regular alpha blend
+ mColorDFactor = LLRender::BF_ONE_MINUS_SOURCE_ALPHA; // }
+ mAlphaSFactor = LLRender::BF_ZERO; // } glow suppression
+ mAlphaDFactor = LLRender::BF_ONE_MINUS_SOURCE_ALPHA; // }
+ gGL.blendFunc(mColorSFactor, mColorDFactor, mAlphaSFactor, mAlphaDFactor);
+
+ if (LLPipeline::sImpostorRender)
+ {
+ gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.5f);
+ }
+ else
+ {
+ gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);
+ }
+ }
renderAlpha(getVertexDataMask());
gGL.setColorMask(true, false);
+ if (deferred_render && pass == 1)
+ {
+ gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);
+ gGL.setSceneBlendType(LLRender::BT_ALPHA);
+ }
+
if (deferred_render && current_shader != NULL)
{
gPipeline.unbindDeferredShader(*current_shader);
@@ -276,22 +341,10 @@ void LLDrawPoolAlpha::renderAlpha(U32 mask)
BOOL light_enabled = TRUE;
S32 diffuse_channel = 0;
- //BOOL is_particle = FALSE;
BOOL use_shaders = (LLPipeline::sUnderWaterRender && gPipeline.canUseVertexShaders())
|| gPipeline.canUseWindLightShadersOnObjects();
- // check to see if it's a particle and if it's "close"
- {
- if (LLPipeline::sImpostorRender)
- {
- gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.5f);
- }
- else
- {
- gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);
- }
- }
-
+
for (LLCullResult::sg_list_t::iterator i = gPipeline.beginAlphaGroups(); i != gPipeline.endAlphaGroups(); ++i)
{
LLSpatialGroup* group = *i;
diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp
index dbd5da31a6..645c7ebcae 100644
--- a/indra/newview/lldrawpoolavatar.cpp
+++ b/indra/newview/lldrawpoolavatar.cpp
@@ -31,15 +31,21 @@
#include "llvoavatar.h"
#include "m3math.h"
+#include "llmatrix4a.h"
+#include "llagent.h" //for gAgent.needsRenderAvatar()
#include "lldrawable.h"
+#include "lldrawpoolbump.h"
#include "llface.h"
+#include "llmeshrepository.h"
#include "llsky.h"
#include "llviewercamera.h"
#include "llviewerregion.h"
#include "noise.h"
#include "pipeline.h"
#include "llviewershadermgr.h"
+#include "llvovolume.h"
+#include "llvolume.h"
#include "llappviewer.h"
#include "llrendersphere.h"
#include "llviewerpartsim.h"
@@ -47,10 +53,15 @@
static U32 sDataMask = LLDrawPoolAvatar::VERTEX_DATA_MASK;
static U32 sBufferUsage = GL_STREAM_DRAW_ARB;
static U32 sShaderLevel = 0;
-static LLGLSLShader* sVertexProgram = NULL;
+
+LLGLSLShader* LLDrawPoolAvatar::sVertexProgram = NULL;
BOOL LLDrawPoolAvatar::sSkipOpaque = FALSE;
BOOL LLDrawPoolAvatar::sSkipTransparent = FALSE;
+S32 LLDrawPoolAvatar::sDiffuseChannel = 0;
+
+
+static bool is_deferred_render = false;
extern BOOL gUseGLPick;
@@ -86,7 +97,7 @@ BOOL gAvatarEmbossBumpMap = FALSE;
static BOOL sRenderingSkinned = FALSE;
S32 normal_channel = -1;
S32 specular_channel = -1;
-S32 diffuse_channel = -1;
+S32 cube_channel = -1;
static LLFastTimer::DeclareTimer FTM_SHADOW_AVATAR("Avatar Shadow");
@@ -142,21 +153,17 @@ LLMatrix4& LLDrawPoolAvatar::getModelView()
//-----------------------------------------------------------------------------
-S32 LLDrawPoolAvatar::getNumDeferredPasses()
-{
- return getNumPasses();
-}
void LLDrawPoolAvatar::beginDeferredPass(S32 pass)
{
LLFastTimer t(FTM_RENDER_CHARACTERS);
sSkipTransparent = TRUE;
-
+ is_deferred_render = true;
+
if (LLPipeline::sImpostorRender)
- {
- beginDeferredSkinned();
- return;
+ { //impostor pass does not have rigid or impostor rendering
+ pass += 2;
}
switch (pass)
@@ -170,6 +177,12 @@ void LLDrawPoolAvatar::beginDeferredPass(S32 pass)
case 2:
beginDeferredSkinned();
break;
+ case 3:
+ beginDeferredRiggedSimple();
+ break;
+ case 4:
+ beginDeferredRiggedBump();
+ break;
}
}
@@ -178,11 +191,11 @@ void LLDrawPoolAvatar::endDeferredPass(S32 pass)
LLFastTimer t(FTM_RENDER_CHARACTERS);
sSkipTransparent = FALSE;
+ is_deferred_render = false;
if (LLPipeline::sImpostorRender)
{
- endDeferredSkinned();
- return;
+ pass += 2;
}
switch (pass)
@@ -196,6 +209,12 @@ void LLDrawPoolAvatar::endDeferredPass(S32 pass)
case 2:
endDeferredSkinned();
break;
+ case 3:
+ endDeferredRiggedSimple();
+ break;
+ case 4:
+ endDeferredRiggedBump();
+ break;
}
}
@@ -206,11 +225,36 @@ void LLDrawPoolAvatar::renderDeferred(S32 pass)
S32 LLDrawPoolAvatar::getNumPostDeferredPasses()
{
- return 1;
+ return 6;
}
void LLDrawPoolAvatar::beginPostDeferredPass(S32 pass)
{
+ switch (pass)
+ {
+ case 0:
+ beginPostDeferredAlpha();
+ break;
+ case 1:
+ beginRiggedFullbright();
+ break;
+ case 2:
+ beginRiggedFullbrightShiny();
+ break;
+ case 3:
+ beginDeferredRiggedAlpha();
+ break;
+ case 4:
+ beginRiggedFullbrightAlpha();
+ break;
+ case 5:
+ beginRiggedGlow();
+ break;
+ }
+}
+
+void LLDrawPoolAvatar::beginPostDeferredAlpha()
+{
sSkipOpaque = TRUE;
sShaderLevel = mVertexShaderLevel;
sVertexProgram = &gDeferredAvatarAlphaProgram;
@@ -219,64 +263,143 @@ void LLDrawPoolAvatar::beginPostDeferredPass(S32 pass)
gPipeline.bindDeferredShader(*sVertexProgram);
+ sDiffuseChannel = sVertexProgram->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
enable_vertex_weighting(sVertexProgram->mAttribute[LLViewerShaderMgr::AVATAR_WEIGHT]);
}
+void LLDrawPoolAvatar::beginDeferredRiggedAlpha()
+{
+ sVertexProgram = &gDeferredSkinnedAlphaProgram;
+ gPipeline.bindDeferredShader(*sVertexProgram);
+ sDiffuseChannel = sVertexProgram->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
+ LLVertexBuffer::sWeight4Loc = sVertexProgram->getAttribLocation(LLViewerShaderMgr::OBJECT_WEIGHT);
+ gPipeline.enableLightsDynamic();
+}
+
+void LLDrawPoolAvatar::endDeferredRiggedAlpha()
+{
+ LLVertexBuffer::unbind();
+ gPipeline.unbindDeferredShader(*sVertexProgram);
+ sDiffuseChannel = 0;
+ LLVertexBuffer::sWeight4Loc = -1;
+ sVertexProgram = NULL;
+}
+
void LLDrawPoolAvatar::endPostDeferredPass(S32 pass)
{
+ switch (pass)
+ {
+ case 0:
+ endPostDeferredAlpha();
+ break;
+ case 1:
+ endRiggedFullbright();
+ break;
+ case 2:
+ endRiggedFullbrightShiny();
+ break;
+ case 3:
+ endDeferredRiggedAlpha();
+ break;
+ case 4:
+ endRiggedFullbrightAlpha();
+ break;
+ case 5:
+ endRiggedGlow();
+ break;
+ }
+}
+
+void LLDrawPoolAvatar::endPostDeferredAlpha()
+{
// if we're in software-blending, remember to set the fence _after_ we draw so we wait till this rendering is done
sRenderingSkinned = FALSE;
sSkipOpaque = FALSE;
disable_vertex_weighting(sVertexProgram->mAttribute[LLViewerShaderMgr::AVATAR_WEIGHT]);
gPipeline.unbindDeferredShader(*sVertexProgram);
-
+ sDiffuseChannel = 0;
sShaderLevel = mVertexShaderLevel;
}
void LLDrawPoolAvatar::renderPostDeferred(S32 pass)
{
- render(2); //pass 2 = skinned
+ const S32 actual_pass[] =
+ { //map post deferred pass numbers to what render() expects
+ 2, //skinned
+ 4, // rigged fullbright
+ 6, //rigged fullbright shiny
+ 7, //rigged alpha
+ 8, //rigged fullbright alpha
+ 9, //rigged glow
+ };
+
+ pass = actual_pass[pass];
+
+ if (LLPipeline::sImpostorRender)
+ { //HACK for impostors so actual pass ends up being proper pass
+ pass -= 2;
+ }
+
+ render(pass);
}
S32 LLDrawPoolAvatar::getNumShadowPasses()
{
- return 1;
+ return 2;
}
void LLDrawPoolAvatar::beginShadowPass(S32 pass)
{
LLFastTimer t(FTM_SHADOW_AVATAR);
- sVertexProgram = &gDeferredAvatarShadowProgram;
- if (sShaderLevel > 0)
+
+ if (pass == 0)
{
- gAvatarMatrixParam = sVertexProgram->mUniform[LLViewerShaderMgr::AVATAR_MATRIX];
- }
- gGL.setAlphaRejectSettings(LLRender::CF_GREATER_EQUAL, 0.2f);
-
- glColor4f(1,1,1,1);
+ sVertexProgram = &gDeferredAvatarShadowProgram;
+ if (sShaderLevel > 0)
+ {
+ gAvatarMatrixParam = sVertexProgram->mUniform[LLViewerShaderMgr::AVATAR_MATRIX];
+ }
+ gGL.setAlphaRejectSettings(LLRender::CF_GREATER_EQUAL, 0.2f);
+
+ glColor4f(1,1,1,1);
- if ((sShaderLevel > 0)) // for hardware blending
+ if ((sShaderLevel > 0)) // for hardware blending
+ {
+ sRenderingSkinned = TRUE;
+ sVertexProgram->bind();
+ enable_vertex_weighting(sVertexProgram->mAttribute[LLViewerShaderMgr::AVATAR_WEIGHT]);
+ }
+ }
+ else
{
- sRenderingSkinned = TRUE;
+ sVertexProgram = &gDeferredAttachmentShadowProgram;
+ sDiffuseChannel = sVertexProgram->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
sVertexProgram->bind();
- enable_vertex_weighting(sVertexProgram->mAttribute[LLViewerShaderMgr::AVATAR_WEIGHT]);
+ LLVertexBuffer::sWeight4Loc = sVertexProgram->getAttribLocation(LLViewerShaderMgr::OBJECT_WEIGHT);
}
-
}
void LLDrawPoolAvatar::endShadowPass(S32 pass)
{
LLFastTimer t(FTM_SHADOW_AVATAR);
- if (sShaderLevel > 0)
+ if (pass == 0)
{
- sRenderingSkinned = FALSE;
+ if (sShaderLevel > 0)
+ {
+ sRenderingSkinned = FALSE;
+ sVertexProgram->unbind();
+ disable_vertex_weighting(sVertexProgram->mAttribute[LLViewerShaderMgr::AVATAR_WEIGHT]);
+ }
+ }
+ else
+ {
+ LLVertexBuffer::unbind();
sVertexProgram->unbind();
- disable_vertex_weighting(sVertexProgram->mAttribute[LLViewerShaderMgr::AVATAR_WEIGHT]);
+ LLVertexBuffer::sWeight4Loc = -1;
+ sVertexProgram = NULL;
}
-
- gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);
}
void LLDrawPoolAvatar::renderShadow(S32 pass)
@@ -306,26 +429,66 @@ void LLDrawPoolAvatar::renderShadow(S32 pass)
return;
}
- if (sShaderLevel > 0)
+ if (pass == 0)
{
- gAvatarMatrixParam = sVertexProgram->mUniform[LLViewerShaderMgr::AVATAR_MATRIX];
- }
-
- avatarp->renderSkinned(AVATAR_RENDER_PASS_SINGLE);
+ if (sShaderLevel > 0)
+ {
+ gAvatarMatrixParam = sVertexProgram->mUniform[LLViewerShaderMgr::AVATAR_MATRIX];
+ }
+ avatarp->renderSkinned(AVATAR_RENDER_PASS_SINGLE);
+ }
+ else
+ {
+ renderRigged(avatarp, RIGGED_SIMPLE);
+ renderRigged(avatarp, RIGGED_ALPHA);
+ renderRigged(avatarp, RIGGED_FULLBRIGHT);
+ renderRigged(avatarp, RIGGED_FULLBRIGHT_SHINY);
+ renderRigged(avatarp, RIGGED_SHINY);
+ renderRigged(avatarp, RIGGED_FULLBRIGHT_ALPHA);
+ }
}
S32 LLDrawPoolAvatar::getNumPasses()
{
- return LLPipeline::sImpostorRender ? 1 : 3;
+ if (LLPipeline::sImpostorRender)
+ {
+ return 8;
+ }
+ else
+ {
+ return 10;
+ }
+ if (LLPipeline::sImpostorRender)
+ {
+ return 1;
+ }
+ else
+ {
+ return 3;
+ }
+}
+
+
+S32 LLDrawPoolAvatar::getNumDeferredPasses()
+{
+ if (LLPipeline::sImpostorRender)
+ {
+ return 3;
+ }
+ else
+ {
+ return 5;
+ }
}
+
void LLDrawPoolAvatar::render(S32 pass)
{
LLFastTimer t(FTM_RENDER_CHARACTERS);
if (LLPipeline::sImpostorRender)
{
- renderAvatars(NULL, 2);
+ renderAvatars(NULL, pass+2);
return;
}
@@ -338,10 +501,14 @@ void LLDrawPoolAvatar::beginRenderPass(S32 pass)
//reset vertex buffer mappings
LLVertexBuffer::unbind();
+ if (pass == 0)
+ { //make sure no stale colors are left over from a previous render
+ glColor4f(1,1,1,1);
+ }
+
if (LLPipeline::sImpostorRender)
- {
- beginSkinned();
- return;
+ { //impostor render does not have impostors or rigid rendering
+ pass += 2;
}
switch (pass)
@@ -355,6 +522,27 @@ void LLDrawPoolAvatar::beginRenderPass(S32 pass)
case 2:
beginSkinned();
break;
+ case 3:
+ beginRiggedSimple();
+ break;
+ case 4:
+ beginRiggedFullbright();
+ break;
+ case 5:
+ beginRiggedShinySimple();
+ break;
+ case 6:
+ beginRiggedFullbrightShiny();
+ break;
+ case 7:
+ beginRiggedAlpha();
+ break;
+ case 8:
+ beginRiggedFullbrightAlpha();
+ break;
+ case 9:
+ beginRiggedGlow();
+ break;
}
}
@@ -364,8 +552,7 @@ void LLDrawPoolAvatar::endRenderPass(S32 pass)
if (LLPipeline::sImpostorRender)
{
- endSkinned();
- return;
+ pass += 2;
}
switch (pass)
@@ -378,6 +565,28 @@ void LLDrawPoolAvatar::endRenderPass(S32 pass)
break;
case 2:
endSkinned();
+ break;
+ case 3:
+ endRiggedSimple();
+ break;
+ case 4:
+ endRiggedFullbright();
+ break;
+ case 5:
+ endRiggedShinySimple();
+ break;
+ case 6:
+ endRiggedFullbrightShiny();
+ break;
+ case 7:
+ endRiggedAlpha();
+ break;
+ case 8:
+ endRiggedFullbrightAlpha();
+ break;
+ case 9:
+ endRiggedGlow();
+ break;
}
}
@@ -390,7 +599,7 @@ void LLDrawPoolAvatar::beginImpostor()
}
gPipeline.enableLightsFullbright(LLColor4(1,1,1,1));
- diffuse_channel = 0;
+ sDiffuseChannel = 0;
}
void LLDrawPoolAvatar::endImpostor()
@@ -441,9 +650,9 @@ void LLDrawPoolAvatar::beginDeferredImpostor()
sVertexProgram = &gDeferredImpostorProgram;
- normal_channel = sVertexProgram->enableTexture(LLViewerShaderMgr::DEFERRED_NORMAL);
specular_channel = sVertexProgram->enableTexture(LLViewerShaderMgr::SPECULAR_MAP);
- diffuse_channel = sVertexProgram->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
+ normal_channel = sVertexProgram->enableTexture(LLViewerShaderMgr::DEFERRED_NORMAL);
+ sDiffuseChannel = sVertexProgram->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
sVertexProgram->bind();
}
@@ -563,6 +772,254 @@ void LLDrawPoolAvatar::endSkinned()
gGL.getTexUnit(0)->activate();
}
+void LLDrawPoolAvatar::beginRiggedSimple()
+{
+ if (sShaderLevel > 0)
+ {
+ if (LLPipeline::sUnderWaterRender)
+ {
+ sVertexProgram = &gSkinnedObjectSimpleWaterProgram;
+ }
+ else
+ {
+ sVertexProgram = &gSkinnedObjectSimpleProgram;
+ }
+ }
+ else
+ {
+ if (LLPipeline::sUnderWaterRender)
+ {
+ sVertexProgram = &gObjectSimpleWaterProgram;
+ }
+ else
+ {
+ sVertexProgram = &gObjectSimpleProgram;
+ }
+ }
+
+ if (sShaderLevel > 0 || gPipeline.canUseVertexShaders())
+ {
+ sDiffuseChannel = 0;
+ sVertexProgram->bind();
+ LLVertexBuffer::sWeight4Loc = sVertexProgram->getAttribLocation(LLViewerShaderMgr::OBJECT_WEIGHT);
+ }
+}
+
+void LLDrawPoolAvatar::endRiggedSimple()
+{
+ LLVertexBuffer::unbind();
+ if (sShaderLevel > 0 || gPipeline.canUseVertexShaders())
+ {
+ sVertexProgram->unbind();
+ sVertexProgram = NULL;
+ LLVertexBuffer::sWeight4Loc = -1;
+ }
+}
+
+void LLDrawPoolAvatar::beginRiggedAlpha()
+{
+ beginRiggedSimple();
+}
+
+void LLDrawPoolAvatar::endRiggedAlpha()
+{
+ endRiggedSimple();
+}
+
+
+void LLDrawPoolAvatar::beginRiggedFullbrightAlpha()
+{
+ beginRiggedFullbright();
+}
+
+void LLDrawPoolAvatar::endRiggedFullbrightAlpha()
+{
+ endRiggedFullbright();
+}
+
+void LLDrawPoolAvatar::beginRiggedGlow()
+{
+ beginRiggedFullbright();
+}
+
+void LLDrawPoolAvatar::endRiggedGlow()
+{
+ endRiggedFullbright();
+}
+
+void LLDrawPoolAvatar::beginRiggedFullbright()
+{
+ if (sShaderLevel > 0)
+ {
+ if (LLPipeline::sUnderWaterRender)
+ {
+ sVertexProgram = &gSkinnedObjectFullbrightWaterProgram;
+ }
+ else
+ {
+ sVertexProgram = &gSkinnedObjectFullbrightProgram;
+ }
+ }
+ else
+ {
+ if (LLPipeline::sUnderWaterRender)
+ {
+ sVertexProgram = &gObjectFullbrightWaterProgram;
+ }
+ else
+ {
+ sVertexProgram = &gObjectFullbrightProgram;
+ }
+ }
+
+ if (sShaderLevel > 0 || gPipeline.canUseVertexShaders())
+ {
+ sDiffuseChannel = 0;
+ sVertexProgram->bind();
+ LLVertexBuffer::sWeight4Loc = sVertexProgram->getAttribLocation(LLViewerShaderMgr::OBJECT_WEIGHT);
+ }
+}
+
+void LLDrawPoolAvatar::endRiggedFullbright()
+{
+ LLVertexBuffer::unbind();
+ if (sShaderLevel > 0 || gPipeline.canUseVertexShaders())
+ {
+ sVertexProgram->unbind();
+ sVertexProgram = NULL;
+ LLVertexBuffer::sWeight4Loc = -1;
+ }
+}
+
+void LLDrawPoolAvatar::beginRiggedShinySimple()
+{
+ if (sShaderLevel > 0)
+ {
+ if (LLPipeline::sUnderWaterRender)
+ {
+ sVertexProgram = &gSkinnedObjectShinySimpleWaterProgram;
+ }
+ else
+ {
+ sVertexProgram = &gSkinnedObjectShinySimpleProgram;
+ }
+ }
+ else
+ {
+ if (LLPipeline::sUnderWaterRender)
+ {
+ sVertexProgram = &gObjectShinyWaterProgram;
+ }
+ else
+ {
+ sVertexProgram = &gObjectShinyProgram;
+ }
+ }
+
+ if (sShaderLevel > 0 || gPipeline.canUseVertexShaders())
+ {
+ sVertexProgram->bind();
+ LLDrawPoolBump::bindCubeMap(sVertexProgram, 2, sDiffuseChannel, cube_channel, false);
+ LLVertexBuffer::sWeight4Loc = sVertexProgram->getAttribLocation(LLViewerShaderMgr::OBJECT_WEIGHT);
+ }
+}
+
+void LLDrawPoolAvatar::endRiggedShinySimple()
+{
+ LLVertexBuffer::unbind();
+ if (sShaderLevel > 0 || gPipeline.canUseVertexShaders())
+ {
+ LLDrawPoolBump::unbindCubeMap(sVertexProgram, 2, sDiffuseChannel, cube_channel, false);
+ sVertexProgram->unbind();
+ sVertexProgram = NULL;
+ LLVertexBuffer::sWeight4Loc = -1;
+ }
+}
+
+void LLDrawPoolAvatar::beginRiggedFullbrightShiny()
+{
+ if (sShaderLevel > 0)
+ {
+ if (LLPipeline::sUnderWaterRender)
+ {
+ sVertexProgram = &gSkinnedObjectFullbrightShinyWaterProgram;
+ }
+ else
+ {
+ sVertexProgram = &gSkinnedObjectFullbrightShinyProgram;
+ }
+ }
+ else
+ {
+ if (LLPipeline::sUnderWaterRender)
+ {
+ sVertexProgram = &gObjectFullbrightShinyWaterProgram;
+ }
+ else
+ {
+ sVertexProgram = &gObjectFullbrightShinyProgram;
+ }
+ }
+
+
+ if (sShaderLevel > 0 || gPipeline.canUseVertexShaders())
+ {
+ sVertexProgram->bind();
+ LLDrawPoolBump::bindCubeMap(sVertexProgram, 2, sDiffuseChannel, cube_channel, false);
+ LLVertexBuffer::sWeight4Loc = sVertexProgram->getAttribLocation(LLViewerShaderMgr::OBJECT_WEIGHT);
+ }
+}
+
+void LLDrawPoolAvatar::endRiggedFullbrightShiny()
+{
+ LLVertexBuffer::unbind();
+ if (sShaderLevel > 0 || gPipeline.canUseVertexShaders())
+ {
+ LLDrawPoolBump::unbindCubeMap(sVertexProgram, 2, sDiffuseChannel, cube_channel, false);
+ sVertexProgram->unbind();
+ sVertexProgram = NULL;
+ LLVertexBuffer::sWeight4Loc = -1;
+ }
+}
+
+
+void LLDrawPoolAvatar::beginDeferredRiggedSimple()
+{
+ sVertexProgram = &gDeferredSkinnedDiffuseProgram;
+ sDiffuseChannel = 0;
+ sVertexProgram->bind();
+ LLVertexBuffer::sWeight4Loc = sVertexProgram->getAttribLocation(LLViewerShaderMgr::OBJECT_WEIGHT);
+}
+
+void LLDrawPoolAvatar::endDeferredRiggedSimple()
+{
+ LLVertexBuffer::unbind();
+ sVertexProgram->unbind();
+ LLVertexBuffer::sWeight4Loc = -1;
+ sVertexProgram = NULL;
+}
+
+void LLDrawPoolAvatar::beginDeferredRiggedBump()
+{
+ sVertexProgram = &gDeferredSkinnedBumpProgram;
+ sVertexProgram->bind();
+ normal_channel = sVertexProgram->enableTexture(LLViewerShaderMgr::BUMP_MAP);
+ sDiffuseChannel = sVertexProgram->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
+ LLVertexBuffer::sWeight4Loc = sVertexProgram->getAttribLocation(LLViewerShaderMgr::OBJECT_WEIGHT);
+}
+
+void LLDrawPoolAvatar::endDeferredRiggedBump()
+{
+ LLVertexBuffer::unbind();
+ sVertexProgram->disableTexture(LLViewerShaderMgr::BUMP_MAP);
+ sVertexProgram->disableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
+ sVertexProgram->unbind();
+ LLVertexBuffer::sWeight4Loc = -1;
+ normal_channel = -1;
+ sDiffuseChannel = 0;
+ sVertexProgram = NULL;
+}
+
void LLDrawPoolAvatar::beginDeferredSkinned()
{
sShaderLevel = mVertexShaderLevel;
@@ -572,6 +1029,7 @@ void LLDrawPoolAvatar::beginDeferredSkinned()
sVertexProgram->bind();
+ sDiffuseChannel = sVertexProgram->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
enable_vertex_weighting(sVertexProgram->mAttribute[LLViewerShaderMgr::AVATAR_WEIGHT]);
gGL.getTexUnit(0)->activate();
@@ -584,6 +1042,8 @@ void LLDrawPoolAvatar::endDeferredSkinned()
disable_vertex_weighting(sVertexProgram->mAttribute[LLViewerShaderMgr::AVATAR_WEIGHT]);
sVertexProgram->unbind();
+ sVertexProgram->disableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
+
sShaderLevel = mVertexShaderLevel;
gGL.getTexUnit(0)->activate();
@@ -668,8 +1128,6 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass)
return;
}
- LLOverrideFaceColor color(this, 1.0f, 1.0f, 1.0f, 1.0f);
-
if (pass == 0)
{
if (!LLPipeline::sReflectionRender)
@@ -679,7 +1137,7 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass)
if (impostor)
{
- if (LLPipeline::sRenderDeferred && avatarp->mImpostor.isComplete())
+ if (LLPipeline::sRenderDeferred && !LLPipeline::sReflectionRender && avatarp->mImpostor.isComplete())
{
if (normal_channel > -1)
{
@@ -690,7 +1148,7 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass)
avatarp->mImpostor.bindTexture(1, specular_channel);
}
}
- avatarp->renderImpostor(LLColor4U(255,255,255,255), diffuse_channel);
+ avatarp->renderImpostor(LLColor4U(255,255,255,255), sDiffuseChannel);
}
return;
}
@@ -706,6 +1164,88 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass)
avatarp->renderRigid();
return;
}
+
+ if (pass == 3)
+ {
+ if (is_deferred_render)
+ {
+ renderDeferredRiggedSimple(avatarp);
+ }
+ else
+ {
+ renderRiggedSimple(avatarp);
+ }
+ return;
+ }
+
+ if (pass == 4)
+ {
+ if (is_deferred_render)
+ {
+ renderDeferredRiggedBump(avatarp);
+ }
+ else
+ {
+ renderRiggedFullbright(avatarp);
+ }
+
+ return;
+ }
+
+ if (pass == 5)
+ {
+ renderRiggedShinySimple(avatarp);
+ return;
+ }
+
+ if (pass == 6)
+ {
+ renderRiggedFullbrightShiny(avatarp);
+ return;
+ }
+
+ if (pass >= 7 && pass < 9)
+ {
+ LLGLEnable blend(GL_BLEND);
+
+ gGL.setColorMask(true, true);
+ gGL.blendFunc(LLRender::BF_SOURCE_ALPHA,
+ LLRender::BF_ONE_MINUS_SOURCE_ALPHA,
+ LLRender::BF_ZERO,
+ LLRender::BF_ONE_MINUS_SOURCE_ALPHA);
+
+
+ if (pass == 7)
+ {
+ renderRiggedAlpha(avatarp);
+ return;
+ }
+
+ if (pass == 8)
+ {
+ renderRiggedFullbrightAlpha(avatarp);
+ return;
+ }
+ }
+
+ if (pass == 9)
+ {
+ LLGLEnable blend(GL_BLEND);
+ LLGLDisable test(GL_ALPHA_TEST);
+ gGL.flush();
+
+ 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);
+
+ renderRiggedGlow(avatarp);
+ gGL.setColorMask(true, false);
+ gGL.setSceneBlendType(LLRender::BT_ALPHA);
+ return;
+ }
if (sShaderLevel > 0)
{
@@ -743,6 +1283,307 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass)
}
}
+void LLDrawPoolAvatar::updateRiggedFaceVertexBuffer(LLVOAvatar* avatar, LLFace* face, const LLMeshSkinInfo* skin, LLVolume* volume, const LLVolumeFace& vol_face)
+{
+ LLVector4a* weight = vol_face.mWeights;
+ if (!weight)
+ {
+ return;
+ }
+
+ LLVertexBuffer* buffer = face->getVertexBuffer();
+
+ U32 data_mask = face->getRiggedVertexBufferDataMask();
+
+ if (!buffer ||
+ buffer->getTypeMask() != data_mask ||
+ buffer->getRequestedVerts() != vol_face.mNumVertices)
+ {
+ face->setGeomIndex(0);
+ face->setIndicesIndex(0);
+ face->setSize(vol_face.mNumVertices, vol_face.mNumIndices, true);
+
+
+ if (sShaderLevel > 0)
+ {
+ buffer = new LLVertexBuffer(data_mask, GL_DYNAMIC_DRAW_ARB);
+ }
+ else
+ {
+ buffer = new LLVertexBuffer(data_mask, GL_STREAM_DRAW_ARB);
+ }
+
+ buffer->allocateBuffer(face->getGeomCount(), face->getIndicesCount(), true);
+
+ face->setVertexBuffer(buffer);
+
+ U16 offset = 0;
+
+ LLMatrix4 mat_vert = skin->mBindShapeMatrix;
+ glh::matrix4f m((F32*) mat_vert.mMatrix);
+ m = m.inverse().transpose();
+
+ F32 mat3[] =
+ { m.m[0], m.m[1], m.m[2],
+ m.m[4], m.m[5], m.m[6],
+ m.m[8], m.m[9], m.m[10] };
+
+ LLMatrix3 mat_normal(mat3);
+
+ face->getGeometryVolume(*volume, face->getTEOffset(), mat_vert, mat_normal, offset, true);
+ }
+
+ if (sShaderLevel <= 0 && face->mLastSkinTime < avatar->getLastSkinTime())
+ { //perform software vertex skinning for this face
+ LLStrider<LLVector3> position;
+ LLStrider<LLVector3> normal;
+
+ bool has_normal = buffer->hasDataType(LLVertexBuffer::TYPE_NORMAL);
+ buffer->getVertexStrider(position);
+
+ if (has_normal)
+ {
+ buffer->getNormalStrider(normal);
+ }
+
+ LLVector4a* pos = (LLVector4a*) position.get();
+
+ LLVector4a* norm = has_normal ? (LLVector4a*) normal.get() : NULL;
+
+ //build matrix palette
+ LLMatrix4a mp[64];
+ LLMatrix4* mat = (LLMatrix4*) mp;
+
+ for (U32 j = 0; j < skin->mJointNames.size(); ++j)
+ {
+ LLJoint* joint = avatar->getJoint(skin->mJointNames[j]);
+ if (joint)
+ {
+ mat[j] = skin->mInvBindMatrix[j];
+ mat[j] *= joint->getWorldMatrix();
+ }
+ }
+
+ LLMatrix4a bind_shape_matrix;
+ bind_shape_matrix.loadu(skin->mBindShapeMatrix);
+
+ for (U32 j = 0; j < buffer->getRequestedVerts(); ++j)
+ {
+ LLMatrix4a final_mat;
+ final_mat.clear();
+
+ S32 idx[4];
+
+ LLVector4 wght;
+
+ F32 scale = 0.f;
+ for (U32 k = 0; k < 4; k++)
+ {
+ F32 w = weight[j][k];
+
+ idx[k] = llclamp((S32) floorf(w), 0, 63);
+ wght[k] = w - floorf(w);
+ scale += wght[k];
+ }
+
+ wght *= 1.f/scale;
+
+ for (U32 k = 0; k < 4; k++)
+ {
+ F32 w = wght[k];
+
+ LLMatrix4a src;
+ src.setMul(mp[idx[k]], w);
+
+ final_mat.add(src);
+ }
+
+
+ LLVector4a& v = vol_face.mPositions[j];
+ LLVector4a t;
+ LLVector4a dst;
+ bind_shape_matrix.affineTransform(v, t);
+ final_mat.affineTransform(t, dst);
+ pos[j] = dst;
+
+ if (norm)
+ {
+ LLVector4a& n = vol_face.mNormals[j];
+ bind_shape_matrix.rotate(n, t);
+ final_mat.rotate(t, dst);
+ norm[j] = dst;
+ }
+ }
+ }
+}
+
+void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, bool glow)
+{
+ if (avatar->isSelf() && !gAgent.needsRenderAvatar())
+ {
+ return;
+ }
+
+ stop_glerror();
+
+ for (U32 i = 0; i < mRiggedFace[type].size(); ++i)
+ {
+ LLFace* face = mRiggedFace[type][i];
+ LLDrawable* drawable = face->getDrawable();
+ if (!drawable)
+ {
+ continue;
+ }
+
+ LLVOVolume* vobj = drawable->getVOVolume();
+
+ if (!vobj)
+ {
+ continue;
+ }
+
+ LLVolume* volume = vobj->getVolume();
+ S32 te = face->getTEOffset();
+
+ if (!volume || volume->getNumVolumeFaces() <= te)
+ {
+ continue;
+ }
+
+ LLUUID mesh_id = volume->getParams().getSculptID();
+ if (mesh_id.isNull())
+ {
+ continue;
+ }
+
+ const LLMeshSkinInfo* skin = gMeshRepo.getSkinInfo(mesh_id);
+ if (!skin)
+ {
+ continue;
+ }
+
+ stop_glerror();
+
+ const LLVolumeFace& vol_face = volume->getVolumeFace(te);
+ updateRiggedFaceVertexBuffer(avatar, face, skin, volume, vol_face);
+
+ stop_glerror();
+
+ U32 data_mask = LLFace::getRiggedDataMask(type);
+
+ LLVertexBuffer* buff = face->getVertexBuffer();
+
+ if (buff)
+ {
+ if (sShaderLevel > 0)
+ { //upload matrix palette to shader
+ LLMatrix4 mat[64];
+
+ for (U32 i = 0; i < skin->mJointNames.size(); ++i)
+ {
+ LLJoint* joint = avatar->getJoint(skin->mJointNames[i]);
+ if (joint)
+ {
+ mat[i] = skin->mInvBindMatrix[i];
+ mat[i] *= joint->getWorldMatrix();
+ }
+ }
+
+ stop_glerror();
+
+ LLDrawPoolAvatar::sVertexProgram->uniformMatrix4fv("matrixPalette",
+ skin->mJointNames.size(),
+ FALSE,
+ (GLfloat*) mat[0].mMatrix);
+
+ stop_glerror();
+ }
+ else
+ {
+ data_mask &= ~LLVertexBuffer::MAP_WEIGHT4;
+ }
+
+ buff->setBuffer(data_mask);
+
+ U16 start = face->getGeomStart();
+ U16 end = start + face->getGeomCount()-1;
+ S32 offset = face->getIndicesStart();
+ U32 count = face->getIndicesCount();
+
+ if (glow)
+ {
+ glColor4f(0,0,0,face->getTextureEntry()->getGlow());
+ }
+
+ gGL.getTexUnit(sDiffuseChannel)->bind(face->getTexture());
+ if (normal_channel > -1)
+ {
+ LLDrawPoolBump::bindBumpMap(face, normal_channel);
+ }
+
+ if (face->mTextureMatrix)
+ {
+ glMatrixMode(GL_TEXTURE);
+ glLoadMatrixf((F32*) face->mTextureMatrix->mMatrix);
+ buff->drawRange(LLRender::TRIANGLES, start, end, count, offset);
+ glLoadIdentity();
+ glMatrixMode(GL_MODELVIEW);
+ }
+ else
+ {
+ buff->drawRange(LLRender::TRIANGLES, start, end, count, offset);
+ }
+ }
+ }
+}
+
+void LLDrawPoolAvatar::renderDeferredRiggedSimple(LLVOAvatar* avatar)
+{
+ renderRigged(avatar, RIGGED_DEFERRED_SIMPLE);
+}
+
+void LLDrawPoolAvatar::renderDeferredRiggedBump(LLVOAvatar* avatar)
+{
+ renderRigged(avatar, RIGGED_DEFERRED_BUMP);
+}
+
+void LLDrawPoolAvatar::renderRiggedSimple(LLVOAvatar* avatar)
+{
+ renderRigged(avatar, RIGGED_SIMPLE);
+}
+
+void LLDrawPoolAvatar::renderRiggedFullbright(LLVOAvatar* avatar)
+{
+ renderRigged(avatar, RIGGED_FULLBRIGHT);
+}
+
+
+void LLDrawPoolAvatar::renderRiggedShinySimple(LLVOAvatar* avatar)
+{
+ renderRigged(avatar, RIGGED_SHINY);
+}
+
+void LLDrawPoolAvatar::renderRiggedFullbrightShiny(LLVOAvatar* avatar)
+{
+ renderRigged(avatar, RIGGED_FULLBRIGHT_SHINY);
+}
+
+void LLDrawPoolAvatar::renderRiggedAlpha(LLVOAvatar* avatar)
+{
+ renderRigged(avatar, RIGGED_ALPHA);
+}
+
+void LLDrawPoolAvatar::renderRiggedFullbrightAlpha(LLVOAvatar* avatar)
+{
+ renderRigged(avatar, RIGGED_FULLBRIGHT_ALPHA);
+}
+
+void LLDrawPoolAvatar::renderRiggedGlow(LLVOAvatar* avatar)
+{
+ renderRigged(avatar, RIGGED_GLOW, true);
+}
+
+
//-----------------------------------------------------------------------------
// getDebugTexture()
@@ -770,6 +1611,50 @@ LLColor3 LLDrawPoolAvatar::getDebugColor() const
return LLColor3(0.f, 1.f, 0.f);
}
+void LLDrawPoolAvatar::addRiggedFace(LLFace* facep, U32 type)
+{
+ if (type >= NUM_RIGGED_PASSES)
+ {
+ llerrs << "Invalid rigged face type." << llendl;
+ }
+
+ if (facep->getRiggedIndex(type) != -1)
+ {
+ llerrs << "Tried to add a rigged face that's referenced elsewhere." << llendl;
+ }
+
+ facep->setRiggedIndex(type, mRiggedFace[type].size());
+ facep->setPool(this);
+ mRiggedFace[type].push_back(facep);
+}
+
+void LLDrawPoolAvatar::removeRiggedFace(LLFace* facep)
+{
+ facep->setPool(NULL);
+
+ for (U32 i = 0; i < NUM_RIGGED_PASSES; ++i)
+ {
+ S32 index = facep->getRiggedIndex(i);
+
+ if (index > -1)
+ {
+ if (mRiggedFace[i].size() > index && mRiggedFace[i][index] == facep)
+ {
+ facep->setRiggedIndex(i,-1);
+ mRiggedFace[i].erase(mRiggedFace[i].begin()+index);
+ for (U32 j = index; j < mRiggedFace[i].size(); ++j)
+ { //bump indexes down for faces referenced after erased face
+ mRiggedFace[i][j]->setRiggedIndex(i, j);
+ }
+ }
+ else
+ {
+ llerrs << "Face reference data corrupt for rigged type " << i << llendl;
+ }
+ }
+ }
+}
+
LLVertexBufferAvatar::LLVertexBufferAvatar()
: LLVertexBuffer(sDataMask,
GL_STREAM_DRAW_ARB) //avatars are always stream draw due to morph targets
@@ -782,22 +1667,25 @@ void LLVertexBufferAvatar::setupVertexBuffer(U32 data_mask) const
{
if (sRenderingSkinned)
{
- U8* base = useVBOs() ? NULL : mMappedData;
+ U8* base = useVBOs() ? (U8*) mAlignedOffset : mMappedData;
- glVertexPointer(3,GL_FLOAT, mStride, (void*)(base + 0));
- glNormalPointer(GL_FLOAT, mStride, (void*)(base + mOffsets[TYPE_NORMAL]));
- glTexCoordPointer(2,GL_FLOAT, mStride, (void*)(base + mOffsets[TYPE_TEXCOORD0]));
+ glVertexPointer(3,GL_FLOAT, LLVertexBuffer::sTypeSize[LLVertexBuffer::TYPE_VERTEX], (void*)(base + 0));
+ glNormalPointer(GL_FLOAT, LLVertexBuffer::sTypeSize[LLVertexBuffer::TYPE_NORMAL], (void*)(base + mOffsets[TYPE_NORMAL]));
+ glTexCoordPointer(2,GL_FLOAT, LLVertexBuffer::sTypeSize[LLVertexBuffer::TYPE_TEXCOORD0], (void*)(base + mOffsets[TYPE_TEXCOORD0]));
- set_vertex_weights(sVertexProgram->mAttribute[LLViewerShaderMgr::AVATAR_WEIGHT], mStride, (F32*)(base + mOffsets[TYPE_WEIGHT]));
+ set_vertex_weights(LLDrawPoolAvatar::sVertexProgram->mAttribute[LLViewerShaderMgr::AVATAR_WEIGHT],
+ LLVertexBuffer::sTypeSize[LLVertexBuffer::TYPE_WEIGHT], (F32*)(base + mOffsets[TYPE_WEIGHT]));
if (sShaderLevel >= LLDrawPoolAvatar::SHADER_LEVEL_BUMP)
{
- set_binormals(sVertexProgram->mAttribute[LLViewerShaderMgr::BINORMAL], mStride, (LLVector3*)(base + mOffsets[TYPE_BINORMAL]));
+ set_binormals(LLDrawPoolAvatar::sVertexProgram->mAttribute[LLViewerShaderMgr::BINORMAL],
+ LLVertexBuffer::sTypeSize[LLVertexBuffer::TYPE_BINORMAL], (LLVector3*)(base + mOffsets[TYPE_BINORMAL]));
}
if (sShaderLevel >= LLDrawPoolAvatar::SHADER_LEVEL_CLOTH)
{
- set_vertex_clothing_weights(sVertexProgram->mAttribute[LLViewerShaderMgr::AVATAR_CLOTHING], mStride, (LLVector4*)(base + mOffsets[TYPE_CLOTHWEIGHT]));
+ set_vertex_clothing_weights(LLDrawPoolAvatar::sVertexProgram->mAttribute[LLViewerShaderMgr::AVATAR_CLOTHING],
+ LLVertexBuffer::sTypeSize[LLVertexBuffer::TYPE_CLOTHWEIGHT], (LLVector4*)(base + mOffsets[TYPE_CLOTHWEIGHT]));
}
}
else
diff --git a/indra/newview/lldrawpoolavatar.h b/indra/newview/lldrawpoolavatar.h
index f536d3c911..fcd8294af5 100644
--- a/indra/newview/lldrawpoolavatar.h
+++ b/indra/newview/lldrawpoolavatar.h
@@ -1,4 +1,4 @@
-/**
+ /**
* @file lldrawpoolavatar.h
* @brief LLDrawPoolAvatar class definition
*
@@ -30,6 +30,12 @@
#include "lldrawpool.h"
class LLVOAvatar;
+class LLGLSLShader;
+class LLFace;
+class LLMeshSkinInfo;
+class LLVolume;
+class LLVolumeFace;
+
class LLDrawPoolAvatar : public LLFacePool
{
@@ -83,7 +89,7 @@ public:
void beginRigid();
void beginImpostor();
void beginSkinned();
-
+
void endRigid();
void endImpostor();
void endSkinned();
@@ -95,14 +101,113 @@ public:
void endDeferredImpostor();
void endDeferredRigid();
void endDeferredSkinned();
+
+ void beginPostDeferredAlpha();
+ void endPostDeferredAlpha();
+
+ void beginRiggedSimple();
+ void beginRiggedFullbright();
+ void beginRiggedFullbrightShiny();
+ void beginRiggedShinySimple();
+ void beginRiggedAlpha();
+ void beginRiggedFullbrightAlpha();
+ void beginRiggedGlow();
+ void beginDeferredRiggedAlpha();
+
+ void endRiggedSimple();
+ void endRiggedFullbright();
+ void endRiggedFullbrightShiny();
+ void endRiggedShinySimple();
+ void endRiggedAlpha();
+ void endRiggedFullbrightAlpha();
+ void endRiggedGlow();
+ void endDeferredRiggedAlpha();
+
+ void beginDeferredRiggedSimple();
+ void beginDeferredRiggedBump();
+
+ void endDeferredRiggedSimple();
+ void endDeferredRiggedBump();
+ void updateRiggedFaceVertexBuffer(LLVOAvatar* avatar,
+ LLFace* facep,
+ const LLMeshSkinInfo* skin,
+ LLVolume* volume,
+ const LLVolumeFace& vol_face);
+
+ void renderRigged(LLVOAvatar* avatar, U32 type, bool glow = false);
+ void renderRiggedSimple(LLVOAvatar* avatar);
+ void renderRiggedAlpha(LLVOAvatar* avatar);
+ void renderRiggedFullbrightAlpha(LLVOAvatar* avatar);
+ void renderRiggedFullbright(LLVOAvatar* avatar);
+ void renderRiggedShinySimple(LLVOAvatar* avatar);
+ void renderRiggedFullbrightShiny(LLVOAvatar* avatar);
+ void renderRiggedGlow(LLVOAvatar* avatar);
+ void renderDeferredRiggedSimple(LLVOAvatar* avatar);
+ void renderDeferredRiggedBump(LLVOAvatar* avatar);
+
+ typedef enum
+ {
+ RIGGED_SIMPLE = 0,
+ RIGGED_FULLBRIGHT,
+ RIGGED_SHINY,
+ RIGGED_FULLBRIGHT_SHINY,
+ RIGGED_GLOW,
+ RIGGED_ALPHA,
+ RIGGED_FULLBRIGHT_ALPHA,
+ RIGGED_DEFERRED_BUMP,
+ RIGGED_DEFERRED_SIMPLE,
+ NUM_RIGGED_PASSES,
+ RIGGED_UNKNOWN,
+ } eRiggedPass;
+
+ typedef enum
+ {
+ RIGGED_SIMPLE_MASK = LLVertexBuffer::MAP_VERTEX |
+ LLVertexBuffer::MAP_NORMAL |
+ LLVertexBuffer::MAP_TEXCOORD0 |
+ LLVertexBuffer::MAP_COLOR |
+ LLVertexBuffer::MAP_WEIGHT4,
+ RIGGED_FULLBRIGHT_MASK = LLVertexBuffer::MAP_VERTEX |
+ LLVertexBuffer::MAP_TEXCOORD0 |
+ LLVertexBuffer::MAP_COLOR |
+ LLVertexBuffer::MAP_WEIGHT4,
+ RIGGED_SHINY_MASK = RIGGED_SIMPLE_MASK,
+ RIGGED_FULLBRIGHT_SHINY_MASK = RIGGED_SIMPLE_MASK,
+ RIGGED_GLOW_MASK = LLVertexBuffer::MAP_VERTEX |
+ LLVertexBuffer::MAP_TEXCOORD0 |
+ LLVertexBuffer::MAP_WEIGHT4,
+ RIGGED_ALPHA_MASK = RIGGED_SIMPLE_MASK,
+ RIGGED_FULLBRIGHT_ALPHA_MASK = RIGGED_FULLBRIGHT_MASK,
+ RIGGED_DEFERRED_BUMP_MASK = LLVertexBuffer::MAP_VERTEX |
+ LLVertexBuffer::MAP_NORMAL |
+ LLVertexBuffer::MAP_TEXCOORD0 |
+ LLVertexBuffer::MAP_BINORMAL |
+ LLVertexBuffer::MAP_COLOR |
+ LLVertexBuffer::MAP_WEIGHT4,
+ RIGGED_DEFERRED_SIMPLE_MASK = LLVertexBuffer::MAP_VERTEX |
+ LLVertexBuffer::MAP_NORMAL |
+ LLVertexBuffer::MAP_TEXCOORD0 |
+ LLVertexBuffer::MAP_COLOR |
+ LLVertexBuffer::MAP_WEIGHT4,
+ } eRiggedDataMask;
+
+ void addRiggedFace(LLFace* facep, U32 type);
+ void removeRiggedFace(LLFace* facep);
+
+ std::vector<LLFace*> mRiggedFace[NUM_RIGGED_PASSES];
+
/*virtual*/ LLViewerTexture *getDebugTexture();
/*virtual*/ LLColor3 getDebugColor() const; // For AGP debug display
void renderAvatars(LLVOAvatar *single_avatar, S32 pass = -1); // renders only one avatar if single_avatar is not null.
+
static BOOL sSkipOpaque;
static BOOL sSkipTransparent;
+ static S32 sDiffuseChannel;
+
+ static LLGLSLShader* sVertexProgram;
};
class LLVertexBufferAvatar : public LLVertexBuffer
diff --git a/indra/newview/lldrawpoolbump.cpp b/indra/newview/lldrawpoolbump.cpp
index 223e4a438c..2f76baaaf7 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();
@@ -145,12 +152,7 @@ void LLStandardBumpmap::addstandard()
// llinfos << "Loading bumpmap: " << bump_image_id << " from viewerart" << llendl;
gStandardBumpmapList[LLStandardBumpmap::sStandardBumpmapCount].mLabel = label;
gStandardBumpmapList[LLStandardBumpmap::sStandardBumpmapCount].mImage =
- LLViewerTextureManager::getFetchedTexture(LLUUID(bump_image_id),
- TRUE,
- LLViewerTexture::BOOST_NONE,
- LLViewerTexture::LOD_TEXTURE,
- 0,
- 0);
+ LLViewerTextureManager::getFetchedTexture(LLUUID(bump_image_id));
gStandardBumpmapList[LLStandardBumpmap::sStandardBumpmapCount].mImage->setBoostLevel(LLViewerTexture::BOOST_BUMP) ;
gStandardBumpmapList[LLStandardBumpmap::sStandardBumpmapCount].mImage->setLoadedCallback(LLBumpImageList::onSourceStandardLoaded, 0, TRUE, FALSE, NULL, NULL );
LLStandardBumpmap::sStandardBumpmapCount++;
@@ -334,30 +336,43 @@ void LLDrawPoolBump::beginShiny(bool invisible)
sVertexMask = VERTEX_MASK_SHINY | LLVertexBuffer::MAP_TEXCOORD0;
}
- if (LLPipeline::sUnderWaterRender)
+ if (getVertexShaderLevel() > 0)
{
- shader = &gObjectShinyWaterProgram;
+ if (LLPipeline::sUnderWaterRender)
+ {
+ shader = &gObjectShinyWaterProgram;
+ }
+ else
+ {
+ shader = &gObjectShinyProgram;
+ }
+ shader->bind();
}
else
{
- shader = &gObjectShinyProgram;
+ shader = NULL;
}
+ bindCubeMap(shader, mVertexShaderLevel, diffuse_channel, cube_channel, invisible);
+}
+
+//static
+void LLDrawPoolBump::bindCubeMap(LLGLSLShader* shader, S32 shader_level, S32& diffuse_channel, S32& cube_channel, bool invisible)
+{
LLCubeMap* cube_map = gSky.mVOSkyp ? gSky.mVOSkyp->getCubeMap() : NULL;
if( cube_map )
{
- if (!invisible && LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_OBJECT) > 0 )
+ if (!invisible && shader )
{
LLMatrix4 mat;
mat.initRows(LLVector4(gGLModelView+0),
LLVector4(gGLModelView+4),
LLVector4(gGLModelView+8),
LLVector4(gGLModelView+12));
- shader->bind();
LLVector3 vec = LLVector3(gShinyOrigin) * mat;
LLVector4 vec4(vec, gShinyOrigin.mV[3]);
shader->uniform4fv(LLViewerShaderMgr::SHINY_ORIGIN, 1, vec4.mV);
- if (mVertexShaderLevel > 1)
+ if (shader_level > 1)
{
cube_map->setMatrix(1);
// Make sure that texture coord generation happens for tex unit 1, as that's the one we use for
@@ -419,22 +434,16 @@ void LLDrawPoolBump::renderShiny(bool invisible)
}
}
-void LLDrawPoolBump::endShiny(bool invisible)
+//static
+void LLDrawPoolBump::unbindCubeMap(LLGLSLShader* shader, S32 shader_level, S32& diffuse_channel, S32& cube_channel, bool invisible)
{
- LLFastTimer t(FTM_RENDER_SHINY);
- if ((!invisible && !gPipeline.hasRenderBatches(LLRenderPass::PASS_SHINY))||
- (invisible && !gPipeline.hasRenderBatches(LLRenderPass::PASS_INVISI_SHINY)))
- {
- return;
- }
-
LLCubeMap* cube_map = gSky.mVOSkyp ? gSky.mVOSkyp->getCubeMap() : NULL;
if( cube_map )
{
cube_map->disable();
cube_map->restoreMatrix();
- if (!invisible && mVertexShaderLevel > 1)
+ if (!invisible && shader_level > 1)
{
shader->disableTexture(LLViewerShaderMgr::ENVIRONMENT_MAP, LLTexUnit::TT_CUBE_MAP);
@@ -445,7 +454,6 @@ void LLDrawPoolBump::endShiny(bool invisible)
shader->disableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
}
}
- shader->unbind();
}
}
gGL.getTexUnit(diffuse_channel)->disable();
@@ -453,6 +461,22 @@ void LLDrawPoolBump::endShiny(bool invisible)
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);
+}
+
+void LLDrawPoolBump::endShiny(bool invisible)
+{
+ LLFastTimer t(FTM_RENDER_SHINY);
+ if ((!invisible && !gPipeline.hasRenderBatches(LLRenderPass::PASS_SHINY))||
+ (invisible && !gPipeline.hasRenderBatches(LLRenderPass::PASS_INVISI_SHINY)))
+ {
+ return;
+ }
+
+ unbindCubeMap(shader, mVertexShaderLevel, diffuse_channel, cube_channel, invisible);
+ if (shader)
+ {
+ shader->unbind();
+ }
diffuse_channel = -1;
cube_channel = 0;
@@ -473,7 +497,7 @@ void LLDrawPoolBump::beginFullbrightShiny()
if (LLPipeline::sUnderWaterRender)
{
- shader = &gObjectShinyWaterProgram;
+ shader = &gObjectFullbrightShinyWaterProgram;
}
else
{
@@ -580,18 +604,37 @@ void LLDrawPoolBump::renderGroup(LLSpatialGroup* group, U32 type, U32 mask, BOOL
// static
BOOL LLDrawPoolBump::bindBumpMap(LLDrawInfo& params, S32 channel)
{
- LLViewerTexture* bump = NULL;
-
U8 bump_code = params.mBump;
+ return bindBumpMap(bump_code, params.mTexture, params.mVSize, channel);
+}
+
+//static
+BOOL LLDrawPoolBump::bindBumpMap(LLFace* face, S32 channel)
+{
+ const LLTextureEntry* te = face->getTextureEntry();
+ if (te)
+ {
+ U8 bump_code = te->getBumpmap();
+ return bindBumpMap(bump_code, face->getTexture(), face->getVirtualSize(), channel);
+ }
+
+ return FALSE;
+}
+
+//static
+BOOL LLDrawPoolBump::bindBumpMap(U8 bump_code, LLViewerTexture* texture, F32 vsize, S32 channel)
+{
//Note: texture atlas does not support bump texture now.
- LLViewerFetchedTexture* tex = LLViewerTextureManager::staticCastToFetchedTexture(params.mTexture) ;
+ LLViewerFetchedTexture* tex = LLViewerTextureManager::staticCastToFetchedTexture(texture) ;
if(!tex)
{
//if the texture is not a fetched texture
return FALSE;
}
+ LLViewerTexture* bump = NULL;
+
switch( bump_code )
{
case BE_NO_BUMP:
@@ -605,7 +648,7 @@ BOOL LLDrawPoolBump::bindBumpMap(LLDrawInfo& params, S32 channel)
if( bump_code < LLStandardBumpmap::sStandardBumpmapCount )
{
bump = gStandardBumpmapList[bump_code].mImage;
- gBumpImageList.addTextureStats(bump_code, tex->getID(), params.mVSize);
+ gBumpImageList.addTextureStats(bump_code, tex->getID(), vsize);
}
break;
}
@@ -624,7 +667,7 @@ BOOL LLDrawPoolBump::bindBumpMap(LLDrawInfo& params, S32 channel)
return TRUE;
}
-
+
return FALSE;
}
@@ -853,6 +896,12 @@ void LLBumpImageList::destroyGL()
void LLBumpImageList::restoreGL()
{
+ if(!gTextureList.isInitialized())
+ {
+ //safe to return here because bump images will be reloaded during initialization later.
+ return ;
+ }
+
LLStandardBumpmap::restoreGL();
// Images will be recreated as they are needed.
}
@@ -964,25 +1013,28 @@ LLViewerTexture* LLBumpImageList::getBrightnessDarknessImage(LLViewerFetchedText
}
bump_image_map_t::iterator iter = entries_list->find(src_image->getID());
- if (iter != entries_list->end())
+ if (iter != entries_list->end() && iter->second.notNull())
{
bump = iter->second;
}
else
{
LLPointer<LLImageRaw> raw = new LLImageRaw(1,1,1);
- raw->clear(0x77, 0x77, 0x77, 0xFF);
+ raw->clear(0x77, 0x77, 0xFF, 0xFF);
(*entries_list)[src_image->getID()] = LLViewerTextureManager::getLocalTexture( raw.get(), TRUE);
- (*entries_list)[src_image->getID()]->setExplicitFormat(GL_ALPHA8, GL_ALPHA);
-
- // Note: this may create an LLImageGL immediately
- src_image->setBoostLevel(LLViewerTexture::BOOST_BUMP) ;
- src_image->setLoadedCallback( callback_func, 0, TRUE, FALSE, new LLUUID(src_image->getID()), NULL );
bump = (*entries_list)[src_image->getID()]; // In case callback was called immediately and replaced the image
+ }
-// bump_total++;
-// llinfos << "*** Creating " << (void*)bump << " " << bump_total << llendl;
+ if (!src_image->hasCallbacks())
+ { //if image has no callbacks but resolutions don't match, trigger raw image loaded callback again
+ if (src_image->getWidth() != bump->getWidth() ||
+ src_image->getHeight() != bump->getHeight() ||
+ (LLPipeline::sRenderDeferred && bump->getComponents() != 4))
+ {
+ src_image->setBoostLevel(LLViewerTexture::BOOST_BUMP) ;
+ src_image->setLoadedCallback( callback_func, 0, TRUE, FALSE, new LLUUID(src_image->getID()), NULL );
+ }
}
}
@@ -1085,7 +1137,21 @@ void LLBumpImageList::onSourceLoaded( BOOL success, LLViewerTexture *src_vi, LLI
{
bump_image_map_t& entries_list(bump_code == BE_BRIGHTNESS ? gBumpImageList.mBrightnessEntries : gBumpImageList.mDarknessEntries );
bump_image_map_t::iterator iter = entries_list.find(source_asset_id);
- if (iter != entries_list.end()) // bump not cached yet
+
+ if (iter == entries_list.end() ||
+ iter->second.isNull() ||
+ iter->second->getWidth() != src->getWidth() ||
+ iter->second->getHeight() != src->getHeight()) // bump not cached yet or has changed resolution
+ { //make sure an entry exists for this image
+ LLPointer<LLImageRaw> raw = new LLImageRaw(1,1,1);
+ raw->clear(0x77, 0x77, 0xFF, 0xFF);
+
+ entries_list[src_vi->getID()] = LLViewerTextureManager::getLocalTexture( raw.get(), TRUE);
+ iter = entries_list.find(src_vi->getID());
+ }
+
+ //if (iter->second->getWidth() != src->getWidth() ||
+ // iter->second->getHeight() != src->getHeight()) // bump not cached yet or has changed resolution
{
LLPointer<LLImageRaw> dst_image = new LLImageRaw(src->getWidth(), src->getHeight(), 1);
U8* dst_data = dst_image->getData();
@@ -1211,18 +1277,10 @@ void LLBumpImageList::onSourceLoaded( BOOL success, LLViewerTexture *src_vi, LLI
bump->setExplicitFormat(GL_RGBA, GL_RGBA);
bump->createGLTexture(0, nrm_image);
}
-
-
+
iter->second = bump; // derefs (and deletes) old image
//---------------------------------------------------
}
- else
- {
- // entry should have been added in LLBumpImageList::getImage().
-
- // Not a legit assertion - the bump texture could have been flushed by the bump image manager
- //llassert(0);
- }
}
}
diff --git a/indra/newview/lldrawpoolbump.h b/indra/newview/lldrawpoolbump.h
index 65a813ab94..f4702bf61d 100644
--- a/indra/newview/lldrawpoolbump.h
+++ b/indra/newview/lldrawpoolbump.h
@@ -35,6 +35,7 @@
class LLImageRaw;
class LLSpatialGroup;
class LLDrawInfo;
+class LLGLSLShader;
class LLViewerFetchedTexture;
class LLDrawPoolBump : public LLRenderPass
@@ -73,6 +74,9 @@ public:
void renderBump(U32 pass = LLRenderPass::PASS_BUMP);
void endBump(U32 pass = LLRenderPass::PASS_BUMP);
+ static void bindCubeMap(LLGLSLShader* shader, S32 shader_level, S32& diffuse_channel, S32& cube_channel, bool invisible);
+ static void unbindCubeMap(LLGLSLShader* shader, S32 shader_level, S32& diffuse_channel, S32& cube_channel, bool invisible);
+
virtual S32 getNumDeferredPasses();
/*virtual*/ void beginDeferredPass(S32 pass);
/*virtual*/ void endDeferredPass(S32 pass);
@@ -83,7 +87,12 @@ public:
/*virtual*/ void endPostDeferredPass(S32 pass);
/*virtual*/ void renderPostDeferred(S32 pass);
- BOOL bindBumpMap(LLDrawInfo& params, S32 channel = -2);
+ static BOOL bindBumpMap(LLDrawInfo& params, S32 channel = -2);
+ static BOOL bindBumpMap(LLFace* face, S32 channel = -2);
+
+private:
+ static BOOL bindBumpMap(U8 bump_code, LLViewerTexture* tex, F32 vsize, S32 channel);
+
};
enum EBumpEffect
diff --git a/indra/newview/lldrawpoolsky.cpp b/indra/newview/lldrawpoolsky.cpp
index 6b45c5abb0..030d6e1110 100644
--- a/indra/newview/lldrawpoolsky.cpp
+++ b/indra/newview/lldrawpoolsky.cpp
@@ -63,6 +63,8 @@ void LLDrawPoolSky::prerender()
void LLDrawPoolSky::render(S32 pass)
{
+ gGL.flush();
+
if (mDrawFace.empty())
{
return;
@@ -111,13 +113,14 @@ void LLDrawPoolSky::render(S32 pass)
S32 face_count = (S32)mDrawFace.size();
+ LLVertexBuffer::unbind();
+ glColor4f(1,1,1,1);
+
for (S32 i = 0; i < llmin(6, face_count); ++i)
{
renderSkyCubeFace(i);
}
- LLGLEnable blend(GL_BLEND);
-
glPopMatrix();
}
diff --git a/indra/newview/lldrawpooltree.cpp b/indra/newview/lldrawpooltree.cpp
index f1198c9a8d..195ee60a2e 100644
--- a/indra/newview/lldrawpooltree.cpp
+++ b/indra/newview/lldrawpooltree.cpp
@@ -107,11 +107,12 @@ void LLDrawPoolTree::render(S32 pass)
iter != mDrawFace.end(); iter++)
{
LLFace *face = *iter;
- if(face->mVertexBuffer.notNull())
+ LLVertexBuffer* buff = face->getVertexBuffer();
+ if(buff)
{
- face->mVertexBuffer->setBuffer(LLDrawPoolTree::VERTEX_DATA_MASK);
- face->mVertexBuffer->drawRange(LLRender::TRIANGLES, 0, face->mVertexBuffer->getRequestedVerts()-1, face->mVertexBuffer->getRequestedIndices(), 0);
- gPipeline.addTrianglesDrawn(face->mVertexBuffer->getRequestedIndices());
+ buff->setBuffer(LLDrawPoolTree::VERTEX_DATA_MASK);
+ buff->drawRange(LLRender::TRIANGLES, 0, buff->getRequestedVerts()-1, buff->getRequestedIndices(), 0);
+ gPipeline.addTrianglesDrawn(buff->getRequestedIndices());
}
}
}
@@ -200,13 +201,13 @@ void LLDrawPoolTree::renderTree(BOOL selecting)
LLFace *face = *iter;
LLDrawable *drawablep = face->getDrawable();
- if (drawablep->isDead() || face->mVertexBuffer.isNull())
+ if (drawablep->isDead() || !face->getVertexBuffer())
{
continue;
}
- face->mVertexBuffer->setBuffer(LLDrawPoolTree::VERTEX_DATA_MASK);
- U16* indicesp = (U16*) face->mVertexBuffer->getIndicesPointer();
+ face->getVertexBuffer()->setBuffer(LLDrawPoolTree::VERTEX_DATA_MASK);
+ U16* indicesp = (U16*) face->getVertexBuffer()->getIndicesPointer();
// Render each of the trees
LLVOTree *treep = (LLVOTree *)drawablep->getVObj().get();
diff --git a/indra/newview/lldrawpoolwlsky.cpp b/indra/newview/lldrawpoolwlsky.cpp
index eaa6aa7e37..696c2d1abd 100644
--- a/indra/newview/lldrawpoolwlsky.cpp
+++ b/indra/newview/lldrawpoolwlsky.cpp
@@ -192,7 +192,7 @@ void LLDrawPoolWLSky::renderSkyClouds(F32 camHeightLocal) const
&gWLCloudProgram;
LLGLEnable blend(GL_BLEND);
- LLGLSBlendFunc blendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ gGL.setSceneBlendType(LLRender::BT_ALPHA);
gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);
gGL.getTexUnit(0)->bind(sCloudNoiseTexture);
diff --git a/indra/newview/lleventnotifier.h b/indra/newview/lleventnotifier.h
index 697a708762..3fee46c2f6 100644
--- a/indra/newview/lleventnotifier.h
+++ b/indra/newview/lleventnotifier.h
@@ -31,6 +31,7 @@
#include "v3dmath.h"
class LLEventNotification;
+class LLMessageSystem;
class LLEventNotifier
diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp
index fe201a6773..5398c13c44 100644
--- a/indra/newview/llface.cpp
+++ b/indra/newview/llface.cpp
@@ -33,8 +33,10 @@
#include "llviewercontrol.h"
#include "llvolume.h"
#include "m3math.h"
+#include "llmatrix4a.h"
#include "v3color.h"
+#include "lldrawpoolavatar.h"
#include "lldrawpoolbump.h"
#include "llgl.h"
#include "llrender.h"
@@ -67,35 +69,43 @@ The resulting texture coordinate <u,v> is:
u = 2(B dot P)
v = 2(T dot P)
*/
-void planarProjection(LLVector2 &tc, const LLVector3& normal,
- const LLVector3 &mCenter, const LLVector3& vec)
-{ //DONE!
- LLVector3 binormal;
- float d = normal * LLVector3(1,0,0);
+void planarProjection(LLVector2 &tc, const LLVector4a& normal,
+ const LLVector4a &center, const LLVector4a& vec)
+{
+ LLVector4a binormal;
+ F32 d = normal[0];
+
if (d >= 0.5f || d <= -0.5f)
{
- binormal = LLVector3(0,1,0);
- if (normal.mV[0] < 0)
+ if (d < 0)
+ {
+ binormal.set(0,-1,0);
+ }
+ else
{
- binormal = -binormal;
+ binormal.set(0, 1, 0);
}
}
else
{
- binormal = LLVector3(1,0,0);
- if (normal.mV[1] > 0)
+ if (normal[1] > 0)
{
- binormal = -binormal;
+ binormal.set(-1,0,0);
+ }
+ else
+ {
+ binormal.set(1,0,0);
}
}
- LLVector3 tangent = binormal % normal;
+ LLVector4a tangent;
+ tangent.setCross3(binormal,normal);
- tc.mV[1] = -((tangent*vec)*2 - 0.5f);
- tc.mV[0] = 1.0f+((binormal*vec)*2 - 0.5f);
+ tc.mV[1] = -((tangent.dot3(vec).getF32())*2 - 0.5f);
+ tc.mV[0] = 1.0f+((binormal.dot3(vec).getF32())*2 - 0.5f);
}
-void sphericalProjection(LLVector2 &tc, const LLVector3& normal,
- const LLVector3 &mCenter, const LLVector3& vec)
+void sphericalProjection(LLVector2 &tc, const LLVector4a& normal,
+ const LLVector4a &mCenter, const LLVector4a& vec)
{ //BROKEN
/*tc.mV[0] = acosf(vd.mNormal * LLVector3(1,0,0))/3.14159f;
@@ -106,7 +116,7 @@ void sphericalProjection(LLVector2 &tc, const LLVector3& normal,
}*/
}
-void cylindricalProjection(LLVector2 &tc, const LLVector3& normal, const LLVector3 &mCenter, const LLVector3& vec)
+void cylindricalProjection(LLVector2 &tc, const LLVector4a& normal, const LLVector4a &mCenter, const LLVector4a& vec)
{ //BROKEN
/*LLVector3 binormal;
float d = vd.mNormal * LLVector3(1,0,0);
@@ -138,6 +148,7 @@ void LLFace::init(LLDrawable* drawablep, LLViewerObject* objp)
{
mLastUpdateTime = gFrameTimeSeconds;
mLastMoveTime = 0.f;
+ mLastSkinTime = gFrameTimeSeconds;
mVSize = 0.f;
mPixelArea = 16.f;
mState = GLOBAL;
@@ -179,9 +190,13 @@ void LLFace::init(LLDrawable* drawablep, LLViewerObject* objp)
mHasMedia = FALSE ;
}
-
void LLFace::destroy()
{
+ if (gDebugGL)
+ {
+ gPipeline.checkReferences(this);
+ }
+
if(mTexture.notNull())
{
mTexture->removeFace(this) ;
@@ -189,7 +204,15 @@ void LLFace::destroy()
if (mDrawPoolp)
{
- mDrawPoolp->removeFace(this);
+ if (this->isState(LLFace::RIGGED) && mDrawPoolp->getType() == LLDrawPool::POOL_AVATAR)
+ {
+ ((LLDrawPoolAvatar*) mDrawPoolp)->removeRiggedFace(this);
+ }
+ else
+ {
+ mDrawPoolp->removeFace(this);
+ }
+
mDrawPoolp = NULL;
}
@@ -210,8 +233,8 @@ void LLFace::destroy()
}
setDrawInfo(NULL);
-
removeAtlas();
+
mDrawablep = NULL;
mVObjp = NULL;
}
@@ -227,6 +250,11 @@ void LLFace::setWorldMatrix(const LLMatrix4 &mat)
llerrs << "Faces on this drawable are not independently modifiable\n" << llendl;
}
+void LLFace::setPool(LLFacePool* pool)
+{
+ mDrawPoolp = pool;
+}
+
void LLFace::setPool(LLFacePool* new_pool, LLViewerTexture *texturep)
{
LLMemType mt1(LLMemType::MTYPE_DRAWABLE);
@@ -329,8 +357,21 @@ void LLFace::setDrawable(LLDrawable *drawable)
mXform = &drawable->mXform;
}
-void LLFace::setSize(const S32 num_vertices, const S32 num_indices)
+void LLFace::setSize(S32 num_vertices, S32 num_indices, bool align)
{
+ if (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)
{
@@ -339,8 +380,28 @@ void LLFace::setSize(const S32 num_vertices, const S32 num_indices)
mVertexBuffer = NULL;
mLastVertexBuffer = NULL;
}
+
+ llassert(verify());
+}
+
+void LLFace::setGeomIndex(U16 idx)
+{
+ if (mGeomIndex != idx)
+ {
+ mGeomIndex = idx;
+ mVertexBuffer = NULL;
+ }
}
+void LLFace::setIndicesIndex(S32 idx)
+{
+ if (mIndicesIndex != idx)
+ {
+ mIndicesIndex = idx;
+ mVertexBuffer = NULL;
+ }
+}
+
//============================================================================
U16 LLFace::getGeometryAvatar(
@@ -429,8 +490,36 @@ void LLFace::renderSelected(LLViewerTexture *imagep, const LLColor4& color)
}
glColor4fv(color.mV);
- mVertexBuffer->setBuffer(LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0);
- mVertexBuffer->draw(LLRender::TRIANGLES, mIndicesCount, mIndicesIndex);
+
+ if (mDrawablep->isState(LLDrawable::RIGGED))
+ {
+ LLVOVolume* volume = mDrawablep->getVOVolume();
+ if (volume)
+ {
+ LLRiggedVolume* rigged = volume->getRiggedVolume();
+ if (rigged)
+ {
+ LLGLEnable offset(GL_POLYGON_OFFSET_FILL);
+ glPolygonOffset(-1.f, -1.f);
+ glMultMatrixf((F32*) volume->getRelativeXform().mMatrix);
+ const LLVolumeFace& vol_face = rigged->getVolumeFace(getTEOffset());
+ LLVertexBuffer::unbind();
+ glVertexPointer(3, GL_FLOAT, 16, vol_face.mPositions);
+ if (vol_face.mTexCoords)
+ {
+ glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+ glTexCoordPointer(2, GL_FLOAT, 8, vol_face.mTexCoords);
+ }
+ glDrawElements(GL_TRIANGLES, vol_face.mNumIndices, GL_UNSIGNED_SHORT, vol_face.mIndices);
+ glDisableClientState(GL_TEXTURE_COORD_ARRAY);
+ }
+ }
+ }
+ else
+ {
+ mVertexBuffer->setBuffer(LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0);
+ mVertexBuffer->draw(LLRender::TRIANGLES, mIndicesCount, mIndicesIndex);
+ }
gGL.popMatrix();
}
@@ -515,23 +604,26 @@ void LLFace::printDebugInfo() const
llinfos << "II: " << mIndicesIndex << " Count:" << mIndicesCount << llendl;
llinfos << llendl;
- poolp->printDebugInfo();
-
- S32 pool_references = 0;
- for (std::vector<LLFace*>::iterator iter = poolp->mReferences.begin();
- iter != poolp->mReferences.end(); iter++)
+ if (poolp)
{
- LLFace *facep = *iter;
- if (facep == this)
+ poolp->printDebugInfo();
+
+ S32 pool_references = 0;
+ for (std::vector<LLFace*>::iterator iter = poolp->mReferences.begin();
+ iter != poolp->mReferences.end(); iter++)
{
- llinfos << "Pool reference: " << pool_references << llendl;
- pool_references++;
+ LLFace *facep = *iter;
+ if (facep == this)
+ {
+ llinfos << "Pool reference: " << pool_references << llendl;
+ pool_references++;
+ }
}
- }
- if (pool_references != 1)
- {
- llinfos << "Incorrect number of pool references!" << llendl;
+ if (pool_references != 1)
+ {
+ llinfos << "Incorrect number of pool references!" << llendl;
+ }
}
#if 0
@@ -588,95 +680,116 @@ static void xform(LLVector2 &tex_coord, F32 cosAng, F32 sinAng, F32 offS, F32 of
BOOL LLFace::genVolumeBBoxes(const LLVolume &volume, S32 f,
- const LLMatrix4& mat_vert, const LLMatrix3& mat_normal, BOOL global_volume)
+ const LLMatrix4& mat_vert_in, const LLMatrix3& mat_normal_in, BOOL global_volume)
{
LLMemType mt1(LLMemType::MTYPE_DRAWABLE);
//get bounding box
- if (mDrawablep->isState(LLDrawable::REBUILD_VOLUME | LLDrawable::REBUILD_POSITION))
+ if (mDrawablep->isState(LLDrawable::REBUILD_VOLUME | LLDrawable::REBUILD_POSITION | LLDrawable::REBUILD_RIGGED))
{
+ //VECTORIZE THIS
+ LLMatrix4a mat_vert;
+ mat_vert.loadu(mat_vert_in);
+
+ LLMatrix4a mat_normal;
+ mat_normal.loadu(mat_normal_in);
+
//if (mDrawablep->isState(LLDrawable::REBUILD_VOLUME))
//{ //vertex buffer no longer valid
// mVertexBuffer = NULL;
// mLastVertexBuffer = NULL;
//}
- LLVector3 min,max;
+ //VECTORIZE THIS
+ LLVector4a min,max;
if (f >= volume.getNumVolumeFaces())
{
- min = LLVector3(-1,-1,-1);
- max = LLVector3(1,1,1);
- }
- else
- {
- const LLVolumeFace &face = volume.getVolumeFace(f);
- min = face.mExtents[0];
- max = face.mExtents[1];
+ llwarns << "Generating bounding box for invalid face index!" << llendl;
+ f = 0;
}
+ const LLVolumeFace &face = volume.getVolumeFace(f);
+ min = face.mExtents[0];
+ max = face.mExtents[1];
+
+
//min, max are in volume space, convert to drawable render space
- LLVector3 center = ((min + max) * 0.5f)*mat_vert;
- LLVector3 size = ((max-min) * 0.5f);
+ LLVector4a center;
+ LLVector4a t;
+ t.setAdd(min, max);
+ t.mul(0.5f);
+ mat_vert.affineTransform(t, center);
+ LLVector4a size;
+ size.setSub(max, min);
+ size.mul(0.5f);
+
if (!global_volume)
{
- size.scaleVec(mDrawablep->getVObj()->getScale());
+ //VECTORIZE THIS
+ LLVector4a scale;
+ scale.load3(mDrawablep->getVObj()->getScale().mV);
+ size.mul(scale);
}
- LLMatrix3 mat = mat_normal;
- LLVector3 x = mat.getFwdRow();
- LLVector3 y = mat.getLeftRow();
- LLVector3 z = mat.getUpRow();
- x.normVec();
- y.normVec();
- z.normVec();
+ mat_normal.mMatrix[0].normalize3fast();
+ mat_normal.mMatrix[1].normalize3fast();
+ mat_normal.mMatrix[2].normalize3fast();
+
+ LLVector4a v[4];
- mat.setRows(x,y,z);
+ //get 4 corners of bounding box
+ mat_normal.rotate(size,v[0]);
- LLQuaternion rotation = LLQuaternion(mat);
+ //VECTORIZE THIS
+ LLVector4a scale;
- LLVector3 v[4];
- //get 4 corners of bounding box
- v[0] = (size * rotation);
- v[1] = (LLVector3(-size.mV[0], -size.mV[1], size.mV[2]) * rotation);
- v[2] = (LLVector3(size.mV[0], -size.mV[1], -size.mV[2]) * rotation);
- v[3] = (LLVector3(-size.mV[0], size.mV[1], -size.mV[2]) * rotation);
+ scale.set(-1.f, -1.f, 1.f);
+ scale.mul(size);
+ mat_normal.rotate(scale, v[1]);
+
+ scale.set(1.f, -1.f, -1.f);
+ scale.mul(size);
+ mat_normal.rotate(scale, v[2]);
+
+ scale.set(-1.f, 1.f, -1.f);
+ scale.mul(size);
+ mat_normal.rotate(scale, v[3]);
- LLVector3& newMin = mExtents[0];
- LLVector3& newMax = mExtents[1];
+ LLVector4a& newMin = mExtents[0];
+ LLVector4a& newMax = mExtents[1];
newMin = newMax = center;
for (U32 i = 0; i < 4; i++)
{
- for (U32 j = 0; j < 3; j++)
- {
- F32 delta = fabsf(v[i].mV[j]);
- F32 min = center.mV[j] - delta;
- F32 max = center.mV[j] + delta;
-
- if (min < newMin.mV[j])
- {
- newMin.mV[j] = min;
- }
-
- if (max > newMax.mV[j])
- {
- newMax.mV[j] = max;
- }
- }
+ LLVector4a delta;
+ delta.setAbs(v[i]);
+ LLVector4a min;
+ min.setSub(center, delta);
+ LLVector4a max;
+ max.setAdd(center, delta);
+
+ newMin.setMin(newMin,min);
+ newMax.setMax(newMax,max);
}
if (!mDrawablep->isActive())
{
- LLVector3 offset = mDrawablep->getRegion()->getOriginAgent();
- newMin += offset;
- newMax += offset;
+ LLVector4a offset;
+ offset.load3(mDrawablep->getRegion()->getOriginAgent().mV);
+ newMin.add(offset);
+ newMax.add(offset);
}
- mCenterLocal = (newMin+newMax)*0.5f;
- LLVector3 tmp = (newMin - newMax) ;
- mBoundingSphereRadius = tmp.length() * 0.5f ;
+ t.setAdd(newMin, newMax);
+ t.mul(0.5f);
+
+ //VECTORIZE THIS
+ mCenterLocal.set(t.getF32ptr());
+
+ t.setSub(newMax,newMin);
+ mBoundingSphereRadius = t.getLength3().getF32()*0.5f;
updateCenterAgent();
}
@@ -703,18 +816,26 @@ LLVector2 LLFace::surfaceToTexture(LLVector2 surface_coord, LLVector3 position,
return surface_coord;
}
+ //VECTORIZE THIS
// see if we have a non-default mapping
U8 texgen = getTextureEntry()->getTexGen();
if (texgen != LLTextureEntry::TEX_GEN_DEFAULT)
{
- LLVector3 center = mDrawablep->getVOVolume()->getVolume()->getVolumeFace(mTEOffset).mCenter;
+ LLVector4a& center = *(mDrawablep->getVOVolume()->getVolume()->getVolumeFace(mTEOffset).mCenter);
+
+ LLVector4a volume_position;
+ volume_position.load3(mDrawablep->getVOVolume()->agentPositionToVolume(position).mV);
- LLVector3 scale = (mDrawablep->getVOVolume()->isVolumeGlobal()) ? LLVector3(1,1,1) : mVObjp->getScale();
- LLVector3 volume_position = mDrawablep->getVOVolume()->agentPositionToVolume(position);
- volume_position.scaleVec(scale);
+ if (!mDrawablep->getVOVolume()->isVolumeGlobal())
+ {
+ LLVector4a scale;
+ scale.load3(mVObjp->getScale().mV);
+ volume_position.mul(scale);
+ }
- LLVector3 volume_normal = mDrawablep->getVOVolume()->agentDirectionToVolume(normal);
- volume_normal.normalize();
+ LLVector4a volume_normal;
+ volume_normal.load3(mDrawablep->getVOVolume()->agentDirectionToVolume(normal).mV);
+ volume_normal.normalize3fast();
switch (texgen)
{
@@ -755,10 +876,10 @@ void LLFace::getPlanarProjectedParams(LLQuaternion* face_rot, LLVector3* face_po
{
const LLMatrix4& vol_mat = getWorldMatrix();
const LLVolumeFace& vf = getViewerObject()->getVolume()->getVolumeFace(mTEOffset);
- LLVector3 normal = vf.mVertices[0].mNormal;
- LLVector3 binormal = vf.mVertices[0].mBinormal;
+ const LLVector4a& normal4a = vf.mNormals[0];
+ const LLVector4a& binormal4a = vf.mBinormals[0];
LLVector2 projected_binormal;
- planarProjection(projected_binormal, normal, vf.mCenter, binormal);
+ planarProjection(projected_binormal, normal4a, *vf.mCenter, binormal4a);
projected_binormal -= LLVector2(0.5f, 0.5f); // this normally happens in xform()
*scale = projected_binormal.length();
// rotate binormal to match what planarProjection() thinks it is,
@@ -766,6 +887,10 @@ void LLFace::getPlanarProjectedParams(LLQuaternion* face_rot, LLVector3* face_po
projected_binormal.normalize();
F32 ang = acos(projected_binormal.mV[VY]);
ang = (projected_binormal.mV[VX] < 0.f) ? -ang : ang;
+
+ //VECTORIZE THIS
+ LLVector3 binormal(binormal4a.getF32ptr());
+ LLVector3 normal(normal4a.getF32ptr());
binormal.rotVec(ang, normal);
LLQuaternion local_rot( binormal % normal, binormal, normal );
*face_rot = local_rot * vol_mat.quaternion();
@@ -848,20 +973,35 @@ void LLFace::updateRebuildFlags()
bool LLFace::canRenderAsMask()
{
+ if (LLPipeline::sNoAlpha)
+ {
+ return true;
+ }
+
const LLTextureEntry* te = getTextureEntry();
- return (
- (
- (LLPipeline::sRenderDeferred && LLPipeline::sAutoMaskAlphaDeferred) ||
-
- (!LLPipeline::sRenderDeferred && LLPipeline::sAutoMaskAlphaNonDeferred)
- ) // do we want masks at all?
- &&
- (te->getColor().mV[3] == 1.0f) && // can't treat as mask if we have face alpha
- !(LLPipeline::sRenderDeferred && te->getFullbright()) && // hack: alpha masking renders fullbright faces invisible in deferred rendering mode, need to figure out why - for now, avoid
+
+ if ((te->getColor().mV[3] == 1.0f) && // can't treat as mask if we have face alpha
(te->getGlow() == 0.f) && // glowing masks are hard to implement - don't mask
+ getTexture()->getIsAlphaMask()) // texture actually qualifies for masking (lazily recalculated but expensive)
+ {
+ if (LLPipeline::sRenderDeferred)
+ {
+ if (getViewerObject()->isHUDAttachment() || te->getFullbright())
+ { //hud attachments and fullbright objects are NOT subject to the deferred rendering pipe
+ return LLPipeline::sAutoMaskAlphaNonDeferred;
+ }
+ else
+ {
+ return LLPipeline::sAutoMaskAlphaDeferred;
+ }
+ }
+ else
+ {
+ return LLPipeline::sAutoMaskAlphaNonDeferred;
+ }
+ }
- getTexture()->getIsAlphaMask() // texture actually qualifies for masking (lazily recalculated but expensive)
- );
+ return false;
}
@@ -869,13 +1009,15 @@ static LLFastTimer::DeclareTimer FTM_FACE_GET_GEOM("Face Geom");
BOOL LLFace::getGeometryVolume(const LLVolume& volume,
const S32 &f,
- const LLMatrix4& mat_vert, const LLMatrix3& mat_normal,
- const U16 &index_offset)
+ const LLMatrix4& mat_vert_in, const LLMatrix3& mat_norm_in,
+ const U16 &index_offset,
+ bool force_rebuild)
{
LLFastTimer t(FTM_FACE_GET_GEOM);
+ llassert(verify());
const LLVolumeFace &vf = volume.getVolumeFace(f);
- S32 num_vertices = (S32)vf.mVertices.size();
- S32 num_indices = LLPipeline::sUseTriStrips ? (S32)vf.mTriStrip.size() : (S32) vf.mIndices.size();
+ S32 num_vertices = (S32)vf.mNumVertices;
+ S32 num_indices = (S32) vf.mNumIndices;
if (mVertexBuffer.notNull())
{
@@ -900,15 +1042,20 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
}
}
- LLStrider<LLVector3> vertices;
+ LLStrider<LLVector3> vert;
+ LLVector4a* vertices = NULL;
LLStrider<LLVector2> tex_coords;
LLStrider<LLVector2> tex_coords2;
- LLStrider<LLVector3> normals;
+ LLVector4a* normals = NULL;
+ LLStrider<LLVector3> norm;
LLStrider<LLColor4U> colors;
- LLStrider<LLVector3> binormals;
+ LLVector4a* binormals = NULL;
+ LLStrider<LLVector3> binorm;
LLStrider<U16> indicesp;
+ LLVector4a* weights = NULL;
+ LLStrider<LLVector4> wght;
- BOOL full_rebuild = mDrawablep->isState(LLDrawable::REBUILD_VOLUME);
+ BOOL full_rebuild = force_rebuild || mDrawablep->isState(LLDrawable::REBUILD_VOLUME);
BOOL global_volume = mDrawablep->getVOVolume()->isVolumeGlobal();
LLVector3 scale;
@@ -921,28 +1068,37 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
scale = mVObjp->getScale();
}
- BOOL rebuild_pos = full_rebuild || mDrawablep->isState(LLDrawable::REBUILD_POSITION);
- BOOL rebuild_color = full_rebuild || mDrawablep->isState(LLDrawable::REBUILD_COLOR);
- BOOL rebuild_tcoord = full_rebuild || mDrawablep->isState(LLDrawable::REBUILD_TCOORD);
- BOOL rebuild_normal = rebuild_pos && mVertexBuffer->hasDataType(LLVertexBuffer::TYPE_NORMAL);
- BOOL rebuild_binormal = rebuild_pos && mVertexBuffer->hasDataType(LLVertexBuffer::TYPE_BINORMAL);
+ bool rebuild_pos = full_rebuild || mDrawablep->isState(LLDrawable::REBUILD_POSITION);
+ bool rebuild_color = full_rebuild || mDrawablep->isState(LLDrawable::REBUILD_COLOR);
+ bool rebuild_tcoord = full_rebuild || mDrawablep->isState(LLDrawable::REBUILD_TCOORD);
+ bool rebuild_normal = rebuild_pos && mVertexBuffer->hasDataType(LLVertexBuffer::TYPE_NORMAL);
+ bool rebuild_binormal = rebuild_pos && mVertexBuffer->hasDataType(LLVertexBuffer::TYPE_BINORMAL);
+ bool rebuild_weights = rebuild_pos && mVertexBuffer->hasDataType(LLVertexBuffer::TYPE_WEIGHT4);
const LLTextureEntry *tep = mVObjp->getTE(f);
- U8 bump_code = tep ? tep->getBumpmap() : 0;
+ const U8 bump_code = tep ? tep->getBumpmap() : 0;
if (rebuild_pos)
{
- mVertexBuffer->getVertexStrider(vertices, mGeomIndex);
+ mVertexBuffer->getVertexStrider(vert, mGeomIndex);
+ vertices = (LLVector4a*) vert.get();
}
if (rebuild_normal)
{
- mVertexBuffer->getNormalStrider(normals, mGeomIndex);
+ mVertexBuffer->getNormalStrider(norm, mGeomIndex);
+ normals = (LLVector4a*) norm.get();
}
if (rebuild_binormal)
{
- mVertexBuffer->getBinormalStrider(binormals, mGeomIndex);
+ 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 ;
@@ -974,8 +1130,6 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
mVertexBuffer->getColorStrider(colors, mGeomIndex);
}
- F32 r = 0, os = 0, ot = 0, ms = 0, mt = 0, cos_ang = 0, sin_ang = 0;
-
BOOL is_static = mDrawablep->isStatic();
BOOL is_global = is_static;
@@ -990,59 +1144,6 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
clearState(GLOBAL);
}
- LLVector2 tmin, tmax;
-
-
-
- if (rebuild_tcoord)
- {
- if (tep)
- {
- r = tep->getRotation();
- os = tep->mOffsetS;
- ot = tep->mOffsetT;
- ms = tep->mScaleS;
- mt = tep->mScaleT;
- cos_ang = cos(r);
- sin_ang = sin(r);
- }
- else
- {
- cos_ang = 1.0f;
- sin_ang = 0.0f;
- os = 0.0f;
- ot = 0.0f;
- ms = 1.0f;
- mt = 1.0f;
- }
- }
-
- U8 tex_mode = 0;
-
- if (isState(TEXTURE_ANIM))
- {
- LLVOVolume* vobj = (LLVOVolume*) (LLViewerObject*) mVObjp;
- tex_mode = vobj->mTexAnimMode;
-
- if (!tex_mode)
- {
- clearState(TEXTURE_ANIM);
- }
- else
- {
- os = ot = 0.f;
- r = 0.f;
- cos_ang = 1.f;
- sin_ang = 0.f;
- ms = mt = 1.f;
- }
-
- if (getVirtualSize() >= MIN_TEX_ANIM_SIZE)
- { //don't override texture transform during tc bake
- tex_mode = 0;
- }
- }
-
LLColor4U color = tep->getColor();
if (rebuild_color)
@@ -1064,265 +1165,469 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
}
}
- // INDICES
+ // INDICES
if (full_rebuild)
{
mVertexBuffer->getIndexStrider(indicesp, mIndicesIndex);
- if (LLPipeline::sUseTriStrips)
+ __m128i* dst = (__m128i*) indicesp.get();
+ __m128i* src = (__m128i*) vf.mIndices;
+ __m128i offset = _mm_set1_epi16(index_offset);
+
+ S32 end = num_indices/8;
+
+ for (S32 i = 0; i < end; i++)
{
- for (U32 i = 0; i < (U32) num_indices; i++)
- {
- *indicesp++ = vf.mTriStrip[i] + index_offset;
- }
+ __m128i res = _mm_add_epi16(src[i], offset);
+ _mm_storeu_si128(dst+i, res);
}
- else
+
+ for (S32 i = end*8; i < num_indices; ++i)
{
- for (U32 i = 0; i < (U32) num_indices; i++)
- {
- *indicesp++ = vf.mIndices[i] + index_offset;
- }
+ indicesp[i] = vf.mIndices[i]+index_offset;
}
}
+ LLMatrix4a mat_normal;
+ mat_normal.loadu(mat_norm_in);
- //bump setup
- LLVector3 binormal_dir( -sin_ang, cos_ang, 0 );
- LLVector3 bump_s_primary_light_ray;
- LLVector3 bump_t_primary_light_ray;
+ //if it's not fullbright and has no normals, bake sunlight based on face normal
+ //bool bake_sunlight = !getTextureEntry()->getFullbright() &&
+ // !mVertexBuffer->hasDataType(LLVertexBuffer::TYPE_NORMAL);
- LLQuaternion bump_quat;
- if (mDrawablep->isActive())
- {
- bump_quat = LLQuaternion(mDrawablep->getRenderMatrix());
- }
-
- if (bump_code)
+ F32 r = 0, os = 0, ot = 0, ms = 0, mt = 0, cos_ang = 0, sin_ang = 0;
+
+ if (rebuild_tcoord)
{
- mVObjp->getVolume()->genBinormals(f);
- F32 offset_multiple;
- switch( bump_code )
+ bool do_xform;
+
+ if (tep)
{
- case BE_NO_BUMP:
- offset_multiple = 0.f;
- break;
- case BE_BRIGHTNESS:
- case BE_DARKNESS:
- if( mTexture.notNull() && mTexture->hasGLTexture())
+ r = tep->getRotation();
+ os = tep->mOffsetS;
+ ot = tep->mOffsetT;
+ ms = tep->mScaleS;
+ mt = tep->mScaleT;
+ cos_ang = cos(r);
+ sin_ang = sin(r);
+
+ if (cos_ang != 1.f ||
+ sin_ang != 0.f ||
+ os != 0.f ||
+ ot != 0.f ||
+ ms != 1.f ||
+ mt != 1.f)
{
- // Offset by approximately one texel
- S32 cur_discard = mTexture->getDiscardLevel();
- S32 max_size = llmax( mTexture->getWidth(), mTexture->getHeight() );
- max_size <<= cur_discard;
- const F32 ARTIFICIAL_OFFSET = 2.f;
- offset_multiple = ARTIFICIAL_OFFSET / (F32)max_size;
+ do_xform = true;
}
else
{
- offset_multiple = 1.f/256;
- }
- break;
-
- default: // Standard bumpmap textures. Assumed to be 256x256
- offset_multiple = 1.f / 256;
- break;
+ do_xform = false;
+ }
}
-
- F32 s_scale = 1.f;
- F32 t_scale = 1.f;
- if( tep )
+ else
{
- tep->getScale( &s_scale, &t_scale );
+ do_xform = false;
}
- // Use the nudged south when coming from above sun angle, such
- // that emboss mapping always shows up on the upward faces of cubes when
- // it's noon (since a lot of builders build with the sun forced to noon).
- LLVector3 sun_ray = gSky.mVOSkyp->mBumpSunDir;
- LLVector3 moon_ray = gSky.getMoonDirection();
- LLVector3& primary_light_ray = (sun_ray.mV[VZ] > 0) ? sun_ray : moon_ray;
+
+ //bump setup
+ LLVector4a binormal_dir( -sin_ang, cos_ang, 0.f );
+ LLVector4a bump_s_primary_light_ray(0.f, 0.f, 0.f);
+ LLVector4a bump_t_primary_light_ray(0.f, 0.f, 0.f);
- bump_s_primary_light_ray = offset_multiple * s_scale * primary_light_ray;
- bump_t_primary_light_ray = offset_multiple * t_scale * primary_light_ray;
- }
+ LLQuaternion bump_quat;
+ if (mDrawablep->isActive())
+ {
+ bump_quat = LLQuaternion(mDrawablep->getRenderMatrix());
+ }
- U8 texgen = getTextureEntry()->getTexGen();
- if (rebuild_tcoord && texgen != LLTextureEntry::TEX_GEN_DEFAULT)
- { //planar texgen needs binormals
- mVObjp->getVolume()->genBinormals(f);
- }
-
- for (S32 i = 0; i < num_vertices; i++)
- {
- if (rebuild_tcoord)
+ if (bump_code)
{
- LLVector2 tc = vf.mVertices[i].mTexCoord;
-
- if (texgen != LLTextureEntry::TEX_GEN_DEFAULT)
+ mVObjp->getVolume()->genBinormals(f);
+ F32 offset_multiple;
+ switch( bump_code )
{
- LLVector3 vec = vf.mVertices[i].mPosition;
-
- vec.scaleVec(scale);
-
- switch (texgen)
+ case BE_NO_BUMP:
+ offset_multiple = 0.f;
+ break;
+ case BE_BRIGHTNESS:
+ case BE_DARKNESS:
+ if( mTexture.notNull() && mTexture->hasGLTexture())
{
- case LLTextureEntry::TEX_GEN_PLANAR:
- planarProjection(tc, vf.mVertices[i].mNormal, vf.mCenter, vec);
- break;
- case LLTextureEntry::TEX_GEN_SPHERICAL:
- sphericalProjection(tc, vf.mVertices[i].mNormal, vf.mCenter, vec);
- break;
- case LLTextureEntry::TEX_GEN_CYLINDRICAL:
- cylindricalProjection(tc, vf.mVertices[i].mNormal, vf.mCenter, vec);
- break;
- default:
- break;
- }
+ // Offset by approximately one texel
+ S32 cur_discard = mTexture->getDiscardLevel();
+ S32 max_size = llmax( mTexture->getWidth(), mTexture->getHeight() );
+ max_size <<= cur_discard;
+ const F32 ARTIFICIAL_OFFSET = 2.f;
+ offset_multiple = ARTIFICIAL_OFFSET / (F32)max_size;
+ }
+ else
+ {
+ offset_multiple = 1.f/256;
+ }
+ break;
+
+ default: // Standard bumpmap textures. Assumed to be 256x256
+ offset_multiple = 1.f / 256;
+ break;
}
- if (tex_mode && mTextureMatrix)
+ F32 s_scale = 1.f;
+ F32 t_scale = 1.f;
+ if( tep )
{
- LLVector3 tmp(tc.mV[0], tc.mV[1], 0.f);
- tmp = tmp * *mTextureMatrix;
- tc.mV[0] = tmp.mV[0];
- tc.mV[1] = tmp.mV[1];
+ tep->getScale( &s_scale, &t_scale );
+ }
+ // Use the nudged south when coming from above sun angle, such
+ // that emboss mapping always shows up on the upward faces of cubes when
+ // it's noon (since a lot of builders build with the sun forced to noon).
+ LLVector3 sun_ray = gSky.mVOSkyp->mBumpSunDir;
+ LLVector3 moon_ray = gSky.getMoonDirection();
+ LLVector3& primary_light_ray = (sun_ray.mV[VZ] > 0) ? sun_ray : moon_ray;
+
+ bump_s_primary_light_ray.load3((offset_multiple * s_scale * primary_light_ray).mV);
+ bump_t_primary_light_ray.load3((offset_multiple * t_scale * primary_light_ray).mV);
+ }
+
+ U8 texgen = getTextureEntry()->getTexGen();
+ if (rebuild_tcoord && texgen != LLTextureEntry::TEX_GEN_DEFAULT)
+ { //planar texgen needs binormals
+ mVObjp->getVolume()->genBinormals(f);
+ }
+
+ U8 tex_mode = 0;
+
+ if (isState(TEXTURE_ANIM))
+ {
+ LLVOVolume* vobj = (LLVOVolume*) (LLViewerObject*) mVObjp;
+ tex_mode = vobj->mTexAnimMode;
+
+ if (!tex_mode)
+ {
+ clearState(TEXTURE_ANIM);
}
else
{
- xform(tc, cos_ang, sin_ang, os, ot, ms, mt);
+ os = ot = 0.f;
+ r = 0.f;
+ cos_ang = 1.f;
+ sin_ang = 0.f;
+ ms = mt = 1.f;
+
+ do_xform = false;
}
- if(in_atlas)
- {
- //
- //manually calculate tex-coord per vertex for varying address modes.
- //should be removed if shader can handle this.
- //
+ if (getVirtualSize() >= MIN_TEX_ANIM_SIZE)
+ { //don't override texture transform during tc bake
+ tex_mode = 0;
+ }
+ }
- S32 int_part = 0 ;
- switch(mTexture->getAddressMode())
- {
- case LLTexUnit::TAM_CLAMP:
- if(tc.mV[0] < 0.f)
- {
- tc.mV[0] = 0.f ;
- }
- else if(tc.mV[0] > 1.f)
- {
- tc.mV[0] = 1.f;
- }
+ LLVector4a scalea;
+ scalea.load3(scale.mV);
- if(tc.mV[1] < 0.f)
- {
- tc.mV[1] = 0.f ;
- }
- else if(tc.mV[1] > 1.f)
- {
- tc.mV[1] = 1.f;
- }
- break;
- case LLTexUnit::TAM_MIRROR:
- if(tc.mV[0] < 0.f)
- {
- tc.mV[0] = -tc.mV[0] ;
- }
- int_part = (S32)tc.mV[0] ;
- if(int_part & 1) //odd number
- {
- tc.mV[0] = int_part + 1 - tc.mV[0] ;
- }
- else //even number
- {
- tc.mV[0] -= int_part ;
- }
+ bool do_bump = bump_code && mVertexBuffer->hasDataType(LLVertexBuffer::TYPE_TEXCOORD1);
+ bool do_tex_mat = tex_mode && mTextureMatrix;
- if(tc.mV[1] < 0.f)
+ if (!in_atlas && !do_bump)
+ { //not in atlas or not bump mapped, might be able to do a cheap update
+ if (texgen != LLTextureEntry::TEX_GEN_PLANAR)
+ {
+ if (!do_tex_mat)
+ {
+ if (!do_xform)
{
- tc.mV[1] = -tc.mV[1] ;
+ LLVector4a::memcpyNonAliased16((F32*) tex_coords.get(), (F32*) vf.mTexCoords, num_vertices*2*sizeof(F32));
}
- int_part = (S32)tc.mV[1] ;
- if(int_part & 1) //odd number
+ else
{
- tc.mV[1] = int_part + 1 - tc.mV[1] ;
+ for (S32 i = 0; i < num_vertices; i++)
+ {
+ LLVector2 tc(vf.mTexCoords[i]);
+ xform(tc, cos_ang, sin_ang, os, ot, ms, mt);
+ *tex_coords++ = tc;
+ }
}
- else //even number
- {
- tc.mV[1] -= int_part ;
+ }
+ else
+ { //do tex mat, no texgen, no atlas, no bump
+ for (S32 i = 0; i < num_vertices; i++)
+ {
+ LLVector2 tc(vf.mTexCoords[i]);
+ //LLVector4a& norm = vf.mNormals[i];
+ //LLVector4a& center = *(vf.mCenter);
+
+ LLVector3 tmp(tc.mV[0], tc.mV[1], 0.f);
+ tmp = tmp * *mTextureMatrix;
+ tc.mV[0] = tmp.mV[0];
+ tc.mV[1] = tmp.mV[1];
+ *tex_coords++ = tc;
}
- break;
- case LLTexUnit::TAM_WRAP:
- if(tc.mV[0] > 1.f)
- tc.mV[0] -= (S32)(tc.mV[0] - 0.00001f) ;
- else if(tc.mV[0] < -1.f)
- tc.mV[0] -= (S32)(tc.mV[0] + 0.00001f) ;
-
- if(tc.mV[1] > 1.f)
- tc.mV[1] -= (S32)(tc.mV[1] - 0.00001f) ;
- else if(tc.mV[1] < -1.f)
- tc.mV[1] -= (S32)(tc.mV[1] + 0.00001f) ;
-
- if(tc.mV[0] < 0.f)
- {
- tc.mV[0] = 1.0f + tc.mV[0] ;
+ }
+ }
+ else
+ { //no bump, no atlas, tex gen planar
+ if (do_tex_mat)
+ {
+ for (S32 i = 0; i < num_vertices; i++)
+ {
+ LLVector2 tc(vf.mTexCoords[i]);
+ LLVector4a& norm = vf.mNormals[i];
+ LLVector4a& center = *(vf.mCenter);
+ LLVector4a vec = vf.mPositions[i];
+ vec.mul(scalea);
+ planarProjection(tc, norm, center, vec);
+
+ LLVector3 tmp(tc.mV[0], tc.mV[1], 0.f);
+ tmp = tmp * *mTextureMatrix;
+ tc.mV[0] = tmp.mV[0];
+ tc.mV[1] = tmp.mV[1];
+
+ *tex_coords++ = tc;
}
- if(tc.mV[1] < 0.f)
- {
- tc.mV[1] = 1.0f + tc.mV[1] ;
+ }
+ else
+ {
+ for (S32 i = 0; i < num_vertices; i++)
+ {
+ LLVector2 tc(vf.mTexCoords[i]);
+ LLVector4a& norm = vf.mNormals[i];
+ LLVector4a& center = *(vf.mCenter);
+ LLVector4a vec = vf.mPositions[i];
+ vec.mul(scalea);
+ planarProjection(tc, norm, center, vec);
+
+ xform(tc, cos_ang, sin_ang, os, ot, ms, mt);
+
+ *tex_coords++ = tc;
}
- break;
- default:
- break;
}
-
- tc.mV[0] = tcoord_xoffset + tcoord_xscale * tc.mV[0] ;
- tc.mV[1] = tcoord_yoffset + tcoord_yscale * tc.mV[1] ;
}
+ }
+ else
+ { //either bump mapped or in atlas, just do the whole expensive loop
+ for (S32 i = 0; i < num_vertices; i++)
+ {
+ LLVector2 tc(vf.mTexCoords[i]);
+ LLVector4a& norm = vf.mNormals[i];
+
+ LLVector4a& center = *(vf.mCenter);
+
+ if (texgen != LLTextureEntry::TEX_GEN_DEFAULT)
+ {
+ LLVector4a vec = vf.mPositions[i];
+
+ vec.mul(scalea);
- *tex_coords++ = tc;
-
- if (bump_code && mVertexBuffer->hasDataType(LLVertexBuffer::TYPE_TEXCOORD1))
- {
- LLVector3 tangent = vf.mVertices[i].mBinormal % vf.mVertices[i].mNormal;
+ switch (texgen)
+ {
+ case LLTextureEntry::TEX_GEN_PLANAR:
+ planarProjection(tc, norm, center, vec);
+ break;
+ case LLTextureEntry::TEX_GEN_SPHERICAL:
+ sphericalProjection(tc, norm, center, vec);
+ break;
+ case LLTextureEntry::TEX_GEN_CYLINDRICAL:
+ cylindricalProjection(tc, norm, center, vec);
+ break;
+ default:
+ break;
+ }
+ }
- LLMatrix3 tangent_to_object;
- tangent_to_object.setRows(tangent, vf.mVertices[i].mBinormal, vf.mVertices[i].mNormal);
- LLVector3 binormal = binormal_dir * tangent_to_object;
- binormal = binormal * mat_normal;
-
- if (mDrawablep->isActive())
+ if (tex_mode && mTextureMatrix)
{
- binormal *= bump_quat;
+ LLVector3 tmp(tc.mV[0], tc.mV[1], 0.f);
+ tmp = tmp * *mTextureMatrix;
+ tc.mV[0] = tmp.mV[0];
+ tc.mV[1] = tmp.mV[1];
}
+ else
+ {
+ xform(tc, cos_ang, sin_ang, os, ot, ms, mt);
+ }
+
+ if(in_atlas)
+ {
+ //
+ //manually calculate tex-coord per vertex for varying address modes.
+ //should be removed if shader can handle this.
+ //
- binormal.normVec();
- tc += LLVector2( bump_s_primary_light_ray * tangent, bump_t_primary_light_ray * binormal );
+ S32 int_part = 0 ;
+ switch(mTexture->getAddressMode())
+ {
+ case LLTexUnit::TAM_CLAMP:
+ if(tc.mV[0] < 0.f)
+ {
+ tc.mV[0] = 0.f ;
+ }
+ else if(tc.mV[0] > 1.f)
+ {
+ tc.mV[0] = 1.f;
+ }
+
+ if(tc.mV[1] < 0.f)
+ {
+ tc.mV[1] = 0.f ;
+ }
+ else if(tc.mV[1] > 1.f)
+ {
+ tc.mV[1] = 1.f;
+ }
+ break;
+ case LLTexUnit::TAM_MIRROR:
+ if(tc.mV[0] < 0.f)
+ {
+ tc.mV[0] = -tc.mV[0] ;
+ }
+ int_part = (S32)tc.mV[0] ;
+ if(int_part & 1) //odd number
+ {
+ tc.mV[0] = int_part + 1 - tc.mV[0] ;
+ }
+ else //even number
+ {
+ tc.mV[0] -= int_part ;
+ }
+
+ if(tc.mV[1] < 0.f)
+ {
+ tc.mV[1] = -tc.mV[1] ;
+ }
+ int_part = (S32)tc.mV[1] ;
+ if(int_part & 1) //odd number
+ {
+ tc.mV[1] = int_part + 1 - tc.mV[1] ;
+ }
+ else //even number
+ {
+ tc.mV[1] -= int_part ;
+ }
+ break;
+ case LLTexUnit::TAM_WRAP:
+ if(tc.mV[0] > 1.f)
+ tc.mV[0] -= (S32)(tc.mV[0] - 0.00001f) ;
+ else if(tc.mV[0] < -1.f)
+ tc.mV[0] -= (S32)(tc.mV[0] + 0.00001f) ;
+
+ if(tc.mV[1] > 1.f)
+ tc.mV[1] -= (S32)(tc.mV[1] - 0.00001f) ;
+ else if(tc.mV[1] < -1.f)
+ tc.mV[1] -= (S32)(tc.mV[1] + 0.00001f) ;
+
+ if(tc.mV[0] < 0.f)
+ {
+ tc.mV[0] = 1.0f + tc.mV[0] ;
+ }
+ if(tc.mV[1] < 0.f)
+ {
+ tc.mV[1] = 1.0f + tc.mV[1] ;
+ }
+ break;
+ default:
+ break;
+ }
- *tex_coords2++ = tc;
- }
+ tc.mV[0] = tcoord_xoffset + tcoord_xscale * tc.mV[0] ;
+ tc.mV[1] = tcoord_yoffset + tcoord_yscale * tc.mV[1] ;
+ }
+
+
+ *tex_coords++ = tc;
+
+ if (bump_code && mVertexBuffer->hasDataType(LLVertexBuffer::TYPE_TEXCOORD1))
+ {
+ LLVector4a tangent;
+ tangent.setCross3(vf.mBinormals[i], vf.mNormals[i]);
+
+ LLMatrix4a tangent_to_object;
+ tangent_to_object.setRows(tangent, vf.mBinormals[i], vf.mNormals[i]);
+ LLVector4a t;
+ tangent_to_object.rotate(binormal_dir, t);
+ LLVector4a binormal;
+ mat_normal.rotate(t, binormal);
+
+ //VECTORIZE THIS
+ if (mDrawablep->isActive())
+ {
+ LLVector3 t;
+ t.set(binormal.getF32ptr());
+ t *= bump_quat;
+ binormal.load3(t.mV);
+ }
+
+ binormal.normalize3fast();
+ tc += LLVector2( bump_s_primary_light_ray.dot3(tangent).getF32(), bump_t_primary_light_ray.dot3(binormal).getF32() );
+
+ *tex_coords2++ = tc;
+ }
+ }
}
-
- if (rebuild_pos)
- {
- *vertices++ = vf.mVertices[i].mPosition * mat_vert;
+ }
+
+ if (rebuild_pos)
+ {
+ LLMatrix4a mat_vert;
+ mat_vert.loadu(mat_vert_in);
+
+ LLVector4a* src = vf.mPositions;
+ LLVector4a* dst = vertices;
+
+ LLVector4a* end = dst+num_vertices;
+ do
+ {
+ mat_vert.affineTransform(*src++, *dst++);
}
+ while(dst < end);
+ }
- if (rebuild_normal)
- {
- LLVector3 normal = vf.mVertices[i].mNormal * mat_normal;
- normal.normVec();
-
- *normals++ = normal;
+ if (rebuild_normal)
+ {
+ for (S32 i = 0; i < num_vertices; i++)
+ {
+ LLVector4a normal;
+ mat_normal.rotate(vf.mNormals[i], normal);
+ normal.normalize3fast();
+ normals[i] = normal;
}
+ }
- if (rebuild_binormal)
- {
- LLVector3 binormal = vf.mVertices[i].mBinormal * mat_normal;
- binormal.normVec();
- *binormals++ = binormal;
+ if (rebuild_binormal)
+ {
+ for (S32 i = 0; i < num_vertices; i++)
+ {
+ LLVector4a binormal;
+ mat_normal.rotate(vf.mBinormals[i], binormal);
+ binormal.normalize3fast();
+ binormals[i] = binormal;
}
+ }
+
+ if (rebuild_weights && vf.mWeights)
+ {
+ LLVector4a::memcpyNonAliased16((F32*) weights, (F32*) vf.mWeights, num_vertices*4*sizeof(F32));
+ }
+
+ if (rebuild_color)
+ {
+ LLVector4a src;
+
+ U32 vec[4];
+ vec[0] = vec[1] = vec[2] = vec[3] = color.mAll;
- if (rebuild_color)
+ src.loadua((F32*) vec);
+
+ LLVector4a* dst = (LLVector4a*) colors.get();
+ S32 num_vecs = num_vertices/4;
+ if (num_vertices%4 > 0)
{
- *colors++ = color;
+ ++num_vecs;
+ }
+
+ for (S32 i = 0; i < num_vecs; i++)
+ {
+ dst[i] = src;
}
}
@@ -1418,20 +1723,32 @@ F32 LLFace::getTextureVirtualSize()
BOOL LLFace::calcPixelArea(F32& cos_angle_to_view_dir, F32& radius)
{
+ //VECTORIZE THIS
//get area of circle around face
- LLVector3 center = getPositionAgent();
- LLVector3 size = (mExtents[1] - mExtents[0]) * 0.5f;
+ LLVector4a center;
+ center.load3(getPositionAgent().mV);
+ LLVector4a size;
+ size.setSub(mExtents[1], mExtents[0]);
+ size.mul(0.5f);
+
LLViewerCamera* camera = LLViewerCamera::getInstance();
- F32 size_squared = size.lengthSquared() ;
- LLVector3 lookAt = center - camera->getOrigin();
- F32 dist = lookAt.normVec() ;
+ F32 size_squared = size.dot3(size).getF32();
+ LLVector4a lookAt;
+ LLVector4a t;
+ t.load3(camera->getOrigin().mV);
+ lookAt.setSub(center, t);
+ F32 dist = lookAt.getLength3().getF32();
+ dist = llmax(dist-size.getLength3().getF32(), 0.f);
+ lookAt.normalize3fast() ;
//get area of circle around node
- F32 app_angle = atanf(fsqrtf(size_squared) / dist);
+ F32 app_angle = atanf((F32) sqrt(size_squared) / dist);
radius = app_angle*LLDrawable::sCurPixelAngle;
mPixelArea = radius*radius * 3.14159f;
- cos_angle_to_view_dir = lookAt * camera->getXAxis() ;
+ LLVector4a x_axis;
+ x_axis.load3(camera->getXAxis().mV);
+ cos_angle_to_view_dir = lookAt.dot3(x_axis).getF32();
//if has media, check if the face is out of the view frustum.
if(hasMedia())
@@ -1447,7 +1764,10 @@ BOOL LLFace::calcPixelArea(F32& cos_angle_to_view_dir, F32& radius)
}
else
{
- if(dist * dist * (lookAt - camera->getXAxis()).lengthSquared() < size_squared)
+ LLVector4a d;
+ d.setSub(lookAt, x_axis);
+
+ if(dist * dist * d.dot3(d) < size_squared)
{
cos_angle_to_view_dir = 1.0f ;
}
@@ -1562,24 +1882,15 @@ BOOL LLFace::verify(const U32* indices_array) const
BOOL ok = TRUE;
if( mVertexBuffer.isNull() )
- {
- if( mGeomCount )
- {
- // This happens before teleports as faces are torn down.
- // Stop the crash in DEV-31893 with a null pointer check,
- // but present this info.
- // To clean up the log, the geometry could be cleared, or the
- // face could otherwise be marked for no ::verify.
- llinfos << "Face with no vertex buffer and " << mGeomCount << " mGeomCount" << llendl;
- }
+ { //no vertex buffer, face is implicitly valid
return TRUE;
}
// First, check whether the face data fits within the pool's range.
- if ((mGeomIndex + mGeomCount) > mVertexBuffer->getNumVerts())
+ if ((mGeomIndex + mGeomCount) > mVertexBuffer->getRequestedVerts())
{
ok = FALSE;
- llinfos << "Face not within pool range!" << llendl;
+ llinfos << "Face references invalid vertices!" << llendl;
}
S32 indices_count = (S32)getIndicesCount();
@@ -1595,6 +1906,12 @@ BOOL LLFace::verify(const U32* indices_array) const
llinfos << "Face has bogus indices count" << llendl;
}
+ if (mIndicesIndex + mIndicesCount > mVertexBuffer->getRequestedIndices())
+ {
+ ok = FALSE;
+ llinfos << "Face references invalid indices!" << llendl;
+ }
+
#if 0
S32 geom_start = getGeomStart();
S32 geom_count = mGeomCount;
@@ -1903,3 +2220,78 @@ BOOL LLFace::switchTexture()
return mUsingAtlas ;
}
+
+void LLFace::setVertexBuffer(LLVertexBuffer* buffer)
+{
+ mVertexBuffer = buffer;
+ llassert(verify());
+}
+
+void LLFace::clearVertexBuffer()
+{
+ mVertexBuffer = NULL;
+ mLastVertexBuffer = NULL;
+}
+
+//static
+U32 LLFace::getRiggedDataMask(U32 type)
+{
+ static const U32 rigged_data_mask[] = {
+ LLDrawPoolAvatar::RIGGED_SIMPLE_MASK,
+ LLDrawPoolAvatar::RIGGED_FULLBRIGHT_MASK,
+ LLDrawPoolAvatar::RIGGED_SHINY_MASK,
+ LLDrawPoolAvatar::RIGGED_FULLBRIGHT_SHINY_MASK,
+ LLDrawPoolAvatar::RIGGED_GLOW_MASK,
+ LLDrawPoolAvatar::RIGGED_ALPHA_MASK,
+ LLDrawPoolAvatar::RIGGED_FULLBRIGHT_ALPHA_MASK,
+ LLDrawPoolAvatar::RIGGED_DEFERRED_BUMP_MASK,
+ LLDrawPoolAvatar::RIGGED_DEFERRED_SIMPLE_MASK,
+ };
+
+ llassert(type < sizeof(rigged_data_mask)/sizeof(U32));
+
+ return rigged_data_mask[type];
+}
+
+U32 LLFace::getRiggedVertexBufferDataMask() const
+{
+ U32 data_mask = 0;
+ for (U32 i = 0; i < mRiggedIndex.size(); ++i)
+ {
+ if (mRiggedIndex[i] > -1)
+ {
+ data_mask |= LLFace::getRiggedDataMask(i);
+ }
+ }
+
+ return data_mask;
+}
+
+S32 LLFace::getRiggedIndex(U32 type) const
+{
+ if (mRiggedIndex.empty())
+ {
+ return -1;
+ }
+
+ llassert(type < mRiggedIndex.size());
+
+ return mRiggedIndex[type];
+}
+
+void LLFace::setRiggedIndex(U32 type, S32 index)
+{
+ if (mRiggedIndex.empty())
+ {
+ mRiggedIndex.resize(LLDrawPoolAvatar::NUM_RIGGED_PASSES);
+ for (U32 i = 0; i < mRiggedIndex.size(); ++i)
+ {
+ mRiggedIndex[i] = -1;
+ }
+ }
+
+ llassert(type < mRiggedIndex.size());
+
+ mRiggedIndex[type] = index;
+}
+
diff --git a/indra/newview/llface.h b/indra/newview/llface.h
index 6c941bd092..b2170c4cf3 100644
--- a/indra/newview/llface.h
+++ b/indra/newview/llface.h
@@ -59,6 +59,17 @@ class LLFace
{
public:
+ LLFace(const LLFace& rhs)
+ {
+ *this = rhs;
+ }
+
+ const LLFace& operator=(const LLFace& rhs)
+ {
+ llerrs << "Illegal operation!" << llendl;
+ return *this;
+ }
+
enum EMasks
{
LIGHT = 0x0001,
@@ -67,6 +78,7 @@ public:
HUD_RENDER = 0x0008,
USE_FACE_COLOR = 0x0010,
TEXTURE_ANIM = 0x0020,
+ RIGGED = 0x0040,
};
static void initClass();
@@ -119,14 +131,14 @@ public:
LLDrawable* getDrawable() const { return mDrawablep; }
LLViewerObject* getViewerObject() const { return mVObjp; }
S32 getLOD() const { return mVObjp.notNull() ? mVObjp->getLOD() : 0; }
- LLVertexBuffer* getVertexBuffer() const { return mVertexBuffer; }
void setPoolType(U32 type) { mPoolType = type; }
S32 getTEOffset() { return mTEOffset; }
LLViewerTexture* getTexture() const;
void setViewerObject(LLViewerObject* object);
void setPool(LLFacePool *pool, LLViewerTexture *texturep);
-
+ void setPool(LLFacePool* pool);
+
void setDrawable(LLDrawable *drawable);
void setTEOffset(const S32 te_offset);
@@ -142,7 +154,8 @@ public:
BOOL getGeometryVolume(const LLVolume& volume,
const S32 &f,
const LLMatrix4& mat_vert, const LLMatrix3& mat_normal,
- const U16 &index_offset);
+ const U16 &index_offset,
+ bool force_rebuild = false);
// For avatar
U16 getGeometryAvatar(
@@ -161,7 +174,7 @@ public:
S32 getColors(LLStrider<LLColor4U> &colors);
S32 getIndices(LLStrider<U16> &indices);
- void setSize(const S32 numVertices, const S32 num_indices = 0);
+ void setSize(S32 numVertices, S32 num_indices = 0, bool align = false);
BOOL genVolumeBBoxes(const LLVolume &volume, S32 f,
const LLMatrix4& mat, const LLMatrix3& inv_trans_mat, BOOL global_volume = FALSE);
@@ -183,8 +196,8 @@ public:
BOOL verify(const U32* indices_array = NULL) const;
void printDebugInfo() const;
- void setGeomIndex(U16 idx) { mGeomIndex = idx; }
- void setIndicesIndex(S32 idx) { mIndicesIndex = idx; }
+ void setGeomIndex(U16 idx);
+ void setIndicesIndex(S32 idx);
void setDrawInfo(LLDrawInfo* draw_info);
F32 getTextureVirtualSize() ;
@@ -205,6 +218,19 @@ public:
void removeAtlas() ;
BOOL switchTexture() ;
+ //vertex buffer tracking
+ void setVertexBuffer(LLVertexBuffer* buffer);
+ void clearVertexBuffer(); //sets mVertexBuffer and mLastVertexBuffer to NULL
+ LLVertexBuffer* getVertexBuffer() const { return mVertexBuffer; }
+ U32 getRiggedVertexBufferDataMask() const;
+ S32 getRiggedIndex(U32 type) const;
+ void setRiggedIndex(U32 type, S32 index);
+
+ static U32 getRiggedDataMask(U32 type);
+
+public: //aligned members
+ LLVector4a mExtents[2];
+
private:
F32 adjustPartialOverlapPixelArea(F32 cos_angle_to_view_dir, F32 radius );
BOOL calcPixelArea(F32& cos_angle_to_view_dir, F32& radius) ;
@@ -216,20 +242,19 @@ public:
LLVector3 mCenterLocal;
LLVector3 mCenterAgent;
- LLVector3 mExtents[2];
+
LLVector2 mTexExtents[2];
F32 mDistance;
- LLPointer<LLVertexBuffer> mVertexBuffer;
- LLPointer<LLVertexBuffer> mLastVertexBuffer;
F32 mLastUpdateTime;
+ F32 mLastSkinTime;
F32 mLastMoveTime;
LLMatrix4* mTextureMatrix;
LLDrawInfo* mDrawInfo;
private:
- friend class LLGeometryManager;
- friend class LLVolumeGeometryManager;
-
+ LLPointer<LLVertexBuffer> mVertexBuffer;
+ LLPointer<LLVertexBuffer> mLastVertexBuffer;
+
U32 mState;
LLFacePool* mDrawPoolp;
U32 mPoolType;
@@ -254,6 +279,8 @@ private:
S32 mTEOffset;
S32 mReferenceIndex;
+ std::vector<S32> mRiggedIndex;
+
F32 mVSize;
F32 mPixelArea;
diff --git a/indra/newview/llfasttimerview.cpp b/indra/newview/llfasttimerview.cpp
index 279904b740..35712163eb 100644
--- a/indra/newview/llfasttimerview.cpp
+++ b/indra/newview/llfasttimerview.cpp
@@ -32,7 +32,9 @@
#include "llrect.h"
#include "llerror.h"
#include "llgl.h"
+#include "llimagepng.h"
#include "llrender.h"
+#include "llrendertarget.h"
#include "lllocalcliprect.h"
#include "llmath.h"
#include "llfontgl.h"
@@ -49,6 +51,8 @@
#include "llfasttimer.h"
#include "lltreeiterators.h"
#include "llmetricperformancetester.h"
+#include "llviewerstats.h"
+
//////////////////////////////////////////////////////////////////////////////
static const S32 MAX_VISIBLE_HISTORY = 10;
@@ -1020,6 +1024,327 @@ F64 LLFastTimerView::getTime(const std::string& name)
return 0.0;
}
+void saveChart(const std::string& label, const char* suffix, LLImageRaw* scratch)
+{
+ //read result back into raw image
+ glReadPixels(0, 0, 1024, 512, GL_RGB, GL_UNSIGNED_BYTE, scratch->getData());
+
+ //write results to disk
+ LLPointer<LLImagePNG> result = new LLImagePNG();
+ result->encode(scratch, 0.f);
+
+ std::string ext = result->getExtension();
+ std::string filename = llformat("%s_%s.%s", label.c_str(), suffix, ext.c_str());
+
+ std::string out_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, filename);
+ result->save(out_file);
+}
+
+//static
+void LLFastTimerView::exportCharts(const std::string& base, const std::string& target)
+{
+ //allocate render target for drawing charts
+ LLRenderTarget buffer;
+ buffer.allocate(1024,512, GL_RGB, FALSE, FALSE);
+
+
+ LLSD cur;
+
+ LLSD base_data;
+
+ { //read base log into memory
+ S32 i = 0;
+ std::ifstream is(base.c_str());
+ while (!is.eof() && LLSDSerialize::fromXML(cur, is))
+ {
+ base_data[i++] = cur;
+ }
+ is.close();
+ }
+
+ LLSD cur_data;
+ std::set<std::string> chart_names;
+
+ { //read current log into memory
+ S32 i = 0;
+ std::ifstream is(target.c_str());
+ while (!is.eof() && LLSDSerialize::fromXML(cur, is))
+ {
+ cur_data[i++] = cur;
+
+ for (LLSD::map_iterator iter = cur.beginMap(); iter != cur.endMap(); ++iter)
+ {
+ std::string label = iter->first;
+ chart_names.insert(label);
+ }
+ }
+ is.close();
+ }
+
+ //get time domain
+ LLSD::Real cur_total_time = 0.0;
+
+ for (U32 i = 0; i < cur_data.size(); ++i)
+ {
+ cur_total_time += cur_data[i]["Total"]["Time"].asReal();
+ }
+
+ LLSD::Real base_total_time = 0.0;
+ for (U32 i = 0; i < base_data.size(); ++i)
+ {
+ base_total_time += base_data[i]["Total"]["Time"].asReal();
+ }
+
+ //allocate raw scratch space
+ LLPointer<LLImageRaw> scratch = new LLImageRaw(1024, 512, 3);
+
+ gGL.pushMatrix();
+ glLoadIdentity();
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glOrtho(-0.05, 1.05, -0.05, 1.05, -1.0, 1.0);
+
+ //render charts
+ gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+
+ buffer.bindTarget();
+
+ for (std::set<std::string>::iterator iter = chart_names.begin(); iter != chart_names.end(); ++iter)
+ {
+ std::string label = *iter;
+
+ LLSD::Real max_time = 0.0;
+ LLSD::Integer max_calls = 0;
+ LLSD::Real max_execution = 0.0;
+
+ std::vector<LLSD::Real> cur_execution;
+ std::vector<LLSD::Real> cur_times;
+ std::vector<LLSD::Integer> cur_calls;
+
+ std::vector<LLSD::Real> base_execution;
+ std::vector<LLSD::Real> base_times;
+ std::vector<LLSD::Integer> base_calls;
+
+ for (U32 i = 0; i < cur_data.size(); ++i)
+ {
+ LLSD::Real time = cur_data[i][label]["Time"].asReal();
+ LLSD::Integer calls = cur_data[i][label]["Calls"].asInteger();
+
+ LLSD::Real execution = 0.0;
+ if (calls > 0)
+ {
+ execution = time/calls;
+ cur_execution.push_back(execution);
+ cur_times.push_back(time);
+ }
+
+ cur_calls.push_back(calls);
+ }
+
+ for (U32 i = 0; i < base_data.size(); ++i)
+ {
+ LLSD::Real time = base_data[i][label]["Time"].asReal();
+ LLSD::Integer calls = base_data[i][label]["Calls"].asInteger();
+
+ LLSD::Real execution = 0.0;
+ if (calls > 0)
+ {
+ execution = time/calls;
+ base_execution.push_back(execution);
+ base_times.push_back(time);
+ }
+
+ base_calls.push_back(calls);
+ }
+
+ std::sort(base_calls.begin(), base_calls.end());
+ std::sort(base_times.begin(), base_times.end());
+ std::sort(base_execution.begin(), base_execution.end());
+
+ std::sort(cur_calls.begin(), cur_calls.end());
+ std::sort(cur_times.begin(), cur_times.end());
+ std::sort(cur_execution.begin(), cur_execution.end());
+
+ //remove outliers
+ const U32 OUTLIER_CUTOFF = 512;
+ if (base_times.size() > OUTLIER_CUTOFF)
+ {
+ ll_remove_outliers(base_times, 1.f);
+ }
+
+ if (base_execution.size() > OUTLIER_CUTOFF)
+ {
+ ll_remove_outliers(base_execution, 1.f);
+ }
+
+ if (cur_times.size() > OUTLIER_CUTOFF)
+ {
+ ll_remove_outliers(cur_times, 1.f);
+ }
+
+ if (cur_execution.size() > OUTLIER_CUTOFF)
+ {
+ ll_remove_outliers(cur_execution, 1.f);
+ }
+
+
+ max_time = llmax(base_times.empty() ? 0.0 : *base_times.rbegin(), cur_times.empty() ? 0.0 : *cur_times.rbegin());
+ max_calls = llmax(base_calls.empty() ? 0 : *base_calls.rbegin(), cur_calls.empty() ? 0 : *cur_calls.rbegin());
+ max_execution = llmax(base_execution.empty() ? 0.0 : *base_execution.rbegin(), cur_execution.empty() ? 0.0 : *cur_execution.rbegin());
+
+
+ LLVector3 last_p;
+
+ //====================================
+ // basic
+ //====================================
+ buffer.clear();
+
+ last_p.clear();
+
+ LLGLDisable cull(GL_CULL_FACE);
+
+ LLVector3 base_col(0, 0.7f, 0.f);
+ LLVector3 cur_col(1.f, 0.f, 0.f);
+
+ gGL.setSceneBlendType(LLRender::BT_ADD);
+
+ gGL.color3fv(base_col.mV);
+ for (U32 i = 0; i < base_times.size(); ++i)
+ {
+ gGL.begin(LLRender::TRIANGLE_STRIP);
+ gGL.vertex3fv(last_p.mV);
+ gGL.vertex3f(last_p.mV[0], 0.f, 0.f);
+ last_p.set((F32)i/(F32) base_times.size(), base_times[i]/max_time, 0.f);
+ gGL.vertex3fv(last_p.mV);
+ gGL.vertex3f(last_p.mV[0], 0.f, 0.f);
+ gGL.end();
+ }
+
+ gGL.flush();
+
+
+ last_p.clear();
+ {
+ LLGLEnable blend(GL_BLEND);
+
+ gGL.color3fv(cur_col.mV);
+ for (U32 i = 0; i < cur_times.size(); ++i)
+ {
+ gGL.begin(LLRender::TRIANGLE_STRIP);
+ gGL.vertex3f(last_p.mV[0], 0.f, 0.f);
+ gGL.vertex3fv(last_p.mV);
+ last_p.set((F32) i / (F32) cur_times.size(), cur_times[i]/max_time, 0.f);
+ gGL.vertex3f(last_p.mV[0], 0.f, 0.f);
+ gGL.vertex3fv(last_p.mV);
+ gGL.end();
+ }
+
+ gGL.flush();
+ }
+
+ saveChart(label, "time", scratch);
+
+ //======================================
+ // calls
+ //======================================
+ buffer.clear();
+
+ last_p.clear();
+
+ gGL.color3fv(base_col.mV);
+ for (U32 i = 0; i < base_calls.size(); ++i)
+ {
+ gGL.begin(LLRender::TRIANGLE_STRIP);
+ gGL.vertex3fv(last_p.mV);
+ gGL.vertex3f(last_p.mV[0], 0.f, 0.f);
+ last_p.set((F32) i / (F32) base_calls.size(), (F32)base_calls[i]/max_calls, 0.f);
+ gGL.vertex3fv(last_p.mV);
+ gGL.vertex3f(last_p.mV[0], 0.f, 0.f);
+ gGL.end();
+ }
+
+ gGL.flush();
+
+ {
+ LLGLEnable blend(GL_BLEND);
+ gGL.color3fv(cur_col.mV);
+ last_p.clear();
+
+ for (U32 i = 0; i < cur_calls.size(); ++i)
+ {
+ gGL.begin(LLRender::TRIANGLE_STRIP);
+ gGL.vertex3f(last_p.mV[0], 0.f, 0.f);
+ gGL.vertex3fv(last_p.mV);
+ last_p.set((F32) i / (F32) cur_calls.size(), (F32) cur_calls[i]/max_calls, 0.f);
+ gGL.vertex3f(last_p.mV[0], 0.f, 0.f);
+ gGL.vertex3fv(last_p.mV);
+ gGL.end();
+
+ }
+
+ gGL.flush();
+ }
+
+ saveChart(label, "calls", scratch);
+
+ //======================================
+ // execution
+ //======================================
+ buffer.clear();
+
+
+ gGL.color3fv(base_col.mV);
+ U32 count = 0;
+ U32 total_count = base_execution.size();
+
+ last_p.clear();
+
+ for (std::vector<LLSD::Real>::iterator iter = base_execution.begin(); iter != base_execution.end(); ++iter)
+ {
+ gGL.begin(LLRender::TRIANGLE_STRIP);
+ gGL.vertex3fv(last_p.mV);
+ gGL.vertex3f(last_p.mV[0], 0.f, 0.f);
+ last_p.set((F32)count/(F32)total_count, *iter/max_execution, 0.f);
+ gGL.vertex3fv(last_p.mV);
+ gGL.vertex3f(last_p.mV[0], 0.f, 0.f);
+ gGL.end();
+ count++;
+ }
+
+ last_p.clear();
+
+ {
+ LLGLEnable blend(GL_BLEND);
+ gGL.color3fv(cur_col.mV);
+ count = 0;
+ total_count = cur_execution.size();
+
+ for (std::vector<LLSD::Real>::iterator iter = cur_execution.begin(); iter != cur_execution.end(); ++iter)
+ {
+ gGL.begin(LLRender::TRIANGLE_STRIP);
+ gGL.vertex3f(last_p.mV[0], 0.f, 0.f);
+ gGL.vertex3fv(last_p.mV);
+ last_p.set((F32)count/(F32)total_count, *iter/max_execution, 0.f);
+ gGL.vertex3f(last_p.mV[0], 0.f, 0.f);
+ gGL.vertex3fv(last_p.mV);
+ gGL.end();
+ count++;
+ }
+
+ gGL.flush();
+ }
+
+ saveChart(label, "execution", scratch);
+ }
+
+ buffer.flush();
+
+ gGL.popMatrix();
+ glMatrixMode(GL_MODELVIEW);
+ gGL.popMatrix();
+}
+
//static
LLSD LLFastTimerView::analyzePerformanceLogDefault(std::istream& is)
{
@@ -1030,6 +1355,10 @@ LLSD LLFastTimerView::analyzePerformanceLogDefault(std::istream& is)
LLSD::Real total_time = 0.0;
LLSD::Integer total_frames = 0;
+ typedef std::map<std::string,LLViewerStats::StatsAccumulator> stats_map_t;
+ stats_map_t time_stats;
+ stats_map_t sample_stats;
+
while (!is.eof() && LLSDSerialize::fromXML(cur, is))
{
for (LLSD::map_iterator iter = cur.beginMap(); iter != cur.endMap(); ++iter)
@@ -1046,35 +1375,31 @@ LLSD LLFastTimerView::analyzePerformanceLogDefault(std::istream& is)
if (time > 0.0)
{
- ret[label]["TotalTime"] = ret[label]["TotalTime"].asReal() + time;
- ret[label]["MaxTime"] = llmax(time, ret[label]["MaxTime"].asReal());
-
- if (ret[label]["MinTime"].asReal() == 0)
- {
- ret[label]["MinTime"] = time;
- }
- else
- {
- ret[label]["MinTime"] = llmin(ret[label]["MinTime"].asReal(), time);
- }
-
LLSD::Integer samples = iter->second["Calls"].asInteger();
- ret[label]["Samples"] = ret[label]["Samples"].asInteger() + samples;
- ret[label]["MaxSamples"] = llmax(ret[label]["MaxSamples"].asInteger(), samples);
-
- if (ret[label]["MinSamples"].asInteger() == 0)
- {
- ret[label]["MinSamples"] = samples;
- }
- else
- {
- ret[label]["MinSamples"] = llmin(ret[label]["MinSamples"].asInteger(), samples);
- }
+ time_stats[label].push(time);
+ sample_stats[label].push(samples);
}
}
total_frames++;
}
+
+ for(stats_map_t::iterator it = time_stats.begin(); it != time_stats.end(); ++it)
+ {
+ std::string label = it->first;
+ ret[label]["TotalTime"] = time_stats[label].mSum;
+ ret[label]["MeanTime"] = time_stats[label].getMean();
+ ret[label]["MaxTime"] = time_stats[label].getMaxValue();
+ ret[label]["MinTime"] = time_stats[label].getMinValue();
+ ret[label]["StdDevTime"] = time_stats[label].getStdDev();
+
+ ret[label]["Samples"] = sample_stats[label].mSum;
+ ret[label]["MaxSamples"] = sample_stats[label].getMaxValue();
+ ret[label]["MinSamples"] = sample_stats[label].getMinValue();
+ ret[label]["StdDevSamples"] = sample_stats[label].getStdDev();
+
+ ret[label]["Frames"] = (LLSD::Integer)time_stats[label].getCount();
+ }
ret["SessionTime"] = total_time;
ret["FrameCount"] = total_frames;
@@ -1109,8 +1434,27 @@ void LLFastTimerView::doAnalysisDefault(std::string baseline, std::string target
std::ofstream os(output.c_str());
LLSD::Real session_time = current["SessionTime"].asReal();
-
- os << "Label, % Change, % of Session, Cur Min, Cur Max, Cur Mean, Cur Total, Cur Samples, Base Min, Base Max, Base Mean, Base Total, Base Samples\n";
+ os <<
+ "Label, "
+ "% Change, "
+ "% of Session, "
+ "Cur Min, "
+ "Cur Max, "
+ "Cur Mean/sample, "
+ "Cur Mean/frame, "
+ "Cur StdDev/frame, "
+ "Cur Total, "
+ "Cur Frames, "
+ "Cur Samples, "
+ "Base Min, "
+ "Base Max, "
+ "Base Mean/sample, "
+ "Base Mean/frame, "
+ "Base StdDev/frame, "
+ "Base Total, "
+ "Base Frames, "
+ "Base Samples\n";
+
for (LLSD::map_iterator iter = base.beginMap(); iter != base.endMap(); ++iter)
{
LLSD::String label = iter->first;
@@ -1122,29 +1466,37 @@ void LLFastTimerView::doAnalysisDefault(std::string baseline, std::string target
continue;
}
LLSD::Real a = base[label]["TotalTime"].asReal() / base[label]["Samples"].asReal();
- LLSD::Real b = current[label]["TotalTime"].asReal() / base[label]["Samples"].asReal();
+ LLSD::Real b = current[label]["TotalTime"].asReal() / current[label]["Samples"].asReal();
LLSD::Real diff = b-a;
LLSD::Real perc = diff/a * 100;
- os << llformat("%s, %.2f, %.4f, %.4f, %.4f, %.4f, %.4f, %d, %.4f, %.4f, %.4f, %.4f, %d\n",
+ os << llformat("%s, %.2f, %.4f, %.4f, %.4f, %.4f, %.4f, %.4f, %.4f, %d, %d, %.4f, %.4f, %.4f, %.4f, %.4f, %.4f, %d, %d\n",
label.c_str(),
(F32) perc,
(F32) (current[label]["TotalTime"].asReal()/session_time * 100.0),
+
(F32) current[label]["MinTime"].asReal(),
(F32) current[label]["MaxTime"].asReal(),
(F32) b,
+ (F32) current[label]["MeanTime"].asReal(),
+ (F32) current[label]["StdDevTime"].asReal(),
(F32) current[label]["TotalTime"].asReal(),
+ current[label]["Frames"].asInteger(),
current[label]["Samples"].asInteger(),
(F32) base[label]["MinTime"].asReal(),
(F32) base[label]["MaxTime"].asReal(),
(F32) a,
+ (F32) base[label]["MeanTime"].asReal(),
+ (F32) base[label]["StdDevTime"].asReal(),
(F32) base[label]["TotalTime"].asReal(),
+ base[label]["Frames"].asInteger(),
base[label]["Samples"].asInteger());
}
-
+ exportCharts(baseline, target);
+
os.flush();
os.close();
}
diff --git a/indra/newview/llfasttimerview.h b/indra/newview/llfasttimerview.h
index b40d7ffc1a..ea8251191b 100644
--- a/indra/newview/llfasttimerview.h
+++ b/indra/newview/llfasttimerview.h
@@ -43,6 +43,7 @@ public:
private:
static void doAnalysisDefault(std::string baseline, std::string target, std::string output) ;
static LLSD analyzePerformanceLogDefault(std::istream& is) ;
+ static void exportCharts(const std::string& base, const std::string& target);
public:
diff --git a/indra/newview/llfeaturemanager.cpp b/indra/newview/llfeaturemanager.cpp
index 4e16cc4217..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
@@ -729,6 +741,10 @@ void LLFeatureManager::applyBaseMasks()
{
maskFeatures("ATI");
}
+ if (gGLManager.mHasATIMemInfo && gGLManager.mVRAM < 256)
+ {
+ maskFeatures("ATIVramLT256");
+ }
if (gGLManager.mATIOldDriver)
{
maskFeatures("ATIOldDriver");
@@ -745,6 +761,14 @@ void LLFeatureManager::applyBaseMasks()
{
maskFeatures("OpenGLPre15");
}
+ if (gGLManager.mGLVersion < 3.f)
+ {
+ maskFeatures("OpenGLPre30");
+ }
+ if (gGLManager.mNumTextureImageUnits <= 8)
+ {
+ maskFeatures("TexUnit8orLess");
+ }
// now mask by gpu string
// Replaces ' ' with '_' in mGPUString to deal with inability for parser to handle spaces
diff --git a/indra/newview/llfilepicker.cpp b/indra/newview/llfilepicker.cpp
index 51e76bcf9b..8c0ed29855 100644
--- a/indra/newview/llfilepicker.cpp
+++ b/indra/newview/llfilepicker.cpp
@@ -50,12 +50,14 @@ LLFilePicker LLFilePicker::sInstance;
#define SOUND_FILTER L"Sounds (*.wav)\0*.wav\0"
#define IMAGE_FILTER L"Images (*.tga; *.bmp; *.jpg; *.jpeg; *.png)\0*.tga;*.bmp;*.jpg;*.jpeg;*.png\0"
#define ANIM_FILTER L"Animations (*.bvh)\0*.bvh\0"
+#define COLLADA_FILTER L"Scene (*.dae)\0*.dae\0"
#ifdef _CORY_TESTING
#define GEOMETRY_FILTER L"SL Geometry (*.slg)\0*.slg\0"
#endif
#define XML_FILTER L"XML files (*.xml)\0*.xml\0"
#define SLOBJECT_FILTER L"Objects (*.slobject)\0*.slobject\0"
#define RAW_FILTER L"RAW files (*.raw)\0*.raw\0"
+#define MODEL_FILTER L"Model files (*.dae)\0*.dae\0"
#endif
//
@@ -185,6 +187,10 @@ BOOL LLFilePicker::setupFilter(ELoadFilter filter)
mOFN.lpstrFilter = ANIM_FILTER \
L"\0";
break;
+ case FFLOAD_COLLADA:
+ mOFN.lpstrFilter = COLLADA_FILTER \
+ L"\0";
+ break;
#ifdef _CORY_TESTING
case FFLOAD_GEOMETRY:
mOFN.lpstrFilter = GEOMETRY_FILTER \
@@ -203,6 +209,10 @@ BOOL LLFilePicker::setupFilter(ELoadFilter filter)
mOFN.lpstrFilter = RAW_FILTER \
L"\0";
break;
+ case FFLOAD_MODEL:
+ mOFN.lpstrFilter = MODEL_FILTER \
+ L"\0";
+ break;
default:
res = FALSE;
break;
@@ -210,7 +220,7 @@ BOOL LLFilePicker::setupFilter(ELoadFilter filter)
return res;
}
-BOOL LLFilePicker::getOpenFile(ELoadFilter filter)
+BOOL LLFilePicker::getOpenFile(ELoadFilter filter, bool blocking)
{
if( mLocked )
{
@@ -235,8 +245,11 @@ BOOL LLFilePicker::getOpenFile(ELoadFilter filter)
setupFilter(filter);
- // Modal, so pause agent
- send_agent_pause();
+ if (blocking)
+ {
+ // Modal, so pause agent
+ send_agent_pause();
+ }
reset();
@@ -247,10 +260,14 @@ BOOL LLFilePicker::getOpenFile(ELoadFilter filter)
std::string filename = utf16str_to_utf8str(llutf16string(mFilesW));
mFiles.push_back(filename);
}
- send_agent_resume();
- // Account for the fact that the app has been stalled.
- LLFrameTimer::updateFrameTime();
+ if (blocking)
+ {
+ send_agent_resume();
+ // Account for the fact that the app has been stalled.
+ LLFrameTimer::updateFrameTime();
+ }
+
return success;
}
@@ -570,6 +587,15 @@ Boolean LLFilePicker::navOpenFilterProc(AEDesc *theItem, void *info, void *callB
result = false;
}
}
+ else if (filter == FFLOAD_COLLADA)
+ {
+ if (fileInfo.filetype != 'DAE ' &&
+ (fileInfo.extension && (CFStringCompare(fileInfo.extension, CFSTR("dae"), kCFCompareCaseInsensitive) != kCFCompareEqualTo))
+ )
+ {
+ result = false;
+ }
+ }
#ifdef _CORY_TESTING
else if (filter == FFLOAD_GEOMETRY)
{
@@ -841,7 +867,7 @@ OSStatus LLFilePicker::doNavSaveDialog(ESaveFilter filter, const std::string& fi
return error;
}
-BOOL LLFilePicker::getOpenFile(ELoadFilter filter)
+BOOL LLFilePicker::getOpenFile(ELoadFilter filter, bool blocking)
{
if( mLocked )
return FALSE;
@@ -866,20 +892,29 @@ BOOL LLFilePicker::getOpenFile(ELoadFilter filter)
mNavOptions.optionFlags |= kNavSupportPackages;
}
- // Modal, so pause agent
- send_agent_pause();
+ if (blocking)
+ {
+ // Modal, so pause agent
+ send_agent_pause();
+ }
+
{
error = doNavChooseDialog(filter);
}
- send_agent_resume();
+
if (error == noErr)
{
if (getFileCount())
success = true;
}
- // Account for the fact that the app has been stalled.
- LLFrameTimer::updateFrameTime();
+ if (blocking)
+ {
+ send_agent_resume();
+ // Account for the fact that the app has been stalled.
+ LLFrameTimer::updateFrameTime();
+ }
+
return success;
}
@@ -1140,6 +1175,12 @@ static std::string add_bvh_filter_to_gtkchooser(GtkWindow *picker)
LLTrans::getString("animation_files") + " (*.bvh)");
}
+static std::string add_collada_filter_to_gtkchooser(GtkWindow *picker)
+{
+ return add_simple_pattern_filter_to_gtkchooser(picker, "*.dae",
+ LLTrans::getString("scene_files") + " (*.dae)");
+}
+
static std::string add_imageload_filter_to_gtkchooser(GtkWindow *picker)
{
GtkFileFilter *gfilter = gtk_file_filter_new();
@@ -1248,7 +1289,7 @@ BOOL LLFilePicker::getSaveFile( ESaveFilter filter, const std::string& filename
return rtn;
}
-BOOL LLFilePicker::getOpenFile( ELoadFilter filter )
+BOOL LLFilePicker::getOpenFile( ELoadFilter filter, bool blocking )
{
BOOL rtn = FALSE;
@@ -1276,6 +1317,9 @@ BOOL LLFilePicker::getOpenFile( ELoadFilter filter )
case FFLOAD_ANIM:
filtername = add_bvh_filter_to_gtkchooser(picker);
break;
+ case FFLOAD_COLLADA:
+ filtername = add_collada_filter_to_gtkchooser(picker);
+ break;
case FFLOAD_IMAGE:
filtername = add_imageload_filter_to_gtkchooser(picker);
break;
diff --git a/indra/newview/llfilepicker.h b/indra/newview/llfilepicker.h
index 596bfa3e69..cd843a8f33 100644
--- a/indra/newview/llfilepicker.h
+++ b/indra/newview/llfilepicker.h
@@ -82,6 +82,8 @@ public:
FFLOAD_XML = 6,
FFLOAD_SLOBJECT = 7,
FFLOAD_RAW = 8,
+ FFLOAD_MODEL = 9,
+ FFLOAD_COLLADA = 10,
};
enum ESaveFilter
@@ -105,7 +107,7 @@ public:
// open the dialog. This is a modal operation
BOOL getSaveFile( ESaveFilter filter = FFSAVE_ALL, const std::string& filename = LLStringUtil::null );
- BOOL getOpenFile( ELoadFilter filter = FFLOAD_ALL );
+ BOOL getOpenFile( ELoadFilter filter = FFLOAD_ALL, bool blocking = true );
BOOL getMultipleOpenFiles( ELoadFilter filter = FFLOAD_ALL );
// Get the filename(s) found. getFirstFile() sets the pointer to
@@ -190,4 +192,6 @@ public:
~LLFilePicker();
};
+const std::string upload_pick(void* data);
+
#endif
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 8ab2229235..32a533570a 100644
--- a/indra/newview/llflexibleobject.cpp
+++ b/indra/newview/llflexibleobject.cpp
@@ -91,11 +91,13 @@ void LLVolumeImplFlexible::onParameterChanged(U16 param_type, LLNetworkData *dat
}
}
-void LLVolumeImplFlexible::onShift(const LLVector3 &shift_vector)
+void LLVolumeImplFlexible::onShift(const LLVector4a &shift_vector)
{
+ //VECTORIZE THIS
+ LLVector3 shift(shift_vector.getF32ptr());
for (int section = 0; section < (1<<FLEXIBLE_OBJECT_MAX_SECTIONS)+1; ++section)
{
- mSection[section].mPosition += shift_vector;
+ mSection[section].mPosition += shift;
}
}
@@ -314,11 +316,13 @@ BOOL LLVolumeImplFlexible::doIdleUpdate(LLAgent &agent, LLWorld &world, const F6
return FALSE; // (we are not initialized or updated)
}
- if (force_update)
+ bool visible = mVO->mDrawable->isVisible();
+
+ if (force_update && visible)
{
gPipeline.markRebuild(mVO->mDrawable, LLDrawable::REBUILD_POSITION, FALSE);
}
- else if (mVO->mDrawable->isVisible() &&
+ else if (visible &&
!mVO->mDrawable->isState(LLDrawable::IN_REBUILD_Q1) &&
mVO->getPixelArea() > 256.f)
{
@@ -362,7 +366,7 @@ void LLVolumeImplFlexible::doFlexibleUpdate()
LLFastTimer ftm(FTM_DO_FLEXIBLE_UPDATE);
LLVolume* volume = mVO->getVolume();
LLPath *path = &volume->getPath();
- if (mSimulateRes == 0)
+ if ((mSimulateRes == 0 || !mInitialized) && mVO->mDrawable->isVisible())
{
mVO->markForUpdate(TRUE);
if (!doIdleUpdate(gAgent, *LLWorld::getInstance(), 0.0))
@@ -371,7 +375,11 @@ void LLVolumeImplFlexible::doFlexibleUpdate()
}
}
- llassert_always(mInitialized);
+ if(!mInitialized)
+ {
+ //the object is not visible
+ return ;
+ }
S32 num_sections = 1 << mSimulateRes;
@@ -690,6 +698,8 @@ BOOL LLVolumeImplFlexible::doUpdateGeometry(LLDrawable *drawable)
}
volume->updateRelativeXform();
+
+ if (mRenderRes > -1)
{
LLFastTimer t(FTM_DO_FLEXIBLE_UPDATE);
doFlexibleUpdate();
diff --git a/indra/newview/llflexibleobject.h b/indra/newview/llflexibleobject.h
index 9b952f1985..fef43d464d 100644
--- a/indra/newview/llflexibleobject.h
+++ b/indra/newview/llflexibleobject.h
@@ -84,7 +84,7 @@ class LLVolumeImplFlexible : public LLVolumeInterface
void onSetVolume(const LLVolumeParams &volume_params, const S32 detail);
void onSetScale(const LLVector3 &scale, BOOL damped);
void onParameterChanged(U16 param_type, LLNetworkData *data, BOOL in_use, bool local_origin);
- void onShift(const LLVector3 &shift_vector);
+ void onShift(const LLVector4a &shift_vector);
bool isVolumeUnique() const { return true; }
bool isVolumeGlobal() const { return true; }
bool isActive() const { return true; }
diff --git a/indra/newview/llfloateranimpreview.cpp b/indra/newview/llfloateranimpreview.cpp
index deebd69ec1..1f334815d6 100644
--- a/indra/newview/llfloateranimpreview.cpp
+++ b/indra/newview/llfloateranimpreview.cpp
@@ -994,6 +994,7 @@ void LLFloaterAnimPreview::onBtnOK(void* userdata)
LLFloaterPerms::getNextOwnerPerms(), LLFloaterPerms::getGroupPerms(), LLFloaterPerms::getEveryonePerms(),
name,
callback, expected_upload_cost, userdata);
+
}
else
{
@@ -1032,7 +1033,6 @@ LLPreviewAnimation::LLPreviewAnimation(S32 width, S32 height) : LLViewerDynamicT
mDummyAvatar->updateGeometry(mDummyAvatar->mDrawable);
mDummyAvatar->startMotion(ANIM_AGENT_STAND, BASE_ANIM_TIME_OFFSET);
mDummyAvatar->hideSkirt();
- gPipeline.markVisible(mDummyAvatar->mDrawable, *LLViewerCamera::getInstance());
// stop extraneous animations
mDummyAvatar->stopMotion( ANIM_AGENT_HEAD_ROT, TRUE );
diff --git a/indra/newview/llfloaterbuyland.cpp b/indra/newview/llfloaterbuyland.cpp
index 83105ef27c..610142b5a9 100644
--- a/indra/newview/llfloaterbuyland.cpp
+++ b/indra/newview/llfloaterbuyland.cpp
@@ -459,10 +459,18 @@ void LLFloaterBuyLandUI::updateParcelInfo()
return;
}
- if (!authorizedBuyer.isNull() && buyer != authorizedBuyer)
+ if (!authorizedBuyer.isNull() && buyer != authorizedBuyer)
{
- 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;
+ }
}
}
else
diff --git a/indra/newview/llfloaterchat.cpp b/indra/newview/llfloaterchat.cpp
index c2c2e7fe22..2679dbb78b 100644
--- a/indra/newview/llfloaterchat.cpp
+++ b/indra/newview/llfloaterchat.cpp
@@ -413,8 +413,9 @@ LLColor4 get_text_color(const LLChat& chat)
if (!chat.mPosAgent.isExactlyZero())
{
LLVector3 pos_agent = gAgent.getPositionAgent();
- F32 distance = dist_vec(pos_agent, chat.mPosAgent);
- if (distance > gAgent.getNearChatRadius())
+ F32 distance_squared = dist_vec_squared(pos_agent, chat.mPosAgent);
+ F32 dist_near_chat = gAgent.getNearChatRadius();
+ if (distance_squared > dist_near_chat * dist_near_chat)
{
// diminish far-off chat
text_color.mV[VALPHA] = 0.8f;
diff --git a/indra/newview/llfloaterhardwaresettings.cpp b/indra/newview/llfloaterhardwaresettings.cpp
index 1e91710552..42ec7d765b 100644
--- a/indra/newview/llfloaterhardwaresettings.cpp
+++ b/indra/newview/llfloaterhardwaresettings.cpp
@@ -50,7 +50,6 @@ LLFloaterHardwareSettings::LLFloaterHardwareSettings(const LLSD& key)
// but init them anyway
mUseVBO(0),
mUseAniso(0),
- mUseFBO(0),
mFSAASamples(0),
mGamma(0.0),
mVideoCardMem(0),
@@ -75,7 +74,6 @@ void LLFloaterHardwareSettings::refresh()
mUseVBO = gSavedSettings.getBOOL("RenderVBOEnable");
mUseAniso = gSavedSettings.getBOOL("RenderAnisotropic");
- mUseFBO = gSavedSettings.getBOOL("RenderUseFBO");
mFSAASamples = gSavedSettings.getU32("RenderFSAASamples");
mGamma = gSavedSettings.getF32("RenderGamma");
mVideoCardMem = gSavedSettings.getS32("TextureMemory");
@@ -104,7 +102,7 @@ void LLFloaterHardwareSettings::refreshEnabledState()
getChildView("(brightness, lower is brighter)")->setEnabled(!gPipeline.canUseWindLightShaders());
getChildView("fog")->setEnabled(!gPipeline.canUseWindLightShaders());
getChildView("fsaa")->setEnabled(gPipeline.canUseAntiAliasing());
- getChildView("antialiasing restart")->setVisible(!gSavedSettings.getBOOL("RenderUseFBO"));
+ getChildView("antialiasing restart")->setVisible(!gSavedSettings.getBOOL("RenderDeferred"));
/* Enable to reset fsaa value to disabled when feature is not available.
if (!gPipeline.canUseAntiAliasing())
@@ -139,7 +137,6 @@ void LLFloaterHardwareSettings::cancel()
{
gSavedSettings.setBOOL("RenderVBOEnable", mUseVBO);
gSavedSettings.setBOOL("RenderAnisotropic", mUseAniso);
- gSavedSettings.setBOOL("RenderUseFBO", mUseFBO);
gSavedSettings.setU32("RenderFSAASamples", mFSAASamples);
gSavedSettings.setF32("RenderGamma", mGamma);
gSavedSettings.setS32("TextureMemory", mVideoCardMem);
diff --git a/indra/newview/llfloaterimagepreview.cpp b/indra/newview/llfloaterimagepreview.cpp
index c7fbdd5745..e4d8e3513d 100644
--- a/indra/newview/llfloaterimagepreview.cpp
+++ b/indra/newview/llfloaterimagepreview.cpp
@@ -63,7 +63,7 @@ const S32 PREVIEW_BORDER_WIDTH = 2;
const S32 PREVIEW_RESIZE_HANDLE_SIZE = S32(RESIZE_HANDLE_WIDTH * OO_SQRT2) + PREVIEW_BORDER_WIDTH;
const S32 PREVIEW_HPAD = PREVIEW_RESIZE_HANDLE_SIZE;
const S32 PREF_BUTTON_HEIGHT = 16 + 7 + 16;
-const S32 PREVIEW_TEXTURE_HEIGHT = 300;
+const S32 PREVIEW_TEXTURE_HEIGHT = 320;
//-----------------------------------------------------------------------------
// LLFloaterImagePreview()
@@ -325,122 +325,51 @@ void LLFloaterImagePreview::draw()
bool LLFloaterImagePreview::loadImage(const std::string& src_filename)
{
std::string exten = gDirUtilp->getExtension(src_filename);
-
- U32 codec = IMG_CODEC_INVALID;
- std::string temp_str;
- if( exten == "bmp")
- {
- codec = IMG_CODEC_BMP;
- }
- else if( exten == "tga")
- {
- codec = IMG_CODEC_TGA;
- }
- else if( exten == "jpg" || exten == "jpeg")
- {
- codec = IMG_CODEC_JPEG;
- }
- else if( exten == "png" )
- {
- codec = IMG_CODEC_PNG;
- }
+ U32 codec = LLImageBase::getCodecFromExtension(exten);
LLImageDimensionsInfo image_info;
- if(!image_info.load(src_filename,codec))
+ if (!image_info.load(src_filename,codec))
{
mImageLoadError = image_info.getLastError();
return false;
}
S32 max_width = gSavedSettings.getS32("max_texture_dimension_X");
- S32 max_heigh = gSavedSettings.getS32("max_texture_dimension_Y");
+ S32 max_height = gSavedSettings.getS32("max_texture_dimension_Y");
- if(image_info.getWidth() > max_width|| image_info.getHeight() > max_heigh)
+ if ((image_info.getWidth() > max_width) || (image_info.getHeight() > max_height))
{
LLStringUtil::format_map_t args;
args["WIDTH"] = llformat("%d", max_width);
- args["HEIGHT"] = llformat("%d", max_heigh);
+ args["HEIGHT"] = llformat("%d", max_height);
mImageLoadError = LLTrans::getString("texture_load_dimensions_error", args);
return false;
}
-
+ // Load the image
+ LLPointer<LLImageFormatted> image = LLImageFormatted::createFromType(codec);
+ if (image.isNull())
+ {
+ return false;
+ }
+ if (!image->load(src_filename))
+ {
+ return false;
+ }
+ // Decompress or expand it in a raw image structure
LLPointer<LLImageRaw> raw_image = new LLImageRaw;
-
- switch (codec)
+ if (!image->decode(raw_image, 0.0f))
{
- case IMG_CODEC_BMP:
- {
- LLPointer<LLImageBMP> bmp_image = new LLImageBMP;
-
- if (!bmp_image->load(src_filename))
- {
- return false;
- }
-
- if (!bmp_image->decode(raw_image, 0.0f))
- {
- return false;
- }
- }
- break;
- case IMG_CODEC_TGA:
- {
- LLPointer<LLImageTGA> tga_image = new LLImageTGA;
-
- if (!tga_image->load(src_filename))
- {
- return false;
- }
-
- if (!tga_image->decode(raw_image))
- {
- return false;
- }
-
- if( (tga_image->getComponents() != 3) &&
- (tga_image->getComponents() != 4) )
- {
- tga_image->setLastError( "Image files with less than 3 or more than 4 components are not supported." );
- return false;
- }
- }
- break;
- case IMG_CODEC_JPEG:
- {
- LLPointer<LLImageJPEG> jpeg_image = new LLImageJPEG;
-
- if (!jpeg_image->load(src_filename))
- {
- return false;
- }
-
- if (!jpeg_image->decode(raw_image, 0.0f))
- {
- return false;
- }
- }
- break;
- case IMG_CODEC_PNG:
- {
- LLPointer<LLImagePNG> png_image = new LLImagePNG;
-
- if (!png_image->load(src_filename))
- {
- return false;
- }
-
- if (!png_image->decode(raw_image, 0.0f))
- {
- return false;
- }
- }
- break;
- default:
return false;
}
-
+ // Check the image constraints
+ if ((image->getComponents() != 3) && (image->getComponents() != 4))
+ {
+ image->setLastError("Image files with less than 3 or more than 4 components are not supported.");
+ return false;
+ }
+
raw_image->biasedScaleToPowerOfTwo(1024);
mRawImagep = raw_image;
@@ -858,8 +787,8 @@ void LLImagePreviewSculpted::setPreviewTarget(LLImageRaw* imagep, F32 distance)
}
const LLVolumeFace &vf = mVolume->getVolumeFace(0);
- U32 num_indices = vf.mIndices.size();
- U32 num_vertices = vf.mVertices.size();
+ U32 num_indices = vf.mNumIndices;
+ U32 num_vertices = vf.mNumVertices;
mVertexBuffer = new LLVertexBuffer(LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL, 0);
mVertexBuffer->allocateBuffer(num_vertices, num_indices, TRUE);
@@ -873,10 +802,16 @@ void LLImagePreviewSculpted::setPreviewTarget(LLImageRaw* imagep, F32 distance)
mVertexBuffer->getIndexStrider(index_strider);
// build vertices and normals
+ LLStrider<LLVector3> pos;
+ pos = (LLVector3*) vf.mPositions; pos.setStride(16);
+ LLStrider<LLVector3> norm;
+ norm = (LLVector3*) vf.mNormals; norm.setStride(16);
+
+
for (U32 i = 0; i < num_vertices; i++)
{
- *(vertex_strider++) = vf.mVertices[i].mPosition;
- LLVector3 normal = vf.mVertices[i].mNormal;
+ *(vertex_strider++) = *pos++;
+ LLVector3 normal = *norm++;
normal.normalize();
*(normal_strider++) = normal;
}
@@ -895,7 +830,6 @@ void LLImagePreviewSculpted::setPreviewTarget(LLImageRaw* imagep, F32 distance)
BOOL LLImagePreviewSculpted::render()
{
mNeedsUpdate = FALSE;
-
LLGLSUIDefault def;
LLGLDisable no_blend(GL_BLEND);
LLGLEnable cull(GL_CULL_FACE);
@@ -940,7 +874,7 @@ BOOL LLImagePreviewSculpted::render()
LLViewerCamera::getInstance()->setPerspective(FALSE, mOrigin.mX, mOrigin.mY, mFullWidth, mFullHeight, FALSE);
const LLVolumeFace &vf = mVolume->getVolumeFace(0);
- U32 num_indices = vf.mIndices.size();
+ U32 num_indices = vf.mNumIndices;
mVertexBuffer->setBuffer(LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL);
@@ -953,7 +887,6 @@ BOOL LLImagePreviewSculpted::render()
mVertexBuffer->draw(LLRender::TRIANGLES, num_indices, 0);
gGL.popMatrix();
-
return TRUE;
}
diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp
index 7be4ebc690..0d0c1f594d 100644
--- a/indra/newview/llfloaterland.cpp
+++ b/indra/newview/llfloaterland.cpp
@@ -38,6 +38,7 @@
#include "message.h"
#include "llagent.h"
+#include "llagentaccess.h"
#include "llbutton.h"
#include "llcheckboxctrl.h"
#include "llcombobox.h"
diff --git a/indra/newview/llfloaterland.h b/indra/newview/llfloaterland.h
index a096fb64cd..8a70fa24d8 100644
--- a/indra/newview/llfloaterland.h
+++ b/indra/newview/llfloaterland.h
@@ -43,11 +43,12 @@ class LLButton;
class LLCheckBoxCtrl;
class LLRadioGroup;
class LLComboBox;
-class LLNameListCtrl;
-class LLSpinCtrl;
class LLLineEditor;
+class LLMessageSystem;
+class LLNameListCtrl;
class LLRadioGroup;
class LLParcelSelectionObserver;
+class LLSpinCtrl;
class LLTabContainer;
class LLTextBox;
class LLTextEditor;
diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp
new file mode 100644
index 0000000000..9dd5269a6b
--- /dev/null
+++ b/indra/newview/llfloatermodelpreview.cpp
@@ -0,0 +1,5037 @@
+/**
+ * @file llfloatermodelpreview.cpp
+ * @brief LLFloaterModelPreview class implementation
+ *
+ * $LicenseInfo:firstyear=2004&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "dae.h"
+//#include "dom.h"
+#include "dom/domAsset.h"
+#include "dom/domBind_material.h"
+#include "dom/domCOLLADA.h"
+#include "dom/domConstants.h"
+#include "dom/domController.h"
+#include "dom/domEffect.h"
+#include "dom/domGeometry.h"
+#include "dom/domInstance_geometry.h"
+#include "dom/domInstance_material.h"
+#include "dom/domInstance_node.h"
+#include "dom/domInstance_effect.h"
+#include "dom/domMaterial.h"
+#include "dom/domMatrix.h"
+#include "dom/domNode.h"
+#include "dom/domProfile_COMMON.h"
+#include "dom/domRotate.h"
+#include "dom/domScale.h"
+#include "dom/domTranslate.h"
+#include "dom/domVisual_scene.h"
+
+#include "llfloatermodelpreview.h"
+
+#include "llfilepicker.h"
+#include "llimagebmp.h"
+#include "llimagetga.h"
+#include "llimagejpeg.h"
+#include "llimagepng.h"
+
+#include "llagent.h"
+#include "llbutton.h"
+#include "llcombobox.h"
+#include "lldatapacker.h"
+#include "lldrawable.h"
+#include "lldrawpoolavatar.h"
+#include "llrender.h"
+#include "llface.h"
+#include "lleconomy.h"
+#include "llfocusmgr.h"
+#include "llfloaterperms.h"
+#include "lliconctrl.h"
+#include "llmatrix4a.h"
+#include "llmenubutton.h"
+#include "llmeshrepository.h"
+#include "llsdutil_math.h"
+#include "lltextbox.h"
+#include "lltoolmgr.h"
+#include "llui.h"
+#include "llvector4a.h"
+#include "llviewercamera.h"
+#include "llviewerwindow.h"
+#include "llvoavatar.h"
+#include "llvoavatarself.h"
+#include "pipeline.h"
+#include "lluictrlfactory.h"
+#include "llviewercontrol.h"
+#include "llviewermenu.h"
+#include "llviewermenufile.h"
+#include "llviewerregion.h"
+#include "llviewertexturelist.h"
+#include "llstring.h"
+#include "llbutton.h"
+#include "llcheckboxctrl.h"
+#include "llradiogroup.h"
+#include "llsdserialize.h"
+#include "llsliderctrl.h"
+#include "llspinctrl.h"
+#include "lltoggleablemenu.h"
+#include "llvfile.h"
+#include "llvfs.h"
+#include "llcallbacklist.h"
+#include "llviewerobjectlist.h"
+#include "llanimationstates.h"
+#include "glod/glod.h"
+
+//static
+S32 LLFloaterModelPreview::sUploadAmount = 10;
+LLFloaterModelPreview* LLFloaterModelPreview::sInstance = NULL;
+std::list<LLModelLoader*> LLModelLoader::sActiveLoaderList;
+
+const S32 PREVIEW_BORDER_WIDTH = 2;
+const S32 PREVIEW_RESIZE_HANDLE_SIZE = S32(RESIZE_HANDLE_WIDTH * OO_SQRT2) + PREVIEW_BORDER_WIDTH;
+const S32 PREVIEW_HPAD = PREVIEW_RESIZE_HANDLE_SIZE;
+const S32 PREF_BUTTON_HEIGHT = 16 + 7 + 16;
+const S32 PREVIEW_TEXTURE_HEIGHT = 300;
+
+void drawBoxOutline(const LLVector3& pos, const LLVector3& size);
+
+
+std::string lod_name[NUM_LOD+1] =
+{
+ "lowest",
+ "low",
+ "medium",
+ "high",
+ "I went off the end of the lod_name array. Me so smart."
+};
+
+std::string lod_triangles_name[NUM_LOD+1] =
+{
+ "lowest_triangles",
+ "low_triangles",
+ "medium_triangles",
+ "high_triangles",
+ "I went off the end of the lod_triangles_name array. Me so smart."
+};
+
+std::string lod_vertices_name[NUM_LOD+1] =
+{
+ "lowest_vertices",
+ "low_vertices",
+ "medium_vertices",
+ "high_vertices",
+ "I went off the end of the lod_vertices_name array. Me so smart."
+};
+
+std::string lod_status_name[NUM_LOD+1] =
+{
+ "lowest_status",
+ "low_status",
+ "medium_status",
+ "high_status",
+ "I went off the end of the lod_status_name array. Me so smart."
+};
+
+std::string lod_icon_name[NUM_LOD+1] =
+{
+ "status_icon_lowest",
+ "status_icon_low",
+ "status_icon_medium",
+ "status_icon_high",
+ "I went off the end of the lod_status_name array. Me so smart."
+};
+
+std::string lod_status_image[NUM_LOD+1] =
+{
+ "ModelImport_Status_Good",
+ "ModelImport_Status_Warning",
+ "ModelImport_Status_Error",
+ "I went off the end of the lod_status_image array. Me so smart."
+};
+
+std::string lod_label_name[NUM_LOD+1] =
+{
+ "lowest_label",
+ "low_label",
+ "medium_label",
+ "high_label",
+ "I went off the end of the lod_label_name array. Me so smart."
+};
+
+bool validate_face(const LLVolumeFace& face)
+{
+ for (U32 i = 0; i < face.mNumIndices; ++i)
+ {
+ if (face.mIndices[i] >= face.mNumVertices)
+ {
+ llwarns << "Face has invalid index." << llendl;
+ return false;
+ }
+ }
+
+ return true;
+}
+
+bool validate_model(const LLModel* mdl)
+{
+ if (mdl->getNumVolumeFaces() == 0)
+ {
+ llwarns << "Model has no faces!" << llendl;
+ return false;
+ }
+
+ for (S32 i = 0; i < mdl->getNumVolumeFaces(); ++i)
+ {
+ if (mdl->getVolumeFace(i).mNumVertices == 0)
+ {
+ llwarns << "Face has no vertices." << llendl;
+ return false;
+ }
+
+ if (mdl->getVolumeFace(i).mNumIndices == 0)
+ {
+ llwarns << "Face has no indices." << llendl;
+ return false;
+ }
+
+ if (!validate_face(mdl->getVolumeFace(i)))
+ {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+BOOL stop_gloderror()
+{
+ GLuint error = glodGetError();
+
+ if (error != GLOD_NO_ERROR)
+ {
+ llwarns << "GLOD error detected, cannot generate LOD: " << std::hex << error << llendl;
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+
+LLMeshFilePicker::LLMeshFilePicker(LLModelPreview* mp, S32 lod)
+ : LLFilePickerThread(LLFilePicker::FFLOAD_COLLADA)
+ {
+ mMP = mp;
+ mLOD = lod;
+ }
+
+void LLMeshFilePicker::notify(const std::string& filename)
+{
+ mMP->loadModel(mFile, mLOD);
+}
+
+
+//-----------------------------------------------------------------------------
+// LLFloaterModelPreview()
+//-----------------------------------------------------------------------------
+LLFloaterModelPreview::LLFloaterModelPreview(const LLSD& key) :
+LLFloater(key)
+{
+ sInstance = this;
+ mLastMouseX = 0;
+ mLastMouseY = 0;
+ mGLName = 0;
+ mStatusLock = new LLMutex(NULL);
+
+ mLODMode[LLModel::LOD_HIGH] = 0;
+ for (U32 i = 0; i < LLModel::LOD_HIGH; i++)
+ {
+ mLODMode[i] = 1;
+ }
+}
+
+//-----------------------------------------------------------------------------
+// postBuild()
+//-----------------------------------------------------------------------------
+BOOL LLFloaterModelPreview::postBuild()
+{
+ if (!LLFloater::postBuild())
+ {
+ return FALSE;
+ }
+
+ childSetAction("lod_browse", onBrowseLOD, this);
+
+ childSetCommitCallback("cancel_btn", onCancel, this);
+ childSetCommitCallback("crease_angle", onGenerateNormalsCommit, this);
+ childSetCommitCallback("generate_normals", onGenerateNormalsCommit, this);
+
+ childSetCommitCallback("lod_generate", onAutoFillCommit, this);
+
+ childSetCommitCallback("lod_mode", onLODParamCommit, this);
+ childSetCommitCallback("lod_error_threshold", onLODParamCommit, this);
+ childSetCommitCallback("lod_triangle_limit", onLODParamCommitTriangleLimit, this);
+ childSetCommitCallback("build_operator", onLODParamCommit, this);
+ childSetCommitCallback("queue_mode", onLODParamCommit, this);
+ childSetCommitCallback("border_mode", onLODParamCommit, this);
+ childSetCommitCallback("share_tolerance", onLODParamCommit, this);
+
+ 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);
+ childSetCommitCallback("upload_joints", onUploadJointsCommit, this);
+
+ childSetCommitCallback("import_scale", onImportScaleCommit, this);
+ childSetCommitCallback("pelvis_offset", onPelvisOffsetCommit, this);
+
+ childSetCommitCallback("lod_file_or_limit", refresh, this);
+ childSetCommitCallback("physics_load_radio", refresh, 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");
+
+ mCommitCallbackRegistrar.add("ModelImport.ViewOption.Action", boost::bind(&LLFloaterModelPreview::onViewOptionChecked, this, _2));
+ mEnableCallbackRegistrar.add("ModelImport.ViewOption.Check", boost::bind(&LLFloaterModelPreview::isViewOptionChecked, this, _2));
+ mEnableCallbackRegistrar.add("ModelImport.ViewOption.Enabled", boost::bind(&LLFloaterModelPreview::isViewOptionEnabled, this, _2));
+
+
+
+ mViewOptionMenu = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_model_import_gear_default.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
+ mViewOptionMenuButton->setMenu(mViewOptionMenu, LLMenuButton::MP_BOTTOM_LEFT);
+
+ initDecompControls();
+
+ LLView* preview_panel = getChild<LLView>("preview_panel");
+
+ 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));
+
+ //set callbacks for left click on line editor rows
+ for (U32 i = 0; i <= LLModel::LOD_HIGH; i++)
+ {
+ LLTextBox* text = getChild<LLTextBox>(lod_label_name[i]);
+ if (text)
+ {
+ text->setMouseDownCallback(boost::bind(&LLModelPreview::setPreviewLOD, mModelPreview, i));
+ }
+
+ text = getChild<LLTextBox>(lod_triangles_name[i]);
+ if (text)
+ {
+ text->setMouseDownCallback(boost::bind(&LLModelPreview::setPreviewLOD, mModelPreview, i));
+ }
+
+ text = getChild<LLTextBox>(lod_vertices_name[i]);
+ if (text)
+ {
+ text->setMouseDownCallback(boost::bind(&LLModelPreview::setPreviewLOD, mModelPreview, i));
+ }
+
+ text = getChild<LLTextBox>(lod_status_name[i]);
+ if (text)
+ {
+ text->setMouseDownCallback(boost::bind(&LLModelPreview::setPreviewLOD, mModelPreview, i));
+ }
+ }
+
+ return TRUE;
+}
+
+//-----------------------------------------------------------------------------
+// LLFloaterModelPreview()
+//-----------------------------------------------------------------------------
+LLFloaterModelPreview::~LLFloaterModelPreview()
+{
+ sInstance = NULL;
+
+ if ( mModelPreview )
+ {
+ delete mModelPreview;
+ }
+
+ if (mGLName)
+ {
+ LLImageGL::deleteTextures(1, &mGLName );
+ }
+
+ delete mStatusLock;
+ mStatusLock = NULL;
+}
+
+void LLFloaterModelPreview::onViewOptionChecked(const LLSD& userdata)
+{
+ if (mModelPreview)
+ {
+ mModelPreview->mViewOption[userdata.asString()] = !mModelPreview->mViewOption[userdata.asString()];
+
+ mModelPreview->refresh();
+ }
+}
+
+bool LLFloaterModelPreview::isViewOptionChecked(const LLSD& userdata)
+{
+ if (mModelPreview)
+ {
+ return mModelPreview->mViewOption[userdata.asString()];
+ }
+
+ return false;
+}
+
+bool LLFloaterModelPreview::isViewOptionEnabled(const LLSD& userdata)
+{
+ return !mViewOptionDisabled[userdata.asString()];
+}
+
+void LLFloaterModelPreview::setViewOptionEnabled(const std::string& option, bool enabled)
+{
+ mViewOptionDisabled[option] = !enabled;
+}
+
+void LLFloaterModelPreview::enableViewOption(const std::string& option)
+{
+ setViewOptionEnabled(option, true);
+}
+
+void LLFloaterModelPreview::disableViewOption(const std::string& option)
+{
+ setViewOptionEnabled(option, false);
+}
+
+void LLFloaterModelPreview::loadModel(S32 lod)
+{
+ mModelPreview->mLoading = true;
+
+ (new LLMeshFilePicker(mModelPreview, lod))->getFile();
+}
+
+//static
+void LLFloaterModelPreview::onImportScaleCommit(LLUICtrl*,void* userdata)
+{
+ LLFloaterModelPreview *fp =(LLFloaterModelPreview *)userdata;
+
+ if (!fp->mModelPreview)
+ {
+ return;
+ }
+
+ fp->mModelPreview->calcResourceCost();
+ fp->mModelPreview->refresh();
+}
+//static
+void LLFloaterModelPreview::onPelvisOffsetCommit( LLUICtrl*, void* userdata )
+{
+ LLFloaterModelPreview *fp =(LLFloaterModelPreview*)userdata;
+
+ if (!fp->mModelPreview)
+ {
+ return;
+ }
+ fp->mModelPreview->calcResourceCost();
+ fp->mModelPreview->refresh();
+}
+
+//static
+void LLFloaterModelPreview::onUploadJointsCommit(LLUICtrl*,void* userdata)
+{
+ LLFloaterModelPreview *fp =(LLFloaterModelPreview *)userdata;
+
+ if (!fp->mModelPreview)
+ {
+ return;
+ }
+
+ fp->mModelPreview->refresh();
+}
+
+//static
+void LLFloaterModelPreview::onUploadSkinCommit(LLUICtrl*,void* userdata)
+{
+ LLFloaterModelPreview *fp =(LLFloaterModelPreview *)userdata;
+
+ if (!fp->mModelPreview)
+ {
+ return;
+ }
+
+ fp->mModelPreview->calcResourceCost();
+ fp->mModelPreview->refresh();
+ fp->mModelPreview->resetPreviewTarget();
+ fp->mModelPreview->clearBuffers();
+}
+
+//static
+void LLFloaterModelPreview::onPreviewLODCommit(LLUICtrl* ctrl, void* userdata)
+{
+ LLFloaterModelPreview *fp =(LLFloaterModelPreview *)userdata;
+
+ if (!fp->mModelPreview)
+ {
+ return;
+ }
+
+ S32 which_mode = 0;
+
+ LLComboBox* combo = (LLComboBox*) ctrl;
+
+ which_mode = (NUM_LOD-1)-combo->getFirstSelectedIndex(); // combo box list of lods is in reverse order
+
+ fp->mModelPreview->setPreviewLOD(which_mode);
+}
+
+//static
+void LLFloaterModelPreview::onGenerateNormalsCommit(LLUICtrl* ctrl, void* userdata)
+{
+ LLFloaterModelPreview* fp = (LLFloaterModelPreview*) userdata;
+
+ fp->mModelPreview->generateNormals();
+}
+
+//static
+void LLFloaterModelPreview::onExplodeCommit(LLUICtrl* ctrl, void* userdata)
+{
+ LLFloaterModelPreview* fp = LLFloaterModelPreview::sInstance;
+
+ fp->mModelPreview->refresh();
+}
+
+//static
+void LLFloaterModelPreview::onAutoFillCommit(LLUICtrl* ctrl, void* userdata)
+{
+ LLFloaterModelPreview* fp = (LLFloaterModelPreview*) userdata;
+
+ fp->mModelPreview->genLODs();
+}
+
+//static
+void LLFloaterModelPreview::onLODParamCommit(LLUICtrl* ctrl, void* userdata)
+{
+ LLFloaterModelPreview* fp = (LLFloaterModelPreview*) userdata;
+ fp->mModelPreview->onLODParamCommit(false);
+}
+
+//static
+void LLFloaterModelPreview::onLODParamCommitTriangleLimit(LLUICtrl* ctrl, void* userdata)
+{
+ LLFloaterModelPreview* fp = (LLFloaterModelPreview*) userdata;
+ fp->mModelPreview->onLODParamCommit(true);
+}
+
+
+//-----------------------------------------------------------------------------
+// draw()
+//-----------------------------------------------------------------------------
+void LLFloaterModelPreview::draw()
+{
+ LLFloater::draw();
+ LLRect r = getRect();
+
+ mModelPreview->update();
+
+ if (!mModelPreview->mLoading)
+ {
+ if ( mModelPreview->getLoadState() > LLModelLoader::ERROR_PARSING )
+ {
+ childSetTextArg("status", "[STATUS]", getString(LLModel::getStatusString(mModelPreview->getLoadState() - LLModelLoader::ERROR_PARSING)));
+ }
+ else
+ {
+ childSetTextArg("status", "[STATUS]", getString("status_idle"));
+ }
+ }
+
+ 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);
+
+ gGL.getTexUnit(0)->bind(mModelPreview);
+
+
+ LLView* preview_panel = getChild<LLView>("preview_panel");
+
+ LLRect rect = preview_panel->getRect();
+ if (rect != mPreviewRect)
+ {
+ mModelPreview->refresh();
+ mPreviewRect = preview_panel->getRect();
+ }
+
+ gGL.begin( LLRender::QUADS );
+ {
+ gGL.texCoord2f(0.f, 1.f);
+ gGL.vertex2i(mPreviewRect.mLeft, mPreviewRect.mTop-1);
+ gGL.texCoord2f(0.f, 0.f);
+ gGL.vertex2i(mPreviewRect.mLeft, mPreviewRect.mBottom);
+ gGL.texCoord2f(1.f, 0.f);
+ gGL.vertex2i(mPreviewRect.mRight-1, mPreviewRect.mBottom);
+ gGL.texCoord2f(1.f, 1.f);
+ gGL.vertex2i(mPreviewRect.mRight-1, mPreviewRect.mTop-1);
+ }
+ gGL.end();
+
+ gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+ }
+}
+
+//-----------------------------------------------------------------------------
+// handleMouseDown()
+//-----------------------------------------------------------------------------
+BOOL LLFloaterModelPreview::handleMouseDown(S32 x, S32 y, MASK mask)
+{
+ if (mPreviewRect.pointInRect(x, y))
+ {
+ bringToFront( x, y );
+ gFocusMgr.setMouseCapture(this);
+ gViewerWindow->hideCursor();
+ mLastMouseX = x;
+ mLastMouseY = y;
+ return TRUE;
+ }
+
+ return LLFloater::handleMouseDown(x, y, mask);
+}
+
+//-----------------------------------------------------------------------------
+// handleMouseUp()
+//-----------------------------------------------------------------------------
+BOOL LLFloaterModelPreview::handleMouseUp(S32 x, S32 y, MASK mask)
+{
+ gFocusMgr.setMouseCapture(FALSE);
+ gViewerWindow->showCursor();
+ return LLFloater::handleMouseUp(x, y, mask);
+}
+
+//-----------------------------------------------------------------------------
+// handleHover()
+//-----------------------------------------------------------------------------
+BOOL LLFloaterModelPreview::handleHover (S32 x, S32 y, MASK mask)
+{
+ MASK local_mask = mask & ~MASK_ALT;
+
+ if (mModelPreview && hasMouseCapture())
+ {
+ if (local_mask == MASK_PAN)
+ {
+ // pan here
+ mModelPreview->pan((F32)(x - mLastMouseX) * -0.005f, (F32)(y - mLastMouseY) * -0.005f);
+ }
+ else if (local_mask == MASK_ORBIT)
+ {
+ F32 yaw_radians = (F32)(x - mLastMouseX) * -0.01f;
+ F32 pitch_radians = (F32)(y - mLastMouseY) * 0.02f;
+
+ mModelPreview->rotate(yaw_radians, pitch_radians);
+ }
+ else
+ {
+
+ F32 yaw_radians = (F32)(x - mLastMouseX) * -0.01f;
+ F32 zoom_amt = (F32)(y - mLastMouseY) * 0.02f;
+
+ mModelPreview->rotate(yaw_radians, 0.f);
+ mModelPreview->zoom(zoom_amt);
+ }
+
+
+ mModelPreview->refresh();
+
+ LLUI::setMousePositionLocal(this, mLastMouseX, mLastMouseY);
+ }
+
+ if (!mPreviewRect.pointInRect(x, y) || !mModelPreview)
+ {
+ return LLFloater::handleHover(x, y, mask);
+ }
+ else if (local_mask == MASK_ORBIT)
+ {
+ gViewerWindow->setCursor(UI_CURSOR_TOOLCAMERA);
+ }
+ else if (local_mask == MASK_PAN)
+ {
+ gViewerWindow->setCursor(UI_CURSOR_TOOLPAN);
+ }
+ else
+ {
+ gViewerWindow->setCursor(UI_CURSOR_TOOLZOOMIN);
+ }
+
+ return TRUE;
+}
+
+//-----------------------------------------------------------------------------
+// handleScrollWheel()
+//-----------------------------------------------------------------------------
+BOOL LLFloaterModelPreview::handleScrollWheel(S32 x, S32 y, S32 clicks)
+{
+ if (mPreviewRect.pointInRect(x, y) && mModelPreview)
+ {
+ mModelPreview->zoom((F32)clicks * -0.2f);
+ mModelPreview->refresh();
+ }
+
+ return TRUE;
+}
+
+//static
+void LLFloaterModelPreview::onPhysicsParamCommit(LLUICtrl* ctrl, void* data)
+{
+ if (LLConvexDecomposition::getInstance() == NULL)
+ {
+ llinfos << "convex decomposition tool is a stub on this platform. cannot get decomp." << llendl;
+ return;
+ }
+
+ if (sInstance)
+ {
+ LLCDParam* param = (LLCDParam*) data;
+ std::string name(param->mName);
+ sInstance->mDecompParams[name] = ctrl->getValue();
+
+ if (name == "Simplify Method")
+ {
+ if (ctrl->getValue().asInteger() == 0)
+ {
+ sInstance->childSetVisible("Retain%", true);
+ sInstance->childSetVisible("Detail Scale", false);
+ }
+ else
+ {
+ sInstance->childSetVisible("Retain%", false);
+ sInstance->childSetVisible("Detail Scale", true);
+ }
+ }
+ }
+}
+
+//static
+void LLFloaterModelPreview::onPhysicsStageExecute(LLUICtrl* ctrl, void* data)
+{
+ LLCDStageData* stage_data = (LLCDStageData*) data;
+ std::string stage = stage_data->mName;
+
+ if (sInstance)
+ {
+ if (!sInstance->mCurRequest.empty())
+ {
+ llinfos << "Decomposition request still pending." << llendl;
+ return;
+ }
+
+ if (sInstance->mModelPreview)
+ {
+ for (S32 i = 0; i < sInstance->mModelPreview->mModel[LLModel::LOD_PHYSICS].size(); ++i)
+ {
+ LLModel* mdl = sInstance->mModelPreview->mModel[LLModel::LOD_PHYSICS][i];
+ DecompRequest* request = new DecompRequest(stage, mdl);
+ sInstance->mCurRequest.insert(request);
+ gMeshRepo.mDecompThread->submitRequest(request);
+ }
+ }
+
+ if (stage == "Decompose")
+ {
+ sInstance->setStatusMessage(sInstance->getString("decomposing"));
+ sInstance->childSetVisible("Decompose", false);
+ sInstance->childSetVisible("decompose_cancel", true);
+ }
+ else if (stage == "Simplify")
+ {
+ sInstance->setStatusMessage(sInstance->getString("simplifying"));
+ sInstance->childSetVisible("Simplify", false);
+ sInstance->childSetVisible("simplify_cancel", true);
+ }
+ }
+}
+
+//static
+void LLFloaterModelPreview::onPhysicsBrowse(LLUICtrl* ctrl, void* userdata)
+{
+ sInstance->loadModel(LLModel::LOD_PHYSICS);
+}
+
+//static
+void LLFloaterModelPreview::onPhysicsUseLOD(LLUICtrl* ctrl, void* userdata)
+{
+ S32 which_mode = 3;
+ LLCtrlSelectionInterface* iface = sInstance->childGetSelectionInterface("physics_lod_combo");
+ if (iface)
+ {
+ which_mode = iface->getFirstSelectedIndex();
+ }
+
+ sInstance->mModelPreview->setPhysicsFromLOD(which_mode);
+}
+
+//static
+void LLFloaterModelPreview::onCancel(LLUICtrl* ctrl, void* data)
+{
+ if (sInstance)
+ {
+ sInstance->closeFloater(false);
+ }
+}
+
+//static
+void LLFloaterModelPreview::onPhysicsStageCancel(LLUICtrl* ctrl, void*data)
+{
+ if (sInstance)
+ {
+ for (std::set<LLPointer<DecompRequest> >::iterator iter = sInstance->mCurRequest.begin();
+ iter != sInstance->mCurRequest.end(); ++iter)
+ {
+ DecompRequest* req = *iter;
+ req->mContinue = 0;
+ }
+
+ sInstance->mCurRequest.clear();
+ }
+}
+
+void LLFloaterModelPreview::initDecompControls()
+{
+ LLSD key;
+
+ childSetCommitCallback("simplify_cancel", onPhysicsStageCancel, NULL);
+ childSetCommitCallback("decompose_cancel", onPhysicsStageCancel, NULL);
+
+ childSetCommitCallback("physics_lod_combo", onPhysicsUseLOD, NULL);
+ childSetCommitCallback("physics_browse", onPhysicsBrowse, NULL);
+
+ static const LLCDStageData* stage = NULL;
+ static S32 stage_count = 0;
+
+ if (!stage && LLConvexDecomposition::getInstance() != NULL)
+ {
+ stage_count = LLConvexDecomposition::getInstance()->getStages(&stage);
+ }
+
+ static const LLCDParam* param = NULL;
+ static S32 param_count = 0;
+ if (!param && LLConvexDecomposition::getInstance() != NULL)
+ {
+ param_count = LLConvexDecomposition::getInstance()->getParameters(&param);
+ }
+
+ for (S32 j = stage_count-1; j >= 0; --j)
+ {
+ LLButton* button = getChild<LLButton>(stage[j].mName);
+ if (button)
+ {
+ button->setCommitCallback(onPhysicsStageExecute, (void*) &stage[j]);
+ }
+
+ gMeshRepo.mDecompThread->mStageID[stage[j].mName] = j;
+ // protected against stub by stage_count being 0 for stub above
+ LLConvexDecomposition::getInstance()->registerCallback(j, LLPhysicsDecomp::llcdCallback);
+
+ //llinfos << "Physics decomp stage " << stage[j].mName << " (" << j << ") parameters:" << llendl;
+ //llinfos << "------------------------------------" << llendl;
+
+ for (S32 i = 0; i < param_count; ++i)
+ {
+ if (param[i].mStage != j)
+ {
+ continue;
+ }
+
+ std::string name(param[i].mName ? param[i].mName : "");
+ std::string description(param[i].mDescription ? param[i].mDescription : "");
+
+ std::string type = "unknown";
+
+ llinfos << name << " - " << description << llendl;
+
+ if (param[i].mType == LLCDParam::LLCD_FLOAT)
+ {
+ mDecompParams[param[i].mName] = LLSD(param[i].mDefault.mFloat);
+ //llinfos << "Type: float, Default: " << param[i].mDefault.mFloat << llendl;
+
+ LLSliderCtrl* slider = getChild<LLSliderCtrl>(name);
+ if (slider)
+ {
+ slider->setMinValue(param[i].mDetails.mRange.mLow.mFloat);
+ slider->setMaxValue(param[i].mDetails.mRange.mHigh.mFloat);
+ slider->setIncrement(param[i].mDetails.mRange.mDelta.mFloat);
+ slider->setValue(param[i].mDefault.mFloat);
+ slider->setCommitCallback(onPhysicsParamCommit, (void*) &param[i]);
+ }
+ }
+ else if (param[i].mType == LLCDParam::LLCD_INTEGER)
+ {
+ mDecompParams[param[i].mName] = LLSD(param[i].mDefault.mIntOrEnumValue);
+ //llinfos << "Type: integer, Default: " << param[i].mDefault.mIntOrEnumValue << llendl;
+
+ LLSliderCtrl* slider = getChild<LLSliderCtrl>(name);
+ if (slider)
+ {
+ slider->setMinValue(param[i].mDetails.mRange.mLow.mIntOrEnumValue);
+ slider->setMaxValue(param[i].mDetails.mRange.mHigh.mIntOrEnumValue);
+ slider->setIncrement(param[i].mDetails.mRange.mDelta.mIntOrEnumValue);
+ slider->setValue(param[i].mDefault.mIntOrEnumValue);
+ slider->setCommitCallback(onPhysicsParamCommit, (void*) &param[i]);
+ }
+ }
+ else if (param[i].mType == LLCDParam::LLCD_BOOLEAN)
+ {
+ mDecompParams[param[i].mName] = LLSD(param[i].mDefault.mBool);
+ //llinfos << "Type: boolean, Default: " << (param[i].mDefault.mBool ? "True" : "False") << llendl;
+
+ LLCheckBoxCtrl* check_box = getChild<LLCheckBoxCtrl>(name);
+ if (check_box)
+ {
+ check_box->setValue(param[i].mDefault.mBool);
+ check_box->setCommitCallback(onPhysicsParamCommit, (void*) &param[i]);
+ }
+ }
+ else if (param[i].mType == LLCDParam::LLCD_ENUM)
+ {
+ mDecompParams[param[i].mName] = LLSD(param[i].mDefault.mIntOrEnumValue);
+ //llinfos << "Type: enum, Default: " << param[i].mDefault.mIntOrEnumValue << llendl;
+
+ { //plug into combo box
+
+ //llinfos << "Accepted values: " << llendl;
+ LLComboBox* combo_box = getChild<LLComboBox>(name);
+ for (S32 k = 0; k < param[i].mDetails.mEnumValues.mNumEnums; ++k)
+ {
+ //llinfos << param[i].mDetails.mEnumValues.mEnumsArray[k].mValue
+ // << " - " << param[i].mDetails.mEnumValues.mEnumsArray[k].mName << llendl;
+
+ combo_box->add(param[i].mDetails.mEnumValues.mEnumsArray[k].mName,
+ LLSD::Integer(param[i].mDetails.mEnumValues.mEnumsArray[k].mValue));
+ }
+ combo_box->setValue(param[i].mDefault.mIntOrEnumValue);
+ combo_box->setCommitCallback(onPhysicsParamCommit, (void*) &param[i]);
+ }
+
+ //llinfos << "----" << llendl;
+ }
+ //llinfos << "-----------------------------" << llendl;
+ }
+ }
+
+ childSetCommitCallback("physics_explode", LLFloaterModelPreview::onExplodeCommit, this);
+}
+
+//-----------------------------------------------------------------------------
+// onMouseCaptureLost()
+//-----------------------------------------------------------------------------
+// static
+void LLFloaterModelPreview::onMouseCaptureLostModelPreview(LLMouseHandler* handler)
+{
+ gViewerWindow->showCursor();
+}
+
+//-----------------------------------------------------------------------------
+// LLModelLoader
+//-----------------------------------------------------------------------------
+LLModelLoader::LLModelLoader( std::string filename, S32 lod, LLModelPreview* preview, JointTransformMap& jointMap,
+ std::deque<std::string>& jointsFromNodes )
+: mJointList( jointMap )
+, mJointsFromNode( jointsFromNodes )
+, LLThread("Model Loader"), mFilename(filename), mLod(lod), mPreview(preview), mFirstTransform(TRUE)
+{
+ mJointMap["mPelvis"] = "mPelvis";
+ mJointMap["mTorso"] = "mTorso";
+ mJointMap["mChest"] = "mChest";
+ mJointMap["mNeck"] = "mNeck";
+ mJointMap["mHead"] = "mHead";
+ mJointMap["mSkull"] = "mSkull";
+ mJointMap["mEyeRight"] = "mEyeRight";
+ mJointMap["mEyeLeft"] = "mEyeLeft";
+ mJointMap["mCollarLeft"] = "mCollarLeft";
+ mJointMap["mShoulderLeft"] = "mShoulderLeft";
+ mJointMap["mElbowLeft"] = "mElbowLeft";
+ mJointMap["mWristLeft"] = "mWristLeft";
+ mJointMap["mCollarRight"] = "mCollarRight";
+ mJointMap["mShoulderRight"] = "mShoulderRight";
+ mJointMap["mElbowRight"] = "mElbowRight";
+ mJointMap["mWristRight"] = "mWristRight";
+ mJointMap["mHipRight"] = "mHipRight";
+ mJointMap["mKneeRight"] = "mKneeRight";
+ mJointMap["mAnkleRight"] = "mAnkleRight";
+ mJointMap["mFootRight"] = "mFootRight";
+ mJointMap["mToeRight"] = "mToeRight";
+ mJointMap["mHipLeft"] = "mHipLeft";
+ mJointMap["mKneeLeft"] = "mKneeLeft";
+ mJointMap["mAnkleLeft"] = "mAnkleLeft";
+ mJointMap["mFootLeft"] = "mFootLeft";
+ mJointMap["mToeLeft"] = "mToeLeft";
+
+ mJointMap["avatar_mPelvis"] = "mPelvis";
+ mJointMap["avatar_mTorso"] = "mTorso";
+ mJointMap["avatar_mChest"] = "mChest";
+ mJointMap["avatar_mNeck"] = "mNeck";
+ mJointMap["avatar_mHead"] = "mHead";
+ mJointMap["avatar_mSkull"] = "mSkull";
+ mJointMap["avatar_mEyeRight"] = "mEyeRight";
+ mJointMap["avatar_mEyeLeft"] = "mEyeLeft";
+ mJointMap["avatar_mCollarLeft"] = "mCollarLeft";
+ mJointMap["avatar_mShoulderLeft"] = "mShoulderLeft";
+ mJointMap["avatar_mElbowLeft"] = "mElbowLeft";
+ mJointMap["avatar_mWristLeft"] = "mWristLeft";
+ mJointMap["avatar_mCollarRight"] = "mCollarRight";
+ mJointMap["avatar_mShoulderRight"] = "mShoulderRight";
+ mJointMap["avatar_mElbowRight"] = "mElbowRight";
+ mJointMap["avatar_mWristRight"] = "mWristRight";
+ mJointMap["avatar_mHipRight"] = "mHipRight";
+ mJointMap["avatar_mKneeRight"] = "mKneeRight";
+ mJointMap["avatar_mAnkleRight"] = "mAnkleRight";
+ mJointMap["avatar_mFootRight"] = "mFootRight";
+ mJointMap["avatar_mToeRight"] = "mToeRight";
+ mJointMap["avatar_mHipLeft"] = "mHipLeft";
+ mJointMap["avatar_mKneeLeft"] = "mKneeLeft";
+ mJointMap["avatar_mAnkleLeft"] = "mAnkleLeft";
+ mJointMap["avatar_mFootLeft"] = "mFootLeft";
+ mJointMap["avatar_mToeLeft"] = "mToeLeft";
+
+
+ mJointMap["hip"] = "mPelvis";
+ mJointMap["abdomen"] = "mTorso";
+ mJointMap["chest"] = "mChest";
+ mJointMap["neck"] = "mNeck";
+ mJointMap["head"] = "mHead";
+ mJointMap["figureHair"] = "mSkull";
+ mJointMap["lCollar"] = "mCollarLeft";
+ mJointMap["lShldr"] = "mShoulderLeft";
+ mJointMap["lForeArm"] = "mElbowLeft";
+ mJointMap["lHand"] = "mWristLeft";
+ mJointMap["rCollar"] = "mCollarRight";
+ mJointMap["rShldr"] = "mShoulderRight";
+ mJointMap["rForeArm"] = "mElbowRight";
+ mJointMap["rHand"] = "mWristRight";
+ mJointMap["rThigh"] = "mHipRight";
+ mJointMap["rShin"] = "mKneeRight";
+ mJointMap["rFoot"] = "mFootRight";
+ mJointMap["lThigh"] = "mHipLeft";
+ mJointMap["lShin"] = "mKneeLeft";
+ mJointMap["lFoot"] = "mFootLeft";
+
+ if (mPreview)
+ {
+ //only try to load from slm if viewer is configured to do so and this is the
+ //initial model load (not an LoD or physics shape)
+ mTrySLM = gSavedSettings.getBOOL("MeshImportUseSLM") && mPreview->mUploadData.empty();
+ mPreview->setLoadState(STARTING);
+ }
+ else
+ {
+ mTrySLM = false;
+ }
+
+ assert_main_thread();
+ sActiveLoaderList.push_back(this) ;
+}
+
+LLModelLoader::~LLModelLoader()
+{
+ assert_main_thread();
+ sActiveLoaderList.remove(this);
+}
+
+void stretch_extents(LLModel* model, LLMatrix4a& mat, LLVector4a& min, LLVector4a& max, BOOL& first_transform)
+{
+ LLVector4a box[] =
+ {
+ LLVector4a(-1, 1,-1),
+ LLVector4a(-1, 1, 1),
+ LLVector4a(-1,-1,-1),
+ LLVector4a(-1,-1, 1),
+ LLVector4a( 1, 1,-1),
+ LLVector4a( 1, 1, 1),
+ LLVector4a( 1,-1,-1),
+ LLVector4a( 1,-1, 1),
+ };
+
+ for (S32 j = 0; j < model->getNumVolumeFaces(); ++j)
+ {
+ const LLVolumeFace& face = model->getVolumeFace(j);
+
+ LLVector4a center;
+ center.setAdd(face.mExtents[0], face.mExtents[1]);
+ center.mul(0.5f);
+ LLVector4a size;
+ size.setSub(face.mExtents[1],face.mExtents[0]);
+ size.mul(0.5f);
+
+ for (U32 i = 0; i < 8; i++)
+ {
+ LLVector4a t;
+ t.setMul(size, box[i]);
+ t.add(center);
+
+ LLVector4a v;
+
+ mat.affineTransform(t, v);
+
+ if (first_transform)
+ {
+ first_transform = FALSE;
+ min = max = v;
+ }
+ else
+ {
+ update_min_max(min, max, v);
+ }
+ }
+ }
+}
+
+void stretch_extents(LLModel* model, LLMatrix4& mat, LLVector3& min, LLVector3& max, BOOL& first_transform)
+{
+ LLVector4a mina, maxa;
+ LLMatrix4a mata;
+
+ mata.loadu(mat);
+ mina.load3(min.mV);
+ maxa.load3(max.mV);
+
+ stretch_extents(model, mata, mina, maxa, first_transform);
+
+ min.set(mina.getF32ptr());
+ max.set(maxa.getF32ptr());
+}
+
+void LLModelLoader::run()
+{
+ if (!doLoadModel())
+ {
+ mPreview = NULL;
+ }
+
+ doOnIdleOneTime(boost::bind(&LLModelLoader::loadModelCallback,this));
+}
+
+bool LLModelLoader::doLoadModel()
+{
+ //first, look for a .slm file of the same name that was modified later
+ //than the .dae
+
+ if (mTrySLM)
+ {
+ std::string filename = mFilename;
+
+ std::string::size_type i = filename.rfind(".");
+ if (i != std::string::npos)
+ {
+ filename.replace(i, filename.size()-1, ".slm");
+ llstat slm_status;
+ if (LLFile::stat(filename, &slm_status) == 0)
+ { //slm file exists
+ llstat dae_status;
+ if (LLFile::stat(mFilename, &dae_status) != 0 ||
+ dae_status.st_mtime < slm_status.st_mtime)
+ {
+ if (loadFromSLM(filename))
+ { //slm successfully loaded, if this fails, fall through and
+ //try loading from dae
+
+ mLod = -1; //successfully loading from an slm implicitly sets all
+ //LoDs
+ return true;
+ }
+ }
+ }
+ }
+ }
+
+ //no suitable slm exists, load from the .dae file
+ DAE dae;
+ domCOLLADA* dom = dae.open(mFilename);
+
+ if (!dom)
+ {
+ return false;
+ }
+
+ daeDatabase* db = dae.getDatabase();
+
+ daeInt count = db->getElementCount(NULL, COLLADA_TYPE_MESH);
+
+ daeDocument* doc = dae.getDoc(mFilename);
+ if (!doc)
+ {
+ llwarns << "can't find internal doc" << llendl;
+ return false;
+ }
+
+ daeElement* root = doc->getDomRoot();
+ if (!root)
+ {
+ llwarns << "document has no root" << llendl;
+ return false;
+ }
+
+ //get unit scale
+ mTransform.setIdentity();
+
+ domAsset::domUnit* unit = daeSafeCast<domAsset::domUnit>(root->getDescendant(daeElement::matchType(domAsset::domUnit::ID())));
+
+ if (unit)
+ {
+ F32 meter = unit->getMeter();
+ mTransform.mMatrix[0][0] = meter;
+ mTransform.mMatrix[1][1] = meter;
+ mTransform.mMatrix[2][2] = meter;
+ }
+
+ //get up axis rotation
+ LLMatrix4 rotation;
+
+ domUpAxisType up = UPAXISTYPE_Y_UP; // default is Y_UP
+ domAsset::domUp_axis* up_axis =
+ daeSafeCast<domAsset::domUp_axis>(root->getDescendant(daeElement::matchType(domAsset::domUp_axis::ID())));
+
+ if (up_axis)
+ {
+ up = up_axis->getValue();
+ }
+
+ if (up == UPAXISTYPE_X_UP)
+ {
+ rotation.initRotation(0.0f, 90.0f * DEG_TO_RAD, 0.0f);
+ }
+ else if (up == UPAXISTYPE_Y_UP)
+ {
+ rotation.initRotation(90.0f * DEG_TO_RAD, 0.0f, 0.0f);
+ }
+
+ rotation *= mTransform;
+ mTransform = rotation;
+
+
+ for (daeInt idx = 0; idx < count; ++idx)
+ { //build map of domEntities to LLModel
+ domMesh* mesh = NULL;
+ db->getElement((daeElement**) &mesh, idx, NULL, COLLADA_TYPE_MESH);
+
+ if (mesh)
+ {
+ LLPointer<LLModel> model = LLModel::loadModelFromDomMesh(mesh);
+
+ if(model->getStatus() != LLModel::NO_ERRORS)
+ {
+ setLoadState(ERROR_PARSING + model->getStatus()) ;
+ return true ; //abort
+ }
+
+ if (model.notNull() && validate_model(model))
+ {
+ mModelList.push_back(model);
+ mModel[mesh] = model;
+ }
+ }
+ }
+
+ count = db->getElementCount(NULL, COLLADA_TYPE_SKIN);
+ for (daeInt idx = 0; idx < count; ++idx)
+ { //add skinned meshes as instances
+ domSkin* skin = NULL;
+ db->getElement((daeElement**) &skin, idx, NULL, COLLADA_TYPE_SKIN);
+
+ if (skin)
+ {
+ domGeometry* geom = daeSafeCast<domGeometry>(skin->getSource().getElement());
+
+ if (geom)
+ {
+ domMesh* mesh = geom->getMesh();
+ if (mesh)
+ {
+ LLModel* model = mModel[mesh];
+ if (model)
+ {
+ LLVector3 mesh_scale_vector;
+ LLVector3 mesh_translation_vector;
+ model->getNormalizedScaleTranslation(mesh_scale_vector, mesh_translation_vector);
+
+ LLMatrix4 normalized_transformation;
+ normalized_transformation.setTranslation(mesh_translation_vector);
+
+ LLMatrix4 mesh_scale;
+ mesh_scale.initScale(mesh_scale_vector);
+ mesh_scale *= normalized_transformation;
+ normalized_transformation = mesh_scale;
+
+ glh::matrix4f inv_mat((F32*) normalized_transformation.mMatrix);
+ inv_mat = inv_mat.inverse();
+ LLMatrix4 inverse_normalized_transformation(inv_mat.m);
+
+ domSkin::domBind_shape_matrix* bind_mat = skin->getBind_shape_matrix();
+
+ if (bind_mat)
+ { //get bind shape matrix
+ domFloat4x4& dom_value = bind_mat->getValue();
+
+ LLMeshSkinInfo& skin_info = model->mSkinInfo;
+
+ for (int i = 0; i < 4; i++)
+ {
+ for(int j = 0; j < 4; j++)
+ {
+ skin_info.mBindShapeMatrix.mMatrix[i][j] = dom_value[i + j*4];
+ }
+ }
+
+ LLMatrix4 trans = normalized_transformation;
+ trans *= skin_info.mBindShapeMatrix;
+ skin_info.mBindShapeMatrix = trans;
+
+ }
+
+
+ //Some collada setup for accessing the skeleton
+ daeElement* pElement = 0;
+ dae.getDatabase()->getElement( &pElement, 0, 0, "skeleton" );
+
+ //Try to get at the skeletal instance controller
+ domInstance_controller::domSkeleton* pSkeleton = daeSafeCast<domInstance_controller::domSkeleton>( pElement );
+ bool missingSkeletonOrScene = false;
+
+ //If no skeleton, do a breadth-first search to get at specific joints
+ bool rootNode = false;
+ bool skeletonWithNoRootNode = false;
+
+ //Need to test for a skeleton that does not have a root node
+ //This occurs when your instance controller does not have an associated scene
+ if ( pSkeleton )
+ {
+ daeElement* pSkeletonRootNode = pSkeleton->getValue().getElement();
+ if ( pSkeletonRootNode )
+ {
+ rootNode = true;
+ }
+ else
+ {
+ skeletonWithNoRootNode = true;
+ }
+
+ }
+ if ( !pSkeleton || !rootNode )
+ {
+ daeElement* pScene = root->getDescendant("visual_scene");
+ if ( !pScene )
+ {
+ llwarns<<"No visual scene - unable to parse bone offsets "<<llendl;
+ missingSkeletonOrScene = true;
+ }
+ else
+ {
+ //Get the children at this level
+ daeTArray< daeSmartRef<daeElement> > children = pScene->getChildren();
+ S32 childCount = children.getCount();
+
+ //Process any children that are joints
+ //Not all children are joints, some code be ambient lights, cameras, geometry etc..
+ for (S32 i = 0; i < childCount; ++i)
+ {
+ domNode* pNode = daeSafeCast<domNode>(children[i]);
+ if ( isNodeAJoint( pNode ) )
+ {
+ processJointNode( pNode, mJointList );
+ }
+ }
+ }
+ }
+ else
+ //Has Skeleton
+ {
+ //Get the root node of the skeleton
+ daeElement* pSkeletonRootNode = pSkeleton->getValue().getElement();
+ if ( pSkeletonRootNode )
+ {
+ //Once we have the root node - start acccessing it's joint components
+ const int jointCnt = mJointMap.size();
+ std::map<std::string, std::string> :: const_iterator jointIt = mJointMap.begin();
+
+ //Loop over all the possible joints within the .dae - using the allowed joint list in the ctor.
+ for ( int i=0; i<jointCnt; ++i, ++jointIt )
+ {
+ //Build a joint for the resolver to work with
+ char str[64]={0};
+ sprintf(str,"./%s",(*jointIt).second.c_str() );
+ //llwarns<<"Joint "<< str <<llendl;
+
+ //Setup the resolver
+ daeSIDResolver resolver( pSkeletonRootNode, str );
+
+ //Look for the joint
+ domNode* pJoint = daeSafeCast<domNode>( resolver.getElement() );
+ if ( pJoint )
+ {
+ //Pull out the translate id and store it in the jointTranslations map
+ daeSIDResolver jointResolver( pJoint, "./translate" );
+ domTranslate* pTranslate = daeSafeCast<domTranslate>( jointResolver.getElement() );
+
+ LLMatrix4 workingTransform;
+
+ //Translation via SID
+ if ( pTranslate )
+ {
+ extractTranslation( pTranslate, workingTransform );
+ }
+ else
+ {
+ //Translation via child from element
+ daeElement* pTranslateElement = getChildFromElement( pJoint, "translate" );
+ if ( pTranslateElement && pTranslateElement->typeID() != domTranslate::ID() )
+ {
+ llwarns<< "The found element is not a translate node" <<llendl;
+ missingSkeletonOrScene = true;
+ }
+ else
+ {
+ extractTranslationViaElement( pTranslateElement, workingTransform );
+ }
+ }
+
+ //Store the joint transform w/respect to it's name.
+ mJointList[(*jointIt).second.c_str()] = workingTransform;
+ }
+ }
+
+ //If anything failed in regards to extracting the skeleton, joints or translation id,
+ //mention it
+ if ( missingSkeletonOrScene )
+ {
+ llwarns<< "Partial jointmap found in asset - did you mean to just have a partial map?" << llendl;
+ }
+ }//got skeleton?
+ }
+
+
+ domSkin::domJoints* joints = skin->getJoints();
+
+ domInputLocal_Array& joint_input = joints->getInput_array();
+
+ for (size_t i = 0; i < joint_input.getCount(); ++i)
+ {
+ domInputLocal* input = joint_input.get(i);
+ xsNMTOKEN semantic = input->getSemantic();
+
+ if (strcmp(semantic, COMMON_PROFILE_INPUT_JOINT) == 0)
+ { //found joint source, fill model->mJointMap and model->mSkinInfo.mJointNames
+ daeElement* elem = input->getSource().getElement();
+
+ domSource* source = daeSafeCast<domSource>(elem);
+ if (source)
+ {
+
+
+ domName_array* names_source = source->getName_array();
+
+ if (names_source)
+ {
+ domListOfNames &names = names_source->getValue();
+
+ for (size_t j = 0; j < names.getCount(); ++j)
+ {
+ std::string name(names.get(j));
+ if (mJointMap.find(name) != mJointMap.end())
+ {
+ name = mJointMap[name];
+ }
+ model->mSkinInfo.mJointNames.push_back(name);
+ model->mSkinInfo.mJointMap[name] = j;
+ }
+ }
+ else
+ {
+ domIDREF_array* names_source = source->getIDREF_array();
+ if (names_source)
+ {
+ xsIDREFS& names = names_source->getValue();
+
+ for (size_t j = 0; j < names.getCount(); ++j)
+ {
+ std::string name(names.get(j).getID());
+ if (mJointMap.find(name) != mJointMap.end())
+ {
+ name = mJointMap[name];
+ }
+ model->mSkinInfo.mJointNames.push_back(name);
+ model->mSkinInfo.mJointMap[name] = j;
+ }
+ }
+ }
+ }
+ }
+ else if (strcmp(semantic, COMMON_PROFILE_INPUT_INV_BIND_MATRIX) == 0)
+ { //found inv_bind_matrix array, fill model->mInvBindMatrix
+ domSource* source = daeSafeCast<domSource>(input->getSource().getElement());
+ if (source)
+ {
+ domFloat_array* t = source->getFloat_array();
+ if (t)
+ {
+ domListOfFloats& transform = t->getValue();
+ S32 count = transform.getCount()/16;
+
+ for (S32 k = 0; k < count; ++k)
+ {
+ LLMatrix4 mat;
+
+ for (int i = 0; i < 4; i++)
+ {
+ for(int j = 0; j < 4; j++)
+ {
+ mat.mMatrix[i][j] = transform[k*16 + i + j*4];
+ }
+ }
+
+ 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
+ //a skinned asset attached to a node in a file that contains an entire skeleton,
+ //but does not use the skeleton).
+ buildJointToNodeMappingFromScene( root );
+ mPreview->critiqueRigForUploadApplicability( model->mSkinInfo.mJointNames );
+
+ if ( !missingSkeletonOrScene )
+ {
+ //Set the joint translations on the avatar - if it's a full mapping
+ //The joints are reset in the dtor
+ if ( mPreview->getRigWithSceneParity() )
+ {
+ std::map<std::string, std::string> :: const_iterator masterJointIt = mJointMap.begin();
+ std::map<std::string, std::string> :: const_iterator masterJointItEnd = mJointMap.end();
+ for (;masterJointIt!=masterJointItEnd;++masterJointIt )
+ {
+ std::string lookingForJoint = (*masterJointIt).first.c_str();
+
+ if ( mJointList.find( lookingForJoint ) != mJointList.end() )
+ {
+ //llinfos<<"joint "<<lookingForJoint.c_str()<<llendl;
+ LLMatrix4 jointTransform = mJointList[lookingForJoint];
+ LLJoint* pJoint = mPreview->getPreviewAvatar()->getJoint( lookingForJoint );
+ if ( pJoint )
+ {
+ pJoint->storeCurrentXform( jointTransform.getTranslation() );
+ }
+ else
+ {
+ //Most likely an error in the asset.
+ llwarns<<"Tried to apply joint position from .dae, but it did not exist in the avatar rig." << llendl;
+ }
+ }
+ }
+ }
+ } //missingSkeletonOrScene
+
+
+ //We need to construct the alternate bind matrix (which contains the new joint positions)
+ //in the same order as they were stored in the joint buffer. The joints associated
+ //with the skeleton are not stored in the same order as they are in the exported joint buffer.
+ //This remaps the skeletal joints to be in the same order as the joints stored in the model.
+ std::vector<std::string> :: const_iterator jointIt = model->mSkinInfo.mJointNames.begin();
+ const int jointCnt = model->mSkinInfo.mJointNames.size();
+ for ( int i=0; i<jointCnt; ++i, ++jointIt )
+ {
+ std::string lookingForJoint = (*jointIt).c_str();
+ //Look for the joint xform that we extracted from the skeleton, using the jointIt as the key
+ //and store it in the alternate bind matrix
+ if ( mJointList.find( lookingForJoint ) != mJointList.end() )
+ {
+ LLMatrix4 jointTransform = mJointList[lookingForJoint];
+ LLMatrix4 newInverse = model->mSkinInfo.mInvBindMatrix[i];
+ newInverse.setTranslation( mJointList[lookingForJoint].getTranslation() );
+ model->mSkinInfo.mAlternateBindMatrix.push_back( newInverse );
+ }
+ else
+ {
+ llwarns<<"Possibly misnamed/missing joint [" <<lookingForJoint.c_str()<<" ] "<<llendl;
+ }
+ }
+
+ //grab raw position array
+
+ domVertices* verts = mesh->getVertices();
+ if (verts)
+ {
+ domInputLocal_Array& inputs = verts->getInput_array();
+ for (size_t i = 0; i < inputs.getCount() && model->mPosition.empty(); ++i)
+ {
+ if (strcmp(inputs[i]->getSemantic(), COMMON_PROFILE_INPUT_POSITION) == 0)
+ {
+ domSource* pos_source = daeSafeCast<domSource>(inputs[i]->getSource().getElement());
+ if (pos_source)
+ {
+ domFloat_array* pos_array = pos_source->getFloat_array();
+ if (pos_array)
+ {
+ domListOfFloats& pos = pos_array->getValue();
+
+ for (size_t j = 0; j < pos.getCount(); j += 3)
+ {
+ if (pos.getCount() <= j+2)
+ {
+ llerrs << "WTF?" << llendl;
+ }
+
+ LLVector3 v(pos[j], pos[j+1], pos[j+2]);
+
+ //transform from COLLADA space to volume space
+ v = v * inverse_normalized_transformation;
+
+ model->mPosition.push_back(v);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ //grab skin weights array
+ domSkin::domVertex_weights* weights = skin->getVertex_weights();
+ if (weights)
+ {
+ domInputLocalOffset_Array& inputs = weights->getInput_array();
+ domFloat_array* vertex_weights = NULL;
+ for (size_t i = 0; i < inputs.getCount(); ++i)
+ {
+ if (strcmp(inputs[i]->getSemantic(), COMMON_PROFILE_INPUT_WEIGHT) == 0)
+ {
+ domSource* weight_source = daeSafeCast<domSource>(inputs[i]->getSource().getElement());
+ if (weight_source)
+ {
+ vertex_weights = weight_source->getFloat_array();
+ }
+ }
+ }
+
+ if (vertex_weights)
+ {
+ domListOfFloats& w = vertex_weights->getValue();
+ domListOfUInts& vcount = weights->getVcount()->getValue();
+ domListOfInts& v = weights->getV()->getValue();
+
+ U32 c_idx = 0;
+ for (size_t vc_idx = 0; vc_idx < vcount.getCount(); ++vc_idx)
+ { //for each vertex
+ daeUInt count = vcount[vc_idx];
+
+ //create list of weights that influence this vertex
+ LLModel::weight_list weight_list;
+
+ for (daeUInt i = 0; i < count; ++i)
+ { //for each weight
+ daeInt joint_idx = v[c_idx++];
+ daeInt weight_idx = v[c_idx++];
+
+ if (joint_idx == -1)
+ {
+ //ignore bindings to bind_shape_matrix
+ continue;
+ }
+
+ F32 weight_value = w[weight_idx];
+
+ weight_list.push_back(LLModel::JointWeight(joint_idx, weight_value));
+ }
+
+ //sort by joint weight
+ std::sort(weight_list.begin(), weight_list.end(), LLModel::CompareWeightGreater());
+
+ std::vector<LLModel::JointWeight> wght;
+
+ F32 total = 0.f;
+
+ for (U32 i = 0; i < llmin((U32) 4, (U32) weight_list.size()); ++i)
+ { //take up to 4 most significant weights
+ if (weight_list[i].mWeight > 0.f)
+ {
+ wght.push_back( weight_list[i] );
+ total += weight_list[i].mWeight;
+ }
+ }
+
+ F32 scale = 1.f/total;
+ if (scale != 1.f)
+ { //normalize weights
+ for (U32 i = 0; i < wght.size(); ++i)
+ {
+ wght[i].mWeight *= scale;
+ }
+ }
+
+ model->mSkinWeights[model->mPosition[vc_idx]] = wght;
+ }
+
+ //add instance to scene for this model
+
+ LLMatrix4 transformation = mTransform;
+ // adjust the transformation to compensate for mesh normalization
+
+ LLMatrix4 mesh_translation;
+ mesh_translation.setTranslation(mesh_translation_vector);
+ mesh_translation *= transformation;
+ transformation = mesh_translation;
+
+ LLMatrix4 mesh_scale;
+ mesh_scale.initScale(mesh_scale_vector);
+ mesh_scale *= transformation;
+ transformation = mesh_scale;
+
+ std::vector<LLImportMaterial> materials;
+ materials.resize(model->getNumVolumeFaces());
+ mScene[transformation].push_back(LLModelInstance(model, model->mLabel, transformation, materials));
+ stretch_extents(model, transformation, mExtents[0], mExtents[1], mFirstTransform);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ daeElement* scene = root->getDescendant("visual_scene");
+
+ if (!scene)
+ {
+ llwarns << "document has no visual_scene" << llendl;
+ setLoadState( ERROR_PARSING );
+ return false;
+ }
+ setLoadState( DONE );
+
+ processElement(scene);
+
+ return true;
+}
+
+void LLModelLoader::setLoadState(U32 state)
+{
+ if (mPreview)
+ {
+ mPreview->setLoadState(state);
+ }
+}
+
+bool LLModelLoader::loadFromSLM(const std::string& filename)
+{
+ //only need to populate mScene with data from slm
+ llstat stat;
+
+ if (LLFile::stat(filename, &stat))
+ { //file does not exist
+ return false;
+ }
+
+ S32 file_size = (S32) stat.st_size;
+
+ llifstream ifstream(filename, std::ifstream::in | std::ifstream::binary);
+ LLSD data;
+ LLSDSerialize::fromBinary(data, ifstream, file_size);
+ ifstream.close();
+
+ //build model list for each LoD
+ model_list model[LLModel::NUM_LODS];
+
+ LLSD& mesh = data["mesh"];
+
+ LLVolumeParams volume_params;
+ volume_params.setType(LL_PCODE_PROFILE_SQUARE, LL_PCODE_PATH_LINE);
+
+ for (S32 lod = 0; lod < LLModel::NUM_LODS; ++lod)
+ {
+ for (U32 i = 0; i < mesh.size(); ++i)
+ {
+ std::stringstream str(mesh[i].asString());
+ LLPointer<LLModel> loaded_model = new LLModel(volume_params, (F32) lod);
+ if (loaded_model->loadModel(str))
+ {
+ loaded_model->mLocalID = i;
+ model[lod].push_back(loaded_model);
+
+ if (lod == LLModel::LOD_HIGH && !loaded_model->mSkinInfo.mJointNames.empty())
+ {
+ //check to see if rig is valid
+ mPreview->critiqueRigForUploadApplicability( loaded_model->mSkinInfo.mJointNames );
+ }
+ }
+ else
+ {
+ llassert(model[lod].empty());
+ }
+ }
+ }
+
+ if (model[LLModel::LOD_HIGH].empty())
+ { //failed to load high lod
+ return false;
+ }
+
+ //load instance list
+ model_instance_list instance_list;
+
+ LLSD& instance = data["instance"];
+
+ for (U32 i = 0; i < instance.size(); ++i)
+ {
+ //deserialize instance list
+ instance_list.push_back(LLModelInstance(instance[i]));
+
+ //match up model instance pointers
+ S32 idx = instance_list[i].mLocalMeshID;
+
+ for (U32 lod = 0; lod < LLModel::NUM_LODS; ++lod)
+ {
+ if (!model[lod].empty())
+ {
+ instance_list[i].mLOD[lod] = model[lod][idx];
+ }
+ }
+
+ instance_list[i].mModel = model[LLModel::LOD_HIGH][idx];
+ }
+
+
+ //convert instance_list to mScene
+ mFirstTransform = TRUE;
+ for (U32 i = 0; i < instance_list.size(); ++i)
+ {
+ LLModelInstance& cur_instance = instance_list[i];
+ mScene[cur_instance.mTransform].push_back(cur_instance);
+ stretch_extents(cur_instance.mModel, cur_instance.mTransform, mExtents[0], mExtents[1], mFirstTransform);
+ }
+
+ setLoadState( DONE );
+
+ return true;
+}
+
+//static
+bool LLModelLoader::isAlive(LLModelLoader* loader)
+{
+ if(!loader)
+ {
+ return false ;
+ }
+
+ std::list<LLModelLoader*>::iterator iter = sActiveLoaderList.begin() ;
+ for(; iter != sActiveLoaderList.end() && (*iter) != loader; ++iter) ;
+
+ return *iter == loader ;
+}
+
+void LLModelLoader::loadModelCallback()
+{
+ assert_main_thread();
+
+ if (mPreview)
+ {
+ mPreview->loadModelCallback(mLod);
+ }
+
+ while (!isStopped())
+ { //wait until this thread is stopped before deleting self
+ apr_sleep(100);
+ }
+
+ //doubel check if "this" is valid before deleting it, in case it is aborted during running.
+ if(!isAlive(this))
+ {
+ return ;
+ }
+
+ //cleanup model loader
+ if (mPreview)
+ {
+ mPreview->mModelLoader = NULL;
+ }
+
+ delete this;
+}
+//-----------------------------------------------------------------------------
+// buildJointToNodeMappingFromScene()
+//-----------------------------------------------------------------------------
+void LLModelLoader::buildJointToNodeMappingFromScene( daeElement* pRoot )
+{
+ daeElement* pScene = pRoot->getDescendant("visual_scene");
+ if ( pScene )
+ {
+ daeTArray< daeSmartRef<daeElement> > children = pScene->getChildren();
+ S32 childCount = children.getCount();
+ for (S32 i = 0; i < childCount; ++i)
+ {
+ domNode* pNode = daeSafeCast<domNode>(children[i]);
+ processJointToNodeMapping( pNode );
+ }
+ }
+}
+//-----------------------------------------------------------------------------
+// processJointToNodeMapping()
+//-----------------------------------------------------------------------------
+void LLModelLoader::processJointToNodeMapping( domNode* pNode )
+{
+ if ( isNodeAJoint( pNode ) )
+ {
+ //1.Store the parent
+ std::string nodeName = pNode->getName();
+ if ( !nodeName.empty() )
+ {
+ 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)
+ {
+ domNode* pChildNode = daeSafeCast<domNode>( childOfChild[i] );
+ if ( pChildNode )
+ {
+ processJointToNodeMapping( pChildNode );
+ }
+ }
+ }
+}
+
+//-----------------------------------------------------------------------------
+// critiqueRigForUploadApplicability()
+//-----------------------------------------------------------------------------
+void LLModelPreview::critiqueRigForUploadApplicability( const std::vector<std::string> &jointListFromAsset )
+{
+ critiqueJointToNodeMappingFromScene();
+
+ //Determines the following use cases for a rig:
+ //1. It is suitable for upload with skin weights & joint positions, or
+ //2. It is suitable for upload as standard av with just skin weights
+
+ bool isJointPositionUploadOK = isRigSuitableForJointPositionUpload( jointListFromAsset );
+ bool isRigLegacyOK = isRigLegacy( jointListFromAsset );
+
+ //It's OK that both could end up being true, both default to false
+ if ( isJointPositionUploadOK )
+ {
+ setRigValidForJointPositionUpload( true );
+ }
+
+ if ( isRigLegacyOK )
+ {
+ setLegacyRigValid( true );
+ }
+
+ if ( getRigWithSceneParity() && isJointPositionUploadOK )
+ {
+ setResetJointFlag( true );
+ }
+}
+//-----------------------------------------------------------------------------
+// critiqueJointToNodeMappingFromScene()
+//-----------------------------------------------------------------------------
+void LLModelPreview::critiqueJointToNodeMappingFromScene( void )
+{
+ //Do the actual nodes back the joint listing from the dae?
+ //if yes then this is a fully rigged asset, otherwise it's just a partial rig
+
+ std::deque<std::string>::iterator jointsFromNodeIt = mJointsFromNode.begin();
+ std::deque<std::string>::iterator jointsFromNodeEndIt = mJointsFromNode.end();
+ bool result = true;
+
+ if ( !mJointsFromNode.empty() )
+ {
+ for ( ;jointsFromNodeIt!=jointsFromNodeEndIt;++jointsFromNodeIt )
+ {
+ std::string name = *jointsFromNodeIt;
+ if ( mJointTransformMap.find( name ) != mJointTransformMap.end() )
+ {
+ continue;
+ }
+ else
+ {
+ llinfos<<"critiqueJointToNodeMappingFromScene is missing a: "<<name<<llendl;
+ result = false;
+ }
+ }
+ }
+ else
+ {
+ result = false;
+ }
+
+ //Determines the following use cases for a rig:
+ //1. Full av rig w/1-1 mapping from the scene and joint array
+ //2. Partial rig but w/o parity between the scene and joint array
+ if ( result )
+ {
+ setResetJointFlag( true );
+ setRigWithSceneParity( true );
+ }
+ else
+ {
+ setResetJointFlag( false );
+ }
+}
+//-----------------------------------------------------------------------------
+// isRigLegacy()
+//-----------------------------------------------------------------------------
+bool LLModelPreview::isRigLegacy( const std::vector<std::string> &jointListFromAsset )
+{
+ //No joints in asset
+ if ( jointListFromAsset.size() == 0 )
+ {
+ return false;
+ }
+
+ bool result = false;
+
+ std::deque<std::string> :: const_iterator masterJointIt = mMasterLegacyJointList.begin();
+ std::deque<std::string> :: const_iterator masterJointEndIt = mMasterLegacyJointList.end();
+
+ std::vector<std::string> :: const_iterator modelJointIt = jointListFromAsset.begin();
+ std::vector<std::string> :: const_iterator modelJointItEnd = jointListFromAsset.end();
+
+ for ( ;masterJointIt!=masterJointEndIt;++masterJointIt )
+ {
+ result = false;
+ modelJointIt = jointListFromAsset.begin();
+
+ for ( ;modelJointIt!=modelJointItEnd; ++modelJointIt )
+ {
+ if ( *masterJointIt == *modelJointIt )
+ {
+ result = true;
+ break;
+ }
+ }
+ if ( !result )
+ {
+ llinfos<<" Asset did not contain the joint (if you're u/l a fully rigged asset w/joint positions - it is required)." << *masterJointIt<< llendl;
+ break;
+ }
+ }
+ return result;
+}
+//-----------------------------------------------------------------------------
+// isRigSuitableForJointPositionUpload()
+//-----------------------------------------------------------------------------
+bool LLModelPreview::isRigSuitableForJointPositionUpload( const std::vector<std::string> &jointListFromAsset )
+{
+ bool result = false;
+
+ std::deque<std::string> :: const_iterator masterJointIt = mMasterJointList.begin();
+ std::deque<std::string> :: const_iterator masterJointEndIt = mMasterJointList.end();
+
+ std::vector<std::string> :: const_iterator modelJointIt = jointListFromAsset.begin();
+ std::vector<std::string> :: const_iterator modelJointItEnd = jointListFromAsset.end();
+
+ for ( ;masterJointIt!=masterJointEndIt;++masterJointIt )
+ {
+ result = false;
+ modelJointIt = jointListFromAsset.begin();
+
+ for ( ;modelJointIt!=modelJointItEnd; ++modelJointIt )
+ {
+ if ( *masterJointIt == *modelJointIt )
+ {
+ result = true;
+ break;
+ }
+ }
+ if ( !result )
+ {
+ llinfos<<" Asset did not contain the joint (if you're u/l a fully rigged asset w/joint positions - it is required)." << *masterJointIt<< llendl;
+ break;
+ }
+ }
+ return result;
+}
+
+
+//called in the main thread
+void LLModelLoader::loadTextures()
+{
+ BOOL is_paused = isPaused() ;
+ pause() ; //pause the loader
+
+ for(scene::iterator iter = mScene.begin(); iter != mScene.end(); ++iter)
+ {
+ for(U32 i = 0 ; i < iter->second.size(); i++)
+ {
+ for(U32 j = 0 ; j < iter->second[i].mMaterial.size() ; j++)
+ {
+ if(!iter->second[i].mMaterial[j].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();
+ }
+ }
+ }
+ }
+
+ if(!is_paused)
+ {
+ unpause() ;
+ }
+}
+
+//-----------------------------------------------------------------------------
+// isNodeAJoint()
+//-----------------------------------------------------------------------------
+bool LLModelLoader::isNodeAJoint( domNode* pNode )
+{
+ if ( !pNode || pNode->getName() == NULL)
+ {
+ return false;
+ }
+
+ if ( mJointMap.find( pNode->getName() ) != mJointMap.end() )
+ {
+ return true;
+ }
+
+ return false;
+}
+
+//-----------------------------------------------------------------------------
+// extractTranslation()
+//-----------------------------------------------------------------------------
+void LLModelLoader::extractTranslation( domTranslate* pTranslate, LLMatrix4& transform )
+{
+ domFloat3 jointTrans = pTranslate->getValue();
+ LLVector3 singleJointTranslation( jointTrans[0], jointTrans[1], jointTrans[2] );
+ transform.setTranslation( singleJointTranslation );
+}
+//-----------------------------------------------------------------------------
+// extractTranslationViaElement()
+//-----------------------------------------------------------------------------
+void LLModelLoader::extractTranslationViaElement( daeElement* pTranslateElement, LLMatrix4& transform )
+{
+ domTranslate* pTranslateChild = dynamic_cast<domTranslate*>( pTranslateElement );
+ domFloat3 translateChild = pTranslateChild->getValue();
+ LLVector3 singleJointTranslation( translateChild[0], translateChild[1], translateChild[2] );
+ transform.setTranslation( singleJointTranslation );
+}
+//-----------------------------------------------------------------------------
+// processJointNode()
+//-----------------------------------------------------------------------------
+void LLModelLoader::processJointNode( domNode* pNode, JointTransformMap& jointTransforms )
+{
+ if (pNode->getName() == NULL)
+ {
+ llwarns << "nameless node, can't process" << llendl;
+ return;
+ }
+
+ //llwarns<<"ProcessJointNode# Node:" <<pNode->getName()<<llendl;
+
+ //1. handle the incoming node - extract out translation via SID or element
+
+ LLMatrix4 workingTransform;
+
+ //Pull out the translate id and store it in the jointTranslations map
+ daeSIDResolver jointResolver( pNode, "./translate" );
+ domTranslate* pTranslate = daeSafeCast<domTranslate>( jointResolver.getElement() );
+
+ //Translation via SID was successful
+ if ( pTranslate )
+ {
+ extractTranslation( pTranslate, workingTransform );
+ }
+ else
+ {
+ //Translation via child from element
+ daeElement* pTranslateElement = getChildFromElement( pNode, "translate" );
+ if ( !pTranslateElement || pTranslateElement->typeID() != domTranslate::ID() )
+ {
+ //llwarns<< "The found element is not a translate node" <<llendl;
+ daeSIDResolver jointResolver( pNode, "./matrix" );
+ domMatrix* pMatrix = daeSafeCast<domMatrix>( jointResolver.getElement() );
+ if ( pMatrix )
+ {
+ //llinfos<<"A matrix SID was however found!"<<llendl;
+ domFloat4x4 domArray = pMatrix->getValue();
+ for ( int i = 0; i < 4; i++ )
+ {
+ for( int j = 0; j < 4; j++ )
+ {
+ workingTransform.mMatrix[i][j] = domArray[i + j*4];
+ }
+ }
+ }
+ else
+ {
+ llwarns<< "The found element is not translate or matrix node - most likely a corrupt export!" <<llendl;
+ }
+ }
+ else
+ {
+ extractTranslationViaElement( pTranslateElement, workingTransform );
+ }
+ }
+
+ //Store the working transform relative to the nodes name.
+ jointTransforms[ pNode->getName() ] = workingTransform;
+
+ //2. handle the nodes children
+
+ //Gather and handle the incoming nodes children
+ daeTArray< daeSmartRef<daeElement> > childOfChild = pNode->getChildren();
+ S32 childOfChildCount = childOfChild.getCount();
+
+ for (S32 i = 0; i < childOfChildCount; ++i)
+ {
+ domNode* pChildNode = daeSafeCast<domNode>( childOfChild[i] );
+ if ( pChildNode )
+ {
+ processJointNode( pChildNode, jointTransforms );
+ }
+ }
+}
+//-----------------------------------------------------------------------------
+// getChildFromElement()
+//-----------------------------------------------------------------------------
+daeElement* LLModelLoader::getChildFromElement( daeElement* pElement, std::string const & name )
+{
+ daeElement* pChildOfElement = pElement->getChild( name.c_str() );
+ if ( pChildOfElement )
+ {
+ return pChildOfElement;
+ }
+ llwarns<< "Could not find a child [" << name << "] for the element: \"" << pElement->getAttribute("id") << "\"" << llendl;
+ return NULL;
+}
+
+void LLModelLoader::processElement(daeElement* element)
+{
+ LLMatrix4 saved_transform = mTransform;
+
+ domTranslate* translate = daeSafeCast<domTranslate>(element);
+ if (translate)
+ {
+ domFloat3 dom_value = translate->getValue();
+
+ LLMatrix4 translation;
+ translation.setTranslation(LLVector3(dom_value[0], dom_value[1], dom_value[2]));
+
+ translation *= mTransform;
+ mTransform = translation;
+ }
+
+ domRotate* rotate = daeSafeCast<domRotate>(element);
+ if (rotate)
+ {
+ domFloat4 dom_value = rotate->getValue();
+
+ LLMatrix4 rotation;
+ rotation.initRotTrans(dom_value[3] * DEG_TO_RAD, LLVector3(dom_value[0], dom_value[1], dom_value[2]), LLVector3(0, 0, 0));
+
+ rotation *= mTransform;
+ mTransform = rotation;
+ }
+
+ domScale* scale = daeSafeCast<domScale>(element);
+ if (scale)
+ {
+ domFloat3 dom_value = scale->getValue();
+
+ LLMatrix4 scaling;
+ scaling.initScale(LLVector3(dom_value[0], dom_value[1], dom_value[2]));
+
+ scaling *= mTransform;
+ mTransform = scaling;
+ }
+
+ domMatrix* matrix = daeSafeCast<domMatrix>(element);
+ if (matrix)
+ {
+ domFloat4x4 dom_value = matrix->getValue();
+
+ LLMatrix4 matrix_transform;
+
+ for (int i = 0; i < 4; i++)
+ {
+ for(int j = 0; j < 4; j++)
+ {
+ matrix_transform.mMatrix[i][j] = dom_value[i + j*4];
+ }
+ }
+
+ matrix_transform *= mTransform;
+ mTransform = matrix_transform;
+ }
+
+ domInstance_geometry* instance_geo = daeSafeCast<domInstance_geometry>(element);
+ if (instance_geo)
+ {
+ domGeometry* geo = daeSafeCast<domGeometry>(instance_geo->getUrl().getElement());
+ if (geo)
+ {
+ domMesh* mesh = daeSafeCast<domMesh>(geo->getDescendant(daeElement::matchType(domMesh::ID())));
+ if (mesh)
+ {
+ LLModel* model = mModel[mesh];
+ if (model)
+ {
+ LLMatrix4 transformation = mTransform;
+
+ std::vector<LLImportMaterial> materials = getMaterials(model, instance_geo);
+
+ // adjust the transformation to compensate for mesh normalization
+ LLVector3 mesh_scale_vector;
+ LLVector3 mesh_translation_vector;
+ model->getNormalizedScaleTranslation(mesh_scale_vector, mesh_translation_vector);
+
+ LLMatrix4 mesh_translation;
+ mesh_translation.setTranslation(mesh_translation_vector);
+ mesh_translation *= transformation;
+ transformation = mesh_translation;
+
+ LLMatrix4 mesh_scale;
+ mesh_scale.initScale(mesh_scale_vector);
+ mesh_scale *= transformation;
+ transformation = mesh_scale;
+
+ std::string label = getElementLabel(instance_geo);
+ mScene[transformation].push_back(LLModelInstance(model, label, transformation, materials));
+
+ stretch_extents(model, transformation, mExtents[0], mExtents[1], mFirstTransform);
+ }
+ }
+ }
+ }
+
+ domInstance_node* instance_node = daeSafeCast<domInstance_node>(element);
+ if (instance_node)
+ {
+ daeElement* instance = instance_node->getUrl().getElement();
+ if (instance)
+ {
+ processElement(instance);
+ }
+ }
+
+ //process children
+ daeTArray< daeSmartRef<daeElement> > children = element->getChildren();
+ for (S32 i = 0; i < children.getCount(); i++)
+ {
+ processElement(children[i]);
+ }
+
+ domNode* node = daeSafeCast<domNode>(element);
+ if (node)
+ { //this element was a node, restore transform before processiing siblings
+ mTransform = saved_transform;
+ }
+}
+
+std::vector<LLImportMaterial> LLModelLoader::getMaterials(LLModel* model, domInstance_geometry* instance_geo)
+{
+ std::vector<LLImportMaterial> materials;
+ for (int i = 0; i < model->mMaterialList.size(); i++)
+ {
+ LLImportMaterial import_material;
+
+ domInstance_material* instance_mat = NULL;
+
+ domBind_material::domTechnique_common* technique =
+ daeSafeCast<domBind_material::domTechnique_common>(instance_geo->getDescendant(daeElement::matchType(domBind_material::domTechnique_common::ID())));
+
+ if (technique)
+ {
+ daeTArray< daeSmartRef<domInstance_material> > inst_materials = technique->getChildrenByType<domInstance_material>();
+ for (int j = 0; j < inst_materials.getCount(); j++)
+ {
+ std::string symbol(inst_materials[j]->getSymbol());
+
+ if (symbol == model->mMaterialList[i]) // found the binding
+ {
+ instance_mat = inst_materials[j];
+ }
+ }
+ }
+
+ if (instance_mat)
+ {
+ domMaterial* material = daeSafeCast<domMaterial>(instance_mat->getTarget().getElement());
+ if (material)
+ {
+ domInstance_effect* instance_effect =
+ daeSafeCast<domInstance_effect>(material->getDescendant(daeElement::matchType(domInstance_effect::ID())));
+ if (instance_effect)
+ {
+ domEffect* effect = daeSafeCast<domEffect>(instance_effect->getUrl().getElement());
+ if (effect)
+ {
+ domProfile_COMMON* profile =
+ daeSafeCast<domProfile_COMMON>(effect->getDescendant(daeElement::matchType(domProfile_COMMON::ID())));
+ if (profile)
+ {
+ import_material = profileToMaterial(profile);
+ }
+ }
+ }
+ }
+ }
+
+ materials.push_back(import_material);
+ }
+
+ return materials;
+}
+
+LLImportMaterial LLModelLoader::profileToMaterial(domProfile_COMMON* material)
+{
+ LLImportMaterial mat;
+ mat.mFullbright = FALSE;
+
+ daeElement* diffuse = material->getDescendant("diffuse");
+ if (diffuse)
+ {
+ domCommon_color_or_texture_type_complexType::domTexture* texture =
+ daeSafeCast<domCommon_color_or_texture_type_complexType::domTexture>(diffuse->getDescendant("texture"));
+ if (texture)
+ {
+ domCommon_newparam_type_Array newparams = material->getNewparam_array();
+ for (S32 i = 0; i < newparams.getCount(); i++)
+ {
+ domFx_surface_common* surface = newparams[i]->getSurface();
+ if (surface)
+ {
+ domFx_surface_init_common* init = surface->getFx_surface_init_common();
+ if (init)
+ {
+ domFx_surface_init_from_common_Array init_from = init->getInit_from_array();
+
+ if (init_from.getCount() > i)
+ {
+ domImage* image = daeSafeCast<domImage>(init_from[i]->getValue().getElement());
+ if (image)
+ {
+ // we only support init_from now - embedded data will come later
+ domImage::domInit_from* init = image->getInit_from();
+ if (init)
+ {
+ mat.mDiffuseMapFilename = cdom::uriToNativePath(init->getValue().str());
+ mat.mDiffuseMapLabel = getElementLabel(material);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ domCommon_color_or_texture_type_complexType::domColor* color =
+ daeSafeCast<domCommon_color_or_texture_type_complexType::domColor>(diffuse->getDescendant("color"));
+ if (color)
+ {
+ domFx_color_common domfx_color = color->getValue();
+ LLColor4 value = LLColor4(domfx_color[0], domfx_color[1], domfx_color[2], domfx_color[3]);
+ mat.mDiffuseColor = value;
+ }
+ }
+
+ daeElement* emission = material->getDescendant("emission");
+ if (emission)
+ {
+ LLColor4 emission_color = getDaeColor(emission);
+ if (((emission_color[0] + emission_color[1] + emission_color[2]) / 3.0) > 0.25)
+ {
+ mat.mFullbright = TRUE;
+ }
+ }
+
+ return mat;
+}
+
+// try to get a decent label for this element
+std::string LLModelLoader::getElementLabel(daeElement *element)
+{
+ // if we have a name attribute, use it
+ std::string name = element->getAttribute("name");
+ if (name.length())
+ {
+ return name;
+ }
+
+ // if we have an ID attribute, use it
+ if (element->getID())
+ {
+ return std::string(element->getID());
+ }
+
+ // if we have a parent, use it
+ daeElement* parent = element->getParent();
+ if (parent)
+ {
+ // if parent has a name, use it
+ std::string name = parent->getAttribute("name");
+ if (name.length())
+ {
+ return name;
+ }
+
+ // if parent has an ID, use it
+ if (parent->getID())
+ {
+ return std::string(parent->getID());
+ }
+ }
+
+ // try to use our type
+ daeString element_name = element->getElementName();
+ if (element_name)
+ {
+ return std::string(element_name);
+ }
+
+ // if all else fails, use "object"
+ return std::string("object");
+}
+
+LLColor4 LLModelLoader::getDaeColor(daeElement* element)
+{
+ LLColor4 value;
+ domCommon_color_or_texture_type_complexType::domColor* color =
+ daeSafeCast<domCommon_color_or_texture_type_complexType::domColor>(element->getDescendant("color"));
+ if (color)
+ {
+ domFx_color_common domfx_color = color->getValue();
+ value = LLColor4(domfx_color[0], domfx_color[1], domfx_color[2], domfx_color[3]);
+ }
+
+ return value;
+}
+
+//-----------------------------------------------------------------------------
+// LLModelPreview
+//-----------------------------------------------------------------------------
+
+LLModelPreview::LLModelPreview(S32 width, S32 height, LLFloater* fmp)
+: LLViewerDynamicTexture(width, height, 3, ORDER_MIDDLE, FALSE), LLMutex(NULL)
+, mPelvisZOffset( 0.0f )
+, mLegacyRigValid( false )
+, mRigValidJointUpload( false )
+, mResetJoints( false )
+, mRigParityWithScene( false )
+, mLastJointUpdate( false )
+{
+ mNeedsUpdate = TRUE;
+ mCameraDistance = 0.f;
+ mCameraYaw = 0.f;
+ mCameraPitch = 0.f;
+ mCameraZoom = 1.f;
+ mTextureName = 0;
+ mPreviewLOD = 0;
+ mModelLoader = NULL;
+ mMaxTriangleLimit = 0;
+ mDirty = false;
+ mGenLOD = false;
+ mLoading = false;
+ mLoadState = LLModelLoader::STARTING;
+ mGroup = 0;
+ mLODFrozen = false;
+ mBuildShareTolerance = 0.f;
+ mBuildQueueMode = GLOD_QUEUE_GREEDY;
+ mBuildBorderMode = GLOD_BORDER_UNLOCK;
+ mBuildOperator = GLOD_OPERATOR_EDGE_COLLAPSE;
+
+ for (U32 i = 0; i < LLModel::NUM_LODS; ++i)
+ {
+ mRequestedTriangleCount[i] = 0;
+ mRequestedCreaseAngle[i] = -1.f;
+ mRequestedLoDMode[i] = 0;
+ mRequestedErrorThreshold[i] = 0.f;
+ mRequestedBuildOperator[i] = 0;
+ mRequestedQueueMode[i] = 0;
+ mRequestedBorderMode[i] = 0;
+ mRequestedShareTolerance[i] = 0.f;
+ }
+
+ mViewOption["show_textures"] = false;
+
+ mFMP = fmp;
+
+ mHasPivot = false;
+ mModelPivot = LLVector3( 0.0f, 0.0f, 0.0f );
+
+ glodInit();
+
+ //move into joint mapper class
+ //1. joints for joint offset verification
+ mMasterJointList.push_front("mPelvis");
+ mMasterJointList.push_front("mTorso");
+ mMasterJointList.push_front("mChest");
+ mMasterJointList.push_front("mNeck");
+ mMasterJointList.push_front("mHead");
+ mMasterJointList.push_front("mCollarLeft");
+ mMasterJointList.push_front("mShoulderLeft");
+ mMasterJointList.push_front("mElbowLeft");
+ mMasterJointList.push_front("mWristLeft");
+ mMasterJointList.push_front("mCollarRight");
+ mMasterJointList.push_front("mShoulderRight");
+ mMasterJointList.push_front("mElbowRight");
+ mMasterJointList.push_front("mWristRight");
+ mMasterJointList.push_front("mHipRight");
+ mMasterJointList.push_front("mKneeRight");
+ mMasterJointList.push_front("mFootRight");
+ mMasterJointList.push_front("mHipLeft");
+ mMasterJointList.push_front("mKneeLeft");
+ mMasterJointList.push_front("mFootLeft");
+ //2. legacy joint list - used to verify rigs that will not be using joint offsets
+ mMasterLegacyJointList.push_front("mPelvis");
+ mMasterLegacyJointList.push_front("mTorso");
+ mMasterLegacyJointList.push_front("mChest");
+ mMasterLegacyJointList.push_front("mNeck");
+ mMasterLegacyJointList.push_front("mHead");
+ mMasterLegacyJointList.push_front("mHipRight");
+ mMasterLegacyJointList.push_front("mKneeRight");
+ mMasterLegacyJointList.push_front("mFootRight");
+ mMasterLegacyJointList.push_front("mHipLeft");
+ mMasterLegacyJointList.push_front("mKneeLeft");
+ mMasterLegacyJointList.push_front("mFootLeft");
+
+ createPreviewAvatar();
+}
+
+LLModelPreview::~LLModelPreview()
+{
+ if (mModelLoader)
+ {
+ delete mModelLoader;
+ mModelLoader = NULL;
+ }
+ //*HACK : *TODO : turn this back on when we understand why this crashes
+ //glodShutdown();
+}
+
+U32 LLModelPreview::calcResourceCost()
+{
+ assert_main_thread();
+
+ rebuildUploadData();
+
+ if (mFMP && mModelLoader)
+ {
+ if ( getLoadState() < LLModelLoader::ERROR_PARSING )
+ {
+ mFMP->childEnable("ok_btn");
+ }
+ }
+
+ //Upload skin is selected BUT check to see if the joints coming in from the asset were malformed.
+ if ( mFMP && mFMP->childGetValue("upload_skin").asBoolean() )
+ {
+ bool uploadingJointPositions = mFMP->childGetValue("upload_joints").asBoolean();
+ 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;
+
+ F32 debug_scale = mFMP ? mFMP->childGetValue("import_scale").asReal() : 1.f;
+ mPelvisZOffset = mFMP ? mFMP->childGetValue("pelvis_offset").asReal() : 3.0f;
+
+ if ( mFMP && mFMP->childGetValue("upload_joints").asBoolean() )
+ {
+ getPreviewAvatar()->setPelvisOffset( mPelvisZOffset );
+ }
+
+ F32 streaming_cost = 0.f;
+ F32 physics_cost = 0.f;
+ for (U32 i = 0; i < mUploadData.size(); ++i)
+ {
+ LLModelInstance& instance = mUploadData[i];
+
+ if (accounted.find(instance.mModel) == accounted.end())
+ {
+ accounted.insert(instance.mModel);
+
+ LLModel::Decomposition& decomp =
+ instance.mLOD[LLModel::LOD_PHYSICS] ?
+ instance.mLOD[LLModel::LOD_PHYSICS]->mPhysics :
+ instance.mModel->mPhysics;
+
+ //update instance skin info for each lods pelvisZoffset
+ for ( int j=0; j<LLModel::NUM_LODS; ++j )
+ {
+ if ( instance.mLOD[j] )
+ {
+ instance.mLOD[j]->mSkinInfo.mPelvisOffset = mPelvisZOffset;
+ }
+ }
+
+ std::stringstream ostr;
+ LLSD ret = LLModel::writeModel(ostr,
+ instance.mLOD[4],
+ instance.mLOD[3],
+ instance.mLOD[2],
+ instance.mLOD[1],
+ instance.mLOD[0],
+ decomp,
+ 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)
+ {
+ num_points += decomp.mHull[i].size();
+ }
+
+ //calculate streaming cost
+ LLMatrix4 transformation = instance.mTransform;
+
+ LLVector3 position = LLVector3(0, 0, 0) * transformation;
+
+ 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);
+
+ F32 radius = scale.length()*debug_scale;
+
+ streaming_cost += LLMeshRepository::getStreamingCost(ret, radius);
+ }
+ }
+
+ F32 scale = mFMP ? mFMP->childGetValue("import_scale").asReal()*2.f : 2.f;
+
+ mDetailsSignal(mPreviewScale[0]*scale, mPreviewScale[1]*scale, mPreviewScale[2]*scale, streaming_cost, physics_cost);
+
+ updateStatusMessages();
+
+ return cost;
+}
+
+void LLFloaterModelPreview::setDetails(F32 x, F32 y, F32 z, F32 streaming_cost, F32 physics_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));
+}
+
+
+void LLModelPreview::rebuildUploadData()
+{
+ assert_main_thread();
+
+ mUploadData.clear();
+ mTextureSet.clear();
+
+ //fill uploaddata instance vectors from scene data
+
+ std::string requested_name = mFMP->getChild<LLUICtrl>("description_form")->getValue().asString();
+
+
+ LLSpinCtrl* scale_spinner = mFMP->getChild<LLSpinCtrl>("import_scale");
+
+ if (!scale_spinner)
+ {
+ llerrs << "floater_model_preview.xml MUST contain import_scale spinner." << llendl;
+ }
+
+ F32 scale = scale_spinner->getValue().asReal();
+
+ LLMatrix4 scale_mat;
+ scale_mat.initScale(LLVector3(scale, scale, scale));
+
+ F32 max_scale = 0.f;
+
+ if ( mBaseScene.size() > 0 )
+ {
+ mFMP->childEnable("ok_btn");
+ }
+
+ for (LLModelLoader::scene::iterator iter = mBaseScene.begin(); iter != mBaseScene.end(); ++iter)
+ { //for each transform in scene
+ LLMatrix4 mat = iter->first;
+
+ // compute position
+ LLVector3 position = LLVector3(0, 0, 0) * mat;
+
+ // compute scale
+ LLVector3 x_transformed = LLVector3(1, 0, 0) * mat - position;
+ LLVector3 y_transformed = LLVector3(0, 1, 0) * mat - position;
+ LLVector3 z_transformed = LLVector3(0, 0, 1) * mat - position;
+ F32 x_length = x_transformed.normalize();
+ F32 y_length = y_transformed.normalize();
+ F32 z_length = z_transformed.normalize();
+
+ max_scale = llmax(llmax(llmax(max_scale, x_length), y_length), z_length);
+
+ mat *= scale_mat;
+
+ for (LLModelLoader::model_instance_list::iterator model_iter = iter->second.begin(); model_iter != iter->second.end(); ++model_iter)
+ { //for each instance with said transform applied
+ LLModelInstance instance = *model_iter;
+
+ LLModel* base_model = instance.mModel;
+
+ if (base_model)
+ {
+ base_model->mRequestedLabel = requested_name;
+ }
+
+ S32 idx = 0;
+ for (idx = 0; idx < mBaseModel.size(); ++idx)
+ { //find reference instance for this model
+ if (mBaseModel[idx] == base_model)
+ {
+ break;
+ }
+ }
+
+ 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;
+ }
+ }
+
+ instance.mTransform = mat;
+ mUploadData.push_back(instance);
+ }
+ }
+
+ F32 max_import_scale = DEFAULT_MAX_PRIM_SCALE/max_scale;
+
+ scale_spinner->setMaxValue(max_import_scale);
+
+ if (max_import_scale < scale)
+ {
+ scale_spinner->setValue(max_import_scale);
+ }
+
+}
+
+void LLModelPreview::saveUploadData(bool save_skinweights, bool save_joint_positions)
+{
+ if (!mLODFile[LLModel::LOD_HIGH].empty())
+ {
+ std::string filename = mLODFile[LLModel::LOD_HIGH];
+
+ std::string::size_type i = filename.rfind(".");
+ if (i != std::string::npos)
+ {
+ filename.replace(i, filename.size()-1, ".slm");
+ saveUploadData(filename, save_skinweights, save_joint_positions);
+ }
+ }
+}
+
+void LLModelPreview::saveUploadData(const std::string& filename, bool save_skinweights, bool save_joint_positions)
+{
+ if (!gSavedSettings.getBOOL("MeshImportUseSLM"))
+ {
+ return;
+ }
+
+ std::set<LLPointer<LLModel> > meshes;
+ std::map<LLModel*, std::string> mesh_binary;
+
+ LLModel::hull empty_hull;
+
+ LLSD data;
+
+ S32 mesh_id = 0;
+
+ //build list of unique models and initialize local id
+ for (U32 i = 0; i < mUploadData.size(); ++i)
+ {
+ LLModelInstance& instance = mUploadData[i];
+
+ if (meshes.find(instance.mModel) == meshes.end())
+ {
+ instance.mModel->mLocalID = mesh_id++;
+ meshes.insert(instance.mModel);
+
+ std::stringstream str;
+
+ LLModel::Decomposition& decomp =
+ instance.mLOD[LLModel::LOD_PHYSICS].notNull() ?
+ instance.mLOD[LLModel::LOD_PHYSICS]->mPhysics :
+ instance.mModel->mPhysics;
+
+ LLModel::writeModel(str,
+ instance.mLOD[LLModel::LOD_PHYSICS],
+ instance.mLOD[LLModel::LOD_HIGH],
+ instance.mLOD[LLModel::LOD_MEDIUM],
+ instance.mLOD[LLModel::LOD_LOW],
+ instance.mLOD[LLModel::LOD_IMPOSTOR],
+ decomp,
+ save_skinweights, save_joint_positions);
+
+
+ data["mesh"][instance.mModel->mLocalID] = str.str();
+ }
+
+ data["instance"][i] = instance.asLLSD();
+ }
+
+ llofstream out(filename, std::ios_base::out | std::ios_base::binary);
+ LLSDSerialize::toBinary(data, out);
+ out.flush();
+ out.close();
+}
+
+void LLModelPreview::clearModel(S32 lod)
+{
+ if (lod < 0 || lod > LLModel::LOD_PHYSICS)
+ {
+ return;
+ }
+
+ mVertexBuffer[lod].clear();
+ mModel[lod].clear();
+ mScene[lod].clear();
+}
+
+void LLModelPreview::loadModel(std::string filename, S32 lod)
+{
+ assert_main_thread();
+
+ LLMutexLock lock(this);
+
+ // This triggers if you bring up the file picker and then hit CANCEL.
+ // Just use the previous model (if any) and ignore that you brought up
+ // the file picker.
+
+ if (filename.empty())
+ {
+ if (mBaseModel.empty())
+ {
+ // this is the initial file picking. Close the whole floater
+ // if we don't have a base model to show for high LOD.
+ mFMP->closeFloater(false);
+ mLoading = false;
+ }
+ return;
+ }
+
+ if (mModelLoader)
+ {
+ llwarns << "Incompleted model load operation pending." << llendl;
+ return;
+ }
+
+ mLODFile[lod] = filename;
+
+ if (lod == LLModel::LOD_HIGH)
+ {
+ clearGLODGroup();
+ }
+
+ mModelLoader = new LLModelLoader(filename, lod, this, mJointTransformMap, mJointsFromNode );
+
+ mModelLoader->start();
+
+ mFMP->childSetTextArg("status", "[STATUS]", mFMP->getString("status_reading_file"));
+
+ setPreviewLOD(lod);
+
+ if ( getLoadState() >= LLModelLoader::ERROR_PARSING )
+ {
+ mFMP->childDisable("ok_btn");
+ }
+
+ if (lod == mPreviewLOD)
+ {
+ mFMP->childSetText("lod_file", mLODFile[mPreviewLOD]);
+ }
+ else if (lod == LLModel::LOD_PHYSICS)
+ {
+ mFMP->childSetText("physics_file", mLODFile[lod]);
+ }
+
+ mFMP->openFloater();
+}
+
+void LLModelPreview::setPhysicsFromLOD(S32 lod)
+{
+ assert_main_thread();
+
+ if (lod >= 0 && lod <= 3)
+ {
+ mModel[LLModel::LOD_PHYSICS] = mModel[lod];
+ mScene[LLModel::LOD_PHYSICS] = mScene[lod];
+ mLODFile[LLModel::LOD_PHYSICS].clear();
+ mFMP->childSetText("physics_file", mLODFile[LLModel::LOD_PHYSICS]);
+ mVertexBuffer[LLModel::LOD_PHYSICS].clear();
+ rebuildUploadData();
+ refresh();
+ updateStatusMessages();
+ }
+}
+
+void LLModelPreview::clearIncompatible(S32 lod)
+{
+ for (U32 i = 0; i <= LLModel::LOD_HIGH; i++)
+ { //clear out any entries that aren't compatible with this model
+ if (i != lod)
+ {
+ if (mModel[i].size() != mModel[lod].size())
+ {
+ mModel[i].clear();
+ mScene[i].clear();
+ mVertexBuffer[i].clear();
+
+ if (i == LLModel::LOD_HIGH)
+ {
+ mBaseModel = mModel[lod];
+ clearGLODGroup();
+ mBaseScene = mScene[lod];
+ mVertexBuffer[5].clear();
+ }
+ }
+ }
+ }
+}
+
+void LLModelPreview::clearGLODGroup()
+{
+ if (mGroup)
+ {
+ for (std::map<LLPointer<LLModel>, U32>::iterator iter = mObject.begin(); iter != mObject.end(); ++iter)
+ {
+ glodDeleteObject(iter->second);
+ stop_gloderror();
+ }
+ mObject.clear();
+
+ glodDeleteGroup(mGroup);
+ stop_gloderror();
+ mGroup = 0;
+ }
+}
+
+void LLModelPreview::loadModelCallback(S32 lod)
+{
+ assert_main_thread();
+
+ LLMutexLock lock(this);
+ if (!mModelLoader)
+ {
+ mLoading = false ;
+ return;
+ }
+ if(getLoadState() >= LLModelLoader::ERROR_PARSING)
+ {
+ mLoading = false ;
+ return ;
+ }
+
+ mModelLoader->loadTextures() ;
+
+ if (lod == -1)
+ { //populate all LoDs from model loader scene
+ mBaseModel.clear();
+ mBaseScene.clear();
+
+ bool skin_weights = false;
+ bool joint_positions = false;
+
+ for (S32 lod = 0; lod < LLModel::NUM_LODS; ++lod)
+ { //for each LoD
+
+ //clear scene and model info
+ mScene[lod].clear();
+ mModel[lod].clear();
+ mVertexBuffer[lod].clear();
+
+ if (mModelLoader->mScene.begin()->second[0].mLOD[lod].notNull())
+ { //if this LoD exists in the loaded scene
+
+ //copy scene to current LoD
+ mScene[lod] = mModelLoader->mScene;
+
+ //touch up copied scene to look like current LoD
+ for (LLModelLoader::scene::iterator iter = mScene[lod].begin(); iter != mScene[lod].end(); ++iter)
+ {
+ LLModelLoader::model_instance_list& list = iter->second;
+
+ for (LLModelLoader::model_instance_list::iterator list_iter = list.begin(); list_iter != list.end(); ++list_iter)
+ {
+ //override displayed model with current LoD
+ list_iter->mModel = list_iter->mLOD[lod];
+
+ //add current model to current LoD's model list (LLModel::mLocalID makes a good vector index)
+ S32 idx = list_iter->mModel->mLocalID;
+
+ if (mModel[lod].size() <= idx)
+ { //stretch model list to fit model at given index
+ mModel[lod].resize(idx+1);
+ }
+
+ mModel[lod][idx] = list_iter->mModel;
+ if (!list_iter->mModel->mSkinWeights.empty())
+ {
+ skin_weights = true;
+
+ if (!list_iter->mModel->mSkinInfo.mAlternateBindMatrix.empty())
+ {
+ joint_positions = true;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if (mFMP)
+ {
+ LLFloaterModelPreview* fmp = (LLFloaterModelPreview*) mFMP;
+
+ if (skin_weights)
+ { //enable uploading/previewing of skin weights if present in .slm file
+ fmp->enableViewOption("show_skin_weight");
+ mViewOption["show_skin_weight"] = true;
+ fmp->childSetValue("upload_skin", true);
+ }
+
+ if (joint_positions)
+ {
+ fmp->enableViewOption("show_joint_positions");
+ mViewOption["show_joint_positions"] = true;
+ fmp->childSetValue("upload_joints", true);
+ }
+ }
+
+ //copy high lod to base scene for LoD generation
+ mBaseScene = mScene[LLModel::LOD_HIGH];
+ mBaseModel = mModel[LLModel::LOD_HIGH];
+
+ mDirty = true;
+ resetPreviewTarget();
+ }
+ else
+ { //only replace given LoD
+ mModel[lod] = mModelLoader->mModelList;
+ mScene[lod] = mModelLoader->mScene;
+ mVertexBuffer[lod].clear();
+
+ setPreviewLOD(lod);
+
+ if (lod == LLModel::LOD_HIGH)
+ { //save a copy of the highest LOD for automatic LOD manipulation
+ if (mBaseModel.empty())
+ { //first time we've loaded a model, auto-gen LoD
+ mGenLOD = true;
+ }
+
+ mBaseModel = mModel[lod];
+ clearGLODGroup();
+
+ mBaseScene = mScene[lod];
+ mVertexBuffer[5].clear();
+ }
+
+ clearIncompatible(lod);
+
+ mDirty = true;
+
+ if (lod == LLModel::LOD_HIGH)
+ {
+ resetPreviewTarget();
+ }
+ }
+
+ mLoading = false;
+ refresh();
+
+ mModelLoadedSignal();
+}
+
+void LLModelPreview::resetPreviewTarget()
+{
+ if ( mModelLoader )
+ {
+ mPreviewTarget = (mModelLoader->mExtents[0] + mModelLoader->mExtents[1]) * 0.5f;
+ mPreviewScale = (mModelLoader->mExtents[1] - mModelLoader->mExtents[0]) * 0.5f;
+ }
+
+ setPreviewTarget(mPreviewScale.magVec()*2.f);
+}
+
+void LLModelPreview::generateNormals()
+{
+ assert_main_thread();
+
+ S32 which_lod = mPreviewLOD;
+
+
+ if (which_lod > 4 || which_lod < 0 ||
+ mModel[which_lod].empty())
+ {
+ return;
+ }
+
+ F32 angle_cutoff = mFMP->childGetValue("crease_angle").asReal();
+
+ mRequestedCreaseAngle[which_lod] = angle_cutoff;
+
+ angle_cutoff *= DEG_TO_RAD;
+
+ if (which_lod == 3 && !mBaseModel.empty())
+ {
+ for (LLModelLoader::model_list::iterator iter = mBaseModel.begin(); iter != mBaseModel.end(); ++iter)
+ {
+ (*iter)->generateNormals(angle_cutoff);
+ }
+
+ mVertexBuffer[5].clear();
+ }
+
+ for (LLModelLoader::model_list::iterator iter = mModel[which_lod].begin(); iter != mModel[which_lod].end(); ++iter)
+ {
+ (*iter)->generateNormals(angle_cutoff);
+ }
+
+ mVertexBuffer[which_lod].clear();
+ refresh();
+ 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())
+ {
+ return;
+ }
+
+ LLVertexBuffer::unbind();
+
+ stop_gloderror();
+ static U32 cur_name = 1;
+
+ S32 limit = -1;
+
+ U32 triangle_count = 0;
+
+ for (LLModelLoader::model_list::iterator iter = mBaseModel.begin(); iter != mBaseModel.end(); ++iter)
+ {
+ LLModel* mdl = *iter;
+ for (S32 i = 0; i < mdl->getNumVolumeFaces(); ++i)
+ {
+ triangle_count += mdl->getVolumeFace(i).mNumIndices/3;
+ }
+ }
+
+ U32 base_triangle_count = triangle_count;
+
+ U32 type_mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_TEXCOORD0;
+
+ U32 lod_mode = 0;
+
+ LLCtrlSelectionInterface* iface = mFMP->childGetSelectionInterface("lod_mode");
+ if (iface)
+ {
+ lod_mode = iface->getFirstSelectedIndex();
+ }
+ mRequestedLoDMode[mPreviewLOD] = lod_mode;
+
+ F32 lod_error_threshold = mFMP->childGetValue("lod_error_threshold").asReal();
+
+ if (lod_mode == 0)
+ {
+ lod_mode = GLOD_TRIANGLE_BUDGET;
+ if (which_lod != -1)
+ {
+ limit = mFMP->childGetValue("lod_triangle_limit").asInteger();
+ }
+ }
+ else
+ {
+ lod_mode = GLOD_ERROR_THRESHOLD;
+ }
+
+ U32 build_operator = 0;
+
+ iface = mFMP->childGetSelectionInterface("build_operator");
+ if (iface)
+ {
+ build_operator = iface->getFirstSelectedIndex();
+ }
+ mRequestedBuildOperator[mPreviewLOD] = build_operator;
+
+ if (build_operator == 0)
+ {
+ build_operator = GLOD_OPERATOR_EDGE_COLLAPSE;
+ }
+ else
+ {
+ build_operator = GLOD_OPERATOR_HALF_EDGE_COLLAPSE;
+ }
+
+ U32 queue_mode=0;
+ iface = mFMP->childGetSelectionInterface("queue_mode");
+ if (iface)
+ {
+ queue_mode = iface->getFirstSelectedIndex();
+ }
+ mRequestedQueueMode[mPreviewLOD] = queue_mode;
+
+ if (queue_mode == 0)
+ {
+ queue_mode = GLOD_QUEUE_GREEDY;
+ }
+ else if (queue_mode == 1)
+ {
+ queue_mode = GLOD_QUEUE_LAZY;
+ }
+ else
+ {
+ queue_mode = GLOD_QUEUE_INDEPENDENT;
+ }
+
+ U32 border_mode = 0;
+
+ iface = mFMP->childGetSelectionInterface("border_mode");
+ if (iface)
+ {
+ border_mode = iface->getFirstSelectedIndex();
+ }
+ mRequestedBorderMode[mPreviewLOD] = border_mode;
+
+ if (border_mode == 0)
+ {
+ border_mode = GLOD_BORDER_UNLOCK;
+ }
+ else
+ {
+ border_mode = GLOD_BORDER_LOCK;
+ }
+
+ bool object_dirty = false;
+ if (border_mode != mBuildBorderMode)
+ {
+ mBuildBorderMode = border_mode;
+ object_dirty = true;
+ }
+
+ if (queue_mode != mBuildQueueMode)
+ {
+ mBuildQueueMode = queue_mode;
+ object_dirty = true;
+ }
+
+ if (build_operator != mBuildOperator)
+ {
+ mBuildOperator = build_operator;
+ object_dirty = true;
+ }
+
+ F32 share_tolerance = mFMP->childGetValue("share_tolerance").asReal();
+ if (share_tolerance != mBuildShareTolerance)
+ {
+ mBuildShareTolerance = share_tolerance;
+ object_dirty = true;
+ }
+ mRequestedShareTolerance[mPreviewLOD] = share_tolerance;
+
+ if (mGroup == 0)
+ {
+ object_dirty = true;
+ mGroup = cur_name++;
+ glodNewGroup(mGroup);
+ }
+
+ if (object_dirty)
+ {
+ for (LLModelLoader::model_list::iterator iter = mBaseModel.begin(); iter != mBaseModel.end(); ++iter)
+ { //build GLOD objects for each model in base model list
+ LLModel* mdl = *iter;
+
+ if (mObject[mdl] != 0)
+ {
+ glodDeleteObject(mObject[mdl]);
+ }
+
+ mObject[mdl] = cur_name++;
+
+ glodNewObject(mObject[mdl], mGroup, GLOD_DISCRETE);
+ stop_gloderror();
+
+ if (iter == mBaseModel.begin() && !mdl->mSkinWeights.empty())
+ { //regenerate vertex buffer for skinned models to prevent animation feedback during LOD generation
+ mVertexBuffer[5].clear();
+ }
+
+ if (mVertexBuffer[5].empty())
+ {
+ genBuffers(5, false);
+ }
+
+ U32 tri_count = 0;
+ for (U32 i = 0; i < mVertexBuffer[5][mdl].size(); ++i)
+ {
+ mVertexBuffer[5][mdl][i]->setBuffer(type_mask);
+ U32 num_indices = mVertexBuffer[5][mdl][i]->getNumIndices();
+ if (num_indices > 2)
+ {
+ glodInsertElements(mObject[mdl], i, GL_TRIANGLES, num_indices, GL_UNSIGNED_SHORT, mVertexBuffer[5][mdl][i]->getIndicesPointer(), 0, 0.f);
+ }
+ tri_count += num_indices/3;
+ stop_gloderror();
+ }
+
+ glodObjectParameteri(mObject[mdl], GLOD_BUILD_OPERATOR, build_operator);
+ stop_gloderror();
+
+ glodObjectParameteri(mObject[mdl], GLOD_BUILD_QUEUE_MODE, queue_mode);
+ stop_gloderror();
+
+ glodObjectParameteri(mObject[mdl], GLOD_BUILD_BORDER_MODE, border_mode);
+ stop_gloderror();
+
+ glodObjectParameterf(mObject[mdl], GLOD_BUILD_SHARE_TOLERANCE, share_tolerance);
+ stop_gloderror();
+
+ glodBuildObject(mObject[mdl]);
+ stop_gloderror();
+ }
+ }
+
+
+ S32 start = LLModel::LOD_HIGH;
+ S32 end = 0;
+
+ if (which_lod != -1)
+ {
+ start = end = which_lod;
+ }
+
+ mMaxTriangleLimit = base_triangle_count;
+
+ for (S32 lod = start; lod >= end; --lod)
+ {
+ if (which_lod == -1)
+ {
+ if (lod < start)
+ {
+ triangle_count /= decimation;
+ }
+ }
+ else
+ {
+ if (enforce_tri_limit)
+ {
+ triangle_count = limit;
+ }
+ else
+ {
+ for (S32 j=LLModel::LOD_HIGH; j>which_lod; --j)
+ {
+ triangle_count /= decimation;
+ }
+ }
+ }
+
+ mModel[lod].clear();
+ mModel[lod].resize(mBaseModel.size());
+ mVertexBuffer[lod].clear();
+
+ U32 actual_tris = 0;
+ U32 actual_verts = 0;
+ U32 submeshes = 0;
+
+ mRequestedTriangleCount[lod] = triangle_count;
+ mRequestedErrorThreshold[lod] = lod_error_threshold;
+
+ glodGroupParameteri(mGroup, GLOD_ADAPT_MODE, lod_mode);
+ stop_gloderror();
+
+ glodGroupParameteri(mGroup, GLOD_ERROR_MODE, GLOD_OBJECT_SPACE_ERROR);
+ stop_gloderror();
+
+ glodGroupParameterf(mGroup, GLOD_OBJECT_SPACE_ERROR_THRESHOLD, lod_error_threshold);
+ stop_gloderror();
+
+ if (lod_mode != GLOD_TRIANGLE_BUDGET)
+ {
+ glodGroupParameteri(mGroup, GLOD_MAX_TRIANGLES, 0);
+ }
+ else
+ {
+ //SH-632: always add 1 to desired amount to avoid decimating below desired amount
+ glodGroupParameteri(mGroup, GLOD_MAX_TRIANGLES, triangle_count+1);
+ }
+
+ stop_gloderror();
+ glodAdaptGroup(mGroup);
+ stop_gloderror();
+
+ for (U32 mdl_idx = 0; mdl_idx < mBaseModel.size(); ++mdl_idx)
+ {
+ LLModel* base = mBaseModel[mdl_idx];
+
+ GLint patch_count = 0;
+ glodGetObjectParameteriv(mObject[base], GLOD_NUM_PATCHES, &patch_count);
+ stop_gloderror();
+
+ LLVolumeParams volume_params;
+ volume_params.setType(LL_PCODE_PROFILE_SQUARE, LL_PCODE_PATH_LINE);
+ mModel[lod][mdl_idx] = new LLModel(volume_params, 0.f);
+
+ GLint* sizes = new GLint[patch_count*2];
+ glodGetObjectParameteriv(mObject[base], GLOD_PATCH_SIZES, sizes);
+ stop_gloderror();
+
+ GLint* names = new GLint[patch_count];
+ glodGetObjectParameteriv(mObject[base], GLOD_PATCH_NAMES, names);
+ stop_gloderror();
+
+ mModel[lod][mdl_idx]->setNumVolumeFaces(patch_count);
+
+ LLModel* target_model = mModel[lod][mdl_idx];
+
+ for (GLint i = 0; i < patch_count; ++i)
+ {
+ LLPointer<LLVertexBuffer> buff = new LLVertexBuffer(type_mask, 0);
+
+ if (sizes[i*2+1] > 0 && sizes[i*2] > 0)
+ {
+ buff->allocateBuffer(sizes[i*2+1], sizes[i*2], true);
+ buff->setBuffer(type_mask);
+ glodFillElements(mObject[base], names[i], GL_UNSIGNED_SHORT, buff->getIndicesPointer());
+ stop_gloderror();
+ }
+ else
+ { //this face was eliminated, create a dummy triangle (one vertex, 3 indices, all 0)
+ buff->allocateBuffer(1, 3, true);
+ memset(buff->getMappedData(), 0, buff->getSize());
+ memset(buff->getIndicesPointer(), 0, buff->getIndicesSize());
+ }
+
+ buff->validateRange(0, buff->getNumVerts()-1, buff->getNumIndices(), 0);
+
+ LLStrider<LLVector3> pos;
+ LLStrider<LLVector3> norm;
+ LLStrider<LLVector2> tc;
+ LLStrider<U16> index;
+
+ buff->getVertexStrider(pos);
+ buff->getNormalStrider(norm);
+ buff->getTexCoord0Strider(tc);
+ buff->getIndexStrider(index);
+
+ target_model->setVolumeFaceData(names[i], pos, norm, tc, index, buff->getNumVerts(), buff->getNumIndices());
+ actual_tris += buff->getNumIndices()/3;
+ actual_verts += buff->getNumVerts();
+ ++submeshes;
+
+ if (!validate_face(target_model->getVolumeFace(names[i])))
+ {
+ llerrs << "Invalid face generated during LOD generation." << llendl;
+ }
+ }
+
+ //blind copy skin weights and just take closest skin weight to point on
+ //decimated mesh for now (auto-generating LODs with skin weights is still a bit
+ //of an open problem).
+ target_model->mPosition = base->mPosition;
+ target_model->mSkinWeights = base->mSkinWeights;
+ target_model->mSkinInfo = base->mSkinInfo;
+ //copy material list
+ target_model->mMaterialList = base->mMaterialList;
+
+ if (!validate_model(target_model))
+ {
+ llerrs << "Invalid model generated when creating LODs" << llendl;
+ }
+
+ delete [] sizes;
+ delete [] names;
+ }
+
+ //rebuild scene based on mBaseScene
+ mScene[lod].clear();
+ mScene[lod] = mBaseScene;
+
+ for (U32 i = 0; i < mBaseModel.size(); ++i)
+ {
+ LLModel* mdl = mBaseModel[i];
+ LLModel* target = mModel[lod][i];
+ if (target)
+ {
+ for (LLModelLoader::scene::iterator iter = mScene[lod].begin(); iter != mScene[lod].end(); ++iter)
+ {
+ for (U32 j = 0; j < iter->second.size(); ++j)
+ {
+ if (iter->second[j].mModel == mdl)
+ {
+ iter->second[j].mModel = target;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ mResourceCost = calcResourceCost();
+
+ /*if (which_lod == -1 && mScene[LLModel::LOD_PHYSICS].empty())
+ { //build physics scene
+ mScene[LLModel::LOD_PHYSICS] = mScene[LLModel::LOD_LOW];
+ mModel[LLModel::LOD_PHYSICS] = mModel[LLModel::LOD_LOW];
+
+ for (U32 i = 1; i < mModel[LLModel::LOD_PHYSICS].size(); ++i)
+ {
+ mPhysicsQ.push(mModel[LLModel::LOD_PHYSICS][i]);
+ }
+ }*/
+}
+
+void LLModelPreview::updateStatusMessages()
+{
+ assert_main_thread();
+
+ //triangle/vertex/submesh count for each mesh asset for each lod
+ std::vector<S32> tris[LLModel::NUM_LODS];
+ std::vector<S32> verts[LLModel::NUM_LODS];
+ std::vector<S32> submeshes[LLModel::NUM_LODS];
+
+ //total triangle/vertex/submesh count for each lod
+ S32 total_tris[LLModel::NUM_LODS];
+ S32 total_verts[LLModel::NUM_LODS];
+ S32 total_submeshes[LLModel::NUM_LODS];
+
+ for (S32 lod = 0; lod < LLModel::NUM_LODS; ++lod)
+ {
+ //initialize total for this lod to 0
+ total_tris[lod] = total_verts[lod] = total_submeshes[lod] = 0;
+
+ for (U32 i = 0; i < mModel[lod].size(); ++i)
+ { //for each model in the lod
+ S32 cur_tris = 0;
+ S32 cur_verts = 0;
+ S32 cur_submeshes = mModel[lod][i]->getNumVolumeFaces();
+
+ for (S32 j = 0; j < cur_submeshes; ++j)
+ { //for each submesh (face), add triangles and vertices to current total
+ const LLVolumeFace& face = mModel[lod][i]->getVolumeFace(j);
+ cur_tris += face.mNumIndices/3;
+ cur_verts += face.mNumVertices;
+ }
+
+ //add this model to the lod total
+ total_tris[lod] += cur_tris;
+ total_verts[lod] += cur_verts;
+ total_submeshes[lod] += cur_submeshes;
+
+ //store this model's counts to asset data
+ tris[lod].push_back(cur_tris);
+ verts[lod].push_back(cur_verts);
+ submeshes[lod].push_back(cur_submeshes);
+ }
+ }
+
+ if (mMaxTriangleLimit == 0)
+ {
+ mMaxTriangleLimit = total_tris[LLModel::LOD_HIGH];
+ }
+
+
+ mFMP->childSetTextArg("submeshes_info", "[SUBMESHES]", llformat("%d", total_submeshes[LLModel::LOD_HIGH]));
+
+ std::string mesh_status_na = mFMP->getString("mesh_status_na");
+
+ S32 upload_status[LLModel::LOD_HIGH+1];
+
+ bool upload_ok = true;
+
+ for (S32 lod = 0; lod <= LLModel::LOD_HIGH; ++lod)
+ {
+ upload_status[lod] = 0;
+
+ std::string message = "mesh_status_good";
+
+ if (total_tris[lod] > 0)
+ {
+ mFMP->childSetText(lod_triangles_name[lod], llformat("%d", total_tris[lod]));
+ mFMP->childSetText(lod_vertices_name[lod], llformat("%d", total_verts[lod]));
+ }
+ else
+ {
+ if (lod == LLModel::LOD_HIGH)
+ {
+ upload_status[lod] = 2;
+ message = "mesh_status_missing_lod";
+ }
+ else
+ {
+ for (S32 i = lod-1; i >= 0; --i)
+ {
+ if (total_tris[i] > 0)
+ {
+ upload_status[lod] = 2;
+ message = "mesh_status_missing_lod";
+ }
+ }
+ }
+
+ mFMP->childSetText(lod_triangles_name[lod], mesh_status_na);
+ mFMP->childSetText(lod_vertices_name[lod], mesh_status_na);
+ }
+
+ const U32 lod_high = LLModel::LOD_HIGH;
+
+ if (lod != lod_high)
+ {
+ if (total_submeshes[lod] && total_submeshes[lod] != total_submeshes[lod_high])
+ { //number of submeshes is different
+ message = "mesh_status_submesh_mismatch";
+ upload_status[lod] = 2;
+ }
+ else if (!tris[lod].empty() && tris[lod].size() != tris[lod_high].size())
+ { //number of meshes is different
+ message = "mesh_status_mesh_mismatch";
+ upload_status[lod] = 2;
+ }
+ else if (!verts[lod].empty())
+ {
+ for (U32 i = 0; i < verts[lod].size(); ++i)
+ {
+ S32 max_verts = i < verts[lod+1].size() ? verts[lod+1][i] : 0;
+
+ 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;
+ }
+ }
+ }
+ }
+ }
+
+ LLIconCtrl* icon = mFMP->getChild<LLIconCtrl>(lod_icon_name[lod]);
+ LLUIImagePtr img = LLUI::getUIImage(lod_status_image[upload_status[lod]]);
+ icon->setVisible(true);
+ icon->setImage(img);
+
+ if (upload_status[lod] >= 2)
+ {
+ upload_ok = false;
+ }
+
+ if (lod == mPreviewLOD)
+ {
+ mFMP->childSetText("lod_status_message_text", mFMP->getString(message));
+ icon = mFMP->getChild<LLIconCtrl>("lod_status_message_icon");
+ icon->setImage(img);
+ }
+ }
+
+
+ //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)
+ {
+ upload_ok = upload_ok && mdl->mPhysics.mHull[i].size() <= 256;
+ }
+ }
+
+ bool errorStateFromLoader = getLoadState() >= LLModelLoader::ERROR_PARSING ? true : false;
+
+ bool skinAndRigOk = true;
+ bool uploadingSkin = mFMP->childGetValue("upload_skin").asBoolean();
+ bool uploadingJointPositions = mFMP->childGetValue("upload_joints").asBoolean();
+
+ if ( uploadingSkin )
+ {
+ if ( uploadingJointPositions && !isRigValidForJointPositionUpload() )
+ {
+ skinAndRigOk = false;
+ }
+ else
+ if ( !isLegacyRigValid() )
+ {
+ skinAndRigOk = false;
+ }
+ }
+
+ if ( upload_ok && !errorStateFromLoader && skinAndRigOk )
+ {
+ mFMP->childEnable("ok_btn");
+ }
+ else
+ {
+ mFMP->childDisable("ok_btn");
+ }
+
+ //add up physics triangles etc
+ S32 start = 0;
+ S32 end = mModel[LLModel::LOD_PHYSICS].size();
+
+ S32 phys_tris = 0;
+ S32 phys_hulls = 0;
+ S32 phys_points = 0;
+
+ for (S32 i = start; i < end; ++i)
+ { //add up hulls and points and triangles for selected mesh(es)
+ LLModel* model = mModel[LLModel::LOD_PHYSICS][i];
+ S32 cur_submeshes = model->getNumVolumeFaces();
+
+ LLModel::convex_hull_decomposition& decomp = model->mPhysics.mHull;
+
+ if (!decomp.empty())
+ {
+ phys_hulls += decomp.size();
+ for (U32 i = 0; i < decomp.size(); ++i)
+ {
+ phys_points += decomp[i].size();
+ }
+ }
+ else
+ { //choose physics shape OR decomposition, can't use both
+ for (S32 j = 0; j < cur_submeshes; ++j)
+ { //for each submesh (face), add triangles and vertices to current total
+ const LLVolumeFace& face = model->getVolumeFace(j);
+ phys_tris += face.mNumIndices/3;
+ }
+ }
+ }
+
+ if (phys_tris > 0)
+ {
+ mFMP->childSetTextArg("physics_triangles", "[TRIANGLES]", llformat("%d", phys_tris));
+ }
+ else
+ {
+ mFMP->childSetTextArg("physics_triangles", "[TRIANGLES]", mesh_status_na);
+ }
+
+ if (phys_hulls > 0)
+ {
+ mFMP->childSetTextArg("physics_hulls", "[HULLS]", llformat("%d", phys_hulls));
+ mFMP->childSetTextArg("physics_points", "[POINTS]", llformat("%d", phys_points));
+ }
+ else
+ {
+ mFMP->childSetTextArg("physics_hulls", "[HULLS]", mesh_status_na);
+ mFMP->childSetTextArg("physics_points", "[POINTS]", mesh_status_na);
+ }
+
+ LLFloaterModelPreview* fmp = LLFloaterModelPreview::sInstance;
+ if (fmp)
+ {
+ if (phys_tris > 0 || phys_hulls > 0)
+ {
+ if (!fmp->isViewOptionEnabled("show_physics"))
+ {
+ fmp->enableViewOption("show_physics");
+ mViewOption["show_physics"] = true;
+ }
+ }
+ else
+ {
+ fmp->disableViewOption("show_physics");
+ mViewOption["show_physics"] = false;
+
+ }
+
+ //bool use_hull = fmp->childGetValue("physics_use_hull").asBoolean();
+
+ //fmp->childSetEnabled("physics_optimize", !use_hull);
+
+ bool enable = phys_tris > 0 || phys_hulls > 0;
+ //enable = enable && !use_hull && fmp->childGetValue("physics_optimize").asBoolean();
+
+ //enable/disable "analysis" UI
+ LLPanel* panel = fmp->getChild<LLPanel>("physics analysis");
+ LLView* child = panel->getFirstChild();
+ while (child)
+ {
+ child->setEnabled(enable);
+ child = panel->findNextSibling(child);
+ }
+
+ enable = phys_hulls > 0;
+ //enable/disable "simplification" UI
+ panel = fmp->getChild<LLPanel>("physics simplification");
+ child = panel->getFirstChild();
+ while (child)
+ {
+ child->setEnabled(enable);
+ child = panel->findNextSibling(child);
+ }
+ }
+
+ const char* lod_controls[] =
+ {
+ "lod_mode",
+ "lod_triangle_limit",
+ "lod_error_tolerance",
+ "build_operator_text",
+ "queue_mode_text",
+ "border_mode_text",
+ "share_tolerance_text",
+ "build_operator",
+ "queue_mode",
+ "border_mode",
+ "share_tolerance"
+ };
+ const U32 num_lod_controls = sizeof(lod_controls)/sizeof(char*);
+
+ const char* file_controls[] =
+ {
+ "lod_browse",
+ "lod_file"
+ };
+ const U32 num_file_controls = sizeof(file_controls)/sizeof(char*);
+
+ if (fmp)
+ {
+ //enable/disable controls based on radio groups
+ if (mFMP->childGetValue("lod_from_file").asBoolean())
+ {
+ fmp->mLODMode[mPreviewLOD] = 0;
+ for (U32 i = 0; i < num_file_controls; ++i)
+ {
+ mFMP->childEnable(file_controls[i]);
+ }
+
+ for (U32 i = 0; i < num_lod_controls; ++i)
+ {
+ mFMP->childDisable(lod_controls[i]);
+ }
+ }
+ else if (mFMP->childGetValue("lod_none").asBoolean())
+ {
+ fmp->mLODMode[mPreviewLOD] = 2;
+ for (U32 i = 0; i < num_file_controls; ++i)
+ {
+ mFMP->childDisable(file_controls[i]);
+ }
+
+ for (U32 i = 0; i < num_lod_controls; ++i)
+ {
+ mFMP->childDisable(lod_controls[i]);
+ }
+
+ if (!mModel[mPreviewLOD].empty())
+ {
+ mModel[mPreviewLOD].clear();
+ mScene[mPreviewLOD].clear();
+ mVertexBuffer[mPreviewLOD].clear();
+
+ //this can cause phasing issues with the UI, so reenter this function and return
+ updateStatusMessages();
+ return;
+ }
+ }
+ else
+ { // auto generate, also the default case for wizard which has no radio selection
+ fmp->mLODMode[mPreviewLOD] = 1;
+
+ //don't actually regenerate lod when refreshing UI
+ mLODFrozen = true;
+
+ for (U32 i = 0; i < num_file_controls; ++i)
+ {
+ mFMP->childDisable(file_controls[i]);
+ }
+
+ for (U32 i = 0; i < num_lod_controls; ++i)
+ {
+ mFMP->childEnable(lod_controls[i]);
+ }
+
+ //if (threshold)
+ {
+ LLSpinCtrl* threshold = mFMP->getChild<LLSpinCtrl>("lod_error_threshold");
+ LLSpinCtrl* limit = mFMP->getChild<LLSpinCtrl>("lod_triangle_limit");
+
+ limit->setMaxValue(mMaxTriangleLimit);
+ limit->forceSetValue(mRequestedTriangleCount[mPreviewLOD]);
+
+ threshold->forceSetValue(mRequestedErrorThreshold[mPreviewLOD]);
+
+ mFMP->getChild<LLComboBox>("lod_mode")->selectNthItem(mRequestedLoDMode[mPreviewLOD]);
+ mFMP->getChild<LLComboBox>("build_operator")->selectNthItem(mRequestedBuildOperator[mPreviewLOD]);
+ mFMP->getChild<LLComboBox>("queue_mode")->selectNthItem(mRequestedQueueMode[mPreviewLOD]);
+ mFMP->getChild<LLComboBox>("border_mode")->selectNthItem(mRequestedBorderMode[mPreviewLOD]);
+ mFMP->getChild<LLSpinCtrl>("share_tolerance")->setValue(mRequestedShareTolerance[mPreviewLOD]);
+
+ if (mRequestedLoDMode[mPreviewLOD] == 0)
+ {
+ limit->setVisible(true);
+ threshold->setVisible(false);
+
+ limit->setMaxValue(mMaxTriangleLimit);
+ limit->setIncrement(mMaxTriangleLimit/32);
+ }
+ else
+ {
+ limit->setVisible(false);
+ threshold->setVisible(true);
+ }
+ }
+
+ mLODFrozen = false;
+ }
+ }
+
+ if (mFMP->childGetValue("physics_load_from_file").asBoolean())
+ {
+ mFMP->childDisable("physics_lod_combo");
+ mFMP->childEnable("physics_file");
+ mFMP->childEnable("physics_browse");
+ }
+ else
+ {
+ mFMP->childEnable("physics_lod_combo");
+ mFMP->childDisable("physics_file");
+ mFMP->childDisable("physics_browse");
+ }
+
+ LLSpinCtrl* crease = mFMP->getChild<LLSpinCtrl>("crease_angle");
+
+ if (mRequestedCreaseAngle[mPreviewLOD] == -1.f)
+ {
+ mFMP->childSetColor("crease_label", LLColor4::grey);
+ crease->forceSetValue(75.f);
+ }
+ else
+ {
+ mFMP->childSetColor("crease_label", LLColor4::white);
+ crease->forceSetValue(mRequestedCreaseAngle[mPreviewLOD]);
+ }
+
+}
+
+void LLModelPreview::setPreviewTarget(F32 distance)
+{
+ mCameraDistance = distance;
+ mCameraZoom = 1.f;
+ mCameraPitch = 0.f;
+ mCameraYaw = 0.f;
+ mCameraOffset.clearVec();
+}
+
+void LLModelPreview::clearBuffers()
+{
+ for (U32 i = 0; i < 6; i++)
+ {
+ mVertexBuffer[i].clear();
+ }
+}
+
+void LLModelPreview::genBuffers(S32 lod, bool include_skin_weights)
+{
+ U32 tri_count = 0;
+ U32 vertex_count = 0;
+ U32 mesh_count = 0;
+
+
+ LLModelLoader::model_list* model = NULL;
+
+ if (lod < 0 || lod > 4)
+ {
+ model = &mBaseModel;
+ lod = 5;
+ }
+ else
+ {
+ model = &(mModel[lod]);
+ }
+
+ if (!mVertexBuffer[lod].empty())
+ {
+ mVertexBuffer[lod].clear();
+ }
+
+ mVertexBuffer[lod].clear();
+
+ LLModelLoader::model_list::iterator base_iter = mBaseModel.begin();
+
+ for (LLModelLoader::model_list::iterator iter = model->begin(); iter != model->end(); ++iter)
+ {
+ LLModel* mdl = *iter;
+ if (!mdl)
+ {
+ continue;
+ }
+
+ LLModel* base_mdl = *base_iter;
+ base_iter++;
+
+ for (S32 i = 0; i < mdl->getNumVolumeFaces(); ++i)
+ {
+ const LLVolumeFace &vf = mdl->getVolumeFace(i);
+ U32 num_vertices = vf.mNumVertices;
+ U32 num_indices = vf.mNumIndices;
+
+ if (!num_vertices || ! num_indices)
+ {
+ continue;
+ }
+
+ LLVertexBuffer* vb = NULL;
+
+ bool skinned = include_skin_weights && !mdl->mSkinWeights.empty();
+
+ U32 mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_TEXCOORD0;
+
+ if (skinned)
+ {
+ mask |= LLVertexBuffer::MAP_WEIGHT4;
+ }
+
+ vb = new LLVertexBuffer(mask, 0);
+
+ vb->allocateBuffer(num_vertices, num_indices, TRUE);
+
+ LLStrider<LLVector3> vertex_strider;
+ LLStrider<LLVector3> normal_strider;
+ LLStrider<LLVector2> tc_strider;
+ LLStrider<U16> index_strider;
+ LLStrider<LLVector4> weights_strider;
+
+ vb->getVertexStrider(vertex_strider);
+ vb->getNormalStrider(normal_strider);
+ vb->getTexCoord0Strider(tc_strider);
+ vb->getIndexStrider(index_strider);
+
+ if (skinned)
+ {
+ vb->getWeight4Strider(weights_strider);
+ }
+
+ 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 (skinned)
+ {
+ for (U32 i = 0; i < num_vertices; i++)
+ {
+ //find closest weight to vf.mVertices[i].mPosition
+ LLVector3 pos(vf.mPositions[i].getF32ptr());
+
+ 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);
+ F32 joint = (F32) weight_list[i].mJointIdx;
+ w.mV[i] = joint + wght;
+ }
+
+ *(weights_strider++) = w;
+ }
+ }
+
+ // build indices
+ for (U32 i = 0; i < num_indices; i++)
+ {
+ *(index_strider++) = vf.mIndices[i];
+ }
+
+ mVertexBuffer[lod][mdl].push_back(vb);
+
+ vertex_count += num_vertices;
+ tri_count += num_indices/3;
+ ++mesh_count;
+
+ }
+ }
+}
+
+void LLModelPreview::update()
+{
+ if (mDirty)
+ {
+ mDirty = false;
+ mResourceCost = calcResourceCost();
+ refresh();
+ updateStatusMessages();
+ }
+
+ if (mGenLOD)
+ {
+ mGenLOD = false;
+ genLODs();
+ refresh();
+ updateStatusMessages();
+ }
+
+}
+//-----------------------------------------------------------------------------
+// getTranslationForJointOffset()
+//-----------------------------------------------------------------------------
+LLVector3 LLModelPreview::getTranslationForJointOffset( std::string joint )
+{
+ LLMatrix4 jointTransform;
+ if ( mJointTransformMap.find( joint ) != mJointTransformMap.end() )
+ {
+ jointTransform = mJointTransformMap[joint];
+ return jointTransform.getTranslation();
+ }
+ 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()
+{
+ assert_main_thread();
+
+ LLMutexLock lock(this);
+ mNeedsUpdate = FALSE;
+
+ bool edges = mViewOption["show_edges"];
+ bool joint_positions = mViewOption["show_joint_positions"];
+ bool skin_weight = mViewOption["show_skin_weight"];
+ bool textures = mViewOption["show_textures"];
+ bool physics = mViewOption["show_physics"];
+
+ S32 width = getWidth();
+ S32 height = getHeight();
+
+ LLGLSUIDefault def;
+ LLGLDisable no_blend(GL_BLEND);
+ LLGLEnable cull(GL_CULL_FACE);
+ LLGLDepthTest depth(GL_TRUE);
+ LLGLDisable fog(GL_FOG);
+
+ {
+ //clear background to blue
+ glMatrixMode(GL_PROJECTION);
+ gGL.pushMatrix();
+ glLoadIdentity();
+ glOrtho(0.0f, width, 0.0f, height, -1.0f, 1.0f);
+
+ glMatrixMode(GL_MODELVIEW);
+ gGL.pushMatrix();
+ glLoadIdentity();
+
+ gGL.color4f(0.169f, 0.169f, 0.169f, 1.f);
+
+ gl_rect_2d_simple( width, height );
+
+ glMatrixMode(GL_PROJECTION);
+ gGL.popMatrix();
+
+ glMatrixMode(GL_MODELVIEW);
+ gGL.popMatrix();
+ }
+
+ LLFloaterModelPreview* fmp = LLFloaterModelPreview::sInstance;
+
+ bool has_skin_weights = false;
+ bool upload_skin = mFMP->childGetValue("upload_skin").asBoolean();
+ bool upload_joints = mFMP->childGetValue("upload_joints").asBoolean();
+
+ bool resetJoints = false;
+ if ( upload_joints != mLastJointUpdate )
+ {
+ if ( mLastJointUpdate )
+ {
+ resetJoints = true;
+ }
+
+ mLastJointUpdate = upload_joints;
+
+ }
+
+ 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;
+ model->mPelvisOffset = mPelvisZOffset;
+ if (!model->mSkinWeights.empty())
+ {
+ has_skin_weights = true;
+ }
+ }
+ }
+
+ if (has_skin_weights)
+ { //model has skin weights, enable view options for skin weights and joint positions
+ if (fmp)
+ {
+ fmp->enableViewOption("show_skin_weight");
+ fmp->setViewOptionEnabled("show_joint_positions", skin_weight);
+ }
+ mFMP->childEnable("upload_skin");
+ }
+ else
+ {
+ mFMP->childDisable("upload_skin");
+ if (fmp)
+ {
+ mViewOption["show_skin_weight"] = false;
+ fmp->disableViewOption("show_skin_weight");
+ fmp->disableViewOption("show_joint_positions");
+ }
+ skin_weight = false;
+ }
+
+ if (upload_skin && !has_skin_weights)
+ { //can't upload skin weights if model has no skin weights
+ mFMP->childSetValue("upload_skin", false);
+ upload_skin = false;
+ }
+
+ if (!upload_skin && upload_joints)
+ { //can't upload joints if not uploading skin weights
+ mFMP->childSetValue("upload_joints", false);
+ upload_joints = false;
+ }
+
+ 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();
+ F32 aspect = (F32) preview_rect.getWidth()/preview_rect.getHeight();
+
+ LLViewerCamera::getInstance()->setAspect(aspect);
+
+ LLViewerCamera::getInstance()->setView(LLViewerCamera::getInstance()->getDefaultFOV() / mCameraZoom);
+
+ LLVector3 offset = mCameraOffset;
+ LLVector3 target_pos = mPreviewTarget+offset;
+
+ F32 z_near = 0.001f;
+ F32 z_far = mCameraDistance+mPreviewScale.magVec()+mCameraOffset.magVec();
+
+ if (skin_weight)
+ {
+ target_pos = getPreviewAvatar()->getPositionAgent();
+ z_near = 0.01f;
+ z_far = 1024.f;
+ mCameraDistance = 16.f;
+
+ //render avatar previews every frame
+ refresh();
+ }
+
+ glLoadIdentity();
+ gPipeline.enableLightsPreview();
+
+ LLQuaternion camera_rot = LLQuaternion(mCameraPitch, LLVector3::y_axis) *
+ LLQuaternion(mCameraYaw, LLVector3::z_axis);
+
+ LLQuaternion av_rot = camera_rot;
+ LLViewerCamera::getInstance()->setOriginAndLookAt(
+ target_pos + ((LLVector3(mCameraDistance, 0.f, 0.f) + offset) * av_rot), // camera
+ LLVector3::z_axis, // up
+ target_pos); // point of interest
+
+
+ LLViewerCamera::getInstance()->setPerspective(FALSE, mOrigin.mX, mOrigin.mY, width, height, FALSE, z_near, z_far);
+
+ stop_glerror();
+
+ gGL.pushMatrix();
+ const F32 BRIGHTNESS = 0.9f;
+ gGL.color3f(BRIGHTNESS, BRIGHTNESS, BRIGHTNESS);
+
+ LLGLEnable normalize(GL_NORMALIZE);
+
+ if (!mBaseModel.empty() && mVertexBuffer[5].empty())
+ {
+ genBuffers(-1, skin_weight);
+ //genBuffers(3);
+ //genLODs();
+ }
+
+ if (!mModel[mPreviewLOD].empty())
+ {
+ bool regen = mVertexBuffer[mPreviewLOD].empty();
+ if (!regen)
+ {
+ const std::vector<LLPointer<LLVertexBuffer> >& vb_vec = mVertexBuffer[mPreviewLOD].begin()->second;
+ if (!vb_vec.empty())
+ {
+ const LLVertexBuffer* buff = vb_vec[0];
+ regen = buff->hasDataType(LLVertexBuffer::TYPE_WEIGHT4) != skin_weight;
+ }
+ }
+
+ if (regen)
+ {
+ genBuffers(mPreviewLOD, skin_weight);
+ }
+
+ if (!skin_weight)
+ {
+ for (LLMeshUploadThread::instance_list::iterator iter = mUploadData.begin(); iter != mUploadData.end(); ++iter)
+ {
+ LLModelInstance& instance = *iter;
+
+ LLModel* model = instance.mLOD[mPreviewLOD];
+
+ if (!model)
+ {
+ continue;
+ }
+
+ gGL.pushMatrix();
+ LLMatrix4 mat = instance.mTransform;
+
+ glMultMatrixf((GLfloat*) mat.mMatrix);
+
+ 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);
+
+ if (textures)
+ {
+ glColor4fv(instance.mMaterial[i].mDiffuseColor.mV);
+ if (i < instance.mMaterial.size() && instance.mMaterial[i].mDiffuseMap.notNull())
+ {
+ if (instance.mMaterial[i].mDiffuseMap->getDiscardLevel() > -1)
+ {
+ gGL.getTexUnit(0)->bind(instance.mMaterial[i].mDiffuseMap, true);
+ mTextureSet.insert(instance.mMaterial[i].mDiffuseMap.get());
+ }
+ }
+ }
+ else
+ {
+ glColor4f(1,1,1,1);
+ }
+
+ buffer->drawRange(LLRender::TRIANGLES, 0, buffer->getNumVerts()-1, buffer->getNumIndices(), 0);
+ gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+ glColor3f(0.4f, 0.4f, 0.4f);
+
+ if (edges)
+ {
+ glLineWidth(3.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);
+ }
+ }
+ gGL.popMatrix();
+ }
+
+ if (physics)
+ {
+ glClear(GL_DEPTH_BUFFER_BIT);
+ LLGLEnable blend(GL_BLEND);
+ gGL.blendFunc(LLRender::BF_ONE, LLRender::BF_ZERO);
+
+ 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);
+
+
+ bool render_mesh = true;
+
+ LLPhysicsDecomp* decomp = gMeshRepo.mDecompThread;
+ if (decomp)
+ {
+ LLMutexLock(decomp->mMutex);
+
+ 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
+ render_mesh = false;
+ for (U32 i = 0; i < physics.mMesh.size(); ++i)
+ {
+ if (explode > 0.f)
+ {
+ gGL.pushMatrix();
+
+ LLVector3 offset = model->mHullCenter[i]-model->mCenterOfHullCenters;
+ offset *= explode;
+
+ gGL.translatef(offset.mV[0], offset.mV[1], offset.mV[2]);
+ }
+
+ 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));
+ }
+
+ glColor4ubv(hull_colors[i].mV);
+ LLVertexBuffer::drawArrays(LLRender::TRIANGLES, physics.mMesh[i].mPositions, physics.mMesh[i].mNormals);
+
+ if (explode > 0.f)
+ {
+ gGL.popMatrix();
+ }
+ }
+ }
+ }
+
+ if (render_mesh)
+ {
+ 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(LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_TEXCOORD0);
+
+ buffer->drawRange(LLRender::TRIANGLES, 0, buffer->getNumVerts()-1, buffer->getNumIndices(), 0);
+ gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+ glColor4f(0.4f, 0.4f, 0.0f, 0.4f);
+
+ buffer->drawRange(LLRender::TRIANGLES, 0, buffer->getNumVerts()-1, buffer->getNumIndices(), 0);
+
+ glColor3f(1.f, 1.f, 0.f);
+
+ glLineWidth(3.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);
+ }
+ }
+
+ gGL.popMatrix();
+ }
+
+ gGL.setSceneBlendType(LLRender::BT_ALPHA);
+ }
+ }
+ else
+ {
+ target_pos = getPreviewAvatar()->getPositionAgent();
+
+ LLViewerCamera::getInstance()->setOriginAndLookAt(
+ target_pos + ((LLVector3(mCameraDistance, 0.f, 0.f) + offset) * av_rot), // camera
+ LLVector3::z_axis, // up
+ target_pos); // point of interest
+
+ if (joint_positions)
+ {
+ getPreviewAvatar()->renderCollisionVolumes();
+ }
+
+ 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())
+ {
+ for (U32 i = 0; i < mVertexBuffer[mPreviewLOD][model].size(); ++i)
+ {
+ LLVertexBuffer* buffer = mVertexBuffer[mPreviewLOD][model][i];
+
+ const LLVolumeFace& face = model->getVolumeFace(i);
+
+ LLStrider<LLVector3> position;
+ buffer->getVertexStrider(position);
+
+ LLStrider<LLVector4> weight;
+ buffer->getWeight4Strider(weight);
+
+ //quick 'n dirty software vertex skinning
+
+ //build matrix palette
+
+ LLMatrix4 mat[64];
+ for (U32 j = 0; j < model->mSkinInfo.mJointNames.size(); ++j)
+ {
+ LLJoint* joint = getPreviewAvatar()->getJoint(model->mSkinInfo.mJointNames[j]);
+ if (joint)
+ {
+ mat[j] = model->mSkinInfo.mInvBindMatrix[j];
+ mat[j] *= joint->getWorldMatrix();
+ }
+ }
+
+ for (U32 j = 0; j < buffer->getRequestedVerts(); ++j)
+ {
+ LLMatrix4 final_mat;
+ final_mat.mMatrix[0][0] = final_mat.mMatrix[1][1] = final_mat.mMatrix[2][2] = final_mat.mMatrix[3][3] = 0.f;
+
+ LLVector4 wght;
+ S32 idx[4];
+
+ F32 scale = 0.f;
+ for (U32 k = 0; k < 4; k++)
+ {
+ F32 w = weight[j].mV[k];
+
+ idx[k] = (S32) floorf(w);
+ wght.mV[k] = w - floorf(w);
+ scale += wght.mV[k];
+ }
+
+ wght *= 1.f/scale;
+
+ for (U32 k = 0; k < 4; k++)
+ {
+ F32* src = (F32*) mat[idx[k]].mMatrix;
+ F32* dst = (F32*) final_mat.mMatrix;
+
+ F32 w = wght.mV[k];
+
+ for (U32 l = 0; l < 16; l++)
+ {
+ dst[l] += src[l]*w;
+ }
+ }
+
+ //VECTORIZE THIS
+ LLVector3 v(face.mPositions[j].getF32ptr());
+
+ v = v * model->mSkinInfo.mBindShapeMatrix;
+ v = v * final_mat;
+
+ position[j] = v;
+ }
+
+ buffer->setBuffer(LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_TEXCOORD0);
+ glColor4fv(instance.mMaterial[i].mDiffuseColor.mV);
+ gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+ buffer->draw(LLRender::TRIANGLES, buffer->getNumIndices(), 0);
+ glColor3f(0.4f, 0.4f, 0.4f);
+
+ if (edges)
+ {
+ glLineWidth(3.f);
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+ buffer->draw(LLRender::TRIANGLES, buffer->getNumIndices(), 0);
+ glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+ glLineWidth(1.f);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ gGL.popMatrix();
+
+ return TRUE;
+}
+
+//-----------------------------------------------------------------------------
+// refresh()
+//-----------------------------------------------------------------------------
+void LLModelPreview::refresh()
+{
+ mNeedsUpdate = TRUE;
+}
+
+//-----------------------------------------------------------------------------
+// rotate()
+//-----------------------------------------------------------------------------
+void LLModelPreview::rotate(F32 yaw_radians, F32 pitch_radians)
+{
+ mCameraYaw = mCameraYaw + yaw_radians;
+
+ mCameraPitch = llclamp(mCameraPitch + pitch_radians, F_PI_BY_TWO * -0.8f, F_PI_BY_TWO * 0.8f);
+}
+
+//-----------------------------------------------------------------------------
+// zoom()
+//-----------------------------------------------------------------------------
+void LLModelPreview::zoom(F32 zoom_amt)
+{
+ F32 new_zoom = mCameraZoom+zoom_amt;
+
+ mCameraZoom = llclamp(new_zoom, 1.f, 10.f);
+}
+
+void LLModelPreview::pan(F32 right, F32 up)
+{
+ mCameraOffset.mV[VY] = llclamp(mCameraOffset.mV[VY] + right * mCameraDistance / mCameraZoom, -1.f, 1.f);
+ mCameraOffset.mV[VZ] = llclamp(mCameraOffset.mV[VZ] + up * mCameraDistance / mCameraZoom, -1.f, 1.f);
+}
+
+void LLModelPreview::setPreviewLOD(S32 lod)
+{
+ lod = llclamp(lod, 0, (S32) LLModel::LOD_HIGH);
+
+ if (lod != mPreviewLOD)
+ {
+ mPreviewLOD = lod;
+
+ LLComboBox* combo_box = mFMP->getChild<LLComboBox>("preview_lod_combo");
+ combo_box->setCurrentByIndex((NUM_LOD-1)-mPreviewLOD); // combo box list of lods is in reverse order
+ mFMP->childSetTextArg("lod_table_footer", "[DETAIL]", mFMP->getString(lod_name[mPreviewLOD]));
+ mFMP->childSetText("lod_file", mLODFile[mPreviewLOD]);
+
+ // the wizard has three lod drop downs
+ LLComboBox* combo_box2 = mFMP->getChild<LLComboBox>("preview_lod_combo2");
+ combo_box2->setCurrentByIndex((NUM_LOD-1)-mPreviewLOD); // combo box list of lods is in reverse order
+
+ LLComboBox* combo_box3 = mFMP->getChild<LLComboBox>("preview_lod_combo3");
+ combo_box3->setCurrentByIndex((NUM_LOD-1)-mPreviewLOD); // combo box list of lods is in reverse order
+
+ LLColor4 highlight_color = LLUIColorTable::instance().getColor("MeshImportTableHighlightColor");
+ LLColor4 normal_color = LLUIColorTable::instance().getColor("MeshImportTableNormalColor");
+
+ for (S32 i = 0; i <= LLModel::LOD_HIGH; ++i)
+ {
+ const LLColor4& color = (i == lod) ? highlight_color : normal_color;
+
+ mFMP->childSetColor(lod_status_name[i], color);
+ mFMP->childSetColor(lod_label_name[i], color);
+ mFMP->childSetColor(lod_triangles_name[i], color);
+ mFMP->childSetColor(lod_vertices_name[i], color);
+ }
+
+ LLFloaterModelPreview* fmp = LLFloaterModelPreview::sInstance;
+ if (fmp)
+ {
+ LLRadioGroup* radio = fmp->getChild<LLRadioGroup>("lod_file_or_limit");
+ radio->selectNthItem(fmp->mLODMode[mPreviewLOD]);
+ }
+ }
+ refresh();
+ updateStatusMessages();
+}
+
+//static
+void LLFloaterModelPreview::onBrowseLOD(void* data)
+{
+ assert_main_thread();
+
+ LLFloaterModelPreview* mp = (LLFloaterModelPreview*) data;
+ mp->loadModel(mp->mModelPreview->mPreviewLOD);
+}
+
+//static
+void LLFloaterModelPreview::onReset(void* user_data)
+{
+ assert_main_thread();
+
+ LLFloaterModelPreview* fmp = (LLFloaterModelPreview*) user_data;
+ LLModelPreview* mp = fmp->mModelPreview;
+ std::string filename = mp->mLODFile[3];
+ mp->loadModel(filename,3);
+}
+
+//static
+void LLFloaterModelPreview::onUpload(void* user_data)
+{
+ assert_main_thread();
+
+ LLFloaterModelPreview* mp = (LLFloaterModelPreview*) user_data;
+
+ mp->mModelPreview->rebuildUploadData();
+
+ bool upload_skinweights = mp->childGetValue("upload_skin").asBoolean();
+ bool upload_joint_positions = mp->childGetValue("upload_joints").asBoolean();
+
+ 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);
+}
+
+
+//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->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();
+}
+
+void LLModelPreview::onLODParamCommit(bool enforce_tri_limit)
+{
+ if (!mLODFrozen)
+ {
+ genLODs(mPreviewLOD, 3, enforce_tri_limit);
+ updateStatusMessages();
+ refresh();
+ }
+}
+
+LLFloaterModelPreview::DecompRequest::DecompRequest(const std::string& stage, LLModel* mdl)
+{
+ mStage = stage;
+ mContinue = 1;
+ mModel = mdl;
+ mDecompID = &mdl->mDecompID;
+ 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;
+ }
+ }
+}
+
+void LLFloaterModelPreview::setStatusMessage(const std::string& msg)
+{
+ LLMutexLock lock(mStatusLock);
+ mStatusMessage = msg;
+}
+
+S32 LLFloaterModelPreview::DecompRequest::statusCallback(const char* status, S32 p1, S32 p2)
+{
+ if (mContinue)
+ {
+ setStatusMessage(llformat("%s: %d/%d", status, p1, p2));
+ if (LLFloaterModelPreview::sInstance)
+ {
+ LLFloaterModelPreview::sInstance->setStatusMessage(mStatusMessage);
+ }
+ }
+
+ return mContinue;
+}
+
+void LLFloaterModelPreview::DecompRequest::completed()
+{ //called from the main thread
+ if (mContinue)
+ {
+ mModel->setConvexHullDecomposition(mHull);
+
+ if (sInstance)
+ {
+ if (mContinue)
+ {
+ if (sInstance->mModelPreview)
+ {
+ sInstance->mModelPreview->mDirty = true;
+ LLFloaterModelPreview::sInstance->mModelPreview->refresh();
+ }
+ }
+
+ sInstance->mCurRequest.erase(this);
+ }
+ }
+ else if (sInstance)
+ {
+ llassert(sInstance->mCurRequest.find(this) == sInstance->mCurRequest.end());
+ }
+}
diff --git a/indra/newview/llfloatermodelpreview.h b/indra/newview/llfloatermodelpreview.h
new file mode 100644
index 0000000000..f6d4a08d1f
--- /dev/null
+++ b/indra/newview/llfloatermodelpreview.h
@@ -0,0 +1,431 @@
+/**
+ * @file llfloatermodelpreview.h
+ * @brief LLFloaterModelPreview class definition
+ *
+ * $LicenseInfo:firstyear=2004&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLFLOATERMODELPREVIEW_H
+#define LL_LLFLOATERMODELPREVIEW_H
+
+#include "llfloaternamedesc.h"
+
+#include "lldynamictexture.h"
+#include "llfloatermodelwizard.h"
+#include "llquaternion.h"
+#include "llmeshrepository.h"
+#include "llmodel.h"
+#include "llthread.h"
+#include "llviewermenufile.h"
+
+class LLComboBox;
+class LLJoint;
+class LLViewerJointMesh;
+class LLVOAvatar;
+class LLTextBox;
+class LLVertexBuffer;
+class LLModelPreview;
+class LLFloaterModelPreview;
+class daeElement;
+class domProfile_COMMON;
+class domInstance_geometry;
+class domNode;
+class domTranslate;
+class LLMenuButton;
+class LLToggleableMenu;
+
+typedef std::map<std::string, LLMatrix4> JointTransformMap;
+typedef std::map<std::string, LLMatrix4>:: iterator JointTransformMapIt;
+
+const S32 NUM_LOD = 4;
+
+class LLModelLoader : public LLThread
+{
+public:
+ typedef enum
+ {
+ STARTING = 0,
+ READING_FILE,
+ CREATING_FACES,
+ GENERATING_VERTEX_BUFFERS,
+ GENERATING_LOD,
+ DONE,
+ ERROR_PARSING //basically loading failed
+ } eLoadState;
+
+ U32 mState;
+ std::string mFilename;
+ S32 mLod;
+ LLModelPreview* mPreview;
+ LLMatrix4 mTransform;
+ BOOL mFirstTransform;
+ LLVector3 mExtents[2];
+ bool mTrySLM;
+
+ std::map<daeElement*, LLPointer<LLModel> > mModel;
+
+ typedef std::vector<LLPointer<LLModel> > model_list;
+ model_list mModelList;
+
+ typedef std::vector<LLModelInstance> model_instance_list;
+
+ typedef std::map<LLMatrix4, model_instance_list > scene;
+
+ scene mScene;
+
+ typedef std::queue<LLPointer<LLModel> > model_queue;
+
+ //queue of models that need a physics rep
+ model_queue mPhysicsQ;
+
+ LLModelLoader( std::string filename, S32 lod, LLModelPreview* preview, JointTransformMap& jointMap,
+ std::deque<std::string>& jointsFromNodes );
+ ~LLModelLoader() ;
+
+ virtual void run();
+ bool doLoadModel();
+ bool loadFromSLM(const std::string& filename);
+ void loadModelCallback();
+
+ void loadTextures() ; //called in the main thread.
+ void processElement(daeElement* element);
+ std::vector<LLImportMaterial> getMaterials(LLModel* model, domInstance_geometry* instance_geo);
+ LLImportMaterial profileToMaterial(domProfile_COMMON* material);
+ std::string getElementLabel(daeElement *element);
+ LLColor4 getDaeColor(daeElement* element);
+
+ daeElement* getChildFromElement( daeElement* pElement, std::string const & name );
+
+ bool isNodeAJoint( domNode* pNode );
+ void processJointNode( domNode* pNode, std::map<std::string,LLMatrix4>& jointTransforms );
+ void extractTranslation( domTranslate* pTranslate, LLMatrix4& transform );
+ void extractTranslationViaElement( daeElement* pTranslateElement, LLMatrix4& transform );
+
+ void setLoadState(U32 state);
+
+ void buildJointToNodeMappingFromScene( daeElement* pRoot );
+ void processJointToNodeMapping( domNode* pNode );
+
+
+ //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;
+
+private:
+ static std::list<LLModelLoader*> sActiveLoaderList;
+ static bool isAlive(LLModelLoader* loader) ;
+};
+
+class LLFloaterModelPreview : public LLFloater
+{
+public:
+
+ class DecompRequest : public LLPhysicsDecomp::Request
+ {
+ public:
+ S32 mContinue;
+ LLPointer<LLModel> mModel;
+
+ DecompRequest(const std::string& stage, LLModel* mdl);
+ virtual S32 statusCallback(const char* status, S32 p1, S32 p2);
+ virtual void completed();
+
+ };
+ static LLFloaterModelPreview* sInstance;
+
+ LLFloaterModelPreview(const LLSD& key);
+ virtual ~LLFloaterModelPreview();
+
+ virtual BOOL postBuild();
+
+ 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);
+
+ static void onMouseCaptureLostModelPreview(LLMouseHandler*);
+ static void setUploadAmount(S32 amount) { sUploadAmount = amount; }
+
+ void setDetails(F32 x, F32 y, F32 z, F32 streaming_cost, F32 physics_cost);
+
+ static void onBrowseLOD(void* data);
+
+ static void onReset(void* data);
+
+ static void onUpload(void* data);
+
+ static void onClearMaterials(void* data);
+
+ static void refresh(LLUICtrl* ctrl, void* data);
+
+ void updateResourceCost();
+
+ void loadModel(S32 lod);
+
+ void onViewOptionChecked(const LLSD& userdata);
+ bool isViewOptionChecked(const LLSD& userdata);
+ bool isViewOptionEnabled(const LLSD& userdata);
+ void setViewOptionEnabled(const std::string& option, bool enabled);
+ void enableViewOption(const std::string& option);
+ void disableViewOption(const std::string& option);
+
+protected:
+ friend class LLModelPreview;
+ friend class LLMeshFilePicker;
+ friend class LLPhysicsDecomp;
+
+ static void onImportScaleCommit(LLUICtrl*, void*);
+ static void onPelvisOffsetCommit(LLUICtrl*, void*);
+ static void onUploadJointsCommit(LLUICtrl*,void*);
+ static void onUploadSkinCommit(LLUICtrl*,void*);
+
+ static void onPreviewLODCommit(LLUICtrl*,void*);
+
+ static void onGenerateNormalsCommit(LLUICtrl*,void*);
+
+ static void onAutoFillCommit(LLUICtrl*,void*);
+ static void onLODParamCommit(LLUICtrl*,void*);
+ static void onLODParamCommitTriangleLimit(LLUICtrl*,void*);
+
+ static void onExplodeCommit(LLUICtrl*, void*);
+
+ static void onPhysicsParamCommit(LLUICtrl* ctrl, void* userdata);
+ static void onPhysicsStageExecute(LLUICtrl* ctrl, void* userdata);
+ static void onCancel(LLUICtrl* ctrl, void* userdata);
+ static void onPhysicsStageCancel(LLUICtrl* ctrl, void* userdata);
+
+ static void onPhysicsBrowse(LLUICtrl* ctrl, void* userdata);
+ static void onPhysicsUseLOD(LLUICtrl* ctrl, void* userdata);
+ static void onPhysicsOptimize(LLUICtrl* ctrl, void* userdata);
+ static void onPhysicsDecomposeBack(LLUICtrl* ctrl, void* userdata);
+ static void onPhysicsSimplifyBack(LLUICtrl* ctrl, void* userdata);
+
+ void draw();
+
+ void initDecompControls();
+
+ void setStatusMessage(const std::string& msg);
+
+ LLModelPreview* mModelPreview;
+
+ LLPhysicsDecomp::decomp_params mDecompParams;
+
+ S32 mLastMouseX;
+ S32 mLastMouseY;
+ LLRect mPreviewRect;
+ U32 mGLName;
+ static S32 sUploadAmount;
+
+ std::set<LLPointer<DecompRequest> > mCurRequest;
+ std::string mStatusMessage;
+
+ //use "disabled" as false by default
+ std::map<std::string, bool> mViewOptionDisabled;
+
+ //store which lod mode each LOD is using
+ // 0 - load from file
+ // 1 - auto generate
+ // 2 - None
+ S32 mLODMode[4];
+
+ LLMenuButton* mViewOptionMenuButton;
+ LLToggleableMenu* mViewOptionMenu;
+ LLMutex* mStatusLock;
+
+};
+
+class LLMeshFilePicker : public LLFilePickerThread
+{
+public:
+ LLMeshFilePicker(LLModelPreview* mp, S32 lod);
+ virtual void notify(const std::string& filename);
+
+private:
+ LLModelPreview* mMP;
+ S32 mLOD;
+};
+
+
+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;
+
+public:
+ LLModelPreview(S32 width, S32 height, LLFloater* fmp);
+ virtual ~LLModelPreview();
+
+ void resetPreviewTarget();
+ void setPreviewTarget(F32 distance);
+ void setTexture(U32 name) { mTextureName = name; }
+
+ void setPhysicsFromLOD(S32 lod);
+ BOOL render();
+ void update();
+ void genBuffers(S32 lod, bool skinned);
+ void clearBuffers();
+ void refresh();
+ void rotate(F32 yaw_radians, F32 pitch_radians);
+ void zoom(F32 zoom_amt);
+ void pan(F32 right, F32 up);
+ virtual BOOL needsRender() { return mNeedsUpdate; }
+ void setPreviewLOD(S32 lod);
+ void clearModel(S32 lod);
+ void loadModel(std::string filename, S32 lod);
+ 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);
+ void saveUploadData(const std::string& filename, bool save_skinweights, bool save_joint_poisitions);
+ void clearIncompatible(S32 lod);
+ void updateStatusMessages();
+ void clearGLODGroup();
+ void onLODParamCommit(bool enforce_tri_limit);
+
+ const bool getModelPivot( void ) const { return mHasPivot; }
+ 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 );
+ //Is a rig valid so that it can be used as a criteria for allowing for uploading of joint positions
+ //Accessors for joint position upload friendly rigs
+ const bool isRigValidForJointPositionUpload( void ) const { return mRigValidJointUpload; }
+ void setRigValidForJointPositionUpload( bool rigValid ) { mRigValidJointUpload = rigValid; }
+ bool isRigSuitableForJointPositionUpload( const std::vector<std::string> &jointListFromAsset );
+ //Determines if a rig is a legacy from the joint list
+ bool isRigLegacy( const std::vector<std::string> &jointListFromAsset );
+ //Accessors for the legacy rigs
+ const bool isLegacyRigValid( void ) const { return mLegacyRigValid; }
+ void setLegacyRigValid( bool rigValid ) { mLegacyRigValid = rigValid; }
+
+ 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); }
+
+ 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 );
+
+ void createPreviewAvatar( void );
+ LLVOAvatar* getPreviewAvatar( void ) { return mPreviewAvatar; }
+
+ protected:
+ friend class LLModelLoader;
+ friend class LLFloaterModelPreview;
+ friend class LLFloaterModelWizard;
+ friend class LLFloaterModelPreview::DecompRequest;
+ friend class LLFloaterModelWizard::DecompRequest;
+ friend class LLPhysicsDecomp;
+
+ LLFloater* mFMP;
+
+ BOOL mNeedsUpdate;
+ bool mDirty;
+ bool mGenLOD;
+ U32 mTextureName;
+ F32 mCameraDistance;
+ F32 mCameraYaw;
+ F32 mCameraPitch;
+ F32 mCameraZoom;
+ LLVector3 mCameraOffset;
+ LLVector3 mPreviewTarget;
+ LLVector3 mPreviewScale;
+ S32 mPreviewLOD;
+ U32 mResourceCost;
+ std::string mLODFile[LLModel::NUM_LODS];
+ bool mLoading;
+ U32 mLoadState;
+ bool mResetJoints;
+ bool mRigParityWithScene;
+
+ std::map<std::string, bool> mViewOption;
+
+ //GLOD object parameters (must rebuild object if these change)
+ bool mLODFrozen;
+ F32 mBuildShareTolerance;
+ U32 mBuildQueueMode;
+ U32 mBuildOperator;
+ U32 mBuildBorderMode;
+ U32 mRequestedLoDMode[LLModel::NUM_LODS];
+ S32 mRequestedTriangleCount[LLModel::NUM_LODS];
+ F32 mRequestedErrorThreshold[LLModel::NUM_LODS];
+ U32 mRequestedBuildOperator[LLModel::NUM_LODS];
+ U32 mRequestedQueueMode[LLModel::NUM_LODS];
+ U32 mRequestedBorderMode[LLModel::NUM_LODS];
+ F32 mRequestedShareTolerance[LLModel::NUM_LODS];
+ F32 mRequestedCreaseAngle[LLModel::NUM_LODS];
+
+ LLModelLoader* mModelLoader;
+
+ LLModelLoader::scene mScene[LLModel::NUM_LODS];
+ LLModelLoader::scene mBaseScene;
+
+ LLModelLoader::model_list mModel[LLModel::NUM_LODS];
+ LLModelLoader::model_list mBaseModel;
+
+ U32 mGroup;
+ std::map<LLPointer<LLModel>, U32> mObject;
+ U32 mMaxTriangleLimit;
+
+ LLMeshUploadThread::instance_list mUploadData;
+ std::set<LLViewerFetchedTexture* > mTextureSet;
+
+ //map of vertex buffers to models (one vertex buffer in vector per face in model
+ std::map<LLModel*, std::vector<LLPointer<LLVertexBuffer> > > mVertexBuffer[LLModel::NUM_LODS+1];
+
+ details_signal_t mDetailsSignal;
+ model_loaded_signal_t mModelLoadedSignal;
+
+ LLVector3 mModelPivot;
+ bool mHasPivot;
+
+ float mPelvisZOffset;
+
+ bool mRigValidJointUpload;
+ bool mLegacyRigValid;
+
+ bool mLastJointUpdate;
+
+ std::deque<std::string> mMasterJointList;
+ std::deque<std::string> mMasterLegacyJointList;
+ std::deque<std::string> mJointsFromNode;
+ JointTransformMap mJointTransformMap;
+ LLPointer<LLVOAvatar> mPreviewAvatar;
+};
+
+#endif // LL_LLFLOATERMODELPREVIEW_H
diff --git a/indra/newview/llfloatermodelwizard.cpp b/indra/newview/llfloatermodelwizard.cpp
new file mode 100644
index 0000000000..faf81dbc5c
--- /dev/null
+++ b/indra/newview/llfloatermodelwizard.cpp
@@ -0,0 +1,679 @@
+/**
+ * @file llfloatermodelwizard.cpp
+ * @author Leyla Farazha
+ * @brief Implementation of the LLFloaterModelWizard class.
+ *
+ * $LicenseInfo:firstyear=2002&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llbutton.h"
+#include "lldrawable.h"
+#include "llcheckboxctrl.h"
+#include "llcombobox.h"
+#include "llfloater.h"
+#include "llfloatermodelwizard.h"
+#include "llfloatermodelpreview.h"
+#include "llfloaterreg.h"
+#include "llsliderctrl.h"
+#include "lltoolmgr.h"
+#include "llviewerwindow.h"
+
+LLFloaterModelWizard* LLFloaterModelWizard::sInstance = NULL;
+
+static const std::string stateNames[]={
+ "choose_file",
+ "optimize",
+ "physics",
+ "physics2",
+ "review",
+ "upload"};
+
+LLFloaterModelWizard::LLFloaterModelWizard(const LLSD& key)
+ : LLFloater(key)
+{
+ mLastEnabledState = CHOOSE_FILE;
+ sInstance = this;
+
+ 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));
+}
+LLFloaterModelWizard::~LLFloaterModelWizard()
+{
+ sInstance = NULL;
+}
+void LLFloaterModelWizard::setState(int state)
+{
+
+ mState = state;
+
+ for(size_t t=0; t<LL_ARRAY_SIZE(stateNames); ++t)
+ {
+ LLView *view = getChildView(stateNames[t]+"_panel");
+ if (view)
+ {
+ view->setVisible(state == (int) t ? TRUE : FALSE);
+ }
+ }
+
+ if (state == CHOOSE_FILE)
+ {
+ mModelPreview->mViewOption["show_physics"] = false;
+
+ getChildView("close")->setVisible(false);
+ getChildView("back")->setVisible(true);
+ getChildView("back")->setEnabled(false);
+ getChildView("next")->setVisible(true);
+ getChildView("upload")->setVisible(false);
+ getChildView("cancel")->setVisible(true);
+ }
+
+ if (state == OPTIMIZE)
+ {
+ if (mLastEnabledState < state)
+ {
+ mModelPreview->genLODs(-1);
+ }
+
+ mModelPreview->mViewOption["show_physics"] = false;
+
+ getChildView("back")->setVisible(true);
+ getChildView("back")->setEnabled(true);
+ getChildView("close")->setVisible(false);
+ getChildView("next")->setVisible(true);
+ getChildView("upload")->setVisible(false);
+ getChildView("cancel")->setVisible(true);
+ }
+
+ if (state == PHYSICS)
+ {
+ 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");
+ }
+
+ mModelPreview->mViewOption["show_physics"] = true;
+
+ getChildView("next")->setVisible(true);
+ getChildView("next")->setEnabled(true);
+ getChildView("upload")->setVisible(false);
+ getChildView("close")->setVisible(false);
+ getChildView("back")->setVisible(true);
+ getChildView("back")->setEnabled(true);
+ getChildView("cancel")->setVisible(true);
+ }
+
+ if (state == REVIEW)
+ {
+
+ mModelPreview->mViewOption["show_physics"] = false;
+
+ getChildView("close")->setVisible(false);
+ getChildView("next")->setVisible(false);
+ getChildView("back")->setVisible(true);
+ getChildView("back")->setEnabled(true);
+ getChildView("upload")->setVisible(true);
+ getChildView("cancel")->setVisible(true);
+ }
+
+ if (state == UPLOAD)
+ {
+ getChildView("close")->setVisible(true);
+ getChildView("next")->setVisible(false);
+ getChildView("back")->setVisible(false);
+ getChildView("upload")->setVisible(false);
+ getChildView("cancel")->setVisible(false);
+ }
+
+ updateButtons();
+}
+
+
+
+void LLFloaterModelWizard::updateButtons()
+{
+ if (mLastEnabledState < mState)
+ {
+ mLastEnabledState = mState;
+ }
+
+ for(size_t i=0; i<LL_ARRAY_SIZE(stateNames); ++i)
+ {
+ LLButton *button = getChild<LLButton>(stateNames[i]+"_btn");
+
+ if (i == mState)
+ {
+ button->setEnabled(TRUE);
+ button->setToggleState(TRUE);
+ }
+ else if (i <= mLastEnabledState)
+ {
+ button->setEnabled(TRUE);
+ button->setToggleState(FALSE);
+ }
+ else
+ {
+ button->setEnabled(FALSE);
+ }
+ }
+
+ LLButton *physics_button = getChild<LLButton>(stateNames[PHYSICS]+"_btn");
+
+ if (mState == PHYSICS2)
+ {
+ physics_button->setVisible(false);
+ }
+ else
+ {
+ physics_button->setVisible(true);
+ }
+
+}
+
+void LLFloaterModelWizard::loadModel()
+{
+ mModelPreview->mLoading = TRUE;
+
+ (new LLMeshFilePicker(mModelPreview, 3))->getFile();
+}
+
+void LLFloaterModelWizard::onClickCancel()
+{
+ closeFloater();
+}
+
+void LLFloaterModelWizard::onClickBack()
+{
+ setState(llmax((int) CHOOSE_FILE, mState-1));
+}
+
+void LLFloaterModelWizard::onClickNext()
+{
+ setState(llmin((int) UPLOAD, mState+1));
+}
+
+bool LLFloaterModelWizard::onEnableNext()
+{
+ return true;
+}
+
+bool LLFloaterModelWizard::onEnableBack()
+{
+ return true;
+}
+
+
+//-----------------------------------------------------------------------------
+// handleMouseDown()
+//-----------------------------------------------------------------------------
+BOOL LLFloaterModelWizard::handleMouseDown(S32 x, S32 y, MASK mask)
+{
+ if (mPreviewRect.pointInRect(x, y))
+ {
+ bringToFront( x, y );
+ gFocusMgr.setMouseCapture(this);
+ gViewerWindow->hideCursor();
+ mLastMouseX = x;
+ mLastMouseY = y;
+ return TRUE;
+ }
+
+ return LLFloater::handleMouseDown(x, y, mask);
+}
+
+//-----------------------------------------------------------------------------
+// handleMouseUp()
+//-----------------------------------------------------------------------------
+BOOL LLFloaterModelWizard::handleMouseUp(S32 x, S32 y, MASK mask)
+{
+ gFocusMgr.setMouseCapture(FALSE);
+ gViewerWindow->showCursor();
+ return LLFloater::handleMouseUp(x, y, mask);
+}
+
+//-----------------------------------------------------------------------------
+// handleHover()
+//-----------------------------------------------------------------------------
+BOOL LLFloaterModelWizard::handleHover (S32 x, S32 y, MASK mask)
+{
+ MASK local_mask = mask & ~MASK_ALT;
+
+ if (mModelPreview && hasMouseCapture())
+ {
+ if (local_mask == MASK_PAN)
+ {
+ // pan here
+ mModelPreview->pan((F32)(x - mLastMouseX) * -0.005f, (F32)(y - mLastMouseY) * -0.005f);
+ }
+ else if (local_mask == MASK_ORBIT)
+ {
+ F32 yaw_radians = (F32)(x - mLastMouseX) * -0.01f;
+ F32 pitch_radians = (F32)(y - mLastMouseY) * 0.02f;
+
+ mModelPreview->rotate(yaw_radians, pitch_radians);
+ }
+ else
+ {
+
+ F32 yaw_radians = (F32)(x - mLastMouseX) * -0.01f;
+ F32 zoom_amt = (F32)(y - mLastMouseY) * 0.02f;
+
+ mModelPreview->rotate(yaw_radians, 0.f);
+ mModelPreview->zoom(zoom_amt);
+ }
+
+
+ mModelPreview->refresh();
+
+ LLUI::setMousePositionLocal(this, mLastMouseX, mLastMouseY);
+ }
+
+ if (!mPreviewRect.pointInRect(x, y) || !mModelPreview)
+ {
+ return LLFloater::handleHover(x, y, mask);
+ }
+ else if (local_mask == MASK_ORBIT)
+ {
+ gViewerWindow->setCursor(UI_CURSOR_TOOLCAMERA);
+ }
+ else if (local_mask == MASK_PAN)
+ {
+ gViewerWindow->setCursor(UI_CURSOR_TOOLPAN);
+ }
+ else
+ {
+ gViewerWindow->setCursor(UI_CURSOR_TOOLZOOMIN);
+ }
+
+ return TRUE;
+}
+
+//-----------------------------------------------------------------------------
+// handleScrollWheel()
+//-----------------------------------------------------------------------------
+BOOL LLFloaterModelWizard::handleScrollWheel(S32 x, S32 y, S32 clicks)
+{
+ if (mPreviewRect.pointInRect(x, y) && mModelPreview)
+ {
+ mModelPreview->zoom((F32)clicks * -0.2f);
+ mModelPreview->refresh();
+ }
+
+ return TRUE;
+}
+
+void LLFloaterModelWizard::initDecompControls()
+{
+ LLSD key;
+
+ static const LLCDStageData* stage = NULL;
+ static S32 stage_count = 0;
+
+ if (!stage && LLConvexDecomposition::getInstance() != NULL)
+ {
+ stage_count = LLConvexDecomposition::getInstance()->getStages(&stage);
+ }
+
+ static const LLCDParam* param = NULL;
+ static S32 param_count = 0;
+ if (!param && LLConvexDecomposition::getInstance() != NULL)
+ {
+ param_count = LLConvexDecomposition::getInstance()->getParameters(&param);
+ }
+
+ for (S32 j = stage_count-1; j >= 0; --j)
+ {
+ gMeshRepo.mDecompThread->mStageID[stage[j].mName] = j;
+ // protected against stub by stage_count being 0 for stub above
+ LLConvexDecomposition::getInstance()->registerCallback(j, LLPhysicsDecomp::llcdCallback);
+
+ for (S32 i = 0; i < param_count; ++i)
+ {
+ if (param[i].mStage != j)
+ {
+ continue;
+ }
+
+ std::string name(param[i].mName ? param[i].mName : "");
+ std::string description(param[i].mDescription ? param[i].mDescription : "");
+
+ if (param[i].mType == LLCDParam::LLCD_FLOAT)
+ {
+ mDecompParams[param[i].mName] = LLSD(param[i].mDefault.mFloat);
+ }
+ else if (param[i].mType == LLCDParam::LLCD_INTEGER)
+ {
+ mDecompParams[param[i].mName] = LLSD(param[i].mDefault.mIntOrEnumValue);
+ }
+ else if (param[i].mType == LLCDParam::LLCD_BOOLEAN)
+ {
+ mDecompParams[param[i].mName] = LLSD(param[i].mDefault.mBool);
+ }
+ else if (param[i].mType == LLCDParam::LLCD_ENUM)
+ {
+ mDecompParams[param[i].mName] = LLSD(param[i].mDefault.mIntOrEnumValue);
+ }
+ }
+ }
+
+ mDecompParams["Simplify Method"] = 0; // set it to retain %
+}
+
+//static
+void LLFloaterModelWizard::executePhysicsStage(std::string stage_name)
+{
+ if (sInstance)
+ {
+ F64 physics_accuracy = sInstance->getChild<LLSliderCtrl>("physics_slider")->getValue().asReal();
+
+ sInstance->mDecompParams["Retain%"] = physics_accuracy;
+
+ if (!sInstance->mCurRequest.empty())
+ {
+ llinfos << "Decomposition request still pending." << llendl;
+ return;
+ }
+
+ if (sInstance->mModelPreview)
+ {
+ for (S32 i = 0; i < sInstance->mModelPreview->mModel[LLModel::LOD_PHYSICS].size(); ++i)
+ {
+ LLModel* mdl = sInstance->mModelPreview->mModel[LLModel::LOD_PHYSICS][i];
+ DecompRequest* request = new DecompRequest(stage_name, mdl);
+ sInstance->mCurRequest.insert(request);
+ gMeshRepo.mDecompThread->submitRequest(request);
+ }
+ }
+ }
+}
+
+LLFloaterModelWizard::DecompRequest::DecompRequest(const std::string& stage, LLModel* mdl)
+{
+ mStage = stage;
+ mContinue = 1;
+ mModel = mdl;
+ mDecompID = &mdl->mDecompID;
+ 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;
+ }
+ }
+}
+
+
+S32 LLFloaterModelWizard::DecompRequest::statusCallback(const char* status, S32 p1, S32 p2)
+{
+ setStatusMessage(llformat("%s: %d/%d", status, p1, p2));
+
+ return mContinue;
+}
+
+void LLFloaterModelWizard::DecompRequest::completed()
+{ //called from the main thread
+ mModel->setConvexHullDecomposition(mHull);
+
+ if (sInstance)
+ {
+ if (sInstance->mModelPreview)
+ {
+ sInstance->mModelPreview->mDirty = true;
+ LLFloaterModelWizard::sInstance->mModelPreview->refresh();
+ }
+
+ sInstance->mCurRequest.erase(this);
+ }
+
+ if (mStage == "Decompose")
+ {
+ executePhysicsStage("Simplify");
+ }
+}
+
+
+BOOL LLFloaterModelWizard::postBuild()
+{
+ LLView* preview_panel = getChildView("preview_panel");
+
+ childSetValue("import_scale", (F32) 0.67335826);
+
+ getChild<LLUICtrl>("browse")->setCommitCallback(boost::bind(&LLFloaterModelWizard::loadModel, this));
+ //getChild<LLUICtrl>("lod_file")->setCommitCallback(boost::bind(&LLFloaterModelWizard::loadModel, this));
+ getChild<LLUICtrl>("cancel")->setCommitCallback(boost::bind(&LLFloaterModelWizard::onClickCancel, this));
+ getChild<LLUICtrl>("close")->setCommitCallback(boost::bind(&LLFloaterModelWizard::onClickCancel, this));
+ getChild<LLUICtrl>("back")->setCommitCallback(boost::bind(&LLFloaterModelWizard::onClickBack, this));
+ 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));
+
+ 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->mViewOption["show_textures"] = true;
+
+ center();
+
+ setState(CHOOSE_FILE);
+
+ childSetTextArg("import_dimensions", "[X]", LLStringUtil::null);
+ childSetTextArg("import_dimensions", "[Y]", LLStringUtil::null);
+ childSetTextArg("import_dimensions", "[Z]", LLStringUtil::null);
+
+ initDecompControls();
+
+ return TRUE;
+}
+
+
+void LLFloaterModelWizard::setDetails(F32 x, F32 y, F32 z, F32 streaming_cost, F32 physics_cost)
+{
+ // iterate through all the panels, setting the dimensions
+ for(size_t t=0; t<LL_ARRAY_SIZE(stateNames); ++t)
+ {
+ LLPanel *panel = getChild<LLPanel>(stateNames[t]+"_panel");
+ if (panel)
+ {
+ 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));
+ }
+ }
+}
+
+void LLFloaterModelWizard::modelLoadedCallback()
+{
+ mLastEnabledState = CHOOSE_FILE;
+ getChild<LLCheckBoxCtrl>("confirm_checkbox")->set(FALSE);
+ updateButtons();
+}
+
+void LLFloaterModelWizard::onPhysicsChanged()
+{
+ mLastEnabledState = PHYSICS;
+ updateButtons();
+}
+
+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();
+}
+
+
+void LLFloaterModelWizard::onPreviewLODCommit(LLUICtrl* ctrl)
+{
+ if (!mModelPreview)
+ {
+ return;
+ }
+
+ S32 which_mode = 0;
+
+ LLComboBox* combo = (LLComboBox*) ctrl;
+
+ which_mode = (NUM_LOD-1)-combo->getFirstSelectedIndex(); // combo box list of lods is in reverse order
+
+ mModelPreview->setPreviewLOD(which_mode);
+}
+
+void LLFloaterModelWizard::refresh()
+{
+ if (mState == CHOOSE_FILE)
+ {
+ bool model_loaded = false;
+
+ if (mModelPreview && mModelPreview->getLoadState() == LLModelLoader::DONE)
+ {
+ model_loaded = true;
+ }
+
+ getChildView("next")->setEnabled(model_loaded);
+ }
+ if (mState == REVIEW)
+ {
+ getChildView("upload")->setEnabled(getChild<LLCheckBoxCtrl>("confirm_checkbox")->getValue().asBoolean());
+ }
+
+}
+
+void LLFloaterModelWizard::draw()
+{
+ refresh();
+
+ LLFloater::draw();
+ LLRect r = getRect();
+
+ mModelPreview->update();
+
+ if (mModelPreview)
+ {
+ 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.texCoord2f(0.f, 0.f);
+ gGL.vertex2i(item_rect.mLeft, item_rect.mBottom);
+ gGL.texCoord2f(1.f, 0.f);
+ gGL.vertex2i(item_rect.mRight-1, item_rect.mBottom);
+ gGL.texCoord2f(1.f, 1.f);
+ gGL.vertex2i(item_rect.mRight-1, item_rect.mTop-1);
+ }
+ gGL.end();
+
+ gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+ }
+}
diff --git a/indra/newview/llfloatermodelwizard.h b/indra/newview/llfloatermodelwizard.h
new file mode 100644
index 0000000000..b166d26295
--- /dev/null
+++ b/indra/newview/llfloatermodelwizard.h
@@ -0,0 +1,113 @@
+/**
+ * @file llfloatermodelwizard.h
+ *
+ * $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 LLFLOATERMODELWIZARD_H
+#define LLFLOATERMODELWIZARD_H
+
+
+#include "llmeshrepository.h"
+#include "llmodel.h"
+#include "llthread.h"
+
+
+class LLModelPreview;
+
+
+class LLFloaterModelWizard : public LLFloater
+{
+public:
+
+ class DecompRequest : public LLPhysicsDecomp::Request
+ {
+ public:
+ S32 mContinue;
+ LLPointer<LLModel> mModel;
+
+ DecompRequest(const std::string& stage, LLModel* mdl);
+ virtual S32 statusCallback(const char* status, S32 p1, S32 p2);
+ virtual void completed();
+
+ };
+
+ static LLFloaterModelWizard* sInstance;
+
+ LLFloaterModelWizard(const LLSD& key);
+ virtual ~LLFloaterModelWizard();
+ /*virtual*/ BOOL postBuild();
+ void draw();
+ void refresh();
+
+ 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);
+
+ void setDetails(F32 x, F32 y, F32 z, F32 streaming_cost, F32 physics_cost);
+ void modelLoadedCallback();
+ void onPhysicsChanged();
+ void initDecompControls();
+
+ LLPhysicsDecomp::decomp_params mDecompParams;
+ std::set<LLPointer<DecompRequest> > mCurRequest;
+ std::string mStatusMessage;
+ static void executePhysicsStage(std::string stage_name);
+
+private:
+ enum EWizardState
+ {
+ CHOOSE_FILE = 0,
+ OPTIMIZE,
+ PHYSICS,
+ PHYSICS2,
+ REVIEW,
+ UPLOAD
+ };
+
+ void setState(int state);
+ void updateButtons();
+ void onClickCancel();
+ void onClickBack();
+ void onClickNext();
+ bool onEnableNext();
+ bool onEnableBack();
+ void loadModel();
+ void onPreviewLODCommit(LLUICtrl*);
+ void onAccuracyPerformance(const LLSD& data);
+ void onUpload();
+
+ LLModelPreview* mModelPreview;
+ LLRect mPreviewRect;
+ int mState;
+
+ S32 mLastMouseX;
+ S32 mLastMouseY;
+
+ U32 mLastEnabledState;
+
+
+};
+
+
+#endif
diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp
index 1a9d0af9af..7848484ac6 100644..100755
--- a/indra/newview/llfloaterpreference.cpp
+++ b/indra/newview/llfloaterpreference.cpp
@@ -43,6 +43,7 @@
#include "llcombobox.h"
#include "llcommandhandler.h"
#include "lldirpicker.h"
+#include "lleventtimer.h"
#include "llfeaturemanager.h"
#include "llfocusmgr.h"
//#include "llfirstuse.h"
@@ -73,6 +74,7 @@
#include "llviewerwindow.h"
#include "llviewermessage.h"
#include "llviewershadermgr.h"
+#include "llviewerthrottle.h"
#include "llvotree.h"
#include "llvosky.h"
@@ -109,6 +111,7 @@
const F32 MAX_USER_FAR_CLIP = 512.f;
const F32 MIN_USER_FAR_CLIP = 64.f;
+const F32 BANDWIDTH_UPDATER_TIMEOUT = 0.5f;
//control value for middle mouse as talk2push button
const static std::string MIDDLE_MOUSE_CV = "MiddleMouse";
@@ -184,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);
@@ -286,8 +303,7 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key)
mOriginalIMViaEmail(false),
mLanguageChanged(false),
mAvatarDataInitialized(false),
- mDoubleClickActionDirty(false),
- mFavoritesRecordMayExist(false)
+ mDoubleClickActionDirty(false)
{
//Build Floater is now Called from LLFloaterReg::add("preferences", "floater_preferences.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPreference>);
@@ -303,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));
@@ -311,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));
@@ -412,6 +429,8 @@ BOOL LLFloaterPreference::postBuild()
gSavedSettings.getControl("ChatFontSize")->getSignal()->connect(boost::bind(&LLNearbyChat::processChatHistoryStyleUpdate, _2));
+ gSavedSettings.getControl("ChatFontSize")->getSignal()->connect(boost::bind(&LLViewerChat::signalChatFontChanged));
+
gSavedSettings.getControl("ChatBubbleOpacity")->getSignal()->connect(boost::bind(&LLFloaterPreference::onNameTagOpacityChange, this, _2));
LLTabContainer* tabcontainer = getChild<LLTabContainer>("pref core");
@@ -565,34 +584,6 @@ void LLFloaterPreference::apply()
updateDoubleClickSettings();
mDoubleClickActionDirty = false;
}
-
- if (mFavoritesRecordMayExist && !gSavedPerAccountSettings.getBOOL("ShowFavoritesOnLogin"))
- {
- removeFavoritesRecordOfUser();
- }
-}
-
-void LLFloaterPreference::removeFavoritesRecordOfUser()
-{
- mFavoritesRecordMayExist = false;
- std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "stored_favorites.xml");
- LLSD fav_llsd;
- llifstream file;
- file.open(filename);
- if (!file.is_open()) return;
- LLSDSerialize::fromXML(fav_llsd, file);
-
- LLAvatarName av_name;
- LLAvatarNameCache::get( gAgentID, &av_name );
- if (fav_llsd.has(av_name.getLegacyName()))
- {
- fav_llsd.erase(av_name.getLegacyName());
- }
-
- llofstream out_file;
- out_file.open(filename);
- LLSDSerialize::toPrettyXML(fav_llsd, out_file);
-
}
void LLFloaterPreference::cancel()
@@ -678,11 +669,6 @@ void LLFloaterPreference::onOpen(const LLSD& key)
getChildView("maturity_desired_combobox")->setVisible( false);
}
- if (LLStartUp::getStartupState() == STATE_STARTED)
- {
- mFavoritesRecordMayExist = gSavedPerAccountSettings.getBOOL("ShowFavoritesOnLogin");
- }
-
// Forget previous language changes.
mLanguageChanged = false;
@@ -838,6 +824,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);
@@ -897,14 +888,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);
@@ -1016,9 +1008,15 @@ void LLFloaterPreference::refreshEnabledState()
LLCheckBoxCtrl* ctrl_avatar_vp = getChild<LLCheckBoxCtrl>("AvatarVertexProgram");
// Avatar Render Mode
LLCheckBoxCtrl* ctrl_avatar_cloth = getChild<LLCheckBoxCtrl>("AvatarCloth");
+
+ bool avatar_vp_enabled = LLFeatureManager::getInstance()->isFeatureAvailable("RenderAvatarVP");
+ if (LLViewerShaderMgr::sInitialized)
+ {
+ S32 max_avatar_shader = LLViewerShaderMgr::instance()->mMaxAvatarShaderLevel;
+ avatar_vp_enabled = (max_avatar_shader > 0) ? TRUE : FALSE;
+ }
- S32 max_avatar_shader = LLViewerShaderMgr::instance()->mMaxAvatarShaderLevel;
- ctrl_avatar_vp->setEnabled((max_avatar_shader > 0) ? TRUE : FALSE);
+ ctrl_avatar_vp->setEnabled(avatar_vp_enabled);
if (gSavedSettings.getBOOL("VertexShaderEnable") == FALSE ||
gSavedSettings.getBOOL("RenderAvatarVP") == FALSE)
@@ -1035,7 +1033,7 @@ void LLFloaterPreference::refreshEnabledState()
LLCheckBoxCtrl* ctrl_shader_enable = getChild<LLCheckBoxCtrl>("BasicShaders");
// radio set for terrain detail mode
LLRadioGroup* mRadioTerrainDetail = getChild<LLRadioGroup>("TerrainDetailRadio"); // can be linked with control var
-
+
ctrl_shader_enable->setEnabled(LLFeatureManager::getInstance()->isFeatureAvailable("VertexShaderEnable"));
BOOL shaders = ctrl_shader_enable->get();
@@ -1058,26 +1056,28 @@ void LLFloaterPreference::refreshEnabledState()
//Deferred/SSAO/Shadows
LLCheckBoxCtrl* ctrl_deferred = getChild<LLCheckBoxCtrl>("UseLightShaders");
- if (LLFeatureManager::getInstance()->isFeatureAvailable("RenderUseFBO") &&
- LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferred") &&
- shaders)
- {
- BOOL enabled = (ctrl_wind_light->get()) ? TRUE : FALSE;
+
+ BOOL enabled = LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferred") &&
+ shaders &&
+ gGLManager.mHasFramebufferObject &&
+ gSavedSettings.getBOOL("RenderAvatarVP") &&
+ (ctrl_wind_light->get()) ? TRUE : FALSE;
- ctrl_deferred->setEnabled(enabled);
+ ctrl_deferred->setEnabled(enabled);
- LLCheckBoxCtrl* ctrl_ssao = getChild<LLCheckBoxCtrl>("UseSSAO");
- LLComboBox* ctrl_shadow = getChild<LLComboBox>("ShadowDetail");
+ LLCheckBoxCtrl* ctrl_ssao = getChild<LLCheckBoxCtrl>("UseSSAO");
+ LLCheckBoxCtrl* ctrl_dof = getChild<LLCheckBoxCtrl>("UseDoF");
+ LLComboBox* ctrl_shadow = getChild<LLComboBox>("ShadowDetail");
- enabled = enabled && LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferredSSAO") && (ctrl_deferred->get() ? TRUE : FALSE);
+ enabled = enabled && LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferredSSAO") && (ctrl_deferred->get() ? TRUE : FALSE);
- ctrl_ssao->setEnabled(enabled);
-
- enabled = enabled && LLFeatureManager::getInstance()->isFeatureAvailable("RenderShadowDetail");
+ ctrl_ssao->setEnabled(enabled);
+ ctrl_dof->setEnabled(enabled);
- ctrl_shadow->setEnabled(enabled);
- }
+ enabled = enabled && LLFeatureManager::getInstance()->isFeatureAvailable("RenderShadowDetail");
+ ctrl_shadow->setEnabled(enabled);
+
// now turn off any features that are unavailable
disableUnavailableSettings();
@@ -1096,6 +1096,7 @@ void LLFloaterPreference::disableUnavailableSettings()
LLCheckBoxCtrl* ctrl_deferred = getChild<LLCheckBoxCtrl>("UseLightShaders");
LLComboBox* ctrl_shadows = getChild<LLComboBox>("ShadowDetail");
LLCheckBoxCtrl* ctrl_ssao = getChild<LLCheckBoxCtrl>("UseSSAO");
+ LLCheckBoxCtrl* ctrl_dof = getChild<LLCheckBoxCtrl>("UseDoF");
// if vertex shaders off, disable all shader related products
if(!LLFeatureManager::getInstance()->isFeatureAvailable("VertexShaderEnable"))
@@ -1121,6 +1122,9 @@ void LLFloaterPreference::disableUnavailableSettings()
ctrl_ssao->setEnabled(FALSE);
ctrl_ssao->setValue(FALSE);
+ ctrl_dof->setEnabled(FALSE);
+ ctrl_dof->setValue(FALSE);
+
ctrl_deferred->setEnabled(FALSE);
ctrl_deferred->setValue(FALSE);
}
@@ -1138,12 +1142,16 @@ void LLFloaterPreference::disableUnavailableSettings()
ctrl_ssao->setEnabled(FALSE);
ctrl_ssao->setValue(FALSE);
+ ctrl_dof->setEnabled(FALSE);
+ ctrl_dof->setValue(FALSE);
+
ctrl_deferred->setEnabled(FALSE);
ctrl_deferred->setValue(FALSE);
}
// disabled deferred
- if(!LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferred"))
+ if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferred") ||
+ !gGLManager.mHasFramebufferObject)
{
ctrl_shadows->setEnabled(FALSE);
ctrl_shadows->setValue(0);
@@ -1151,6 +1159,9 @@ void LLFloaterPreference::disableUnavailableSettings()
ctrl_ssao->setEnabled(FALSE);
ctrl_ssao->setValue(FALSE);
+ ctrl_dof->setEnabled(FALSE);
+ ctrl_dof->setValue(FALSE);
+
ctrl_deferred->setEnabled(FALSE);
ctrl_deferred->setValue(FALSE);
}
@@ -1192,6 +1203,9 @@ void LLFloaterPreference::disableUnavailableSettings()
ctrl_ssao->setEnabled(FALSE);
ctrl_ssao->setValue(FALSE);
+ ctrl_dof->setEnabled(FALSE);
+ ctrl_dof->setValue(FALSE);
+
ctrl_deferred->setEnabled(FALSE);
ctrl_deferred->setValue(FALSE);
}
@@ -1273,6 +1287,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()
{
@@ -1558,10 +1580,56 @@ void LLFloaterPreference::setCacheLocation(const LLStringExplicit& location)
cache_location_editor->setToolTip(location);
}
+//------------------------------Updater---------------------------------------
+
+static bool handleBandwidthChanged(const LLSD& newvalue)
+{
+ gViewerThrottle.setMaxBandwidth((F32) newvalue.asReal());
+ return true;
+}
+
+class LLPanelPreference::Updater : public LLEventTimer
+{
+
+public:
+
+ typedef boost::function<bool(const LLSD&)> callback_t;
+
+ Updater(callback_t cb, F32 period)
+ :LLEventTimer(period),
+ mCallback(cb)
+ {
+ mEventTimer.stop();
+ }
+
+ virtual ~Updater(){}
+
+ void update(const LLSD& new_value)
+ {
+ mNewValue = new_value;
+ mEventTimer.start();
+ }
+
+protected:
+
+ BOOL tick()
+ {
+ mCallback(mNewValue);
+ mEventTimer.stop();
+
+ return FALSE;
+ }
+
+private:
+
+ LLSD mNewValue;
+ callback_t mCallback;
+};
//----------------------------------------------------------------------------
static LLRegisterPanelClassWrapper<LLPanelPreference> t_places("panel_preference");
LLPanelPreference::LLPanelPreference()
-: LLPanel()
+: LLPanel(),
+ mBandWidthUpdater(NULL)
{
mCommitCallbackRegistrar.add("Pref.setControlFalse", boost::bind(&LLPanelPreference::setControlFalse,this, _2));
mCommitCallbackRegistrar.add("Pref.updateMediaAutoPlayCheckbox", boost::bind(&LLPanelPreference::updateMediaAutoPlayCheckbox, this, _1));
@@ -1631,10 +1699,24 @@ BOOL LLPanelPreference::postBuild()
}
}
+ //////////////////////PanelSetup ///////////////////
+ if (hasChild("max_bandwidth"))
+ {
+ mBandWidthUpdater = new LLPanelPreference::Updater(boost::bind(&handleBandwidthChanged, _1), BANDWIDTH_UPDATER_TIMEOUT);
+ gSavedSettings.getControl("ThrottleBandwidthKBPS")->getSignal()->connect(boost::bind(&LLPanelPreference::Updater::update, mBandWidthUpdater, _2));
+ }
+
apply();
return true;
}
+LLPanelPreference::~LLPanelPreference()
+{
+ if (mBandWidthUpdater)
+ {
+ delete mBandWidthUpdater;
+ }
+}
void LLPanelPreference::apply()
{
// no-op
diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h
index 5d5e066ec5..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();
@@ -159,8 +161,6 @@ public:
void buildPopupLists();
static void refreshSkin(void* data);
- // Remove record of current user's favorites from file on disk.
- void removeFavoritesRecordOfUser();
private:
static std::string sSkin;
// set true if state of double-click action checkbox or radio-group was changed by user
@@ -172,8 +172,6 @@ private:
bool mAvatarDataInitialized;
bool mOriginalHideOnlineStatus;
- // Record of current user's favorites may be stored in file on disk.
- bool mFavoritesRecordMayExist;
std::string mDirectoryVisibility;
LLAvatarData mAvatarProperties;
@@ -185,6 +183,8 @@ public:
LLPanelPreference();
/*virtual*/ BOOL postBuild();
+ virtual ~LLPanelPreference();
+
virtual void apply();
virtual void cancel();
void setControlFalse(const LLSD& user_data);
@@ -198,6 +198,7 @@ public:
// cancel() can restore them.
virtual void saveSettings();
+ class Updater;
private:
//for "Only friends and groups can call or IM me"
static void showFriendsOnlyWarning(LLUICtrl*, const LLSD&);
@@ -209,6 +210,8 @@ private:
typedef std::map<std::string, LLColor4> string_color_map_t;
string_color_map_t mSavedColors;
+
+ Updater* mBandWidthUpdater;
};
class LLPanelPreferenceGraphics : public LLPanelPreference
diff --git a/indra/newview/llfloaterregiondebugconsole.cpp b/indra/newview/llfloaterregiondebugconsole.cpp
index ada0dcf569..c7fab2573f 100644
--- a/indra/newview/llfloaterregiondebugconsole.cpp
+++ b/indra/newview/llfloaterregiondebugconsole.cpp
@@ -58,8 +58,6 @@ namespace
{
// Signal used to notify the floater of responses from the asynchronous
// API.
- typedef boost::signals2::signal<
- void (const std::string& output)> console_reply_signal_t;
console_reply_signal_t sConsoleReplySignal;
const std::string PROMPT("\n\n> ");
@@ -132,6 +130,11 @@ namespace
};
}
+boost::signals2::connection LLFloaterRegionDebugConsole::setConsoleReplyCallback(const console_reply_signal_t::slot_type& cb)
+{
+ return sConsoleReplySignal.connect(cb);
+}
+
LLFloaterRegionDebugConsole::LLFloaterRegionDebugConsole(LLSD const & key)
: LLFloater(key), mOutput(NULL)
{
diff --git a/indra/newview/llfloaterregiondebugconsole.h b/indra/newview/llfloaterregiondebugconsole.h
index 3aa525724e..fd3af4152e 100644
--- a/indra/newview/llfloaterregiondebugconsole.h
+++ b/indra/newview/llfloaterregiondebugconsole.h
@@ -35,6 +35,9 @@
class LLTextEditor;
+typedef boost::signals2::signal<
+ void (const std::string& output)> console_reply_signal_t;
+
class LLFloaterRegionDebugConsole : public LLFloater, public LLHTTPClient::Responder
{
public:
@@ -48,6 +51,8 @@ public:
LLTextEditor * mOutput;
+ static boost::signals2::connection setConsoleReplyCallback(const console_reply_signal_t::slot_type& cb);
+
private:
void onReplyReceived(const std::string& output);
diff --git a/indra/newview/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp
index 7792b3fb40..232b8e9096 100644
--- a/indra/newview/llfloaterregioninfo.cpp
+++ b/indra/newview/llfloaterregioninfo.cpp
@@ -53,6 +53,7 @@
#include "llfloatertopobjects.h" // added to fix SL-32336
#include "llfloatergroups.h"
#include "llfloaterreg.h"
+#include "llfloaterregiondebugconsole.h"
#include "llfloatertelehub.h"
#include "llfloaterwindlight.h"
#include "llinventorymodel.h"
@@ -159,9 +160,30 @@ bool estate_dispatch_initialized = false;
//S32 LLFloaterRegionInfo::sRequestSerial = 0;
LLUUID LLFloaterRegionInfo::sRequestInvoice;
+
+void LLFloaterRegionInfo::onConsoleReplyReceived(const std::string& output)
+{
+ llwarns << "here is what they're giving us: " << output << llendl;
+
+ if (output.find("FALSE") != std::string::npos)
+ {
+ getChild<LLUICtrl>("mesh_rez_enabled_check")->setValue(FALSE);
+ }
+ else
+ {
+ getChild<LLUICtrl>("mesh_rez_enabled_check")->setValue(TRUE);
+ }
+}
+
+
LLFloaterRegionInfo::LLFloaterRegionInfo(const LLSD& seed)
: LLFloater(seed)
{
+ mConsoleReplySignalConnection = LLFloaterRegionDebugConsole::setConsoleReplyCallback(
+ boost::bind(
+ &LLFloaterRegionInfo::onConsoleReplyReceived,
+ this,
+ _1));
}
BOOL LLFloaterRegionInfo::postBuild()
@@ -211,12 +233,14 @@ BOOL LLFloaterRegionInfo::postBuild()
LLFloaterRegionInfo::~LLFloaterRegionInfo()
{
+ mConsoleReplySignalConnection.disconnect();
}
void LLFloaterRegionInfo::onOpen(const LLSD& key)
{
refreshFromRegion(gAgent.getRegion());
requestRegionInfo();
+ requestMeshRezInfo();
}
// static
@@ -566,6 +590,12 @@ bool LLPanelRegionGeneralInfo::refreshFromRegion(LLViewerRegion* region)
getChildView("im_btn")->setEnabled(allow_modify);
getChildView("manage_telehub_btn")->setEnabled(allow_modify);
+ const bool enable_mesh = gSavedSettings.getBOOL("MeshEnabled") &&
+ gAgent.getRegion() &&
+ !gAgent.getRegion()->getCapability("GetMesh").empty() &&
+ !gAgent.getRegion()->getCapability("ObjectAdd").empty();
+ 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);
@@ -584,6 +614,7 @@ BOOL LLPanelRegionGeneralInfo::postBuild()
initCtrl("access_combo");
initCtrl("restrict_pushobject");
initCtrl("block_parcel_search_check");
+ initCtrl("mesh_rez_enabled_check");
childSetAction("kick_btn", boost::bind(&LLPanelRegionGeneralInfo::onClickKick, this));
childSetAction("kick_all_btn", onClickKickAll, this);
@@ -691,7 +722,42 @@ bool LLPanelRegionGeneralInfo::onMessageCommit(const LLSD& notification, const L
return false;
}
+class ConsoleRequestResponder : public LLHTTPClient::Responder
+{
+public:
+ /*virtual*/
+ void error(U32 status, const std::string& reason)
+ {
+ llwarns << "requesting mesh_rez_enabled failed" << llendl;
+ }
+};
+
+
+// called if this request times out.
+class ConsoleUpdateResponder : public LLHTTPClient::Responder
+{
+public:
+ /* virtual */
+ void error(U32 status, const std::string& reason)
+ {
+ llwarns << "Updating mesh enabled region setting failed" << llendl;
+ }
+};
+
+void LLFloaterRegionInfo::requestMeshRezInfo()
+{
+ std::string sim_console_url = gAgent.getRegion()->getCapability("SimConsoleAsync");
+ if (!sim_console_url.empty())
+ {
+ std::string request_str = "get mesh_rez_enabled";
+
+ LLHTTPClient::post(
+ sim_console_url,
+ LLSD(request_str),
+ new ConsoleRequestResponder);
+ }
+}
// setregioninfo
// strings[0] = 'Y' - block terraform, 'N' - not
@@ -764,6 +830,27 @@ BOOL LLPanelRegionGeneralInfo::sendUpdate()
sendEstateOwnerMessage(gMessageSystem, "setregioninfo", invoice, strings);
}
+ std::string sim_console_url = gAgent.getRegion()->getCapability("SimConsoleAsync");
+
+ if (!sim_console_url.empty())
+ {
+ std::string update_str = "set mesh_rez_enabled ";
+ if (getChild<LLUICtrl>("mesh_rez_enabled_check")->getValue().asBoolean())
+ {
+ update_str += "true";
+ }
+ else
+ {
+ update_str += "false";
+ }
+
+ LLHTTPClient::post(
+ sim_console_url,
+ LLSD(update_str),
+ new ConsoleUpdateResponder);
+ }
+
+
// if we changed access levels, tell user about it
LLViewerRegion* region = gAgent.getRegion();
if (region && (getChild<LLUICtrl>("access_combo")->getValue().asInteger() != region->getSimAccess()) )
diff --git a/indra/newview/llfloaterregioninfo.h b/indra/newview/llfloaterregioninfo.h
index c0758fa92d..2b87c27fcf 100644
--- a/indra/newview/llfloaterregioninfo.h
+++ b/indra/newview/llfloaterregioninfo.h
@@ -84,11 +84,16 @@ public:
virtual void refresh();
void requestRegionInfo();
+ void requestMeshRezInfo();
private:
LLFloaterRegionInfo(const LLSD& seed);
~LLFloaterRegionInfo();
+
+ void onConsoleReplyReceived(const std::string& output);
+
+ boost::signals2::connection mConsoleReplySignalConnection;;
protected:
void refreshFromRegion(LLViewerRegion* region);
diff --git a/indra/newview/llfloatersearch.cpp b/indra/newview/llfloatersearch.cpp
index 2041fac8d8..d5806e375c 100644
--- a/indra/newview/llfloatersearch.cpp
+++ b/indra/newview/llfloatersearch.cpp
@@ -31,6 +31,7 @@
#include "llfloaterreg.h"
#include "llfloatersearch.h"
#include "llmediactrl.h"
+#include "llnotificationsutil.h"
#include "lllogininstance.h"
#include "lluri.h"
#include "llagent.h"
@@ -46,6 +47,12 @@ public:
LLSearchHandler() : LLCommandHandler("search", UNTRUSTED_THROTTLE) { }
bool handle(const LLSD& tokens, const LLSD& query_map, LLMediaCtrl* web)
{
+ if (!LLUI::sSettingGroups["config"]->getBOOL("EnableSearch"))
+ {
+ LLNotificationsUtil::add("NoSearch", LLSD(), LLSD(), std::string("SwitchToStandardSkinAndQuit"));
+ return true;
+ }
+
const size_t parts = tokens.size();
// get the (optional) category for the search
diff --git a/indra/newview/llfloatersidetraytab.cpp b/indra/newview/llfloatersidetraytab.cpp
index 94407e6da0..9f15e62d84 100644
--- a/indra/newview/llfloatersidetraytab.cpp
+++ b/indra/newview/llfloatersidetraytab.cpp
@@ -47,5 +47,6 @@ LLFloaterSideTrayTab::~LLFloaterSideTrayTab()
void LLFloaterSideTrayTab::onClose(bool app_quitting)
{
- LLSideTray::getInstance()->setTabDocked(getName(), true);
+ // The floater is already being closed, so don't toggle it once more (that may crash viewer).
+ LLSideTray::getInstance()->setTabDocked(getName(), /* dock = */ true, /* toggle_floater = */ false);
}
diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp
index add591895b..00dc7b1627 100644
--- a/indra/newview/llfloatersnapshot.cpp
+++ b/indra/newview/llfloatersnapshot.cpp
@@ -53,6 +53,7 @@
#include "llfloaterpostcard.h"
#include "llcheckboxctrl.h"
#include "llradiogroup.h"
+#include "llslurl.h"
#include "lltoolfocus.h"
#include "lltoolmgr.h"
#include "llwebsharing.h"
diff --git a/indra/newview/llfloatersounddevices.cpp b/indra/newview/llfloatersounddevices.cpp
new file mode 100644
index 0000000000..e692f1735a
--- /dev/null
+++ b/indra/newview/llfloatersounddevices.cpp
@@ -0,0 +1,93 @@
+/**
+ * @file llfloatersounddevices.cpp
+ * @author Leyla Farazha
+ * @brief Sound Preferences used for minimal skin
+ *
+* $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 "llfloatersounddevices.h"
+
+#include "llbottomtray.h"
+#include "lldraghandle.h"
+
+#include "llpanelvoicedevicesettings.h"
+
+// Library includes
+#include "indra_constants.h"
+
+// protected
+LLFloaterSoundDevices::LLFloaterSoundDevices(const LLSD& key)
+: LLTransientDockableFloater(NULL, false, key)
+{
+ LLTransientFloaterMgr::getInstance()->addControlView(this);
+
+ // force docked state since this floater doesn't save it between recreations
+ setDocked(true);
+}
+
+LLFloaterSoundDevices::~LLFloaterSoundDevices()
+{
+ LLTransientFloaterMgr::getInstance()->removeControlView(this);
+}
+
+// virtual
+BOOL LLFloaterSoundDevices::postBuild()
+{
+ LLTransientDockableFloater::postBuild();
+
+ LLView *anchor_panel = LLBottomTray::getInstance()->getChild<LLView>("flyout_btn");
+ setDockControl(new LLDockControl(anchor_panel, this, getDockTongue(), LLDockControl::TOP));
+
+ setIsChrome(TRUE);
+ if (mDragHandle)
+ mDragHandle->setTitleVisible(TRUE);
+ updateTransparency(TT_ACTIVE); // force using active floater transparency (STORM-730)
+
+ LLPanelVoiceDeviceSettings* panel = findChild<LLPanelVoiceDeviceSettings>("device_settings_panel");
+ 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;
+}
+
+//virtual
+void LLFloaterSoundDevices::setDocked(bool docked, bool pop_on_undock/* = true*/)
+{
+ LLTransientDockableFloater::setDocked(docked, pop_on_undock);
+}
+
+// virtual
+void LLFloaterSoundDevices::setFocus( BOOL b )
+{
+ LLTransientDockableFloater::setFocus(b);
+
+ // Force using active floater transparency
+ // We have to override setFocus() for because selecting an item of the
+ // combobox causes the floater to lose focus and thus become transparent.
+ updateTransparency(TT_ACTIVE);
+}
diff --git a/indra/newview/llfloatersounddevices.h b/indra/newview/llfloatersounddevices.h
new file mode 100644
index 0000000000..f09ee3b069
--- /dev/null
+++ b/indra/newview/llfloatersounddevices.h
@@ -0,0 +1,49 @@
+/**
+ * @file llfloatersounddevices.h
+ * @author Leyla Farazha
+ * @brief Sound Preferences used for minimal skin
+ *
+* $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_LLFLOATERSOUNDDEVICES_H
+#define LL_LLFLOATERSOUNDDEVICES_H
+
+#include "lltransientdockablefloater.h"
+
+class LLFloaterSoundDevices : public LLTransientDockableFloater
+{
+public:
+
+ LOG_CLASS(LLFloaterSoundDevices);
+
+ LLFloaterSoundDevices(const LLSD& key);
+ ~LLFloaterSoundDevices();
+
+ /*virtual*/ BOOL postBuild();
+ /*virtual*/ void setDocked(bool docked, bool pop_on_undock = true);
+ /*virtual*/ void setFocus( BOOL b );
+};
+
+
+#endif //LL_LLFLOATERSOUNDDEVICES_H
+
diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp
index 364fbad193..edcb96314b 100644
--- a/indra/newview/llfloatertools.cpp
+++ b/indra/newview/llfloatertools.cpp
@@ -32,6 +32,7 @@
#include "llcoord.h"
//#include "llgl.h"
+#include "llagent.h"
#include "llagentcamera.h"
#include "llbutton.h"
#include "llcheckboxctrl.h"
@@ -84,6 +85,7 @@
#include "llviewerwindow.h"
#include "llvovolume.h"
#include "lluictrlfactory.h"
+#include "llaccountingquotamanager.h"
// Globals
LLFloaterTools *gFloaterTools = NULL;
@@ -420,27 +422,83 @@ void LLFloaterTools::refresh()
// Refresh object and prim count labels
LLLocale locale(LLLocale::USER_LOCALE);
- std::string obj_count_string;
- LLResMgr::getInstance()->getIntegerString(obj_count_string, LLSelectMgr::getInstance()->getSelection()->getRootObjectCount());
- getChild<LLUICtrl>("obj_count")->setTextArg("[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);
-
- // calculate selection rendering cost
- if (sShowObjectCost)
- {
- std::string prim_cost_string;
- LLResMgr::getInstance()->getIntegerString(prim_cost_string, calcRenderCost());
- getChild<LLUICtrl>("RenderingCost")->setTextArg("[COUNT]", prim_cost_string);
+
+ if ((gAgent.getRegion() && (gAgent.getRegion()->getCapability("GetMesh").empty() || gAgent.getRegion()->getCapability("ObjectAdd").empty())) || !gSavedSettings.getBOOL("MeshEnabled"))
+ {
+ std::string obj_count_string;
+ LLResMgr::getInstance()->getIntegerString(obj_count_string, LLSelectMgr::getInstance()->getSelection()->getRootObjectCount());
+ getChild<LLUICtrl>("obj_count")->setTextArg("[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);
+
+ // calculate selection rendering cost
+ if (sShowObjectCost)
+ {
+ std::string prim_cost_string;
+ LLResMgr::getInstance()->getIntegerString(prim_cost_string, calcRenderCost());
+ getChild<LLUICtrl>("RenderingCost")->setTextArg("[COUNT]", prim_cost_string);
+ }
+
+ // disable the object and prim counts if nothing selected
+ bool have_selection = ! LLSelectMgr::getInstance()->getSelection()->isEmpty();
+ getChildView("obj_count")->setEnabled(have_selection);
+ getChildView("prim_count")->setEnabled(have_selection);
+ getChildView("RenderingCost")->setEnabled(have_selection && sShowObjectCost);
}
+ else
+ {
+ // 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)
+ {
+ std::string prim_cost_string;
+ LLResMgr::getInstance()->getIntegerString(prim_cost_string, calcRenderCost());
+ getChild<LLUICtrl>("RenderingCost")->setTextArg("[COUNT]", prim_cost_string);
+ }
- // disable the object and prim counts if nothing selected
- bool have_selection = ! LLSelectMgr::getInstance()->getSelection()->isEmpty();
- getChildView("obj_count")->setEnabled(have_selection);
- getChildView("prim_count")->setEnabled(have_selection);
- getChildView("RenderingCost")->setEnabled(have_selection && sShowObjectCost);
+ // 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);
+ }
+
// Refresh child tabs
mPanelPermissions->refresh();
@@ -730,8 +788,19 @@ void LLFloaterTools::updatePopup(LLCoordGL center, MASK mask)
getChildView("Strength:")->setVisible( land_visible);
}
- getChildView("obj_count")->setVisible( !land_visible);
- getChildView("prim_count")->setVisible( !land_visible);
+ bool show_mesh_cost = gAgent.getRegion() &&
+ !gAgent.getRegion()->getCapability("GetMesh").empty() &&
+ gSavedSettings.getBOOL("MeshEnabled") &&
+ !gAgent.getRegion()->getCapability("ObjectAdd").empty();
+
+ 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);
+
mTab->setVisible(!land_visible);
mPanelLandInfo->setVisible(land_visible);
}
@@ -988,30 +1057,33 @@ void LLFloaterTools::onClickGridOptions()
S32 LLFloaterTools::calcRenderCost()
{
- S32 cost = 0;
- std::set<LLUUID> textures;
-
- for (LLObjectSelection::iterator selection_iter = LLSelectMgr::getInstance()->getSelection()->begin();
- selection_iter != LLSelectMgr::getInstance()->getSelection()->end();
- ++selection_iter)
- {
- LLSelectNode *select_node = *selection_iter;
- if (select_node)
- {
- LLVOVolume *viewer_volume = (LLVOVolume*)select_node->getObject();
- if (viewer_volume)
- {
- cost += viewer_volume->getRenderCost(textures);
- cost += textures.size() * LLVOVolume::ARC_TEXTURE_COST;
- textures.clear();
- }
- }
- }
-
-
- return cost;
+ S32 cost = 0;
+ std::set<LLUUID> textures;
+
+ for (LLObjectSelection::iterator selection_iter = LLSelectMgr::getInstance()->getSelection()->begin();
+ selection_iter != LLSelectMgr::getInstance()->getSelection()->end();
+ ++selection_iter)
+ {
+ LLSelectNode *select_node = *selection_iter;
+ if (select_node)
+ {
+ LLViewerObject *vobj = select_node->getObject();
+ if (vobj->getVolume())
+ {
+ LLVOVolume* volume = (LLVOVolume*) vobj;
+
+ cost += volume->getRenderCost(textures);
+ cost += textures.size() * LLVOVolume::ARC_TEXTURE_COST;
+ textures.clear();
+ }
+ }
+ }
+
+
+ return cost;
}
+
// static
void LLFloaterTools::setEditTool(void* tool_pointer)
{
diff --git a/indra/newview/llfloateruipreview.cpp b/indra/newview/llfloateruipreview.cpp
index 0d8601410a..4c9c4cb154 100644
--- a/indra/newview/llfloateruipreview.cpp
+++ b/indra/newview/llfloateruipreview.cpp
@@ -35,6 +35,7 @@
#include "llfloateruipreview.h" // Own header
// Internal utility
+#include "lldiriterator.h"
#include "lleventtimer.h"
#include "llexternaleditor.h"
#include "llrender.h"
@@ -481,9 +482,11 @@ BOOL LLFloaterUIPreview::postBuild()
std::string language_directory;
std::string xui_dir = get_xui_dir(); // directory containing localizations -- don't forget trailing delim
mLanguageSelection->removeall(); // clear out anything temporarily in list from XML
+
+ LLDirIterator iter(xui_dir, "*");
while(found) // for every directory
{
- if((found = gDirUtilp->getNextFileInDir(xui_dir, "*", language_directory))) // get next directory
+ if((found = iter.next(language_directory))) // get next directory
{
std::string full_path = xui_dir + language_directory;
if(LLFile::isfile(full_path.c_str())) // if it's not a directory, skip it
@@ -635,42 +638,51 @@ void LLFloaterUIPreview::refreshList()
mFileList->clearRows(); // empty list
std::string name;
BOOL found = TRUE;
+
+ LLDirIterator floater_iter(getLocalizedDirectory(), "floater_*.xml");
while(found) // for every floater file that matches the pattern
{
- if((found = gDirUtilp->getNextFileInDir(getLocalizedDirectory(), "floater_*.xml", name))) // get next file matching pattern
+ if((found = floater_iter.next(name))) // get next file matching pattern
{
addFloaterEntry(name.c_str()); // and add it to the list (file name only; localization code takes care of rest of path)
}
}
found = TRUE;
+
+ LLDirIterator inspect_iter(getLocalizedDirectory(), "inspect_*.xml");
while(found) // for every inspector file that matches the pattern
{
- if((found = gDirUtilp->getNextFileInDir(getLocalizedDirectory(), "inspect_*.xml", name))) // get next file matching pattern
+ if((found = inspect_iter.next(name))) // get next file matching pattern
{
addFloaterEntry(name.c_str()); // and add it to the list (file name only; localization code takes care of rest of path)
}
}
found = TRUE;
+
+ LLDirIterator menu_iter(getLocalizedDirectory(), "menu_*.xml");
while(found) // for every menu file that matches the pattern
{
- if((found = gDirUtilp->getNextFileInDir(getLocalizedDirectory(), "menu_*.xml", name))) // get next file matching pattern
+ if((found = menu_iter.next(name))) // get next file matching pattern
{
addFloaterEntry(name.c_str()); // and add it to the list (file name only; localization code takes care of rest of path)
}
}
found = TRUE;
+
+ LLDirIterator panel_iter(getLocalizedDirectory(), "panel_*.xml");
while(found) // for every panel file that matches the pattern
{
- if((found = gDirUtilp->getNextFileInDir(getLocalizedDirectory(), "panel_*.xml", name))) // get next file matching pattern
+ if((found = panel_iter.next(name))) // get next file matching pattern
{
addFloaterEntry(name.c_str()); // and add it to the list (file name only; localization code takes care of rest of path)
}
}
-
found = TRUE;
+
+ LLDirIterator sidepanel_iter(getLocalizedDirectory(), "sidepanel_*.xml");
while(found) // for every sidepanel file that matches the pattern
{
- if((found = gDirUtilp->getNextFileInDir(getLocalizedDirectory(), "sidepanel_*.xml", name))) // get next file matching pattern
+ if((found = sidepanel_iter.next(name))) // get next file matching pattern
{
addFloaterEntry(name.c_str()); // and add it to the list (file name only; localization code takes care of rest of path)
}
diff --git a/indra/newview/llfloaterworldmap.cpp b/indra/newview/llfloaterworldmap.cpp
index 03cf0332a9..f8a4ce7ad0 100644..100755
--- a/indra/newview/llfloaterworldmap.cpp
+++ b/indra/newview/llfloaterworldmap.cpp
@@ -73,6 +73,7 @@
#include "llslider.h"
#include "message.h"
#include "llwindow.h" // copyTextToClipboard()
+#include <algorithm>
//---------------------------------------------------------------------------
// Constants
@@ -85,6 +86,16 @@ static const F32 MAP_ZOOM_TIME = 0.2f;
// Currently (01/26/09), this value allows the whole grid to be visible in a 1024x1024 window.
static const S32 MAX_VISIBLE_REGIONS = 512;
+// It would be more logical to have this inside the method where it is used but to compile under gcc this
+// struct has to be here.
+struct SortRegionNames
+{
+ inline bool operator ()(std::pair <U64, LLSimInfo*> const& _left, std::pair <U64, LLSimInfo*> const& _right)
+ {
+ return(LLStringUtil::compareInsensitive(_left.second->getName(), _right.second->getName()) < 0);
+ }
+};
+
enum EPanDirection
{
PAN_UP,
@@ -1483,10 +1494,13 @@ void LLFloaterWorldMap::updateSims(bool found_null_sim)
S32 name_length = mCompletingRegionName.length();
LLSD match;
-
+
S32 num_results = 0;
- std::map<U64, LLSimInfo*>::const_iterator it;
- for (it = LLWorldMap::getInstance()->getRegionMap().begin(); it != LLWorldMap::getInstance()->getRegionMap().end(); ++it)
+
+ std::vector<std::pair <U64, LLSimInfo*> > sim_info_vec(LLWorldMap::getInstance()->getRegionMap().begin(), LLWorldMap::getInstance()->getRegionMap().end());
+ std::sort(sim_info_vec.begin(), sim_info_vec.end(), SortRegionNames());
+
+ for (std::vector<std::pair <U64, LLSimInfo*> >::const_iterator it = sim_info_vec.begin(); it != sim_info_vec.end(); ++it)
{
LLSimInfo* info = it->second;
std::string sim_name_lower = info->getName();
diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp
index b3b1ce5743..3884b94b60 100644
--- a/indra/newview/llfolderview.cpp
+++ b/indra/newview/llfolderview.cpp
@@ -301,18 +301,6 @@ BOOL LLFolderView::canFocusChildren() const
return FALSE;
}
-void LLFolderView::checkTreeResortForModelChanged()
-{
- if (mSortOrder & LLInventoryFilter::SO_DATE && !(mSortOrder & LLInventoryFilter::SO_FOLDERS_BY_NAME))
- {
- // This is the case where something got added or removed. If we are date sorting
- // everything including folders, then we need to rebuild the whole tree.
- // Just set to something not SO_DATE to force the folder most resent date resort.
- mSortOrder = mSortOrder & ~LLInventoryFilter::SO_DATE;
- setSortOrder(mSortOrder | LLInventoryFilter::SO_DATE);
- }
-}
-
static LLFastTimer::DeclareTimer FTM_SORT("Sort Inventory");
void LLFolderView::setSortOrder(U32 order)
diff --git a/indra/newview/llfolderview.h b/indra/newview/llfolderview.h
index 210ba9eb3c..1464a058d8 100644
--- a/indra/newview/llfolderview.h
+++ b/indra/newview/llfolderview.h
@@ -101,7 +101,6 @@ public:
// FolderViews default to sort by name. This will change that,
// and resort the items if necessary.
void setSortOrder(U32 order);
- void checkTreeResortForModelChanged();
void setFilterPermMask(PermissionMask filter_perm_mask);
void setAllowMultiSelect(BOOL allow) { mAllowMultiSelect = allow; }
diff --git a/indra/newview/llfolderviewitem.cpp b/indra/newview/llfolderviewitem.cpp
index 3c36248c1f..e9d1ad3a9e 100644
--- a/indra/newview/llfolderviewitem.cpp
+++ b/indra/newview/llfolderviewitem.cpp
@@ -1835,7 +1835,7 @@ void LLFolderViewFolder::sortBy(U32 order)
return;
}
- // Propegate this change to sub folders
+ // Propagate this change to sub folders
for (folders_t::iterator iter = mFolders.begin();
iter != mFolders.end();)
{
diff --git a/indra/newview/llfolderviewitem.h b/indra/newview/llfolderviewitem.h
index 2006e094a8..fc941510ab 100644
--- a/indra/newview/llfolderviewitem.h
+++ b/indra/newview/llfolderviewitem.h
@@ -28,6 +28,7 @@
#include "llview.h"
#include "lldarray.h" // *TODO: Eliminate, forward declare
+#include "lluiimage.h"
class LLFontGL;
class LLFolderView;
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 f658287fb1..66ca76bfb0 100644
--- a/indra/newview/llgesturemgr.cpp
+++ b/indra/newview/llgesturemgr.cpp
@@ -33,8 +33,10 @@
#include <algorithm>
// library
+#include "llaudioengine.h"
#include "lldatapacker.h"
#include "llinventory.h"
+#include "llkeyframemotion.h"
#include "llmultigesture.h"
#include "llnotificationsutil.h"
#include "llstl.h"
@@ -51,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;
@@ -68,6 +71,7 @@ LLGestureMgr::LLGestureMgr()
mLoadingCount(0)
{
gInventory.addObserver(this);
+ mListener.reset(new LLGestureListener());
}
@@ -526,6 +530,66 @@ void LLGestureMgr::playGesture(LLMultiGesture* gesture)
gesture->mPlaying = TRUE;
mPlaying.push_back(gesture);
+ // Load all needed assets to minimize the delays
+ // when gesture is playing.
+ for (std::vector<LLGestureStep*>::iterator steps_it = gesture->mSteps.begin();
+ steps_it != gesture->mSteps.end();
+ ++steps_it)
+ {
+ LLGestureStep* step = *steps_it;
+ switch(step->getType())
+ {
+ case STEP_ANIMATION:
+ {
+ LLGestureStepAnimation* anim_step = (LLGestureStepAnimation*)step;
+ const LLUUID& anim_id = anim_step->mAnimAssetID;
+
+ // Don't request the animation if this step stops it or if it is already in Static VFS
+ if (!(anim_id.isNull()
+ || anim_step->mFlags & ANIM_FLAG_STOP
+ || gAssetStorage->hasLocalAsset(anim_id, LLAssetType::AT_ANIMATION)))
+ {
+ mLoadingAssets.insert(anim_id);
+
+ LLUUID* id = new LLUUID(gAgentID);
+ gAssetStorage->getAssetData(anim_id,
+ LLAssetType::AT_ANIMATION,
+ onAssetLoadComplete,
+ (void *)id,
+ TRUE);
+ }
+ break;
+ }
+ case STEP_SOUND:
+ {
+ LLGestureStepSound* sound_step = (LLGestureStepSound*)step;
+ const LLUUID& sound_id = sound_step->mSoundAssetID;
+ if (!(sound_id.isNull()
+ || gAssetStorage->hasLocalAsset(sound_id, LLAssetType::AT_SOUND)))
+ {
+ mLoadingAssets.insert(sound_id);
+
+ gAssetStorage->getAssetData(sound_id,
+ LLAssetType::AT_SOUND,
+ onAssetLoadComplete,
+ NULL,
+ TRUE);
+ }
+ break;
+ }
+ case STEP_CHAT:
+ case STEP_WAIT:
+ case STEP_EOF:
+ {
+ break;
+ }
+ default:
+ {
+ llwarns << "Unknown gesture step type: " << step->getType() << llendl;
+ }
+ }
+ }
+
// And get it going
stepGesture(gesture);
@@ -741,7 +805,7 @@ void LLGestureMgr::stepGesture(LLMultiGesture* gesture)
{
return;
}
- if (!isAgentAvatarValid()) return;
+ if (!isAgentAvatarValid() || hasLoadingAssets(gesture)) return;
// Of the ones that started playing, have any stopped?
@@ -1091,6 +1155,98 @@ void LLGestureMgr::onLoadComplete(LLVFS *vfs,
}
}
+// static
+void LLGestureMgr::onAssetLoadComplete(LLVFS *vfs,
+ const LLUUID& asset_uuid,
+ LLAssetType::EType type,
+ void* user_data, S32 status, LLExtStat ext_status)
+{
+ LLGestureMgr& self = LLGestureMgr::instance();
+
+ // Complete the asset loading process depending on the type and
+ // remove the asset id from pending downloads list.
+ switch(type)
+ {
+ case LLAssetType::AT_ANIMATION:
+ {
+ LLKeyframeMotion::onLoadComplete(vfs, asset_uuid, type, user_data, status, ext_status);
+
+ self.mLoadingAssets.erase(asset_uuid);
+
+ break;
+ }
+ case LLAssetType::AT_SOUND:
+ {
+ LLAudioEngine::assetCallback(vfs, asset_uuid, type, user_data, status, ext_status);
+
+ self.mLoadingAssets.erase(asset_uuid);
+
+ break;
+ }
+ default:
+ {
+ llwarns << "Unexpected asset type: " << type << llendl;
+
+ // We don't want to return from this callback without
+ // an animation or sound callback being fired
+ // and *user_data handled to avoid memory leaks.
+ llassert(type == LLAssetType::AT_ANIMATION || type == LLAssetType::AT_SOUND);
+ }
+ }
+}
+
+// static
+bool LLGestureMgr::hasLoadingAssets(LLMultiGesture* gesture)
+{
+ LLGestureMgr& self = LLGestureMgr::instance();
+
+ for (std::vector<LLGestureStep*>::iterator steps_it = gesture->mSteps.begin();
+ steps_it != gesture->mSteps.end();
+ ++steps_it)
+ {
+ LLGestureStep* step = *steps_it;
+ switch(step->getType())
+ {
+ case STEP_ANIMATION:
+ {
+ LLGestureStepAnimation* anim_step = (LLGestureStepAnimation*)step;
+ const LLUUID& anim_id = anim_step->mAnimAssetID;
+
+ if (!(anim_id.isNull()
+ || anim_step->mFlags & ANIM_FLAG_STOP
+ || self.mLoadingAssets.find(anim_id) == self.mLoadingAssets.end()))
+ {
+ return true;
+ }
+ break;
+ }
+ case STEP_SOUND:
+ {
+ LLGestureStepSound* sound_step = (LLGestureStepSound*)step;
+ const LLUUID& sound_id = sound_step->mSoundAssetID;
+
+ if (!(sound_id.isNull()
+ || self.mLoadingAssets.find(sound_id) == self.mLoadingAssets.end()))
+ {
+ return true;
+ }
+ break;
+ }
+ case STEP_CHAT:
+ case STEP_WAIT:
+ case STEP_EOF:
+ {
+ break;
+ }
+ default:
+ {
+ llwarns << "Unknown gesture step type: " << step->getType() << llendl;
+ }
+ }
+ }
+
+ return false;
+}
void LLGestureMgr::stopGesture(LLMultiGesture* gesture)
{
diff --git a/indra/newview/llgesturemgr.h b/indra/newview/llgesturemgr.h
index b9935efeb3..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;
@@ -158,6 +159,17 @@ protected:
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
+ static void onAssetLoadComplete(LLVFS *vfs,
+ const LLUUID& asset_uuid,
+ LLAssetType::EType type,
+ void* user_data, S32 status, LLExtStat ext_status);
+
+ // Checks whether all animation and sound assets
+ // needed to play a gesture are loaded.
+ static bool hasLoadingAssets(LLMultiGesture* gesture);
+
private:
// Active gestures.
// NOTE: The gesture pointer CAN BE NULL. This means that
@@ -172,6 +184,11 @@ private:
callback_map_t mCallbackMap;
std::vector<LLMultiGesture*> mPlaying;
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/llhudeffectlookat.cpp b/indra/newview/llhudeffectlookat.cpp
index 72f64752d6..b380b3fe20 100644
--- a/indra/newview/llhudeffectlookat.cpp
+++ b/indra/newview/llhudeffectlookat.cpp
@@ -56,7 +56,7 @@ const S32 PKT_SIZE = 57;
// throttle
const F32 MAX_SENDS_PER_SEC = 4.f;
-const F32 MIN_DELTAPOS_FOR_UPDATE = 0.05f;
+const F32 MIN_DELTAPOS_FOR_UPDATE_SQUARED = 0.05f * 0.05f;
const F32 MIN_TARGET_OFFSET_SQUARED = 0.0001f;
@@ -416,7 +416,7 @@ BOOL LLHUDEffectLookAt::setLookAt(ELookAtType target_type, LLViewerObject *objec
BOOL lookAtChanged = (target_type != mTargetType) || (object != mTargetObject);
// lookat position has moved a certain amount and we haven't just sent an update
- lookAtChanged = lookAtChanged || ((dist_vec(position, mLastSentOffsetGlobal) > MIN_DELTAPOS_FOR_UPDATE) &&
+ lookAtChanged = lookAtChanged || ((dist_vec_squared(position, mLastSentOffsetGlobal) > MIN_DELTAPOS_FOR_UPDATE_SQUARED) &&
((current_time - mLastSendTime) > (1.f / MAX_SENDS_PER_SEC)));
if (lookAtChanged)
diff --git a/indra/newview/llhudeffectpointat.cpp b/indra/newview/llhudeffectpointat.cpp
index bfb0f150b3..28fe8e1c01 100644
--- a/indra/newview/llhudeffectpointat.cpp
+++ b/indra/newview/llhudeffectpointat.cpp
@@ -48,7 +48,7 @@ const S32 PKT_SIZE = 57;
// throttle
const F32 MAX_SENDS_PER_SEC = 4.f;
-const F32 MIN_DELTAPOS_FOR_UPDATE = 0.05f;
+const F32 MIN_DELTAPOS_FOR_UPDATE_SQUARED = 0.05f * 0.05f;
// timeouts
// can't use actual F32_MAX, because we add this to the current frametime
@@ -244,7 +244,7 @@ BOOL LLHUDEffectPointAt::setPointAt(EPointAtType target_type, LLViewerObject *ob
BOOL targetTypeChanged = (target_type != mTargetType) ||
(object != mTargetObject);
- BOOL targetPosChanged = (dist_vec(position, mLastSentOffsetGlobal) > MIN_DELTAPOS_FOR_UPDATE) &&
+ BOOL targetPosChanged = (dist_vec_squared(position, mLastSentOffsetGlobal) > MIN_DELTAPOS_FOR_UPDATE_SQUARED) &&
((current_time - mLastSendTime) > (1.f / MAX_SENDS_PER_SEC));
if (targetTypeChanged || targetPosChanged)
diff --git a/indra/newview/llhudicon.cpp b/indra/newview/llhudicon.cpp
index 568b0ae585..7e1025c41b 100644
--- a/indra/newview/llhudicon.cpp
+++ b/indra/newview/llhudicon.cpp
@@ -33,6 +33,7 @@
#include "llviewerobject.h"
#include "lldrawable.h"
+#include "llvector4a.h"
#include "llviewercamera.h"
#include "llviewertexture.h"
#include "llviewerwindow.h"
@@ -255,21 +256,42 @@ BOOL LLHUDIcon::lineSegmentIntersect(const LLVector3& start, const LLVector3& en
LLVector3 x_scale = image_aspect * (F32)gViewerWindow->getWindowHeightScaled() * mScale * scale_factor * x_pixel_vec;
LLVector3 y_scale = (F32)gViewerWindow->getWindowHeightScaled() * mScale * scale_factor * y_pixel_vec;
- LLVector3 lower_left = icon_position - (x_scale * 0.5f);
- LLVector3 lower_right = icon_position + (x_scale * 0.5f);
- LLVector3 upper_left = icon_position - (x_scale * 0.5f) + y_scale;
- LLVector3 upper_right = icon_position + (x_scale * 0.5f) + y_scale;
+ LLVector4a x_scalea;
+ LLVector4a icon_positiona;
+ LLVector4a y_scalea;
-
- F32 t = 0.f;
- LLVector3 dir = end-start;
+ x_scalea.load3(x_scale.mV);
+ x_scalea.mul(0.5f);
+ y_scalea.load3(y_scale.mV);
+
+ icon_positiona.load3(icon_position.mV);
+
+ LLVector4a lower_left;
+ lower_left.setSub(icon_positiona, x_scalea);
+ LLVector4a lower_right;
+ lower_right.setAdd(icon_positiona, x_scalea);
+ LLVector4a upper_left;
+ upper_left.setAdd(lower_left, y_scalea);
+ LLVector4a upper_right;
+ upper_right.setAdd(lower_right, y_scalea);
+
+ LLVector4a enda;
+ enda.load3(end.mV);
+ LLVector4a starta;
+ starta.load3(start.mV);
+ LLVector4a dir;
+ dir.setSub(enda, starta);
+
+ F32 a,b,t;
- if (LLTriangleRayIntersect(upper_right, upper_left, lower_right, start, dir, NULL, NULL, &t, FALSE) ||
- LLTriangleRayIntersect(upper_left, lower_left, lower_right, start, dir, NULL, NULL, &t, FALSE))
+ if (LLTriangleRayIntersect(upper_right, upper_left, lower_right, starta, dir, a,b,t) ||
+ LLTriangleRayIntersect(upper_left, lower_left, lower_right, starta, dir, a,b,t))
{
if (intersection)
{
- *intersection = start + dir*t;
+ dir.mul(t);
+ starta.add(dir);
+ *intersection = LLVector3(starta.getF32ptr());
}
return TRUE;
}
diff --git a/indra/newview/llhudnametag.cpp b/indra/newview/llhudnametag.cpp
index fc758569e4..82e1f2dfb5 100644
--- a/indra/newview/llhudnametag.cpp
+++ b/indra/newview/llhudnametag.cpp
@@ -146,24 +146,43 @@ BOOL LLHUDNameTag::lineSegmentIntersect(const LLVector3& start, const LLVector3&
mOffsetY = lltrunc(mHeight * ((mVertAlignment == ALIGN_VERT_CENTER) ? 0.5f : 1.f));
+ LLVector3 position = mPositionAgent;
+
+ if (mSourceObject)
+ { //get intersection of eye through mPositionAgent to plane of source object
+ //using this position keeps the camera from focusing on some seemingly random
+ //point several meters in front of the nametag
+ const LLVector3& p = mSourceObject->getPositionAgent();
+ const LLVector3& n = LLViewerCamera::getInstance()->getAtAxis();
+ const LLVector3& eye = LLViewerCamera::getInstance()->getOrigin();
+
+ LLVector3 ray = position-eye;
+ ray.normalize();
+
+ LLVector3 delta = p-position;
+ F32 dist = delta*n;
+ F32 dt = dist/(ray*n);
+ position += ray*dt;
+ }
+
// scale screen size of borders down
//RN: for now, text on hud objects is never occluded
LLVector3 x_pixel_vec;
LLVector3 y_pixel_vec;
- LLViewerCamera::getInstance()->getPixelVectors(mPositionAgent, y_pixel_vec, x_pixel_vec);
+ LLViewerCamera::getInstance()->getPixelVectors(position, y_pixel_vec, x_pixel_vec);
LLVector3 width_vec = mWidth * x_pixel_vec;
LLVector3 height_vec = mHeight * y_pixel_vec;
LLCoordGL screen_pos;
- LLViewerCamera::getInstance()->projectPosAgentToScreen(mPositionAgent, screen_pos, FALSE);
+ LLViewerCamera::getInstance()->projectPosAgentToScreen(position, screen_pos, FALSE);
LLVector2 screen_offset;
screen_offset = updateScreenPos(mPositionOffset);
- LLVector3 render_position = mPositionAgent
+ LLVector3 render_position = position
+ (x_pixel_vec * screen_offset.mV[VX])
+ (y_pixel_vec * screen_offset.mV[VY]);
@@ -197,10 +216,10 @@ BOOL LLHUDNameTag::lineSegmentIntersect(const LLVector3& start, const LLVector3&
}
LLVector3 dir = end-start;
- F32 t = 0.f;
+ F32 a, b, t;
- if (LLTriangleRayIntersect(v[0], v[1], v[2], start, dir, NULL, NULL, &t, FALSE) ||
- LLTriangleRayIntersect(v[2], v[3], v[0], start, dir, NULL, NULL, &t, FALSE) )
+ if (LLTriangleRayIntersect(v[0], v[1], v[2], start, dir, a, b, t, FALSE) ||
+ LLTriangleRayIntersect(v[2], v[3], v[0], start, dir, a, b, t, FALSE) )
{
if (t <= 1.f)
{
diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index ec3fe48151..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());
}
}
@@ -2696,10 +2699,10 @@ void LLIMMgr::inviteToSession(
if (voice_invite)
{
- if ( // if we're rejecting all incoming call requests
- gSavedSettings.getBOOL("VoiceCallsRejectAll")
+ if ( // if we are rejecting group calls
+ (gSavedSettings.getBOOL("VoiceCallsRejectGroup") && notify_box_type == "VoiceInviteGroup") ||
// or we're rejecting non-friend voice calls and this isn't a friend
- || (gSavedSettings.getBOOL("VoiceCallsFriendsOnly") && (LLAvatarTracker::instance().getBuddyInfo(caller_id) == NULL))
+ (gSavedSettings.getBOOL("VoiceCallsFriendsOnly") && (LLAvatarTracker::instance().getBuddyInfo(caller_id) == NULL))
)
{
// silently decline the call
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 bdb9f6167a..86c8a1a9b5 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -917,6 +917,14 @@ LLInvFVBridge* LLInvFVBridge::createBridge(LLAssetType::EType asset_type,
// Only should happen for broken links.
new_listener = new LLLinkItemBridge(inventory, root, uuid);
break;
+ case LLAssetType::AT_MESH:
+ if(!(inv_type == LLInventoryType::IT_MESH))
+ {
+ llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << LLInventoryType::lookupHumanReadable(inv_type) << " on uuid " << uuid << llendl;
+ }
+ new_listener = new LLMeshBridge(inventory, root, uuid);
+ break;
+
default:
llinfos << "Unhandled asset type (llassetstorage.h): "
<< (S32)asset_type << llendl;
@@ -2266,6 +2274,9 @@ LLUIImagePtr LLFolderBridge::getIcon() const
LLUIImagePtr LLFolderBridge::getIcon(LLFolderType::EType preferred_type)
{
return LLUI::getUIImage(LLViewerFolderType::lookupIconName(preferred_type, FALSE));
+ /*case LLAssetType::AT_MESH:
+ control = "inv_folder_mesh.tga";
+ break;*/
}
LLUIImagePtr LLFolderBridge::getOpenIcon() const
@@ -2725,12 +2736,13 @@ BOOL LLFolderBridge::dragOrDrop(MASK mask, BOOL drop,
case DAD_CALLINGCARD:
case DAD_LANDMARK:
case DAD_SCRIPT:
+ case DAD_CLOTHING:
case DAD_OBJECT:
case DAD_NOTECARD:
- case DAD_CLOTHING:
case DAD_BODYPART:
case DAD_ANIMATION:
case DAD_GESTURE:
+ case DAD_MESH:
accept = dragItemIntoFolder(inv_item, drop);
break;
case DAD_LINK:
@@ -2760,7 +2772,11 @@ BOOL LLFolderBridge::dragOrDrop(MASK mask, BOOL drop,
accept = dragCategoryIntoFolder((LLInventoryCategory*)cargo_data, drop);
}
break;
+ case DAD_ROOT_CATEGORY:
+ case DAD_NONE:
+ break;
default:
+ llwarns << "Unhandled cargo type for drag&drop " << cargo_type << llendl;
break;
}
return accept;
@@ -3752,6 +3768,7 @@ BOOL LLCallingCardBridge::dragOrDrop(MASK mask, BOOL drop,
case DAD_BODYPART:
case DAD_ANIMATION:
case DAD_GESTURE:
+ case DAD_MESH:
{
LLInventoryItem* inv_item = (LLInventoryItem*)cargo_data;
const LLPermissions& perm = inv_item->getPermissions();
@@ -4928,6 +4945,7 @@ void LLWearableBridge::removeFromAvatar()
}
}
+
// +=================================================+
// | LLLinkItemBridge |
// +=================================================+
@@ -4958,6 +4976,63 @@ void LLLinkItemBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
}
// +=================================================+
+// | LLMeshBridge |
+// +=================================================+
+
+LLUIImagePtr LLMeshBridge::getIcon() const
+{
+ return LLInventoryIcon::getIcon(LLAssetType::AT_MESH, LLInventoryType::IT_MESH, 0, FALSE);
+}
+
+void LLMeshBridge::openItem()
+{
+ LLViewerInventoryItem* item = getItem();
+
+ if (item)
+ {
+ // open mesh
+ }
+}
+
+void LLMeshBridge::previewItem()
+{
+ LLViewerInventoryItem* item = getItem();
+ if(item)
+ {
+ // preview mesh
+ }
+}
+
+
+void LLMeshBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
+{
+ lldebugs << "LLMeshBridge::buildContextMenu()" << llendl;
+ std::vector<std::string> items;
+ std::vector<std::string> disabled_items;
+
+ if(isItemInTrash())
+ {
+ items.push_back(std::string("Purge Item"));
+ if (!isItemRemovable())
+ {
+ disabled_items.push_back(std::string("Purge Item"));
+ }
+
+ items.push_back(std::string("Restore Item"));
+ }
+ else
+ {
+ items.push_back(std::string("Properties"));
+
+ getClipboardEntries(true, items, disabled_items, flags);
+ }
+
+
+ hide_context_entries(menu, items, disabled_items);
+}
+
+
+// +=================================================+
// | LLLinkBridge |
// +=================================================+
// For broken folder links.
@@ -5263,6 +5338,7 @@ public:
{
wearOnAvatar();
}
+
virtual ~LLWearableBridgeAction(){}
protected:
LLWearableBridgeAction(const LLUUID& id,LLInventoryModel* model) : LLInvFVBridgeAction(id,model) {}
diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h
index 5ac328dcef..1e849c8812 100644
--- a/indra/newview/llinventorybridge.h
+++ b/indra/newview/llinventorybridge.h
@@ -41,6 +41,7 @@ class LLMenuGL;
class LLCallingCardObserver;
class LLViewerJointAttachment;
+
typedef std::vector<std::string> menuentry_vec_t;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -523,6 +524,24 @@ protected:
static std::string sPrefix;
};
+
+class LLMeshBridge : public LLItemBridge
+{
+ friend class LLInvFVBridge;
+public:
+ virtual LLUIImagePtr getIcon() const;
+ virtual void openItem();
+ virtual void previewItem();
+ virtual void buildContextMenu(LLMenuGL& menu, U32 flags);
+
+protected:
+ LLMeshBridge(LLInventoryPanel* inventory,
+ LLFolderView* root,
+ const LLUUID& uuid) :
+ LLItemBridge(inventory, root, uuid) {}
+};
+
+
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Class LLInvFVBridgeAction
//
@@ -553,13 +572,23 @@ protected:
LLInventoryModel* mModel;
};
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Recent Inventory Panel related classes
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+class LLMeshBridgeAction: public LLInvFVBridgeAction
+{
+ friend class LLInvFVBridgeAction;
+public:
+ virtual void doIt() ;
+ virtual ~LLMeshBridgeAction(){}
+protected:
+ LLMeshBridgeAction(const LLUUID& id,LLInventoryModel* model):LLInvFVBridgeAction(id,model){}
+
+};
+
+
// Overridden version of the Inventory-Folder-View-Bridge for Folders
class LLRecentItemsFolderBridge : public LLFolderBridge
{
+ friend class LLInvFVBridgeAction;
public:
// Creates context menu for Folders related to Recent Inventory Panel.
// Uses base logic and than removes from visible items "New..." menu items.
diff --git a/indra/newview/llinventoryfilter.cpp b/indra/newview/llinventoryfilter.cpp
index e22363c2f6..dee15a1efd 100644
--- a/indra/newview/llinventoryfilter.cpp
+++ b/indra/newview/llinventoryfilter.cpp
@@ -510,9 +510,15 @@ void LLInventoryFilter::setHoursAgo(U32 hours)
{
if (mFilterOps.mHoursAgo != hours)
{
+ bool are_date_limits_valid = mFilterOps.mMinDate == time_min() && mFilterOps.mMaxDate == time_max();
+
+ bool is_increasing = hours > mFilterOps.mHoursAgo;
+ bool is_increasing_from_zero = is_increasing && !mFilterOps.mHoursAgo;
+
// *NOTE: need to cache last filter time, in case filter goes stale
- BOOL less_restrictive = (mFilterOps.mMinDate == time_min() && mFilterOps.mMaxDate == time_max() && hours > mFilterOps.mHoursAgo);
- BOOL more_restrictive = (mFilterOps.mMinDate == time_min() && mFilterOps.mMaxDate == time_max() && hours <= mFilterOps.mHoursAgo);
+ BOOL less_restrictive = (are_date_limits_valid && ((is_increasing && mFilterOps.mHoursAgo)) || !hours);
+ BOOL more_restrictive = (are_date_limits_valid && (!is_increasing && hours) || is_increasing_from_zero);
+
mFilterOps.mHoursAgo = hours;
mFilterOps.mMinDate = time_min();
mFilterOps.mMaxDate = time_max();
diff --git a/indra/newview/llinventoryfilter.h b/indra/newview/llinventoryfilter.h
index f488b2ed1b..39e6f797a2 100644
--- a/indra/newview/llinventoryfilter.h
+++ b/indra/newview/llinventoryfilter.h
@@ -66,10 +66,13 @@ public:
FILTERLINK_ONLY_LINKS // only show links
};
- // REFACTOR: Change this to an enum.
- static const U32 SO_DATE = 1;
- static const U32 SO_FOLDERS_BY_NAME = 2;
- static const U32 SO_SYSTEM_FOLDERS_TO_TOP = 4;
+ enum ESortOrderType
+ {
+ SO_NAME = 0, // Sort inventory by name
+ SO_DATE = 0x1, // Sort inventory by date
+ SO_FOLDERS_BY_NAME = 0x1 << 1, // Force folder sort by name
+ SO_SYSTEM_FOLDERS_TO_TOP = 0x1 << 2 // Force system folders to be on top
+ };
LLInventoryFilter(const std::string& name);
virtual ~LLInventoryFilter();
diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp
index ba9bea02b9..db3b968730 100644
--- a/indra/newview/llinventoryfunctions.cpp
+++ b/indra/newview/llinventoryfunctions.cpp
@@ -853,3 +853,4 @@ void LLOpenFoldersWithSelection::doFolder(LLFolderViewFolder* folder)
folder->getParentFolder()->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_UP);
}
}
+
diff --git a/indra/newview/llinventoryicon.cpp b/indra/newview/llinventoryicon.cpp
index 95dea219a8..34734d57c5 100644
--- a/indra/newview/llinventoryicon.cpp
+++ b/indra/newview/llinventoryicon.cpp
@@ -86,6 +86,7 @@ LLIconDictionary::LLIconDictionary()
addEntry(LLInventoryIcon::ICONNAME_LINKITEM, new IconEntry("Inv_LinkItem"));
addEntry(LLInventoryIcon::ICONNAME_LINKFOLDER, new IconEntry("Inv_LinkFolder"));
+ addEntry(LLInventoryIcon::ICONNAME_MESH, new IconEntry("Inv_Mesh"));
addEntry(LLInventoryIcon::ICONNAME_INVALID, new IconEntry("Inv_Invalid"));
@@ -159,6 +160,8 @@ const std::string& LLInventoryIcon::getIconName(LLAssetType::EType asset_type,
case LLAssetType::AT_OBJECT:
idx = ICONNAME_OBJECT;
break;
+ case LLAssetType::AT_MESH:
+ idx = ICONNAME_MESH;
default:
break;
}
diff --git a/indra/newview/llinventoryicon.h b/indra/newview/llinventoryicon.h
index 694b56d572..c7e2998a20 100644
--- a/indra/newview/llinventoryicon.h
+++ b/indra/newview/llinventoryicon.h
@@ -74,6 +74,7 @@ public:
ICONNAME_LINKITEM,
ICONNAME_LINKFOLDER,
+ ICONNAME_MESH,
ICONNAME_INVALID,
ICONNAME_COUNT,
diff --git a/indra/newview/llinventoryitemslist.h b/indra/newview/llinventoryitemslist.h
index 86e11dff17..b183a2052d 100644
--- a/indra/newview/llinventoryitemslist.h
+++ b/indra/newview/llinventoryitemslist.h
@@ -38,7 +38,6 @@ class LLViewerInventoryItem;
class LLInventoryItemsList : public LLFlatListViewEx
{
- LOG_CLASS(LLInventoryItemsList);
public:
struct Params : public LLInitParam::Block<Params, LLFlatListViewEx::Params>
{
diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp
index 53835f0166..b5180854ef 100644
--- a/indra/newview/llinventorymodel.cpp
+++ b/indra/newview/llinventorymodel.cpp
@@ -631,6 +631,12 @@ U32 LLInventoryModel::updateItem(const LLViewerInventoryItem* item)
return mask;
}
+ // We're hiding mesh types
+ if (item->getType() == LLAssetType::AT_MESH)
+ {
+ return mask;
+ }
+
LLViewerInventoryItem* old_item = getItem(item->getUUID());
LLPointer<LLViewerInventoryItem> new_item;
if(old_item)
@@ -1059,12 +1065,11 @@ void LLInventoryModel::idleNotifyObservers()
{
return;
}
- notifyObservers("");
+ notifyObservers();
}
// Call this method when it's time to update everyone on a new state.
-// The optional argument 'service_name' is used by Agent Inventory Service [DEV-20328]
-void LLInventoryModel::notifyObservers(const std::string service_name)
+void LLInventoryModel::notifyObservers()
{
if (mIsNotifyObservers)
{
@@ -1081,15 +1086,7 @@ void LLInventoryModel::notifyObservers(const std::string service_name)
{
LLInventoryObserver* observer = *iter;
- if (service_name.empty())
- {
- observer->changed(mModifyMask);
- }
- else
- {
- observer->mMessageName = service_name;
- observer->changed(mModifyMask);
- }
+ observer->changed(mModifyMask);
// safe way to increment since changed may delete entries! (@!##%@!@&*!)
iter = mObservers.upper_bound(observer);
@@ -1187,7 +1184,7 @@ void LLInventoryModel::fetchInventoryResponder::result(const LLSD& content)
{
changes |= gInventory.updateItem(*it);
}
- gInventory.notifyObservers("fetchinventory");
+ gInventory.notifyObservers();
gViewerWindow->getWindow()->decBusyCount();
}
@@ -1196,7 +1193,7 @@ void LLInventoryModel::fetchInventoryResponder::error(U32 status, const std::str
{
llinfos << "fetchInventory::error "
<< status << ": " << reason << llendl;
- gInventory.notifyObservers("fetchinventory");
+ gInventory.notifyObservers();
}
bool LLInventoryModel::fetchDescendentsOf(const LLUUID& folder_id) const
@@ -1272,6 +1269,12 @@ void LLInventoryModel::addCategory(LLViewerInventoryCategory* category)
//llinfos << "LLInventoryModel::addCategory()" << llendl;
if(category)
{
+ // We aren't displaying the Meshes folder
+ if (category->mPreferredType == LLFolderType::FT_MESH)
+ {
+ return;
+ }
+
// try to localize default names first. See EXT-8319, EXT-7051.
category->localizeName();
diff --git a/indra/newview/llinventorymodel.h b/indra/newview/llinventorymodel.h
index f6728fd575..15da09990f 100644
--- a/indra/newview/llinventorymodel.h
+++ b/indra/newview/llinventorymodel.h
@@ -425,9 +425,8 @@ public:
// has been indicated.
void idleNotifyObservers();
- // Call to explicitly update everyone on a new state. The optional argument
- // 'service_name' is used by Agent Inventory Service [DEV-20328]
- void notifyObservers(const std::string service_name="");
+ // Call to explicitly update everyone on a new state.
+ void notifyObservers();
// Allows outsiders to tell the inventory if something has
// been changed 'under the hood', but outside the control of the
diff --git a/indra/newview/llinventorymodelbackgroundfetch.cpp b/indra/newview/llinventorymodelbackgroundfetch.cpp
index e31360fcbc..7b1ff102e7 100644
--- a/indra/newview/llinventorymodelbackgroundfetch.cpp
+++ b/indra/newview/llinventorymodelbackgroundfetch.cpp
@@ -388,7 +388,7 @@ void LLInventoryModelFetchDescendentsResponder::result(const LLSD& content)
titem->setParent(lost_uuid);
titem->updateParentOnServer(FALSE);
gInventory.updateItem(titem);
- gInventory.notifyObservers("fetchDescendents");
+ gInventory.notifyObservers();
}
}
@@ -464,7 +464,7 @@ void LLInventoryModelFetchDescendentsResponder::result(const LLSD& content)
fetcher->setAllFoldersFetched();
}
- gInventory.notifyObservers("fetchDescendents");
+ gInventory.notifyObservers();
}
// If we get back an error (not found, etc...), handle it here.
@@ -496,7 +496,7 @@ void LLInventoryModelFetchDescendentsResponder::error(U32 status, const std::str
fetcher->setAllFoldersFetched();
}
}
- gInventory.notifyObservers("fetchDescendents");
+ gInventory.notifyObservers();
}
BOOL LLInventoryModelFetchDescendentsResponder::getIsRecursive(const LLUUID& cat_id) const
diff --git a/indra/newview/llinventoryobserver.cpp b/indra/newview/llinventoryobserver.cpp
index 0fd4b2bee5..6bf19e346d 100644
--- a/indra/newview/llinventoryobserver.cpp
+++ b/indra/newview/llinventoryobserver.cpp
@@ -572,16 +572,7 @@ void LLInventoryAddedObserver::changed(U32 mask)
// the network, figure out which item was updated.
LLMessageSystem* msg = gMessageSystem;
- std::string msg_name;
- if (mMessageName.empty())
- {
- msg_name = msg->getMessageName();
- }
- else
- {
- msg_name = mMessageName;
- }
-
+ std::string msg_name = msg->getMessageName();
if (msg_name.empty())
{
return;
diff --git a/indra/newview/llinventoryobserver.h b/indra/newview/llinventoryobserver.h
index f2a2049a51..2d9021961e 100644
--- a/indra/newview/llinventoryobserver.h
+++ b/indra/newview/llinventoryobserver.h
@@ -63,7 +63,6 @@ public:
LLInventoryObserver();
virtual ~LLInventoryObserver();
virtual void changed(U32 mask) = 0;
- std::string mMessageName; // used by Agent Inventory Service only. [DEV-20328]
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/indra/newview/lllocationhistory.h b/indra/newview/lllocationhistory.h
index 188fbf1f9b..9fef42c5df 100644
--- a/indra/newview/lllocationhistory.h
+++ b/indra/newview/lllocationhistory.h
@@ -33,6 +33,7 @@
#include <string>
#include <map>
#include <boost/function.hpp>
+#include <boost/signals2.hpp>
class LLSD;
/**
diff --git a/indra/newview/lllogchat.cpp b/indra/newview/lllogchat.cpp
index 2df683861a..efc4e23838 100644
--- a/indra/newview/lllogchat.cpp
+++ b/indra/newview/lllogchat.cpp
@@ -32,6 +32,7 @@
#include "lltrans.h"
#include "llviewercontrol.h"
+#include "lldiriterator.h"
#include "llinstantmessage.h"
#include "llsingleton.h" // for LLSingleton
@@ -602,7 +603,8 @@ std::string LLLogChat::oldLogFileName(std::string filename)
//LL_INFOS("") << "Checking:" << directory << " for " << pattern << LL_ENDL;/* uncomment if you want to verify step, delete on commit */
std::vector<std::string> allfiles;
- while (gDirUtilp->getNextFileInDir(directory, pattern, scanResult))
+ LLDirIterator iter(directory, pattern);
+ while (iter.next(scanResult))
{
//LL_INFOS("") << "Found :" << scanResult << LL_ENDL;
allfiles.push_back(scanResult);
diff --git a/indra/newview/lllogininstance.cpp b/indra/newview/lllogininstance.cpp
index abcd8588dc..00de6a86e1 100644
--- a/indra/newview/lllogininstance.cpp
+++ b/indra/newview/lllogininstance.cpp
@@ -558,6 +558,18 @@ void LLLoginInstance::constructAuthParams(LLPointer<LLCredential> user_credentia
requested_options.append("buddy-list");
requested_options.append("newuser-config");
requested_options.append("ui-config");
+
+ //send this info to login.cgi for stats gathering
+ //since viewerstats isn't reliable enough
+ if (gSavedSettings.getString("SessionSettingsFile").empty())
+ {
+ requested_options.append("advanced-mode");
+ }
+ else
+ {
+ requested_options.append("basic-mode");
+ }
+
#endif
requested_options.append("max-agent-groups");
requested_options.append("map-server-url");
@@ -596,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/llmaniprotate.cpp b/indra/newview/llmaniprotate.cpp
index f1c7e952d1..6ee095475f 100644
--- a/indra/newview/llmaniprotate.cpp
+++ b/indra/newview/llmaniprotate.cpp
@@ -1127,7 +1127,7 @@ BOOL LLManipRotate::updateVisiblity()
if (gSavedSettings.getBOOL("LimitSelectDistance"))
{
F32 max_select_distance = gSavedSettings.getF32("MaxSelectDistance");
- if (dist_vec(gAgent.getPositionAgent(), center) > max_select_distance)
+ if (dist_vec_squared(gAgent.getPositionAgent(), center) > (max_select_distance * max_select_distance))
{
visible = FALSE;
}
diff --git a/indra/newview/llmanipscale.cpp b/indra/newview/llmanipscale.cpp
index 060677f9f3..673f28e01f 100644
--- a/indra/newview/llmanipscale.cpp
+++ b/indra/newview/llmanipscale.cpp
@@ -52,6 +52,7 @@
#include "llui.h"
#include "llviewercamera.h"
#include "llviewerobject.h"
+#include "llviewerregion.h"
#include "llviewerwindow.h"
#include "llhudrender.h"
#include "llworld.h"
@@ -85,6 +86,23 @@ const LLManip::EManipPart MANIPULATOR_IDS[NUM_MANIPULATORS] =
};
+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() &&
+ !gAgent.getRegion()->getCapability("ObjectAdd").empty() &&
+ !is_flora)
+ {
+ return DEFAULT_MAX_PRIM_SCALE;
+ }
+ else
+ {
+ return DEFAULT_MAX_PRIM_SCALE_NO_MESH;
+ }
+}
// static
void LLManipScale::setUniform(BOOL b)
@@ -217,8 +235,6 @@ void LLManipScale::render()
LLVector3 center_agent = gAgent.getPosAgentFromGlobal(LLSelectMgr::getInstance()->getSelectionCenterGlobal());
- F32 range;
- F32 range_from_agent;
if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD)
{
mBoxHandleSize = BOX_HANDLE_BASE_SIZE * BOX_HANDLE_BASE_FACTOR / (F32) LLViewerCamera::getInstance()->getViewHeightInPixels();
@@ -226,25 +242,25 @@ void LLManipScale::render()
}
else
{
- range = dist_vec(gAgentCamera.getCameraPositionAgent(), center_agent);
- range_from_agent = dist_vec(gAgent.getPositionAgent(), center_agent);
+ F32 range_squared = dist_vec_squared(gAgentCamera.getCameraPositionAgent(), center_agent);
+ F32 range_from_agent_squared = dist_vec_squared(gAgent.getPositionAgent(), center_agent);
// Don't draw manip if object too far away
if (gSavedSettings.getBOOL("LimitSelectDistance"))
{
F32 max_select_distance = gSavedSettings.getF32("MaxSelectDistance");
- if (range_from_agent > max_select_distance)
+ if (range_from_agent_squared > max_select_distance * max_select_distance)
{
return;
}
}
- if (range > 0.001f)
+ if (range_squared > 0.001f * 0.001f)
{
// range != zero
F32 fraction_of_fov = BOX_HANDLE_BASE_SIZE / (F32) LLViewerCamera::getInstance()->getViewHeightInPixels();
F32 apparent_angle = fraction_of_fov * LLViewerCamera::getInstance()->getView(); // radians
- mBoxHandleSize = range * tan(apparent_angle) * BOX_HANDLE_BASE_FACTOR;
+ mBoxHandleSize = (F32) sqrtf(range_squared) * tan(apparent_angle) * BOX_HANDLE_BASE_FACTOR;
}
else
{
@@ -950,8 +966,8 @@ void LLManipScale::dragCorner( S32 x, S32 y )
mInSnapRegime = FALSE;
}
- F32 max_scale_factor = DEFAULT_MAX_PRIM_SCALE / MIN_PRIM_SCALE;
- F32 min_scale_factor = MIN_PRIM_SCALE / DEFAULT_MAX_PRIM_SCALE;
+ F32 max_scale_factor = get_default_max_prim_scale() / MIN_PRIM_SCALE;
+ F32 min_scale_factor = MIN_PRIM_SCALE / get_default_max_prim_scale();
// find max and min scale factors that will make biggest object hit max absolute scale and smallest object hit min absolute scale
for (LLObjectSelection::iterator iter = mObjectSelection->begin();
@@ -963,7 +979,7 @@ void LLManipScale::dragCorner( S32 x, S32 y )
{
const LLVector3& scale = selectNode->mSavedScale;
- F32 cur_max_scale_factor = llmin( DEFAULT_MAX_PRIM_SCALE / scale.mV[VX], DEFAULT_MAX_PRIM_SCALE / scale.mV[VY], DEFAULT_MAX_PRIM_SCALE / scale.mV[VZ] );
+ F32 cur_max_scale_factor = llmin( get_default_max_prim_scale(LLPickInfo::isFlora(cur)) / scale.mV[VX], get_default_max_prim_scale(LLPickInfo::isFlora(cur)) / scale.mV[VY], get_default_max_prim_scale(LLPickInfo::isFlora(cur)) / scale.mV[VZ] );
max_scale_factor = llmin( max_scale_factor, cur_max_scale_factor );
F32 cur_min_scale_factor = llmax( MIN_PRIM_SCALE / scale.mV[VX], MIN_PRIM_SCALE / scale.mV[VY], MIN_PRIM_SCALE / scale.mV[VZ] );
@@ -1260,7 +1276,7 @@ void LLManipScale::stretchFace( const LLVector3& drag_start_agent, const LLVecto
F32 denom = axis * dir_local;
F32 desired_delta_size = is_approx_zero(denom) ? 0.f : (delta_local_mag / denom); // in meters
- F32 desired_scale = llclamp(selectNode->mSavedScale.mV[axis_index] + desired_delta_size, MIN_PRIM_SCALE, DEFAULT_MAX_PRIM_SCALE);
+ F32 desired_scale = llclamp(selectNode->mSavedScale.mV[axis_index] + desired_delta_size, MIN_PRIM_SCALE, get_default_max_prim_scale(LLPickInfo::isFlora(cur)));
// propagate scale constraint back to position offset
desired_delta_size = desired_scale - selectNode->mSavedScale.mV[axis_index]; // propagate constraint back to position
@@ -1960,7 +1976,7 @@ F32 LLManipScale::partToMaxScale( S32 part, const LLBBox &bbox ) const
max_extent = bbox_extents.mV[i];
}
}
- max_scale_factor = bbox_extents.magVec() * DEFAULT_MAX_PRIM_SCALE / max_extent;
+ max_scale_factor = bbox_extents.magVec() * get_default_max_prim_scale() / max_extent;
if (getUniform())
{
@@ -1975,7 +1991,7 @@ F32 LLManipScale::partToMinScale( S32 part, const LLBBox &bbox ) const
{
LLVector3 bbox_extents = unitVectorToLocalBBoxExtent( partToUnitVector( part ), bbox );
bbox_extents.abs();
- F32 min_extent = DEFAULT_MAX_PRIM_SCALE;
+ F32 min_extent = get_default_max_prim_scale();
for (U32 i = VX; i <= VZ; i++)
{
if (bbox_extents.mV[i] > 0.f && bbox_extents.mV[i] < min_extent)
diff --git a/indra/newview/llmanipscale.h b/indra/newview/llmanipscale.h
index 5559f557c0..5cb8898fd0 100644
--- a/indra/newview/llmanipscale.h
+++ b/indra/newview/llmanipscale.h
@@ -39,6 +39,9 @@
#include "llviewerobject.h"
#include "llbbox.h"
+
+F32 get_default_max_prim_scale(bool is_flora = false);
+
class LLToolComposite;
class LLColor4;
diff --git a/indra/newview/llmediactrl.cpp b/indra/newview/llmediactrl.cpp
index 5007f1c17a..b3ad9efeb2 100644
--- a/indra/newview/llmediactrl.cpp
+++ b/indra/newview/llmediactrl.cpp
@@ -68,7 +68,6 @@ LLMediaCtrl::Params::Params()
: start_url("start_url"),
border_visible("border_visible", true),
ignore_ui_scale("ignore_ui_scale", true),
- hide_loading("hide_loading", false),
decouple_texture_size("decouple_texture_size", false),
texture_width("texture_width", 1024),
texture_height("texture_height", 1024),
@@ -97,8 +96,6 @@ LLMediaCtrl::LLMediaCtrl( const Params& p) :
mCurrentNavUrl( "" ),
mStretchToFill( true ),
mMaintainAspectRatio ( true ),
- mHideLoading (false),
- mHidingInitialLoad (false),
mDecoupleTextureSize ( false ),
mTextureWidth ( 1024 ),
mTextureHeight ( 1024 ),
@@ -121,8 +118,6 @@ LLMediaCtrl::LLMediaCtrl( const Params& p) :
setBorderVisible(p.border_visible);
- mHideLoading = p.hide_loading;
-
setDecoupleTextureSize(p.decouple_texture_size);
setTextureSize(p.texture_width, p.texture_height);
@@ -684,11 +679,6 @@ bool LLMediaCtrl::ensureMediaSourceExists()
mMediaSource->clearCache();
mClearCache = false;
}
-
- if(mHideLoading)
- {
- mHidingInitialLoad = true;
- }
}
else
{
@@ -756,11 +746,11 @@ void LLMediaCtrl::draw()
}
}
- if(mHidingInitialLoad)
- {
- // If we're hiding loading, don't draw at all.
- draw_media = false;
- }
+// if(mHidingInitialLoad)
+// {
+// // If we're hiding loading, don't draw at all.
+// draw_media = false;
+// }
bool background_visible = isBackgroundVisible();
bool background_opaque = isBackgroundOpaque();
diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp
new file mode 100644
index 0000000000..55145c6ad7
--- /dev/null
+++ b/indra/newview/llmeshrepository.cpp
@@ -0,0 +1,3870 @@
+/**
+ * @file llmeshrepository.cpp
+ * @brief Mesh repository implementation.
+ *
+ * $LicenseInfo:firstyear=2005&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "apr_pools.h"
+#include "apr_dso.h"
+#include "llhttpstatuscodes.h"
+#include "llmeshrepository.h"
+
+#include "llagent.h"
+#include "llappviewer.h"
+#include "llbufferstream.h"
+#include "llcurl.h"
+#include "lldatapacker.h"
+#include "llfasttimer.h"
+#include "llfloatermodelpreview.h"
+#include "llfloaterperms.h"
+#include "lleconomy.h"
+#include "llimagej2c.h"
+#include "llhost.h"
+#include "llnotificationsutil.h"
+#include "llsd.h"
+#include "llsdutil_math.h"
+#include "llsdserialize.h"
+#include "llthread.h"
+#include "llvfile.h"
+#include "llviewercontrol.h"
+#include "llviewermenufile.h"
+#include "llviewerobjectlist.h"
+#include "llviewerregion.h"
+#include "llviewertexturelist.h"
+#include "llvolume.h"
+#include "llvolumemgr.h"
+#include "llvovolume.h"
+#include "llworld.h"
+#include "material_codes.h"
+#include "pipeline.h"
+#include "llinventorymodel.h"
+#include "llfoldertype.h"
+
+#ifndef LL_WINDOWS
+#include "netdb.h"
+#endif
+
+#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;
+
+U32 LLMeshRepository::sBytesReceived = 0;
+U32 LLMeshRepository::sHTTPRequestCount = 0;
+U32 LLMeshRepository::sHTTPRetryCount = 0;
+U32 LLMeshRepository::sCacheBytesRead = 0;
+U32 LLMeshRepository::sCacheBytesWritten = 0;
+U32 LLMeshRepository::sPeakKbps = 0;
+
+
+const U32 MAX_TEXTURE_UPLOAD_RETRIES = 5;
+
+void dumpLLSDToFile(const LLSD& content, std::string filename);
+
+std::string header_lod[] =
+{
+ "lowest_lod",
+ "low_lod",
+ "medium_lod",
+ "high_lod"
+};
+
+
+//get the number of bytes resident in memory for given volume
+U32 get_volume_memory_size(const LLVolume* volume)
+{
+ U32 indices = 0;
+ U32 vertices = 0;
+
+ for (U32 i = 0; i < volume->getNumVolumeFaces(); ++i)
+ {
+ const LLVolumeFace& face = volume->getVolumeFace(i);
+ indices += face.mNumIndices;
+ vertices += face.mNumVertices;
+ }
+
+
+ return indices*2+vertices*11+sizeof(LLVolume)+sizeof(LLVolumeFace)*volume->getNumVolumeFaces();
+}
+
+void get_vertex_buffer_from_mesh(LLCDMeshData& mesh, LLModel::PhysicsMesh& res, F32 scale = 1.f)
+{
+ res.mPositions.clear();
+ res.mNormals.clear();
+
+ const F32* v = mesh.mVertexBase;
+
+ if (mesh.mIndexType == LLCDMeshData::INT_16)
+ {
+ U16* idx = (U16*) mesh.mIndexBase;
+ for (S32 j = 0; j < mesh.mNumTriangles; ++j)
+ {
+ F32* mp0 = (F32*) ((U8*)v+idx[0]*mesh.mVertexStrideBytes);
+ F32* mp1 = (F32*) ((U8*)v+idx[1]*mesh.mVertexStrideBytes);
+ F32* mp2 = (F32*) ((U8*)v+idx[2]*mesh.mVertexStrideBytes);
+
+ idx = (U16*) (((U8*)idx)+mesh.mIndexStrideBytes);
+
+ LLVector3 v0(mp0);
+ LLVector3 v1(mp1);
+ LLVector3 v2(mp2);
+
+ LLVector3 n = (v1-v0)%(v2-v0);
+ n.normalize();
+
+ res.mPositions.push_back(v0*scale);
+ res.mPositions.push_back(v1*scale);
+ res.mPositions.push_back(v2*scale);
+
+ res.mNormals.push_back(n);
+ res.mNormals.push_back(n);
+ res.mNormals.push_back(n);
+ }
+ }
+ else
+ {
+ U32* idx = (U32*) mesh.mIndexBase;
+ for (S32 j = 0; j < mesh.mNumTriangles; ++j)
+ {
+ F32* mp0 = (F32*) ((U8*)v+idx[0]*mesh.mVertexStrideBytes);
+ F32* mp1 = (F32*) ((U8*)v+idx[1]*mesh.mVertexStrideBytes);
+ F32* mp2 = (F32*) ((U8*)v+idx[2]*mesh.mVertexStrideBytes);
+
+ idx = (U32*) (((U8*)idx)+mesh.mIndexStrideBytes);
+
+ LLVector3 v0(mp0);
+ LLVector3 v1(mp1);
+ LLVector3 v2(mp2);
+
+ LLVector3 n = (v1-v0)%(v2-v0);
+ n.normalize();
+
+ res.mPositions.push_back(v0*scale);
+ res.mPositions.push_back(v1*scale);
+ res.mPositions.push_back(v2*scale);
+
+ res.mNormals.push_back(n);
+ res.mNormals.push_back(n);
+ res.mNormals.push_back(n);
+ }
+ }
+}
+
+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:
+ LLVolumeParams mMeshParams;
+
+ LLMeshHeaderResponder(const LLVolumeParams& mesh_params)
+ : mMeshParams(mesh_params)
+ {
+ }
+
+ virtual void completedRaw(U32 status, const std::string& reason,
+ const LLChannelDescriptors& channels,
+ const LLIOPipe::buffer_ptr_t& buffer);
+
+};
+
+class LLMeshLODResponder : public LLCurl::Responder
+{
+public:
+ LLVolumeParams mMeshParams;
+ S32 mLOD;
+ U32 mRequestedBytes;
+ U32 mOffset;
+
+ LLMeshLODResponder(const LLVolumeParams& mesh_params, S32 lod, U32 offset, U32 requested_bytes)
+ : mMeshParams(mesh_params), mLOD(lod), mOffset(offset), mRequestedBytes(requested_bytes)
+ {
+ }
+
+ virtual void completedRaw(U32 status, const std::string& reason,
+ const LLChannelDescriptors& channels,
+ const LLIOPipe::buffer_ptr_t& buffer);
+
+};
+
+class LLMeshSkinInfoResponder : public LLCurl::Responder
+{
+public:
+ LLUUID mMeshID;
+ U32 mRequestedBytes;
+ U32 mOffset;
+
+ LLMeshSkinInfoResponder(const LLUUID& id, U32 offset, U32 size)
+ : mMeshID(id), mRequestedBytes(size), mOffset(offset)
+ {
+ }
+
+ virtual void completedRaw(U32 status, const std::string& reason,
+ const LLChannelDescriptors& channels,
+ const LLIOPipe::buffer_ptr_t& buffer);
+
+};
+
+class LLMeshDecompositionResponder : public LLCurl::Responder
+{
+public:
+ LLUUID mMeshID;
+ U32 mRequestedBytes;
+ U32 mOffset;
+
+ LLMeshDecompositionResponder(const LLUUID& id, U32 offset, U32 size)
+ : mMeshID(id), mRequestedBytes(size), mOffset(offset)
+ {
+ }
+
+ virtual void completedRaw(U32 status, const std::string& reason,
+ const LLChannelDescriptors& channels,
+ const LLIOPipe::buffer_ptr_t& buffer);
+
+};
+
+class LLMeshPhysicsShapeResponder : public LLCurl::Responder
+{
+public:
+ LLUUID mMeshID;
+ U32 mRequestedBytes;
+ U32 mOffset;
+
+ LLMeshPhysicsShapeResponder(const LLUUID& id, U32 offset, U32 size)
+ : mMeshID(id), mRequestedBytes(size), mOffset(offset)
+ {
+ }
+
+ virtual void completedRaw(U32 status, const std::string& reason,
+ const LLChannelDescriptors& channels,
+ const LLIOPipe::buffer_ptr_t& buffer);
+
+};
+
+class LLModelObjectUploadResponder: public LLCurl::Responder
+{
+ LLSD mObjectAsset;
+ LLMeshUploadThread* mThread;
+
+public:
+ LLModelObjectUploadResponder(LLMeshUploadThread* thread, const LLSD& object_asset):
+ mThread(thread),
+ mObjectAsset(object_asset)
+ {
+ }
+
+ virtual void completedRaw(U32 status, const std::string& reason,
+ const LLChannelDescriptors& channels,
+ const LLIOPipe::buffer_ptr_t& buffer)
+ {
+ assert_main_thread();
+
+ llinfos << "completed" << llendl;
+ mThread->mPendingUploads--;
+ mThread->mFinished = true;
+ }
+};
+
+class LLWholeModelFeeResponder: public LLCurl::Responder
+{
+ LLMeshUploadThread* mThread;
+public:
+ LLWholeModelFeeResponder(LLMeshUploadThread* thread):
+ mThread(thread)
+ {
+ }
+ virtual void completed(U32 status,
+ const std::string& reason,
+ const LLSD& content)
+ {
+ //assert_main_thread();
+ llinfos << "completed" << llendl;
+ mThread->mPendingUploads--;
+ dumpLLSDToFile(content,"whole_model_response.xml");
+
+ mThread->mWholeModelUploadURL = content["uploader"].asString();
+ }
+};
+
+class LLWholeModelUploadResponder: public LLCurl::Responder
+{
+ LLMeshUploadThread* mThread;
+public:
+ LLWholeModelUploadResponder(LLMeshUploadThread* thread):
+ mThread(thread)
+ {
+ }
+ virtual void completed(U32 status,
+ const std::string& reason,
+ const LLSD& content)
+ {
+ //assert_main_thread();
+ llinfos << "upload completed" << llendl;
+ mThread->mPendingUploads--;
+ dumpLLSDToFile(content,"whole_model_upload_response.xml");
+ }
+};
+
+LLMeshRepoThread::LLMeshRepoThread()
+: LLThread("mesh repo", NULL)
+{
+ mWaiting = false;
+ mMutex = new LLMutex(NULL);
+ mHeaderMutex = new LLMutex(NULL);
+ mSignal = new LLCondition(NULL);
+}
+
+LLMeshRepoThread::~LLMeshRepoThread()
+{
+ delete mMutex;
+ mMutex = NULL;
+ delete mHeaderMutex;
+ mHeaderMutex = NULL;
+ delete mSignal;
+ mSignal = NULL;
+}
+
+void LLMeshRepoThread::run()
+{
+ mCurlRequest = new LLCurlRequest();
+ LLCDResult res = LLConvexDecomposition::initThread();
+ if (res != LLCD_OK)
+ {
+ llwarns << "convex decomposition unable to be loaded" << llendl;
+ }
+
+ while (!LLApp::isQuitting())
+ {
+ mWaiting = true;
+ mSignal->wait();
+ mWaiting = false;
+
+ if (!LLApp::isQuitting())
+ {
+ static U32 count = 0;
+
+ static F32 last_hundred = gFrameTimeSeconds;
+
+ if (gFrameTimeSeconds - last_hundred > 1.f)
+ { //a second has gone by, clear count
+ last_hundred = gFrameTimeSeconds;
+ count = 0;
+ }
+
+ // NOTE: throttling intentionally favors LOD requests over header requests
+
+ while (!mLODReqQ.empty() && count < MAX_MESH_REQUESTS_PER_SECOND && sActiveLODRequests < sMaxConcurrentRequests)
+ {
+ {
+ mMutex->lock();
+ LODRequest req = mLODReqQ.front();
+ mLODReqQ.pop();
+ mMutex->unlock();
+ if (fetchMeshLOD(req.mMeshParams, req.mLOD))
+ {
+ count++;
+ }
+ }
+ }
+
+ while (!mHeaderReqQ.empty() && count < MAX_MESH_REQUESTS_PER_SECOND && sActiveHeaderRequests < sMaxConcurrentRequests)
+ {
+ {
+ mMutex->lock();
+ HeaderRequest req = mHeaderReqQ.front();
+ mHeaderReqQ.pop();
+ mMutex->unlock();
+ if (fetchMeshHeader(req.mMeshParams))
+ {
+ count++;
+ }
+ }
+ }
+
+ { //mSkinRequests is protected by mSignal
+ std::set<LLUUID> incomplete;
+ for (std::set<LLUUID>::iterator iter = mSkinRequests.begin(); iter != mSkinRequests.end(); ++iter)
+ {
+ LLUUID mesh_id = *iter;
+ if (!fetchMeshSkinInfo(mesh_id))
+ {
+ incomplete.insert(mesh_id);
+ }
+ }
+ mSkinRequests = incomplete;
+ }
+
+ { //mDecompositionRequests is protected by mSignal
+ std::set<LLUUID> incomplete;
+ for (std::set<LLUUID>::iterator iter = mDecompositionRequests.begin(); iter != mDecompositionRequests.end(); ++iter)
+ {
+ LLUUID mesh_id = *iter;
+ if (!fetchMeshDecomposition(mesh_id))
+ {
+ incomplete.insert(mesh_id);
+ }
+ }
+ mDecompositionRequests = incomplete;
+ }
+
+ { //mPhysicsShapeRequests is protected by mSignal
+ std::set<LLUUID> incomplete;
+ for (std::set<LLUUID>::iterator iter = mPhysicsShapeRequests.begin(); iter != mPhysicsShapeRequests.end(); ++iter)
+ {
+ LLUUID mesh_id = *iter;
+ if (!fetchMeshPhysicsShape(mesh_id))
+ {
+ incomplete.insert(mesh_id);
+ }
+ }
+ mPhysicsShapeRequests = incomplete;
+ }
+
+ mCurlRequest->process();
+ }
+ }
+
+ if (mSignal->isLocked())
+ { //make sure to let go of the mutex associated with the given signal before shutting down
+ mSignal->unlock();
+ }
+
+ res = LLConvexDecomposition::quitThread();
+ if (res != LLCD_OK)
+ {
+ llwarns << "convex decomposition unable to be quit" << llendl;
+ }
+
+ delete mCurlRequest;
+ mCurlRequest = NULL;
+}
+
+void LLMeshRepoThread::loadMeshSkinInfo(const LLUUID& mesh_id)
+{ //protected by mSignal, no locking needed here
+ mSkinRequests.insert(mesh_id);
+}
+
+void LLMeshRepoThread::loadMeshDecomposition(const LLUUID& mesh_id)
+{ //protected by mSignal, no locking needed here
+ mDecompositionRequests.insert(mesh_id);
+}
+
+void LLMeshRepoThread::loadMeshPhysicsShape(const LLUUID& mesh_id)
+{ //protected by mSignal, no locking needed here
+ mPhysicsShapeRequests.insert(mesh_id);
+}
+
+
+void LLMeshRepoThread::loadMeshLOD(const LLVolumeParams& mesh_params, S32 lod)
+{ //protected by mSignal, no locking needed here
+
+ mesh_header_map::iterator iter = mMeshHeader.find(mesh_params.getSculptID());
+ if (iter != mMeshHeader.end())
+ { //if we have the header, request LOD byte range
+ LODRequest req(mesh_params, lod);
+ {
+ LLMutexLock lock(mMutex);
+ mLODReqQ.push(req);
+ }
+ }
+ else
+ {
+ HeaderRequest req(mesh_params);
+
+ pending_lod_map::iterator pending = mPendingLOD.find(mesh_params);
+
+ 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;
+ }
+ }
+ else
+ { //if no header request is pending, fetch header
+ LLMutexLock lock(mMutex);
+ mHeaderReqQ.push(req);
+ mPendingLOD[mesh_params].push_back(lod);
+ }
+ }
+}
+
+//static
+std::string LLMeshRepoThread::constructUrl(LLUUID mesh_id)
+{
+ std::string http_url;
+
+ if (gAgent.getRegion())
+ {
+ http_url = gMeshRepo.mGetMeshCapability;
+ }
+
+ if (!http_url.empty())
+ {
+ http_url += "/?mesh_id=";
+ http_url += mesh_id.asString().c_str();
+ }
+ else
+ {
+ llwarns << "Current region does not have GetMesh capability! Cannot load " << mesh_id << ".mesh" << llendl;
+ }
+
+ return http_url;
+}
+
+bool LLMeshRepoThread::fetchMeshSkinInfo(const LLUUID& mesh_id)
+{ //protected by mMutex
+ mHeaderMutex->lock();
+
+ if (mMeshHeader.find(mesh_id) == mMeshHeader.end())
+ { //we have no header info for this mesh, do nothing
+ mHeaderMutex->unlock();
+ return false;
+ }
+
+ U32 header_size = mMeshHeaderSize[mesh_id];
+
+ if (header_size > 0)
+ {
+ 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)
+ {
+ //check VFS for mesh skin info
+ LLVFile file(gVFS, mesh_id, LLAssetType::AT_MESH);
+ if (file.getSize() >= offset+size)
+ {
+ LLMeshRepository::sCacheBytesRead += size;
+ file.seek(offset);
+ U8* buffer = new U8[size];
+ file.read(buffer, size);
+
+ //make sure buffer isn't all 0's (reserved block but not written)
+ bool zero = true;
+ for (S32 i = 0; i < llmin(size, 1024) && zero; ++i)
+ {
+ zero = buffer[i] > 0 ? false : true;
+ }
+
+ if (!zero)
+ { //attempt to parse
+ if (skinInfoReceived(mesh_id, buffer, size))
+ {
+ delete[] buffer;
+ return true;
+ }
+ }
+
+ delete[] buffer;
+ }
+
+ //reading from VFS failed for whatever reason, fetch from sim
+ std::vector<std::string> headers;
+ headers.push_back("Accept: application/octet-stream");
+
+ std::string http_url = constructUrl(mesh_id);
+ if (!http_url.empty())
+ {
+ ++sActiveLODRequests;
+ LLMeshRepository::sHTTPRequestCount++;
+ mCurlRequest->getByteRange(constructUrl(mesh_id), headers, offset, size,
+ new LLMeshSkinInfoResponder(mesh_id, offset, size));
+ }
+ }
+ }
+ else
+ {
+ mHeaderMutex->unlock();
+ }
+
+ //early out was not hit, effectively fetched
+ return true;
+}
+
+bool LLMeshRepoThread::fetchMeshDecomposition(const LLUUID& mesh_id)
+{ //protected by mMutex
+ mHeaderMutex->lock();
+
+ if (mMeshHeader.find(mesh_id) == mMeshHeader.end())
+ { //we have no header info for this mesh, do nothing
+ mHeaderMutex->unlock();
+ return false;
+ }
+
+ U32 header_size = mMeshHeaderSize[mesh_id];
+
+ if (header_size > 0)
+ {
+ S32 offset = header_size + mMeshHeader[mesh_id]["decomposition"]["offset"].asInteger();
+ S32 size = mMeshHeader[mesh_id]["decomposition"]["size"].asInteger();
+
+ mHeaderMutex->unlock();
+
+ if (offset >= 0 && size > 0)
+ {
+ //check VFS for mesh skin info
+ LLVFile file(gVFS, mesh_id, LLAssetType::AT_MESH);
+ if (file.getSize() >= offset+size)
+ {
+ LLMeshRepository::sCacheBytesRead += size;
+ file.seek(offset);
+ U8* buffer = new U8[size];
+ file.read(buffer, size);
+
+ //make sure buffer isn't all 0's (reserved block but not written)
+ bool zero = true;
+ for (S32 i = 0; i < llmin(size, 1024) && zero; ++i)
+ {
+ zero = buffer[i] > 0 ? false : true;
+ }
+
+ if (!zero)
+ { //attempt to parse
+ if (decompositionReceived(mesh_id, buffer, size))
+ {
+ delete[] buffer;
+ return true;
+ }
+ }
+
+ delete[] buffer;
+ }
+
+ //reading from VFS failed for whatever reason, fetch from sim
+ std::vector<std::string> headers;
+ headers.push_back("Accept: application/octet-stream");
+
+ std::string http_url = constructUrl(mesh_id);
+ if (!http_url.empty())
+ {
+ ++sActiveLODRequests;
+ LLMeshRepository::sHTTPRequestCount++;
+ mCurlRequest->getByteRange(http_url, headers, offset, size,
+ new LLMeshDecompositionResponder(mesh_id, offset, size));
+ }
+ }
+ }
+ else
+ {
+ mHeaderMutex->unlock();
+ }
+
+ //early out was not hit, effectively fetched
+ return true;
+}
+
+bool LLMeshRepoThread::fetchMeshPhysicsShape(const LLUUID& mesh_id)
+{ //protected by mMutex
+ mHeaderMutex->lock();
+
+ if (mMeshHeader.find(mesh_id) == mMeshHeader.end())
+ { //we have no header info for this mesh, do nothing
+ mHeaderMutex->unlock();
+ return false;
+ }
+
+ U32 header_size = mMeshHeaderSize[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();
+
+ mHeaderMutex->unlock();
+
+ if (offset >= 0 && size > 0)
+ {
+ //check VFS for mesh physics shape info
+ LLVFile file(gVFS, mesh_id, LLAssetType::AT_MESH);
+ if (file.getSize() >= offset+size)
+ {
+ LLMeshRepository::sCacheBytesRead += size;
+ file.seek(offset);
+ U8* buffer = new U8[size];
+ file.read(buffer, size);
+
+ //make sure buffer isn't all 0's (reserved block but not written)
+ bool zero = true;
+ for (S32 i = 0; i < llmin(size, 1024) && zero; ++i)
+ {
+ zero = buffer[i] > 0 ? false : true;
+ }
+
+ if (!zero)
+ { //attempt to parse
+ if (physicsShapeReceived(mesh_id, buffer, size))
+ {
+ delete[] buffer;
+ return true;
+ }
+ }
+
+ delete[] buffer;
+ }
+
+ //reading from VFS failed for whatever reason, fetch from sim
+ std::vector<std::string> headers;
+ headers.push_back("Accept: application/octet-stream");
+
+ std::string http_url = constructUrl(mesh_id);
+ if (!http_url.empty())
+ {
+ ++sActiveLODRequests;
+ LLMeshRepository::sHTTPRequestCount++;
+ mCurlRequest->getByteRange(http_url, headers, offset, size,
+ new LLMeshPhysicsShapeResponder(mesh_id, offset, size));
+ }
+ }
+ else
+ { //no physics shape whatsoever, report back NULL
+ physicsShapeReceived(mesh_id, NULL, 0);
+ }
+ }
+ else
+ {
+ mHeaderMutex->unlock();
+ }
+
+ //early out was not hit, effectively fetched
+ return true;
+}
+
+bool LLMeshRepoThread::fetchMeshHeader(const LLVolumeParams& mesh_params)
+{
+ bool retval = false;
+
+ {
+ //look for mesh in asset in vfs
+ LLVFile file(gVFS, mesh_params.getSculptID(), LLAssetType::AT_MESH);
+
+ S32 size = file.getSize();
+
+ if (size > 0)
+ {
+ U8 buffer[1024];
+ S32 bytes = llmin(size, 1024);
+ LLMeshRepository::sCacheBytesRead += bytes;
+ file.read(buffer, bytes);
+ if (headerReceived(mesh_params, buffer, bytes))
+ { //did not do an HTTP request, return false
+ return false;
+ }
+ }
+ }
+
+ //either cache entry doesn't exist or is corrupt, request header from simulator
+
+ std::vector<std::string> headers;
+ headers.push_back("Accept: application/octet-stream");
+
+ std::string http_url = constructUrl(mesh_params.getSculptID());
+ if (!http_url.empty())
+ {
+ ++sActiveHeaderRequests;
+ retval = true;
+ //grab first 4KB if we're going to bother with a fetch. Cache will prevent future fetches if a full mesh fits
+ //within the first 4KB
+ LLMeshRepository::sHTTPRequestCount++;
+ mCurlRequest->getByteRange(http_url, headers, 0, 4096, new LLMeshHeaderResponder(mesh_params));
+ }
+
+ return retval;
+}
+
+bool LLMeshRepoThread::fetchMeshLOD(const LLVolumeParams& mesh_params, S32 lod)
+{ //protected by mMutex
+ mHeaderMutex->lock();
+
+ bool retval = false;
+
+ LLUUID mesh_id = mesh_params.getSculptID();
+
+ U32 header_size = mMeshHeaderSize[mesh_id];
+
+ if (header_size > 0)
+ {
+ 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)
+ {
+
+ //check VFS for mesh asset
+ LLVFile file(gVFS, mesh_id, LLAssetType::AT_MESH);
+ if (file.getSize() >= offset+size)
+ {
+ LLMeshRepository::sCacheBytesRead += size;
+ file.seek(offset);
+ U8* buffer = new U8[size];
+ file.read(buffer, size);
+
+ //make sure buffer isn't all 0's (reserved block but not written)
+ bool zero = true;
+ for (S32 i = 0; i < llmin(size, 1024) && zero; ++i)
+ {
+ zero = buffer[i] > 0 ? false : true;
+ }
+
+ if (!zero)
+ { //attempt to parse
+ if (lodReceived(mesh_params, lod, buffer, size))
+ {
+ delete[] buffer;
+ return false;
+ }
+ }
+
+ delete[] buffer;
+ }
+
+ //reading from VFS failed for whatever reason, fetch from sim
+ std::vector<std::string> headers;
+ headers.push_back("Accept: application/octet-stream");
+
+ std::string http_url = constructUrl(mesh_id);
+ if (!http_url.empty())
+ {
+ ++sActiveLODRequests;
+ retval = true;
+ LLMeshRepository::sHTTPRequestCount++;
+ mCurlRequest->getByteRange(constructUrl(mesh_id), headers, offset, size,
+ new LLMeshLODResponder(mesh_params, lod, offset, size));
+ }
+ else
+ {
+ mUnavailableQ.push(LODRequest(mesh_params, lod));
+ }
+ }
+ else
+ {
+ mUnavailableQ.push(LODRequest(mesh_params, lod));
+ }
+ }
+ else
+ {
+ mHeaderMutex->unlock();
+ }
+
+ return retval;
+}
+
+bool LLMeshRepoThread::headerReceived(const LLVolumeParams& mesh_params, U8* data, S32 data_size)
+{
+ LLSD header;
+
+ U32 header_size = 0;
+ if (data_size > 0)
+ {
+ std::string res_str((char*) data, data_size);
+
+ std::string deprecated_header("<? LLSD/Binary ?>");
+
+ if (res_str.substr(0, deprecated_header.size()) == deprecated_header)
+ {
+ res_str = res_str.substr(deprecated_header.size()+1, data_size);
+ header_size = deprecated_header.size()+1;
+ }
+ data_size = res_str.size();
+
+ std::istringstream stream(res_str);
+
+ if (!LLSDSerialize::fromBinary(header, stream, data_size))
+ {
+ llwarns << "Mesh header parse error. Not a valid mesh asset!" << llendl;
+ return false;
+ }
+
+ header_size += stream.tellg();
+ }
+ else
+ {
+ llinfos
+ << "Marking header as non-existent, will not retry." << llendl;
+ header["404"] = 1;
+ }
+
+ {
+ 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
+ pending_lod_map::iterator iter = mPendingLOD.find(mesh_params);
+ if (iter != mPendingLOD.end())
+ {
+ LLMutexLock lock(mMutex);
+ for (U32 i = 0; i < iter->second.size(); ++i)
+ {
+ LODRequest req(mesh_params, iter->second[i]);
+ mLODReqQ.push(req);
+ }
+ }
+ mPendingLOD.erase(iter);
+ }
+
+ return true;
+}
+
+bool LLMeshRepoThread::lodReceived(const LLVolumeParams& mesh_params, S32 lod, U8* data, S32 data_size)
+{
+ LLVolume* volume = new LLVolume(mesh_params, LLVolumeLODGroup::getVolumeScaleFromDetail(lod));
+ std::string mesh_string((char*) data, data_size);
+ std::istringstream stream(mesh_string);
+
+ if (volume->unpackVolumeFaces(stream, data_size))
+ {
+ LoadedMesh mesh(volume, mesh_params, lod);
+ if (volume->getNumFaces() > 0)
+ {
+ LLMutexLock lock(mMutex);
+ mLoadedQ.push(mesh);
+ return true;
+ }
+ }
+
+ return false;
+}
+
+bool LLMeshRepoThread::skinInfoReceived(const LLUUID& mesh_id, U8* data, S32 data_size)
+{
+ LLSD skin;
+
+ if (data_size > 0)
+ {
+ std::string res_str((char*) data, data_size);
+
+ std::istringstream stream(res_str);
+
+ if (!unzip_llsd(skin, stream, data_size))
+ {
+ llwarns << "Mesh skin info parse error. Not a valid mesh asset!" << llendl;
+ return false;
+ }
+ }
+
+ {
+ LLMeshSkinInfo info(skin);
+ info.mMeshID = mesh_id;
+
+ //llinfos<<"info pelvis offset"<<info.mPelvisOffset<<llendl;
+ mSkinInfoQ.push(info);
+ }
+
+ return true;
+}
+
+bool LLMeshRepoThread::decompositionReceived(const LLUUID& mesh_id, U8* data, S32 data_size)
+{
+ LLSD decomp;
+
+ if (data_size > 0)
+ {
+ std::string res_str((char*) data, data_size);
+
+ std::istringstream stream(res_str);
+
+ if (!unzip_llsd(decomp, stream, data_size))
+ {
+ llwarns << "Mesh decomposition parse error. Not a valid mesh asset!" << llendl;
+ return false;
+ }
+ }
+
+ {
+ LLModel::Decomposition* d = new LLModel::Decomposition(decomp);
+ d->mMeshID = mesh_id;
+ mDecompositionQ.push(d);
+ }
+
+ return true;
+}
+
+bool LLMeshRepoThread::physicsShapeReceived(const LLUUID& mesh_id, U8* data, S32 data_size)
+{
+ LLSD physics_shape;
+
+ LLModel::Decomposition* d = new LLModel::Decomposition();
+ d->mMeshID = mesh_id;
+
+ if (data == NULL)
+ { //no data, no physics shape exists
+ d->mPhysicsShapeMesh.clear();
+ }
+ else
+ {
+ LLVolumeParams volume_params;
+ volume_params.setType(LL_PCODE_PROFILE_SQUARE, LL_PCODE_PATH_LINE);
+ volume_params.setSculptID(mesh_id, LL_SCULPT_TYPE_MESH);
+ LLPointer<LLVolume> volume = new LLVolume(volume_params,0);
+ std::string mesh_string((char*) data, data_size);
+ std::istringstream stream(mesh_string);
+
+ if (volume->unpackVolumeFaces(stream, data_size))
+ {
+ //load volume faces into decomposition buffer
+ S32 vertex_count = 0;
+ S32 index_count = 0;
+
+ for (S32 i = 0; i < volume->getNumVolumeFaces(); ++i)
+ {
+ const LLVolumeFace& face = volume->getVolumeFace(i);
+ vertex_count += face.mNumVertices;
+ index_count += face.mNumIndices;
+ }
+
+ d->mPhysicsShapeMesh.clear();
+
+ std::vector<LLVector3>& pos = d->mPhysicsShapeMesh.mPositions;
+ std::vector<LLVector3>& norm = d->mPhysicsShapeMesh.mNormals;
+
+ for (S32 i = 0; i < volume->getNumVolumeFaces(); ++i)
+ {
+ const LLVolumeFace& face = volume->getVolumeFace(i);
+
+ for (S32 i = 0; i < face.mNumIndices; ++i)
+ {
+ U16 idx = face.mIndices[i];
+
+ pos.push_back(LLVector3(face.mPositions[idx].getF32ptr()));
+ norm.push_back(LLVector3(face.mNormals[idx].getF32ptr()));
+ }
+ }
+ }
+ }
+
+ mDecompositionQ.push(d);
+ return true;
+}
+
+LLMeshUploadThread::LLMeshUploadThread(LLMeshUploadThread::instance_list& data, LLVector3& scale, bool upload_textures,
+ bool upload_skin, bool upload_joints)
+: LLThread("mesh upload"),
+ mDiscarded(FALSE)
+{
+ mInstanceList = data;
+ mUploadTextures = upload_textures;
+ mUploadSkin = upload_skin;
+ 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");
+ mWholeModelFeeCapability = gAgent.getRegion()->getCapability("NewFileAgentInventory");
+
+ mOrigin += gAgent.getAtAxis() * scale.magVec();
+}
+
+LLMeshUploadThread::~LLMeshUploadThread()
+{
+
+}
+
+LLMeshUploadThread::DecompRequest::DecompRequest(LLModel* mdl, LLModel* base_model, LLMeshUploadThread* thread)
+{
+ mStage = "single_hull";
+ mModel = mdl;
+ mDecompID = &mdl->mDecompID;
+ mBaseModel = base_model;
+ 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;
+ }
+ }
+
+ mThread->mFinalDecomp = this;
+ mThread->mPhysicsComplete = false;
+}
+
+void LLMeshUploadThread::DecompRequest::completed()
+{
+ if (mThread->mFinalDecomp == this)
+ {
+ mThread->mPhysicsComplete = true;
+ }
+
+ if (mHull.size() != 1)
+ {
+ llerrs << "WTF?" << llendl;
+ }
+
+ mThread->mHullMap[mBaseModel] = mHull[0];
+}
+
+//called in the main thread.
+void LLMeshUploadThread::preStart()
+{
+ //build map of LLModel refs to instances for callbacks
+ for (instance_list::iterator iter = mInstanceList.begin(); iter != mInstanceList.end(); ++iter)
+ {
+ mInstance[iter->mModel].push_back(*iter);
+ }
+}
+
+void LLMeshUploadThread::discard()
+{
+ LLMutexLock lock(mMutex) ;
+ mDiscarded = TRUE ;
+}
+
+BOOL LLMeshUploadThread::isDiscarded()
+{
+ LLMutexLock lock(mMutex) ;
+ return mDiscarded ;
+}
+
+void LLMeshUploadThread::run()
+{
+ if (gSavedSettings.getBOOL("MeshUseWholeModelUpload"))
+ {
+ doWholeModelUpload();
+ }
+ else
+ {
+ doIterativeUpload();
+ }
+}
+
+#if 1
+void dumpLLSDToFile(const LLSD& content, std::string filename)
+{
+ std::ofstream of(filename.c_str());
+ LLSDSerialize::toPrettyXML(content,of);
+}
+#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["asset_type"] = "mesh";
+ result["inventory_type"] = "object";
+ result["name"] = "your name here";
+ result["description"] = "your description here";
+
+ // TODO "optional" fields from the spec
+
+ res["mesh_list"] = LLSD::emptyArray();
+// TODO Textures
+ //res["texture_list"] = LLSD::emptyArray();
+ S32 mesh_num = 0;
+ S32 texture_num = 0;
+
+ std::set<LLViewerTexture* > textures;
+
+ for (instance_map::iterator iter = mInstance.begin(); iter != mInstance.end(); ++iter)
+ {
+ LLMeshUploadData data;
+ data.mBaseModel = iter->first;
+
+ LLModelInstance& instance = *(iter->second.begin());
+
+ for (S32 i = 0; i < 5; i++)
+ {
+ data.mModel[i] = instance.mLOD[i];
+ }
+
+ 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];
+
+ 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();
+
+ LLSD mesh_entry;
+
+ LLVector3 pos, scale;
+ LLQuaternion rot;
+ LLMatrix4 transformation = instance.mTransform;
+ decomposeMeshMatrix(transformation,pos,rot,scale);
+
+#if 0
+ mesh_entry["childpos"] = ll_sd_from_vector3(pos);
+ mesh_entry["childrot"] = ll_sd_from_quaternion(rot);
+ mesh_entry["scale"] = ll_sd_from_vector3(scale);
+#endif
+ mesh_entry["position"] = ll_sd_from_vector3(LLVector3());
+ mesh_entry["rotation"] = ll_sd_from_quaternion(rot);
+ mesh_entry["scale"] = ll_sd_from_vector3(scale);
+
+ // TODO should be binary.
+ std::string str = ostr.str();
+ mesh_entry["mesh_data"] = LLSD::Binary(str.begin(),str.end());
+
+ res["mesh_list"][mesh_num] = mesh_entry;
+
+ // 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)
+ {
+
+ if (textures.find(material_iter->mDiffuseMap.get()) == textures.end())
+ {
+ textures.insert(material_iter->mDiffuseMap.get());
+
+ 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());
+ }
+
+ LLPointer<LLImageJ2C> upload_file =
+ LLViewerTextureList::convertToUploadFile(data.mTexture->getRawImage());
+ ostr.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;
+ texture_num++;
+ }
+ }
+ }
+
+ mesh_num++;
+ }
+
+ result["asset_resources"] = res;
+#if 1
+ dumpLLSDToFile(result,"whole_model.xml");
+#endif
+
+ dest = result;
+}
+
+void LLMeshUploadThread::doWholeModelUpload()
+{
+ 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;
+
+ LLModelInstance& instance = *(iter->second.begin());
+
+ for (S32 i = 0; i < 5; i++)
+ {
+ data.mModel[i] = instance.mLOD[i];
+ }
+
+ //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 (!physics)
+ {
+ llerrs << "WTF?" << llendl;
+ }
+
+ DecompRequest* request = new DecompRequest(physics, data.mBaseModel, this);
+ gMeshRepo.mDecompThread->submitRequest(request);
+ }
+
+ while (!mPhysicsComplete)
+ {
+ apr_sleep(100);
+ }
+
+ bool do_include_textures = false; // not needed for initial cost/validation check.
+ LLSD model_data;
+ wholeModelToLLSD(model_data, do_include_textures);
+
+ mPendingUploads++;
+ LLCurlRequest::headers_t headers;
+ mCurlRequest->post(mWholeModelFeeCapability, headers, model_data,
+ new LLWholeModelFeeResponder(this));
+
+ do
+ {
+ mCurlRequest->process();
+ } while (mCurlRequest->getQueued() > 0);
+
+ mCurlRequest->post(mWholeModelUploadURL, headers, model_data["asset_resources"], new LLWholeModelUploadResponder(this));
+
+ do
+ {
+ mCurlRequest->process();
+ } while (mCurlRequest->getQueued() > 0);
+
+ delete mCurlRequest;
+ mCurlRequest = NULL;
+
+ // Currently a no-op.
+ mFinished = true;
+}
+
+void LLMeshUploadThread::doIterativeUpload()
+{
+ 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());
+
+ 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)
+ {
+
+ 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);
+ }
+ }
+ }
+
+ //queue up models for hull generation
+ DecompRequest* request = new DecompRequest(data.mModel[LLModel::LOD_HIGH], data.mBaseModel, this);
+ gMeshRepo.mDecompThread->submitRequest(request);
+ }
+
+ while (!mPhysicsComplete)
+ {
+ apr_sleep(100);
+ }
+
+ //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);
+
+ 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);
+}
+
+
+static LLFastTimer::DeclareTimer FTM_NOTIFY_MESH_LOADED("Notify Loaded");
+static LLFastTimer::DeclareTimer FTM_NOTIFY_MESH_UNAVAILABLE("Notify Unavailable");
+
+void LLMeshRepoThread::notifyLoadedMeshes()
+{
+ while (!mLoadedQ.empty())
+ {
+ mMutex->lock();
+ LoadedMesh mesh = mLoadedQ.front();
+ mLoadedQ.pop();
+ mMutex->unlock();
+
+ if (mesh.mVolume && mesh.mVolume->getNumVolumeFaces() > 0)
+ {
+ gMeshRepo.notifyMeshLoaded(mesh.mMeshParams, mesh.mVolume);
+ }
+ else
+ {
+ gMeshRepo.notifyMeshUnavailable(mesh.mMeshParams,
+ LLVolumeLODGroup::getVolumeDetailFromScale(mesh.mVolume->getDetail()));
+ }
+ }
+
+ while (!mUnavailableQ.empty())
+ {
+ mMutex->lock();
+ LODRequest req = mUnavailableQ.front();
+ mUnavailableQ.pop();
+ mMutex->unlock();
+
+ gMeshRepo.notifyMeshUnavailable(req.mMeshParams, req.mLOD);
+ }
+
+ while (!mSkinInfoQ.empty())
+ {
+ gMeshRepo.notifySkinInfoReceived(mSkinInfoQ.front());
+ mSkinInfoQ.pop();
+ }
+
+ while (!mDecompositionQ.empty())
+ {
+ gMeshRepo.notifyDecompositionReceived(mDecompositionQ.front());
+ mDecompositionQ.pop();
+ }
+}
+
+S32 LLMeshRepoThread::getActualMeshLOD(const LLVolumeParams& mesh_params, S32 lod)
+{ //only ever called from main thread
+ LLMutexLock lock(mHeaderMutex);
+ mesh_header_map::iterator iter = mMeshHeader.find(mesh_params.getSculptID());
+
+ if (iter != mMeshHeader.end())
+ {
+ LLSD& header = iter->second;
+
+ return LLMeshRepository::getActualMeshLOD(header, lod);
+ }
+
+ return lod;
+}
+
+//static
+S32 LLMeshRepository::getActualMeshLOD(LLSD& header, S32 lod)
+{
+ lod = llclamp(lod, 0, 3);
+
+ if (header.has("404"))
+ {
+ return -1;
+ }
+
+ if (header[header_lod[lod]]["size"].asInteger() > 0)
+ {
+ return lod;
+ }
+
+ //search down to find the next available lower lod
+ for (S32 i = lod-1; i >= 0; --i)
+ {
+ if (header[header_lod[i]]["size"].asInteger() > 0)
+ {
+ return i;
+ }
+ }
+
+ //search up to find then ext available higher lod
+ for (S32 i = lod+1; i < 4; ++i)
+ {
+ if (header[header_lod[i]]["size"].asInteger() > 0)
+ {
+ return i;
+ }
+ }
+
+ //header exists and no good lod found, treat as 404
+ header["404"] = 1;
+ 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;
+
+ // we cache the mesh for default parameters
+ LLVolumeParams volume_params;
+ volume_params.setType(LL_PCODE_PROFILE_SQUARE, LL_PCODE_PATH_LINE);
+ volume_params.setSculptID(data.mUUID, LL_SCULPT_TYPE_MESH);
+
+ for (U32 i = 0; i < 4; i++)
+ {
+ if (data.mModel[i].notNull())
+ {
+ LLPointer<LLVolume> volume = new LLVolume(volume_params, LLVolumeLODGroup::getVolumeScaleFromDetail(i));
+ volume->copyVolumeFaces(data.mModel[i]);
+ }
+ }
+
+}
+
+void LLMeshLODResponder::completedRaw(U32 status, const std::string& reason,
+ const LLChannelDescriptors& channels,
+ const LLIOPipe::buffer_ptr_t& buffer)
+{
+
+ LLMeshRepoThread::sActiveLODRequests--;
+ S32 data_size = buffer->countAfter(channels.in(), NULL);
+
+ if (status < 200 || status > 400)
+ {
+ llwarns << status << ": " << reason << llendl;
+ }
+
+ if (data_size < mRequestedBytes)
+ {
+ if (status == 499 || status == 503)
+ { //timeout or service unavailable, try again
+ LLMeshRepository::sHTTPRetryCount++;
+ gMeshRepo.mThread->loadMeshLOD(mMeshParams, mLOD);
+ }
+ else
+ {
+ llwarns << "Unhandled status " << status << llendl;
+ }
+ return;
+ }
+
+ LLMeshRepository::sBytesReceived += mRequestedBytes;
+
+ U8* data = NULL;
+
+ if (data_size > 0)
+ {
+ data = new U8[data_size];
+ buffer->readAfter(channels.in(), NULL, data, data_size);
+ }
+
+ if (gMeshRepo.mThread->lodReceived(mMeshParams, mLOD, data, data_size))
+ {
+ //good fetch from sim, write to VFS for caching
+ LLVFile file(gVFS, mMeshParams.getSculptID(), LLAssetType::AT_MESH, LLVFile::WRITE);
+
+ S32 offset = mOffset;
+ S32 size = mRequestedBytes;
+
+ if (file.getSize() >= offset+size)
+ {
+ file.seek(offset);
+ file.write(data, size);
+ LLMeshRepository::sCacheBytesWritten += size;
+ }
+ }
+
+ delete [] data;
+}
+
+void LLMeshSkinInfoResponder::completedRaw(U32 status, const std::string& reason,
+ const LLChannelDescriptors& channels,
+ const LLIOPipe::buffer_ptr_t& buffer)
+{
+ S32 data_size = buffer->countAfter(channels.in(), NULL);
+
+ if (status < 200 || status > 400)
+ {
+ llwarns << status << ": " << reason << llendl;
+ }
+
+ if (data_size < mRequestedBytes)
+ {
+ if (status == 499 || status == 503)
+ { //timeout or service unavailable, try again
+ LLMeshRepository::sHTTPRetryCount++;
+ gMeshRepo.mThread->loadMeshSkinInfo(mMeshID);
+ }
+ else
+ {
+ llwarns << "Unhandled status " << status << llendl;
+ }
+ return;
+ }
+
+ LLMeshRepository::sBytesReceived += mRequestedBytes;
+
+ U8* data = NULL;
+
+ if (data_size > 0)
+ {
+ data = new U8[data_size];
+ buffer->readAfter(channels.in(), NULL, data, data_size);
+ }
+
+ if (gMeshRepo.mThread->skinInfoReceived(mMeshID, data, data_size))
+ {
+ //good fetch from sim, write to VFS for caching
+ LLVFile file(gVFS, mMeshID, LLAssetType::AT_MESH, LLVFile::WRITE);
+
+ S32 offset = mOffset;
+ S32 size = mRequestedBytes;
+
+ if (file.getSize() >= offset+size)
+ {
+ LLMeshRepository::sCacheBytesWritten += size;
+ file.seek(offset);
+ file.write(data, size);
+ }
+ }
+
+ delete [] data;
+}
+
+void LLMeshDecompositionResponder::completedRaw(U32 status, const std::string& reason,
+ const LLChannelDescriptors& channels,
+ const LLIOPipe::buffer_ptr_t& buffer)
+{
+ S32 data_size = buffer->countAfter(channels.in(), NULL);
+
+ if (status < 200 || status > 400)
+ {
+ llwarns << status << ": " << reason << llendl;
+ }
+
+ if (data_size < mRequestedBytes)
+ {
+ if (status == 499 || status == 503)
+ { //timeout or service unavailable, try again
+ LLMeshRepository::sHTTPRetryCount++;
+ gMeshRepo.mThread->loadMeshDecomposition(mMeshID);
+ }
+ else
+ {
+ llwarns << "Unhandled status " << status << llendl;
+ }
+ return;
+ }
+
+ LLMeshRepository::sBytesReceived += mRequestedBytes;
+
+ U8* data = NULL;
+
+ if (data_size > 0)
+ {
+ data = new U8[data_size];
+ buffer->readAfter(channels.in(), NULL, data, data_size);
+ }
+
+ if (gMeshRepo.mThread->decompositionReceived(mMeshID, data, data_size))
+ {
+ //good fetch from sim, write to VFS for caching
+ LLVFile file(gVFS, mMeshID, LLAssetType::AT_MESH, LLVFile::WRITE);
+
+ S32 offset = mOffset;
+ S32 size = mRequestedBytes;
+
+ if (file.getSize() >= offset+size)
+ {
+ LLMeshRepository::sCacheBytesWritten += size;
+ file.seek(offset);
+ file.write(data, size);
+ }
+ }
+
+ delete [] data;
+}
+
+void LLMeshPhysicsShapeResponder::completedRaw(U32 status, const std::string& reason,
+ const LLChannelDescriptors& channels,
+ const LLIOPipe::buffer_ptr_t& buffer)
+{
+ S32 data_size = buffer->countAfter(channels.in(), NULL);
+
+ if (status < 200 || status > 400)
+ {
+ llwarns << status << ": " << reason << llendl;
+ }
+
+ if (data_size < mRequestedBytes)
+ {
+ if (status == 499 || status == 503)
+ { //timeout or service unavailable, try again
+ LLMeshRepository::sHTTPRetryCount++;
+ gMeshRepo.mThread->loadMeshPhysicsShape(mMeshID);
+ }
+ else
+ {
+ llwarns << "Unhandled status " << status << llendl;
+ }
+ return;
+ }
+
+ LLMeshRepository::sBytesReceived += mRequestedBytes;
+
+ U8* data = NULL;
+
+ if (data_size > 0)
+ {
+ data = new U8[data_size];
+ buffer->readAfter(channels.in(), NULL, data, data_size);
+ }
+
+ if (gMeshRepo.mThread->physicsShapeReceived(mMeshID, data, data_size))
+ {
+ //good fetch from sim, write to VFS for caching
+ LLVFile file(gVFS, mMeshID, LLAssetType::AT_MESH, LLVFile::WRITE);
+
+ S32 offset = mOffset;
+ S32 size = mRequestedBytes;
+
+ if (file.getSize() >= offset+size)
+ {
+ LLMeshRepository::sCacheBytesWritten += size;
+ file.seek(offset);
+ file.write(data, size);
+ }
+ }
+
+ delete [] data;
+}
+
+void LLMeshHeaderResponder::completedRaw(U32 status, const std::string& reason,
+ const LLChannelDescriptors& channels,
+ const LLIOPipe::buffer_ptr_t& buffer)
+{
+ LLMeshRepoThread::sActiveHeaderRequests--;
+ if (status < 200 || status > 400)
+ {
+ //llwarns
+ // << "Header responder failed with status: "
+ // << status << ": " << reason << llendl;
+
+ // 503 (service unavailable) or 499 (timeout)
+ // can be due to server load and can be retried
+
+ // TODO*: Add maximum retry logic, exponential backoff
+ // and (somewhat more optional than the others) retries
+ // again after some set period of time
+ if (status == 503 || status == 499)
+ { //retry
+ LLMeshRepository::sHTTPRetryCount++;
+ LLMeshRepoThread::HeaderRequest req(mMeshParams);
+ LLMutexLock lock(gMeshRepo.mThread->mMutex);
+ gMeshRepo.mThread->mHeaderReqQ.push(req);
+
+ return;
+ }
+ }
+
+ S32 data_size = buffer->countAfter(channels.in(), NULL);
+
+ U8* data = NULL;
+
+ if (data_size > 0)
+ {
+ data = new U8[data_size];
+ buffer->readAfter(channels.in(), NULL, data, data_size);
+ }
+
+ LLMeshRepository::sBytesReceived += llmin(data_size, 4096);
+
+ if (!gMeshRepo.mThread->headerReceived(mMeshParams, data, data_size))
+ {
+ llwarns
+ << "Unable to parse mesh header: "
+ << status << ": " << reason << llendl;
+ }
+ else if (data && data_size > 0)
+ {
+ //header was successfully retrieved from sim, cache in vfs
+ LLUUID mesh_id = mMeshParams.getSculptID();
+ LLSD header = gMeshRepo.mThread->mMeshHeader[mesh_id];
+
+ std::stringstream str;
+
+ 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());
+
+ 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);
+
+ 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);
+
+ //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();
+
+ if (remaining < 0 || remaining > 4096)
+ {
+ llerrs << "Bad padding of mesh asset cache entry." << llendl;
+ }
+
+ if (remaining > 0)
+ {
+ file.write(block, remaining);
+ }
+ }
+ }
+
+ delete [] data;
+}
+
+
+LLMeshRepository::LLMeshRepository()
+: mMeshMutex(NULL),
+ mMeshThreadCount(0),
+ mThread(NULL)
+{
+
+}
+
+void LLMeshRepository::init()
+{
+ mMeshMutex = new LLMutex(NULL);
+
+ LLConvexDecomposition::getInstance()->initSystem();
+
+ mDecompThread = new LLPhysicsDecomp();
+ mDecompThread->start();
+
+ while (!mDecompThread->mInited)
+ { //wait for physics decomp thread to init
+ apr_sleep(100);
+ }
+
+
+
+ mThread = new LLMeshRepoThread();
+ mThread->start();
+}
+
+void LLMeshRepository::shutdown()
+{
+ llinfos << "Shutting down mesh repository." << llendl;
+
+ for (U32 i = 0; i < mUploads.size(); ++i)
+ {
+ llinfos << "Discard the pending mesh uploads " << llendl;
+ mUploads[i]->discard() ; //discard the uploading requests.
+ }
+
+ mThread->mSignal->signal();
+
+ while (!mThread->isStopped())
+ {
+ apr_sleep(10);
+ }
+ delete mThread;
+ mThread = NULL;
+
+ for (U32 i = 0; i < mUploads.size(); ++i)
+ {
+ llinfos << "Waiting for pending mesh upload " << i << "/" << mUploads.size() << llendl;
+ while (!mUploads[i]->isStopped())
+ {
+ apr_sleep(10);
+ }
+ delete mUploads[i];
+ }
+
+ mUploads.clear();
+
+ delete mMeshMutex;
+ mMeshMutex = NULL;
+
+ llinfos << "Shutting down decomposition system." << llendl;
+
+ if (mDecompThread)
+ {
+ mDecompThread->shutdown();
+ delete mDecompThread;
+ mDecompThread = NULL;
+ }
+
+ LLConvexDecomposition::quitSystem();
+}
+
+//called in the main thread.
+S32 LLMeshRepository::update()
+{
+ if(mUploadWaitList.empty())
+ {
+ return 0 ;
+ }
+
+ S32 size = mUploadWaitList.size() ;
+ for (S32 i = 0; i < size; ++i)
+ {
+ mUploads.push_back(mUploadWaitList[i]);
+ mUploadWaitList[i]->preStart() ;
+ mUploadWaitList[i]->start() ;
+ }
+ mUploadWaitList.clear() ;
+
+ return size ;
+}
+
+S32 LLMeshRepository::loadMesh(LLVOVolume* vobj, const LLVolumeParams& mesh_params, S32 detail, S32 last_lod)
+{
+ if (detail < 0 || detail > 4)
+ {
+ return detail;
+ }
+
+ LLFastTimer t(FTM_LOAD_MESH);
+
+ {
+ LLMutexLock lock(mMeshMutex);
+ //add volume to list of loading meshes
+ mesh_load_map::iterator iter = mLoadingMeshes[detail].find(mesh_params);
+ if (iter != mLoadingMeshes[detail].end())
+ { //request pending for this mesh, append volume id to list
+ iter->second.insert(vobj->getID());
+ }
+ else
+ {
+ //first request for this mesh
+ mLoadingMeshes[detail][mesh_params].insert(vobj->getID());
+ mPendingRequests.push_back(LLMeshRepoThread::LODRequest(mesh_params, detail));
+ }
+ }
+
+ //do a quick search to see if we can't display something while we wait for this mesh to load
+ LLVolume* volume = vobj->getVolume();
+
+ if (volume)
+ {
+ if (volume->getNumVolumeFaces() == 0 && !volume->isTetrahedron())
+ {
+ volume->makeTetrahedron();
+ }
+
+ LLVolumeParams params = volume->getParams();
+
+ LLVolumeLODGroup* group = LLPrimitive::getVolumeManager()->getGroup(params);
+
+ if (group)
+ {
+ //first, see if last_lod is available (don't transition down to avoid funny popping a la SH-641)
+ if (last_lod >= 0)
+ {
+ LLVolume* lod = group->refLOD(last_lod);
+ if (lod && !lod->isTetrahedron() && lod->getNumVolumeFaces() > 0)
+ {
+ group->derefLOD(lod);
+ return last_lod;
+ }
+ group->derefLOD(lod);
+ }
+
+ //next, see what the next lowest LOD available might be
+ for (S32 i = detail-1; i >= 0; --i)
+ {
+ LLVolume* lod = group->refLOD(i);
+ if (lod && !lod->isTetrahedron() && lod->getNumVolumeFaces() > 0)
+ {
+ group->derefLOD(lod);
+ return i;
+ }
+
+ group->derefLOD(lod);
+ }
+
+ //no lower LOD is a available, is a higher lod available?
+ for (S32 i = detail+1; i < 4; ++i)
+ {
+ LLVolume* lod = group->refLOD(i);
+ if (lod && !lod->isTetrahedron() && lod->getNumVolumeFaces() > 0)
+ {
+ group->derefLOD(lod);
+ return i;
+ }
+
+ 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
+
+ LLMeshRepoThread::sMaxConcurrentRequests = gSavedSettings.getU32("MeshMaxConcurrentRequests");
+
+ //clean up completed upload threads
+ for (std::vector<LLMeshUploadThread*>::iterator iter = mUploads.begin(); iter != mUploads.end(); )
+ {
+ LLMeshUploadThread* thread = *iter;
+
+ if (thread->isStopped() && thread->finished())
+ {
+ iter = mUploads.erase(iter);
+ delete thread;
+ }
+ else
+ {
+ ++iter;
+ }
+ }
+
+ //update inventory
+ if (!mInventoryQ.empty())
+ {
+ LLMutexLock lock(mMeshMutex);
+ while (!mInventoryQ.empty())
+ {
+ inventory_data& data = mInventoryQ.front();
+
+ LLAssetType::EType asset_type = LLAssetType::lookup(data.mPostData["asset_type"].asString());
+ LLInventoryType::EType inventory_type = LLInventoryType::lookup(data.mPostData["inventory_type"].asString());
+
+ on_new_single_inventory_upload_complete(
+ asset_type,
+ inventory_type,
+ data.mPostData["asset_type"].asString(),
+ data.mPostData["folder_id"].asUUID(),
+ data.mPostData["name"],
+ data.mPostData["description"],
+ data.mResponse,
+ 0);
+
+ mInventoryQ.pop();
+ }
+ }
+
+ //call completed callbacks on finished decompositions
+ mDecompThread->notifyCompleted();
+
+ if (!mThread->mWaiting)
+ { //curl thread is churning, wait for it to go idle
+ return;
+ }
+
+ static std::string region_name("never name a region this");
+
+ if (gAgent.getRegion())
+ { //update capability url
+ 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();
+ }
+
+ //popup queued error messages from background threads
+ while (!mUploadErrorQ.empty())
+ {
+ LLNotificationsUtil::add("MeshUploadError", mUploadErrorQ.front());
+ mUploadErrorQ.pop();
+ }
+
+ S32 push_count = LLMeshRepoThread::sMaxConcurrentRequests-(LLMeshRepoThread::sActiveHeaderRequests+LLMeshRepoThread::sActiveLODRequests);
+
+ if (push_count > 0)
+ {
+ //calculate "score" for pending requests
+
+ //create score map
+ std::map<LLUUID, F32> score_map;
+
+ for (U32 i = 0; i < 4; ++i)
+ {
+ for (mesh_load_map::iterator iter = mLoadingMeshes[i].begin(); iter != mLoadingMeshes[i].end(); ++iter)
+ {
+ F32 max_score = 0.f;
+ for (std::set<LLUUID>::iterator obj_iter = iter->second.begin(); obj_iter != iter->second.end(); ++obj_iter)
+ {
+ LLViewerObject* object = gObjectList.findObject(*obj_iter);
+
+ if (object)
+ {
+ LLDrawable* drawable = object->mDrawable;
+ if (drawable)
+ {
+ F32 cur_score = drawable->getRadius()/llmax(drawable->mDistanceWRTCamera, 1.f);
+ max_score = llmax(max_score, cur_score);
+ }
+ }
+ }
+
+ score_map[iter->first.getSculptID()] = max_score;
+ }
+ }
+
+ //set "score" for pending requests
+ for (std::vector<LLMeshRepoThread::LODRequest>::iterator iter = mPendingRequests.begin(); iter != mPendingRequests.end(); ++iter)
+ {
+ iter->mScore = score_map[iter->mMeshParams.getSculptID()];
+ }
+
+ //sort by "score"
+ std::sort(mPendingRequests.begin(), mPendingRequests.end(), LLMeshRepoThread::CompareScoreGreater());
+
+ 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());
+ push_count--;
+ }
+ }
+
+ //send skin info requests
+ while (!mPendingSkinRequests.empty())
+ {
+ mThread->loadMeshSkinInfo(mPendingSkinRequests.front());
+ mPendingSkinRequests.pop();
+ }
+
+ //send decomposition requests
+ while (!mPendingDecompositionRequests.empty())
+ {
+ mThread->loadMeshDecomposition(mPendingDecompositionRequests.front());
+ mPendingDecompositionRequests.pop();
+ }
+
+ //send physics shapes decomposition requests
+ while (!mPendingPhysicsShapeRequests.empty())
+ {
+ mThread->loadMeshPhysicsShape(mPendingPhysicsShapeRequests.front());
+ mPendingPhysicsShapeRequests.pop();
+ }
+
+ mThread->notifyLoadedMeshes();
+
+ mThread->mMutex->unlock();
+ mMeshMutex->unlock();
+
+ mThread->mSignal->signal();
+}
+
+void LLMeshRepository::notifySkinInfoReceived(LLMeshSkinInfo& info)
+{
+ mSkinMap[info.mMeshID] = info;
+ mLoadingSkins.erase(info.mMeshID);
+}
+
+void LLMeshRepository::notifyDecompositionReceived(LLModel::Decomposition* decomp)
+{
+ decomposition_map::iterator iter = mDecompositionMap.find(decomp->mMeshID);
+ if (iter == mDecompositionMap.end())
+ { //just insert decomp into map
+ mDecompositionMap[decomp->mMeshID] = decomp;
+ }
+ else
+ { //merge decomp with existing entry
+ iter->second->merge(decomp);
+ delete decomp;
+ }
+
+ mLoadingDecompositions.erase(decomp->mMeshID);
+}
+
+void LLMeshRepository::notifyMeshLoaded(const LLVolumeParams& mesh_params, LLVolume* volume)
+{ //called from main thread
+ S32 detail = LLVolumeLODGroup::getVolumeDetailFromScale(volume->getDetail());
+
+ //get list of objects waiting to be notified this mesh is loaded
+ mesh_load_map::iterator obj_iter = mLoadingMeshes[detail].find(mesh_params);
+
+ if (volume && obj_iter != mLoadingMeshes[detail].end())
+ {
+ //make sure target volume is still valid
+ if (volume->getNumVolumeFaces() <= 0)
+ {
+ llwarns << "Mesh loading returned empty volume." << llendl;
+ volume->makeTetrahedron();
+ }
+
+ { //update system volume
+ LLVolume* sys_volume = LLPrimitive::getVolumeManager()->refVolume(mesh_params, detail);
+ if (sys_volume)
+ {
+ sys_volume->copyVolumeFaces(volume);
+ LLPrimitive::getVolumeManager()->unrefVolume(sys_volume);
+ }
+ else
+ {
+ llwarns << "Couldn't find system volume for given mesh." << llendl;
+ }
+ }
+
+ //notify waiting LLVOVolume instances that their requested mesh is available
+ for (std::set<LLUUID>::iterator vobj_iter = obj_iter->second.begin(); vobj_iter != obj_iter->second.end(); ++vobj_iter)
+ {
+ LLVOVolume* vobj = (LLVOVolume*) gObjectList.findObject(*vobj_iter);
+ if (vobj)
+ {
+ vobj->notifyMeshLoaded();
+ }
+ }
+
+ mLoadingMeshes[detail].erase(mesh_params);
+ }
+}
+
+void LLMeshRepository::notifyMeshUnavailable(const LLVolumeParams& mesh_params, S32 lod)
+{ //called from main thread
+ //get list of objects waiting to be notified this mesh is loaded
+ mesh_load_map::iterator obj_iter = mLoadingMeshes[lod].find(mesh_params);
+
+ F32 detail = LLVolumeLODGroup::getVolumeScaleFromDetail(lod);
+
+ if (obj_iter != mLoadingMeshes[lod].end())
+ {
+ for (std::set<LLUUID>::iterator vobj_iter = obj_iter->second.begin(); vobj_iter != obj_iter->second.end(); ++vobj_iter)
+ {
+ LLVOVolume* vobj = (LLVOVolume*) gObjectList.findObject(*vobj_iter);
+ if (vobj)
+ {
+ LLVolume* obj_volume = vobj->getVolume();
+
+ if (obj_volume &&
+ obj_volume->getDetail() == detail &&
+ obj_volume->getParams() == mesh_params)
+ { //should force volume to find most appropriate LOD
+ vobj->setVolume(obj_volume->getParams(), lod);
+ }
+ }
+ }
+
+ mLoadingMeshes[lod].erase(mesh_params);
+ }
+}
+
+S32 LLMeshRepository::getActualMeshLOD(const LLVolumeParams& mesh_params, S32 lod)
+{
+ 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)
+{
+ if (mesh_id.notNull())
+ {
+ skin_map::iterator iter = mSkinMap.find(mesh_id);
+ if (iter != mSkinMap.end())
+ {
+ return &(iter->second);
+ }
+
+ //no skin info known about given mesh, try to fetch it
+ {
+ LLMutexLock lock(mMeshMutex);
+ //add volume to list of loading meshes
+ std::set<LLUUID>::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);
+ }
+ }
+ }
+
+ return NULL;
+}
+
+void LLMeshRepository::fetchPhysicsShape(const LLUUID& mesh_id)
+{
+ if (mesh_id.notNull())
+ {
+ LLModel::Decomposition* decomp = NULL;
+ decomposition_map::iterator iter = mDecompositionMap.find(mesh_id);
+ if (iter != mDecompositionMap.end())
+ {
+ decomp = iter->second;
+ }
+
+ //decomposition block hasn't been fetched yet
+ if (!decomp || decomp->mPhysicsShapeMesh.empty())
+ {
+ LLMutexLock lock(mMeshMutex);
+ //add volume to list of loading meshes
+ std::set<LLUUID>::iterator iter = mLoadingPhysicsShapes.find(mesh_id);
+ if (iter == mLoadingPhysicsShapes.end())
+ { //no request pending for this skin info
+ mLoadingPhysicsShapes.insert(mesh_id);
+ mPendingPhysicsShapeRequests.push(mesh_id);
+ }
+ }
+ }
+
+}
+
+LLModel::Decomposition* LLMeshRepository::getDecomposition(const LLUUID& mesh_id)
+{
+ LLModel::Decomposition* ret = NULL;
+
+ if (mesh_id.notNull())
+ {
+ decomposition_map::iterator iter = mDecompositionMap.find(mesh_id);
+ if (iter != mDecompositionMap.end())
+ {
+ ret = iter->second;
+ }
+
+ //decomposition block hasn't been fetched yet
+ if (!ret || ret->mBaseHullMesh.empty())
+ {
+ LLMutexLock lock(mMeshMutex);
+ //add volume to list of loading meshes
+ std::set<LLUUID>::iterator iter = mLoadingDecompositions.find(mesh_id);
+ if (iter == mLoadingDecompositions.end())
+ { //no request pending for this skin info
+ mLoadingDecompositions.insert(mesh_id);
+ mPendingDecompositionRequests.push(mesh_id);
+ }
+ }
+ }
+
+ return ret;
+}
+
+void LLMeshRepository::buildHull(const LLVolumeParams& params, S32 detail)
+{
+ LLVolume* volume = LLPrimitive::sVolumeManager->refVolume(params, detail);
+
+ if (!volume->mHullPoints)
+ {
+ //all default params
+ //execute first stage
+ //set simplify mode to retain
+ //set retain percentage to zero
+ //run second stage
+ }
+
+ LLPrimitive::sVolumeManager->unrefVolume(volume);
+}
+
+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);
+}
+
+LLSD& LLMeshRepository::getMeshHeader(const LLUUID& mesh_id)
+{
+ return mThread->getMeshHeader(mesh_id);
+}
+
+LLSD& LLMeshRepoThread::getMeshHeader(const LLUUID& mesh_id)
+{
+ static LLSD dummy_ret;
+ if (mesh_id.notNull())
+ {
+ LLMutexLock lock(mHeaderMutex);
+ mesh_header_map::iterator iter = mMeshHeader.find(mesh_id);
+ if (iter != mMeshHeader.end())
+ {
+ return iter->second;
+ }
+ }
+
+ return dummy_ret;
+}
+
+
+void LLMeshRepository::uploadModel(std::vector<LLModelInstance>& data, LLVector3& scale, bool upload_textures,
+ bool upload_skin, bool upload_joints)
+{
+ LLMeshUploadThread* thread = new LLMeshUploadThread(data, scale, upload_textures, upload_skin, upload_joints);
+ mUploadWaitList.push_back(thread);
+}
+
+S32 LLMeshRepository::getMeshSize(const LLUUID& mesh_id, S32 lod)
+{
+ if (mThread)
+ {
+ LLMeshRepoThread::mesh_header_map::iterator iter = mThread->mMeshHeader.find(mesh_id);
+ if (iter != mThread->mMeshHeader.end())
+ {
+ LLSD& header = iter->second;
+
+ if (header.has("404"))
+ {
+ return -1;
+ }
+
+ S32 size = header[header_lod[lod]]["size"].asInteger();
+ return size;
+ }
+
+ }
+
+ return -1;
+
+}
+
+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,
+ LLVector3& result_scale)
+{
+ // 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]);
+
+ result_pos = position + mOrigin;
+ result_scale = scale;
+ 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)
+ {
+ return mDiffuseMap < rhs.mDiffuseMap;
+ }
+
+ if (mDiffuseMapFilename != rhs.mDiffuseMapFilename)
+ {
+ return mDiffuseMapFilename < rhs.mDiffuseMapFilename;
+ }
+
+ if (mDiffuseMapLabel != rhs.mDiffuseMapLabel)
+ {
+ return mDiffuseMapLabel < rhs.mDiffuseMapLabel;
+ }
+
+ if (mDiffuseColor != rhs.mDiffuseColor)
+ {
+ return mDiffuseColor < rhs.mDiffuseColor;
+ }
+
+ return mFullbright < rhs.mFullbright;
+}
+
+
+void LLMeshRepository::updateInventory(inventory_data data)
+{
+ LLMutexLock lock(mMeshMutex);
+ mInventoryQ.push(data);
+}
+
+void LLMeshRepository::uploadError(LLSD& args)
+{
+ LLMutexLock lock(mMeshMutex);
+ mUploadErrorQ.push(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;
+
+ 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();
+ }
+ }
+
+ if (bytes_high == 0.f)
+ {
+ return 0.f;
+ }
+
+ if (bytes_mid == 0.f)
+ {
+ bytes_mid = bytes_high;
+ }
+
+ if (bytes_low == 0.f)
+ {
+ bytes_low = bytes_mid;
+ }
+
+ if (bytes_lowest == 0.f)
+ {
+ bytes_lowest = bytes_low;
+ }
+
+ F32 max_area = 65536.f;
+ F32 min_area = 1.f;
+
+ F32 high_area = llmin(F_PI*dmid*dmid, max_area);
+ F32 mid_area = llmin(F_PI*dlow*dlow, max_area);
+ F32 low_area = llmin(F_PI*dlowest*dlowest, max_area);
+ F32 lowest_area = max_area;
+
+ lowest_area -= low_area;
+ low_area -= mid_area;
+ mid_area -= high_area;
+
+ high_area = llclamp(high_area, min_area, max_area);
+ mid_area = llclamp(mid_area, min_area, max_area);
+ low_area = llclamp(low_area, min_area, max_area);
+ lowest_area = llclamp(lowest_area, min_area, max_area);
+
+ F32 total_area = high_area + mid_area + low_area + lowest_area;
+ high_area /= total_area;
+ mid_area /= total_area;
+ 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;
+
+ return weighted_avg * gSavedSettings.getF32("MeshStreamingCostScaler");
+}
+
+
+LLPhysicsDecomp::LLPhysicsDecomp()
+: LLThread("Physics Decomp")
+{
+ mInited = false;
+ mQuitting = false;
+ mDone = false;
+
+ mSignal = new LLCondition(NULL);
+ mMutex = new LLMutex(NULL);
+}
+
+LLPhysicsDecomp::~LLPhysicsDecomp()
+{
+ shutdown();
+
+ delete mSignal;
+ mSignal = NULL;
+ delete mMutex;
+ mMutex = NULL;
+}
+
+void LLPhysicsDecomp::shutdown()
+{
+ if (mSignal)
+ {
+ mQuitting = true;
+ mSignal->signal();
+
+ while (!isStopped())
+ {
+ apr_sleep(10);
+ }
+ }
+}
+
+void LLPhysicsDecomp::submitRequest(LLPhysicsDecomp::Request* request)
+{
+ LLMutexLock lock(mMutex);
+ mRequestQ.push(request);
+ mSignal->signal();
+}
+
+//static
+S32 LLPhysicsDecomp::llcdCallback(const char* status, S32 p1, S32 p2)
+{
+ if (gMeshRepo.mDecompThread && gMeshRepo.mDecompThread->mCurRequest.notNull())
+ {
+ return gMeshRepo.mDecompThread->mCurRequest->statusCallback(status, p1, p2);
+ }
+
+ return 1;
+}
+
+void LLPhysicsDecomp::setMeshData(LLCDMeshData& mesh)
+{
+ 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)
+ {
+ ret = LLConvexDecomposition::getInstance()->setMeshData(&mesh);
+ }
+
+ if (ret)
+ {
+ llerrs << "Convex Decomposition thread valid but could not set mesh data" << llendl;
+ }
+}
+
+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);
+ }
+
+ //build parameter map
+ std::map<std::string, const LLCDParam*> param_map;
+
+ static const LLCDParam* params = NULL;
+ static S32 param_count = 0;
+ if (!params)
+ {
+ param_count = LLConvexDecomposition::getInstance()->getParameters(&params);
+ }
+
+ for (S32 i = 0; i < param_count; ++i)
+ {
+ param_map[params[i].mName] = params+i;
+ }
+
+ //set parameter values
+ for (decomp_params::iterator iter = mCurRequest->mParams.begin(); iter != mCurRequest->mParams.end(); ++iter)
+ {
+ const std::string& name = iter->first;
+ const LLSD& value = iter->second;
+
+ const LLCDParam* param = param_map[name];
+
+ if (param == NULL)
+ { //couldn't find valid parameter
+ continue;
+ }
+
+ U32 ret = LLCD_OK;
+
+ if (param->mType == LLCDParam::LLCD_FLOAT)
+ {
+ ret = LLConvexDecomposition::getInstance()->setParam(param->mName, (F32) value.asReal());
+ }
+ else if (param->mType == LLCDParam::LLCD_INTEGER ||
+ param->mType == LLCDParam::LLCD_ENUM)
+ {
+ ret = LLConvexDecomposition::getInstance()->setParam(param->mName, value.asInteger());
+ }
+ else if (param->mType == LLCDParam::LLCD_BOOLEAN)
+ {
+ ret = LLConvexDecomposition::getInstance()->setParam(param->mName, value.asBoolean());
+ }
+
+ if (ret)
+ {
+ llerrs << "WTF?" << llendl;
+ }
+ }
+
+ mCurRequest->setStatusMessage("Executing.");
+
+ LLCDResult ret = LLCD_OK;
+
+ if (LLConvexDecomposition::getInstance() != NULL)
+ {
+ ret = LLConvexDecomposition::getInstance()->executeStage(stage);
+ }
+
+ if (ret)
+ {
+ llwarns << "Convex Decomposition thread valid but could not execute stage " << stage << llendl;
+ LLMutexLock lock(mMutex);
+
+ mCurRequest->mHull.clear();
+ mCurRequest->mHullMesh.clear();
+
+ mCurRequest->setStatusMessage("FAIL");
+
+ completeCurrent();
+ }
+ else
+ {
+ mCurRequest->setStatusMessage("Reading results");
+
+ S32 num_hulls =0;
+ if (LLConvexDecomposition::getInstance() != NULL)
+ {
+ num_hulls = LLConvexDecomposition::getInstance()->getNumHullsFromStage(stage);
+ }
+
+ mMutex->lock();
+ mCurRequest->mHull.clear();
+ mCurRequest->mHull.resize(num_hulls);
+
+ mCurRequest->mHullMesh.clear();
+ mCurRequest->mHullMesh.resize(num_hulls);
+ mMutex->unlock();
+
+ for (S32 i = 0; i < num_hulls; ++i)
+ {
+ 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
+ LLConvexDecomposition::getInstance()->getHullFromStage(stage, i, &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);
+ }
+
+ LLCDMeshData mesh;
+ // if LLConvexDecomposition is a stub, num_hulls should have been set to 0 above, and we should not reach this code
+ LLConvexDecomposition::getInstance()->getMeshFromStage(stage, i, &mesh);
+
+ get_vertex_buffer_from_mesh(mesh, mCurRequest->mHullMesh[i]);
+
+ mMutex->lock();
+ mCurRequest->mHull[i] = p;
+ mMutex->unlock();
+ }
+
+ {
+ LLMutexLock lock(mMutex);
+
+ mCurRequest->setStatusMessage("FAIL");
+ completeCurrent();
+ }
+ }
+}
+
+void LLPhysicsDecomp::completeCurrent()
+{
+ LLMutexLock lock(mMutex);
+ mCompletedQ.push(mCurRequest);
+ mCurRequest = NULL;
+}
+
+void LLPhysicsDecomp::notifyCompleted()
+{
+ if (!mCompletedQ.empty())
+ {
+ LLMutexLock lock(mMutex);
+ while (!mCompletedQ.empty())
+ {
+ Request* req = mCompletedQ.front();
+ req->completed();
+ mCompletedQ.pop();
+ }
+ }
+}
+
+
+void make_box(LLPhysicsDecomp::Request * request)
+{
+ LLVector3 min,max;
+ min = request->mPositions[0];
+ max = min;
+
+ for (U32 i = 0; i < request->mPositions.size(); ++i)
+ {
+ update_min_max(min, max, request->mPositions[i]);
+ }
+
+ request->mHull.clear();
+
+ LLModel::hull box;
+ box.push_back(LLVector3(min[0],min[1],min[2]));
+ box.push_back(LLVector3(max[0],min[1],min[2]));
+ box.push_back(LLVector3(min[0],max[1],min[2]));
+ box.push_back(LLVector3(max[0],max[1],min[2]));
+ box.push_back(LLVector3(min[0],min[1],max[2]));
+ box.push_back(LLVector3(max[0],min[1],max[2]));
+ box.push_back(LLVector3(min[0],max[1],max[2]));
+ box.push_back(LLVector3(max[0],max[1],max[2]));
+
+ request->mHull.push_back(box);
+}
+
+
+void LLPhysicsDecomp::doDecompositionSingleHull()
+{
+ LLCDMeshData mesh;
+
+ setMeshData(mesh);
+
+
+ //set all parameters to default
+ std::map<std::string, const LLCDParam*> param_map;
+
+ static const LLCDParam* params = NULL;
+ static S32 param_count = 0;
+
+ if (!params)
+ {
+ param_count = LLConvexDecomposition::getInstance()->getParameters(&params);
+ }
+
+ LLConvexDecomposition* decomp = LLConvexDecomposition::getInstance();
+
+ if (decomp == NULL)
+ {
+ //stub. do nothing.
+ return;
+ }
+
+ 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_SIMPLIFY = mStageID["Simplify"];
+ const S32 DECOMP_PREVIEW = 0;
+ const S32 SIMPLIFY_RETAIN = 0;
+
+ decomp->setParam("Decompose Quality", DECOMP_PREVIEW);
+ decomp->setParam("Simplify Method", SIMPLIFY_RETAIN);
+ decomp->setParam("Retain%", 0.f);
+
+ LLCDResult ret = LLCD_OK;
+ ret = decomp->executeStage(STAGE_DECOMPOSE);
+
+ if (ret)
+ {
+ llwarns << "Could not execute decomposition stage when attempting to create single hull." << llendl;
+ make_box(mCurRequest);
+ }
+ else
+ {
+ ret = decomp->executeStage(STAGE_SIMPLIFY);
+
+ if (ret)
+ {
+ llwarns << "Could not execute simiplification stage when attempting to create single hull." << llendl;
+ make_box(mCurRequest);
+ }
+ else
+ {
+ S32 num_hulls =0;
+ if (LLConvexDecomposition::getInstance() != NULL)
+ {
+ num_hulls = LLConvexDecomposition::getInstance()->getNumHullsFromStage(STAGE_SIMPLIFY);
+ }
+
+ mMutex->lock();
+ mCurRequest->mHull.clear();
+ mCurRequest->mHull.resize(num_hulls);
+ mCurRequest->mHullMesh.clear();
+ mMutex->unlock();
+
+ for (S32 i = 0; i < num_hulls; ++i)
+ {
+ 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
+ LLConvexDecomposition::getInstance()->getHullFromStage(STAGE_SIMPLIFY, i, &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[i] = p;
+ mMutex->unlock();
+ }
+ }
+ }
+
+
+ {
+ completeCurrent();
+
+ }
+}
+
+
+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;
+
+ static const LLCDStageData* stages = NULL;
+ static S32 num_stages = 0;
+
+ if (!stages)
+ {
+ num_stages = decomp->getStages(&stages);
+ }
+
+ for (S32 i = 0; i < num_stages; i++)
+ {
+ mStageID[stages[i].mName] = i;
+ }
+
+ while (!mQuitting)
+ {
+ mSignal->wait();
+ while (!mQuitting && !mRequestQ.empty())
+ {
+ {
+ LLMutexLock lock(mMutex);
+ mCurRequest = mRequestQ.front();
+ mRequestQ.pop();
+ }
+
+ S32& id = *(mCurRequest->mDecompID);
+ if (id == -1)
+ {
+ decomp->genDecomposition(id);
+ }
+ decomp->bindDecomposition(id);
+
+ if (mCurRequest->mStage == "single_hull")
+ {
+ doDecompositionSingleHull();
+ }
+ else
+ {
+ doDecomposition();
+ }
+ }
+ }
+
+ decomp->quitThread();
+
+ if (mSignal->isLocked())
+ { //let go of mSignal's associated mutex
+ mSignal->unlock();
+ }
+
+ mDone = true;
+}
+
+void LLPhysicsDecomp::Request::setStatusMessage(const std::string& msg)
+{
+ mStatusMessage = msg;
+}
+
+LLModelInstance::LLModelInstance(LLSD& data)
+{
+ mLocalMeshID = data["mesh_id"].asInteger();
+ mLabel = data["label"].asString();
+ mTransform.setValue(data["transform"]);
+
+ for (U32 i = 0; i < data["material"].size(); ++i)
+ {
+ mMaterial.push_back(LLImportMaterial(data["material"][i]));
+ }
+}
+
+
+LLSD LLModelInstance::asLLSD()
+{
+ LLSD ret;
+
+ ret["mesh_id"] = mModel->mLocalID;
+ ret["label"] = mLabel;
+ ret["transform"] = mTransform.getValue();
+
+ for (U32 i = 0; i < mMaterial.size(); ++i)
+ {
+ ret["material"][i] = mMaterial[i].asLLSD();
+ }
+
+ return ret;
+}
+
+LLImportMaterial::LLImportMaterial(LLSD& data)
+{
+ mDiffuseMapFilename = data["diffuse"]["filename"].asString();
+ mDiffuseMapLabel = data["diffuse"]["label"].asString();
+ mDiffuseColor.setValue(data["diffuse"]["color"]);
+ mFullbright = data["fullbright"].asBoolean();
+}
+
+
+LLSD LLImportMaterial::asLLSD()
+{
+ LLSD ret;
+
+ ret["diffuse"]["filename"] = mDiffuseMapFilename;
+ ret["diffuse"]["label"] = mDiffuseMapLabel;
+ ret["diffuse"]["color"] = mDiffuseColor.getValue();
+ ret["fullbright"] = mFullbright;
+
+ return ret;
+}
+
+void LLMeshRepository::buildPhysicsMesh(LLModel::Decomposition& decomp)
+{
+ decomp.mMesh.resize(decomp.mHull.size());
+
+ for (U32 i = 0; i < decomp.mHull.size(); ++i)
+ {
+ LLCDHull hull;
+ hull.mNumVertices = decomp.mHull[i].size();
+ hull.mVertexBase = decomp.mHull[i][0].mV;
+ hull.mVertexStrideBytes = 12;
+
+ LLCDMeshData mesh;
+ LLCDResult res = LLCD_OK;
+ if (LLConvexDecomposition::getInstance() != NULL)
+ {
+ res = LLConvexDecomposition::getInstance()->getMeshFromHull(&hull, &mesh);
+ }
+ if (res == LLCD_OK)
+ {
+ get_vertex_buffer_from_mesh(mesh, decomp.mMesh[i]);
+ }
+ }
+
+ if (!decomp.mBaseHull.empty() && decomp.mBaseHullMesh.empty())
+ { //get mesh for base hull
+ LLCDHull hull;
+ hull.mNumVertices = decomp.mBaseHull.size();
+ hull.mVertexBase = decomp.mBaseHull[0].mV;
+ hull.mVertexStrideBytes = 12;
+
+ LLCDMeshData mesh;
+ LLCDResult res = LLCD_OK;
+ if (LLConvexDecomposition::getInstance() != NULL)
+ {
+ res = LLConvexDecomposition::getInstance()->getMeshFromHull(&hull, &mesh);
+ }
+ if (res == LLCD_OK)
+ {
+ get_vertex_buffer_from_mesh(mesh, decomp.mBaseHullMesh);
+ }
+ }
+}
diff --git a/indra/newview/llmeshrepository.h b/indra/newview/llmeshrepository.h
new file mode 100644
index 0000000000..f859e29c07
--- /dev/null
+++ b/indra/newview/llmeshrepository.h
@@ -0,0 +1,552 @@
+/**
+ * @file llmeshrepository.h
+ * @brief Client-side repository of mesh assets.
+ *
+ * $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_MESH_REPOSITORY_H
+#define LL_MESH_REPOSITORY_H
+
+#include "llassettype.h"
+#include "llmodel.h"
+#include "lluuid.h"
+#include "llviewertexture.h"
+#include "llvolume.h"
+
+#define LLCONVEXDECOMPINTER_STATIC 1
+
+#include "llconvexdecomposition.h"
+
+class LLVOVolume;
+class LLMeshResponder;
+class LLCurlRequest;
+class LLMutex;
+class LLCondition;
+class LLVFS;
+class LLMeshRepository;
+
+class LLMeshUploadData
+{
+public:
+ LLPointer<LLModel> mBaseModel;
+ LLPointer<LLModel> mModel[5];
+ LLUUID mUUID;
+ U32 mRetries;
+ std::string mRSVP;
+ std::string mAssetData;
+ LLSD mPostData;
+
+ LLMeshUploadData()
+ {
+ mRetries = 0;
+ }
+};
+
+class LLTextureUploadData
+{
+public:
+ LLViewerFetchedTexture* mTexture;
+ LLUUID mUUID;
+ std::string mRSVP;
+ std::string mLabel;
+ U32 mRetries;
+ std::string mAssetData;
+ LLSD mPostData;
+
+ LLTextureUploadData()
+ {
+ mRetries = 0;
+ }
+
+ LLTextureUploadData(LLViewerFetchedTexture* texture, std::string& label)
+ : mTexture(texture), mLabel(label)
+ {
+ mRetries = 0;
+ }
+};
+
+class LLImportMaterial
+{
+public:
+ LLPointer<LLViewerFetchedTexture> mDiffuseMap;
+ std::string mDiffuseMapFilename;
+ std::string mDiffuseMapLabel;
+ LLColor4 mDiffuseColor;
+ bool mFullbright;
+
+ bool operator<(const LLImportMaterial &params) const;
+
+ LLImportMaterial()
+ : mFullbright(false)
+ {
+ mDiffuseColor.set(1,1,1,1);
+ }
+
+ LLImportMaterial(LLSD& data);
+
+ LLSD asLLSD();
+};
+
+class LLModelInstance
+{
+public:
+ LLPointer<LLModel> mModel;
+ LLPointer<LLModel> mLOD[5];
+
+ std::string mLabel;
+
+ LLUUID mMeshID;
+ S32 mLocalMeshID;
+
+ LLMatrix4 mTransform;
+ std::vector<LLImportMaterial> mMaterial;
+
+ LLModelInstance(LLModel* model, const std::string& label, LLMatrix4& transform, std::vector<LLImportMaterial>& materials)
+ : mModel(model), mLabel(label), mTransform(transform), mMaterial(materials)
+ {
+ mLocalMeshID = -1;
+ }
+
+ LLModelInstance(LLSD& data);
+
+ LLSD asLLSD();
+};
+
+class LLPhysicsDecomp : public LLThread
+{
+public:
+
+ typedef std::map<std::string, LLSD> decomp_params;
+
+ class Request : public LLRefCount
+ {
+ public:
+ //input params
+ S32* mDecompID;
+ std::string mStage;
+ std::vector<LLVector3> mPositions;
+ std::vector<U16> mIndices;
+ decomp_params mParams;
+
+ //output state
+ 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;
+
+ //completed callback, called from the main thread
+ virtual void completed() = 0;
+
+ virtual void setStatusMessage(const std::string& msg);
+ };
+
+ LLCondition* mSignal;
+ LLMutex* mMutex;
+
+ bool mInited;
+ bool mQuitting;
+ bool mDone;
+
+ LLPhysicsDecomp();
+ ~LLPhysicsDecomp();
+
+ void shutdown();
+
+ void submitRequest(Request* request);
+ static S32 llcdCallback(const char*, S32, S32);
+ void cancel();
+
+ void setMeshData(LLCDMeshData& mesh);
+ void doDecomposition();
+ void doDecompositionSingleHull();
+
+ virtual void run();
+
+ void completeCurrent();
+ void notifyCompleted();
+
+ std::map<std::string, S32> mStageID;
+
+ typedef std::queue<LLPointer<Request> > request_queue;
+ request_queue mRequestQ;
+
+ LLPointer<Request> mCurRequest;
+
+ std::queue<LLPointer<Request> > mCompletedQ;
+
+};
+
+class LLMeshRepoThread : public LLThread
+{
+public:
+
+ static S32 sActiveHeaderRequests;
+ static S32 sActiveLODRequests;
+ static U32 sMaxConcurrentRequests;
+
+ LLCurlRequest* mCurlRequest;
+ LLMutex* mMutex;
+ LLMutex* mHeaderMutex;
+ LLCondition* mSignal;
+
+ bool mWaiting;
+
+ //map of known mesh headers
+ typedef std::map<LLUUID, LLSD> mesh_header_map;
+ mesh_header_map mMeshHeader;
+
+ std::map<LLUUID, U32> mMeshHeaderSize;
+ std::map<LLUUID, U32> mMeshResourceCost;
+
+ class HeaderRequest
+ {
+ public:
+ const LLVolumeParams mMeshParams;
+
+ HeaderRequest(const LLVolumeParams& mesh_params)
+ : mMeshParams(mesh_params)
+ {
+ }
+
+ bool operator<(const HeaderRequest& rhs) const
+ {
+ return mMeshParams < rhs.mMeshParams;
+ }
+ };
+
+ class LODRequest
+ {
+ public:
+ LLVolumeParams mMeshParams;
+ S32 mLOD;
+ F32 mScore;
+
+ LODRequest(const LLVolumeParams& mesh_params, S32 lod)
+ : mMeshParams(mesh_params), mLOD(lod), mScore(0.f)
+ {
+ }
+ };
+
+ struct CompareScoreGreater
+ {
+ bool operator()(const LODRequest& lhs, const LODRequest& rhs)
+ {
+ return lhs.mScore > rhs.mScore; // greatest = first
+ }
+ };
+
+
+ class LoadedMesh
+ {
+ public:
+ LLPointer<LLVolume> mVolume;
+ LLVolumeParams mMeshParams;
+ S32 mLOD;
+
+ LoadedMesh(LLVolume* volume, const LLVolumeParams& mesh_params, S32 lod)
+ : mVolume(volume), mMeshParams(mesh_params), mLOD(lod)
+ {
+ }
+
+ };
+
+ //set of requested skin info
+ std::set<LLUUID> mSkinRequests;
+
+ //queue of completed skin info requests
+ std::queue<LLMeshSkinInfo> mSkinInfoQ;
+
+ //set of requested decompositions
+ std::set<LLUUID> mDecompositionRequests;
+
+ //set of requested physics shapes
+ std::set<LLUUID> mPhysicsShapeRequests;
+
+ //queue of completed Decomposition info requests
+ std::queue<LLModel::Decomposition*> mDecompositionQ;
+
+ //queue of requested headers
+ std::queue<HeaderRequest> mHeaderReqQ;
+
+ //queue of requested LODs
+ std::queue<LODRequest> mLODReqQ;
+
+ //queue of unavailable LODs (either asset doesn't exist or asset doesn't have desired LOD)
+ std::queue<LODRequest> mUnavailableQ;
+
+ //queue of successfully loaded meshes
+ std::queue<LoadedMesh> mLoadedQ;
+
+ //map of pending header requests and currently desired LODs
+ typedef std::map<LLVolumeParams, std::vector<S32> > pending_lod_map;
+ pending_lod_map mPendingLOD;
+
+ static std::string constructUrl(LLUUID mesh_id);
+
+ LLMeshRepoThread();
+ ~LLMeshRepoThread();
+
+ virtual void run();
+
+ void loadMeshLOD(const LLVolumeParams& mesh_params, S32 lod);
+ bool fetchMeshHeader(const LLVolumeParams& mesh_params);
+ bool fetchMeshLOD(const LLVolumeParams& mesh_params, S32 lod);
+ bool headerReceived(const LLVolumeParams& mesh_params, U8* data, S32 data_size);
+ bool lodReceived(const LLVolumeParams& mesh_params, S32 lod, U8* data, S32 data_size);
+ bool skinInfoReceived(const LLUUID& mesh_id, U8* data, S32 data_size);
+ bool decompositionReceived(const LLUUID& mesh_id, U8* data, S32 data_size);
+ bool physicsShapeReceived(const LLUUID& mesh_id, U8* data, S32 data_size);
+ LLSD& getMeshHeader(const LLUUID& mesh_id);
+
+ 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);
+
+ //send request for skin info, returns true if header info exists
+ // (should hold onto mesh_id and try again later if header info does not exist)
+ bool fetchMeshSkinInfo(const LLUUID& mesh_id);
+
+ //send request for decomposition, returns true if header info exists
+ // (should hold onto mesh_id and try again later if header info does not exist)
+ bool fetchMeshDecomposition(const LLUUID& mesh_id);
+
+ //send request for PhysicsShape, returns true if header info exists
+ // (should hold onto mesh_id and try again later if header info does not exist)
+ bool fetchMeshPhysicsShape(const LLUUID& mesh_id);
+
+
+};
+
+class LLMeshUploadThread : public LLThread
+{
+public:
+ class DecompRequest : public LLPhysicsDecomp::Request
+ {
+ public:
+ LLPointer<LLModel> mModel;
+ LLPointer<LLModel> mBaseModel;
+
+ LLMeshUploadThread* mThread;
+
+ DecompRequest(LLModel* mdl, LLModel* base_model, LLMeshUploadThread* thread);
+
+ S32 statusCallback(const char* status, S32 p1, S32 p2) { return 1; }
+ void completed();
+ };
+
+ LLPointer<DecompRequest> mFinalDecomp;
+ bool mPhysicsComplete;
+
+ typedef std::map<LLPointer<LLModel>, std::vector<LLVector3> > hull_map;
+ hull_map mHullMap;
+
+ typedef std::vector<LLModelInstance> instance_list;
+ instance_list mInstanceList;
+
+ typedef std::map<LLPointer<LLModel>, instance_list> instance_map;
+ instance_map mInstance;
+
+ LLMutex* mMutex;
+ LLCurlRequest* mCurlRequest;
+ S32 mPendingConfirmations;
+ S32 mPendingUploads;
+ S32 mPendingCost;
+ LLVector3 mOrigin;
+ bool mFinished;
+ bool mUploadTextures;
+ bool mUploadSkin;
+ bool mUploadJoints;
+ BOOL mDiscarded ;
+
+ LLHost mHost;
+ std::string mUploadObjectAssetCapability;
+ std::string mNewInventoryCapability;
+ std::string mWholeModelFeeCapability;
+ std::string mWholeModelUploadURL;
+
+ 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;
+
+ LLMeshUploadThread(instance_list& data, LLVector3& scale, bool upload_textures,
+ bool upload_skin, bool upload_joints);
+ ~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 doWholeModelUpload();
+ void doIterativeUpload();
+
+ void wholeModelToLLSD(LLSD& dest, bool include_textures);
+
+ void decomposeMeshMatrix(LLMatrix4& transformation,
+ LLVector3& result_pos,
+ LLQuaternion& result_rot,
+ LLVector3& result_scale);
+};
+
+class LLMeshRepository
+{
+public:
+
+ //metrics
+ static U32 sBytesReceived;
+ static U32 sHTTPRequestCount;
+ static U32 sHTTPRetryCount;
+ static U32 sCacheBytesRead;
+ static U32 sCacheBytesWritten;
+ static U32 sPeakKbps;
+
+ static F32 getStreamingCost(LLSD& header, F32 radius, S32* bytes = NULL, S32* visible_bytes = NULL, S32 detail = -1);
+
+ LLMeshRepository();
+
+ void init();
+ void shutdown();
+ S32 update() ;
+
+ //mesh management functions
+ S32 loadMesh(LLVOVolume* volume, const LLVolumeParams& mesh_params, S32 detail = 0, S32 last_lod = -1);
+
+ void notifyLoadedMeshes();
+ void notifyMeshLoaded(const LLVolumeParams& mesh_params, LLVolume* volume);
+ void notifyMeshUnavailable(const LLVolumeParams& mesh_params, S32 lod);
+ void notifySkinInfoReceived(LLMeshSkinInfo& info);
+ void notifyDecompositionReceived(LLModel::Decomposition* info);
+
+ 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);
+ 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);
+
+ LLSD& getMeshHeader(const LLUUID& mesh_id);
+
+ void uploadModel(std::vector<LLModelInstance>& data, LLVector3& scale, bool upload_textures,
+ bool upload_skin, bool upload_joints);
+
+ S32 getMeshSize(const LLUUID& mesh_id, S32 lod);
+
+ typedef std::map<LLVolumeParams, std::set<LLUUID> > mesh_load_map;
+ mesh_load_map mLoadingMeshes[4];
+
+ typedef std::map<LLUUID, LLMeshSkinInfo> skin_map;
+ skin_map mSkinMap;
+
+ typedef std::map<LLUUID, LLModel::Decomposition*> decomposition_map;
+ decomposition_map mDecompositionMap;
+
+ LLMutex* mMeshMutex;
+
+ std::vector<LLMeshRepoThread::LODRequest> mPendingRequests;
+
+ //list of mesh ids awaiting skin info
+ std::set<LLUUID> mLoadingSkins;
+
+ //list of mesh ids that need to send skin info fetch requests
+ std::queue<LLUUID> mPendingSkinRequests;
+
+ //list of mesh ids awaiting decompositions
+ std::set<LLUUID> mLoadingDecompositions;
+
+ //list of mesh ids that need to send decomposition fetch requests
+ std::queue<LLUUID> mPendingDecompositionRequests;
+
+ //list of mesh ids awaiting physics shapes
+ std::set<LLUUID> mLoadingPhysicsShapes;
+
+ //list of mesh ids that need to send physics shape fetch requests
+ std::queue<LLUUID> mPendingPhysicsShapeRequests;
+
+ U32 mMeshThreadCount;
+
+ void cacheOutgoingMesh(LLMeshUploadData& data, LLSD& header);
+
+ LLMeshRepoThread* mThread;
+ std::vector<LLMeshUploadThread*> mUploads;
+ std::vector<LLMeshUploadThread*> mUploadWaitList;
+
+ LLPhysicsDecomp* mDecompThread;
+
+ class inventory_data
+ {
+ public:
+ LLSD mPostData;
+ LLSD mResponse;
+
+ inventory_data(const LLSD& data, const LLSD& content)
+ : mPostData(data), mResponse(content)
+ {
+ }
+ };
+
+ std::queue<inventory_data> mInventoryQ;
+
+ std::queue<LLSD> mUploadErrorQ;
+
+ void uploadError(LLSD& args);
+ void updateInventory(inventory_data data);
+
+ std::string mGetMeshCapability;
+
+};
+
+extern LLMeshRepository gMeshRepo;
+
+#endif
+
diff --git a/indra/newview/llnamelistctrl.h b/indra/newview/llnamelistctrl.h
index 6805630ef1..d64fdbe6a5 100644
--- a/indra/newview/llnamelistctrl.h
+++ b/indra/newview/llnamelistctrl.h
@@ -1,25 +1,25 @@
-/**
+/**
* @file llnamelistctrl.h
* @brief A list of names, automatically refreshing from the name cache.
*
* $LicenseInfo:firstyear=2003&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2010, Linden Research, Inc.
- *
+ *
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License only.
- *
+ *
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
+ *
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
@@ -58,7 +58,7 @@ public:
NameItem()
: name("name"),
target("target", INDIVIDUAL)
- {}
+ {}
};
struct NameColumn : public LLInitParam::Choice<NameColumn>
@@ -83,7 +83,7 @@ protected:
LLNameListCtrl(const Params&);
friend class LLUICtrlFactory;
public:
- // Add a user to the list by name. It will be added, the name
+ // Add a user to the list by name. It will be added, the name
// requested from the cache, and updated as necessary.
void addNameItem(const LLUUID& agent_id, EAddPosition pos = ADD_BOTTOM,
BOOL enabled = TRUE, const std::string& suffix = LLStringUtil::null);
@@ -92,7 +92,7 @@ public:
/*virtual*/ LLScrollListItem* addElement(const LLSD& element, EAddPosition pos = ADD_BOTTOM, void* userdata = NULL);
LLScrollListItem* addNameItemRow(const NameItem& value, EAddPosition pos = ADD_BOTTOM, const std::string& suffix = LLStringUtil::null);
- // Add a user to the list by name. It will be added, the name
+ // Add a user to the list by name. It will be added, the name
// requested from the cache, and updated as necessary.
void addGroupNameItem(const LLUUID& group_id, EAddPosition pos = ADD_BOTTOM,
BOOL enabled = TRUE);
@@ -126,7 +126,7 @@ private:
/**
* LLNameListCtrl item
- *
+ *
* We don't use LLScrollListItem to be able to override getUUID(), which is needed
* because the name list item value is not simply an UUID but a map (uuid, is_group).
*/
diff --git a/indra/newview/llnearbychat.cpp b/indra/newview/llnearbychat.cpp
index 572eeb8fc7..03ebc344f1 100644
--- a/indra/newview/llnearbychat.cpp
+++ b/indra/newview/llnearbychat.cpp
@@ -250,9 +250,13 @@ void LLNearbyChat::getAllowedRect(LLRect& rect)
void LLNearbyChat::updateChatHistoryStyle()
{
mChatHistory->clear();
+
+ LLSD do_not_log;
+ do_not_log["do_not_log"] = true;
for(std::vector<LLChat>::iterator it = mMessageArchive.begin();it!=mMessageArchive.end();++it)
{
- addMessage(*it,false);
+ // Update the messages without re-writing them to a log file.
+ addMessage(*it,false, do_not_log);
}
}
diff --git a/indra/newview/llnearbychatbar.cpp b/indra/newview/llnearbychatbar.cpp
index 162e465fef..4b961db5f9 100644
--- a/indra/newview/llnearbychatbar.cpp
+++ b/indra/newview/llnearbychatbar.cpp
@@ -47,6 +47,7 @@
#include "llwindow.h"
#include "llviewerwindow.h"
#include "llrootview.h"
+#include "llviewerchat.h"
S32 LLNearbyChatBar::sLastSpecialChatChannel = 0;
@@ -433,13 +434,26 @@ BOOL LLNearbyChatBar::postBuild()
mChatBox->setPassDelete(TRUE);
mChatBox->setReplaceNewlinesWithSpaces(FALSE);
mChatBox->setEnableLineHistory(TRUE);
+ mChatBox->setFont(LLViewerChat::getChatFont());
mOutputMonitor = getChild<LLOutputMonitorCtrl>("chat_zone_indicator");
mOutputMonitor->setVisible(FALSE);
+ // Register for font change notifications
+ LLViewerChat::setFontChangedCallback(boost::bind(&LLNearbyChatBar::onChatFontChange, this, _1));
+
return TRUE;
}
+void LLNearbyChatBar::onChatFontChange(LLFontGL* fontp)
+{
+ // Update things with the new font whohoo
+ if (mChatBox)
+ {
+ mChatBox->setFont(fontp);
+ }
+}
+
//static
LLNearbyChatBar* LLNearbyChatBar::getInstance()
{
@@ -875,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,
@@ -895,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.
@@ -913,6 +927,6 @@ public:
};
// Creating the object registers with the dispatcher.
-LLChatHandler gChatHandler;
+LLChatCommandHandler gChatHandler;
diff --git a/indra/newview/llnearbychatbar.h b/indra/newview/llnearbychatbar.h
index 96ab45071b..efddec942f 100644
--- a/indra/newview/llnearbychatbar.h
+++ b/indra/newview/llnearbychatbar.h
@@ -127,6 +127,7 @@ protected:
void sendChat( EChatType type );
void onChatBoxCommit();
+ void onChatFontChange(LLFontGL* fontp);
static LLWString stripChannelNumber(const LLWString &mesg, S32* channel);
EChatType processChatTypeTriggers(EChatType type, std::string &str);
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..11dc496311 100644
--- a/indra/newview/llnearbychathandler.cpp
+++ b/indra/newview/llnearbychathandler.cpp
@@ -441,6 +441,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;
@@ -487,6 +489,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.
@@ -529,6 +552,10 @@ 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") )
@@ -562,25 +589,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 +604,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/llnetmap.cpp b/indra/newview/llnetmap.cpp
index 981b4dbee3..5fe5c9b1e8 100644
--- a/indra/newview/llnetmap.cpp
+++ b/indra/newview/llnetmap.cpp
@@ -330,8 +330,8 @@ void LLNetMap::draw()
//localMouse(&local_mouse_x, &local_mouse_y);
LLUI::getMousePositionLocal(this, &local_mouse_x, &local_mouse_y);
mClosestAgentToCursor.setNull();
- F32 closest_dist = F32_MAX;
- F32 min_pick_dist = mDotRadius * MIN_PICK_SCALE;
+ F32 closest_dist_squared = F32_MAX; // value will be overridden in the loop
+ F32 min_pick_dist_squared = (mDotRadius * MIN_PICK_SCALE) * (mDotRadius * MIN_PICK_SCALE);
// Draw avatars
for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin();
@@ -410,11 +410,11 @@ void LLNetMap::draw()
}
}
- F32 dist_to_cursor = dist_vec(LLVector2(pos_map.mV[VX], pos_map.mV[VY]),
+ F32 dist_to_cursor_squared = dist_vec_squared(LLVector2(pos_map.mV[VX], pos_map.mV[VY]),
LLVector2(local_mouse_x,local_mouse_y));
- if(dist_to_cursor < min_pick_dist && dist_to_cursor < closest_dist)
+ if(dist_to_cursor_squared < min_pick_dist_squared && dist_to_cursor_squared < closest_dist_squared)
{
- closest_dist = dist_to_cursor;
+ closest_dist_squared = dist_to_cursor_squared;
mClosestAgentToCursor = regionp->mMapAvatarIDs.get(i);
}
}
@@ -451,9 +451,9 @@ void LLNetMap::draw()
dot_width,
dot_width);
- F32 dist_to_cursor = dist_vec(LLVector2(pos_map.mV[VX], pos_map.mV[VY]),
+ F32 dist_to_cursor_squared = dist_vec_squared(LLVector2(pos_map.mV[VX], pos_map.mV[VY]),
LLVector2(local_mouse_x,local_mouse_y));
- if(dist_to_cursor < min_pick_dist && dist_to_cursor < closest_dist)
+ if(dist_to_cursor_squared < min_pick_dist_squared && dist_to_cursor_squared < closest_dist_squared)
{
mClosestAgentToCursor = gAgent.getID();
}
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/lloutputmonitorctrl.h b/indra/newview/lloutputmonitorctrl.h
index 026803584d..2d23753d46 100644
--- a/indra/newview/lloutputmonitorctrl.h
+++ b/indra/newview/lloutputmonitorctrl.h
@@ -31,6 +31,7 @@
#include "llview.h"
#include "llmutelist.h"
#include "llspeakingindicatormanager.h"
+#include "lluiimage.h"
class LLTextBox;
class LLUICtrlFactory;
diff --git a/indra/newview/llpanelavatar.cpp b/indra/newview/llpanelavatar.cpp
index 73c4722b82..d58a1cb663 100644
--- a/indra/newview/llpanelavatar.cpp
+++ b/indra/newview/llpanelavatar.cpp
@@ -36,6 +36,7 @@
#include "llimview.h"
#include "llmenubutton.h"
#include "llnotificationsutil.h"
+#include "llslurl.h"
#include "lltexteditor.h"
#include "lltexturectrl.h"
#include "lltoggleablemenu.h"
diff --git a/indra/newview/llpaneleditwearable.cpp b/indra/newview/llpaneleditwearable.cpp
index cb8fbd66b5..b73d97e4c4 100644
--- a/indra/newview/llpaneleditwearable.cpp
+++ b/indra/newview/llpaneleditwearable.cpp
@@ -1133,7 +1133,7 @@ void LLPanelEditWearable::showWearable(LLWearable* wearable, BOOL show, BOOL dis
LLScrollingPanelList *panel_list = getChild<LLScrollingPanelList>(scrolling_panel);
LLAccordionCtrlTab *tab = getChild<LLAccordionCtrlTab>(accordion_tab);
-
+
if (!panel_list)
{
llwarns << "could not get scrolling panel list: " << scrolling_panel << llendl;
@@ -1145,7 +1145,18 @@ void LLPanelEditWearable::showWearable(LLWearable* wearable, BOOL show, BOOL dis
llwarns << "could not get llaccordionctrltab from UI with name: " << accordion_tab << llendl;
continue;
}
-
+
+ // Don't show female subparts if you're not female, etc.
+ if (!(gAgentAvatarp->getSex() & subpart_entry->mSex))
+ {
+ tab->setVisible(FALSE);
+ continue;
+ }
+ else
+ {
+ tab->setVisible(TRUE);
+ }
+
// what edit group do we want to extract params for?
const std::string edit_group = subpart_entry->mEditGroup;
diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp
index bce496cbad..07c7f35989 100644
--- a/indra/newview/llpanelface.cpp
+++ b/indra/newview/llpanelface.cpp
@@ -376,6 +376,11 @@ struct LLPanelFaceSetAlignedTEFunctor : public LLSelectedTEFunctor
return true;
}
+ if (facep->getViewerObject()->getVolume()->getNumVolumeFaces() <= te)
+ {
+ return true;
+ }
+
bool set_aligned = true;
if (facep == mCenterFace)
{
@@ -418,6 +423,12 @@ struct LLPanelFaceGetIsAlignedTEFunctor : public LLSelectedTEFunctor
{
return false;
}
+
+ if (facep->getViewerObject()->getVolume()->getNumVolumeFaces() <= te)
+ { //volume face does not exist, can't be aligned
+ return false;
+ }
+
if (facep == mCenterFace)
{
return true;
diff --git a/indra/newview/llpanelgroupgeneral.cpp b/indra/newview/llpanelgroupgeneral.cpp
index ec340dc258..1576ccccdf 100644
--- a/indra/newview/llpanelgroupgeneral.cpp
+++ b/indra/newview/llpanelgroupgeneral.cpp
@@ -44,6 +44,7 @@
#include "llnotificationsutil.h"
#include "llscrolllistitem.h"
#include "llspinctrl.h"
+#include "llslurl.h"
#include "lltextbox.h"
#include "lltexteditor.h"
#include "lltexturectrl.h"
diff --git a/indra/newview/llpanelgroupnotices.cpp b/indra/newview/llpanelgroupnotices.cpp
index cdf6e51bf8..e64192c2ae 100644
--- a/indra/newview/llpanelgroupnotices.cpp
+++ b/indra/newview/llpanelgroupnotices.cpp
@@ -154,6 +154,7 @@ BOOL LLGroupDropTarget::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
case DAD_ANIMATION:
case DAD_GESTURE:
case DAD_CALLINGCARD:
+ case DAD_MESH:
{
LLViewerInventoryItem* inv_item = (LLViewerInventoryItem*)cargo_data;
if(gInventory.getItem(inv_item->getUUID())
diff --git a/indra/newview/llpanelgrouproles.cpp b/indra/newview/llpanelgrouproles.cpp
index 3dbc637318..fbe331c7ab 100644
--- a/indra/newview/llpanelgrouproles.cpp
+++ b/indra/newview/llpanelgrouproles.cpp
@@ -42,6 +42,7 @@
#include "llscrolllistctrl.h"
#include "llscrolllistitem.h"
#include "llscrolllistcell.h"
+#include "llslurl.h"
#include "lltabcontainer.h"
#include "lltextbox.h"
#include "lltexteditor.h"
diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp
index 7820ac3ecd..d0810d0772 100644
--- a/indra/newview/llpanellogin.cpp
+++ b/indra/newview/llpanellogin.cpp
@@ -34,6 +34,7 @@
#include "llmd5.h"
#include "llsecondlifeurls.h"
#include "v4color.h"
+#include "llversionviewer.h"
#include "llappviewer.h"
#include "llbutton.h"
@@ -81,6 +82,9 @@ const S32 MAX_PASSWORD = 16;
LLPanelLogin *LLPanelLogin::sInstance = NULL;
BOOL LLPanelLogin::sCapslockDidNotification = FALSE;
+// Helper for converting a user name into the canonical "Firstname Lastname" form.
+// For new accounts without a last name "Resident" is added as a last name.
+static std::string canonicalize_username(const std::string& name);
class LLLoginRefreshHandler : public LLCommandHandler
{
@@ -97,58 +101,6 @@ public:
}
};
-LLLoginRefreshHandler gLoginRefreshHandler;
-
-
-// helper class that trys to download a URL from a web site and calls a method
-// on parent class indicating if the web server is working or not
-class LLIamHereLogin : public LLHTTPClient::Responder
-{
- private:
- LLIamHereLogin( LLPanelLogin* parent ) :
- mParent( parent )
- {}
-
- LLPanelLogin* mParent;
-
- public:
- static boost::intrusive_ptr< LLIamHereLogin > build( LLPanelLogin* parent )
- {
- return boost::intrusive_ptr< LLIamHereLogin >( new LLIamHereLogin( parent ) );
- };
-
- virtual void setParent( LLPanelLogin* parentIn )
- {
- mParent = parentIn;
- };
-
- // We don't actually expect LLSD back, so need to override completedRaw
- virtual void completedRaw(U32 status, const std::string& reason,
- const LLChannelDescriptors& channels,
- const LLIOPipe::buffer_ptr_t& buffer)
- {
- completed(status, reason, LLSD()); // will call result() or error()
- }
-
- virtual void result( const LLSD& content )
- {
- if ( mParent )
- mParent->setSiteIsAlive( true );
- };
-
- virtual void error( U32 status, const std::string& reason )
- {
- if ( mParent )
- mParent->setSiteIsAlive( false );
- };
-};
-
-// this is global and not a class member to keep crud out of the header file
-namespace {
- boost::intrusive_ptr< LLIamHereLogin > gResponsePtr = 0;
-};
-
-
//---------------------------------------------------------------------------
// Public methods
//---------------------------------------------------------------------------
@@ -160,7 +112,6 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
mLogoImage(),
mCallback(callback),
mCallbackData(cb_data),
- mHtmlAvailable( TRUE ),
mListener(new LLPanelLoginListener(this))
{
setBackgroundVisible(FALSE);
@@ -190,21 +141,11 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
buildFromFile( "panel_login.xml");
- // Legacy login web page is hidden under the menu bar.
- // Adjust reg-in-client web browser widget to not be hidden.
- if (gSavedSettings.getBOOL("RegInClient"))
- {
- reshape(rect.getWidth(), rect.getHeight() - MENU_BAR_HEIGHT);
- }
- else
- {
- reshape(rect.getWidth(), rect.getHeight());
- }
+ reshape(rect.getWidth(), rect.getHeight());
getChild<LLLineEditor>("password_edit")->setKeystrokeCallback(onPassKey, this);
// change z sort of clickable text to be behind buttons
- //sendChildToBack(getChildView("channel_text"));
sendChildToBack(getChildView("forgot_password_text"));
if(LLStartUp::getStartSLURL().getType() != LLSLURL::LOCATION)
@@ -249,16 +190,10 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
LLMediaCtrl* web_browser = getChild<LLMediaCtrl>("login_html");
web_browser->addObserver(this);
- // Clear the browser's cache to avoid any potential for the cache messing up the login screen.
- web_browser->clearCache();
-
reshapeBrowser();
- // kick off a request to grab the url manually
- gResponsePtr = LLIamHereLogin::build( this );
-
- LLHTTPClient::head( LLGridManager::getInstance()->getLoginPage(), gResponsePtr );
-
+ loadLoginPage();
+
// Show last logged in user favorites in "Start at" combo.
addUsersWithFavoritesToUsername();
getChild<LLComboBox>("username_combo")->setTextChangedCallback(boost::bind(&LLPanelLogin::addFavoritesToStartLocation, this));
@@ -302,7 +237,14 @@ void LLPanelLogin::addFavoritesToStartLocation()
for (LLSD::map_const_iterator iter = fav_llsd.beginMap();
iter != fav_llsd.endMap(); ++iter)
{
- if(iter->first != getChild<LLComboBox>("username_combo")->getSimple()) continue;
+ std::string user_defined_name = getChild<LLComboBox>("username_combo")->getSimple();
+
+ // The account name in stored_favorites.xml has Resident last name even if user has
+ // a single word account name, so it can be compared case-insensitive with the
+ // user defined "firstname lastname".
+ S32 res = LLStringUtil::compareInsensitive(canonicalize_username(user_defined_name), iter->first);
+ if (res != 0) continue;
+
combo->addSeparator();
LLSD user_llsd = iter->second;
for (LLSD::array_const_iterator iter1 = user_llsd.beginArray();
@@ -334,46 +276,10 @@ void LLPanelLogin::reshapeBrowser()
reshape( rect.getWidth(), rect.getHeight(), 1 );
}
-void LLPanelLogin::setSiteIsAlive( bool alive )
-{
- LLMediaCtrl* web_browser = getChild<LLMediaCtrl>("login_html");
- // if the contents of the site was retrieved
- if ( alive )
- {
- if ( web_browser )
- {
- loadLoginPage();
-
- // mark as available
- mHtmlAvailable = TRUE;
- }
- }
- else
- // the site is not available (missing page, server down, other badness)
- {
- if ( web_browser )
- {
- // hide browser control (revealing default one)
- web_browser->setVisible( FALSE );
-
- // mark as unavailable
- mHtmlAvailable = FALSE;
- }
- }
-}
-
-
LLPanelLogin::~LLPanelLogin()
{
LLPanelLogin::sInstance = NULL;
- // tell the responder we're not here anymore
- if ( gResponsePtr )
- gResponsePtr->setParent( 0 );
-
- //// We know we're done with the image, so be rid of it.
- //gTextureList.deleteImage( mLogoImage );
-
// Controls having keyboard focus by default
// must reset it on destroy. (EXT-2748)
gFocusMgr.setDefaultKeyboardFocus(NULL);
@@ -396,22 +302,13 @@ void LLPanelLogin::draw()
S32 width = getRect().getWidth();
S32 height = getRect().getHeight();
- if ( mHtmlAvailable )
+ if (getChild<LLView>("login_widgets")->getVisible())
{
- if (getChild<LLView>("login_widgets")->getVisible())
- {
- // draw a background box in black
- gl_rect_2d( 0, height - 264, width, 264, LLColor4::black );
- // draw the bottom part of the background image
- // just the blue background to the native client UI
- mLogoImage->draw(0, -264, width + 8, mLogoImage->getHeight());
- }
- }
- else
- {
- // the HTML login page is not available so default to the original screen
- S32 offscreen_part = height / 3;
- mLogoImage->draw(0, -offscreen_part, width, height+offscreen_part);
+ // draw a background box in black
+ gl_rect_2d( 0, height - 264, width, 264, LLColor4::black );
+ // draw the bottom part of the background image
+ // just the blue background to the native client UI
+ mLogoImage->draw(0, -264, width + 8, mLogoImage->getHeight());
};
}
glPopMatrix();
@@ -851,12 +748,20 @@ void LLPanelLogin::loadLoginPage()
LLVersionInfo::getShortVersion().c_str(),
LLVersionInfo::getBuild());
- char* curl_channel = curl_escape(LLVersionInfo::getChannel().c_str(), 0);
+ char* curl_channel ;
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);
@@ -870,20 +775,10 @@ void LLPanelLogin::loadLoginPage()
oStr << "&os=" << os_info;
curl_free(os_info);
-
gViewerWindow->setMenuBackgroundColor(false, !LLGridManager::getInstance()->isInProductionGrid());
- gLoginMenuBarView->setBackgroundColor(gMenuBarView->getBackgroundColor());
LLMediaCtrl* web_browser = sInstance->getChild<LLMediaCtrl>("login_html");
-
- // navigate to the "real" page
- if (gSavedSettings.getBOOL("RegInClient"))
- {
- web_browser->setFocus(TRUE);
- login_page = sInstance->getString("reg_in_client_url");
- web_browser->navigateTo(login_page, "text/html");
- }
- else
+ if (web_browser->getCurrentNavUrl() != oStr.str())
{
web_browser->navigateTo( oStr.str(), "text/html" );
}
@@ -917,10 +812,6 @@ void LLPanelLogin::onClickConnect(void *)
{
if (sInstance && sInstance->mCallback)
{
- // tell the responder we're not here anymore
- if ( gResponsePtr )
- gResponsePtr->setParent( 0 );
-
// JC - Make sure the fields all get committed.
sInstance->setFocus(FALSE);
@@ -988,24 +879,6 @@ void LLPanelLogin::onClickConnect(void *)
}
}
-/*
-// static
-bool LLPanelLogin::newAccountAlertCallback(const LLSD& notification, const LLSD& response)
-{
- S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
- if (0 == option)
- {
- llinfos << "Going to account creation URL" << llendl;
- LLWeb::loadURLExternal( LLNotifications::instance().getGlobalString("CREATE_ACCOUNT_URL"));
- }
- else
- {
- sInstance->setFocus(TRUE);
- }
- return false;
-}
-*/
-
// static
void LLPanelLogin::onClickNewAccount(void*)
{
@@ -1186,3 +1059,28 @@ void LLPanelLogin::onModeChangeConfirm(const LLSD& original_value, const LLSD& n
break;
}
}
+
+std::string canonicalize_username(const std::string& name)
+{
+ std::string cname = name;
+ LLStringUtil::trim(cname);
+
+ // determine if the username is a first/last form or not.
+ size_t separator_index = cname.find_first_of(" ._");
+ std::string first = cname.substr(0, separator_index);
+ std::string last;
+ if (separator_index != cname.npos)
+ {
+ last = cname.substr(separator_index+1, cname.npos);
+ LLStringUtil::trim(last);
+ }
+ else
+ {
+ // ...on Linden grids, single username users as considered to have
+ // last name "Resident"
+ last = "Resident";
+ }
+
+ // Username in traditional "firstname lastname" form.
+ return first + ' ' + last;
+}
diff --git a/indra/newview/llpanellogin.h b/indra/newview/llpanellogin.h
index 9cc5e3456a..11273453ba 100644
--- a/indra/newview/llpanellogin.h
+++ b/indra/newview/llpanellogin.h
@@ -89,7 +89,6 @@ private:
void addUsersWithFavoritesToUsername();
static void onClickConnect(void*);
static void onClickNewAccount(void*);
-// static bool newAccountAlertCallback(const LLSD& notification, const LLSD& response);
static void onClickVersion(void*);
static void onClickForgotPassword(void*);
static void onClickHelp(void*);
@@ -114,7 +113,6 @@ private:
static LLPanelLogin* sInstance;
static BOOL sCapslockDidNotification;
- BOOL mHtmlAvailable;
};
std::string load_password_from_disk(void);
diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp
index 0c3f2f3e31..bc4998dd0c 100644
--- a/indra/newview/llpanelmaininventory.cpp
+++ b/indra/newview/llpanelmaininventory.cpp
@@ -81,7 +81,6 @@ public:
BOOL getCheckSinceLogoff();
static void onTimeAgo(LLUICtrl*, void *);
- static void onCheckSinceLogoff(LLUICtrl*, void *);
static void onCloseBtn(void* user_data);
static void selectAllTypes(void* user_data);
static void selectNoTypes(void* user_data);
@@ -140,6 +139,7 @@ BOOL LLPanelMainInventory::postBuild()
mActivePanel->getFilter()->markDefault();
mActivePanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState);
mActivePanel->setSelectCallback(boost::bind(&LLPanelMainInventory::onSelectionChange, this, mActivePanel, _1, _2));
+ mResortActivePanel = true;
}
LLInventoryPanel* recent_items_panel = getChild<LLInventoryPanel>("Recent Items");
if (recent_items_panel)
@@ -529,6 +529,17 @@ void LLPanelMainInventory::draw()
{
mFilterEditor->setText(mFilterSubString);
}
+ if (mActivePanel && mResortActivePanel)
+ {
+ // EXP-756: Force resorting of the list the first time we draw the list:
+ // In the case of date sorting, we don't have enough information at initialization time
+ // to correctly sort the folders. Later manual resort doesn't do anything as the order value is
+ // set correctly. The workaround is to reset the order to alphabetical (or anything) then to the correct order.
+ U32 order = mActivePanel->getSortOrder();
+ mActivePanel->setSortOrder(LLInventoryFilter::SO_NAME);
+ mActivePanel->setSortOrder(order);
+ mResortActivePanel = false;
+ }
LLPanel::draw();
updateItemcountText();
}
@@ -619,20 +630,6 @@ LLFloaterInventoryFinder::LLFloaterInventoryFinder(LLPanelMainInventory* invento
updateElementsFromFilter();
}
-
-void LLFloaterInventoryFinder::onCheckSinceLogoff(LLUICtrl *ctrl, void *user_data)
-{
- LLFloaterInventoryFinder *self = (LLFloaterInventoryFinder *)user_data;
- if (!self) return;
-
- bool since_logoff= self->getChild<LLUICtrl>("check_since_logoff")->getValue();
-
- if (!since_logoff &&
- !( self->mSpinSinceDays->get() || self->mSpinSinceHours->get() ) )
- {
- self->mSpinSinceHours->set(1.0f);
- }
-}
BOOL LLFloaterInventoryFinder::postBuild()
{
const LLRect& viewrect = mPanelMainInventory->getRect();
@@ -647,9 +644,6 @@ BOOL LLFloaterInventoryFinder::postBuild()
mSpinSinceDays = getChild<LLSpinCtrl>("spin_days_ago");
childSetCommitCallback("spin_days_ago", onTimeAgo, this);
- // mCheckSinceLogoff = getChild<LLSpinCtrl>("check_since_logoff");
- childSetCommitCallback("check_since_logoff", onCheckSinceLogoff, this);
-
childSetAction("Close", onCloseBtn, this);
updateElementsFromFilter();
@@ -660,12 +654,10 @@ void LLFloaterInventoryFinder::onTimeAgo(LLUICtrl *ctrl, void *user_data)
LLFloaterInventoryFinder *self = (LLFloaterInventoryFinder *)user_data;
if (!self) return;
- bool since_logoff=true;
if ( self->mSpinSinceDays->get() || self->mSpinSinceHours->get() )
{
- since_logoff = false;
+ self->getChild<LLUICtrl>("check_since_logoff")->setValue(false);
}
- self->getChild<LLUICtrl>("check_since_logoff")->setValue(since_logoff);
}
void LLFloaterInventoryFinder::changeFilter(LLInventoryFilter* filter)
@@ -694,6 +686,7 @@ void LLFloaterInventoryFinder::updateElementsFromFilter()
getChild<LLUICtrl>("check_clothing")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_WEARABLE));
getChild<LLUICtrl>("check_gesture")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_GESTURE));
getChild<LLUICtrl>("check_landmark")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_LANDMARK));
+ getChild<LLUICtrl>("check_mesh")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_MESH));
getChild<LLUICtrl>("check_notecard")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_NOTECARD));
getChild<LLUICtrl>("check_object")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_OBJECT));
getChild<LLUICtrl>("check_script")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_LSL));
@@ -745,6 +738,12 @@ void LLFloaterInventoryFinder::draw()
filtered_by_all_types = FALSE;
}
+ if (!getChild<LLUICtrl>("check_mesh")->getValue())
+ {
+ filter &= ~(0x1 << LLInventoryType::IT_MESH);
+ filtered_by_all_types = FALSE;
+ }
+
if (!getChild<LLUICtrl>("check_notecard")->getValue())
{
filter &= ~(0x1 << LLInventoryType::IT_NOTECARD);
@@ -841,6 +840,7 @@ void LLFloaterInventoryFinder::selectAllTypes(void* user_data)
self->getChild<LLUICtrl>("check_clothing")->setValue(TRUE);
self->getChild<LLUICtrl>("check_gesture")->setValue(TRUE);
self->getChild<LLUICtrl>("check_landmark")->setValue(TRUE);
+ self->getChild<LLUICtrl>("check_mesh")->setValue(TRUE);
self->getChild<LLUICtrl>("check_notecard")->setValue(TRUE);
self->getChild<LLUICtrl>("check_object")->setValue(TRUE);
self->getChild<LLUICtrl>("check_script")->setValue(TRUE);
@@ -860,6 +860,7 @@ void LLFloaterInventoryFinder::selectNoTypes(void* user_data)
self->getChild<LLUICtrl>("check_clothing")->setValue(FALSE);
self->getChild<LLUICtrl>("check_gesture")->setValue(FALSE);
self->getChild<LLUICtrl>("check_landmark")->setValue(FALSE);
+ self->getChild<LLUICtrl>("check_mesh")->setValue(FALSE);
self->getChild<LLUICtrl>("check_notecard")->setValue(FALSE);
self->getChild<LLUICtrl>("check_object")->setValue(FALSE);
self->getChild<LLUICtrl>("check_script")->setValue(FALSE);
diff --git a/indra/newview/llpanelmaininventory.h b/indra/newview/llpanelmaininventory.h
index c2b78ff9ea..2b2ee1c0c9 100644
--- a/indra/newview/llpanelmaininventory.h
+++ b/indra/newview/llpanelmaininventory.h
@@ -121,6 +121,7 @@ private:
LLTabContainer* mFilterTabs;
LLHandle<LLFloater> mFinderHandle;
LLInventoryPanel* mActivePanel;
+ bool mResortActivePanel;
LLSaveFolderState* mSavedFolderState;
std::string mFilterText;
std::string mFilterSubString;
diff --git a/indra/newview/llpanelnearbymedia.cpp b/indra/newview/llpanelnearbymedia.cpp
index a7f1ab28fd..2bbd15ae11 100644
--- a/indra/newview/llpanelnearbymedia.cpp
+++ b/indra/newview/llpanelnearbymedia.cpp
@@ -356,7 +356,7 @@ void LLPanelNearByMedia::updateListItem(LLScrollListItem* item, LLViewerMediaImp
debug_str += llformat("%g/", (float)impl->getInterest());
// proximity distance is actually distance squared -- display it as straight distance.
- debug_str += llformat("%g/", fsqrtf(impl->getProximityDistance()));
+ debug_str += llformat("%g/", (F32) sqrt(impl->getProximityDistance()));
// s += llformat("%g/", (float)impl->getCPUUsage());
// s += llformat("%g/", (float)impl->getApproximateTextureInterest());
diff --git a/indra/newview/llpanelobject.cpp b/indra/newview/llpanelobject.cpp
index a0c320ba19..b4d0ada196 100644
--- a/indra/newview/llpanelobject.cpp
+++ b/indra/newview/llpanelobject.cpp
@@ -33,11 +33,9 @@
#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
@@ -57,7 +55,6 @@
#include "lltool.h"
#include "lltoolcomp.h"
#include "lltoolmgr.h"
-#include "lltrans.h"
#include "llui.h"
#include "llviewerobject.h"
#include "llviewerregion.h"
@@ -101,17 +98,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
//--------------------------------------------------------
@@ -131,7 +117,8 @@ BOOL LLPanelObject::postBuild()
// Phantom checkbox
mCheckPhantom = getChild<LLCheckBoxCtrl>("Phantom Checkbox Ctrl");
childSetCommitCallback("Phantom Checkbox Ctrl",onCommitPhantom,this);
-
+
+
// Position
mLabelPosition = getChild<LLTextBox>("label position");
mCtrlPosX = getChild<LLSpinCtrl>("Pos X");
@@ -165,22 +152,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);
@@ -308,7 +279,6 @@ BOOL LLPanelObject::postBuild()
LLPanelObject::LLPanelObject()
: LLPanel(),
- mComboMaterialItemCount(0),
mIsPhysical(FALSE),
mIsTemporary(FALSE),
mIsPhantom(FALSE),
@@ -519,49 +489,13 @@ void LLPanelObject::getState( )
mCheckPhantom->set( mIsPhantom );
mCheckPhantom->setEnabled( roots_selected>0 && editable && !is_flexible );
+
#if 0 // 1.9.2
mCastShadows = root_objectp->flagCastShadows();
mCheckCastShadows->set( mCastShadows );
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;
@@ -569,6 +503,7 @@ void LLPanelObject::getState( )
BOOL enabled = FALSE;
BOOL hole_enabled = FALSE;
F32 scale_x=1.f, scale_y=1.f;
+ BOOL isMesh = FALSE;
if( !objectp || !objectp->getVolume() || !editable || !single_volume)
{
@@ -599,10 +534,9 @@ void LLPanelObject::getState( )
// Only allowed to change these parameters for objects
// that you have permissions on AND are not attachments.
enabled = root_objectp->permModify();
-
- const LLVolumeParams &volume_params = objectp->getVolume()->getParams();
-
+
// Volume type
+ const LLVolumeParams &volume_params = objectp->getVolume()->getParams();
U8 path = volume_params.getPathParams().getCurveType();
U8 profile_and_hole = volume_params.getProfileParams().getCurveType();
U8 profile = profile_and_hole & LL_PCODE_PROFILE_MASK;
@@ -833,7 +767,7 @@ void LLPanelObject::getState( )
}
mSpinSkew->set( skew );
}
-
+
// Compute control visibility, label names, and twist range.
// Start with defaults.
BOOL cut_visible = TRUE;
@@ -1093,15 +1027,14 @@ 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)
{
- LLUUID id;
+
+
+ LLUUID id;
LLSculptParams *sculpt_params = (LLSculptParams *)objectp->getParameterEntry(LLNetworkData::PARAMS_SCULPT);
@@ -1113,32 +1046,35 @@ void LLPanelObject::getState( )
mSculptTypeRevert = sculpt_params->getSculptType();
}
+ U8 sculpt_type = sculpt_params->getSculptType();
+ U8 sculpt_stitching = sculpt_type & LL_SCULPT_TYPE_MASK;
+ BOOL sculpt_invert = sculpt_type & LL_SCULPT_FLAG_INVERT;
+ BOOL sculpt_mirror = sculpt_type & LL_SCULPT_FLAG_MIRROR;
+ isMesh = (sculpt_stitching == LL_SCULPT_TYPE_MESH);
+
LLTextureCtrl* mTextureCtrl = getChild<LLTextureCtrl>("sculpt texture control");
if(mTextureCtrl)
{
mTextureCtrl->setTentative(FALSE);
- mTextureCtrl->setEnabled(editable);
+ mTextureCtrl->setEnabled(editable && !isMesh);
if (editable)
mTextureCtrl->setImageAssetID(sculpt_params->getSculptTexture());
else
mTextureCtrl->setImageAssetID(LLUUID::null);
}
- U8 sculpt_type = sculpt_params->getSculptType();
- U8 sculpt_stitching = sculpt_type & LL_SCULPT_TYPE_MASK;
- BOOL sculpt_invert = sculpt_type & LL_SCULPT_FLAG_INVERT;
- BOOL sculpt_mirror = sculpt_type & LL_SCULPT_FLAG_MIRROR;
+ mComboBaseType->setEnabled(!isMesh);
if (mCtrlSculptType)
{
mCtrlSculptType->setCurrentByIndex(sculpt_stitching);
- mCtrlSculptType->setEnabled(editable);
+ mCtrlSculptType->setEnabled(editable && !isMesh);
}
if (mCtrlSculptMirror)
{
mCtrlSculptMirror->set(sculpt_mirror);
- mCtrlSculptMirror->setEnabled(editable);
+ mCtrlSculptMirror->setEnabled(editable && !isMesh);
}
if (mCtrlSculptInvert)
@@ -1151,14 +1087,17 @@ void LLPanelObject::getState( )
{
mLabelSculptType->setEnabled(TRUE);
}
+
}
}
else
{
- mSculptTextureRevert = LLUUID::null;
+ mSculptTextureRevert = LLUUID::null;
}
-
+ mCtrlSculptMirror->setVisible(sculpt_texture_visible && !isMesh);
+ mCtrlSculptInvert->setVisible(sculpt_texture_visible && !isMesh);
+
//----------------------------------------------------------------------------
mObject = objectp;
@@ -1238,25 +1177,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;
@@ -1786,6 +1706,17 @@ void LLPanelObject::sendSculpt()
if (mCtrlSculptType)
sculpt_type |= mCtrlSculptType->getCurrentIndex();
+ bool enabled = sculpt_type != LL_SCULPT_TYPE_MESH;
+
+ if (mCtrlSculptMirror)
+ {
+ mCtrlSculptMirror->setEnabled(enabled ? TRUE : FALSE);
+ }
+ if (mCtrlSculptInvert)
+ {
+ mCtrlSculptInvert->setEnabled(enabled ? TRUE : FALSE);
+ }
+
if ((mCtrlSculptMirror) && (mCtrlSculptMirror->get()))
sculpt_type |= LL_SCULPT_FLAG_MIRROR;
@@ -1808,6 +1739,27 @@ void LLPanelObject::refresh()
{
mRootObject = NULL;
}
+
+ bool enable_mesh = gSavedSettings.getBOOL("MeshEnabled") &&
+ gAgent.getRegion() &&
+ !gAgent.getRegion()->getCapability("GetMesh").empty() &&
+ !gAgent.getRegion()->getCapability("ObjectAdd").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");
+ }
}
@@ -1894,11 +1846,11 @@ void LLPanelObject::clearCtrls()
mCheckTemporary ->setEnabled( FALSE );
mCheckPhantom ->set(FALSE);
mCheckPhantom ->setEnabled( FALSE );
+
#if 0 // 1.9.2
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 e07bf007ec..475dfdaedb 100644
--- a/indra/newview/llpanelobject.h
+++ b/indra/newview/llpanelobject.h
@@ -62,14 +62,13 @@ public:
static void onCommitPosition( LLUICtrl* ctrl, void* userdata);
static void onCommitScale( LLUICtrl* ctrl, void* userdata);
static void onCommitRotation( LLUICtrl* ctrl, void* userdata);
- static void onCommitPhysics( LLUICtrl* ctrl, void* userdata);
static void onCommitTemporary( LLUICtrl* ctrl, void* userdata);
static void onCommitPhantom( LLUICtrl* ctrl, void* userdata);
static void onCommitCastShadows( LLUICtrl* ctrl, void* userdata);
+ static void onCommitPhysics( LLUICtrl* ctrl, void* userdata);
static void onCommitParametric(LLUICtrl* ctrl, void* userdata);
- static void onCommitMaterial( LLUICtrl* ctrl, void* userdata);
void onCommitSculpt(const LLSD& data);
void onCancelSculpt(const LLSD& data);
@@ -87,16 +86,13 @@ protected:
void sendIsPhysical();
void sendIsTemporary();
void sendIsPhantom();
+
void sendCastShadows();
void sendSculpt();
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 0b6267c9e6..bfe6cab52f 100644
--- a/indra/newview/llpanelobjectinventory.cpp
+++ b/indra/newview/llpanelobjectinventory.cpp
@@ -802,6 +802,7 @@ BOOL LLTaskCategoryBridge::dragOrDrop(MASK mask, BOOL drop,
case DAD_ANIMATION:
case DAD_GESTURE:
case DAD_CALLINGCARD:
+ case DAD_MESH:
accept = LLToolDragAndDrop::isInventoryDropAcceptable(object, (LLViewerInventoryItem*)cargo_data);
if(accept && drop)
{
@@ -1227,6 +1228,116 @@ LLUIImagePtr LLTaskWearableBridge::getIcon() const
return LLInventoryIcon::getIcon(mAssetType, mInventoryType, mFlags, FALSE );
}
+///----------------------------------------------------------------------------
+/// Class LLTaskMeshBridge
+///----------------------------------------------------------------------------
+
+class LLTaskMeshBridge : public LLTaskInvFVBridge
+{
+public:
+ LLTaskMeshBridge(
+ LLPanelObjectInventory* panel,
+ const LLUUID& uuid,
+ const std::string& name);
+
+ virtual LLUIImagePtr getIcon() const;
+ virtual void openItem();
+ virtual void performAction(LLInventoryModel* model, std::string action);
+ virtual void buildContextMenu(LLMenuGL& menu, U32 flags);
+};
+
+LLTaskMeshBridge::LLTaskMeshBridge(
+ LLPanelObjectInventory* panel,
+ const LLUUID& uuid,
+ const std::string& name) :
+ LLTaskInvFVBridge(panel, uuid, name)
+{
+}
+
+LLUIImagePtr LLTaskMeshBridge::getIcon() const
+{
+ return LLInventoryIcon::getIcon(LLAssetType::AT_MESH, LLInventoryType::IT_MESH, 0, FALSE);
+}
+
+void LLTaskMeshBridge::openItem()
+{
+ // open mesh
+}
+
+
+// virtual
+void LLTaskMeshBridge::performAction(LLInventoryModel* model, std::string action)
+{
+ if (action == "mesh action")
+ {
+ LLInventoryItem* item = findItem();
+ if(item)
+ {
+ // do action
+ }
+ }
+ LLTaskInvFVBridge::performAction(model, action);
+}
+
+void LLTaskMeshBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
+{
+ LLInventoryItem* item = findItem();
+ if(!item) return;
+ std::vector<std::string> items;
+ std::vector<std::string> disabled_items;
+
+ if(item->getPermissions().getOwner() != gAgent.getID()
+ && item->getSaleInfo().isForSale())
+ {
+ items.push_back(std::string("Task Buy"));
+
+ std::string label= LLTrans::getString("Buy");
+ // Check the price of the item.
+ S32 price = getPrice();
+ if (-1 == price)
+ {
+ llwarns << "label_buy_task_bridged_item: Invalid price" << llendl;
+ }
+ else
+ {
+ std::ostringstream info;
+ info << LLTrans::getString("BuyforL$") << price;
+ label.assign(info.str());
+ }
+
+ const LLView::child_list_t *list = menu.getChildList();
+ LLView::child_list_t::const_iterator itor;
+ for (itor = list->begin(); itor != list->end(); ++itor)
+ {
+ std::string name = (*itor)->getName();
+ LLMenuItemCallGL* menu_itemp = dynamic_cast<LLMenuItemCallGL*>(*itor);
+ if (name == "Task Buy" && menu_itemp)
+ {
+ menu_itemp->setLabel(label);
+ }
+ }
+ }
+ else
+ {
+ items.push_back(std::string("Task Open"));
+ if (!isItemCopyable())
+ {
+ disabled_items.push_back(std::string("Task Open"));
+ }
+ }
+ items.push_back(std::string("Task Properties"));
+ if(isItemRenameable())
+ {
+ items.push_back(std::string("Task Rename"));
+ }
+ if(isItemRemovable())
+ {
+ items.push_back(std::string("Task Remove"));
+ }
+
+
+ hide_context_entries(menu, items, disabled_items);
+}
///----------------------------------------------------------------------------
/// LLTaskInvFVBridge impl
@@ -1307,6 +1418,11 @@ LLTaskInvFVBridge* LLTaskInvFVBridge::createObjectBridge(LLPanelObjectInventory*
object->getUUID(),
object->getName());
break;
+ case LLAssetType::AT_MESH:
+ new_bridge = new LLTaskMeshBridge(panel,
+ object->getUUID(),
+ object->getName());
+ break;
default:
llinfos << "Unhandled inventory type (llassetstorage.h): "
<< (S32)type << llendl;
diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp
index b52f33ec3b..e3a7b749ea 100644
--- a/indra/newview/llpanelpeople.cpp
+++ b/indra/newview/llpanelpeople.cpp
@@ -158,9 +158,8 @@ protected:
const LLVector3d& me_pos = gAgent.getPositionGlobal();
const LLVector3d& item1_pos = mAvatarsPositions.find(item1->getAvatarId())->second;
const LLVector3d& item2_pos = mAvatarsPositions.find(item2->getAvatarId())->second;
- F32 dist1 = dist_vec(item1_pos, me_pos);
- F32 dist2 = dist_vec(item2_pos, me_pos);
- return dist1 < dist2;
+
+ return dist_vec_squared(item1_pos, me_pos) < dist_vec_squared(item2_pos, me_pos);
}
private:
id_to_pos_map_t mAvatarsPositions;
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/llpanelplaces.cpp b/indra/newview/llpanelplaces.cpp
index 00ac34efa5..46262832dc 100644
--- a/indra/newview/llpanelplaces.cpp
+++ b/indra/newview/llpanelplaces.cpp
@@ -91,11 +91,18 @@ public:
LLParcelHandler() : LLCommandHandler("parcel", UNTRUSTED_THROTTLE) { }
bool handle(const LLSD& params, const LLSD& query_map,
LLMediaCtrl* web)
- {
+ {
if (params.size() < 2)
{
return false;
}
+
+ if (!LLUI::sSettingGroups["config"]->getBOOL("EnablePlaceProfile"))
+ {
+ LLNotificationsUtil::add("NoPlaceInfo", LLSD(), LLSD(), std::string("SwitchToStandardSkinAndQuit"));
+ return true;
+ }
+
LLUUID parcel_id;
if (!parcel_id.set(params[0], FALSE))
{
diff --git a/indra/newview/llpanelprimmediacontrols.cpp b/indra/newview/llpanelprimmediacontrols.cpp
index 82ff6c3487..933b40ec79 100644
--- a/indra/newview/llpanelprimmediacontrols.cpp
+++ b/indra/newview/llpanelprimmediacontrols.cpp
@@ -61,6 +61,7 @@
#include "llwindow.h"
#include "llwindowshade.h"
#include "llfloatertools.h" // to enable hide if build tools are up
+#include "llvector4a.h"
// Functions pulled from pipeline.cpp
glh::matrix4f glh_get_current_modelview();
@@ -577,7 +578,9 @@ void LLPanelPrimMediaControls::updateShape()
{
const LLVolumeFace& vf = volume->getVolumeFace(mTargetObjectFace);
- const LLVector3* ext = vf.mExtents;
+ LLVector3 ext[2];
+ ext[0].set(vf.mExtents[0].getF32ptr());
+ ext[1].set(vf.mExtents[1].getF32ptr());
LLVector3 center = (ext[0]+ext[1])*0.5f;
LLVector3 size = (ext[1]-ext[0])*0.5f;
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/llpanelvoicedevicesettings.cpp b/indra/newview/llpanelvoicedevicesettings.cpp
index aef870d352..4a80bbbe5e 100644
--- a/indra/newview/llpanelvoicedevicesettings.cpp
+++ b/indra/newview/llpanelvoicedevicesettings.cpp
@@ -51,6 +51,7 @@ LLPanelVoiceDeviceSettings::LLPanelVoiceDeviceSettings()
mInputDevice = gSavedSettings.getString("VoiceInputAudioDevice");
mOutputDevice = gSavedSettings.getString("VoiceOutputAudioDevice");
mDevicesUpdated = FALSE;
+ mUseTuningMode = true;
// grab "live" mic volume level
mMicVolume = gSavedSettings.getF32("AudioLevelMic");
@@ -96,7 +97,7 @@ void LLPanelVoiceDeviceSettings::draw()
// let user know that volume indicator is not yet available
bool is_in_tuning_mode = LLVoiceClient::getInstance()->inTuningMode();
- getChildView("wait_text")->setVisible( !is_in_tuning_mode);
+ getChildView("wait_text")->setVisible( !is_in_tuning_mode && mUseTuningMode);
LLPanel::draw();
@@ -190,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.
@@ -206,6 +221,7 @@ void LLPanelVoiceDeviceSettings::refresh()
mCtrlOutputDevices->add( mOutputDevice, ADD_BOTTOM );
mCtrlOutputDevices->setSimple(mOutputDevice);
}
+ mDevicesUpdated = FALSE;
}
else if (!mDevicesUpdated)
{
@@ -220,23 +236,7 @@ void LLPanelVoiceDeviceSettings::refresh()
iter != LLVoiceClient::getInstance()->getCaptureDevices().end();
iter++)
{
- // Lets try to localize some system device names. EXT-8375
- std::string device_name = *iter;
- LLStringUtil::toLower(device_name); //compare in low case
- if ("default system device" == device_name)
- {
- device_name = getString(device_name);
- }
- else if ("no device" == device_name)
- {
- device_name = getString(device_name);
- }
- else
- {
- // restore original value
- device_name = *iter;
- }
- mCtrlInputDevices->add(device_name, ADD_BOTTOM );
+ mCtrlInputDevices->add( *iter, ADD_BOTTOM );
}
if(!mCtrlInputDevices->setSimple(mInputDevice))
@@ -253,23 +253,7 @@ void LLPanelVoiceDeviceSettings::refresh()
for(iter= LLVoiceClient::getInstance()->getRenderDevices().begin();
iter != LLVoiceClient::getInstance()->getRenderDevices().end(); iter++)
{
- // Lets try to localize some system device names. EXT-8375
- std::string device_name = *iter;
- LLStringUtil::toLower(device_name); //compare in low case
- if ("default system device" == device_name)
- {
- device_name = getString(device_name);
- }
- else if ("no device" == device_name)
- {
- device_name = getString(device_name);
- }
- else
- {
- // restore original value
- device_name = *iter;
- }
- mCtrlOutputDevices->add(device_name, ADD_BOTTOM );
+ mCtrlOutputDevices->add( *iter, ADD_BOTTOM );
}
if(!mCtrlOutputDevices->setSimple(mOutputDevice))
@@ -292,14 +276,20 @@ void LLPanelVoiceDeviceSettings::initialize()
LLVoiceClient::getInstance()->refreshDeviceLists();
// put voice client in "tuning" mode
- LLVoiceClient::getInstance()->tuningStart();
- LLVoiceChannel::suspend();
+ if (mUseTuningMode)
+ {
+ LLVoiceClient::getInstance()->tuningStart();
+ LLVoiceChannel::suspend();
+ }
}
void LLPanelVoiceDeviceSettings::cleanup()
{
- LLVoiceClient::getInstance()->tuningStop();
- LLVoiceChannel::resume();
+ if (mUseTuningMode)
+ {
+ LLVoiceClient::getInstance()->tuningStop();
+ LLVoiceChannel::resume();
+ }
}
void LLPanelVoiceDeviceSettings::onCommitInputDevice()
@@ -316,6 +306,6 @@ void LLPanelVoiceDeviceSettings::onCommitOutputDevice()
if(LLVoiceClient::getInstance())
{
LLVoiceClient::getInstance()->setRenderDevice(
- getChild<LLComboBox>("voice_input_device")->getValue().asString());
+ getChild<LLComboBox>("voice_output_device")->getValue().asString());
}
}
diff --git a/indra/newview/llpanelvoicedevicesettings.h b/indra/newview/llpanelvoicedevicesettings.h
index 636b8b9948..d09476d469 100644
--- a/indra/newview/llpanelvoicedevicesettings.h
+++ b/indra/newview/llpanelvoicedevicesettings.h
@@ -45,6 +45,8 @@ public:
void cleanup();
/*virtual*/ void handleVisibilityChange ( BOOL new_visibility );
+
+ void setUseTuningMode(bool use) { mUseTuningMode = use; };
protected:
void onCommitInputDevice();
@@ -56,6 +58,7 @@ protected:
class LLComboBox *mCtrlInputDevices;
class LLComboBox *mCtrlOutputDevices;
BOOL mDevicesUpdated;
+ bool mUseTuningMode;
};
#endif // LL_LLPANELVOICEDEVICESETTINGS_H
diff --git a/indra/newview/llpanelvolume.cpp b/indra/newview/llpanelvolume.cpp
index 065c4d0b92..7839cdd811 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"
@@ -71,6 +72,11 @@
#include "lldrawpool.h"
#include "lluictrlfactory.h"
+// For mesh physics
+#include "llagent.h"
+#include "llviewercontrol.h"
+#include "llmeshrepository.h"
+
// "Features" Tab
BOOL LLPanelVolume::postBuild()
@@ -129,6 +135,57 @@ BOOL LLPanelVolume::postBuild()
getChild<LLUICtrl>("Light Ambiance")->setValidateBeforeCommit( precommitValidate);
}
+ // PHYSICS Parameters
+ {
+ // PhysicsShapeType combobox
+ mComboPhysicsShapeType = getChild<LLComboBox>("Physics Shape Type Combo Ctrl");
+ mComboPhysicsShapeType->setCommitCallback(boost::bind(&LLPanelVolume::sendPhysicsShapeType, this, _1, mComboPhysicsShapeType));
+
+ // PhysicsGravity
+ mSpinPhysicsGravity = getChild<LLSpinCtrl>("Physics Gravity");
+ mSpinPhysicsGravity->setCommitCallback(boost::bind(&LLPanelVolume::sendPhysicsGravity, this, _1, mSpinPhysicsGravity));
+
+ // PhysicsFriction
+ mSpinPhysicsFriction = getChild<LLSpinCtrl>("Physics Friction");
+ mSpinPhysicsFriction->setCommitCallback(boost::bind(&LLPanelVolume::sendPhysicsFriction, this, _1, mSpinPhysicsFriction));
+
+ // PhysicsDensity
+ mSpinPhysicsDensity = getChild<LLSpinCtrl>("Physics Density");
+ mSpinPhysicsDensity->setCommitCallback(boost::bind(&LLPanelVolume::sendPhysicsDensity, this, _1, mSpinPhysicsDensity));
+
+ // PhysicsRestitution
+ 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();
@@ -136,7 +193,8 @@ BOOL LLPanelVolume::postBuild()
}
LLPanelVolume::LLPanelVolume()
- : LLPanel()
+ : LLPanel(),
+ mComboMaterialItemCount(0)
{
setMouseOpaque(FALSE);
@@ -351,6 +409,94 @@ 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());
+ mSpinPhysicsGravity->setEnabled(editable);
+
+ mSpinPhysicsFriction->set(objectp->getPhysicsFriction());
+ mSpinPhysicsFriction->setEnabled(editable);
+
+ mSpinPhysicsDensity->set(objectp->getPhysicsDensity());
+ mSpinPhysicsDensity->setEnabled(editable);
+
+ mSpinPhysicsRestitution->set(objectp->getPhysicsRestitution());
+ mSpinPhysicsRestitution->setEnabled(editable);
+
+ // update the physics shape combo to include allowed physics shapes
+ mComboPhysicsShapeType->removeall();
+ mComboPhysicsShapeType->add(getString("None"), LLSD(1));
+
+ BOOL isMesh = FALSE;
+ LLSculptParams *sculpt_params = (LLSculptParams *)objectp->getParameterEntry(LLNetworkData::PARAMS_SCULPT);
+ if (sculpt_params)
+ {
+ U8 sculpt_type = sculpt_params->getSculptType();
+ U8 sculpt_stitching = sculpt_type & LL_SCULPT_TYPE_MASK;
+ isMesh = (sculpt_stitching == LL_SCULPT_TYPE_MESH);
+ }
+
+ if(isMesh && objectp)
+ {
+ const LLVolumeParams &volume_params = objectp->getVolume()->getParams();
+ LLUUID mesh_id = volume_params.getSculptID();
+ if(gMeshRepo.hasPhysicsShape(mesh_id))
+ {
+ // if a mesh contains an uploaded or decomposed physics mesh,
+ // allow 'Prim'
+ mComboPhysicsShapeType->add(getString("Prim"), LLSD(0));
+ }
+ }
+ else
+ {
+ // simple prims always allow physics shape prim
+ mComboPhysicsShapeType->add(getString("Prim"), LLSD(0));
+ }
+
+ mComboPhysicsShapeType->add(getString("Convex Hull"), LLSD(2));
+ mComboPhysicsShapeType->setValue(LLSD(objectp->getPhysicsShapeType()));
+ mComboPhysicsShapeType->setEnabled(editable);
+
mObject = objectp;
mRootObject = root_objectp;
}
@@ -384,6 +530,17 @@ 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() &&
+ !gAgent.getRegion()->getCapability("ObjectAdd").empty();
+
+ getChildView("label physicsshapetype")->setVisible(enable_mesh);
+ getChildView("Physics Shape Type Combo Ctrl")->setVisible(enable_mesh);
+ getChildView("Physics Gravity")->setVisible(enable_mesh);
+ getChildView("Physics Friction")->setVisible(enable_mesh);
+ getChildView("Physics Density")->setVisible(enable_mesh);
+ getChildView("Physics Restitution")->setVisible(enable_mesh);
}
@@ -430,6 +587,13 @@ void LLPanelVolume::clearCtrls()
getChildView("FlexForceX")->setEnabled(false);
getChildView("FlexForceY")->setEnabled(false);
getChildView("FlexForceZ")->setEnabled(false);
+
+ mSpinPhysicsGravity->setEnabled(FALSE);
+ mSpinPhysicsFriction->setEnabled(FALSE);
+ mSpinPhysicsDensity->setEnabled(FALSE);
+ mSpinPhysicsRestitution->setEnabled(FALSE);
+
+ mComboMaterial->setEnabled( FALSE );
}
//
@@ -482,6 +646,48 @@ void LLPanelVolume::sendIsFlexible()
llinfos << "update flexible sent" << llendl;
}
+void LLPanelVolume::sendPhysicsShapeType(LLUICtrl* ctrl, void* userdata)
+{
+ U8 type = ctrl->getValue().asInteger();
+ LLSelectMgr::getInstance()->selectionSetPhysicsType(type);
+
+ refreshCost();
+}
+
+void LLPanelVolume::sendPhysicsGravity(LLUICtrl* ctrl, void* userdata)
+{
+ F32 val = ctrl->getValue().asReal();
+ LLSelectMgr::getInstance()->selectionSetGravity(val);
+}
+
+void LLPanelVolume::sendPhysicsFriction(LLUICtrl* ctrl, void* userdata)
+{
+ F32 val = ctrl->getValue().asReal();
+ LLSelectMgr::getInstance()->selectionSetFriction(val);
+}
+
+void LLPanelVolume::sendPhysicsRestitution(LLUICtrl* ctrl, void* userdata)
+{
+ F32 val = ctrl->getValue().asReal();
+ LLSelectMgr::getInstance()->selectionSetRestitution(val);
+}
+
+void LLPanelVolume::sendPhysicsDensity(LLUICtrl* ctrl, void* userdata)
+{
+ F32 val = ctrl->getValue().asReal();
+ LLSelectMgr::getInstance()->selectionSetDensity(val);
+}
+
+void LLPanelVolume::refreshCost()
+{
+ LLViewerObject* obj = LLSelectMgr::getInstance()->getSelection()->getFirstObject();
+
+ if (obj)
+ {
+ obj->getObjectCost();
+ }
+}
+
void LLPanelVolume::onLightCancelColor(const LLSD& data)
{
LLColorSwatchCtrl* LightColorSwatch = getChild<LLColorSwatchCtrl>("colorswatch");
@@ -540,6 +746,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 90a2abda25..0ef47db0d9 100644
--- a/indra/newview/llpanelvolume.h
+++ b/indra/newview/llpanelvolume.h
@@ -63,6 +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);
@@ -73,8 +75,15 @@ public:
protected:
void getState();
+ void refreshCost();
protected:
+ void sendPhysicsShapeType(LLUICtrl* ctrl, void* userdata);
+ void sendPhysicsGravity(LLUICtrl* ctrl, void* userdata);
+ void sendPhysicsFriction(LLUICtrl* ctrl, void* userdata);
+ void sendPhysicsRestitution(LLUICtrl* ctrl, void* userdata);
+ void sendPhysicsDensity(LLUICtrl* ctrl, void* userdata);
+
/*
LLTextBox* mLabelSelectSingleMessage;
// Light
@@ -95,10 +104,20 @@ protected:
LLSpinCtrl* mSpinForce[3];
*/
+ S32 mComboMaterialItemCount;
+ LLComboBox* mComboMaterial;
+
+
LLColor4 mLightSavedColor;
LLUUID mLightSavedTexture;
LLPointer<LLViewerObject> mObject;
LLPointer<LLViewerObject> mRootObject;
+
+ LLComboBox* mComboPhysicsShapeType;
+ LLSpinCtrl* mSpinPhysicsGravity;
+ LLSpinCtrl* mSpinPhysicsFriction;
+ LLSpinCtrl* mSpinPhysicsDensity;
+ LLSpinCtrl* mSpinPhysicsRestitution;
};
#endif
diff --git a/indra/newview/llphysicsmotion.cpp b/indra/newview/llphysicsmotion.cpp
index 968e62a8c3..e124916c48 100644
--- a/indra/newview/llphysicsmotion.cpp
+++ b/indra/newview/llphysicsmotion.cpp
@@ -43,7 +43,8 @@
typedef std::map<std::string, std::string> controller_map_t;
typedef std::map<std::string, F32> default_controller_map_t;
-#define MIN_REQUIRED_PIXEL_AREA_BREAST_MOTION 0.f;
+#define MIN_REQUIRED_PIXEL_AREA_AVATAR_PHYSICS_MOTION 0.f
+#define TIME_ITERATION_STEP 0.1f
inline F64 llsgn(const F64 a)
{
@@ -121,12 +122,12 @@ protected:
return mCharacter->getVisualParamWeight(param_name.c_str());
}
void setParamValue(LLViewerVisualParam *param,
- const F32 new_value_local);
+ const F32 new_value_local,
+ F32 behavior_maxeffect);
F32 toLocal(const LLVector3 &world);
- F32 calculateVelocity_local(const F32 time_delta);
- F32 calculateAcceleration_local(F32 velocity_local,
- const F32 time_delta);
+ F32 calculateVelocity_local();
+ F32 calculateAcceleration_local(F32 velocity_local);
private:
const std::string mParamDriverName;
const std::string mParamControllerName;
@@ -363,7 +364,7 @@ void LLPhysicsMotionController::addMotion(LLPhysicsMotion *motion)
F32 LLPhysicsMotionController::getMinPixelArea()
{
- return MIN_REQUIRED_PIXEL_AREA_BREAST_MOTION;
+ return MIN_REQUIRED_PIXEL_AREA_AVATAR_PHYSICS_MOTION;
}
// Local space means "parameter space".
@@ -377,19 +378,20 @@ F32 LLPhysicsMotion::toLocal(const LLVector3 &world)
return world * dir_world;
}
-F32 LLPhysicsMotion::calculateVelocity_local(const F32 time_delta)
+F32 LLPhysicsMotion::calculateVelocity_local()
{
+ const F32 world_to_model_scale = 100.0f;
LLJoint *joint = mJointState->getJoint();
const LLVector3 position_world = joint->getWorldPosition();
const LLQuaternion rotation_world = joint->getWorldRotation();
const LLVector3 last_position_world = mPosition_world;
- const LLVector3 velocity_world = (position_world-last_position_world) / time_delta;
+ const LLVector3 positionchange_world = (position_world-last_position_world) * world_to_model_scale;
+ const LLVector3 velocity_world = positionchange_world;
const F32 velocity_local = toLocal(velocity_world);
return velocity_local;
}
-F32 LLPhysicsMotion::calculateAcceleration_local(const F32 velocity_local,
- const F32 time_delta)
+F32 LLPhysicsMotion::calculateAcceleration_local(const F32 velocity_local)
{
// const F32 smoothing = getParamValue("Smoothing");
static const F32 smoothing = 3.0f; // Removed smoothing param since it's probably not necessary
@@ -445,7 +447,15 @@ BOOL LLPhysicsMotion::onUpdate(F32 time)
//
const F32 time_delta = time - mLastTime;
- if (time_delta > 3.0 || time_delta <= 0.01)
+
+ // Don't update too frequently, to avoid precision errors from small time slices.
+ if (time_delta <= .01)
+ {
+ return FALSE;
+ }
+
+ // If less than 1FPS, we don't want to be spending time updating physics at all.
+ if (time_delta > 1.0)
{
mLastTime = time;
return FALSE;
@@ -467,204 +477,207 @@ BOOL LLPhysicsMotion::onUpdate(F32 time)
const F32 behavior_gain = getParamValue("Gain");
const F32 behavior_damping = getParamValue("Damping");
const F32 behavior_drag = getParamValue("Drag");
- const BOOL physics_test = gSavedSettings.getBOOL("AvatarPhysicsTest") && gAgent.isGodlike();
+ const BOOL physics_test = FALSE; // Enable this to simulate bouncing on all parts.
F32 behavior_maxeffect = getParamValue("MaxEffect");
if (physics_test)
behavior_maxeffect = 1.0f;
- // Maximum effect is [0,1] range.
- const F32 min_val = 0.5f-behavior_maxeffect/2.0;
- const F32 max_val = 0.5f+behavior_maxeffect/2.0;
-
- // mPositon_local should be in normalized 0,1 range already. Just making sure...
- F32 position_current_local = llclamp(mPosition_local,
- 0.0f,
- 1.0f);
-
- // Normalize the param position to be from [0,1].
- // We have to use normalized values because there may be more than one driven param,
- // and each of these driven params may have its own range.
- // This means we'll do all our calculations in normalized [0,1] local coordinates.
- F32 position_user_local = mParamDriver->getWeight();
- position_user_local = (position_user_local - mParamDriver->getMinWeight()) / (mParamDriver->getMaxWeight() - mParamDriver->getMinWeight());
-
- // If the effect is turned off then don't process unless we need one more update
- // to set the position to the default (i.e. user) position.
- if ((behavior_maxeffect == 0) && (position_current_local == position_user_local))
- {
- return FALSE;
- }
- //
- // End parameters and settings
- ////////////////////////////////////////////////////////////////////////////////
-
-
- ////////////////////////////////////////////////////////////////////////////////
- // Calculate velocity and acceleration in parameter space.
- //
+ // Normalize the param position to be from [0,1].
+ // We have to use normalized values because there may be more than one driven param,
+ // and each of these driven params may have its own range.
+ // This means we'll do all our calculations in normalized [0,1] local coordinates.
+ const F32 position_user_local = (mParamDriver->getWeight() - mParamDriver->getMinWeight()) / (mParamDriver->getMaxWeight() - mParamDriver->getMinWeight());
+
+ //
+ // End parameters and settings
+ ////////////////////////////////////////////////////////////////////////////////
+
+
+ ////////////////////////////////////////////////////////////////////////////////
+ // Calculate velocity and acceleration in parameter space.
+ //
- const F32 velocity_joint_local = calculateVelocity_local(time_delta);
- const F32 acceleration_joint_local = calculateAcceleration_local(velocity_joint_local, time_delta);
-
- //
- // End velocity and acceleration
- ////////////////////////////////////////////////////////////////////////////////
-
-
- ////////////////////////////////////////////////////////////////////////////////
- // Calculate the total force
- //
-
- // Spring force is a restoring force towards the original user-set breast position.
- // F = kx
- const F32 spring_length = position_current_local - position_user_local;
- const F32 force_spring = -spring_length * behavior_spring;
-
- // Acceleration is the force that comes from the change in velocity of the torso.
- // F = ma
- const F32 force_accel = behavior_gain * (acceleration_joint_local * behavior_mass);
-
- // Gravity always points downward in world space.
- // F = mg
- const LLVector3 gravity_world(0,0,1);
- const F32 force_gravity = behavior_gain * (toLocal(gravity_world) * behavior_gravity * behavior_mass);
+ //const F32 velocity_joint_local = calculateVelocity_local(time_iteration_step);
+ const F32 velocity_joint_local = calculateVelocity_local();
+ const F32 acceleration_joint_local = calculateAcceleration_local(velocity_joint_local);
+
+ //
+ // End velocity and acceleration
+ ////////////////////////////////////////////////////////////////////////////////
+
+ BOOL update_visuals = FALSE;
+
+ // Break up the physics into a bunch of iterations so that differing framerates will show
+ // roughly the same behavior.
+ for (F32 time_iteration = 0; time_iteration <= time_delta; time_iteration += TIME_ITERATION_STEP)
+ {
+ F32 time_iteration_step = TIME_ITERATION_STEP;
+ if (time_iteration + TIME_ITERATION_STEP > time_delta)
+ {
+ time_iteration_step = time_delta-time_iteration;
+ }
+
+ // mPositon_local should be in normalized 0,1 range already. Just making sure...
+ const F32 position_current_local = llclamp(mPosition_local,
+ 0.0f,
+ 1.0f);
+ // If the effect is turned off then don't process unless we need one more update
+ // to set the position to the default (i.e. user) position.
+ if ((behavior_maxeffect == 0) && (position_current_local == position_user_local))
+ {
+ return update_visuals;
+ }
+
+ ////////////////////////////////////////////////////////////////////////////////
+ // Calculate the total force
+ //
+
+ // Spring force is a restoring force towards the original user-set breast position.
+ // F = kx
+ const F32 spring_length = position_current_local - position_user_local;
+ const F32 force_spring = -spring_length * behavior_spring;
+
+ // Acceleration is the force that comes from the change in velocity of the torso.
+ // F = ma
+ const F32 force_accel = behavior_gain * (acceleration_joint_local * behavior_mass);
+
+ // Gravity always points downward in world space.
+ // F = mg
+ const LLVector3 gravity_world(0,0,1);
+ const F32 force_gravity = (toLocal(gravity_world) * behavior_gravity * behavior_mass);
- // Damping is a restoring force that opposes the current velocity.
- // F = -kv
- const F32 force_damping = -behavior_damping * mVelocity_local;
+ // Damping is a restoring force that opposes the current velocity.
+ // F = -kv
+ const F32 force_damping = -behavior_damping * mVelocity_local;
- // Drag is a force imparted by velocity (intuitively it is similar to wind resistance)
- // F = .5kv^2
- const F32 force_drag = .5*behavior_drag*velocity_joint_local*velocity_joint_local*llsgn(velocity_joint_local);
+ // Drag is a force imparted by velocity (intuitively it is similar to wind resistance)
+ // F = .5kv^2
+ const F32 force_drag = .5*behavior_drag*velocity_joint_local*velocity_joint_local*llsgn(velocity_joint_local);
- const F32 force_net = (force_accel +
- force_gravity +
- force_spring +
- force_damping +
- force_drag);
+ const F32 force_net = (force_accel +
+ force_gravity +
+ force_spring +
+ force_damping +
+ force_drag);
- //
- // End total force
- ////////////////////////////////////////////////////////////////////////////////
+ //
+ // End total force
+ ////////////////////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////////////////////////
- // Calculate new params
- //
-
- // Calculate the new acceleration based on the net force.
- // a = F/m
- const F32 acceleration_new_local = force_net / behavior_mass;
- static const F32 max_acceleration = 10.0f; // magic number, used to be customizable.
- F32 velocity_new_local = mVelocity_local + acceleration_new_local;
- velocity_new_local = llclamp(velocity_new_local,
- -max_acceleration, max_acceleration);
+ ////////////////////////////////////////////////////////////////////////////////
+ // Calculate new params
+ //
+
+ // Calculate the new acceleration based on the net force.
+ // a = F/m
+ const F32 acceleration_new_local = force_net / behavior_mass;
+ static const F32 max_velocity = 100.0f; // magic number, used to be customizable.
+ F32 velocity_new_local = mVelocity_local + acceleration_new_local*time_iteration_step;
+ velocity_new_local = llclamp(velocity_new_local,
+ -max_velocity, max_velocity);
- // Temporary debugging setting to cause all avatars to move, for profiling purposes.
- if (physics_test)
- {
- velocity_new_local = sin(time*4.0);
- }
- // Calculate the new parameters, or remain unchanged if max speed is 0.
- F32 position_new_local = position_current_local + velocity_new_local*time_delta;
- if (behavior_maxeffect == 0)
- position_new_local = position_user_local;
-
- // Zero out the velocity if the param is being pushed beyond its limits.
- if ((position_new_local < min_val && velocity_new_local < 0) ||
- (position_new_local > max_val && velocity_new_local > 0))
- {
- velocity_new_local = 0;
- }
-
- // Check for NaN values. A NaN value is detected if the variables doesn't equal itself.
- // If NaN, then reset everything.
- if ((mPosition_local != mPosition_local) ||
- (mVelocity_local != mVelocity_local) ||
- (position_new_local != position_new_local))
- {
- position_new_local = 0;
- position_current_local = 0;
- position_user_local = 0;
- mVelocity_local = 0;
- mVelocityJoint_local = 0;
- mAccelerationJoint_local = 0;
- mPosition_local = 0;
- mPosition_world = LLVector3(0,0,0);
- }
-
- const F32 position_new_local_clamped = llclamp(position_new_local,
- min_val,
- max_val);
-
- LLDriverParam *driver_param = dynamic_cast<LLDriverParam *>(mParamDriver);
- llassert_always(driver_param);
- if (driver_param)
- {
- // If this is one of our "hidden" driver params, then make sure it's
- // the default value.
- if ((driver_param->getGroup() != VISUAL_PARAM_GROUP_TWEAKABLE) &&
- (driver_param->getGroup() != VISUAL_PARAM_GROUP_TWEAKABLE_NO_TRANSMIT))
- {
- mCharacter->setVisualParamWeight(driver_param,
- 0,
- FALSE);
- }
- for (LLDriverParam::entry_list_t::iterator iter = driver_param->mDriven.begin();
- iter != driver_param->mDriven.end();
- ++iter)
- {
- LLDrivenEntry &entry = (*iter);
- LLViewerVisualParam *driven_param = entry.mParam;
- setParamValue(driven_param,position_new_local_clamped);
- }
- }
+ // Temporary debugging setting to cause all avatars to move, for profiling purposes.
+ if (physics_test)
+ {
+ velocity_new_local = sin(time*4.0);
+ }
+ // Calculate the new parameters, or remain unchanged if max speed is 0.
+ F32 position_new_local = position_current_local + velocity_new_local*time_iteration_step;
+ if (behavior_maxeffect == 0)
+ position_new_local = position_user_local;
+
+ // Zero out the velocity if the param is being pushed beyond its limits.
+ if ((position_new_local < 0 && velocity_new_local < 0) ||
+ (position_new_local > 1 && velocity_new_local > 0))
+ {
+ velocity_new_local = 0;
+ }
+
+ // Check for NaN values. A NaN value is detected if the variables doesn't equal itself.
+ // If NaN, then reset everything.
+ if ((mPosition_local != mPosition_local) ||
+ (mVelocity_local != mVelocity_local) ||
+ (position_new_local != position_new_local))
+ {
+ position_new_local = 0;
+ mVelocity_local = 0;
+ mVelocityJoint_local = 0;
+ mAccelerationJoint_local = 0;
+ mPosition_local = 0;
+ mPosition_world = LLVector3(0,0,0);
+ }
+
+ const F32 position_new_local_clamped = llclamp(position_new_local,
+ 0.0f,
+ 1.0f);
+
+ LLDriverParam *driver_param = dynamic_cast<LLDriverParam *>(mParamDriver);
+ llassert_always(driver_param);
+ if (driver_param)
+ {
+ // If this is one of our "hidden" driver params, then make sure it's
+ // the default value.
+ if ((driver_param->getGroup() != VISUAL_PARAM_GROUP_TWEAKABLE) &&
+ (driver_param->getGroup() != VISUAL_PARAM_GROUP_TWEAKABLE_NO_TRANSMIT))
+ {
+ mCharacter->setVisualParamWeight(driver_param,
+ 0,
+ FALSE);
+ }
+ for (LLDriverParam::entry_list_t::iterator iter = driver_param->mDriven.begin();
+ iter != driver_param->mDriven.end();
+ ++iter)
+ {
+ LLDrivenEntry &entry = (*iter);
+ LLViewerVisualParam *driven_param = entry.mParam;
+ setParamValue(driven_param,position_new_local_clamped, behavior_maxeffect);
+ }
+ }
- //
- // End calculate new params
- ////////////////////////////////////////////////////////////////////////////////
+ //
+ // End calculate new params
+ ////////////////////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////////////////////////
- // Conditionally update the visual params
- //
+ ////////////////////////////////////////////////////////////////////////////////
+ // Conditionally update the visual params
+ //
- // Updating the visual params (i.e. what the user sees) is fairly expensive.
- // So only update if the params have changed enough, and also take into account
- // the graphics LOD settings.
+ // Updating the visual params (i.e. what the user sees) is fairly expensive.
+ // So only update if the params have changed enough, and also take into account
+ // the graphics LOD settings.
- BOOL update_visuals = FALSE;
-
- // For non-self, if the avatar is small enough visually, then don't update.
- const F32 area_for_max_settings = 0.0;
- const F32 area_for_min_settings = 1400.0;
- const F32 area_for_this_setting = area_for_max_settings + (area_for_min_settings-area_for_max_settings)*(1.0-lod_factor);
- const F32 pixel_area = fsqrtf(mCharacter->getPixelArea());
+ // For non-self, if the avatar is small enough visually, then don't update.
+ const F32 area_for_max_settings = 0.0;
+ const F32 area_for_min_settings = 1400.0;
+ const F32 area_for_this_setting = area_for_max_settings + (area_for_min_settings-area_for_max_settings)*(1.0-lod_factor);
+ const F32 pixel_area = sqrtf(mCharacter->getPixelArea());
- const BOOL is_self = (dynamic_cast<LLVOAvatarSelf *>(mCharacter) != NULL);
- if ((pixel_area > area_for_this_setting) || is_self)
- {
- const F32 position_diff_local = llabs(mPositionLastUpdate_local-position_new_local_clamped);
- const F32 min_delta = (1.01f-lod_factor)*0.4f;
- if (llabs(position_diff_local) > min_delta)
- {
- update_visuals = TRUE;
- mPositionLastUpdate_local = position_new_local;
- }
- }
-
- //
- // End update visual params
- ////////////////////////////////////////////////////////////////////////////////
-
- mVelocityJoint_local = velocity_joint_local;
-
- mVelocity_local = velocity_new_local;
- mAccelerationJoint_local = acceleration_joint_local;
- mPosition_local = position_new_local;
+ const BOOL is_self = (dynamic_cast<LLVOAvatarSelf *>(mCharacter) != NULL);
+ if ((pixel_area > area_for_this_setting) || is_self)
+ {
+ const F32 position_diff_local = llabs(mPositionLastUpdate_local-position_new_local_clamped);
+ const F32 min_delta = (1.0001f-lod_factor)*0.4f;
+ if (llabs(position_diff_local) > min_delta)
+ {
+ update_visuals = TRUE;
+ mPositionLastUpdate_local = position_new_local;
+ }
+ }
+
+ //
+ // End update visual params
+ ////////////////////////////////////////////////////////////////////////////////
+
+ mVelocity_local = velocity_new_local;
+ mAccelerationJoint_local = acceleration_joint_local;
+ mPosition_local = position_new_local;
+ }
+ mLastTime = time;
+ mPosition_world = joint->getWorldPosition();
+ mVelocityJoint_local = velocity_joint_local;
- mPosition_world = joint->getWorldPosition();
- mLastTime = time;
/*
// Write out debugging info into a spreadsheet.
@@ -699,12 +712,19 @@ BOOL LLPhysicsMotion::onUpdate(F32 time)
// Range of new_value_local is assumed to be [0 , 1] normalized.
void LLPhysicsMotion::setParamValue(LLViewerVisualParam *param,
- F32 new_value_normalized)
+ F32 new_value_normalized,
+ F32 behavior_maxeffect)
{
const F32 value_min_local = param->getMinWeight();
const F32 value_max_local = param->getMaxWeight();
+ const F32 min_val = 0.5f-behavior_maxeffect/2.0;
+ const F32 max_val = 0.5f+behavior_maxeffect/2.0;
- const F32 new_value_local = value_min_local + (value_max_local-value_min_local) * new_value_normalized;
+ // Scale from [0,1] to [min_val,max_val]
+ const F32 new_value_rescaled = min_val + (max_val-min_val) * new_value_normalized;
+
+ // Scale from [0,1] to [value_min_local,value_max_local]
+ const F32 new_value_local = value_min_local + (value_max_local-value_min_local) * new_value_rescaled;
mCharacter->setVisualParamWeight(param,
new_value_local,
diff --git a/indra/newview/llphysicsshapebuilderutil.cpp b/indra/newview/llphysicsshapebuilderutil.cpp
new file mode 100644
index 0000000000..5bfe5c9941
--- /dev/null
+++ b/indra/newview/llphysicsshapebuilderutil.cpp
@@ -0,0 +1,210 @@
+/**
+ * @file llphysicsshapebuilder.cpp
+ * @brief Generic system to convert LL(Physics)VolumeParams to physics shapes
+ *
+ * $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 "llphysicsshapebuilderutil.h"
+
+/* static */
+void LLPhysicsShapeBuilderUtil::determinePhysicsShape( const LLPhysicsVolumeParams& volume_params, const LLVector3& scale, PhysicsShapeSpecification& specOut )
+{
+ const LLProfileParams& profile_params = volume_params.getProfileParams();
+ const LLPathParams& path_params = volume_params.getPathParams();
+
+ specOut.mScale = scale;
+
+ const F32 avgScale = ( scale[VX] + scale[VY] + scale[VZ] )/3.0f;
+
+ // count the scale elements that are small
+ S32 min_size_counts = 0;
+ for (S32 i = 0; i < 3; ++i)
+ {
+ if (scale[i] < SHAPE_BUILDER_CONVEXIFICATION_SIZE)
+ {
+ ++min_size_counts;
+ }
+ }
+
+ const bool profile_complete = ( profile_params.getBegin() <= SHAPE_BUILDER_IMPLICIT_THRESHOLD_PATH_CUT/avgScale ) &&
+ ( profile_params.getEnd() >= (1.0f - SHAPE_BUILDER_IMPLICIT_THRESHOLD_PATH_CUT/avgScale) );
+
+ const bool path_complete = ( path_params.getBegin() <= SHAPE_BUILDER_IMPLICIT_THRESHOLD_PATH_CUT/avgScale ) &&
+ ( path_params.getEnd() >= (1.0f - SHAPE_BUILDER_IMPLICIT_THRESHOLD_PATH_CUT/avgScale) );
+
+ const bool simple_params = ( volume_params.getHollow() <= SHAPE_BUILDER_IMPLICIT_THRESHOLD_HOLLOW/avgScale )
+ && ( fabs(path_params.getShearX()) <= SHAPE_BUILDER_IMPLICIT_THRESHOLD_SHEAR/avgScale )
+ && ( fabs(path_params.getShearY()) <= SHAPE_BUILDER_IMPLICIT_THRESHOLD_SHEAR/avgScale )
+ && ( !volume_params.isMeshSculpt() && !volume_params.isSculpt() );
+
+ if (simple_params && profile_complete)
+ {
+ // Try to create an implicit shape or convexified
+ bool no_taper = ( fabs(path_params.getScaleX() - 1.0f) <= SHAPE_BUILDER_IMPLICIT_THRESHOLD_TAPER/avgScale )
+ && ( fabs(path_params.getScaleY() - 1.0f) <= SHAPE_BUILDER_IMPLICIT_THRESHOLD_TAPER/avgScale );
+
+ bool no_twist = ( fabs(path_params.getTwistBegin()) <= SHAPE_BUILDER_IMPLICIT_THRESHOLD_TWIST/avgScale )
+ && ( fabs(path_params.getTwistEnd()) <= SHAPE_BUILDER_IMPLICIT_THRESHOLD_TWIST/avgScale);
+
+ // Box
+ if(
+ ( profile_params.getCurveType() == LL_PCODE_PROFILE_SQUARE )
+ && ( path_params.getCurveType() == LL_PCODE_PATH_LINE )
+ && no_taper
+ && no_twist
+ )
+ {
+ specOut.mType = PhysicsShapeSpecification::BOX;
+ if ( path_complete )
+ {
+ return;
+ }
+ else
+ {
+ // Side lengths
+ specOut.mScale[VX] = llmax( scale[VX], SHAPE_BUILDER_MIN_GEOMETRY_SIZE );
+ specOut.mScale[VY] = llmax( scale[VY], SHAPE_BUILDER_MIN_GEOMETRY_SIZE );
+ specOut.mScale[VZ] = llmax( scale[VZ] * (path_params.getEnd() - path_params.getBegin()), SHAPE_BUILDER_MIN_GEOMETRY_SIZE );
+
+ specOut.mCenter.set( 0.f, 0.f, 0.5f * scale[VZ] * ( path_params.getEnd() + path_params.getBegin() - 1.0f ) );
+ return;
+ }
+ }
+
+ // Sphere
+ if( path_complete
+ && ( profile_params.getCurveType() == LL_PCODE_PROFILE_CIRCLE_HALF )
+ && ( path_params.getCurveType() == LL_PCODE_PATH_CIRCLE )
+ && ( fabs(volume_params.getTaper()) <= SHAPE_BUILDER_IMPLICIT_THRESHOLD_TAPER/avgScale )
+ && no_twist
+ )
+ {
+ if ( ( scale[VX] == scale[VZ] )
+ && ( scale[VY] == scale[VZ] ) )
+ {
+ // perfect sphere
+ specOut.mType = PhysicsShapeSpecification::SPHERE;
+ specOut.mScale = scale;
+ return;
+ }
+ else if (min_size_counts > 1)
+ {
+ // small or narrow sphere -- we can boxify
+ for (S32 i=0; i<3; ++i)
+ {
+ if (specOut.mScale[i] < SHAPE_BUILDER_CONVEXIFICATION_SIZE)
+ {
+ // reduce each small dimension size to split the approximation errors
+ specOut.mScale[i] *= 0.75f;
+ }
+ }
+ specOut.mType = PhysicsShapeSpecification::BOX;
+ return;
+ }
+ }
+
+ // Cylinder
+ if( (scale[VX] == scale[VY])
+ && ( profile_params.getCurveType() == LL_PCODE_PROFILE_CIRCLE )
+ && ( path_params.getCurveType() == LL_PCODE_PATH_LINE )
+ && ( volume_params.getBeginS() <= SHAPE_BUILDER_IMPLICIT_THRESHOLD_PATH_CUT/avgScale )
+ && ( volume_params.getEndS() >= (1.0f - SHAPE_BUILDER_IMPLICIT_THRESHOLD_PATH_CUT/avgScale) )
+ && no_taper
+ )
+ {
+ if (min_size_counts > 1)
+ {
+ // small or narrow sphere -- we can boxify
+ for (S32 i=0; i<3; ++i)
+ {
+ if (specOut.mScale[i] < SHAPE_BUILDER_CONVEXIFICATION_SIZE)
+ {
+ // reduce each small dimension size to split the approximation errors
+ specOut.mScale[i] *= 0.75f;
+ }
+ }
+
+ specOut.mType = PhysicsShapeSpecification::BOX;
+ }
+ else
+ {
+ specOut.mType = PhysicsShapeSpecification::CYLINDER;
+ F32 length = (volume_params.getPathParams().getEnd() - volume_params.getPathParams().getBegin()) * scale[VZ];
+
+ specOut.mScale[VY] = specOut.mScale[VX];
+ specOut.mScale[VZ] = length;
+ // The minus one below fixes the fact that begin and end range from 0 to 1 not -1 to 1.
+ specOut.mCenter.set( 0.f, 0.f, 0.5f * (volume_params.getPathParams().getBegin() + volume_params.getPathParams().getEnd() - 1.f) * scale[VZ] );
+ }
+
+ return;
+ }
+ }
+
+ if ( (min_size_counts == 3 )
+ // Possible dead code here--who wants to take it out?
+ || (path_complete
+ && profile_complete
+ && ( path_params.getCurveType() == LL_PCODE_PATH_LINE )
+ && (min_size_counts > 1 ) )
+ )
+ {
+ // it isn't simple but
+ // we might be able to convexify this shape if the path and profile are complete
+ // or the path is linear and both path and profile are complete --> we can boxify it
+ specOut.mType = PhysicsShapeSpecification::BOX;
+ specOut.mScale = scale;
+ return;
+ }
+
+ // Special case for big, very thin objects - bump the small dimensions up to the COLLISION_TOLERANCE
+ if (min_size_counts == 1 // One dimension is small
+ && avgScale > 3.f) // ... but others are fairly large
+ {
+ for (S32 i = 0; i < 3; ++i)
+ {
+ specOut.mScale[i] = llmax( specOut.mScale[i], COLLISION_TOLERANCE );
+ }
+ }
+
+ if ( volume_params.shouldForceConvex() )
+ {
+ specOut.mType = PhysicsShapeSpecification::USER_CONVEX;
+ }
+ // Make a simpler convex shape if we can.
+ else if (volume_params.isConvex() // is convex
+ || min_size_counts > 1 ) // two or more small dimensions
+ {
+ specOut.mType = PhysicsShapeSpecification::PRIM_CONVEX;
+ }
+ else if ( volume_params.isSculpt() ) // Is a sculpt of any kind (mesh or legacy)
+ {
+ specOut.mType = volume_params.isMeshSculpt() ? PhysicsShapeSpecification::USER_MESH : PhysicsShapeSpecification::SCULPT;
+ }
+ else // Resort to mesh
+ {
+ specOut.mType = PhysicsShapeSpecification::PRIM_MESH;
+ }
+}
diff --git a/indra/newview/llphysicsshapebuilderutil.h b/indra/newview/llphysicsshapebuilderutil.h
new file mode 100644
index 0000000000..7dedfb05e2
--- /dev/null
+++ b/indra/newview/llphysicsshapebuilderutil.h
@@ -0,0 +1,138 @@
+/**
+ * @file llphysicsshapebuilder.h
+ * @brief Generic system to convert LL(Physics)VolumeParams to physics shapes
+ *
+ * $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_PHYSICS_SHAPE_BUILDER_H
+#define LL_PHYSICS_SHAPE_BUILDER_H
+
+#include "indra_constants.h"
+#include "llvolume.h"
+
+#define USE_SHAPE_QUANTIZATION 0
+
+#define SHAPE_BUILDER_DEFAULT_VOLUME_DETAIL 1
+
+#define SHAPE_BUILDER_IMPLICIT_THRESHOLD_HOLLOW 0.10f
+#define SHAPE_BUILDER_IMPLICIT_THRESHOLD_HOLLOW_SPHERES 0.90f
+#define SHAPE_BUILDER_IMPLICIT_THRESHOLD_PATH_CUT 0.05f
+#define SHAPE_BUILDER_IMPLICIT_THRESHOLD_TAPER 0.05f
+#define SHAPE_BUILDER_IMPLICIT_THRESHOLD_TWIST 0.09f
+#define SHAPE_BUILDER_IMPLICIT_THRESHOLD_SHEAR 0.05f
+
+const F32 SHAPE_BUILDER_ENTRY_SNAP_SCALE_BIN_SIZE = 0.15f;
+const F32 SHAPE_BUILDER_ENTRY_SNAP_PARAMETER_BIN_SIZE = 0.010f;
+const F32 SHAPE_BUILDER_CONVEXIFICATION_SIZE = 2.f * COLLISION_TOLERANCE;
+const F32 SHAPE_BUILDER_MIN_GEOMETRY_SIZE = 0.5f * COLLISION_TOLERANCE;
+
+class LLPhysicsVolumeParams : public LLVolumeParams
+{
+public:
+
+ LLPhysicsVolumeParams( const LLVolumeParams& params, bool forceConvex ) :
+ LLVolumeParams( params ),
+ mForceConvex(forceConvex) {}
+
+ bool operator==(const LLPhysicsVolumeParams &params) const
+ {
+ return ( LLVolumeParams::operator==(params) && (mForceConvex == params.mForceConvex) );
+ }
+
+ bool operator!=(const LLPhysicsVolumeParams &params) const
+ {
+ return !operator==(params);
+ }
+
+ bool operator<(const LLPhysicsVolumeParams &params) const
+ {
+ if ( LLVolumeParams::operator!=(params) )
+ {
+ return LLVolumeParams::operator<(params);
+ }
+ return (params.mForceConvex == false) && (mForceConvex == true);
+ }
+
+ bool shouldForceConvex() const { return mForceConvex; }
+
+private:
+ bool mForceConvex;
+};
+
+
+class LLPhysicsShapeBuilderUtil
+{
+public:
+
+ class PhysicsShapeSpecification
+ {
+ public:
+ enum ShapeType
+ {
+ // Primitive types
+ BOX,
+ SPHERE,
+ CYLINDER,
+
+ USER_CONVEX, // User specified they wanted the convex hull of the volume
+
+ PRIM_CONVEX, // Either a volume that is inherently convex but not a primitive type, or a shape
+ // with dimensions such that will convexify it anyway.
+
+ SCULPT, // Special case for traditional sculpts--they are the convex hull of a single particular set of volume params
+
+ USER_MESH, // A user mesh. May or may not contain a convex decomposition.
+
+ PRIM_MESH, // A non-convex volume which we have to represent accurately
+
+ INVALID
+ };
+
+ PhysicsShapeSpecification() :
+ mType( INVALID ),
+ mScale( 0.f, 0.f, 0.f ),
+ mCenter( 0.f, 0.f, 0.f ) {}
+
+ bool isConvex() { return (mType != USER_MESH && mType != PRIM_MESH && mType != INVALID); }
+ bool isMesh() { return (mType == USER_MESH) || (mType == PRIM_MESH); }
+
+ ShapeType getType() { return mType; }
+ const LLVector3& getScale() { return mScale; }
+ const LLVector3& getCenter() { return mCenter; }
+
+ private:
+ friend class LLPhysicsShapeBuilderUtil;
+
+ ShapeType mType;
+
+ // Dimensions of an AABB around the shape
+ LLVector3 mScale;
+
+ // Offset of shape from origin of primitive's reference frame
+ LLVector3 mCenter;
+ };
+
+ static void determinePhysicsShape( const LLPhysicsVolumeParams& volume_params, const LLVector3& scale, PhysicsShapeSpecification& specOut );
+};
+
+#endif //LL_PHYSICS_SHAPE_BUILDER_H
diff --git a/indra/newview/llpolymesh.cpp b/indra/newview/llpolymesh.cpp
index bacaa0cd76..450f9b2be7 100644
--- a/indra/newview/llpolymesh.cpp
+++ b/indra/newview/llpolymesh.cpp
@@ -29,7 +29,8 @@
//-----------------------------------------------------------------------------
#include "llviewerprecompiledheaders.h"
-#include "llpolymesh.h"
+#include "llfasttimer.h"
+#include "llmemory.h"
#include "llviewercontrol.h"
#include "llxmltree.h"
@@ -39,7 +40,7 @@
#include "llvolume.h"
#include "llendianswizzle.h"
-#include "llfasttimer.h"
+#include "llpolymesh.h"
#define HEADER_ASCII "Linden Mesh 1.0"
#define HEADER_BINARY "Linden Binary Mesh 1.0"
@@ -737,58 +738,52 @@ const LLVector2 &LLPolyMeshSharedData::getUVs(U32 index)
//-----------------------------------------------------------------------------
LLPolyMesh::LLPolyMesh(LLPolyMeshSharedData *shared_data, LLPolyMesh *reference_mesh)
{
- LLMemType mt(LLMemType::MTYPE_AVATAR_MESH);
-
- llassert(shared_data);
-
- mSharedData = shared_data;
- mReferenceMesh = reference_mesh;
- mAvatarp = NULL;
- mVertexData = NULL;
-
- mCurVertexCount = 0;
- mFaceIndexCount = 0;
- mFaceIndexOffset = 0;
- mFaceVertexCount = 0;
- mFaceVertexOffset = 0;
-
- if (shared_data->isLOD() && reference_mesh)
- {
- mCoords = reference_mesh->mCoords;
- mNormals = reference_mesh->mNormals;
- mScaledNormals = reference_mesh->mScaledNormals;
- mBinormals = reference_mesh->mBinormals;
- mScaledBinormals = reference_mesh->mScaledBinormals;
- mTexCoords = reference_mesh->mTexCoords;
- mClothingWeights = reference_mesh->mClothingWeights;
- }
- else
- {
-#if 1 // Allocate memory without initializing every vector
- // NOTE: This makes asusmptions about the size of LLVector[234]
- int nverts = mSharedData->mNumVertices;
- int nfloats = nverts * (3*5 + 2 + 4);
- mVertexData = new F32[nfloats];
- int offset = 0;
- mCoords = (LLVector3*)(mVertexData + offset); offset += 3*nverts;
- mNormals = (LLVector3*)(mVertexData + offset); offset += 3*nverts;
- mScaledNormals = (LLVector3*)(mVertexData + offset); offset += 3*nverts;
- mBinormals = (LLVector3*)(mVertexData + offset); offset += 3*nverts;
- mScaledBinormals = (LLVector3*)(mVertexData + offset); offset += 3*nverts;
- mTexCoords = (LLVector2*)(mVertexData + offset); offset += 2*nverts;
- mClothingWeights = (LLVector4*)(mVertexData + offset); offset += 4*nverts;
-#else
- mCoords = new LLVector3[mSharedData->mNumVertices];
- mNormals = new LLVector3[mSharedData->mNumVertices];
- mScaledNormals = new LLVector3[mSharedData->mNumVertices];
- mBinormals = new LLVector3[mSharedData->mNumVertices];
- mScaledBinormals = new LLVector3[mSharedData->mNumVertices];
- mTexCoords = new LLVector2[mSharedData->mNumVertices];
- mClothingWeights = new LLVector4[mSharedData->mNumVertices];
- memset(mClothingWeights, 0, sizeof(LLVector4) * mSharedData->mNumVertices);
-#endif
- initializeForMorph();
- }
+ LLMemType mt(LLMemType::MTYPE_AVATAR_MESH);
+
+ llassert(shared_data);
+
+ mSharedData = shared_data;
+ mReferenceMesh = reference_mesh;
+ mAvatarp = NULL;
+ mVertexData = NULL;
+
+ mCurVertexCount = 0;
+ mFaceIndexCount = 0;
+ mFaceIndexOffset = 0;
+ mFaceVertexCount = 0;
+ mFaceVertexOffset = 0;
+
+ if (shared_data->isLOD() && reference_mesh)
+ {
+ mCoords = reference_mesh->mCoords;
+ mNormals = reference_mesh->mNormals;
+ mScaledNormals = reference_mesh->mScaledNormals;
+ mBinormals = reference_mesh->mBinormals;
+ mScaledBinormals = reference_mesh->mScaledBinormals;
+ mTexCoords = reference_mesh->mTexCoords;
+ mClothingWeights = reference_mesh->mClothingWeights;
+ }
+ else
+ {
+ // Allocate memory without initializing every vector
+ // NOTE: This makes asusmptions about the size of LLVector[234]
+ int nverts = mSharedData->mNumVertices;
+ int nfloats = nverts * (2*4 + 3*3 + 2 + 4);
+ //use 16 byte aligned vertex data to make LLPolyMesh SSE friendly
+ mVertexData = (F32*) ll_aligned_malloc_16(nfloats*4);
+ int offset = 0;
+ mCoords = (LLVector4*)(mVertexData + offset); offset += 4*nverts;
+ mNormals = (LLVector4*)(mVertexData + offset); offset += 4*nverts;
+ mClothingWeights = (LLVector4*)(mVertexData + offset); offset += 4*nverts;
+ mTexCoords = (LLVector2*)(mVertexData + offset); offset += 2*nverts;
+
+ // these members don't need to be 16-byte aligned, but the first one might be
+ // read during an aligned memcpy of mTexCoords
+ mScaledNormals = (LLVector3*)(mVertexData + offset); offset += 3*nverts;
+ mBinormals = (LLVector3*)(mVertexData + offset); offset += 3*nverts;
+ mScaledBinormals = (LLVector3*)(mVertexData + offset); offset += 3*nverts;
+ initializeForMorph();
+ }
}
@@ -803,17 +798,9 @@ LLPolyMesh::~LLPolyMesh()
delete mJointRenderData[i];
mJointRenderData[i] = NULL;
}
-#if 0 // These are now allocated as one big uninitialized chunk
- delete [] mCoords;
- delete [] mNormals;
- delete [] mScaledNormals;
- delete [] mBinormals;
- delete [] mScaledBinormals;
- delete [] mClothingWeights;
- delete [] mTexCoords;
-#else
- delete [] mVertexData;
-#endif
+
+ ll_aligned_free_16(mVertexData);
+
}
@@ -919,7 +906,7 @@ void LLPolyMesh::dumpDiagInfo()
//-----------------------------------------------------------------------------
// getWritableCoords()
//-----------------------------------------------------------------------------
-LLVector3 *LLPolyMesh::getWritableCoords()
+LLVector4 *LLPolyMesh::getWritableCoords()
{
return mCoords;
}
@@ -927,7 +914,7 @@ LLVector3 *LLPolyMesh::getWritableCoords()
//-----------------------------------------------------------------------------
// getWritableNormals()
//-----------------------------------------------------------------------------
-LLVector3 *LLPolyMesh::getWritableNormals()
+LLVector4 *LLPolyMesh::getWritableNormals()
{
return mNormals;
}
@@ -979,16 +966,17 @@ LLVector3 *LLPolyMesh::getScaledBinormals()
//-----------------------------------------------------------------------------
void LLPolyMesh::initializeForMorph()
{
- if (!mSharedData)
- return;
-
- memcpy(mCoords, mSharedData->mBaseCoords, sizeof(LLVector3) * mSharedData->mNumVertices); /*Flawfinder: ignore*/
- memcpy(mNormals, mSharedData->mBaseNormals, sizeof(LLVector3) * mSharedData->mNumVertices); /*Flawfinder: ignore*/
- memcpy(mScaledNormals, mSharedData->mBaseNormals, sizeof(LLVector3) * mSharedData->mNumVertices); /*Flawfinder: ignore*/
- memcpy(mBinormals, mSharedData->mBaseBinormals, sizeof(LLVector3) * mSharedData->mNumVertices); /*Flawfinder: ignore*/
- memcpy(mScaledBinormals, mSharedData->mBaseBinormals, sizeof(LLVector3) * mSharedData->mNumVertices); /*Flawfinder: ignore*/
- memcpy(mTexCoords, mSharedData->mTexCoords, sizeof(LLVector2) * mSharedData->mNumVertices); /*Flawfinder: ignore*/
- memset(mClothingWeights, 0, sizeof(LLVector4) * mSharedData->mNumVertices);
+ for (U32 i = 0; i < mSharedData->mNumVertices; ++i)
+ {
+ mCoords[i] = LLVector4(mSharedData->mBaseCoords[i]);
+ mNormals[i] = LLVector4(mSharedData->mBaseNormals[i]);
+ }
+
+ memcpy(mScaledNormals, mSharedData->mBaseNormals, sizeof(LLVector3) * mSharedData->mNumVertices); /*Flawfinder: ignore*/
+ memcpy(mBinormals, mSharedData->mBaseBinormals, sizeof(LLVector3) * mSharedData->mNumVertices); /*Flawfinder: ignore*/
+ memcpy(mScaledBinormals, mSharedData->mBaseBinormals, sizeof(LLVector3) * mSharedData->mNumVertices); /*Flawfinder: ignore*/
+ memcpy(mTexCoords, mSharedData->mTexCoords, sizeof(LLVector2) * mSharedData->mNumVertices); /*Flawfinder: ignore*/
+ memset(mClothingWeights, 0, sizeof(LLVector4) * mSharedData->mNumVertices);
}
//-----------------------------------------------------------------------------
diff --git a/indra/newview/llpolymesh.h b/indra/newview/llpolymesh.h
index 894cd307c4..ba2bf85570 100644
--- a/indra/newview/llpolymesh.h
+++ b/indra/newview/llpolymesh.h
@@ -217,15 +217,15 @@ public:
}
// Get coords
- const LLVector3 *getCoords() const{
+ const LLVector4 *getCoords() const{
return mCoords;
}
// non const version
- LLVector3 *getWritableCoords();
+ LLVector4 *getWritableCoords();
// Get normals
- const LLVector3 *getNormals() const{
+ const LLVector4 *getNormals() const{
return mNormals;
}
@@ -247,7 +247,7 @@ public:
}
// intermediate morphed normals and output normals
- LLVector3 *getWritableNormals();
+ LLVector4 *getWritableNormals();
LLVector3 *getScaledNormals();
LLVector3 *getWritableBinormals();
@@ -341,11 +341,11 @@ protected:
// Single array of floats for allocation / deletion
F32 *mVertexData;
// deformed vertices (resulting from application of morph targets)
- LLVector3 *mCoords;
+ LLVector4 *mCoords;
// deformed normals (resulting from application of morph targets)
LLVector3 *mScaledNormals;
// output normals (after normalization)
- LLVector3 *mNormals;
+ LLVector4 *mNormals;
// deformed binormals (resulting from application of morph targets)
LLVector3 *mScaledBinormals;
// output binormals (after normalization)
diff --git a/indra/newview/llpolymorph.cpp b/indra/newview/llpolymorph.cpp
index 36f8c8d13e..cefd7df3fe 100644
--- a/indra/newview/llpolymorph.cpp
+++ b/indra/newview/llpolymorph.cpp
@@ -508,10 +508,10 @@ void LLPolyMorphTarget::apply( ESex avatar_sex )
if (delta_weight != 0.f)
{
llassert(!mMesh->isLOD());
- LLVector3 *coords = mMesh->getWritableCoords();
+ LLVector4 *coords = mMesh->getWritableCoords();
LLVector3 *scaled_normals = mMesh->getScaledNormals();
- LLVector3 *normals = mMesh->getWritableNormals();
+ LLVector4 *normals = mMesh->getWritableNormals();
LLVector3 *scaled_binormals = mMesh->getScaledBinormals();
LLVector3 *binormals = mMesh->getWritableBinormals();
@@ -531,7 +531,8 @@ void LLPolyMorphTarget::apply( ESex avatar_sex )
maskWeight = maskWeightArray[vert_index_morph];
}
- coords[vert_index_mesh] += mMorphData->mCoords[vert_index_morph] * delta_weight * maskWeight;
+ coords[vert_index_mesh] += LLVector4(mMorphData->mCoords[vert_index_morph] * delta_weight * maskWeight);
+
if (getInfo()->mIsClothingMorph && clothing_weights)
{
LLVector3 clothing_offset = mMorphData->mCoords[vert_index_morph] * delta_weight * maskWeight;
@@ -546,7 +547,7 @@ void LLPolyMorphTarget::apply( ESex avatar_sex )
scaled_normals[vert_index_mesh] += mMorphData->mNormals[vert_index_morph] * delta_weight * maskWeight * NORMAL_SOFTEN_FACTOR;
LLVector3 normalized_normal = scaled_normals[vert_index_mesh];
normalized_normal.normVec();
- normals[vert_index_mesh] = normalized_normal;
+ normals[vert_index_mesh] = LLVector4(normalized_normal);
// calculate new binormals
scaled_binormals[vert_index_mesh] += mMorphData->mBinormals[vert_index_morph] * delta_weight * maskWeight * NORMAL_SOFTEN_FACTOR;
@@ -595,7 +596,7 @@ void LLPolyMorphTarget::applyMask(U8 *maskTextureData, S32 width, S32 height, S3
if (maskWeights)
{
- LLVector3 *coords = mMesh->getWritableCoords();
+ LLVector4 *coords = mMesh->getWritableCoords();
LLVector3 *scaled_normals = mMesh->getScaledNormals();
LLVector3 *scaled_binormals = mMesh->getScaledBinormals();
LLVector2 *tex_coords = mMesh->getWritableTexCoords();
@@ -606,7 +607,7 @@ void LLPolyMorphTarget::applyMask(U8 *maskTextureData, S32 width, S32 height, S3
S32 out_vert = mMorphData->mVertexIndices[vert];
// remove effect of existing masked morph
- coords[out_vert] -= mMorphData->mCoords[vert] * lastMaskWeight;
+ coords[out_vert] -= LLVector4(mMorphData->mCoords[vert]) * lastMaskWeight;
scaled_normals[out_vert] -= mMorphData->mNormals[vert] * lastMaskWeight * NORMAL_SOFTEN_FACTOR;
scaled_binormals[out_vert] -= mMorphData->mBinormals[vert] * lastMaskWeight * NORMAL_SOFTEN_FACTOR;
tex_coords[out_vert] -= mMorphData->mTexCoords[vert] * lastMaskWeight;
diff --git a/indra/newview/llpreviewgesture.cpp b/indra/newview/llpreviewgesture.cpp
index 8e5beb33ce..9f5c55bad1 100644
--- a/indra/newview/llpreviewgesture.cpp
+++ b/indra/newview/llpreviewgesture.cpp
@@ -34,6 +34,7 @@
#include "llassetuploadresponders.h"
#include "llcheckboxctrl.h"
#include "llcombobox.h"
+#include "lldatapacker.h"
#include "lldelayedgestureerror.h"
#include "llfloaterreg.h"
#include "llgesturemgr.h"
diff --git a/indra/newview/llpreviewtexture.cpp b/indra/newview/llpreviewtexture.cpp
index 6cfb708112..18d6731fcb 100644
--- a/indra/newview/llpreviewtexture.cpp
+++ b/indra/newview/llpreviewtexture.cpp
@@ -143,10 +143,7 @@ void LLPreviewTexture::onSaveAsBtn(void* data)
void LLPreviewTexture::draw()
{
- if (mUpdateDimensions)
- {
- updateDimensions();
- }
+ updateDimensions();
LLPreview::draw();
@@ -396,27 +393,32 @@ void LLPreviewTexture::onFileLoadedForSave(BOOL success,
void LLPreviewTexture::updateDimensions()
{
if (!mImage)
+ {
return;
-
- if(mImage->getFullWidth() == 0 || mImage->getFullHeight() == 0)
+ }
+ if ((mImage->getFullWidth() * mImage->getFullHeight()) == 0)
{
return;
}
- mUpdateDimensions = FALSE;
-
- getChild<LLUICtrl>("dimensions")->setTextArg("[WIDTH]", llformat("%d", mImage->getFullWidth()));
+ // Update the width/height display every time
+ getChild<LLUICtrl>("dimensions")->setTextArg("[WIDTH]", llformat("%d", mImage->getFullWidth()));
getChild<LLUICtrl>("dimensions")->setTextArg("[HEIGHT]", llformat("%d", mImage->getFullHeight()));
-
- //reshape floater
- reshape(getRect().getWidth(), getRect().getHeight());
+ // Reshape the floater only when required
+ if (mUpdateDimensions)
+ {
+ mUpdateDimensions = FALSE;
+
+ //reshape floater
+ reshape(getRect().getWidth(), getRect().getHeight());
- gFloaterView->adjustToFitScreen(this, FALSE);
+ gFloaterView->adjustToFitScreen(this, FALSE);
- LLRect dim_rect(getChildView("dimensions")->getRect());
- LLRect aspect_label_rect(getChildView("aspect_ratio")->getRect());
- getChildView("aspect_ratio")->setVisible( dim_rect.mRight < aspect_label_rect.mLeft);
+ LLRect dim_rect(getChildView("dimensions")->getRect());
+ LLRect aspect_label_rect(getChildView("aspect_ratio")->getRect());
+ getChildView("aspect_ratio")->setVisible( dim_rect.mRight < aspect_label_rect.mLeft);
+ }
}
diff --git a/indra/newview/llsceneview.cpp b/indra/newview/llsceneview.cpp
new file mode 100644
index 0000000000..8e8fc9dd25
--- /dev/null
+++ b/indra/newview/llsceneview.cpp
@@ -0,0 +1,429 @@
+/**
+ * @file llsceneview.cpp
+ * @brief LLSceneView class implementation
+ *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llsceneview.h"
+#include "llviewerwindow.h"
+#include "pipeline.h"
+#include "llviewerobjectlist.h"
+#include "llviewerregion.h"
+#include "llagent.h"
+#include "llvolumemgr.h"
+
+LLSceneView* gSceneView = NULL;
+
+//borrow this helper function from llfasttimerview.cpp
+template <class VEC_TYPE>
+void removeOutliers(std::vector<VEC_TYPE>& data, F32 k);
+
+
+LLSceneView::LLSceneView(const LLRect& rect)
+ : LLFloater(LLSD())
+{
+ setRect(rect);
+ setVisible(FALSE);
+
+ setCanMinimize(false);
+ setCanClose(true);
+}
+
+void LLSceneView::onClickCloseBtn()
+{
+ setVisible(false);
+}
+
+
+void LLSceneView::draw()
+{
+ S32 margin = 10;
+ S32 height = (S32) (gViewerWindow->getWindowRectScaled().getHeight()*0.75f);
+ S32 width = (S32) (gViewerWindow->getWindowRectScaled().getWidth() * 0.75f);
+
+ LLRect new_rect;
+ new_rect.setLeftTopAndSize(getRect().mLeft, getRect().mTop, width, height);
+ setRect(new_rect);
+
+ // Draw the window background
+ gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+ gl_rect_2d(0, getRect().getHeight(), getRect().getWidth(), 0, LLColor4(0.f, 0.f, 0.f, 0.25f));
+
+
+ //aggregate some statistics
+
+ //object sizes
+ std::vector<F32> size[2];
+
+ //triangle counts
+ std::vector<S32> triangles[2];
+ std::vector<S32> visible_triangles[2];
+ S32 total_visible_triangles[] = {0, 0};
+ S32 total_triangles[] = {0, 0};
+
+ //streaming cost
+ std::vector<F32> streaming_cost[2];
+ F32 total_streaming[] = { 0.f, 0.f };
+
+ //physics cost
+ std::vector<F32> physics_cost[2];
+ F32 total_physics[] = { 0.f, 0.f };
+
+
+ U32 object_count = 0;
+
+ LLViewerRegion* region = gAgent.getRegion();
+ if (region)
+ {
+ for (U32 i = 0; i < gObjectList.getNumObjects(); ++i)
+ {
+ LLViewerObject* object = gObjectList.getObject(i);
+
+ if (object &&
+ object->getVolume()&&
+ object->getRegion() == region)
+ {
+ U32 idx = object->isAttachment() ? 1 : 0;
+
+ LLVolume* volume = object->getVolume();
+ object_count++;
+
+ F32 radius = object->getScale().magVec();
+ size[idx].push_back(radius);
+
+ S32 visible = volume->getNumTriangles();
+ S32 high_triangles = object->getHighLODTriangleCount();
+
+ total_visible_triangles[idx] += visible;
+ total_triangles[idx] += high_triangles;
+
+ visible_triangles[idx].push_back(visible);
+ triangles[idx].push_back(high_triangles);
+
+ F32 streaming = object->getStreamingCost();
+ total_streaming[idx] += streaming;
+ streaming_cost[idx].push_back(streaming);
+
+ F32 physics = object->getPhysicsCost();
+ total_physics[idx] += physics;
+ physics_cost[idx].push_back(physics);
+ }
+ }
+ }
+
+ const char* category[] =
+ {
+ "Region",
+ "Attachment"
+ };
+
+ S32 graph_pos[4];
+
+ for (U32 i = 0; i < 4; ++i)
+ {
+ graph_pos[i] = new_rect.getHeight()/4*(i+1);
+ }
+
+ for (U32 idx = 0; idx < 2; idx++)
+ {
+ if (!size[idx].empty())
+ { //display graph of object sizes
+ std::sort(size[idx].begin(), size[idx].end());
+
+ ll_remove_outliers(size[idx], 1.f);
+
+ LLRect size_rect;
+
+ if (idx == 0)
+ {
+ size_rect = LLRect(margin, graph_pos[0]-margin, new_rect.getWidth()/2-margin, margin*2);
+ }
+ else
+ {
+ size_rect = LLRect(margin+new_rect.getWidth()/2, graph_pos[0]-margin, new_rect.getWidth()-margin, margin*2);
+ }
+
+ gl_rect_2d(size_rect, LLColor4::white, false);
+
+ F32 size_domain[] = { 128.f, 0.f };
+
+ //get domain of sizes
+ for (U32 i = 0; i < size[idx].size(); ++i)
+ {
+ size_domain[0] = llmin(size_domain[0], size[idx][i]);
+ size_domain[1] = llmax(size_domain[1], size[idx][i]);
+ }
+
+ F32 size_range = size_domain[1]-size_domain[0];
+
+ U32 count = size[idx].size();
+
+ F32 total = 0.f;
+
+ gGL.begin(LLRender::LINE_STRIP);
+
+ for (U32 i = 0; i < count; ++i)
+ {
+ F32 rad = size[idx][i];
+ total += rad;
+ F32 y = (rad-size_domain[0])/size_range*size_rect.getHeight()+size_rect.mBottom;
+ F32 x = (F32) i / count * size_rect.getWidth() + size_rect.mLeft;
+
+ gGL.vertex2f(x,y);
+
+ if (i%4096 == 0)
+ {
+ gGL.end();
+ gGL.flush();
+ gGL.begin(LLRender::LINE_STRIP);
+ }
+ }
+
+ gGL.end();
+ gGL.flush();
+
+ std::string label = llformat("%s Object Sizes (m) -- [%.1f, %.1f] Mean: %.1f Median: %.1f -- %d samples",
+ category[idx], size_domain[0], size_domain[1], total/count, size[idx][count/2], count);
+
+ LLFontGL::getFontMonospace()->renderUTF8(label,
+ 0 , size_rect.mLeft, size_rect.mTop+margin, LLColor4::white, LLFontGL::LEFT, LLFontGL::TOP);
+
+ }
+ }
+
+ for (U32 idx = 0; idx < 2; ++idx)
+ {
+ if (!triangles[idx].empty())
+ { //plot graph of visible/total triangles
+ std::sort(triangles[idx].begin(), triangles[idx].end());
+
+ ll_remove_outliers(triangles[idx], 1.f);
+
+ LLRect tri_rect;
+ if (idx == 0)
+ {
+ tri_rect = LLRect(margin, graph_pos[1]-margin, new_rect.getWidth()/2-margin, graph_pos[0]+margin);
+ }
+ else
+ {
+ tri_rect = LLRect(new_rect.getWidth()/2+margin, graph_pos[1]-margin, new_rect.getWidth()-margin, graph_pos[0]+margin);
+ }
+
+ gl_rect_2d(tri_rect, LLColor4::white, false);
+
+ S32 tri_domain[] = { 65536, 0 };
+
+ //get domain of triangle counts
+ for (U32 i = 0; i < triangles[idx].size(); ++i)
+ {
+ tri_domain[0] = llmin(tri_domain[0], triangles[idx][i]);
+ tri_domain[1] = llmax(tri_domain[1], triangles[idx][i]);
+ }
+
+ U32 triangle_range = tri_domain[1]-tri_domain[0];
+
+ U32 count = triangles[idx].size();
+
+ U32 total = 0;
+
+ gGL.begin(LLRender::LINE_STRIP);
+ //plot triangles
+ for (U32 i = 0; i < count; ++i)
+ {
+ U32 tri_count = triangles[idx][i];
+ total += tri_count;
+ F32 y = (F32) (tri_count-tri_domain[0])/triangle_range*tri_rect.getHeight()+tri_rect.mBottom;
+ F32 x = (F32) i / count * tri_rect.getWidth() + tri_rect.mLeft;
+
+ gGL.vertex2f(x,y);
+
+ if (i%4096 == 0)
+ {
+ gGL.end();
+ gGL.flush();
+ gGL.begin(LLRender::LINE_STRIP);
+ }
+ }
+
+ gGL.end();
+ gGL.flush();
+
+ U32 total_visible = 0;
+ count = visible_triangles[idx].size();
+
+ for (U32 i = 0; i < count; ++i)
+ {
+ U32 tri_count = visible_triangles[idx][i];
+ 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);
+
+ LLFontGL::getFontMonospace()->renderUTF8(label,
+ 0 , tri_rect.mLeft, tri_rect.mTop+margin, LLColor4::white, LLFontGL::LEFT, LLFontGL::TOP);
+
+ }
+ }
+
+ for (U32 idx = 0; idx < 2; ++idx)
+ {
+ if (!streaming_cost[idx].empty())
+ { //plot graph of streaming cost
+ std::sort(streaming_cost[idx].begin(), streaming_cost[idx].end());
+
+ ll_remove_outliers(streaming_cost[idx], 1.f);
+
+ LLRect tri_rect;
+ if (idx == 0)
+ {
+ tri_rect = LLRect(margin, graph_pos[2]-margin, new_rect.getWidth()/2-margin, graph_pos[1]+margin);
+ }
+ else
+ {
+ tri_rect = LLRect(new_rect.getWidth()/2+margin, graph_pos[2]-margin, new_rect.getWidth()-margin, graph_pos[1]+margin);
+ }
+
+ gl_rect_2d(tri_rect, LLColor4::white, false);
+
+ F32 streaming_domain[] = { 65536, 0 };
+
+ //get domain of triangle counts
+ for (U32 i = 0; i < streaming_cost[idx].size(); ++i)
+ {
+ streaming_domain[0] = llmin(streaming_domain[0], streaming_cost[idx][i]);
+ streaming_domain[1] = llmax(streaming_domain[1], streaming_cost[idx][i]);
+ }
+
+ F32 cost_range = streaming_domain[1]-streaming_domain[0];
+
+ U32 count = streaming_cost[idx].size();
+
+ F32 total = 0;
+
+ gGL.begin(LLRender::LINE_STRIP);
+ //plot triangles
+ for (U32 i = 0; i < count; ++i)
+ {
+ F32 sc = streaming_cost[idx][i];
+ total += sc;
+ F32 y = (F32) (sc-streaming_domain[0])/cost_range*tri_rect.getHeight()+tri_rect.mBottom;
+ F32 x = (F32) i / count * tri_rect.getWidth() + tri_rect.mLeft;
+
+ gGL.vertex2f(x,y);
+
+ if (i%4096 == 0)
+ {
+ gGL.end();
+ gGL.flush();
+ gGL.begin(LLRender::LINE_STRIP);
+ }
+ }
+
+ gGL.end();
+ gGL.flush();
+
+ std::string label = llformat("%s Object Streaming Cost -- [%.2f, %.2f] Mean: %.2f Total: %.2f",
+ category[idx], streaming_domain[0], streaming_domain[1], total/count, total_streaming[idx]);
+
+ LLFontGL::getFontMonospace()->renderUTF8(label,
+ 0 , tri_rect.mLeft, tri_rect.mTop+margin, LLColor4::white, LLFontGL::LEFT, LLFontGL::TOP);
+
+ }
+ }
+
+ for (U32 idx = 0; idx < 2; ++idx)
+ {
+ if (!physics_cost[idx].empty())
+ { //plot graph of physics cost
+ std::sort(physics_cost[idx].begin(), physics_cost[idx].end());
+
+ ll_remove_outliers(physics_cost[idx], 1.f);
+
+ LLRect tri_rect;
+ if (idx == 0)
+ {
+ tri_rect = LLRect(margin, graph_pos[3]-margin, new_rect.getWidth()/2-margin, graph_pos[2]+margin);
+ }
+ else
+ {
+ tri_rect = LLRect(new_rect.getWidth()/2+margin, graph_pos[3]-margin, new_rect.getWidth()-margin, graph_pos[2]+margin);
+ }
+
+ gl_rect_2d(tri_rect, LLColor4::white, false);
+
+ F32 physics_domain[] = { 65536, 0 };
+
+ //get domain of triangle counts
+ for (U32 i = 0; i < physics_cost[idx].size(); ++i)
+ {
+ physics_domain[0] = llmin(physics_domain[0], physics_cost[idx][i]);
+ physics_domain[1] = llmax(physics_domain[1], physics_cost[idx][i]);
+ }
+
+ F32 cost_range = physics_domain[1]-physics_domain[0];
+
+ U32 count = physics_cost[idx].size();
+
+ F32 total = 0;
+
+ gGL.begin(LLRender::LINE_STRIP);
+ //plot triangles
+ for (U32 i = 0; i < count; ++i)
+ {
+ F32 pc = physics_cost[idx][i];
+ total += pc;
+ F32 y = (F32) (pc-physics_domain[0])/cost_range*tri_rect.getHeight()+tri_rect.mBottom;
+ F32 x = (F32) i / count * tri_rect.getWidth() + tri_rect.mLeft;
+
+ gGL.vertex2f(x,y);
+
+ if (i%4096 == 0)
+ {
+ gGL.end();
+ gGL.flush();
+ gGL.begin(LLRender::LINE_STRIP);
+ }
+ }
+
+ gGL.end();
+ gGL.flush();
+
+ std::string label = llformat("%s Object Physics Cost -- [%.2f, %.2f] Mean: %.2f Total: %.2f",
+ category[idx], physics_domain[0], physics_domain[1], total/count, total_physics[idx]);
+
+ LLFontGL::getFontMonospace()->renderUTF8(label,
+ 0 , tri_rect.mLeft, tri_rect.mTop+margin, LLColor4::white, LLFontGL::LEFT, LLFontGL::TOP);
+
+ }
+ }
+
+
+
+
+ LLView::draw();
+}
+
+
diff --git a/indra/newview/llsceneview.h b/indra/newview/llsceneview.h
new file mode 100644
index 0000000000..2a3a14bbee
--- /dev/null
+++ b/indra/newview/llsceneview.h
@@ -0,0 +1,48 @@
+/**
+ * @file llsceneview.h
+ * @brief LLSceneView class header file
+ *
+ * $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_LLSCENEVIEW_H
+#define LL_LLSCENEVIEW_H
+
+#include "llfloater.h"
+
+
+class LLSceneView : public LLFloater
+{
+public:
+ LLSceneView(const LLRect& rect);
+
+ virtual void draw();
+
+protected:
+ virtual void onClickCloseBtn();
+
+
+};
+
+extern LLSceneView* gSceneView;
+
+#endif // LL_LLSCENEVIEW_H
diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp
index 87a2008e2b..8fa4065fa6 100644
--- a/indra/newview/llselectmgr.cpp
+++ b/indra/newview/llselectmgr.cpp
@@ -64,6 +64,7 @@
#include "llhudmanager.h"
#include "llinventorymodel.h"
#include "llmenugl.h"
+#include "llmeshrepository.h"
#include "llmutelist.h"
#include "llnotificationsutil.h"
#include "llsidepaneltaskinfo.h"
@@ -176,7 +177,6 @@ LLObjectSelection *get_null_object_selection()
// Build time optimization, generate this function once here
template class LLSelectMgr* LLSingleton<class LLSelectMgr>::getInstance();
-
//-----------------------------------------------------------------------------
// LLSelectMgr()
//-----------------------------------------------------------------------------
@@ -1191,8 +1191,8 @@ void LLSelectMgr::getGrid(LLVector3& origin, LLQuaternion &rotation, LLVector3 &
mGridRotation = first_grid_object->getRenderRotation();
LLVector3 first_grid_obj_pos = first_grid_object->getRenderPosition();
- LLVector3 min_extents(F32_MAX, F32_MAX, F32_MAX);
- LLVector3 max_extents(-F32_MAX, -F32_MAX, -F32_MAX);
+ LLVector4a min_extents(F32_MAX);
+ LLVector4a max_extents(-F32_MAX);
BOOL grid_changed = FALSE;
for (LLObjectSelection::iterator iter = mGridObjects.begin();
iter != mGridObjects.end(); ++iter)
@@ -1201,7 +1201,7 @@ void LLSelectMgr::getGrid(LLVector3& origin, LLQuaternion &rotation, LLVector3 &
LLDrawable* drawable = object->mDrawable;
if (drawable)
{
- const LLVector3* ext = drawable->getSpatialExtents();
+ const LLVector4a* ext = drawable->getSpatialExtents();
update_min_max(min_extents, max_extents, ext[0]);
update_min_max(min_extents, max_extents, ext[1]);
grid_changed = TRUE;
@@ -1209,13 +1209,19 @@ void LLSelectMgr::getGrid(LLVector3& origin, LLQuaternion &rotation, LLVector3 &
}
if (grid_changed)
{
- mGridOrigin = lerp(min_extents, max_extents, 0.5f);
+ LLVector4a center, size;
+ center.setAdd(min_extents, max_extents);
+ center.mul(0.5f);
+ size.setSub(max_extents, min_extents);
+ size.mul(0.5f);
+
+ mGridOrigin.set(center.getF32ptr());
LLDrawable* drawable = first_grid_object->mDrawable;
if (drawable && drawable->isActive())
{
mGridOrigin = mGridOrigin * first_grid_object->getRenderMatrix();
}
- mGridScale = (max_extents - min_extents) * 0.5f;
+ mGridScale.set(size.getF32ptr());
}
}
else // GRID_MODE_WORLD or just plain default
@@ -1979,6 +1985,103 @@ BOOL LLSelectMgr::selectionGetGlow(F32 *glow)
return identical;
}
+
+void LLSelectMgr::selectionSetPhysicsType(U8 type)
+{
+ struct f : public LLSelectedObjectFunctor
+ {
+ U8 mType;
+ f(const U8& t) : mType(t) {}
+ virtual bool apply(LLViewerObject* object)
+ {
+ if (object->permModify())
+ {
+ object->setPhysicsShapeType(mType);
+ object->updateFlags(TRUE);
+ }
+ return true;
+ }
+ } sendfunc(type);
+ getSelection()->applyToObjects(&sendfunc);
+}
+
+void LLSelectMgr::selectionSetFriction(F32 friction)
+{
+ struct f : public LLSelectedObjectFunctor
+ {
+ F32 mFriction;
+ f(const F32& friction) : mFriction(friction) {}
+ virtual bool apply(LLViewerObject* object)
+ {
+ if (object->permModify())
+ {
+ object->setPhysicsFriction(mFriction);
+ object->updateFlags(TRUE);
+ }
+ return true;
+ }
+ } sendfunc(friction);
+ getSelection()->applyToObjects(&sendfunc);
+}
+
+void LLSelectMgr::selectionSetGravity(F32 gravity )
+{
+ struct f : public LLSelectedObjectFunctor
+ {
+ F32 mGravity;
+ f(const F32& gravity) : mGravity(gravity) {}
+ virtual bool apply(LLViewerObject* object)
+ {
+ if (object->permModify())
+ {
+ object->setPhysicsGravity(mGravity);
+ object->updateFlags(TRUE);
+ }
+ return true;
+ }
+ } sendfunc(gravity);
+ getSelection()->applyToObjects(&sendfunc);
+}
+
+void LLSelectMgr::selectionSetDensity(F32 density )
+{
+ struct f : public LLSelectedObjectFunctor
+ {
+ F32 mDensity;
+ f(const F32& density ) : mDensity(density) {}
+ virtual bool apply(LLViewerObject* object)
+ {
+ if (object->permModify())
+ {
+ object->setPhysicsDensity(mDensity);
+ object->updateFlags(TRUE);
+ }
+ return true;
+ }
+ } sendfunc(density);
+ getSelection()->applyToObjects(&sendfunc);
+}
+
+void LLSelectMgr::selectionSetRestitution(F32 restitution)
+{
+ struct f : public LLSelectedObjectFunctor
+ {
+ F32 mRestitution;
+ f(const F32& restitution ) : mRestitution(restitution) {}
+ virtual bool apply(LLViewerObject* object)
+ {
+ if (object->permModify())
+ {
+ object->setPhysicsRestitution(mRestitution);
+ object->updateFlags(TRUE);
+ }
+ return true;
+ }
+ } sendfunc(restitution);
+ getSelection()->applyToObjects(&sendfunc);
+}
+
+
//-----------------------------------------------------------------------------
// selectionSetMaterial()
//-----------------------------------------------------------------------------
@@ -3628,7 +3731,7 @@ void LLSelectMgr::deselectAllIfTooFar()
{
if (mDebugSelectMgr)
{
- llinfos << "Selection manager: auto-deselecting, select_dist = " << fsqrtf(select_dist_sq) << llendl;
+ llinfos << "Selection manager: auto-deselecting, select_dist = " << (F32) sqrt(select_dist_sq) << llendl;
llinfos << "agent pos global = " << gAgent.getPositionGlobal() << llendl;
llinfos << "selection pos global = " << selectionCenter << llendl;
}
@@ -3797,6 +3900,26 @@ void LLSelectMgr::sendDelink()
return;
}
+ struct f : public LLSelectedObjectFunctor
+ { //on delink, any modifyable object should
+ f() {}
+
+ virtual bool apply(LLViewerObject* object)
+ {
+ if (object->permModify())
+ {
+ if (object->getPhysicsShapeType() == LLViewerObject::PHYSICS_SHAPE_NONE)
+ {
+ object->setPhysicsShapeType(LLViewerObject::PHYSICS_SHAPE_CONVEX_HULL);
+ object->updateFlags();
+ }
+ }
+ return true;
+ }
+ } sendfunc;
+ getSelection()->applyToObjects(&sendfunc);
+
+
// Delink needs to send individuals so you can unlink a single object from
// a linked set.
sendListToRegions(
@@ -4026,7 +4149,6 @@ void LLSelectMgr::selectionUpdateCastShadows(BOOL cast_shadows)
getSelection()->applyToObjects(&func);
}
-
//----------------------------------------------------------------------
// Helpful packing functions for sendObjectMessage()
//----------------------------------------------------------------------
@@ -4715,7 +4837,6 @@ void LLSelectMgr::processForceObjectSelect(LLMessageSystem* msg, void**)
LLSelectMgr::getInstance()->highlightObjectAndFamily(objects);
}
-
extern LLGLdouble gGLModelView[16];
void LLSelectMgr::updateSilhouettes()
@@ -5199,7 +5320,6 @@ LLSelectNode::LLSelectNode(const LLSelectNode& nodep)
mSilhouetteVertices = nodep.mSilhouetteVertices;
mSilhouetteNormals = nodep.mSilhouetteNormals;
- mSilhouetteSegments = nodep.mSilhouetteSegments;
mSilhouetteExists = nodep.mSilhouetteExists;
mObject = nodep.mObject;
@@ -5433,6 +5553,111 @@ BOOL LLSelectNode::allowOperationOnNode(PermissionBit op, U64 group_proxy_power)
return (mPermissions->allowOperationBy(op, proxy_agent_id, group_id));
}
+
+//helper function for pushing relevant vertices from drawable to GL
+void pushWireframe(LLDrawable* drawable)
+{
+ if (drawable->isState(LLDrawable::RIGGED))
+ { //render straight from rigged volume if this is a rigged attachment
+ LLVOVolume* vobj = drawable->getVOVolume();
+ if (vobj)
+ {
+ vobj->updateRiggedVolume();
+ LLRiggedVolume* rigged_volume = vobj->getRiggedVolume();
+ if (rigged_volume)
+ {
+ LLVertexBuffer::unbind();
+ gGL.pushMatrix();
+ glMultMatrixf((F32*) vobj->getRelativeXform().mMatrix);
+ for (S32 i = 0; i < rigged_volume->getNumVolumeFaces(); ++i)
+ {
+ const LLVolumeFace& face = rigged_volume->getVolumeFace(i);
+ glVertexPointer(3, GL_FLOAT, 16, face.mPositions);
+ glDrawElements(GL_TRIANGLES, face.mNumIndices, GL_UNSIGNED_SHORT, face.mIndices);
+ }
+ gGL.popMatrix();
+ }
+ }
+ }
+ else
+ {
+ for (S32 i = 0; i < drawable->getNumFaces(); ++i)
+ {
+ LLFace* face = drawable->getFace(i);
+ if (face->verify())
+ {
+ pushVerts(face, LLVertexBuffer::MAP_VERTEX);
+ }
+ }
+ }
+}
+
+void LLSelectNode::renderOneWireframe(const LLColor4& color)
+{
+ LLViewerObject* objectp = getObject();
+ if (!objectp)
+ {
+ return;
+ }
+
+ LLDrawable* drawable = objectp->mDrawable;
+ if(!drawable)
+ {
+ return;
+ }
+
+ glMatrixMode(GL_MODELVIEW);
+ gGL.pushMatrix();
+
+ BOOL is_hud_object = objectp->isHUDAttachment();
+
+ if (drawable->isActive())
+ {
+ glLoadMatrixd(gGLModelView);
+ glMultMatrixf((F32*) objectp->getRenderMatrix().mMatrix);
+ }
+ else if (!is_hud_object)
+ {
+ glLoadIdentity();
+ glMultMatrixd(gGLModelView);
+ LLVector3 trans = objectp->getRegion()->getOriginAgent();
+ glTranslatef(trans.mV[0], trans.mV[1], trans.mV[2]);
+ }
+
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+
+ if (LLSelectMgr::sRenderHiddenSelections) // && gFloaterTools && gFloaterTools->getVisible())
+ {
+ gGL.blendFunc(LLRender::BF_SOURCE_COLOR, LLRender::BF_ONE);
+ LLGLEnable fog(GL_FOG);
+ glFogi(GL_FOG_MODE, GL_LINEAR);
+ float d = (LLViewerCamera::getInstance()->getPointOfInterest()-LLViewerCamera::getInstance()->getOrigin()).magVec();
+ LLColor4 fogCol = color * (F32)llclamp((LLSelectMgr::getInstance()->getSelectionCenterGlobal()-gAgentCamera.getCameraPositionGlobal()).magVec()/(LLSelectMgr::getInstance()->getBBoxOfSelection().getExtentLocal().magVec()*4), 0.0, 1.0);
+ glFogf(GL_FOG_START, d);
+ glFogf(GL_FOG_END, d*(1 + (LLViewerCamera::getInstance()->getView() / LLViewerCamera::getInstance()->getDefaultFOV())));
+ glFogfv(GL_FOG_COLOR, fogCol.mV);
+
+ LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE, GL_GEQUAL);
+ gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);
+ {
+ glColor4f(color.mV[VRED], color.mV[VGREEN], color.mV[VBLUE], 0.4f);
+ pushWireframe(drawable);
+ }
+ }
+
+ gGL.flush();
+ gGL.setSceneBlendType(LLRender::BT_ALPHA);
+
+ glColor4f(color.mV[VRED]*2, color.mV[VGREEN]*2, color.mV[VBLUE]*2, LLSelectMgr::sHighlightAlpha*2);
+ LLGLEnable offset(GL_POLYGON_OFFSET_LINE);
+ glPolygonOffset(3.f, 3.f);
+ glLineWidth(3.f);
+ pushWireframe(drawable);
+ glLineWidth(1.f);
+ glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+ gGL.popMatrix();
+}
+
//-----------------------------------------------------------------------------
// renderOneSilhouette()
//-----------------------------------------------------------------------------
@@ -5450,6 +5675,13 @@ void LLSelectNode::renderOneSilhouette(const LLColor4 &color)
return;
}
+ LLVOVolume* vobj = drawable->getVOVolume();
+ if (vobj && vobj->isMesh())
+ {
+ renderOneWireframe(color);
+ return;
+ }
+
if (!mSilhouetteExists)
{
return;
@@ -5514,17 +5746,15 @@ void LLSelectNode::renderOneSilhouette(const LLColor4 &color)
gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);
gGL.begin(LLRender::LINES);
{
- S32 i = 0;
- for (S32 seg_num = 0; seg_num < (S32)mSilhouetteSegments.size(); seg_num++)
+ for(S32 i = 0; i < mSilhouetteVertices.size(); i += 2)
{
- for(; i < mSilhouetteSegments[seg_num]; i++)
- {
- u_coord += u_divisor * LLSelectMgr::sHighlightUScale;
-
- gGL.color4f(color.mV[VRED], color.mV[VGREEN], color.mV[VBLUE], 0.4f);
- gGL.texCoord2f( u_coord, v_coord );
- gGL.vertex3fv( mSilhouetteVertices[i].mV );
- }
+ u_coord += u_divisor * LLSelectMgr::sHighlightUScale;
+ gGL.color4f(color.mV[VRED], color.mV[VGREEN], color.mV[VBLUE], 0.4f);
+ gGL.texCoord2f( u_coord, v_coord );
+ gGL.vertex3fv( mSilhouetteVertices[i].mV);
+ u_coord += u_divisor * LLSelectMgr::sHighlightUScale;
+ gGL.texCoord2f( u_coord, v_coord );
+ gGL.vertex3fv(mSilhouetteVertices[i+1].mV);
}
}
gGL.end();
@@ -5535,51 +5765,50 @@ void LLSelectNode::renderOneSilhouette(const LLColor4 &color)
gGL.setSceneBlendType(LLRender::BT_ALPHA);
gGL.begin(LLRender::TRIANGLES);
{
- S32 i = 0;
- for (S32 seg_num = 0; seg_num < (S32)mSilhouetteSegments.size(); seg_num++)
+ for(S32 i = 0; i < mSilhouetteVertices.size(); i+=2)
{
- S32 first_i = i;
- LLVector3 v;
- LLVector2 t;
+ if (!mSilhouetteNormals[i].isFinite() ||
+ !mSilhouetteNormals[i+1].isFinite())
+ { //skip skewed segments
+ continue;
+ }
- for(; i < mSilhouetteSegments[seg_num]; i++)
- {
+ LLVector3 v[4];
+ LLVector2 tc[4];
+ v[0] = mSilhouetteVertices[i] + (mSilhouetteNormals[i] * silhouette_thickness);
+ tc[0].set(u_coord, v_coord + LLSelectMgr::sHighlightVScale);
- if (i == first_i) {
- LLVector3 vert = (mSilhouetteNormals[i]) * silhouette_thickness;
- vert += mSilhouetteVertices[i];
+ v[1] = mSilhouetteVertices[i];
+ tc[1].set(u_coord, v_coord);
- gGL.color4f(color.mV[VRED], color.mV[VGREEN], color.mV[VBLUE], 0.0f); //LLSelectMgr::sHighlightAlpha);
- gGL.texCoord2f( u_coord, v_coord + LLSelectMgr::sHighlightVScale );
- gGL.vertex3fv( vert.mV );
-
- u_coord += u_divisor * LLSelectMgr::sHighlightUScale;
+ u_coord += u_divisor * LLSelectMgr::sHighlightUScale;
- gGL.color4f(color.mV[VRED]*2, color.mV[VGREEN]*2, color.mV[VBLUE]*2, LLSelectMgr::sHighlightAlpha*2);
- gGL.texCoord2f( u_coord, v_coord );
- gGL.vertex3fv( mSilhouetteVertices[i].mV );
+ v[2] = mSilhouetteVertices[i+1] + (mSilhouetteNormals[i+1] * silhouette_thickness);
+ tc[2].set(u_coord, v_coord + LLSelectMgr::sHighlightVScale);
+
+ v[3] = mSilhouetteVertices[i+1];
+ tc[3].set(u_coord,v_coord);
- v = mSilhouetteVertices[i];
- t = LLVector2(u_coord, v_coord);
- }
- else {
- LLVector3 vert = (mSilhouetteNormals[i]) * silhouette_thickness;
- vert += mSilhouetteVertices[i];
-
- gGL.color4f(color.mV[VRED], color.mV[VGREEN], color.mV[VBLUE], 0.0f); //LLSelectMgr::sHighlightAlpha);
- gGL.texCoord2f( u_coord, v_coord + LLSelectMgr::sHighlightVScale );
- gGL.vertex3fv( vert.mV );
- gGL.vertex3fv( vert.mV );
-
- gGL.texCoord2fv(t.mV);
- u_coord += u_divisor * LLSelectMgr::sHighlightUScale;
- gGL.color4f(color.mV[VRED]*2, color.mV[VGREEN]*2, color.mV[VBLUE]*2, LLSelectMgr::sHighlightAlpha*2);
- gGL.vertex3fv(v.mV);
- gGL.texCoord2f( u_coord, v_coord );
- gGL.vertex3fv( mSilhouetteVertices[i].mV );
+ gGL.color4f(color.mV[VRED], color.mV[VGREEN], color.mV[VBLUE], 0.0f); //LLSelectMgr::sHighlightAlpha);
+ gGL.texCoord2fv(tc[0].mV);
+ gGL.vertex3fv( v[0].mV );
+
+ gGL.color4f(color.mV[VRED]*2, color.mV[VGREEN]*2, color.mV[VBLUE]*2, LLSelectMgr::sHighlightAlpha*2);
+ gGL.texCoord2fv( tc[1].mV );
+ gGL.vertex3fv( v[1].mV );
- }
- }
+ gGL.color4f(color.mV[VRED], color.mV[VGREEN], color.mV[VBLUE], 0.0f); //LLSelectMgr::sHighlightAlpha);
+ gGL.texCoord2fv( tc[2].mV );
+ gGL.vertex3fv( v[2].mV );
+
+ gGL.vertex3fv( v[2].mV );
+
+ gGL.color4f(color.mV[VRED]*2, color.mV[VGREEN]*2, color.mV[VBLUE]*2, LLSelectMgr::sHighlightAlpha*2);
+ gGL.texCoord2fv( tc[1].mV );
+ gGL.vertex3fv( v[1].mV );
+
+ gGL.texCoord2fv( tc[3].mV );
+ gGL.vertex3fv( v[3].mV );
}
}
gGL.end();
@@ -6147,9 +6376,178 @@ S32 LLObjectSelection::getObjectCount()
{
cleanupNodes();
S32 count = mList.size();
+
return count;
}
+F32 LLObjectSelection::getSelectedObjectCost()
+{
+ cleanupNodes();
+ F32 cost = 0.f;
+
+ for (list_t::iterator iter = mList.begin(); iter != mList.end(); ++iter)
+ {
+ LLSelectNode* node = *iter;
+ LLViewerObject* object = node->getObject();
+
+ if (object)
+ {
+ cost += object->getObjectCost();
+ }
+ }
+
+ return cost;
+}
+
+F32 LLObjectSelection::getSelectedLinksetCost()
+{
+ cleanupNodes();
+ F32 cost = 0.f;
+
+ std::set<LLViewerObject*> me_roots;
+
+ for (list_t::iterator iter = mList.begin(); iter != mList.end(); ++iter)
+ {
+ LLSelectNode* node = *iter;
+ LLViewerObject* object = node->getObject();
+
+ if (object)
+ {
+ LLViewerObject* root = static_cast<LLViewerObject*>(object->getRoot());
+ if (root)
+ {
+ if (me_roots.find(root) == me_roots.end())
+ {
+ me_roots.insert(root);
+ cost += root->getLinksetCost();
+ }
+ }
+ }
+ }
+
+ return cost;
+}
+
+F32 LLObjectSelection::getSelectedPhysicsCost()
+{
+ cleanupNodes();
+ F32 cost = 0.f;
+
+ for (list_t::iterator iter = mList.begin(); iter != mList.end(); ++iter)
+ {
+ LLSelectNode* node = *iter;
+ LLViewerObject* object = node->getObject();
+
+ if (object)
+ {
+ cost += object->getPhysicsCost();
+ }
+ }
+
+ return cost;
+}
+
+F32 LLObjectSelection::getSelectedLinksetPhysicsCost()
+{
+ cleanupNodes();
+ F32 cost = 0.f;
+
+ std::set<LLViewerObject*> me_roots;
+
+ for (list_t::iterator iter = mList.begin(); iter != mList.end(); ++iter)
+ {
+ LLSelectNode* node = *iter;
+ LLViewerObject* object = node->getObject();
+
+ if (object)
+ {
+ LLViewerObject* root = static_cast<LLViewerObject*>(object->getRoot());
+ if (root)
+ {
+ if (me_roots.find(root) == me_roots.end())
+ {
+ me_roots.insert(root);
+ cost += root->getLinksetPhysicsCost();
+ }
+ }
+ }
+ }
+
+ return cost;
+}
+
+F32 LLObjectSelection::getSelectedObjectStreamingCost(S32* total_bytes, S32* visible_bytes)
+{
+ F32 cost = 0.f;
+ for (list_t::iterator iter = mList.begin(); iter != mList.end(); ++iter)
+ {
+ LLSelectNode* node = *iter;
+ LLViewerObject* object = node->getObject();
+
+ if (object)
+ {
+ S32 bytes = 0;
+ S32 visible = 0;
+ cost += object->getStreamingCost(&bytes, &visible);
+
+ if (total_bytes)
+ {
+ *total_bytes += bytes;
+ }
+
+ if (visible_bytes)
+ {
+ *visible_bytes += visible;
+ }
+ }
+ }
+
+ return cost;
+}
+
+U32 LLObjectSelection::getSelectedObjectTriangleCount()
+{
+ U32 count = 0;
+ for (list_t::iterator iter = mList.begin(); iter != mList.end(); ++iter)
+ {
+ LLSelectNode* node = *iter;
+ LLViewerObject* object = node->getObject();
+
+ if (object)
+ {
+ count += object->getTriangleCount();
+ }
+ }
+
+ return count;
+}
+
+/*S32 LLObjectSelection::getSelectedObjectRenderCost()
+{
+ S32 cost = 0;
+ LLVOVolume::texture_cost_t textures;
+ for (list_t::iterator iter = mList.begin(); iter != mList.end(); ++iter)
+ {
+ LLSelectNode* node = *iter;
+ LLVOVolume* object = (LLVOVolume*)node->getObject();
+
+ if (object)
+ {
+ cost += object->getRenderCost(textures);
+ }
+
+ for (LLVOVolume::texture_cost_t::iterator iter = textures.begin(); iter != textures.end(); ++iter)
+ {
+ // add the cost of each individual texture in the linkset
+ cost += iter->second;
+ }
+ textures.clear();
+ }
+
+
+ return cost;
+}*/
+
//-----------------------------------------------------------------------------
// getTECount()
@@ -6568,26 +6966,27 @@ bool LLSelectMgr::selectionMove(const LLVector3& displ,
if (update_position)
{
// calculate the distance of the object closest to the camera origin
- F32 min_dist = 1e+30f;
+ F32 min_dist_squared = F32_MAX; // value will be overridden in the loop
+
LLVector3 obj_pos;
for (LLObjectSelection::root_iterator it = getSelection()->root_begin();
it != getSelection()->root_end(); ++it)
{
obj_pos = (*it)->getObject()->getPositionEdit();
- F32 obj_dist = dist_vec(obj_pos, LLViewerCamera::getInstance()->getOrigin());
- if (obj_dist < min_dist)
+ F32 obj_dist_squared = dist_vec_squared(obj_pos, LLViewerCamera::getInstance()->getOrigin());
+ if (obj_dist_squared < min_dist_squared)
{
- min_dist = obj_dist;
+ min_dist_squared = obj_dist_squared;
}
}
- // factor the distance inside the displacement vector. This will get us
+ // factor the distance into the displacement vector. This will get us
// equally visible movements for both close and far away selections.
- min_dist = sqrt(min_dist) / 2;
- displ_global.setVec(displ.mV[0]*min_dist,
- displ.mV[1]*min_dist,
- displ.mV[2]*min_dist);
+ F32 min_dist = sqrt((F32) sqrtf(min_dist_squared)) / 2;
+ displ_global.setVec(displ.mV[0] * min_dist,
+ displ.mV[1] * min_dist,
+ displ.mV[2] * min_dist);
// equates to: Displ_global = Displ * M_cam_axes_in_global_frame
displ_global = LLViewerCamera::getInstance()->rotateToAbsolute(displ_global);
diff --git a/indra/newview/llselectmgr.h b/indra/newview/llselectmgr.h
index cb387f5c3c..166616e13e 100644
--- a/indra/newview/llselectmgr.h
+++ b/indra/newview/llselectmgr.h
@@ -134,6 +134,7 @@ public:
BOOL isTESelected(S32 te_index);
S32 getLastSelectedTE();
S32 getTESelectMask() { return mTESelectMask; }
+ void renderOneWireframe(const LLColor4& color);
void renderOneSilhouette(const LLColor4 &color);
void setTransient(BOOL transient) { mTransient = transient; }
BOOL isTransient() { return mTransient; }
@@ -181,7 +182,6 @@ public:
std::vector<LLVector3> mTextureScaleRatios;
std::vector<LLVector3> mSilhouetteVertices; // array of vertices to render silhouette of object
std::vector<LLVector3> mSilhouetteNormals; // array of normals to render silhouette of object
- std::vector<S32> mSilhouetteSegments; // array of normals to render silhouette of object
BOOL mSilhouetteExists; // need to generate silhouette?
protected:
@@ -279,6 +279,15 @@ public:
// count members
S32 getObjectCount();
+ F32 getSelectedObjectCost();
+ F32 getSelectedLinksetCost();
+ F32 getSelectedPhysicsCost();
+ F32 getSelectedLinksetPhysicsCost();
+ S32 getSelectedObjectRenderCost();
+
+ F32 getSelectedObjectStreamingCost(S32* total_bytes = NULL, S32* visible_bytes = NULL);
+ U32 getSelectedObjectTriangleCount();
+
S32 getTECount();
S32 getRootObjectCount();
@@ -500,6 +509,11 @@ public:
bool selectionGetIncludeInSearch(bool* include_in_search_out); // true if all selected objects have same
BOOL selectionGetGlow(F32 *glow);
+ void selectionSetPhysicsType(U8 type);
+ void selectionSetGravity(F32 gravity);
+ void selectionSetFriction(F32 friction);
+ void selectionSetDensity(F32 density);
+ void selectionSetRestitution(F32 restitution);
void selectionSetMaterial(U8 material);
void selectionSetImage(const LLUUID& imageid); // could be item or asset id
void selectionSetColor(const LLColor4 &color);
diff --git a/indra/newview/llsidepaneliteminfo.cpp b/indra/newview/llsidepaneliteminfo.cpp
index c8c6858b81..fbd2f7ca83 100644
--- a/indra/newview/llsidepaneliteminfo.cpp
+++ b/indra/newview/llsidepaneliteminfo.cpp
@@ -39,6 +39,7 @@
#include "llinventoryobserver.h"
#include "lllineeditor.h"
#include "llradiogroup.h"
+#include "llslurl.h"
#include "llviewercontrol.h"
#include "llviewerinventory.h"
#include "llviewerobjectlist.h"
diff --git a/indra/newview/llsidetray.cpp b/indra/newview/llsidetray.cpp
index 4f18ee1da2..631b244785 100644
--- a/indra/newview/llsidetray.cpp
+++ b/indra/newview/llsidetray.cpp
@@ -127,8 +127,6 @@ protected:
void undock(LLFloater* floater_tab);
LLSideTray* getSideTray();
-
- void onFloaterClose(LLSD::Boolean app_quitting);
public:
virtual ~LLSideTrayTab();
@@ -146,7 +144,7 @@ public:
void onOpen (const LLSD& key);
- void toggleTabDocked();
+ void toggleTabDocked(bool toggle_floater = true);
void setDocked(bool dock);
bool isDocked() const;
@@ -160,7 +158,6 @@ private:
std::string mDescription;
LLView* mMainPanel;
- boost::signals2::connection mFloaterCloseConn;
};
LLSideTrayTab::LLSideTrayTab(const Params& p)
@@ -196,8 +193,8 @@ BOOL LLSideTrayTab::postBuild()
title_panel->getChild<LLTextBox>(TAB_PANEL_CAPTION_TITLE_BOX)->setValue(mTabTitle);
- getChild<LLButton>("undock")->setCommitCallback(boost::bind(&LLSideTrayTab::toggleTabDocked, this));
- getChild<LLButton>("dock")->setCommitCallback(boost::bind(&LLSideTrayTab::toggleTabDocked, this));
+ getChild<LLButton>("undock")->setCommitCallback(boost::bind(&LLSideTrayTab::setDocked, this, false));
+ getChild<LLButton>("dock")->setCommitCallback(boost::bind(&LLSideTrayTab::setDocked, this, true));
return true;
}
@@ -253,14 +250,16 @@ LLSideTray* LLSideTrayTab::getSideTray()
return side_tray;
}
-void LLSideTrayTab::toggleTabDocked()
+void LLSideTrayTab::toggleTabDocked(bool toggle_floater /* = true */)
{
+ // *FIX: Calling this method twice per frame would crash the viewer.
+
std::string tab_name = getName();
LLFloater* floater_tab = LLFloaterReg::getInstance("side_bar_tab", tab_name);
if (!floater_tab) return;
- bool docking = LLFloater::isShown(floater_tab);
+ bool docking = !isDocked();
// Hide the "Tear Off" button when a tab gets undocked
// and show "Dock" button instead.
@@ -278,7 +277,10 @@ void LLSideTrayTab::toggleTabDocked()
// Open/close the floater *after* we reparent the tab panel,
// so that it doesn't receive redundant visibility change notifications.
- LLFloaterReg::toggleInstance("side_bar_tab", tab_name);
+ if (toggle_floater)
+ {
+ LLFloaterReg::toggleInstance("side_bar_tab", tab_name);
+ }
}
// Same as toggleTabDocked() apart from making sure that we do exactly what we want.
@@ -298,18 +300,6 @@ bool LLSideTrayTab::isDocked() const
return dynamic_cast<LLSideTray*>(getParent()) != NULL;
}
-void LLSideTrayTab::onFloaterClose(LLSD::Boolean app_quitting)
-{
- // If user presses Ctrl-Shift-W, handle that gracefully by docking all
- // undocked tabs before their floaters get destroyed (STORM-1016).
-
- // Don't dock on quit for the current dock state to be correctly saved.
- if (app_quitting) return;
-
- lldebugs << "Forcibly docking tab " << getName() << llendl;
- setDocked(true);
-}
-
BOOL LLSideTrayTab::handleScrollWheel(S32 x, S32 y, S32 clicks)
{
// Let children handle the event
@@ -333,7 +323,6 @@ void LLSideTrayTab::dock(LLFloater* floater_tab)
return;
}
- mFloaterCloseConn.disconnect();
setRect(side_tray->getLocalRect());
reshape(getRect().getWidth(), getRect().getHeight());
@@ -382,7 +371,6 @@ void LLSideTrayTab::undock(LLFloater* floater_tab)
}
floater_tab->addChild(this);
- mFloaterCloseConn = floater_tab->setCloseCallback(boost::bind(&LLSideTrayTab::onFloaterClose, this, _2));
floater_tab->setTitle(mTabTitle);
floater_tab->setName(getName());
@@ -510,7 +498,7 @@ public:
LLSideTrayTab* tab = side_tray->getTab(getName());
if (!tab) return FALSE;
- tab->toggleTabDocked();
+ tab->setDocked(false);
LLFloater* floater_tab = LLFloaterReg::getInstance("side_bar_tab", tab->getName());
if (!floater_tab) return FALSE;
@@ -681,7 +669,7 @@ LLPanel* LLSideTray::openChildPanel(LLSideTrayTab* tab, const std::string& panel
if (tab_attached && LLUI::sSettingGroups["config"]->getBOOL("OpenSidePanelsInFloaters"))
{
- tab->toggleTabDocked();
+ tab->setDocked(false);
tab_attached = false;
}
@@ -1102,7 +1090,7 @@ void LLSideTray::detachTabs()
if (!is_visible) continue;
llassert(isTabAttached(tab->getName()));
- tab->toggleTabDocked();
+ tab->setDocked(false);
}
}
@@ -1192,6 +1180,38 @@ void LLSideTray::reshape(S32 width, S32 height, BOOL called_from_parent)
arrange();
}
+// This is just LLView::findChildView specialized to restrict the search to LLPanels.
+// Optimization for EXT-4068 to avoid searching down to the individual item level
+// when inventories are large.
+LLPanel *findChildPanel(LLPanel *panel, const std::string& name, bool recurse)
+{
+ for (LLView::child_list_const_iter_t child_it = panel->beginChild();
+ child_it != panel->endChild(); ++child_it)
+ {
+ LLPanel *child_panel = dynamic_cast<LLPanel*>(*child_it);
+ if (!child_panel)
+ continue;
+ if (child_panel->getName() == name)
+ return child_panel;
+ }
+ if (recurse)
+ {
+ for (LLView::child_list_const_iter_t child_it = panel->beginChild();
+ child_it != panel->endChild(); ++child_it)
+ {
+ LLPanel *child_panel = dynamic_cast<LLPanel*>(*child_it);
+ if (!child_panel)
+ continue;
+ LLPanel *found_panel = findChildPanel(child_panel,name,recurse);
+ if (found_panel)
+ {
+ return found_panel;
+ }
+ }
+ }
+ return NULL;
+}
+
/**
* Activate tab with "panel_name" panel
* if no such tab - return false, otherwise true.
@@ -1221,23 +1241,50 @@ LLPanel* LLSideTray::showPanel (const std::string& panel_name, const LLSD& para
return new_panel;
}
-void LLSideTray::hidePanel(const std::string& panel_name)
+bool LLSideTray::hidePanel(const std::string& panel_name)
{
+ bool panelHidden = false;
+
LLPanel* panelp = getPanel(panel_name);
+
if (panelp)
{
- if(isTabAttached(panel_name))
+ LLView* parentp = panelp->getParent();
+
+ // Collapse the side bar if the panel or the panel's parent is an attached tab
+ if (isTabAttached(panel_name) || (parentp && isTabAttached(parentp->getName())))
{
collapseSideBar();
+ panelHidden = true;
}
else
{
- LLFloaterReg::hideInstance("side_bar_tab", panel_name);
+ panelHidden = LLFloaterReg::hideInstance("side_bar_tab", panel_name);
+
+ if (!panelHidden)
+ {
+ // Look up the panel in the list of detached tabs.
+ for (child_vector_const_iter_t child_it = mDetachedTabs.begin(); child_it != mDetachedTabs.end(); ++child_it)
+ {
+ LLPanel *detached_panel = dynamic_cast<LLPanel*>(*child_it);
+
+ if (detached_panel)
+ {
+ // Hide this detached panel if it is a parent of our panel
+ if (findChildPanel(detached_panel, panel_name, true) != NULL)
+ {
+ panelHidden = LLFloaterReg::hideInstance("side_bar_tab", detached_panel->getName());
+ break;
+ }
+ }
+ }
+ }
}
}
+
+ return panelHidden;
}
-
void LLSideTray::togglePanel(LLPanel* &sub_panel, const std::string& panel_name, const LLSD& params)
{
if(!sub_panel)
@@ -1255,38 +1302,6 @@ void LLSideTray::togglePanel(LLPanel* &sub_panel, const std::string& panel_name,
}
}
-// This is just LLView::findChildView specialized to restrict the search to LLPanels.
-// Optimization for EXT-4068 to avoid searching down to the individual item level
-// when inventories are large.
-LLPanel *findChildPanel(LLPanel *panel, const std::string& name, bool recurse)
-{
- for (LLView::child_list_const_iter_t child_it = panel->beginChild();
- child_it != panel->endChild(); ++child_it)
- {
- LLPanel *child_panel = dynamic_cast<LLPanel*>(*child_it);
- if (!child_panel)
- continue;
- if (child_panel->getName() == name)
- return child_panel;
- }
- if (recurse)
- {
- for (LLView::child_list_const_iter_t child_it = panel->beginChild();
- child_it != panel->endChild(); ++child_it)
- {
- LLPanel *child_panel = dynamic_cast<LLPanel*>(*child_it);
- if (!child_panel)
- continue;
- LLPanel *found_panel = findChildPanel(child_panel,name,recurse);
- if (found_panel)
- {
- return found_panel;
- }
- }
- }
- return NULL;
-}
-
LLPanel* LLSideTray::getPanel(const std::string& panel_name)
{
// Look up the panel in the list of detached tabs.
@@ -1327,8 +1342,9 @@ bool LLSideTray::isPanelActive(const std::string& panel_name)
return (panel->getName() == panel_name);
}
-void LLSideTray::setTabDocked(const std::string& tab_name, bool dock)
+void LLSideTray::setTabDocked(const std::string& tab_name, bool dock, bool toggle_floater /* = true*/)
{
+ // Lookup tab by name.
LLSideTrayTab* tab = getTab(tab_name);
if (!tab)
{ // not a docked tab, look through detached tabs
@@ -1345,20 +1361,12 @@ void LLSideTray::setTabDocked(const std::string& tab_name, bool dock)
}
- if (tab)
- {
- bool tab_attached = isTabAttached(tab_name);
- LLFloater* floater_tab = LLFloaterReg::getInstance("side_bar_tab", tab_name);
- if (!floater_tab) return;
+ llassert(tab != NULL);
- if (dock && !tab_attached)
- {
- tab->dock(floater_tab);
- }
- else if (!dock && tab_attached)
- {
- tab->undock(floater_tab);
- }
+ // Toggle its dock state.
+ if (tab && tab->isDocked() != dock)
+ {
+ tab->toggleTabDocked(toggle_floater);
}
}
diff --git a/indra/newview/llsidetray.h b/indra/newview/llsidetray.h
index 1dddd9e9bc..24882411f4 100644
--- a/indra/newview/llsidetray.h
+++ b/indra/newview/llsidetray.h
@@ -104,7 +104,7 @@ public:
*/
LLPanel* showPanel (const std::string& panel_name, const LLSD& params = LLSD());
- void hidePanel (const std::string& panel_name);
+ bool hidePanel (const std::string& panel_name);
/**
* Toggling Side Tray tab which contains "sub_panel" child of "panel_name" panel.
@@ -121,7 +121,7 @@ public:
LLPanel* getActivePanel ();
bool isPanelActive (const std::string& panel_name);
- void setTabDocked(const std::string& tab_name, bool dock);
+ void setTabDocked(const std::string& tab_name, bool dock, bool toggle_floater = true);
/*
* get the panel of given type T (don't show it or do anything else with it)
diff --git a/indra/newview/llsidetraylistener.cpp b/indra/newview/llsidetraylistener.cpp
index 6db13e517d..cd6fa28948 100644
--- a/indra/newview/llsidetraylistener.cpp
+++ b/indra/newview/llsidetraylistener.cpp
@@ -4,8 +4,25 @@
* @date 2011-02-15
* @brief Implementation for llsidetraylistener.
*
- * $LicenseInfo:firstyear=2011&license=lgpl$
- * Copyright (c) 2011, Linden Research, Inc.
+ * $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$
*/
diff --git a/indra/newview/llsidetraylistener.h b/indra/newview/llsidetraylistener.h
index 0dd2067433..51e2137762 100644
--- a/indra/newview/llsidetraylistener.h
+++ b/indra/newview/llsidetraylistener.h
@@ -4,8 +4,25 @@
* @date 2011-02-15
* @brief
*
- * $LicenseInfo:firstyear=2011&license=lgpl$
- * Copyright (c) 2011, Linden Research, Inc.
+ * $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$
*/
diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp
index 8adb8c30e0..fa329eb0ae 100644
--- a/indra/newview/llspatialpartition.cpp
+++ b/indra/newview/llspatialpartition.cpp
@@ -32,15 +32,19 @@
#include "llviewerobjectlist.h"
#include "llvovolume.h"
#include "llvolume.h"
+#include "llvolumeoctree.h"
#include "llviewercamera.h"
#include "llface.h"
#include "llviewercontrol.h"
#include "llviewerregion.h"
#include "llcamera.h"
#include "pipeline.h"
+#include "llmeshrepository.h"
#include "llrender.h"
#include "lloctree.h"
+#include "llphysicsshapebuilderutil.h"
#include "llvoavatar.h"
+#include "llvolumemgr.h"
#include "lltextureatlas.h"
static LLFastTimer::DeclareTimer FTM_FRUSTUM_CULL("Frustum Culling");
@@ -60,6 +64,12 @@ const F32 SG_OCCLUSION_FUDGE = 0.25f;
static U32 sZombieGroups = 0;
U32 LLSpatialGroup::sNodeCount = 0;
+
+#define LL_TRACK_PENDING_OCCLUSION_QUERIES 0
+
+std::set<GLuint> LLSpatialGroup::sPendingQueries;
+
+
BOOL LLSpatialGroup::sNoDelete = FALSE;
static F32 sLastMaxTexPriority = 1.f;
@@ -77,6 +87,9 @@ protected:
virtual void releaseName(GLuint name)
{
+#if LL_TRACK_PENDING_OCCLUSION_QUERIES
+ LLSpatialGroup::sPendingQueries.erase(name);
+#endif
glDeleteQueriesARB(1, &name);
}
};
@@ -95,23 +108,6 @@ void sg_assert(BOOL expr)
#endif
}
-#if LL_DEBUG
-void validate_drawable(LLDrawable* drawablep)
-{
- F64 rad = drawablep->getBinRadius();
- const LLVector3* ext = drawablep->getSpatialExtents();
-
- if (rad < 0 || rad > 4096 ||
- (ext[1]-ext[0]).magVec() > 4096)
- {
- llwarns << "Invalid drawable found in octree." << llendl;
- }
-}
-#else
-#define validate_drawable(x)
-#endif
-
-
S32 AABBSphereIntersect(const LLVector3& min, const LLVector3& max, const LLVector3 &origin, const F32 &rad)
{
return AABBSphereIntersectR2(min, max, origin, rad*rad);
@@ -151,6 +147,55 @@ S32 AABBSphereIntersectR2(const LLVector3& min, const LLVector3& max, const LLVe
}
+S32 AABBSphereIntersect(const LLVector4a& min, const LLVector4a& max, const LLVector3 &origin, const F32 &rad)
+{
+ return AABBSphereIntersectR2(min, max, origin, rad*rad);
+}
+
+S32 AABBSphereIntersectR2(const LLVector4a& min, const LLVector4a& max, const LLVector3 &origin, const F32 &r)
+{
+ F32 d = 0.f;
+ F32 t;
+
+ LLVector4a origina;
+ origina.load3(origin.mV);
+
+ LLVector4a v;
+ v.setSub(min, origina);
+
+ if (v.dot3(v) < r)
+ {
+ v.setSub(max, origina);
+ if (v.dot3(v) < r)
+ {
+ return 2;
+ }
+ }
+
+
+ for (U32 i = 0; i < 3; i++)
+ {
+ if (origin.mV[i] < min[i])
+ {
+ t = min[i] - origin.mV[i];
+ d += t*t;
+ }
+ else if (origin.mV[i] > max[i])
+ {
+ t = origin.mV[i] - max[i];
+ d += t*t;
+ }
+
+ if (d > r)
+ {
+ return 0;
+ }
+ }
+
+ return 1;
+}
+
+
typedef enum
{
b000 = 0x00,
@@ -168,76 +213,113 @@ typedef enum
//gives you a triangle fan index array
static U8 sOcclusionIndices[] =
{
- // 000
+ //000
b111, b110, b010, b011, b001, b101, b100, b110,
- //001
- b110, b000, b010, b011, b111, b101, b100, b000,
+ //001
+ b011, b010, b000, b001, b101, b111, b110, b010,
//010
b101, b100, b110, b111, b011, b001, b000, b100,
//011
- b100, b010, b110, b111, b101, b001, b000, b010,
- //100
- b011, b010, b000, b001, b101, b111, b110, b010,
+ b001, b000, b100, b101, b111, b011, b010, b000,
+ //100
+ b110, b000, b010, b011, b111, b101, b100, b000,
//101
b010, b100, b000, b001, b011, b111, b110, b100,
//110
- b001, b000, b100, b101, b111, b011, b010, b000,
+ b100, b010, b110, b111, b101, b001, b000, b010,
//111
b000, b110, b100, b101, b001, b011, b010, b110,
};
-U8* get_box_fan_indices(LLCamera* camera, const LLVector3& center)
+U32 get_box_fan_indices(LLCamera* camera, const LLVector4a& center)
{
- LLVector3 d = center - camera->getOrigin();
+ LLVector4a origin;
+ origin.load3(camera->getOrigin().mV);
- U8 cypher = 0;
- if (d.mV[0] > 0)
- {
- cypher |= b100;
- }
- if (d.mV[1] > 0)
- {
- cypher |= b010;
- }
- if (d.mV[2] > 0)
- {
- cypher |= b001;
- }
+ S32 cypher = center.greaterThan(origin).getGatheredBits() & 0x7;
+
+ return cypher*8;
+}
+
+U8* get_box_fan_indices_ptr(LLCamera* camera, const LLVector4a& center)
+{
+ LLVector4a origin;
+ origin.load3(camera->getOrigin().mV);
+ S32 cypher = center.greaterThan(origin).getGatheredBits() & 0x7;
+
return sOcclusionIndices+cypher*8;
}
-
+
+
+static LLFastTimer::DeclareTimer FTM_BUILD_OCCLUSION("Build Occlusion");
+
void LLSpatialGroup::buildOcclusion()
{
- if (!mOcclusionVerts)
+ if (mOcclusionVerts.isNull())
{
- mOcclusionVerts = new F32[8*3];
+
+ mOcclusionVerts = new LLVertexBuffer(LLVertexBuffer::MAP_VERTEX,
+ LLVertexBuffer::sUseStreamDraw ? mBufferUsage : 0); //if GL has a hard time with VBOs, don't use them for occlusion culling.
+ mOcclusionVerts->allocateBuffer(8, 64, true);
+
+ LLStrider<U16> idx;
+ mOcclusionVerts->getIndexStrider(idx);
+ for (U32 i = 0; i < 64; i++)
+ {
+ *idx++ = sOcclusionIndices[i];
+ }
}
- LLVector3 r = mBounds[1] + LLVector3(SG_OCCLUSION_FUDGE, SG_OCCLUSION_FUDGE, SG_OCCLUSION_FUDGE);
+ LLVector4a fudge;
+ fudge.splat(SG_OCCLUSION_FUDGE);
- for (U32 k = 0; k < 3; k++)
+ LLVector4a r;
+ r.setAdd(mBounds[1], fudge);
+
+ LLStrider<LLVector3> pos;
+
{
- r.mV[k] = llmin(mBounds[1].mV[k]+0.25f, r.mV[k]);
+ LLFastTimer t(FTM_BUILD_OCCLUSION);
+ mOcclusionVerts->getVertexStrider(pos);
}
- F32* v = mOcclusionVerts;
- F32* c = mBounds[0].mV;
- F32* s = r.mV;
+ {
+ LLVector4a* v = (LLVector4a*) pos.get();
+
+ const LLVector4a& c = mBounds[0];
+ const LLVector4a& s = r;
+
+ static const LLVector4a octant[] =
+ {
+ LLVector4a(-1.f, -1.f, -1.f),
+ LLVector4a(-1.f, -1.f, 1.f),
+ LLVector4a(-1.f, 1.f, -1.f),
+ LLVector4a(-1.f, 1.f, 1.f),
+
+ LLVector4a(1.f, -1.f, -1.f),
+ LLVector4a(1.f, -1.f, 1.f),
+ LLVector4a(1.f, 1.f, -1.f),
+ LLVector4a(1.f, 1.f, 1.f),
+ };
+
+ //vertex positions are encoded so the 3 bits of their vertex index
+ //correspond to their axis facing, with bit position 3,2,1 matching
+ //axis facing x,y,z, bit set meaning positive facing, bit clear
+ //meaning negative facing
+
+ for (S32 i = 0; i < 8; ++i)
+ {
+ LLVector4a p;
+ p.setMul(s, octant[i]);
+ p.add(c);
+ v[i] = p;
+ }
+ }
- //vertex positions are encoded so the 3 bits of their vertex index
- //correspond to their axis facing, with bit position 3,2,1 matching
- //axis facing x,y,z, bit set meaning positive facing, bit clear
- //meaning negative facing
- v[0] = c[0]-s[0]; v[1] = c[1]-s[1]; v[2] = c[2]-s[2]; // 0 - 0000
- v[3] = c[0]-s[0]; v[4] = c[1]-s[1]; v[5] = c[2]+s[2]; // 1 - 0001
- v[6] = c[0]-s[0]; v[7] = c[1]+s[1]; v[8] = c[2]-s[2]; // 2 - 0010
- v[9] = c[0]-s[0]; v[10] = c[1]+s[1]; v[11] = c[2]+s[2]; // 3 - 0011
-
- v[12] = c[0]+s[0]; v[13] = c[1]-s[1]; v[14] = c[2]-s[2]; // 4 - 0100
- v[15] = c[0]+s[0]; v[16] = c[1]-s[1]; v[17] = c[2]+s[2]; // 5 - 0101
- v[18] = c[0]+s[0]; v[19] = c[1]+s[1]; v[20] = c[2]-s[2]; // 6 - 0110
- v[21] = c[0]+s[0]; v[22] = c[1]+s[1]; v[23] = c[2]+s[2]; // 7 - 0111
+ {
+ mOcclusionVerts->setBuffer(0);
+ }
clearState(LLSpatialGroup::OCCLUSION_DIRTY);
}
@@ -281,6 +363,11 @@ LLSpatialGroup::~LLSpatialGroup()
llerrs << "Illegal deletion of LLSpatialGroup!" << llendl;
}*/
+ if (gDebugGL)
+ {
+ gPipeline.checkReferences(this);
+ }
+
if (isState(DEAD))
{
sZombieGroups--;
@@ -288,12 +375,17 @@ LLSpatialGroup::~LLSpatialGroup()
sNodeCount--;
- if (gGLManager.mHasOcclusionQuery && mOcclusionQuery[LLViewerCamera::sCurCameraID])
+ if (gGLManager.mHasOcclusionQuery)
{
- sQueryPool.release(mOcclusionQuery[LLViewerCamera::sCurCameraID]);
+ for (U32 i = 0; i < LLViewerCamera::NUM_CAMERAS; ++i)
+ {
+ if (mOcclusionQuery[i])
+ {
+ sQueryPool.release(mOcclusionQuery[i]);
+ }
+ }
}
- delete [] mOcclusionVerts;
mOcclusionVerts = NULL;
LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
@@ -435,7 +527,7 @@ BOOL LLSpatialGroup::isRecentlyVisible() const
BOOL LLSpatialGroup::isVisible() const
{
- return mVisible[LLViewerCamera::sCurCameraID] == LLDrawable::getCurrentFrame() ? TRUE : FALSE;
+ return mVisible[LLViewerCamera::sCurCameraID] >= LLDrawable::getCurrentFrame() ? TRUE : FALSE;
}
void LLSpatialGroup::setVisible()
@@ -450,8 +542,10 @@ void LLSpatialGroup::validate()
sg_assert(!isState(DIRTY));
sg_assert(!isDead());
- LLVector3 myMin = mBounds[0] - mBounds[1];
- LLVector3 myMax = mBounds[0] + mBounds[1];
+ LLVector4a myMin;
+ myMin.setSub(mBounds[0], mBounds[1]);
+ LLVector4a myMax;
+ myMax.setAdd(mBounds[0], mBounds[1]);
validateDrawMap();
@@ -483,16 +577,18 @@ void LLSpatialGroup::validate()
group->validate();
//ensure all children are enclosed in this node
- LLVector3 center = group->mBounds[0];
- LLVector3 size = group->mBounds[1];
+ LLVector4a center = group->mBounds[0];
+ LLVector4a size = group->mBounds[1];
- LLVector3 min = center - size;
- LLVector3 max = center + size;
+ LLVector4a min;
+ min.setSub(center, size);
+ LLVector4a max;
+ max.setAdd(center, size);
for (U32 j = 0; j < 3; j++)
{
- sg_assert(min.mV[j] >= myMin.mV[j]-0.02f);
- sg_assert(max.mV[j] <= myMax.mV[j]+0.02f);
+ sg_assert(min[j] >= myMin[j]-0.02f);
+ sg_assert(max[j] <= myMax[j]+0.02f);
}
}
@@ -502,52 +598,8 @@ void LLSpatialGroup::validate()
void LLSpatialGroup::checkStates()
{
#if LL_OCTREE_PARANOIA_CHECK
- LLOctreeStateCheck checker;
- checker.traverse(mOctreeNode);
-#endif
-}
-
-void validate_draw_info(LLDrawInfo& params)
-{
-#if LL_OCTREE_PARANOIA_CHECK
- if (params.mVertexBuffer.isNull())
- {
- llerrs << "Draw batch has no vertex buffer." << llendl;
- }
-
- //bad range
- if (params.mStart >= params.mEnd)
- {
- llerrs << "Draw batch has invalid range." << llendl;
- }
-
- if (params.mEnd >= (U32) params.mVertexBuffer->getNumVerts())
- {
- llerrs << "Draw batch has buffer overrun error." << llendl;
- }
-
- if (params.mOffset + params.mCount > (U32) params.mVertexBuffer->getNumIndices())
- {
- llerrs << "Draw batch has index buffer ovverrun error." << llendl;
- }
-
- //bad indices
- U16* indicesp = (U16*) params.mVertexBuffer->getIndicesPointer();
- if (indicesp)
- {
- for (U32 i = params.mOffset; i < params.mOffset+params.mCount; i++)
- {
- if (indicesp[i] < (U16)params.mStart)
- {
- llerrs << "Draw batch has vertex buffer index out of range error (index too low)." << llendl;
- }
-
- if (indicesp[i] > (U16)params.mEnd)
- {
- llerrs << "Draw batch has vertex buffer index out of range error (index too high)." << llendl;
- }
- }
- }
+ //LLOctreeStateCheck checker;
+ //checker.traverse(mOctreeNode);
#endif
}
@@ -560,8 +612,8 @@ void LLSpatialGroup::validateDrawMap()
for (drawmap_elem_t::iterator j = draw_vec.begin(); j != draw_vec.end(); ++j)
{
LLDrawInfo& params = **j;
-
- validate_draw_info(params);
+
+ params.validate();
}
}
#endif
@@ -572,19 +624,17 @@ BOOL LLSpatialGroup::updateInGroup(LLDrawable *drawablep, BOOL immediate)
LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
drawablep->updateSpatialExtents();
- validate_drawable(drawablep);
OctreeNode* parent = mOctreeNode->getOctParent();
if (mOctreeNode->isInside(drawablep->getPositionGroup()) &&
(mOctreeNode->contains(drawablep) ||
- (drawablep->getBinRadius() > mOctreeNode->getSize().mdV[0] &&
+ (drawablep->getBinRadius() > mOctreeNode->getSize()[0] &&
parent && parent->getElementCount() >= LL_OCTREE_MAX_CAPACITY)))
{
unbound();
setState(OBJECT_DIRTY);
//setState(GEOM_DIRTY);
- validate_drawable(drawablep);
return TRUE;
}
@@ -602,7 +652,6 @@ BOOL LLSpatialGroup::addObject(LLDrawable *drawablep, BOOL add_all, BOOL from_oc
else
{
drawablep->setSpatialGroup(this);
- validate_drawable(drawablep);
setState(OBJECT_DIRTY | GEOM_DIRTY);
setOcclusionState(LLSpatialGroup::DISCARD_QUERY, LLSpatialGroup::STATE_MODE_ALL_CAMERAS);
gPipeline.markRebuild(this, TRUE);
@@ -703,7 +752,7 @@ void LLSpatialPartition::rebuildMesh(LLSpatialGroup* group)
}
-BOOL LLSpatialGroup::boundObjects(BOOL empty, LLVector3& minOut, LLVector3& maxOut)
+BOOL LLSpatialGroup::boundObjects(BOOL empty, LLVector4a& minOut, LLVector4a& maxOut)
{
const OctreeNode* node = mOctreeNode;
@@ -716,8 +765,8 @@ BOOL LLSpatialGroup::boundObjects(BOOL empty, LLVector3& minOut, LLVector3& maxO
return FALSE;
}
- LLVector3& newMin = mObjectExtents[0];
- LLVector3& newMax = mObjectExtents[1];
+ LLVector4a& newMin = mObjectExtents[0];
+ LLVector4a& newMax = mObjectExtents[1];
if (isState(OBJECT_DIRTY))
{ //calculate new bounding box
@@ -726,10 +775,10 @@ BOOL LLSpatialGroup::boundObjects(BOOL empty, LLVector3& minOut, LLVector3& maxO
//initialize bounding box to first element
OctreeNode::const_element_iter i = node->getData().begin();
LLDrawable* drawablep = *i;
- const LLVector3* minMax = drawablep->getSpatialExtents();
+ const LLVector4a* minMax = drawablep->getSpatialExtents();
- newMin.setVec(minMax[0]);
- newMax.setVec(minMax[1]);
+ newMin = minMax[0];
+ newMax = minMax[1];
for (++i; i != node->getData().end(); ++i)
{
@@ -753,8 +802,10 @@ BOOL LLSpatialGroup::boundObjects(BOOL empty, LLVector3& minOut, LLVector3& maxO
}*/
}
- mObjectBounds[0] = (newMin + newMax) * 0.5f;
- mObjectBounds[1] = (newMax - newMin) * 0.5f;
+ mObjectBounds[0].setAdd(newMin, newMax);
+ mObjectBounds[0].mul(0.5f);
+ mObjectBounds[1].setSub(newMax, newMin);
+ mObjectBounds[1].mul(0.5f);
}
if (empty)
@@ -764,17 +815,8 @@ BOOL LLSpatialGroup::boundObjects(BOOL empty, LLVector3& minOut, LLVector3& maxO
}
else
{
- for (U32 i = 0; i < 3; i++)
- {
- if (newMin.mV[i] < minOut.mV[i])
- {
- minOut.mV[i] = newMin.mV[i];
- }
- if (newMax.mV[i] > maxOut.mV[i])
- {
- maxOut.mV[i] = newMax.mV[i];
- }
- }
+ minOut.setMin(minOut, newMin);
+ maxOut.setMax(maxOut, newMax);
}
return TRUE;
@@ -865,18 +907,19 @@ BOOL LLSpatialGroup::removeObject(LLDrawable *drawablep, BOOL from_octree)
return TRUE;
}
-void LLSpatialGroup::shift(const LLVector3 &offset)
+void LLSpatialGroup::shift(const LLVector4a &offset)
{
LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
- LLVector3d offsetd(offset);
- mOctreeNode->setCenter(mOctreeNode->getCenter()+offsetd);
+ LLVector4a t = mOctreeNode->getCenter();
+ t.add(offset);
+ mOctreeNode->setCenter(t);
mOctreeNode->updateMinMax();
- mBounds[0] += offset;
- mExtents[0] += offset;
- mExtents[1] += offset;
- mObjectBounds[0] += offset;
- mObjectExtents[0] += offset;
- mObjectExtents[1] += offset;
+ mBounds[0].add(offset);
+ mExtents[0].add(offset);
+ mExtents[1].add(offset);
+ mObjectBounds[0].add(offset);
+ mObjectExtents[0].add(offset);
+ mObjectExtents[1].add(offset);
//if (!mSpatialPartition->mRenderByGroup)
{
@@ -884,15 +927,9 @@ void LLSpatialGroup::shift(const LLVector3 &offset)
gPipeline.markRebuild(this, TRUE);
}
- if (mOcclusionVerts)
+ if (mOcclusionVerts.notNull())
{
- for (U32 i = 0; i < 8; i++)
- {
- F32* v = mOcclusionVerts+i*3;
- v[0] += offset.mV[0];
- v[1] += offset.mV[1];
- v[2] += offset.mV[2];
- }
+ setState(OCCLUSION_DIRTY);
}
}
@@ -1079,12 +1116,23 @@ void LLSpatialGroup::setOcclusionState(U32 state, S32 mode)
for (U32 i = 0; i < LLViewerCamera::NUM_CAMERAS; i++)
{
mOcclusionState[i] |= state;
+
+ if ((state & DISCARD_QUERY) && mOcclusionQuery[i])
+ {
+ sQueryPool.release(mOcclusionQuery[i]);
+ mOcclusionQuery[i] = 0;
+ }
}
}
}
else
{
mOcclusionState[LLViewerCamera::sCurCameraID] |= state;
+ if ((state & DISCARD_QUERY) && mOcclusionQuery[LLViewerCamera::sCurCameraID])
+ {
+ sQueryPool.release(mOcclusionQuery[LLViewerCamera::sCurCameraID]);
+ mOcclusionQuery[LLViewerCamera::sCurCameraID] = 0;
+ }
}
}
@@ -1152,13 +1200,11 @@ LLSpatialGroup::LLSpatialGroup(OctreeNode* node, LLSpatialPartition* part) :
mOctreeNode(node),
mSpatialPartition(part),
mVertexBuffer(NULL),
- mBufferUsage(GL_STATIC_DRAW_ARB),
+ mBufferUsage(part->mBufferUsage),
mDistance(0.f),
mDepth(0.f),
mLastUpdateDistance(-1.f),
mLastUpdateTime(gFrameTimeSeconds),
- mViewAngle(0.f),
- mLastUpdateViewAngle(-1.f),
mAtlasList(4),
mCurUpdatingTime(0),
mCurUpdatingSlotp(NULL),
@@ -1167,13 +1213,18 @@ LLSpatialGroup::LLSpatialGroup(OctreeNode* node, LLSpatialPartition* part) :
sNodeCount++;
LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
+ mViewAngle.splat(0.f);
+ mLastUpdateViewAngle.splat(-1.f);
+ mExtents[0] = mExtents[1] = mObjectBounds[0] = mObjectBounds[0] = mObjectBounds[1] =
+ mObjectExtents[0] = mObjectExtents[1] = mViewAngle;
+
sg_assert(mOctreeNode->getListenerCount() == 0);
mOctreeNode->addListener(this);
setState(SG_INITIAL_STATE_MASK);
gPipeline.markRebuild(this, TRUE);
- mBounds[0] = LLVector3(node->getCenter());
- mBounds[1] = LLVector3(node->getSize());
+ mBounds[0] = node->getCenter();
+ mBounds[1] = node->getSize();
part->mLODSeed = (part->mLODSeed+1)%part->mLODPeriod;
mLODHash = part->mLODSeed;
@@ -1210,8 +1261,8 @@ void LLSpatialGroup::updateDistance(LLCamera &camera)
#endif
if (!getData().empty())
{
- mRadius = mSpatialPartition->mRenderByGroup ? mObjectBounds[1].magVec() :
- (F32) mOctreeNode->getSize().magVec();
+ mRadius = mSpatialPartition->mRenderByGroup ? mObjectBounds[1].getLength3().getF32() :
+ (F32) mOctreeNode->getSize().getLength3().getF32();
mDistance = mSpatialPartition->calcDistance(this, camera);
mPixelArea = mSpatialPartition->calcPixelArea(this, camera);
}
@@ -1219,24 +1270,31 @@ void LLSpatialGroup::updateDistance(LLCamera &camera)
F32 LLSpatialPartition::calcDistance(LLSpatialGroup* group, LLCamera& camera)
{
- LLVector3 eye = group->mObjectBounds[0] - camera.getOrigin();
+ LLVector4a eye;
+ LLVector4a origin;
+ origin.load3(camera.getOrigin().mV);
+
+ eye.setSub(group->mObjectBounds[0], origin);
F32 dist = 0.f;
if (group->mDrawMap.find(LLRenderPass::PASS_ALPHA) != group->mDrawMap.end())
{
- LLVector3 v = eye;
- dist = eye.normVec();
+ LLVector4a v = eye;
+
+ dist = eye.getLength3().getF32();
+ eye.normalize3fast();
if (!group->isState(LLSpatialGroup::ALPHA_DIRTY))
{
if (!group->mSpatialPartition->isBridge())
{
- LLVector3 view_angle = LLVector3(eye * LLVector3(1,0,0),
- eye * LLVector3(0,1,0),
- eye * LLVector3(0,0,1));
+ LLVector4a view_angle = eye;
- if ((view_angle-group->mLastUpdateViewAngle).magVec() > 0.64f)
+ LLVector4a diff;
+ diff.setSub(view_angle, group->mLastUpdateViewAngle);
+
+ if (diff.getLength3().getF32() > 0.64f)
{
group->mViewAngle = view_angle;
group->mLastUpdateViewAngle = view_angle;
@@ -1253,17 +1311,20 @@ F32 LLSpatialPartition::calcDistance(LLSpatialGroup* group, LLCamera& camera)
LLVector3 at = camera.getAtAxis();
- //front of bounding box
- for (U32 i = 0; i < 3; i++)
- {
- v.mV[i] -= group->mObjectBounds[1].mV[i]*0.25f * at.mV[i];
- }
+ LLVector4a ata;
+ ata.load3(at.mV);
- group->mDepth = v * at;
+ LLVector4a t = ata;
+ //front of bounding box
+ t.mul(0.25f);
+ t.mul(group->mObjectBounds[1]);
+ v.sub(t);
+
+ group->mDepth = v.dot3(ata).getF32();
}
else
{
- dist = eye.magVec();
+ dist = eye.getLength3().getF32();
}
if (dist < 16.f)
@@ -1289,7 +1350,8 @@ F32 LLSpatialGroup::getUpdateUrgency() const
}
else
{
- return (gFrameTimeSeconds - mLastUpdateTime+4.f)/mDistance;
+ F32 time = gFrameTimeSeconds-mLastUpdateTime+4.f;
+ return time + (mObjectBounds[1].dot3(mObjectBounds[1]).getF32()+1.f)/mDistance;
}
}
@@ -1300,8 +1362,8 @@ BOOL LLSpatialGroup::needsUpdate()
BOOL LLSpatialGroup::changeLOD()
{
- if (isState(ALPHA_DIRTY))
- { ///an alpha sort is going to happen, update distance and LOD
+ if (isState(ALPHA_DIRTY | OBJECT_DIRTY))
+ { ///a rebuild is going to happen, update distance and LoD
return TRUE;
}
@@ -1314,7 +1376,7 @@ BOOL LLSpatialGroup::changeLOD()
return TRUE;
}
- if (mDistance > mRadius)
+ if (mDistance > mRadius*2.f)
{
return FALSE;
}
@@ -1416,7 +1478,6 @@ void LLSpatialGroup::destroyGL()
}
}
- delete [] mOcclusionVerts;
mOcclusionVerts = NULL;
for (LLSpatialGroup::element_iter i = getData().begin(); i != getData().end(); ++i)
@@ -1425,8 +1486,7 @@ void LLSpatialGroup::destroyGL()
for (S32 j = 0; j < drawable->getNumFaces(); j++)
{
LLFace* facep = drawable->getFace(j);
- facep->mVertexBuffer = NULL;
- facep->mLastVertexBuffer = NULL;
+ facep->clearVertexBuffer();
}
}
}
@@ -1459,8 +1519,8 @@ BOOL LLSpatialGroup::rebound()
}
else
{
- LLVector3& newMin = mExtents[0];
- LLVector3& newMax = mExtents[1];
+ LLVector4a& newMin = mExtents[0];
+ LLVector4a& newMax = mExtents[1];
LLSpatialGroup* group = (LLSpatialGroup*) mOctreeNode->getChild(0)->getListener(0);
group->clearState(SKIP_FRUSTUM_CHECK);
group->rebound();
@@ -1474,26 +1534,19 @@ BOOL LLSpatialGroup::rebound()
group = (LLSpatialGroup*) mOctreeNode->getChild(i)->getListener(0);
group->clearState(SKIP_FRUSTUM_CHECK);
group->rebound();
- const LLVector3& max = group->mExtents[1];
- const LLVector3& min = group->mExtents[0];
+ const LLVector4a& max = group->mExtents[1];
+ const LLVector4a& min = group->mExtents[0];
- for (U32 j = 0; j < 3; j++)
- {
- if (max.mV[j] > newMax.mV[j])
- {
- newMax.mV[j] = max.mV[j];
- }
- if (min.mV[j] < newMin.mV[j])
- {
- newMin.mV[j] = min.mV[j];
- }
- }
+ newMax.setMax(newMax, max);
+ newMin.setMin(newMin, min);
}
boundObjects(FALSE, newMin, newMax);
- mBounds[0] = (newMin + newMax)*0.5f;
- mBounds[1] = (newMax - newMin)*0.5f;
+ mBounds[0].setAdd(newMin, newMax);
+ mBounds[0].mul(0.5f);
+ mBounds[1].setSub(newMax, newMin);
+ mBounds[1].mul(0.5f);
}
setState(OCCLUSION_DIRTY);
@@ -1516,31 +1569,53 @@ void LLSpatialGroup::checkOcclusion()
}
else if (isOcclusionState(QUERY_PENDING))
{ //otherwise, if a query is pending, read it back
- GLuint res = 1;
- if (!isOcclusionState(DISCARD_QUERY) && mOcclusionQuery[LLViewerCamera::sCurCameraID])
- {
- glGetQueryObjectuivARB(mOcclusionQuery[LLViewerCamera::sCurCameraID], GL_QUERY_RESULT_ARB, &res);
- }
-
- if (isOcclusionState(DISCARD_QUERY))
- {
- res = 2;
- }
- if (res > 0)
+ GLuint available = 0;
+ if (mOcclusionQuery[LLViewerCamera::sCurCameraID])
{
- assert_states_valid(this);
- clearOcclusionState(LLSpatialGroup::OCCLUDED, LLSpatialGroup::STATE_MODE_DIFF);
- assert_states_valid(this);
+ glGetQueryObjectuivARB(mOcclusionQuery[LLViewerCamera::sCurCameraID], GL_QUERY_RESULT_AVAILABLE_ARB, &available);
}
else
{
- assert_states_valid(this);
- setOcclusionState(LLSpatialGroup::OCCLUDED, LLSpatialGroup::STATE_MODE_DIFF);
- assert_states_valid(this);
+ available = 1;
}
- clearOcclusionState(QUERY_PENDING | DISCARD_QUERY);
+ if (available)
+ { //result is available, read it back, otherwise wait until next frame
+ GLuint res = 1;
+ if (!isOcclusionState(DISCARD_QUERY) && mOcclusionQuery[LLViewerCamera::sCurCameraID])
+ {
+ glGetQueryObjectuivARB(mOcclusionQuery[LLViewerCamera::sCurCameraID], GL_QUERY_RESULT_ARB, &res);
+#if LL_TRACK_PENDING_OCCLUSION_QUERIES
+ sPendingQueries.erase(mOcclusionQuery[LLViewerCamera::sCurCameraID]);
+#endif
+ }
+ else if (mOcclusionQuery[LLViewerCamera::sCurCameraID])
+ { //delete the query to avoid holding onto hundreds of pending queries
+ sQueryPool.release(mOcclusionQuery[LLViewerCamera::sCurCameraID]);
+ mOcclusionQuery[LLViewerCamera::sCurCameraID] = 0;
+ }
+
+ if (isOcclusionState(DISCARD_QUERY))
+ {
+ res = 2;
+ }
+
+ if (res > 0)
+ {
+ assert_states_valid(this);
+ clearOcclusionState(LLSpatialGroup::OCCLUDED, LLSpatialGroup::STATE_MODE_DIFF);
+ assert_states_valid(this);
+ }
+ else
+ {
+ assert_states_valid(this);
+ setOcclusionState(LLSpatialGroup::OCCLUDED, LLSpatialGroup::STATE_MODE_DIFF);
+ assert_states_valid(this);
+ }
+
+ clearOcclusionState(QUERY_PENDING | DISCARD_QUERY);
+ }
}
else if (mSpatialPartition->isOcclusionEnabled() && isOcclusionState(LLSpatialGroup::OCCLUDED))
{ //check occlusion has been issued for occluded node that has not had a query issued
@@ -1551,14 +1626,18 @@ void LLSpatialGroup::checkOcclusion()
}
}
+static LLFastTimer::DeclareTimer FTM_PUSH_OCCLUSION_VERTS("Push Occlusion");
+static LLFastTimer::DeclareTimer FTM_SET_OCCLUSION_STATE("Occlusion State");
+static LLFastTimer::DeclareTimer FTM_OCCLUSION_EARLY_FAIL("Occlusion Early Fail");
+
void LLSpatialGroup::doOcclusion(LLCamera* camera)
{
if (mSpatialPartition->isOcclusionEnabled() && LLPipeline::sUseOcclusion > 1)
{
// Don't cull hole/edge water, unless we have the GL_ARB_depth_clamp extension
- if ((mSpatialPartition->mDrawableType == LLDrawPool::POOL_VOIDWATER && !gGLManager.mHasDepthClamp) ||
- earlyFail(camera, this))
+ if (earlyFail(camera, this))
{
+ LLFastTimer t(FTM_OCCLUSION_EARLY_FAIL);
setOcclusionState(LLSpatialGroup::DISCARD_QUERY);
assert_states_valid(this);
clearOcclusionState(LLSpatialGroup::OCCLUDED, LLSpatialGroup::STATE_MODE_DIFF);
@@ -1566,54 +1645,82 @@ void LLSpatialGroup::doOcclusion(LLCamera* camera)
}
else
{
+ if (!isOcclusionState(QUERY_PENDING) || isOcclusionState(DISCARD_QUERY))
{
- LLFastTimer t(FTM_RENDER_OCCLUSION);
+ { //no query pending, or previous query to be discarded
+ LLFastTimer t(FTM_RENDER_OCCLUSION);
- if (!mOcclusionQuery[LLViewerCamera::sCurCameraID])
- {
- mOcclusionQuery[LLViewerCamera::sCurCameraID] = sQueryPool.allocate();
- }
+ if (!mOcclusionQuery[LLViewerCamera::sCurCameraID])
+ {
+ mOcclusionQuery[LLViewerCamera::sCurCameraID] = sQueryPool.allocate();
+ }
- if (!mOcclusionVerts || isState(LLSpatialGroup::OCCLUSION_DIRTY))
- {
- buildOcclusion();
- }
-
- // Depth clamp all water to avoid it being culled as a result of being
- // behind the far clip plane, and in the case of edge water to avoid
- // it being culled while still visible.
- bool const use_depth_clamp = gGLManager.mHasDepthClamp &&
- (mSpatialPartition->mDrawableType == LLDrawPool::POOL_WATER ||
- mSpatialPartition->mDrawableType == LLDrawPool::POOL_VOIDWATER);
- if (use_depth_clamp)
- {
- glEnable(GL_DEPTH_CLAMP);
- }
-
- glBeginQueryARB(GL_SAMPLES_PASSED_ARB, mOcclusionQuery[LLViewerCamera::sCurCameraID]);
- glVertexPointer(3, GL_FLOAT, 0, mOcclusionVerts);
- if (camera->getOrigin().isExactlyZero())
- { //origin is invalid, draw entire box
- glDrawRangeElements(GL_TRIANGLE_FAN, 0, 7, 8,
- GL_UNSIGNED_BYTE, sOcclusionIndices);
- glDrawRangeElements(GL_TRIANGLE_FAN, 0, 7, 8,
- GL_UNSIGNED_BYTE, sOcclusionIndices+b111*8);
- }
- else
- {
- glDrawRangeElements(GL_TRIANGLE_FAN, 0, 7, 8,
- GL_UNSIGNED_BYTE, get_box_fan_indices(camera, mBounds[0]));
+ if (mOcclusionVerts.isNull() || isState(LLSpatialGroup::OCCLUSION_DIRTY))
+ {
+ buildOcclusion();
+ }
+
+ // Depth clamp all water to avoid it being culled as a result of being
+ // behind the far clip plane, and in the case of edge water to avoid
+ // it being culled while still visible.
+ bool const use_depth_clamp = gGLManager.mHasDepthClamp &&
+ (mSpatialPartition->mDrawableType == LLDrawPool::POOL_WATER ||
+ mSpatialPartition->mDrawableType == LLDrawPool::POOL_VOIDWATER);
+
+ LLGLEnable clamp(use_depth_clamp ? GL_DEPTH_CLAMP : 0);
+
+#if !LL_DARWIN
+ U32 mode = gGLManager.mHasOcclusionQuery2 ? GL_ANY_SAMPLES_PASSED : GL_SAMPLES_PASSED_ARB;
+#else
+ U32 mode = GL_SAMPLES_PASSED_ARB;
+#endif
+
+#if LL_TRACK_PENDING_OCCLUSION_QUERIES
+ sPendingQueries.insert(mOcclusionQuery[LLViewerCamera::sCurCameraID]);
+#endif
+
+ {
+ LLFastTimer t(FTM_PUSH_OCCLUSION_VERTS);
+ glBeginQueryARB(mode, mOcclusionQuery[LLViewerCamera::sCurCameraID]);
+
+ mOcclusionVerts->setBuffer(LLVertexBuffer::MAP_VERTEX);
+
+ if (!use_depth_clamp && mSpatialPartition->mDrawableType == LLDrawPool::POOL_VOIDWATER)
+ {
+ LLGLSquashToFarClip squash(glh_get_current_projection(), 1);
+ if (camera->getOrigin().isExactlyZero())
+ { //origin is invalid, draw entire box
+ mOcclusionVerts->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, 0);
+ mOcclusionVerts->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, b111*8);
+ }
+ else
+ {
+ mOcclusionVerts->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, get_box_fan_indices(camera, mBounds[0]));
+ }
+ }
+ else
+ {
+ if (camera->getOrigin().isExactlyZero())
+ { //origin is invalid, draw entire box
+ mOcclusionVerts->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, 0);
+ mOcclusionVerts->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, b111*8);
+ }
+ else
+ {
+ mOcclusionVerts->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, get_box_fan_indices(camera, mBounds[0]));
+ }
+ }
+
+ glEndQueryARB(mode);
+ }
}
- glEndQueryARB(GL_SAMPLES_PASSED_ARB);
-
- if (use_depth_clamp)
+
{
- glDisable(GL_DEPTH_CLAMP);
+ LLFastTimer t(FTM_SET_OCCLUSION_STATE);
+ setOcclusionState(LLSpatialGroup::QUERY_PENDING);
+ clearOcclusionState(LLSpatialGroup::DISCARD_QUERY);
}
}
-
- setOcclusionState(LLSpatialGroup::QUERY_PENDING);
- clearOcclusionState(LLSpatialGroup::DISCARD_QUERY);
}
}
}
@@ -1635,10 +1742,11 @@ LLSpatialPartition::LLSpatialPartition(U32 data_mask, BOOL render_by_group, U32
mSlopRatio = 0.25f;
mInfiniteFarClip = FALSE;
- LLGLNamePool::registerPool(&sQueryPool);
+ LLVector4a center, size;
+ center.splat(0.f);
+ size.splat(1.f);
- mOctree = new LLSpatialGroup::OctreeRoot(LLVector3d(0,0,0),
- LLVector3d(1,1,1),
+ mOctree = new LLSpatialGroup::OctreeRoot(center,size,
NULL);
new LLSpatialGroup(mOctree, this);
}
@@ -1658,7 +1766,6 @@ LLSpatialGroup *LLSpatialPartition::put(LLDrawable *drawablep, BOOL was_visible)
LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
drawablep->updateSpatialExtents();
- validate_drawable(drawablep);
//keep drawable from being garbage collected
LLPointer<LLDrawable> ptr = drawablep;
@@ -1742,16 +1849,16 @@ void LLSpatialPartition::move(LLDrawable *drawablep, LLSpatialGroup *curp, BOOL
class LLSpatialShift : public LLSpatialGroup::OctreeTraveler
{
public:
- LLSpatialShift(LLVector3 offset) : mOffset(offset) { }
+ const LLVector4a& mOffset;
+
+ LLSpatialShift(const LLVector4a& offset) : mOffset(offset) { }
virtual void visit(const LLSpatialGroup::OctreeNode* branch)
{
((LLSpatialGroup*) branch->getListener(0))->shift(mOffset);
}
-
- LLVector3 mOffset;
};
-void LLSpatialPartition::shift(const LLVector3 &offset)
+void LLSpatialPartition::shift(const LLVector4a &offset)
{ //shift octree node bounding boxes by offset
LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
LLSpatialShift shifter(offset);
@@ -1913,7 +2020,7 @@ public:
class LLOctreeCullVisExtents: public LLOctreeCullShadow
{
public:
- LLOctreeCullVisExtents(LLCamera* camera, LLVector3& min, LLVector3& max)
+ LLOctreeCullVisExtents(LLCamera* camera, LLVector4a& min, LLVector4a& max)
: LLOctreeCullShadow(camera), mMin(min), mMax(max), mEmpty(TRUE) { }
virtual bool earlyFail(LLSpatialGroup* group)
@@ -1980,8 +2087,8 @@ public:
}
BOOL mEmpty;
- LLVector3& mMin;
- LLVector3& mMax;
+ LLVector4a& mMin;
+ LLVector4a& mMax;
};
class LLOctreeCullDetectVisible: public LLOctreeCullShadow
@@ -2050,6 +2157,8 @@ public:
void drawBox(const LLVector3& c, const LLVector3& r)
{
+ LLVertexBuffer::unbind();
+
gGL.begin(LLRender::TRIANGLE_STRIP);
//left front
gGL.vertex3fv((c+r.scaledVec(LLVector3(-1,1,-1))).mV);
@@ -2085,6 +2194,11 @@ void drawBox(const LLVector3& c, const LLVector3& r)
gGL.end();
}
+void drawBox(const LLVector4a& c, const LLVector4a& r)
+{
+ drawBox(reinterpret_cast<const LLVector3&>(c), reinterpret_cast<const LLVector3&>(r));
+}
+
void drawBoxOutline(const LLVector3& pos, const LLVector3& size)
{
LLVector3 v1 = size.scaledVec(LLVector3( 1, 1,1));
@@ -2131,6 +2245,11 @@ void drawBoxOutline(const LLVector3& pos, const LLVector3& size)
gGL.end();
}
+void drawBoxOutline(const LLVector4a& pos, const LLVector4a& size)
+{
+ drawBoxOutline(reinterpret_cast<const LLVector3&>(pos), reinterpret_cast<const LLVector3&>(size));
+}
+
class LLOctreeDirty : public LLOctreeTraveler<LLDrawable>
{
public:
@@ -2174,14 +2293,21 @@ BOOL LLSpatialPartition::isOcclusionEnabled()
BOOL LLSpatialPartition::getVisibleExtents(LLCamera& camera, LLVector3& visMin, LLVector3& visMax)
{
+ LLVector4a visMina, visMaxa;
+ visMina.load3(visMin.mV);
+ visMaxa.load3(visMax.mV);
+
{
LLFastTimer ftm(FTM_CULL_REBOUND);
LLSpatialGroup* group = (LLSpatialGroup*) mOctree->getListener(0);
group->rebound();
}
- LLOctreeCullVisExtents vis(&camera, visMin, visMax);
+ LLOctreeCullVisExtents vis(&camera, visMina, visMaxa);
vis.traverse(mOctree);
+
+ visMin.set(visMina.getF32ptr());
+ visMax.set(visMaxa.getF32ptr());
return vis.mEmpty;
}
@@ -2244,25 +2370,36 @@ BOOL earlyFail(LLCamera* camera, LLSpatialGroup* group)
}
const F32 vel = SG_OCCLUSION_FUDGE*2.f;
- LLVector3 c = group->mBounds[0];
- LLVector3 r = group->mBounds[1] + LLVector3(vel,vel,vel);
-
+ LLVector4a fudge;
+ fudge.splat(vel);
+
+ const LLVector4a& c = group->mBounds[0];
+ LLVector4a r;
+ r.setAdd(group->mBounds[1], fudge);
+
/*if (r.magVecSquared() > 1024.0*1024.0)
{
return TRUE;
}*/
- LLVector3 e = camera->getOrigin();
+ LLVector4a e;
+ e.load3(camera->getOrigin().mV);
- LLVector3 min = c - r;
- LLVector3 max = c + r;
+ LLVector4a min;
+ min.setSub(c,r);
+ LLVector4a max;
+ max.setAdd(c,r);
- for (U32 j = 0; j < 3; j++)
+ S32 lt = e.lessThan(min).getGatheredBits() & 0x7;
+ if (lt)
{
- if (e.mV[j] < min.mV[j] || e.mV[j] > max.mV[j])
- {
- return FALSE;
- }
+ return FALSE;
+ }
+
+ S32 gt = e.greaterThan(max).getGatheredBits() & 0x7;
+ if (gt)
+ {
+ return FALSE;
}
return TRUE;
@@ -2293,7 +2430,9 @@ void pushVerts(LLSpatialGroup* group, U32 mask)
void pushVerts(LLFace* face, U32 mask)
{
- LLVertexBuffer* buffer = face->mVertexBuffer;
+ llassert(face->verify());
+
+ LLVertexBuffer* buffer = face->getVertexBuffer();
if (buffer)
{
@@ -2304,7 +2443,25 @@ void pushVerts(LLFace* face, U32 mask)
U16 offset = face->getIndicesStart();
buffer->drawRange(LLRender::TRIANGLES, start, end, count, offset);
}
+}
+void pushVerts(LLDrawable* drawable, U32 mask)
+{
+ for (S32 i = 0; i < drawable->getNumFaces(); ++i)
+ {
+ pushVerts(drawable->getFace(i), mask);
+ }
+}
+
+void pushVerts(LLVolume* volume)
+{
+ LLVertexBuffer::unbind();
+ for (S32 i = 0; i < volume->getNumVolumeFaces(); ++i)
+ {
+ const LLVolumeFace& face = volume->getVolumeFace(i);
+ glVertexPointer(3, GL_FLOAT, 16, face.mPositions);
+ glDrawElements(GL_TRIANGLES, face.mNumIndices, GL_UNSIGNED_SHORT, face.mIndices);
+ }
}
void pushBufferVerts(LLVertexBuffer* buffer, U32 mask)
@@ -2382,7 +2539,6 @@ void renderOctree(LLSpatialGroup* group)
{
//render solid object bounding box, color
//coded by buffer usage and activity
- LLGLDepthTest depth(GL_TRUE, GL_FALSE);
gGL.setSceneBlendType(LLRender::BT_ADD_WITH_ALPHA);
LLVector4 col;
if (group->mBuilt > 0.f)
@@ -2423,7 +2579,7 @@ void renderOctree(LLSpatialGroup* group)
for (S32 j = 0; j < drawable->getNumFaces(); j++)
{
LLFace* face = drawable->getFace(j);
- if (face->mVertexBuffer.notNull())
+ if (face->getVertexBuffer())
{
if (gFrameTimeSeconds - face->mLastUpdateTime < 0.5f)
{
@@ -2438,10 +2594,10 @@ void renderOctree(LLSpatialGroup* group)
continue;
}
- face->mVertexBuffer->setBuffer(LLVertexBuffer::MAP_VERTEX);
+ face->getVertexBuffer()->setBuffer(LLVertexBuffer::MAP_VERTEX);
//drawBox((face->mExtents[0] + face->mExtents[1])*0.5f,
// (face->mExtents[1]-face->mExtents[0])*0.5f);
- face->mVertexBuffer->draw(LLRender::TRIANGLES, face->getIndicesCount(), face->getIndicesStart());
+ face->getVertexBuffer()->draw(LLRender::TRIANGLES, face->getIndicesCount(), face->getIndicesStart());
}
}
@@ -2468,7 +2624,16 @@ void renderOctree(LLSpatialGroup* group)
}
gGL.color4fv(col.mV);
- drawBox(group->mObjectBounds[0], group->mObjectBounds[1]*1.01f+LLVector3(0.001f, 0.001f, 0.001f));
+ LLVector4a fudge;
+ fudge.splat(0.001f);
+ LLVector4a size = group->mObjectBounds[1];
+ size.mul(1.01f);
+ size.add(fudge);
+
+ {
+ LLGLDepthTest depth(GL_TRUE, GL_FALSE);
+ drawBox(group->mObjectBounds[0], fudge);
+ }
gGL.setSceneBlendType(LLRender::BT_ALPHA);
@@ -2499,8 +2664,12 @@ void renderOctree(LLSpatialGroup* group)
for (LLSpatialGroup::drawmap_elem_t::iterator j = i->second.begin(); j != i->second.end(); ++j)
{
LLDrawInfo* draw_info = *j;
- LLVector3 center = (draw_info->mExtents[1] + draw_info->mExtents[0])*0.5f;
- LLVector3 size = (draw_info->mExtents[1] - draw_info->mExtents[0])*0.5f;
+ LLVector4a center;
+ center.setAdd(draw_info->mExtents[1], draw_info->mExtents[0]);
+ center.mul(0.5f);
+ LLVector4a size;
+ size.setSub(draw_info->mExtents[1], draw_info->mExtents[0]);
+ size.mul(0.5f);
drawBoxOutline(center, size);
}
}
@@ -2547,17 +2716,17 @@ 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)
+ else if (camera && group->mOcclusionVerts.notNull())
{
LLVertexBuffer::unbind();
- glVertexPointer(3, GL_FLOAT, 0, group->mOcclusionVerts);
-
+ group->mOcclusionVerts->setBuffer(LLVertexBuffer::MAP_VERTEX);
+
glColor4f(1.0f, 0.f, 0.f, 0.5f);
- glDrawRangeElements(GL_TRIANGLE_FAN, 0, 7, 8, GL_UNSIGNED_BYTE, get_box_fan_indices(camera, group->mBounds[0]));
+ group->mOcclusionVerts->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, get_box_fan_indices(camera, group->mBounds[0]));
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
glColor4f(1.0f, 1.f, 1.f, 1.0f);
- glDrawRangeElements(GL_TRIANGLE_FAN, 0, 7, 8, GL_UNSIGNED_BYTE, get_box_fan_indices(camera, group->mBounds[0]));
+ group->mOcclusionVerts->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, get_box_fan_indices(camera, group->mBounds[0]));
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
}
}
@@ -2673,8 +2842,8 @@ void renderBoundingBox(LLDrawable* drawable, BOOL set_color = TRUE)
}
}
- const LLVector3* ext;
- LLVector3 pos, size;
+ const LLVector4a* ext;
+ LLVector4a pos, size;
//render face bounding boxes
for (S32 i = 0; i < drawable->getNumFaces(); i++)
@@ -2683,20 +2852,21 @@ void renderBoundingBox(LLDrawable* drawable, BOOL set_color = TRUE)
ext = facep->mExtents;
- if (ext[0].isExactlyZero() && ext[1].isExactlyZero())
- {
- continue;
- }
- pos = (ext[0] + ext[1]) * 0.5f;
- size = (ext[1] - ext[0]) * 0.5f;
+ pos.setAdd(ext[0], ext[1]);
+ pos.mul(0.5f);
+ size.setSub(ext[1], ext[0]);
+ size.mul(0.5f);
+
drawBoxOutline(pos,size);
}
//render drawable bounding box
ext = drawable->getSpatialExtents();
- pos = (ext[0] + ext[1]) * 0.5f;
- size = (ext[1] - ext[0]) * 0.5f;
+ pos.setAdd(ext[0], ext[1]);
+ pos.mul(0.5f);
+ size.setSub(ext[1], ext[0]);
+ size.mul(0.5f);
LLViewerObject* vobj = drawable->getVObj();
if (vobj && vobj->onActiveList())
@@ -2713,7 +2883,506 @@ void renderBoundingBox(LLDrawable* drawable, BOOL set_color = TRUE)
{
drawBoxOutline(pos,size);
}
+}
+
+void renderNormals(LLDrawable* drawablep)
+{
+ LLVertexBuffer::unbind();
+
+ LLVOVolume* vol = drawablep->getVOVolume();
+ if (vol)
+ {
+ LLVolume* volume = vol->getVolume();
+ gGL.pushMatrix();
+ glMultMatrixf((F32*) vol->getRelativeXform().mMatrix);
+
+ gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+
+ LLVector4a scale(gSavedSettings.getF32("RenderDebugNormalScale"));
+
+ for (S32 i = 0; i < volume->getNumVolumeFaces(); ++i)
+ {
+ const LLVolumeFace& face = volume->getVolumeFace(i);
+
+ gGL.begin(LLRender::LINES);
+
+ for (S32 j = 0; j < face.mNumVertices; ++j)
+ {
+ LLVector4a n,p;
+
+ n.setMul(face.mNormals[j], scale);
+ p.setAdd(face.mPositions[j], n);
+
+ gGL.color4f(1,1,1,1);
+ gGL.vertex3fv(face.mPositions[j].getF32ptr());
+ gGL.vertex3fv(p.getF32ptr());
+
+ if (face.mBinormals)
+ {
+ n.setMul(face.mBinormals[j], scale);
+ p.setAdd(face.mPositions[j], n);
+
+ gGL.color4f(0,1,1,1);
+ gGL.vertex3fv(face.mPositions[j].getF32ptr());
+ gGL.vertex3fv(p.getF32ptr());
+ }
+ }
+
+ gGL.end();
+ }
+
+ gGL.popMatrix();
+ }
+}
+
+S32 get_physics_detail(const LLVolumeParams& volume_params, const LLVector3& scale)
+{
+ const S32 DEFAULT_DETAIL = 1;
+ const F32 LARGE_THRESHOLD = 5.f;
+ const F32 MEGA_THRESHOLD = 25.f;
+
+ S32 detail = DEFAULT_DETAIL;
+ F32 avg_scale = (scale[0]+scale[1]+scale[2])/3.f;
+
+ if (avg_scale > LARGE_THRESHOLD)
+ {
+ detail += 1;
+ if (avg_scale > MEGA_THRESHOLD)
+ {
+ detail += 1;
+ }
+ }
+
+ return detail;
+}
+
+void renderMeshBaseHull(LLVOVolume* volume, U32 data_mask, LLColor4& color, LLColor4& line_color)
+{
+ LLUUID mesh_id = volume->getVolume()->getParams().getSculptID();
+ LLModel::Decomposition* decomp = gMeshRepo.getDecomposition(mesh_id);
+
+ const LLVector3 center(0,0,0);
+ const LLVector3 size(0.25f,0.25f,0.25f);
+
+ if (decomp)
+ {
+ if (!decomp->mBaseHullMesh.empty())
+ {
+ glColor4fv(color.mV);
+ LLVertexBuffer::drawArrays(LLRender::TRIANGLES, decomp->mBaseHullMesh.mPositions, decomp->mBaseHullMesh.mNormals);
+ }
+ else
+ {
+ gMeshRepo.buildPhysicsMesh(*decomp);
+ gGL.color3f(0,1,1);
+ drawBoxOutline(center, size);
+ }
+
+ }
+ else
+ {
+ gGL.color3f(1,0,1);
+ drawBoxOutline(center, size);
+ }
+}
+
+void render_hull(LLModel::PhysicsMesh& mesh, const LLColor4& color, const LLColor4& line_color)
+{
+ glColor4fv(color.mV);
+ LLVertexBuffer::drawArrays(LLRender::TRIANGLES, mesh.mPositions, mesh.mNormals);
+ LLGLEnable offset(GL_POLYGON_OFFSET_LINE);
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+ glPolygonOffset(3.f, 3.f);
+ glLineWidth(3.f);
+ glColor4fv(line_color.mV);
+ LLVertexBuffer::drawArrays(LLRender::TRIANGLES, mesh.mPositions, mesh.mNormals);
+ glLineWidth(1.f);
+ glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+}
+
+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())
+ {
+ return;
+ }
+
+ //not allowed to return at this point without rendering *something*
+
+ F32 threshold = gSavedSettings.getF32("ObjectCostHighThreshold");
+ F32 cost = volume->getObjectCost();
+
+ LLColor4 low = gSavedSettings.getColor4("ObjectCostLowColor");
+ LLColor4 mid = gSavedSettings.getColor4("ObjectCostMidColor");
+ LLColor4 high = gSavedSettings.getColor4("ObjectCostHighColor");
+
+ F32 normalizedCost = 1.f - exp( -(cost / threshold) );
+
+ LLColor4 color;
+ if ( normalizedCost <= 0.5f )
+ {
+ color = lerp( low, mid, 2.f * normalizedCost );
+ }
+ else
+ {
+ color = lerp( mid, high, 2.f * ( normalizedCost - 0.5f ) );
+ }
+
+ LLColor4 line_color = color*0.5f;
+
+ U32 data_mask = LLVertexBuffer::MAP_VERTEX;
+
+ LLVolumeParams volume_params = volume->getVolume()->getParams();
+
+ LLPhysicsVolumeParams physics_params(volume_params,
+ physics_type == LLViewerObject::PHYSICS_SHAPE_CONVEX_HULL);
+
+ LLPhysicsShapeBuilderUtil::PhysicsShapeSpecification physics_spec;
+ LLPhysicsShapeBuilderUtil::determinePhysicsShape(physics_params, volume->getScale(), physics_spec);
+
+ U32 type = physics_spec.getType();
+
+ LLVector3 center(0,0,0);
+ LLVector3 size(0.25f,0.25f,0.25f);
+
+ gGL.pushMatrix();
+ glMultMatrixf((F32*) volume->getRelativeXform().mMatrix);
+
+ if (type == LLPhysicsShapeBuilderUtil::PhysicsShapeSpecification::USER_MESH)
+ {
+ LLUUID mesh_id = volume->getVolume()->getParams().getSculptID();
+ LLModel::Decomposition* decomp = gMeshRepo.getDecomposition(mesh_id);
+
+ if (decomp)
+ { //render a physics based mesh
+
+ gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+
+ if (!decomp->mHull.empty())
+ { //decomposition exists, use that
+
+ if (decomp->mMesh.empty())
+ {
+ gMeshRepo.buildPhysicsMesh(*decomp);
+ }
+
+ for (U32 i = 0; i < decomp->mMesh.size(); ++i)
+ {
+ render_hull(decomp->mMesh[i], color, line_color);
+ }
+ }
+ else if (!decomp->mPhysicsShapeMesh.empty())
+ {
+ //decomp has physics mesh, render that mesh
+ glColor4fv(color.mV);
+ LLVertexBuffer::drawArrays(LLRender::TRIANGLES, decomp->mPhysicsShapeMesh.mPositions, decomp->mPhysicsShapeMesh.mNormals);
+
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+ glColor4fv(line_color.mV);
+ LLVertexBuffer::drawArrays(LLRender::TRIANGLES, decomp->mPhysicsShapeMesh.mPositions, decomp->mPhysicsShapeMesh.mNormals);
+ glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+ }
+ else
+ { //no mesh or decomposition, render base hull
+ renderMeshBaseHull(volume, data_mask, color, line_color);
+
+ if (decomp->mPhysicsShapeMesh.empty())
+ {
+ //attempt to fetch physics shape mesh if available
+ gMeshRepo.fetchPhysicsShape(mesh_id);
+ }
+ }
+ }
+ else
+ {
+ gGL.color3f(1,1,0);
+ drawBoxOutline(center, size);
+ }
+ }
+ else if (type == LLPhysicsShapeBuilderUtil::PhysicsShapeSpecification::USER_CONVEX ||
+ type == LLPhysicsShapeBuilderUtil::PhysicsShapeSpecification::PRIM_CONVEX)
+ {
+ if (volume->isMesh())
+ {
+ renderMeshBaseHull(volume, data_mask, color, line_color);
+ }
+#if LL_WINDOWS
+ else
+ {
+ LLVolumeParams volume_params = volume->getVolume()->getParams();
+ S32 detail = get_physics_detail(volume_params, volume->getScale());
+ LLVolume* phys_volume = LLPrimitive::sVolumeManager->refVolume(volume_params, detail);
+
+ if (!phys_volume->mHullPoints)
+ { //build convex hull
+ std::vector<LLVector3> pos;
+ std::vector<U16> index;
+
+ S32 index_offset = 0;
+
+ for (S32 i = 0; i < phys_volume->getNumVolumeFaces(); ++i)
+ {
+ const LLVolumeFace& face = phys_volume->getVolumeFace(i);
+ if (index_offset + face.mNumVertices > 65535)
+ {
+ continue;
+ }
+
+ for (S32 j = 0; j < face.mNumVertices; ++j)
+ {
+ pos.push_back(LLVector3(face.mPositions[j].getF32ptr()));
+ }
+
+ for (S32 j = 0; j < face.mNumIndices; ++j)
+ {
+ index.push_back(face.mIndices[j]+index_offset);
+ }
+
+ index_offset += face.mNumVertices;
+ }
+
+ if (!pos.empty() && !index.empty())
+ {
+ LLCDMeshData mesh;
+ mesh.mIndexBase = &index[0];
+ mesh.mVertexBase = pos[0].mV;
+ mesh.mNumVertices = pos.size();
+ mesh.mVertexStrideBytes = 12;
+ mesh.mIndexStrideBytes = 6;
+ mesh.mIndexType = LLCDMeshData::INT_16;
+
+ mesh.mNumTriangles = index.size()/3;
+
+ LLCDMeshData res;
+
+ LLConvexDecomposition::getInstance()->generateSingleHullMeshFromMesh( &mesh, &res );
+
+ //copy res into phys_volume
+ phys_volume->mHullPoints = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*res.mNumVertices);
+ phys_volume->mNumHullPoints = res.mNumVertices;
+
+ S32 idx_size = (res.mNumTriangles*3*2+0xF) & ~0xF;
+ phys_volume->mHullIndices = (U16*) ll_aligned_malloc_16(idx_size);
+ phys_volume->mNumHullIndices = res.mNumTriangles*3;
+
+ const F32* v = res.mVertexBase;
+
+ for (S32 i = 0; i < res.mNumVertices; ++i)
+ {
+ F32* p = (F32*) ((U8*)v+i*res.mVertexStrideBytes);
+ phys_volume->mHullPoints[i].load3(p);
+ }
+
+ if (res.mIndexType == LLCDMeshData::INT_16)
+ {
+ for (S32 i = 0; i < res.mNumTriangles; ++i)
+ {
+ U16* idx = (U16*) (((U8*)res.mIndexBase)+i*res.mIndexStrideBytes);
+
+ phys_volume->mHullIndices[i*3+0] = idx[0];
+ phys_volume->mHullIndices[i*3+1] = idx[1];
+ phys_volume->mHullIndices[i*3+2] = idx[2];
+ }
+ }
+ else
+ {
+ for (S32 i = 0; i < res.mNumTriangles; ++i)
+ {
+ U32* idx = (U32*) (((U8*)res.mIndexBase)+i*res.mIndexStrideBytes);
+
+ phys_volume->mHullIndices[i*3+0] = (U16) idx[0];
+ phys_volume->mHullIndices[i*3+1] = (U16) idx[1];
+ phys_volume->mHullIndices[i*3+2] = (U16) idx[2];
+ }
+ }
+ }
+ }
+
+ if (phys_volume->mHullPoints)
+ {
+ //render hull
+
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+
+ glColor4fv(line_color.mV);
+ LLVertexBuffer::unbind();
+
+ glVertexPointer(3, GL_FLOAT, 16, phys_volume->mHullPoints);
+ glDrawElements(GL_TRIANGLES, phys_volume->mNumHullIndices, GL_UNSIGNED_SHORT, phys_volume->mHullIndices);
+
+ glColor4fv(color.mV);
+ glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+ glDrawElements(GL_TRIANGLES, phys_volume->mNumHullIndices, GL_UNSIGNED_SHORT, phys_volume->mHullIndices);
+ }
+ else
+ {
+ gGL.color3f(1,0,1);
+ drawBoxOutline(center, size);
+ }
+
+ LLPrimitive::sVolumeManager->unrefVolume(phys_volume);
+ }
+#endif //LL_WINDOWS
+ }
+ else if (type == LLPhysicsShapeBuilderUtil::PhysicsShapeSpecification::BOX)
+ {
+ LLVector3 center = physics_spec.getCenter();
+ LLVector3 scale = physics_spec.getScale();
+ LLVector3 vscale = volume->getScale()*2.f;
+ scale.set(scale[0]/vscale[0], scale[1]/vscale[1], scale[2]/vscale[2]);
+
+ gGL.color4fv(color.mV);
+ drawBox(center, scale);
+ }
+ else if (type == LLPhysicsShapeBuilderUtil::PhysicsShapeSpecification::SPHERE)
+ {
+ LLVolumeParams volume_params;
+ volume_params.setType( LL_PCODE_PROFILE_CIRCLE_HALF, LL_PCODE_PATH_CIRCLE );
+ volume_params.setBeginAndEndS( 0.f, 1.f );
+ volume_params.setBeginAndEndT( 0.f, 1.f );
+ volume_params.setRatio ( 1, 1 );
+ volume_params.setShear ( 0, 0 );
+ LLVolume* sphere = LLPrimitive::sVolumeManager->refVolume(volume_params, 3);
+
+ glColor4fv(color.mV);
+ pushVerts(sphere);
+ LLPrimitive::sVolumeManager->unrefVolume(sphere);
+ }
+ else if (type == LLPhysicsShapeBuilderUtil::PhysicsShapeSpecification::CYLINDER)
+ {
+ LLVolumeParams volume_params;
+ volume_params.setType( LL_PCODE_PROFILE_CIRCLE, LL_PCODE_PATH_LINE );
+ volume_params.setBeginAndEndS( 0.f, 1.f );
+ volume_params.setBeginAndEndT( 0.f, 1.f );
+ volume_params.setRatio ( 1, 1 );
+ volume_params.setShear ( 0, 0 );
+ LLVolume* cylinder = LLPrimitive::sVolumeManager->refVolume(volume_params, 3);
+
+ glColor4fv(color.mV);
+ pushVerts(cylinder);
+ LLPrimitive::sVolumeManager->unrefVolume(cylinder);
+ }
+ else if (type == LLPhysicsShapeBuilderUtil::PhysicsShapeSpecification::PRIM_MESH)
+ {
+ LLVolumeParams volume_params = volume->getVolume()->getParams();
+ S32 detail = get_physics_detail(volume_params, volume->getScale());
+
+ LLVolume* phys_volume = LLPrimitive::sVolumeManager->refVolume(volume_params, detail);
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+
+ glColor4fv(line_color.mV);
+ pushVerts(phys_volume);
+
+ glColor4fv(color.mV);
+ glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+ pushVerts(phys_volume);
+ LLPrimitive::sVolumeManager->unrefVolume(phys_volume);
+ }
+ else if (type == LLPhysicsShapeBuilderUtil::PhysicsShapeSpecification::PRIM_CONVEX)
+ {
+ LLVolumeParams volume_params = volume->getVolume()->getParams();
+ S32 detail = get_physics_detail(volume_params, volume->getScale());
+
+ LLVolume* phys_volume = LLPrimitive::sVolumeManager->refVolume(volume_params, detail);
+
+ if (phys_volume->mHullPoints && phys_volume->mHullIndices)
+ {
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+
+ LLVertexBuffer::unbind();
+ glVertexPointer(3, GL_FLOAT, 16, phys_volume->mHullPoints);
+ glColor4fv(line_color.mV);
+ glDrawElements(GL_TRIANGLES, phys_volume->mNumHullIndices, GL_UNSIGNED_SHORT, phys_volume->mHullIndices);
+
+ glColor4fv(color.mV);
+ glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+ glDrawElements(GL_TRIANGLES, phys_volume->mNumHullIndices, GL_UNSIGNED_SHORT, phys_volume->mHullIndices);
+ }
+ else
+ {
+ gGL.color3f(1,0,1);
+ drawBoxOutline(center, size);
+ gMeshRepo.buildHull(volume_params, detail);
+ }
+ LLPrimitive::sVolumeManager->unrefVolume(phys_volume);
+ }
+ else if (type == LLPhysicsShapeBuilderUtil::PhysicsShapeSpecification::SCULPT)
+ {
+ //TODO: implement sculpted prim physics display
+ }
+ else
+ {
+ llerrs << "Unhandled type" << llendl;
+ }
+
+ gGL.popMatrix();
+
+ /*{ //analytical shape, just push visual rep.
+ glColor3fv(color.mV);
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+ pushVerts(drawable, data_mask);
+ glColor4fv(color.mV);
+ glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+ pushVerts(drawable, data_mask);
+ }*/
+}
+
+void renderPhysicsShapes(LLSpatialGroup* group)
+{
+ for (LLSpatialGroup::OctreeNode::const_element_iter i = group->getData().begin(); i != group->getData().end(); ++i)
+ {
+ LLDrawable* drawable = *i;
+ LLVOVolume* volume = drawable->getVOVolume();
+ if (volume && !volume->isAttachment() && volume->getPhysicsShapeType() != LLViewerObject::PHYSICS_SHAPE_NONE )
+ {
+ if (!group->mSpatialPartition->isBridge())
+ {
+ gGL.pushMatrix();
+ LLVector3 trans = drawable->getRegion()->getOriginAgent();
+ glTranslatef(trans.mV[0], trans.mV[1], trans.mV[2]);
+ renderPhysicsShape(drawable, volume);
+ gGL.popMatrix();
+ }
+ else
+ {
+ renderPhysicsShape(drawable, volume);
+ }
+ }
+ else
+ {
+ LLViewerObject* object = drawable->getVObj();
+ if (object && object->getPCode() == LLViewerObject::LL_VO_SURFACE_PATCH)
+ {
+ //push face vertices for terrain
+ for (S32 i = 0; i < drawable->getNumFaces(); ++i)
+ {
+ LLFace* face = drawable->getFace(i);
+ LLVertexBuffer* buff = face->getVertexBuffer();
+ if (buff)
+ {
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+
+ buff->setBuffer(LLVertexBuffer::MAP_VERTEX);
+ glColor3f(0.2f, 0.5f, 0.3f);
+ buff->draw(LLRender::TRIANGLES, buff->getRequestedIndices(), 0);
+
+ glColor3f(0.2f, 1.f, 0.3f);
+ glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+ buff->draw(LLRender::TRIANGLES, buff->getRequestedIndices(), 0);
+ }
+ }
+ }
+ }
+ }
}
void renderTexturePriority(LLDrawable* drawable)
@@ -2752,8 +3421,13 @@ void renderTexturePriority(LLDrawable* drawable)
// gGL.color4f(1,0,1,1);
//}
- LLVector3 center = (facep->mExtents[1]+facep->mExtents[0])*0.5f;
- LLVector3 size = (facep->mExtents[1]-facep->mExtents[0])*0.5f + LLVector3(0.01f, 0.01f, 0.01f);
+ LLVector4a center;
+ center.setAdd(facep->mExtents[1],facep->mExtents[0]);
+ center.mul(0.5f);
+ LLVector4a size;
+ size.setSub(facep->mExtents[1],facep->mExtents[0]);
+ size.mul(0.5f);
+ size.add(LLVector4a(0.01f));
drawBox(center, size);
/*S32 boost = imagep->getBoostLevel();
@@ -2777,7 +3451,6 @@ void renderPoints(LLDrawable* drawablep)
{
gGL.begin(LLRender::POINTS);
gGL.color3f(1,1,1);
- LLVector3 center(drawablep->getPositionGroup());
for (S32 i = 0; i < drawablep->getNumFaces(); i++)
{
gGL.vertex3fv(drawablep->getFace(i)->mCenterLocal.mV);
@@ -2809,8 +3482,12 @@ void renderShadowFrusta(LLDrawInfo* params)
LLGLEnable blend(GL_BLEND);
gGL.setSceneBlendType(LLRender::BT_ADD);
- LLVector3 center = (params->mExtents[1]+params->mExtents[0])*0.5f;
- LLVector3 size = (params->mExtents[1]-params->mExtents[0])*0.5f;
+ LLVector4a center;
+ center.setAdd(params->mExtents[1], params->mExtents[0]);
+ center.mul(0.5f);
+ LLVector4a size;
+ size.setSub(params->mExtents[1],params->mExtents[0]);
+ size.mul(0.5f);
if (gPipeline.mShadowCamera[4].AABBInFrustum(center, size))
{
@@ -2854,10 +3531,14 @@ void renderLights(LLDrawable* drawablep)
pushVerts(drawablep->getFace(i), LLVertexBuffer::MAP_VERTEX);
}
- const LLVector3* ext = drawablep->getSpatialExtents();
+ const LLVector4a* ext = drawablep->getSpatialExtents();
- LLVector3 pos = (ext[0] + ext[1]) * 0.5f;
- LLVector3 size = (ext[1] - ext[0]) * 0.5f;
+ LLVector4a pos;
+ pos.setAdd(ext[0], ext[1]);
+ pos.mul(0.5f);
+ LLVector4a size;
+ size.setSub(ext[1], ext[0]);
+ size.mul(0.5f);
{
LLGLDepthTest depth(GL_FALSE, GL_TRUE);
@@ -2867,65 +3548,206 @@ void renderLights(LLDrawable* drawablep)
gGL.color4f(1,1,0,1);
F32 rad = drawablep->getVOVolume()->getLightRadius();
- drawBoxOutline(pos, LLVector3(rad,rad,rad));
+ drawBoxOutline(pos, LLVector4a(rad));
}
}
-
-void renderRaycast(LLDrawable* drawablep)
+class LLRenderOctreeRaycast : public LLOctreeTriangleRayIntersect
{
- if (drawablep->getVObj() != gDebugRaycastObject)
+public:
+
+
+ LLRenderOctreeRaycast(const LLVector4a& start, const LLVector4a& dir, F32* closest_t)
+ : LLOctreeTriangleRayIntersect(start, dir, NULL, closest_t, NULL, NULL, NULL, NULL)
{
- return;
+
}
-
+
+ void visit(const LLOctreeNode<LLVolumeTriangle>* branch)
+ {
+ LLVolumeOctreeListener* vl = (LLVolumeOctreeListener*) branch->getListener(0);
+
+ LLVector3 center, size;
+
+ if (branch->getData().empty())
+ {
+ gGL.color3f(1.f,0.2f,0.f);
+ center.set(branch->getCenter().getF32ptr());
+ size.set(branch->getSize().getF32ptr());
+ }
+ else
+ {
+ gGL.color3f(0.75f, 1.f, 0.f);
+ center.set(vl->mBounds[0].getF32ptr());
+ size.set(vl->mBounds[1].getF32ptr());
+ }
+
+ drawBoxOutline(center, size);
+
+ for (U32 i = 0; i < 2; i++)
+ {
+ LLGLDepthTest depth(GL_TRUE, GL_FALSE, i == 1 ? GL_LEQUAL : GL_GREATER);
+
+ if (i == 1)
+ {
+ gGL.color4f(0,1,1,0.5f);
+ }
+ else
+ {
+ gGL.color4f(0,0.5f,0.5f, 0.25f);
+ drawBoxOutline(center, size);
+ }
+
+ if (i == 1)
+ {
+ gGL.flush();
+ glLineWidth(3.f);
+ }
+
+ gGL.begin(LLRender::TRIANGLES);
+ for (LLOctreeNode<LLVolumeTriangle>::const_element_iter iter = branch->getData().begin();
+ iter != branch->getData().end();
+ ++iter)
+ {
+ const LLVolumeTriangle* tri = *iter;
+
+ gGL.vertex3fv(tri->mV[0]->getF32ptr());
+ gGL.vertex3fv(tri->mV[1]->getF32ptr());
+ gGL.vertex3fv(tri->mV[2]->getF32ptr());
+ }
+ gGL.end();
+
+ if (i == 1)
+ {
+ gGL.flush();
+ glLineWidth(1.f);
+ }
+ }
+ }
+};
+
+void renderRaycast(LLDrawable* drawablep)
+{
if (drawablep->getNumFaces())
{
LLGLEnable blend(GL_BLEND);
gGL.color4f(0,1,1,0.5f);
- if (drawablep->getVOVolume() && gDebugRaycastFaceHit != -1)
+ if (drawablep->getVOVolume())
{
- glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
- pushVerts(drawablep->getFace(gDebugRaycastFaceHit), LLVertexBuffer::MAP_VERTEX);
- glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+ //glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+ //pushVerts(drawablep->getFace(gDebugRaycastFaceHit), LLVertexBuffer::MAP_VERTEX);
+ //glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+
+ LLVOVolume* vobj = drawablep->getVOVolume();
+ LLVolume* volume = vobj->getVolume();
+
+ bool transform = true;
+ if (drawablep->isState(LLDrawable::RIGGED))
+ {
+ volume = vobj->getRiggedVolume();
+ transform = false;
+ }
+
+ if (volume)
+ {
+ LLVector3 trans = drawablep->getRegion()->getOriginAgent();
+
+ for (S32 i = 0; i < volume->getNumVolumeFaces(); ++i)
+ {
+ const LLVolumeFace& face = volume->getVolumeFace(i);
+ if (!face.mOctree)
+ {
+ ((LLVolumeFace*) &face)->createOctree();
+ }
+
+ gGL.pushMatrix();
+ glTranslatef(trans.mV[0], trans.mV[1], trans.mV[2]);
+ glMultMatrixf((F32*) vobj->getRelativeXform().mMatrix);
+
+ LLVector3 start, end;
+ if (transform)
+ {
+ start = vobj->agentPositionToVolume(gDebugRaycastStart);
+ end = vobj->agentPositionToVolume(gDebugRaycastEnd);
+ }
+ else
+ {
+ start = gDebugRaycastStart;
+ end = gDebugRaycastEnd;
+ }
+
+ LLVector4a starta, enda;
+ starta.load3(start.mV);
+ enda.load3(end.mV);
+ LLVector4a dir;
+ dir.setSub(enda, starta);
+
+ F32 t = 1.f;
+
+ LLRenderOctreeRaycast render(starta, dir, &t);
+ gGL.flush();
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+
+ {
+ //render face positions
+ LLVertexBuffer::unbind();
+ glColor4f(0,1,1,0.5f);
+ glVertexPointer(3, GL_FLOAT, sizeof(LLVector4a), face.mPositions);
+ glDrawElements(GL_TRIANGLES, face.mNumIndices, GL_UNSIGNED_SHORT, face.mIndices);
+ }
+
+ render.traverse(face.mOctree);
+ gGL.popMatrix();
+ glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+ }
+ }
}
else if (drawablep->isAvatar())
{
- LLGLDepthTest depth(GL_FALSE);
- LLVOAvatar* av = (LLVOAvatar*) drawablep->getVObj().get();
- av->renderCollisionVolumes();
- }
-
- // draw intersection point
- glPushMatrix();
- glLoadMatrixd(gGLModelView);
- LLVector3 translate = gDebugRaycastIntersection;
- glTranslatef(translate.mV[0], translate.mV[1], translate.mV[2]);
- LLCoordFrame orient;
- orient.lookDir(gDebugRaycastNormal, gDebugRaycastBinormal);
- LLMatrix4 rotation;
- orient.getRotMatrixToParent(rotation);
- glMultMatrixf((float*)rotation.mMatrix);
-
- gGL.color4f(1,0,0,0.5f);
- drawBox(LLVector3(0, 0, 0), LLVector3(0.1f, 0.022f, 0.022f));
- gGL.color4f(0,1,0,0.5f);
- drawBox(LLVector3(0, 0, 0), LLVector3(0.021f, 0.1f, 0.021f));
- gGL.color4f(0,0,1,0.5f);
- drawBox(LLVector3(0, 0, 0), LLVector3(0.02f, 0.02f, 0.1f));
- glPopMatrix();
-
- // draw bounding box of prim
- const LLVector3* ext = drawablep->getSpatialExtents();
-
- LLVector3 pos = (ext[0] + ext[1]) * 0.5f;
- LLVector3 size = (ext[1] - ext[0]) * 0.5f;
+ if (drawablep->getVObj() == gDebugRaycastObject)
+ {
+ LLGLDepthTest depth(GL_FALSE);
+ LLVOAvatar* av = (LLVOAvatar*) drawablep->getVObj().get();
+ av->renderCollisionVolumes();
+ }
+ }
- LLGLDepthTest depth(GL_FALSE, GL_TRUE);
- gGL.color4f(0,0.5f,0.5f,1);
- drawBoxOutline(pos, size);
+ if (drawablep->getVObj() == gDebugRaycastObject)
+ {
+ // draw intersection point
+ glPushMatrix();
+ glLoadMatrixd(gGLModelView);
+ LLVector3 translate = gDebugRaycastIntersection;
+ glTranslatef(translate.mV[0], translate.mV[1], translate.mV[2]);
+ LLCoordFrame orient;
+ orient.lookDir(gDebugRaycastNormal, gDebugRaycastBinormal);
+ LLMatrix4 rotation;
+ orient.getRotMatrixToParent(rotation);
+ glMultMatrixf((float*)rotation.mMatrix);
+
+ gGL.color4f(1,0,0,0.5f);
+ drawBox(LLVector3(0, 0, 0), LLVector3(0.1f, 0.022f, 0.022f));
+ gGL.color4f(0,1,0,0.5f);
+ drawBox(LLVector3(0, 0, 0), LLVector3(0.021f, 0.1f, 0.021f));
+ gGL.color4f(0,0,1,0.5f);
+ drawBox(LLVector3(0, 0, 0), LLVector3(0.02f, 0.02f, 0.1f));
+ glPopMatrix();
+
+ // draw bounding box of prim
+ const LLVector4a* ext = drawablep->getSpatialExtents();
+
+ LLVector4a pos;
+ pos.setAdd(ext[0], ext[1]);
+ pos.mul(0.5f);
+ LLVector4a size;
+ size.setSub(ext[1], ext[0]);
+ size.mul(0.5f);
+ LLGLDepthTest depth(GL_FALSE, GL_TRUE);
+ gGL.color4f(0,0.5f,0.5f,1);
+ drawBoxOutline(pos, size);
+ }
}
}
@@ -2947,7 +3769,6 @@ void renderAgentTarget(LLVOAvatar* avatar)
}
}
-
class LLOctreeRenderNonOccluded : public LLOctreeTraveler<LLDrawable>
{
public:
@@ -3007,8 +3828,8 @@ public:
return;
}
- LLVector3 nodeCenter = group->mBounds[0];
- LLVector3 octCenter = LLVector3(group->mOctreeNode->getCenter());
+ LLVector4a nodeCenter = group->mBounds[0];
+ LLVector4a octCenter = group->mOctreeNode->getCenter();
group->rebuildGeom();
group->rebuildMesh();
@@ -3031,14 +3852,25 @@ public:
{
renderBoundingBox(drawable);
}
+
+ if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_NORMALS))
+ {
+ renderNormals(drawable);
+ }
if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_BUILD_QUEUE))
{
if (drawable->isState(LLDrawable::IN_REBUILD_Q2))
{
gGL.color4f(0.6f, 0.6f, 0.1f, 1.f);
- const LLVector3* ext = drawable->getSpatialExtents();
- drawBoxOutline((ext[0]+ext[1])*0.5f, (ext[1]-ext[0])*0.5f);
+ const LLVector4a* ext = drawable->getSpatialExtents();
+ LLVector4a center;
+ center.setAdd(ext[0], ext[1]);
+ center.mul(0.5f);
+ LLVector4a size;
+ size.setSub(ext[1], ext[0]);
+ size.mul(0.5f);
+ drawBoxOutline(center, size);
}
}
@@ -3103,6 +3935,41 @@ public:
}
};
+
+class LLOctreeRenderPhysicsShapes : public LLOctreeTraveler<LLDrawable>
+{
+public:
+ LLCamera* mCamera;
+ LLOctreeRenderPhysicsShapes(LLCamera* camera): mCamera(camera) {}
+
+ virtual void traverse(const LLSpatialGroup::OctreeNode* node)
+ {
+ LLSpatialGroup* group = (LLSpatialGroup*) node->getListener(0);
+
+ if (!mCamera || mCamera->AABBInFrustumNoFarClip(group->mBounds[0], group->mBounds[1]))
+ {
+ node->accept(this);
+ stop_glerror();
+
+ for (U32 i = 0; i < node->getChildCount(); i++)
+ {
+ traverse(node->getChild(i));
+ stop_glerror();
+ }
+
+ group->rebuildGeom();
+ group->rebuildMesh();
+
+ renderPhysicsShapes(group);
+ }
+ }
+
+ virtual void visit(const LLSpatialGroup::OctreeNode* branch)
+ {
+
+ }
+};
+
class LLOctreePushBBoxVerts : public LLOctreeTraveler<LLDrawable>
{
public:
@@ -3221,6 +4088,25 @@ public:
};
+void LLSpatialPartition::renderPhysicsShapes()
+{
+ LLSpatialBridge* bridge = asBridge();
+ LLCamera* camera = LLViewerCamera::getInstance();
+
+ if (bridge)
+ {
+ camera = NULL;
+ }
+
+ gGL.flush();
+ gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+ glLineWidth(3.f);
+ LLOctreeRenderPhysicsShapes render_physics(camera);
+ render_physics.traverse(mOctree);
+ gGL.flush();
+ glLineWidth(1.f);
+}
+
void LLSpatialPartition::renderDebug()
{
if (!gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_OCTREE |
@@ -3229,13 +4115,14 @@ void LLSpatialPartition::renderDebug()
LLPipeline::RENDER_DEBUG_BATCH_SIZE |
LLPipeline::RENDER_DEBUG_UPDATE_TYPE |
LLPipeline::RENDER_DEBUG_BBOXES |
+ LLPipeline::RENDER_DEBUG_NORMALS |
LLPipeline::RENDER_DEBUG_POINTS |
LLPipeline::RENDER_DEBUG_TEXTURE_PRIORITY |
LLPipeline::RENDER_DEBUG_TEXTURE_ANIM |
LLPipeline::RENDER_DEBUG_RAYCAST |
LLPipeline::RENDER_DEBUG_AVATAR_VOLUME |
LLPipeline::RENDER_DEBUG_AGENT_TARGET |
- LLPipeline::RENDER_DEBUG_BUILD_QUEUE |
+ //LLPipeline::RENDER_DEBUG_BUILD_QUEUE |
LLPipeline::RENDER_DEBUG_SHADOW_FRUSTA))
{
return;
@@ -3274,7 +4161,11 @@ void LLSpatialPartition::renderDebug()
void LLSpatialGroup::drawObjectBox(LLColor4 col)
{
gGL.color4fv(col.mV);
- drawBox(mObjectBounds[0], mObjectBounds[1]*1.01f+LLVector3(0.001f, 0.001f, 0.001f));
+ LLVector4a size;
+ size = mObjectBounds[1];
+ size.mul(1.01f);
+ size.add(LLVector4a(0.001f));
+ drawBox(mObjectBounds[0], size);
}
@@ -3334,8 +4225,8 @@ public:
LLSpatialGroup* group = (LLSpatialGroup*) child->getListener(0);
- LLVector3 size;
- LLVector3 center;
+ LLVector4a size;
+ LLVector4a center;
size = group->mBounds[1];
center = group->mBounds[0];
@@ -3352,7 +4243,11 @@ public:
local_end = mEnd * local_matrix;
}
- if (LLLineSegmentBoxIntersect(local_start, local_end, center, size))
+ LLVector4a start, end;
+ start.load3(local_start.mV);
+ end.load3(local_end.mV);
+
+ if (LLLineSegmentBoxIntersect(start, end, center, size))
{
check(child);
}
@@ -3442,18 +4337,9 @@ LLDrawInfo::LLDrawInfo(U16 start, U16 end, U32 count, U32 offset,
mDistance(0.f),
mDrawMode(LLRender::TRIANGLES)
{
+ mVertexBuffer->validateRange(mStart, mEnd, mCount, mOffset);
+
mDebugColor = (rand() << 16) + rand();
- if (mStart >= mVertexBuffer->getRequestedVerts() ||
- mEnd >= mVertexBuffer->getRequestedVerts())
- {
- llerrs << "Invalid draw info vertex range." << llendl;
- }
-
- if (mOffset >= (U32) mVertexBuffer->getRequestedIndices() ||
- mOffset + mCount > (U32) mVertexBuffer->getRequestedIndices())
- {
- llerrs << "Invalid draw info index range." << llendl;
- }
}
LLDrawInfo::~LLDrawInfo()
@@ -3467,6 +4353,16 @@ LLDrawInfo::~LLDrawInfo()
{
mFace->setDrawInfo(NULL);
}
+
+ if (gDebugGL)
+ {
+ gPipeline.checkReferences(this);
+ }
+}
+
+void LLDrawInfo::validate()
+{
+ mVertexBuffer->validateRange(mStart, mEnd, mCount, mOffset);
}
LLVertexBuffer* LLGeometryManager::createVertexBuffer(U32 type_mask, U32 usage)
diff --git a/indra/newview/llspatialpartition.h b/indra/newview/llspatialpartition.h
index 2b9cf6c630..0d9cad914a 100644
--- a/indra/newview/llspatialpartition.h
+++ b/indra/newview/llspatialpartition.h
@@ -39,7 +39,7 @@
#include "lldrawpool.h"
#include "llface.h"
#include "llviewercamera.h"
-
+#include "llvector4a.h"
#include <queue>
#define SG_STATE_INHERIT_MASK (OCCLUDED)
@@ -51,11 +51,16 @@ class LLSpatialGroup;
class LLTextureAtlas;
class LLTextureAtlasSlot;
+S32 AABBSphereIntersect(const LLVector4a& min, const LLVector4a& max, const LLVector3 &origin, const F32 &rad);
+S32 AABBSphereIntersectR2(const LLVector4a& min, const LLVector4a& max, const LLVector3 &origin, const F32 &radius_squared);
+
S32 AABBSphereIntersect(const LLVector3& min, const LLVector3& max, const LLVector3 &origin, const F32 &rad);
S32 AABBSphereIntersectR2(const LLVector3& min, const LLVector3& max, const LLVector3 &origin, const F32 &radius_squared);
+void pushVerts(LLFace* face, U32 mask);
// get index buffer for binary encoded axis vertex buffer given a box at center being viewed by given camera
-U8* get_box_fan_indices(LLCamera* camera, const LLVector3& center);
+U32 get_box_fan_indices(LLCamera* camera, const LLVector4a& center);
+U8* get_box_fan_indices_ptr(LLCamera* camera, const LLVector4a& center);
class LLDrawInfo : public LLRefCount
{
@@ -63,11 +68,27 @@ protected:
~LLDrawInfo();
public:
+
+ LLDrawInfo(const LLDrawInfo& rhs)
+ {
+ *this = rhs;
+ }
+
+ const LLDrawInfo& operator=(const LLDrawInfo& rhs)
+ {
+ llerrs << "Illegal operation!" << llendl;
+ return *this;
+ }
+
LLDrawInfo(U16 start, U16 end, U32 count, U32 offset,
LLViewerTexture* image, LLVertexBuffer* buffer,
BOOL fullbright = FALSE, U8 bump = 0, BOOL particle = FALSE, F32 part_size = 0);
+ void validate();
+
+ LLVector4a mExtents[2];
+
LLPointer<LLVertexBuffer> mVertexBuffer;
LLPointer<LLViewerTexture> mTexture;
LLColor4U mGlowColor;
@@ -86,7 +107,6 @@ public:
LLSpatialGroup* mGroup;
LLFace* mFace; //associated face
F32 mDistance;
- LLVector3 mExtents[2];
U32 mDrawMode;
struct CompareTexture
@@ -128,6 +148,17 @@ public:
};
+ struct CompareMatrixTexturePtr
+ {
+ bool operator()(const LLPointer<LLDrawInfo>& lhs, const LLPointer<LLDrawInfo>& rhs)
+ {
+ return lhs.get() != rhs.get()
+ && (lhs.isNull() || (rhs.notNull() && (lhs->mModelMatrix > rhs->mModelMatrix ||
+ (lhs->mModelMatrix == rhs->mModelMatrix && lhs->mTexture.get() > rhs->mTexture.get()))));
+ }
+
+ };
+
struct CompareBump
{
bool operator()(const LLPointer<LLDrawInfo>& lhs, const LLPointer<LLDrawInfo>& rhs)
@@ -149,11 +180,25 @@ public:
};
};
+LL_ALIGN_PREFIX(64)
class LLSpatialGroup : public LLOctreeListener<LLDrawable>
{
friend class LLSpatialPartition;
friend class LLOctreeStateCheck;
public:
+
+ LLSpatialGroup(const LLSpatialGroup& rhs)
+ {
+ *this = rhs;
+ }
+
+ const LLSpatialGroup& operator=(const LLSpatialGroup& rhs)
+ {
+ llerrs << "Illegal operation!" << llendl;
+ return *this;
+ }
+
+ static std::set<GLuint> sPendingQueries; //pending occlusion queries
static U32 sNodeCount;
static BOOL sNoDelete; //deletion of spatial groups and draw info not allowed if TRUE
@@ -262,8 +307,8 @@ public:
BOOL isVisible() const;
BOOL isRecentlyVisible() const;
void setVisible();
- void shift(const LLVector3 &offset);
- BOOL boundObjects(BOOL empty, LLVector3& newMin, LLVector3& newMax);
+ void shift(const LLVector4a &offset);
+ BOOL boundObjects(BOOL empty, LLVector4a& newMin, LLVector4a& newMax);
void unbound();
BOOL rebound();
void buildOcclusion(); //rebuild mOcclusionVerts
@@ -311,6 +356,27 @@ public:
void addAtlas(LLTextureAtlas* atlasp, S8 recursive_level = 3) ;
void removeAtlas(LLTextureAtlas* atlasp, BOOL remove_group = TRUE, S8 recursive_level = 3) ;
void clearAtlasList() ;
+
+public:
+
+ typedef enum
+ {
+ BOUNDS = 0,
+ EXTENTS = 2,
+ OBJECT_BOUNDS = 4,
+ OBJECT_EXTENTS = 6,
+ VIEW_ANGLE = 8,
+ LAST_VIEW_ANGLE = 9,
+ V4_COUNT = 10
+ } eV4Index;
+
+ LLVector4a mBounds[2]; // bounding box (center, size) of this node and all its children (tight fit to objects)
+ LLVector4a mExtents[2]; // extents (min, max) of this node and all its children
+ LLVector4a mObjectExtents[2]; // extents (min, max) of objects in this node
+ LLVector4a mObjectBounds[2]; // bounding box (center, size) of objects in this node
+ LLVector4a mViewAngle;
+ LLVector4a mLastUpdateViewAngle;
+
private:
U32 mCurUpdatingTime ;
//do not make the below two to use LLPointer
@@ -338,14 +404,9 @@ public:
F32 mBuilt;
OctreeNode* mOctreeNode;
LLSpatialPartition* mSpatialPartition;
- LLVector3 mBounds[2]; // bounding box (center, size) of this node and all its children (tight fit to objects)
- LLVector3 mExtents[2]; // extents (min, max) of this node and all its children
- LLVector3 mObjectExtents[2]; // extents (min, max) of objects in this node
- LLVector3 mObjectBounds[2]; // bounding box (center, size) of objects in this node
-
LLPointer<LLVertexBuffer> mVertexBuffer;
- F32* mOcclusionVerts;
+ LLPointer<LLVertexBuffer> mOcclusionVerts;
GLuint mOcclusionQuery[LLViewerCamera::NUM_CAMERAS];
U32 mBufferUsage;
@@ -356,13 +417,10 @@ public:
F32 mDepth;
F32 mLastUpdateDistance;
F32 mLastUpdateTime;
-
- LLVector3 mViewAngle;
- LLVector3 mLastUpdateViewAngle;
F32 mPixelArea;
F32 mRadius;
-};
+} LL_ALIGN_POSTFIX(64);
class LLGeometryManager
{
@@ -398,7 +456,7 @@ public:
// If the drawable moves, move it here.
virtual void move(LLDrawable *drawablep, LLSpatialGroup *curp, BOOL immediate = FALSE);
- virtual void shift(const LLVector3 &offset);
+ virtual void shift(const LLVector4a &offset);
virtual F32 calcDistance(LLSpatialGroup* group, LLCamera& camera);
virtual F32 calcPixelArea(LLSpatialGroup* group, LLCamera& camera);
@@ -414,6 +472,7 @@ public:
virtual LLSpatialBridge* asBridge() { return NULL; }
virtual BOOL isBridge() { return asBridge() != NULL; }
+ void renderPhysicsShapes();
void renderDebug();
void renderIntersectingBBoxes(LLCamera* camera);
void restoreGL();
@@ -456,7 +515,7 @@ public:
virtual void makeActive();
virtual void move(LLDrawable *drawablep, LLSpatialGroup *curp, BOOL immediate = FALSE);
virtual BOOL updateMove();
- virtual void shiftPos(const LLVector3& vec);
+ virtual void shiftPos(const LLVector4a& vec);
virtual void cleanupReferences();
virtual LLSpatialPartition* asPartition() { return this; }
virtual LLSpatialBridge* asBridge() { return this; }
@@ -484,6 +543,7 @@ public:
sg_list_t::iterator beginAlphaGroups();
sg_list_t::iterator endAlphaGroups();
+ bool hasOcclusionGroups() { return mOcclusionGroupsSize > 0; }
sg_list_t::iterator beginOcclusionGroups();
sg_list_t::iterator endOcclusionGroups();
@@ -613,6 +673,13 @@ public:
class LLVolumeGeometryManager: public LLGeometryManager
{
public:
+ typedef enum
+ {
+ NONE = 0,
+ BATCH_SORT,
+ DISTANCE_SORT
+ } eSortType;
+
virtual ~LLVolumeGeometryManager() { }
virtual void rebuildGeom(LLSpatialGroup* group);
virtual void rebuildMesh(LLSpatialGroup* group);
@@ -647,7 +714,7 @@ class LLHUDBridge : public LLVolumeBridge
{
public:
LLHUDBridge(LLDrawable* drawablep);
- virtual void shiftPos(const LLVector3& vec);
+ virtual void shiftPos(const LLVector4a& vec);
virtual F32 calcPixelArea(LLSpatialGroup* group, LLCamera& camera);
};
@@ -664,11 +731,9 @@ class LLHUDPartition : public LLBridgePartition
{
public:
LLHUDPartition();
- virtual void shift(const LLVector3 &offset);
+ virtual void shift(const LLVector4a &offset);
};
-void validate_draw_info(LLDrawInfo& params);
-
extern const F32 SG_BOX_SIDE;
extern const F32 SG_BOX_OFFSET;
extern const F32 SG_BOX_RAD;
diff --git a/indra/newview/llspeakbutton.cpp b/indra/newview/llspeakbutton.cpp
index d52e0a6c86..d3e96f8dfb 100644
--- a/indra/newview/llspeakbutton.cpp
+++ b/indra/newview/llspeakbutton.cpp
@@ -54,26 +54,6 @@ LLSpeakButton::Params::Params()
// See widgets/talk_button.xml
}
-void LLSpeakButton::draw()
-{
- // LLVoiceClient::getInstance() is the authoritative global source of info regarding our open-mic state, we merely reflect that state.
- bool openmic = LLVoiceClient::getInstance()->getUserPTTState();
- bool voiceenabled = LLVoiceClient::getInstance()->voiceEnabled();
- mSpeakBtn->setToggleState(openmic && voiceenabled);
- mOutputMonitor->setIsMuted(!voiceenabled);
- LLUICtrl::draw();
-}
-void LLSpeakButton::setSpeakBtnEnabled(bool enabled)
-{
- LLButton* speak_btn = getChild<LLButton>("speak_btn");
- speak_btn->setEnabled(enabled);
-}
-void LLSpeakButton::setFlyoutBtnEnabled(bool enabled)
-{
- LLButton* show_btn = getChild<LLBottomtrayButton>("speak_flyout_btn");
- show_btn->setEnabled(enabled);
-}
-
LLSpeakButton::LLSpeakButton(const Params& p)
: LLUICtrl(p)
, mOutputMonitor(NULL)
diff --git a/indra/newview/llspeakbutton.h b/indra/newview/llspeakbutton.h
index 2fdf80c1f2..7db01112ef 100644
--- a/indra/newview/llspeakbutton.h
+++ b/indra/newview/llspeakbutton.h
@@ -53,12 +53,7 @@ public:
};
/*virtual*/ ~LLSpeakButton();
- /*virtual*/ void draw();
- // methods for enabling/disabling right and left parts of speak button separately(EXT-4648)
- void setSpeakBtnEnabled(bool enabled);
- void setFlyoutBtnEnabled(bool enabled);
-
// *HACK: Need to put tooltips in a translatable location,
// the panel that contains this button.
void setSpeakToolTip(const std::string& msg);
diff --git a/indra/newview/llspeakers.cpp b/indra/newview/llspeakers.cpp
index 40aea05839..c588bd8fb4 100644
--- a/indra/newview/llspeakers.cpp
+++ b/indra/newview/llspeakers.cpp
@@ -920,7 +920,7 @@ void LLLocalSpeakerMgr::updateSpeakerList()
if (speakerp->mStatus == LLSpeaker::STATUS_TEXT_ONLY)
{
LLVOAvatar* avatarp = (LLVOAvatar*)gObjectList.findObject(speaker_id);
- if (!avatarp || dist_vec(avatarp->getPositionAgent(), gAgent.getPositionAgent()) > CHAT_NORMAL_RADIUS)
+ if (!avatarp || dist_vec_squared(avatarp->getPositionAgent(), gAgent.getPositionAgent()) > CHAT_NORMAL_RADIUS_SQUARED)
{
setSpeakerNotInChannel(speakerp);
}
diff --git a/indra/newview/llsprite.cpp b/indra/newview/llsprite.cpp
index a69592b61c..4bde2dfcab 100644
--- a/indra/newview/llsprite.cpp
+++ b/indra/newview/llsprite.cpp
@@ -186,14 +186,15 @@ void LLSprite::updateFace(LLFace &face)
U16 index_offset;
// Setup face
- if (face.mVertexBuffer.isNull())
+ if (!face.getVertexBuffer())
{
- face.mVertexBuffer = new LLVertexBuffer(LLVertexBuffer::MAP_VERTEX |
+ LLVertexBuffer* buff = new LLVertexBuffer(LLVertexBuffer::MAP_VERTEX |
LLVertexBuffer::MAP_TEXCOORD0,
GL_STREAM_DRAW_ARB);
- face.mVertexBuffer->allocateBuffer(4, 12, TRUE);
+ buff->allocateBuffer(4, 12, TRUE);
face.setGeomIndex(0);
face.setIndicesIndex(0);
+ face.setVertexBuffer(buff);
}
index_offset = face.getGeometry(verticesp,normalsp,tex_coordsp, indicesp);
@@ -242,7 +243,7 @@ void LLSprite::updateFace(LLFace &face)
*indicesp++ = 3 + index_offset;
}
- face.mVertexBuffer->setBuffer(0);
+ face.getVertexBuffer()->setBuffer(0);
face.mCenterAgent = mPosition;
}
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index ca908ef822..86b09473ab 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -421,7 +421,7 @@ bool idle_startup()
//
// Load autopilot and stats stuff
- gAgentPilot.load(gSavedSettings.getString("StatsPilotFile"));
+ gAgentPilot.load();
//gErrorStream.setTime(gSavedSettings.getBOOL("LogTimestamps"));
@@ -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
@@ -1959,9 +1968,8 @@ bool idle_startup()
}
// Start automatic replay if the flag is set.
- if (gSavedSettings.getBOOL("StatsAutoRun") || LLAgentPilot::sReplaySession)
+ if (gSavedSettings.getBOOL("StatsAutoRun") || gAgentPilot.getReplaySession())
{
- LLUUID id;
LL_DEBUGS("AppInit") << "Starting automatic playback" << LL_ENDL;
gAgentPilot.startPlayback();
}
@@ -3070,6 +3078,11 @@ bool process_login_success_response()
}
// Request the map server url
+ // Non-agni grids have a different default location.
+ if (!LLGridManager::getInstance()->isInProductionGrid())
+ {
+ gSavedSettings.setString("MapServerURL", "http://test.map.secondlife.com.s3.amazonaws.com/");
+ }
std::string map_server_url = response["map-server-url"];
if(!map_server_url.empty())
{
diff --git a/indra/newview/llsurfacepatch.cpp b/indra/newview/llsurfacepatch.cpp
index 1d57e27616..5077c2c7e1 100644
--- a/indra/newview/llsurfacepatch.cpp
+++ b/indra/newview/llsurfacepatch.cpp
@@ -854,8 +854,10 @@ void LLSurfacePatch::updateVisibility()
F32 stride_per_distance = DEFAULT_DELTA_ANGLE / mSurfacep->getMetersPerGrid();
U32 grids_per_patch_edge = mSurfacep->getGridsPerPatchEdge();
- LLVector3 center = mCenterRegion + mSurfacep->getOriginAgent();
- LLVector3 radius = LLVector3(mRadius, mRadius, mRadius);
+ LLVector4a center;
+ center.load3( (mCenterRegion + mSurfacep->getOriginAgent()).mV);
+ LLVector4a radius;
+ radius.splat(mRadius);
// sphere in frustum on global coordinates
if (LLViewerCamera::getInstance()->AABBInFrustumNoFarClip(center, radius))
diff --git a/indra/newview/llsyswellwindow.cpp b/indra/newview/llsyswellwindow.cpp
index e7b5c13860..cb49976e5f 100644
--- a/indra/newview/llsyswellwindow.cpp
+++ b/indra/newview/llsyswellwindow.cpp
@@ -310,7 +310,7 @@ void LLIMWellWindow::RowPanel::onChicletSizeChanged(LLChiclet* ctrl, const LLSD&
S32 new_text_left = mChiclet->getRect().mRight + CHICLET_HPAD;
LLRect text_rect = text->getRect();
text_rect.mLeft = new_text_left;
- text->setRect(text_rect);
+ text->setShape(text_rect);
}
//---------------------------------------------------------------------------------
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 56e9739350..1023a4339b 100644
--- a/indra/newview/lltexturectrl.cpp
+++ b/indra/newview/lltexturectrl.cpp
@@ -289,7 +289,9 @@ BOOL LLFloaterTexturePicker::handleDragAndDrop(
{
BOOL handled = FALSE;
- if (cargo_type == DAD_TEXTURE)
+ bool is_mesh = cargo_type == DAD_MESH;
+
+ if ((cargo_type == DAD_TEXTURE) || is_mesh)
{
LLInventoryItem *item = (LLInventoryItem *)cargo_data;
@@ -1206,7 +1208,11 @@ BOOL LLTextureCtrl::handleDragAndDrop(S32 x, S32 y, MASK mask,
// returns true, then the cast was valid, and we can perform
// the third test without problems.
LLInventoryItem* item = (LLInventoryItem*)cargo_data;
- if (getEnabled() && (cargo_type == DAD_TEXTURE) && allowDrop(item))
+ bool is_mesh = cargo_type == DAD_MESH;
+
+ if (getEnabled() &&
+ ((cargo_type == DAD_TEXTURE) || is_mesh) &&
+ allowDrop(item))
{
if (drop)
{
diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp
index ba243f258a..d23d2b3abd 100644
--- a/indra/newview/lltooldraganddrop.cpp
+++ b/indra/newview/lltooldraganddrop.cpp
@@ -35,7 +35,6 @@
#include "llagentwearables.h"
#include "llappearancemgr.h"
#include "lldictionary.h"
-//#include "llfirstuse.h"
#include "llfloaterreg.h"
#include "llfloatertools.h"
#include "llgesturemgr.h"
@@ -308,23 +307,24 @@ LLToolDragAndDrop::dragOrDrop3dImpl LLToolDragAndDrop::LLDragAndDropDictionary::
LLToolDragAndDrop::LLDragAndDropDictionary::LLDragAndDropDictionary()
{
- // DT_NONE DT_SELF DT_AVATAR DT_OBJECT DT_LAND
- // |--------------|---------------------------|---------------------------|-------------------------------|--------------|
+ // DT_NONE DT_SELF DT_AVATAR DT_OBJECT DT_LAND
+ // |-------------------------------|----------------------------------------------|-----------------------------------------------|---------------------------------------------------|--------------------------------|
addEntry(DAD_NONE, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL));
- addEntry(DAD_TEXTURE, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dTextureObject, &LLToolDragAndDrop::dad3dNULL));
- addEntry(DAD_SOUND, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dUpdateInventory, &LLToolDragAndDrop::dad3dNULL));
+ addEntry(DAD_TEXTURE, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dTextureObject, &LLToolDragAndDrop::dad3dNULL));
+ addEntry(DAD_SOUND, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dUpdateInventory, &LLToolDragAndDrop::dad3dNULL));
addEntry(DAD_CALLINGCARD, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dUpdateInventory, &LLToolDragAndDrop::dad3dNULL));
- addEntry(DAD_LANDMARK, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dUpdateInventory, &LLToolDragAndDrop::dad3dNULL));
- addEntry(DAD_SCRIPT, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dRezScript, &LLToolDragAndDrop::dad3dNULL));
- addEntry(DAD_CLOTHING, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dWearItem, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dUpdateInventory, &LLToolDragAndDrop::dad3dNULL));
- addEntry(DAD_OBJECT, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dRezAttachmentFromInv, &LLToolDragAndDrop::dad3dGiveInventoryObject, &LLToolDragAndDrop::dad3dRezObjectOnObject, &LLToolDragAndDrop::dad3dRezObjectOnLand));
- addEntry(DAD_NOTECARD, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dUpdateInventory, &LLToolDragAndDrop::dad3dNULL));
- addEntry(DAD_CATEGORY, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dWearCategory, &LLToolDragAndDrop::dad3dGiveInventoryCategory,&LLToolDragAndDrop::dad3dUpdateInventoryCategory, &LLToolDragAndDrop::dad3dNULL));
+ addEntry(DAD_LANDMARK, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dUpdateInventory, &LLToolDragAndDrop::dad3dNULL));
+ addEntry(DAD_SCRIPT, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dRezScript, &LLToolDragAndDrop::dad3dNULL));
+ addEntry(DAD_CLOTHING, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dWearItem, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dUpdateInventory, &LLToolDragAndDrop::dad3dNULL));
+ addEntry(DAD_OBJECT, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dRezAttachmentFromInv, &LLToolDragAndDrop::dad3dGiveInventoryObject, &LLToolDragAndDrop::dad3dRezObjectOnObject, &LLToolDragAndDrop::dad3dRezObjectOnLand));
+ addEntry(DAD_NOTECARD, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dUpdateInventory, &LLToolDragAndDrop::dad3dNULL));
+ addEntry(DAD_CATEGORY, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dWearCategory, &LLToolDragAndDrop::dad3dGiveInventoryCategory, &LLToolDragAndDrop::dad3dUpdateInventoryCategory, &LLToolDragAndDrop::dad3dNULL));
addEntry(DAD_ROOT_CATEGORY, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL));
- addEntry(DAD_BODYPART, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dWearItem, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dUpdateInventory, &LLToolDragAndDrop::dad3dNULL));
- addEntry(DAD_ANIMATION, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dUpdateInventory, &LLToolDragAndDrop::dad3dNULL));
- addEntry(DAD_GESTURE, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dActivateGesture, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dUpdateInventory, &LLToolDragAndDrop::dad3dNULL));
+ addEntry(DAD_BODYPART, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dWearItem, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dUpdateInventory, &LLToolDragAndDrop::dad3dNULL));
+ addEntry(DAD_ANIMATION, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dUpdateInventory, &LLToolDragAndDrop::dad3dNULL));
+ addEntry(DAD_GESTURE, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dActivateGesture, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dUpdateInventory, &LLToolDragAndDrop::dad3dNULL));
addEntry(DAD_LINK, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL));
+ addEntry(DAD_MESH, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dMeshObject, &LLToolDragAndDrop::dad3dNULL));
// TODO: animation on self could play it? edit it?
// TODO: gesture on self could play it? edit it?
};
@@ -397,7 +397,7 @@ void LLToolDragAndDrop::beginDrag(EDragAndDropType type,
{
folder_ids.push_back(cargo_id);
}
- gInventory.collectDescendentsIf (
+ gInventory.collectDescendentsIf(
cargo_id,
cats,
items,
@@ -468,7 +468,7 @@ void LLToolDragAndDrop::beginMultiDrag(
{
cat_ids.insert(cat->getUUID());
}
- gInventory.collectDescendentsIf (
+ gInventory.collectDescendentsIf(
cat->getUUID(),
cats,
items,
@@ -1028,6 +1028,31 @@ void LLToolDragAndDrop::dropTextureAllFaces(LLViewerObject* hit_obj,
hit_obj->sendTEUpdate();
}
+void LLToolDragAndDrop::dropMesh(LLViewerObject* hit_obj,
+ LLInventoryItem* item,
+ LLToolDragAndDrop::ESource source,
+ const LLUUID& src_id)
+{
+ if (!item)
+ {
+ llwarns << "no inventory item." << llendl;
+ return;
+ }
+ LLUUID asset_id = item->getAssetUUID();
+ BOOL success = handleDropTextureProtections(hit_obj, item, source, src_id);
+ if(!success)
+ {
+ return;
+ }
+
+ LLSculptParams sculpt_params;
+ sculpt_params.setSculptTexture(asset_id);
+ sculpt_params.setSculptType(LL_SCULPT_TYPE_MESH);
+ hit_obj->setParameterEntry(LLNetworkData::PARAMS_SCULPT, sculpt_params, TRUE);
+
+ dialog_refresh_all();
+}
+
/*
void LLToolDragAndDrop::dropTextureOneFaceAvatar(LLVOAvatar* avatar, S32 hit_face, LLInventoryItem* item)
{
@@ -1124,9 +1149,9 @@ void LLToolDragAndDrop::dropScript(LLViewerObject* hit_obj,
}
void LLToolDragAndDrop::dropObject(LLViewerObject* raycast_target,
- BOOL bypass_sim_raycast,
- BOOL from_task_inventory,
- BOOL remove_from_inventory)
+ BOOL bypass_sim_raycast,
+ BOOL from_task_inventory,
+ BOOL remove_from_inventory)
{
LLViewerRegion* regionp = LLWorld::getInstance()->getRegionFromPosGlobal(mLastHitPos);
if (!regionp)
@@ -1362,7 +1387,7 @@ EAcceptance LLToolDragAndDrop::willObjectAcceptInventory(LLViewerObject* obj, LL
// help make sure that drops that are from an object to an object
// don't have to worry about order of evaluation. Think of this
// like check for self in assignment.
- if (obj->getID() == item->getParentUUID())
+ if(obj->getID() == item->getParentUUID())
{
return ACCEPT_NO;
}
@@ -1371,17 +1396,19 @@ EAcceptance LLToolDragAndDrop::willObjectAcceptInventory(LLViewerObject* obj, LL
// gAgent.getGroupID())
// && (obj->mPermModify || obj->mFlagAllowInventoryAdd));
BOOL worn = FALSE;
+ LLVOAvatarSelf* my_avatar = NULL;
switch(item->getType())
{
case LLAssetType::AT_OBJECT:
- if (isAgentAvatarValid() && gAgentAvatarp->isWearingAttachment(item->getUUID()))
+ my_avatar = gAgentAvatarp;
+ if(my_avatar && my_avatar->isWearingAttachment(item->getUUID()))
{
worn = TRUE;
}
break;
case LLAssetType::AT_BODYPART:
case LLAssetType::AT_CLOTHING:
- if (gAgentWearables.isWearingItem(item->getUUID()))
+ if(gAgentWearables.isWearingItem(item->getUUID()))
{
worn = TRUE;
}
@@ -1396,7 +1423,7 @@ EAcceptance LLToolDragAndDrop::willObjectAcceptInventory(LLViewerObject* obj, LL
const LLPermissions& perm = item->getPermissions();
BOOL modify = (obj->permModify() || obj->flagAllowInventoryAdd());
BOOL transfer = FALSE;
- if ((obj->permYouOwner() && (perm.getOwner() == gAgent.getID()))
+ if((obj->permYouOwner() && (perm.getOwner() == gAgent.getID()))
|| perm.allowOperationBy(PERM_TRANSFER, gAgent.getID()))
{
transfer = TRUE;
@@ -1404,15 +1431,15 @@ EAcceptance LLToolDragAndDrop::willObjectAcceptInventory(LLViewerObject* obj, LL
BOOL volume = (LL_PCODE_VOLUME == obj->getPCode());
BOOL attached = obj->isAttachment();
BOOL unrestricted = ((perm.getMaskBase() & PERM_ITEM_UNRESTRICTED) == PERM_ITEM_UNRESTRICTED) ? TRUE : FALSE;
- if (attached && !unrestricted)
+ if(attached && !unrestricted)
{
return ACCEPT_NO_LOCKED;
}
- else if (modify && transfer && volume && !worn)
+ else if(modify && transfer && volume && !worn)
{
return ACCEPT_YES_MULTI;
}
- else if (!modify)
+ else if(!modify)
{
return ACCEPT_NO_LOCKED;
}
@@ -1507,14 +1534,15 @@ bool LLToolDragAndDrop::handleGiveDragAndDrop(LLUUID dest_agent, LLUUID session_
case DAD_ANIMATION:
case DAD_GESTURE:
case DAD_CALLINGCARD:
+ case DAD_MESH:
{
LLViewerInventoryItem* inv_item = (LLViewerInventoryItem*)cargo_data;
- if (gInventory.getItem(inv_item->getUUID())
+ if(gInventory.getItem(inv_item->getUUID())
&& LLGiveInventory::isInventoryGiveAcceptable(inv_item))
{
// *TODO: get multiple object transfers working
*accept = ACCEPT_YES_COPY_SINGLE;
- if (drop)
+ if(drop)
{
LLIMModel::LLIMSession * session = LLIMModel::instance().findIMSession(session_id);
@@ -1554,11 +1582,11 @@ bool LLToolDragAndDrop::handleGiveDragAndDrop(LLUUID dest_agent, LLUUID session_
case DAD_CATEGORY:
{
LLViewerInventoryCategory* inv_cat = (LLViewerInventoryCategory*)cargo_data;
- if (gInventory.getCategory(inv_cat->getUUID()))
+ if( gInventory.getCategory( inv_cat->getUUID() ) )
{
// *TODO: get multiple object transfers working
*accept = ACCEPT_YES_COPY_SINGLE;
- if (drop)
+ if(drop)
{
LLGiveInventory::doGiveInventoryCategory(dest_agent, inv_cat, session_id);
}
@@ -1599,7 +1627,7 @@ EAcceptance LLToolDragAndDrop::dad3dRezAttachmentFromInv(
{
lldebugs << "LLToolDragAndDrop::dad3dRezAttachmentFromInv()" << llendl;
// must be in the user's inventory
- if (mSource != SOURCE_AGENT && mSource != SOURCE_LIBRARY)
+ if(mSource != SOURCE_AGENT && mSource != SOURCE_LIBRARY)
{
return ACCEPT_NO;
}
@@ -1611,20 +1639,21 @@ EAcceptance LLToolDragAndDrop::dad3dRezAttachmentFromInv(
// must not be in the trash
const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
- if (gInventory.isObjectDescendentOf(item->getUUID(), trash_id))
+ if( gInventory.isObjectDescendentOf( item->getUUID(), trash_id ) )
{
return ACCEPT_NO;
}
// must not be already wearing it
- if (!isAgentAvatarValid() || gAgentAvatarp->isWearingAttachment(item->getUUID()))
+ LLVOAvatarSelf* avatar = gAgentAvatarp;
+ if( !avatar || avatar->isWearingAttachment(item->getUUID()) )
{
return ACCEPT_NO;
}
- if (drop)
+ if( drop )
{
- if (mSource == SOURCE_LIBRARY)
+ if(mSource == SOURCE_LIBRARY)
{
LLPointer<LLInventoryCallback> cb = new RezAttachmentCallback(0);
copy_inventory_item(
@@ -1658,7 +1687,8 @@ EAcceptance LLToolDragAndDrop::dad3dRezObjectOnLand(
locateInventory(item, cat);
if (!item || !item->isFinished()) return ACCEPT_NO;
- if (!isAgentAvatarValid() || gAgentAvatarp->isWearingAttachment(item->getUUID()))
+ LLVOAvatarSelf* my_avatar = gAgentAvatarp;
+ if( !my_avatar || my_avatar->isWearingAttachment( item->getUUID() ) )
{
return ACCEPT_NO;
}
@@ -1683,7 +1713,7 @@ EAcceptance LLToolDragAndDrop::dad3dRezObjectOnLand(
// check if the item can be copied. If not, send that to the sim
// which will remove the inventory item.
- if (!item->getPermissions().allowCopyBy(gAgent.getID()))
+ if(!item->getPermissions().allowCopyBy(gAgent.getID()))
{
accept = ACCEPT_YES_SINGLE;
remove_inventory = TRUE;
@@ -1691,13 +1721,13 @@ EAcceptance LLToolDragAndDrop::dad3dRezObjectOnLand(
// Check if it's in the trash.
const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
- if (gInventory.isObjectDescendentOf(item->getUUID(), trash_id))
+ if(gInventory.isObjectDescendentOf(item->getUUID(), trash_id))
{
accept = ACCEPT_YES_SINGLE;
remove_inventory = TRUE;
}
- if (drop)
+ if(drop)
{
dropObject(obj, TRUE, FALSE, remove_inventory);
}
@@ -1719,22 +1749,23 @@ EAcceptance LLToolDragAndDrop::dad3dRezObjectOnObject(
LLViewerInventoryCategory* cat;
locateInventory(item, cat);
if (!item || !item->isFinished()) return ACCEPT_NO;
- if (!isAgentAvatarValid() || gAgentAvatarp->isWearingAttachment(item->getUUID()))
+ LLVOAvatarSelf* my_avatar = gAgentAvatarp;
+ if( !my_avatar || my_avatar->isWearingAttachment( item->getUUID() ) )
{
return ACCEPT_NO;
}
- if ((mask & MASK_CONTROL))
+ if((mask & MASK_CONTROL))
{
// *HACK: In order to resolve SL-22177, we need to block drags
// from notecards and objects onto other objects.
- if (mSource == SOURCE_NOTECARD)
+ if(mSource == SOURCE_NOTECARD)
{
return ACCEPT_NO;
}
EAcceptance rv = willObjectAcceptInventory(obj, item);
- if (drop && (ACCEPT_YES_SINGLE <= rv))
+ if(drop && (ACCEPT_YES_SINGLE <= rv))
{
dropInventory(obj, item, mSource, mSourceID);
}
@@ -1760,7 +1791,7 @@ EAcceptance LLToolDragAndDrop::dad3dRezObjectOnObject(
// check if the item can be copied. If not, send that to the sim
// which will remove the inventory item.
- if (!item->getPermissions().allowCopyBy(gAgent.getID()))
+ if(!item->getPermissions().allowCopyBy(gAgent.getID()))
{
accept = ACCEPT_YES_SINGLE;
remove_inventory = TRUE;
@@ -1768,13 +1799,13 @@ EAcceptance LLToolDragAndDrop::dad3dRezObjectOnObject(
// Check if it's in the trash.
const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
- if (gInventory.isObjectDescendentOf(item->getUUID(), trash_id))
+ if(gInventory.isObjectDescendentOf(item->getUUID(), trash_id))
{
accept = ACCEPT_YES_SINGLE;
remove_inventory = TRUE;
}
- if (drop)
+ if(drop)
{
dropObject(obj, FALSE, FALSE, remove_inventory);
}
@@ -1789,7 +1820,7 @@ EAcceptance LLToolDragAndDrop::dad3dRezScript(
// *HACK: In order to resolve SL-22177, we need to block drags
// from notecards and objects onto other objects.
- if ((SOURCE_WORLD == mSource) || (SOURCE_NOTECARD == mSource))
+ if((SOURCE_WORLD == mSource) || (SOURCE_NOTECARD == mSource))
{
return ACCEPT_NO;
}
@@ -1799,7 +1830,7 @@ EAcceptance LLToolDragAndDrop::dad3dRezScript(
locateInventory(item, cat);
if (!item || !item->isFinished()) return ACCEPT_NO;
EAcceptance rv = willObjectAcceptInventory(obj, item);
- if (drop && (ACCEPT_YES_SINGLE <= rv))
+ if(drop && (ACCEPT_YES_SINGLE <= rv))
{
// rez in the script active by default, rez in inactive if the
// control key is being held down.
@@ -1820,14 +1851,14 @@ EAcceptance LLToolDragAndDrop::dad3dRezScript(
return rv;
}
-EAcceptance LLToolDragAndDrop::dad3dTextureObject(
- LLViewerObject* obj, S32 face, MASK mask, BOOL drop)
+EAcceptance LLToolDragAndDrop::dad3dApplyToObject(
+ LLViewerObject* obj, S32 face, MASK mask, BOOL drop, EDragAndDropType cargo_type)
{
- lldebugs << "LLToolDragAndDrop::dad3dTextureObject()" << llendl;
+ lldebugs << "LLToolDragAndDrop::dad3dApplyToObject()" << llendl;
// *HACK: In order to resolve SL-22177, we need to block drags
// from notecards and objects onto other objects.
- if ((SOURCE_WORLD == mSource) || (SOURCE_NOTECARD == mSource))
+ if((SOURCE_WORLD == mSource) || (SOURCE_NOTECARD == mSource))
{
return ACCEPT_NO;
}
@@ -1837,33 +1868,44 @@ EAcceptance LLToolDragAndDrop::dad3dTextureObject(
locateInventory(item, cat);
if (!item || !item->isFinished()) return ACCEPT_NO;
EAcceptance rv = willObjectAcceptInventory(obj, item);
- if ((mask & MASK_CONTROL))
+ if((mask & MASK_CONTROL))
{
- if ((ACCEPT_YES_SINGLE <= rv) && drop)
+ if((ACCEPT_YES_SINGLE <= rv) && drop)
{
dropInventory(obj, item, mSource, mSourceID);
}
return rv;
}
- if (!obj->permModify())
+ if(!obj->permModify())
{
return ACCEPT_NO_LOCKED;
}
//If texture !copyable don't texture or you'll never get it back.
- if (!item->getPermissions().allowCopyBy(gAgent.getID()))
+ if(!item->getPermissions().allowCopyBy(gAgent.getID()))
{
return ACCEPT_NO;
}
- if (drop && (ACCEPT_YES_SINGLE <= rv))
+ if(drop && (ACCEPT_YES_SINGLE <= rv))
{
- if ((mask & MASK_SHIFT))
+ if (cargo_type == DAD_TEXTURE)
{
- dropTextureAllFaces(obj, item, mSource, mSourceID);
+ if((mask & MASK_SHIFT))
+ {
+ dropTextureAllFaces(obj, item, mSource, mSourceID);
+ }
+ else
+ {
+ dropTextureOneFace(obj, face, item, mSource, mSourceID);
+ }
+ }
+ else if (cargo_type == DAD_MESH)
+ {
+ dropMesh(obj, item, mSource, mSourceID);
}
else
{
- dropTextureOneFace(obj, face, item, mSource, mSourceID);
+ llwarns << "unsupported asset type" << llendl;
}
// VEFFECT: SetTexture
@@ -1877,14 +1919,29 @@ EAcceptance LLToolDragAndDrop::dad3dTextureObject(
// enable multi-drop, although last texture will win
return ACCEPT_YES_MULTI;
}
+
+
+EAcceptance LLToolDragAndDrop::dad3dTextureObject(
+ LLViewerObject* obj, S32 face, MASK mask, BOOL drop)
+{
+ return dad3dApplyToObject(obj, face, mask, drop, DAD_TEXTURE);
+}
+
+EAcceptance LLToolDragAndDrop::dad3dMeshObject(
+ LLViewerObject* obj, S32 face, MASK mask, BOOL drop)
+{
+ return dad3dApplyToObject(obj, face, mask, drop, DAD_MESH);
+}
+
+
/*
EAcceptance LLToolDragAndDrop::dad3dTextureSelf(
LLViewerObject* obj, S32 face, MASK mask, BOOL drop)
{
lldebugs << "LLToolDragAndDrop::dad3dTextureAvatar()" << llendl;
- if (drop)
+ if(drop)
{
- if (!(mask & MASK_SHIFT))
+ if( !(mask & MASK_SHIFT) )
{
dropTextureOneFaceAvatar( (LLVOAvatar*)obj, face, (LLInventoryItem*)mCargoData);
}
@@ -1902,16 +1959,16 @@ EAcceptance LLToolDragAndDrop::dad3dWearItem(
locateInventory(item, cat);
if (!item || !item->isFinished()) return ACCEPT_NO;
- if (mSource == SOURCE_AGENT || mSource == SOURCE_LIBRARY)
+ if(mSource == SOURCE_AGENT || mSource == SOURCE_LIBRARY)
{
// it's in the agent inventory
const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
- if (gInventory.isObjectDescendentOf(item->getUUID(), trash_id))
+ if( gInventory.isObjectDescendentOf( item->getUUID(), trash_id ) )
{
return ACCEPT_NO;
}
- if (drop)
+ if( drop )
{
// TODO: investigate wearables may not be loaded at this point EXT-8231
@@ -1935,19 +1992,19 @@ EAcceptance LLToolDragAndDrop::dad3dActivateGesture(
locateInventory(item, cat);
if (!item || !item->isFinished()) return ACCEPT_NO;
- if (mSource == SOURCE_AGENT || mSource == SOURCE_LIBRARY)
+ if(mSource == SOURCE_AGENT || mSource == SOURCE_LIBRARY)
{
// it's in the agent inventory
const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
- if (gInventory.isObjectDescendentOf(item->getUUID(), trash_id))
+ if( gInventory.isObjectDescendentOf( item->getUUID(), trash_id ) )
{
return ACCEPT_NO;
}
- if (drop)
+ if( drop )
{
LLUUID item_id;
- if (mSource == SOURCE_LIBRARY)
+ if(mSource == SOURCE_LIBRARY)
{
// create item based on that one, and put it on if that
// was a success.
@@ -1982,31 +2039,31 @@ EAcceptance LLToolDragAndDrop::dad3dWearCategory(
LLViewerInventoryItem* item;
LLViewerInventoryCategory* category;
locateInventory(item, category);
- if (!category) return ACCEPT_NO;
+ if(!category) return ACCEPT_NO;
if (drop)
{
// TODO: investigate wearables may not be loaded at this point EXT-8231
}
- if (mSource == SOURCE_AGENT)
+ if(mSource == SOURCE_AGENT)
{
const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
- if (gInventory.isObjectDescendentOf(category->getUUID(), trash_id))
+ if( gInventory.isObjectDescendentOf( category->getUUID(), trash_id ) )
{
return ACCEPT_NO;
}
- if (drop)
+ if(drop)
{
- BOOL append = ( (mask & MASK_SHIFT) ? TRUE : FALSE );
+ BOOL append = ( (mask & MASK_SHIFT) ? TRUE : FALSE );
LLAppearanceMgr::instance().wearInventoryCategory(category, false, append);
}
return ACCEPT_YES_MULTI;
}
- else if (mSource == SOURCE_LIBRARY)
+ else if(mSource == SOURCE_LIBRARY)
{
- if (drop)
+ if(drop)
{
LLAppearanceMgr::instance().wearInventoryCategory(category, true, false);
}
@@ -2027,7 +2084,7 @@ EAcceptance LLToolDragAndDrop::dad3dUpdateInventory(
// *HACK: In order to resolve SL-22177, we need to block drags
// from notecards and objects onto other objects.
- if ((SOURCE_WORLD == mSource) || (SOURCE_NOTECARD == mSource))
+ if((SOURCE_WORLD == mSource) || (SOURCE_NOTECARD == mSource))
{
return ACCEPT_NO;
}
@@ -2047,7 +2104,7 @@ EAcceptance LLToolDragAndDrop::dad3dUpdateInventory(
}
EAcceptance rv = willObjectAcceptInventory(root_object, item);
- if (root_object && drop && (ACCEPT_YES_COPY_SINGLE <= rv))
+ if(root_object && drop && (ACCEPT_YES_COPY_SINGLE <= rv))
{
dropInventory(root_object, item, mSource, mSourceID);
}
@@ -2091,7 +2148,7 @@ EAcceptance LLToolDragAndDrop::dad3dUpdateInventoryCategory(
LLDroppableItem droppable(!obj->permYouOwner());
LLInventoryModel::cat_array_t cats;
LLInventoryModel::item_array_t items;
- gInventory.collectDescendentsIf (cat->getUUID(),
+ gInventory.collectDescendentsIf(cat->getUUID(),
cats,
items,
LLInventoryModel::EXCLUDE_TRASH,
@@ -2120,7 +2177,7 @@ EAcceptance LLToolDragAndDrop::dad3dUpdateInventoryCategory(
{
const LLViewerInventoryCategory *cat = (*cat_iter);
rv = gInventory.isCategoryComplete(cat->getUUID()) ? ACCEPT_YES_MULTI : ACCEPT_NO;
- if (rv < ACCEPT_YES_SINGLE)
+ if(rv < ACCEPT_YES_SINGLE)
{
lldebugs << "Category " << cat->getUUID() << "is not complete." << llendl;
break;
@@ -2188,26 +2245,27 @@ EAcceptance LLToolDragAndDrop::dad3dGiveInventoryObject(
lldebugs << "LLToolDragAndDrop::dad3dGiveInventoryObject()" << llendl;
// item has to be in agent inventory.
- if (mSource != SOURCE_AGENT) return ACCEPT_NO;
+ if(mSource != SOURCE_AGENT) return ACCEPT_NO;
// find the item now.
LLViewerInventoryItem* item;
LLViewerInventoryCategory* cat;
locateInventory(item, cat);
if (!item || !item->isFinished()) return ACCEPT_NO;
- if (!item->getPermissions().allowOperationBy(PERM_TRANSFER, gAgent.getID()))
+ if(!item->getPermissions().allowOperationBy(PERM_TRANSFER, gAgent.getID()))
{
// cannot give away no-transfer objects
return ACCEPT_NO;
}
- if (isAgentAvatarValid() && gAgentAvatarp->isWearingAttachment(item->getUUID()))
+ LLVOAvatarSelf* avatar = gAgentAvatarp;
+ if(avatar && avatar->isWearingAttachment( item->getUUID() ) )
{
// You can't give objects that are attached to you
return ACCEPT_NO;
}
- if (obj && isAgentAvatarValid())
+ if( obj && avatar )
{
- if (drop)
+ if(drop)
{
LLGiveInventory::doGiveInventoryItem(obj->getID(), item );
}
@@ -2224,7 +2282,7 @@ EAcceptance LLToolDragAndDrop::dad3dGiveInventory(
{
lldebugs << "LLToolDragAndDrop::dad3dGiveInventory()" << llendl;
// item has to be in agent inventory.
- if (mSource != SOURCE_AGENT) return ACCEPT_NO;
+ if(mSource != SOURCE_AGENT) return ACCEPT_NO;
LLViewerInventoryItem* item;
LLViewerInventoryCategory* cat;
locateInventory(item, cat);
@@ -2246,12 +2304,12 @@ EAcceptance LLToolDragAndDrop::dad3dGiveInventoryCategory(
LLViewerObject* obj, S32 face, MASK mask, BOOL drop)
{
lldebugs << "LLToolDragAndDrop::dad3dGiveInventoryCategory()" << llendl;
- if (drop && obj)
+ if(drop && obj)
{
LLViewerInventoryItem* item;
LLViewerInventoryCategory* cat;
locateInventory(item, cat);
- if (!cat) return ACCEPT_NO;
+ if(!cat) return ACCEPT_NO;
LLGiveInventory::doGiveInventoryCategory(obj->getID(), cat);
}
// *TODO: deal with all the issues surrounding multi-object
@@ -2269,12 +2327,12 @@ EAcceptance LLToolDragAndDrop::dad3dRezFromObjectOnLand(
locateInventory(item, cat);
if (!item || !item->isFinished()) return ACCEPT_NO;
- if (!gAgent.allowOperation(PERM_COPY, item->getPermissions())
+ if(!gAgent.allowOperation(PERM_COPY, item->getPermissions())
|| !item->getPermissions().allowTransferTo(LLUUID::null))
{
return ACCEPT_NO_LOCKED;
}
- if (drop)
+ if(drop)
{
dropObject(obj, TRUE, TRUE, FALSE);
}
@@ -2289,7 +2347,7 @@ EAcceptance LLToolDragAndDrop::dad3dRezFromObjectOnObject(
LLViewerInventoryCategory* cat;
locateInventory(item, cat);
if (!item || !item->isFinished()) return ACCEPT_NO;
- if ((mask & MASK_CONTROL))
+ if((mask & MASK_CONTROL))
{
// *HACK: In order to resolve SL-22177, we need to block drags
// from notecards and objects onto other objects.
@@ -2297,19 +2355,19 @@ EAcceptance LLToolDragAndDrop::dad3dRezFromObjectOnObject(
// *HACK: uncomment this when appropriate
//EAcceptance rv = willObjectAcceptInventory(obj, item);
- //if (drop && (ACCEPT_YES_SINGLE <= rv))
+ //if(drop && (ACCEPT_YES_SINGLE <= rv))
//{
// dropInventory(obj, item, mSource, mSourceID);
//}
//return rv;
}
- if (!item->getPermissions().allowCopyBy(gAgent.getID(),
+ if(!item->getPermissions().allowCopyBy(gAgent.getID(),
gAgent.getGroupID())
|| !item->getPermissions().allowTransferTo(LLUUID::null))
{
return ACCEPT_NO_LOCKED;
}
- if (drop)
+ if(drop)
{
dropObject(obj, FALSE, TRUE, FALSE);
}
@@ -2325,23 +2383,23 @@ EAcceptance LLToolDragAndDrop::dad3dCategoryOnLand(
LLInventoryItem* item;
LLInventoryCategory* cat;
locateInventory(item, cat);
- if (!cat) return ACCEPT_NO;
+ if(!cat) return ACCEPT_NO;
EAcceptance rv = ACCEPT_NO;
// find all the items in the category
LLViewerInventoryCategory::cat_array_t cats;
LLViewerInventoryItem::item_array_t items;
LLDropCopyableItems droppable;
- gInventory.collectDescendentsIf (cat->getUUID(),
+ gInventory.collectDescendentsIf(cat->getUUID(),
cats,
items,
LLInventoryModel::EXCLUDE_TRASH,
droppable);
- if (items.count() > 0)
+ if(items.count() > 0)
{
rv = ACCEPT_YES_SINGLE;
}
- if ((rv >= ACCEPT_YES_COPY_SINGLE) && drop)
+ if((rv >= ACCEPT_YES_COPY_SINGLE) && drop)
{
createContainer(items, cat->getName());
return ACCEPT_NO;
@@ -2364,19 +2422,19 @@ EAcceptance LLToolDragAndDrop::dad3dAssetOnLand(
LLViewerInventoryItem::item_array_t items;
LLViewerInventoryItem::item_array_t copyable_items;
locateMultipleInventory(items, cats);
- if (!items.count()) return ACCEPT_NO;
+ if(!items.count()) return ACCEPT_NO;
EAcceptance rv = ACCEPT_NO;
for (S32 i = 0; i < items.count(); i++)
{
LLInventoryItem* item = items[i];
- if (item->getPermissions().allowCopyBy(gAgent.getID()))
+ if(item->getPermissions().allowCopyBy(gAgent.getID()))
{
copyable_items.put(item);
rv = ACCEPT_YES_SINGLE;
}
}
- if ((rv >= ACCEPT_YES_COPY_SINGLE) && drop)
+ if((rv >= ACCEPT_YES_COPY_SINGLE) && drop)
{
createContainer(copyable_items, NULL);
}
@@ -2391,20 +2449,20 @@ LLInventoryObject* LLToolDragAndDrop::locateInventory(
{
item = NULL;
cat = NULL;
- if (mCargoIDs.empty()) return NULL;
- if ((mSource == SOURCE_AGENT) || (mSource == SOURCE_LIBRARY))
+ if(mCargoIDs.empty()) return NULL;
+ if((mSource == SOURCE_AGENT) || (mSource == SOURCE_LIBRARY))
{
// The object should be in user inventory.
item = (LLViewerInventoryItem*)gInventory.getItem(mCargoIDs[mCurItemIndex]);
cat = (LLViewerInventoryCategory*)gInventory.getCategory(mCargoIDs[mCurItemIndex]);
}
- else if (mSource == SOURCE_WORLD)
+ else if(mSource == SOURCE_WORLD)
{
// This object is in some task inventory somewhere.
LLViewerObject* obj = gObjectList.findObject(mSourceID);
- if (obj)
+ if(obj)
{
- if ((mCargoTypes[mCurItemIndex] == DAD_CATEGORY)
+ if((mCargoTypes[mCurItemIndex] == DAD_CATEGORY)
|| (mCargoTypes[mCurItemIndex] == DAD_ROOT_CATEGORY))
{
cat = (LLViewerInventoryCategory*)obj->getInventoryObject(mCargoIDs[mCurItemIndex]);
@@ -2415,16 +2473,16 @@ LLInventoryObject* LLToolDragAndDrop::locateInventory(
}
}
}
- else if (mSource == SOURCE_NOTECARD)
+ else if(mSource == SOURCE_NOTECARD)
{
LLPreviewNotecard* preview = LLFloaterReg::findTypedInstance<LLPreviewNotecard>("preview_notecard", mSourceID);
- if (preview)
+ if(preview)
{
item = (LLViewerInventoryItem*)preview->getDragItem();
}
}
- if (item) return item;
- if (cat) return cat;
+ if(item) return item;
+ if(cat) return cat;
return NULL;
}
@@ -2432,8 +2490,8 @@ LLInventoryObject* LLToolDragAndDrop::locateInventory(
LLInventoryObject* LLToolDragAndDrop::locateMultipleInventory(LLViewerInventoryCategory::cat_array_t& cats,
LLViewerInventoryItem::item_array_t& items)
{
- if (mCargoIDs.count() == 0) return NULL;
- if ((mSource == SOURCE_AGENT) || (mSource == SOURCE_LIBRARY))
+ if(mCargoIDs.count() == 0) return NULL;
+ if((mSource == SOURCE_AGENT) || (mSource == SOURCE_LIBRARY))
{
// The object should be in user inventory.
for (S32 i = 0; i < mCargoIDs.count(); i++)
@@ -2450,13 +2508,13 @@ LLInventoryObject* LLToolDragAndDrop::locateMultipleInventory(LLViewerInventoryC
}
}
}
- else if (mSource == SOURCE_WORLD)
+ else if(mSource == SOURCE_WORLD)
{
// This object is in some task inventory somewhere.
LLViewerObject* obj = gObjectList.findObject(mSourceID);
- if (obj)
+ if(obj)
{
- if ((mCargoType == DAD_CATEGORY)
+ if((mCargoType == DAD_CATEGORY)
|| (mCargoType == DAD_ROOT_CATEGORY))
{
// The object should be in user inventory.
@@ -2482,17 +2540,17 @@ LLInventoryObject* LLToolDragAndDrop::locateMultipleInventory(LLViewerInventoryC
}
}
}
- else if (mSource == SOURCE_NOTECARD)
+ else if(mSource == SOURCE_NOTECARD)
{
LLPreviewNotecard* card;
card = (LLPreviewNotecard*)LLPreview::find(mSourceID);
- if (card)
+ if(card)
{
items.put((LLInventoryItem*)card->getDragItem());
}
}
- if (items.count()) return items[0];
- if (cats.count()) return cats[0];
+ if(items.count()) return items[0];
+ if(cats.count()) return cats[0];
return NULL;
}
*/
diff --git a/indra/newview/lltooldraganddrop.h b/indra/newview/lltooldraganddrop.h
index a13b775699..7b8cce3dc7 100644
--- a/indra/newview/lltooldraganddrop.h
+++ b/indra/newview/lltooldraganddrop.h
@@ -148,6 +148,8 @@ protected:
MASK mask, BOOL drop);
EAcceptance dad3dTextureObject(LLViewerObject* obj, S32 face,
MASK mask, BOOL drop);
+ EAcceptance dad3dMeshObject(LLViewerObject* obj, S32 face,
+ MASK mask, BOOL drop);
// EAcceptance dad3dTextureSelf(LLViewerObject* obj, S32 face,
// MASK mask, BOOL drop);
EAcceptance dad3dWearItem(LLViewerObject* obj, S32 face,
@@ -179,6 +181,11 @@ protected:
EAcceptance dad3dActivateGesture(LLViewerObject *obj, S32 face,
MASK mask, BOOL drop);
+ // helper called by methods above to handle "application" of an item
+ // to an object (texture applied to face, mesh applied to shape, etc.)
+ EAcceptance dad3dApplyToObject(LLViewerObject* obj, S32 face, MASK mask, BOOL drop, EDragAndDropType cargo_type);
+
+
// set the LLToolDragAndDrop's cursor based on the given acceptance
ECursorType acceptanceToCursor( EAcceptance acceptance );
@@ -229,6 +236,11 @@ public:
LLInventoryItem* item,
ESource source,
const LLUUID& src_id);
+ static void dropMesh(LLViewerObject* hit_obj,
+ LLInventoryItem* item,
+ ESource source,
+ const LLUUID& src_id);
+
//static void dropTextureOneFaceAvatar(LLVOAvatar* avatar,S32 hit_face,
// LLInventoryItem* item)
diff --git a/indra/newview/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 95bd210ae3..9ec4d33036 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->isSitting()
&& !mBlockClickToWalk // another behavior hasn't cancelled click to walk
&& !mPick.mPosGlobal.isExactlyZero() // valid coordinates for pick
&& (mPick.mPickType == LLPickInfo::PICK_LAND // we clicked on land
@@ -687,6 +688,15 @@ BOOL LLToolPie::handleMouseUp(S32 x, S32 y, MASK mask)
return LLTool::handleMouseUp(x, y, mask);
}
+void LLToolPie::stopClickToWalk()
+{
+ mPick.mPosGlobal = gAgent.getPositionGlobal();
+ handle_go_to();
+ if(mAutoPilotDestination)
+ {
+ mAutoPilotDestination->markDead();
+ }
+}
BOOL LLToolPie::handleDoubleClick(S32 x, S32 y, MASK mask)
{
diff --git a/indra/newview/lltoolpie.h b/indra/newview/lltoolpie.h
index 22359a6db8..d7c79ee223 100644
--- a/indra/newview/lltoolpie.h
+++ b/indra/newview/lltoolpie.h
@@ -67,6 +67,7 @@ public:
LLObjectSelection* getLeftClickSelection() { return (LLObjectSelection*)mLeftClickSelection; }
void resetSelection();
void blockClickToWalk() { mBlockClickToWalk = true; }
+ void stopClickToWalk();
static void selectionPropertiesReceived();
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/llviewerassetstats.cpp b/indra/newview/llviewerassetstats.cpp
index 7024b2c785..e621cf647e 100644
--- a/indra/newview/llviewerassetstats.cpp
+++ b/indra/newview/llviewerassetstats.cpp
@@ -525,7 +525,7 @@ asset_type_to_category(const LLViewerAssetType::EType at, bool with_http, bool i
// - gestures
// - everything else.
//
- llassert_always(26 == LLViewerAssetType::AT_COUNT);
+ llassert_always(50 == LLViewerAssetType::AT_COUNT);
// Multiple asset definitions are floating around so this requires some
// maintenance and attention.
@@ -557,9 +557,7 @@ asset_type_to_category(const LLViewerAssetType::EType at, bool with_http, bool i
LLViewerAssetStats::EVACOtherGet, // AT_FAVORITE
LLViewerAssetStats::EVACOtherGet, // AT_LINK
LLViewerAssetStats::EVACOtherGet, // AT_LINK_FOLDER
-#if 0
- // When LLViewerAssetType::AT_COUNT == 49
- LLViewerAssetStats::EVACOtherGet, // AT_FOLDER_ENSEMBLE_START
+ LLViewerAssetStats::EVACOtherGet, //
LLViewerAssetStats::EVACOtherGet, //
LLViewerAssetStats::EVACOtherGet, //
LLViewerAssetStats::EVACOtherGet, //
@@ -578,11 +576,12 @@ asset_type_to_category(const LLViewerAssetType::EType at, bool with_http, bool i
LLViewerAssetStats::EVACOtherGet, //
LLViewerAssetStats::EVACOtherGet, //
LLViewerAssetStats::EVACOtherGet, //
- LLViewerAssetStats::EVACOtherGet, // AT_FOLDER_ENSEMBLE_END
- LLViewerAssetStats::EVACOtherGet, // AT_CURRENT_OUTFIT
- LLViewerAssetStats::EVACOtherGet, // AT_OUTFIT
- LLViewerAssetStats::EVACOtherGet // AT_MY_OUTFITS
-#endif
+ LLViewerAssetStats::EVACOtherGet, //
+ LLViewerAssetStats::EVACOtherGet, //
+ LLViewerAssetStats::EVACOtherGet, //
+ LLViewerAssetStats::EVACOtherGet, //
+ LLViewerAssetStats::EVACOtherGet, // AT_MESH
+ // (50)
};
if (at < 0 || at >= LLViewerAssetType::AT_COUNT)
diff --git a/indra/newview/llviewerassettype.cpp b/indra/newview/llviewerassettype.cpp
index 9a52422641..b103f11597 100644
--- a/indra/newview/llviewerassettype.cpp
+++ b/indra/newview/llviewerassettype.cpp
@@ -79,6 +79,8 @@ LLViewerAssetDictionary::LLViewerAssetDictionary()
addEntry(LLViewerAssetType::AT_LINK, new ViewerAssetEntry(DAD_LINK));
addEntry(LLViewerAssetType::AT_LINK_FOLDER, new ViewerAssetEntry(DAD_LINK));
+ addEntry(LLViewerAssetType::AT_MESH, new ViewerAssetEntry(DAD_MESH));
+
addEntry(LLViewerAssetType::AT_NONE, new ViewerAssetEntry(DAD_NONE));
};
diff --git a/indra/newview/llviewercamera.cpp b/indra/newview/llviewercamera.cpp
index cbb1d25f78..7f7366dd3d 100644
--- a/indra/newview/llviewercamera.cpp
+++ b/indra/newview/llviewercamera.cpp
@@ -32,6 +32,7 @@
// Viewer includes
#include "llagent.h"
#include "llagentcamera.h"
+#include "llmatrix4a.h"
#include "llviewercontrol.h"
#include "llviewerobjectlist.h"
#include "llviewerregion.h"
@@ -755,6 +756,10 @@ LLVector3 LLViewerCamera::roundToPixel(const LLVector3 &pos_agent)
BOOL LLViewerCamera::cameraUnderWater() const
{
+ if(!gAgent.getRegion())
+ {
+ return FALSE ;
+ }
return getOrigin().mV[VZ] < gAgent.getRegion()->getWaterHeight();
}
@@ -781,21 +786,29 @@ BOOL LLViewerCamera::areVertsVisible(LLViewerObject* volumep, BOOL all_verts)
LLMatrix4 render_mat(vo_volume->getRenderRotation(), LLVector4(vo_volume->getRenderPosition()));
+ LLMatrix4a render_mata;
+ render_mata.loadu(render_mat);
+ LLMatrix4a mata;
+ mata.loadu(mat);
+
num_faces = volume->getNumVolumeFaces();
for (i = 0; i < num_faces; i++)
{
const LLVolumeFace& face = volume->getVolumeFace(i);
- for (U32 v = 0; v < face.mVertices.size(); v++)
+ for (U32 v = 0; v < face.mNumVertices; v++)
{
- LLVector4 vec = LLVector4(face.mVertices[v].mPosition) * mat;
+ const LLVector4a& src_vec = face.mPositions[v];
+ LLVector4a vec;
+ mata.affineTransform(src_vec, vec);
if (drawablep->isActive())
{
- vec = vec * render_mat;
+ LLVector4a t = vec;
+ render_mata.affineTransform(t, vec);
}
- BOOL in_frustum = pointInFrustum(LLVector3(vec)) > 0;
+ BOOL in_frustum = pointInFrustum(LLVector3(vec.getF32ptr())) > 0;
if (( !in_frustum && all_verts) ||
(in_frustum && !all_verts))
diff --git a/indra/newview/llviewerchat.cpp b/indra/newview/llviewerchat.cpp
index 286b16bab2..93687dbd5f 100644
--- a/indra/newview/llviewerchat.cpp
+++ b/indra/newview/llviewerchat.cpp
@@ -29,6 +29,8 @@
// newview includes
#include "llagent.h" // gAgent
+#include "llslurl.h"
+#include "lluicolor.h"
#include "lluicolortable.h"
#include "llviewercontrol.h" // gSavedSettings
#include "llviewerregion.h"
@@ -36,6 +38,7 @@
#include "llinstantmessage.h" //SYSTEM_FROM
// LLViewerChat
+LLViewerChat::font_change_signal_t LLViewerChat::sChatFontChangedSignal;
//static
void LLViewerChat::getChatColor(const LLChat& chat, LLColor4& r_color)
@@ -77,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");
@@ -89,8 +96,9 @@ void LLViewerChat::getChatColor(const LLChat& chat, LLColor4& r_color)
if (!chat.mPosAgent.isExactlyZero())
{
LLVector3 pos_agent = gAgent.getPositionAgent();
- F32 distance = dist_vec(pos_agent, chat.mPosAgent);
- if (distance > gAgent.getNearChatRadius())
+ F32 distance_squared = dist_vec_squared(pos_agent, chat.mPosAgent);
+ F32 dist_near_chat = gAgent.getNearChatRadius();
+ if (distance_squared > dist_near_chat * dist_near_chat)
{
// diminish far-off chat
r_color.mV[VALPHA] = 0.8f;
@@ -142,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";
@@ -154,8 +166,9 @@ void LLViewerChat::getChatColor(const LLChat& chat, std::string& r_color_name, F
if (!chat.mPosAgent.isExactlyZero())
{
LLVector3 pos_agent = gAgent.getPositionAgent();
- F32 distance = dist_vec(pos_agent, chat.mPosAgent);
- if (distance > gAgent.getNearChatRadius())
+ F32 distance_squared = dist_vec_squared(pos_agent, chat.mPosAgent);
+ F32 dist_near_chat = gAgent.getNearChatRadius();
+ if (distance_squared > dist_near_chat * dist_near_chat)
{
// diminish far-off chat
r_color_alpha = 0.8f;
@@ -256,3 +269,16 @@ std::string LLViewerChat::getObjectImSLURL(const LLChat& chat, const LLSD& args)
return url;
}
+
+//static
+boost::signals2::connection LLViewerChat::setFontChangedCallback(const font_change_signal_t::slot_type& cb)
+{
+ return sChatFontChangedSignal.connect(cb);
+}
+
+//static
+void LLViewerChat::signalChatFontChanged()
+{
+ // Notify all observers that our font has changed
+ sChatFontChangedSignal(getChatFont());
+}
diff --git a/indra/newview/llviewerchat.h b/indra/newview/llviewerchat.h
index 0f15d29f04..c05caf0a95 100644
--- a/indra/newview/llviewerchat.h
+++ b/indra/newview/llviewerchat.h
@@ -35,6 +35,8 @@
class LLViewerChat
{
public:
+ typedef boost::signals2::signal<void (LLFontGL*)> font_change_signal_t;
+
static void getChatColor(const LLChat& chat, LLColor4& r_color);
static void getChatColor(const LLChat& chat, std::string& r_color_name, F32& r_color_alpha);
static LLFontGL* getChatFont();
@@ -42,8 +44,12 @@ public:
static void formatChatMsg(const LLChat& chat, std::string& formated_msg);
static std::string getSenderSLURL(const LLChat& chat, const LLSD& args);
+ static boost::signals2::connection setFontChangedCallback(const font_change_signal_t::slot_type& cb);
+ static void signalChatFontChanged();
+
private:
static std::string getObjectImSLURL(const LLChat& chat, const LLSD& args);
+ static font_change_signal_t sChatFontChangedSignal;
};
diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp
index ffe607f912..379bbe614d 100644
--- a/indra/newview/llviewercontrol.cpp
+++ b/indra/newview/llviewercontrol.cpp
@@ -128,6 +128,45 @@ static bool handleSetShaderChanged(const LLSD& newvalue)
return true;
}
+static bool handleRenderPerfTestChanged(const LLSD& newvalue)
+{
+ bool status = !newvalue.asBoolean();
+ if (!status)
+ {
+ gPipeline.clearRenderTypeMask(LLPipeline::RENDER_TYPE_WL_SKY,
+ LLPipeline::RENDER_TYPE_GROUND,
+ LLPipeline::RENDER_TYPE_TERRAIN,
+ LLPipeline::RENDER_TYPE_GRASS,
+ LLPipeline::RENDER_TYPE_TREE,
+ LLPipeline::RENDER_TYPE_WATER,
+ LLPipeline::RENDER_TYPE_PASS_GRASS,
+ LLPipeline::RENDER_TYPE_HUD,
+ LLPipeline::RENDER_TYPE_PARTICLES,
+ LLPipeline::RENDER_TYPE_CLOUDS,
+ LLPipeline::RENDER_TYPE_HUD_PARTICLES,
+ LLPipeline::END_RENDER_TYPES);
+ gPipeline.setRenderDebugFeatureControl(LLPipeline::RENDER_DEBUG_FEATURE_UI, false);
+ }
+ else
+ {
+ gPipeline.setRenderTypeMask(LLPipeline::RENDER_TYPE_WL_SKY,
+ LLPipeline::RENDER_TYPE_GROUND,
+ LLPipeline::RENDER_TYPE_TERRAIN,
+ LLPipeline::RENDER_TYPE_GRASS,
+ LLPipeline::RENDER_TYPE_TREE,
+ LLPipeline::RENDER_TYPE_WATER,
+ LLPipeline::RENDER_TYPE_PASS_GRASS,
+ LLPipeline::RENDER_TYPE_HUD,
+ LLPipeline::RENDER_TYPE_PARTICLES,
+ LLPipeline::RENDER_TYPE_CLOUDS,
+ LLPipeline::RENDER_TYPE_HUD_PARTICLES,
+ LLPipeline::END_RENDER_TYPES);
+ gPipeline.setRenderDebugFeatureControl(LLPipeline::RENDER_DEBUG_FEATURE_UI, true);
+ }
+
+ return true;
+}
+
bool handleRenderTransparentWaterChanged(const LLSD& newvalue)
{
LLWorld::getInstance()->updateWaterObjects();
@@ -239,12 +278,6 @@ static bool handleVideoMemoryChanged(const LLSD& newvalue)
return true;
}
-static bool handleBandwidthChanged(const LLSD& newvalue)
-{
- gViewerThrottle.setMaxBandwidth((F32) newvalue.asReal());
- return true;
-}
-
static bool handleChatFontSizeChanged(const LLSD& newvalue)
{
if(gConsole)
@@ -306,24 +339,6 @@ static bool handleNumpadControlChanged(const LLSD& newvalue)
return true;
}
-static bool handleRenderUseVBOChanged(const LLSD& newvalue)
-{
- if (gPipeline.isInit())
- {
- gPipeline.setUseVBO(newvalue.asBoolean());
- }
- return true;
-}
-
-static bool handleRenderUseVBOMappingChanged(const LLSD& newvalue)
-{
- if (gPipeline.isInit())
- {
- gPipeline.setDisableVBOMapping(newvalue.asBoolean());
- }
- return true;
-}
-
static bool handleWLSkyDetailChanged(const LLSD&)
{
if (gSky.mVOWLSkyp.notNull())
@@ -348,13 +363,21 @@ static bool handleRenderDynamicLODChanged(const LLSD& newvalue)
return true;
}
-static bool handleRenderUseFBOChanged(const LLSD& newvalue)
+static bool handleRenderLocalLightsChanged(const LLSD& newvalue)
+{
+ gPipeline.setLightingDetail(-1);
+ return true;
+}
+
+static bool handleRenderDeferredChanged(const LLSD& newvalue)
{
LLRenderTarget::sUseFBO = newvalue.asBoolean();
if (gPipeline.isInit())
{
+ gPipeline.updateRenderDeferred();
gPipeline.releaseGLBuffers();
gPipeline.createGLBuffers();
+ gPipeline.resetVertexBuffers();
if (LLPipeline::sRenderDeferred && LLRenderTarget::sUseFBO)
{
LLViewerShaderMgr::instance()->setShaders();
@@ -562,26 +585,26 @@ void settings_setup_listeners()
gSavedSettings.getControl("RenderTerrainLODFactor")->getSignal()->connect(boost::bind(&handleTerrainLODChanged, _2));
gSavedSettings.getControl("RenderTreeLODFactor")->getSignal()->connect(boost::bind(&handleTreeLODChanged, _2));
gSavedSettings.getControl("RenderFlexTimeFactor")->getSignal()->connect(boost::bind(&handleFlexLODChanged, _2));
- gSavedSettings.getControl("ThrottleBandwidthKBPS")->getSignal()->connect(boost::bind(&handleBandwidthChanged, _2));
gSavedSettings.getControl("RenderGamma")->getSignal()->connect(boost::bind(&handleGammaChanged, _2));
gSavedSettings.getControl("RenderFogRatio")->getSignal()->connect(boost::bind(&handleFogRatioChanged, _2));
gSavedSettings.getControl("RenderMaxPartCount")->getSignal()->connect(boost::bind(&handleMaxPartCountChanged, _2));
gSavedSettings.getControl("RenderDynamicLOD")->getSignal()->connect(boost::bind(&handleRenderDynamicLODChanged, _2));
+ gSavedSettings.getControl("RenderLocalLights")->getSignal()->connect(boost::bind(&handleRenderLocalLightsChanged, _2));
gSavedSettings.getControl("RenderDebugTextureBind")->getSignal()->connect(boost::bind(&handleResetVertexBuffersChanged, _2));
gSavedSettings.getControl("RenderAutoMaskAlphaDeferred")->getSignal()->connect(boost::bind(&handleResetVertexBuffersChanged, _2));
gSavedSettings.getControl("RenderAutoMaskAlphaNonDeferred")->getSignal()->connect(boost::bind(&handleResetVertexBuffersChanged, _2));
gSavedSettings.getControl("RenderObjectBump")->getSignal()->connect(boost::bind(&handleResetVertexBuffersChanged, _2));
gSavedSettings.getControl("RenderMaxVBOSize")->getSignal()->connect(boost::bind(&handleResetVertexBuffersChanged, _2));
- gSavedSettings.getControl("RenderUseFBO")->getSignal()->connect(boost::bind(&handleRenderUseFBOChanged, _2));
gSavedSettings.getControl("RenderDeferredNoise")->getSignal()->connect(boost::bind(&handleReleaseGLBufferChanged, _2));
gSavedSettings.getControl("RenderUseImpostors")->getSignal()->connect(boost::bind(&handleRenderUseImpostorsChanged, _2));
gSavedSettings.getControl("RenderDebugGL")->getSignal()->connect(boost::bind(&handleRenderDebugGLChanged, _2));
gSavedSettings.getControl("RenderDebugPipeline")->getSignal()->connect(boost::bind(&handleRenderDebugPipelineChanged, _2));
gSavedSettings.getControl("RenderResolutionDivisor")->getSignal()->connect(boost::bind(&handleRenderResolutionDivisorChanged, _2));
- gSavedSettings.getControl("RenderDeferred")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));
+ gSavedSettings.getControl("RenderDeferred")->getSignal()->connect(boost::bind(&handleRenderDeferredChanged, _2));
gSavedSettings.getControl("RenderShadowDetail")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));
gSavedSettings.getControl("RenderDeferredSSAO")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));
gSavedSettings.getControl("RenderDeferredGI")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));
+ gSavedSettings.getControl("RenderPerformanceTest")->getSignal()->connect(boost::bind(&handleRenderPerfTestChanged, _2));
gSavedSettings.getControl("TextureMemory")->getSignal()->connect(boost::bind(&handleVideoMemoryChanged, _2));
gSavedSettings.getControl("AuditTexture")->getSignal()->connect(boost::bind(&handleAuditTextureChanged, _2));
gSavedSettings.getControl("ChatFontSize")->getSignal()->connect(boost::bind(&handleChatFontSizeChanged, _2));
@@ -604,9 +627,10 @@ void settings_setup_listeners()
gSavedSettings.getControl("MuteVoice")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _2));
gSavedSettings.getControl("MuteAmbient")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _2));
gSavedSettings.getControl("MuteUI")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _2));
- gSavedSettings.getControl("RenderVBOEnable")->getSignal()->connect(boost::bind(&handleRenderUseVBOChanged, _2));
- gSavedSettings.getControl("RenderVBOMappingDisable")->getSignal()->connect(boost::bind(&handleRenderUseVBOMappingChanged, _2));
+ gSavedSettings.getControl("RenderVBOEnable")->getSignal()->connect(boost::bind(&handleResetVertexBuffersChanged, _2));
+ gSavedSettings.getControl("RenderVBOMappingDisable")->getSignal()->connect(boost::bind(&handleResetVertexBuffersChanged, _2));
gSavedSettings.getControl("RenderUseStreamVBO")->getSignal()->connect(boost::bind(&handleResetVertexBuffersChanged, _2));
+ gSavedSettings.getControl("RenderPreferStreamDraw")->getSignal()->connect(boost::bind(&handleResetVertexBuffersChanged, _2));
gSavedSettings.getControl("WLSkyDetail")->getSignal()->connect(boost::bind(&handleWLSkyDetailChanged, _2));
gSavedSettings.getControl("NumpadControl")->getSignal()->connect(boost::bind(&handleNumpadControlChanged, _2));
gSavedSettings.getControl("JoystickAxis0")->getSignal()->connect(boost::bind(&handleJoystickChanged, _2));
diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp
index 8593c4cf79..e41773d273 100644
--- a/indra/newview/llviewerdisplay.cpp
+++ b/indra/newview/llviewerdisplay.cpp
@@ -616,10 +616,10 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
&& gSavedSettings.getBOOL("UseOcclusion")
&& gGLManager.mHasOcclusionQuery) ? 2 : 0;
- if (LLPipeline::sUseOcclusion && LLPipeline::sRenderDeferred)
- { //force occlusion on for all render types if doing deferred render
+ /*if (LLPipeline::sUseOcclusion && LLPipeline::sRenderDeferred)
+ { //force occlusion on for all render types if doing deferred render (tighter shadow frustum)
LLPipeline::sUseOcclusion = 3;
- }
+ }*/
LLPipeline::sAutoMaskAlphaDeferred = gSavedSettings.getBOOL("RenderAutoMaskAlphaDeferred");
LLPipeline::sAutoMaskAlphaNonDeferred = gSavedSettings.getBOOL("RenderAutoMaskAlphaNonDeferred");
@@ -754,7 +754,6 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
{
LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_WORLD;
LLMemType mt_ss(LLMemType::MTYPE_DISPLAY_STATE_SORT);
- gPipeline.sAllowRebuildPriorityGroup = TRUE ;
gPipeline.stateSort(*LLViewerCamera::getInstance(), result);
stop_glerror();
@@ -826,13 +825,14 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
//}
LLPipeline::sUnderWaterRender = LLViewerCamera::getInstance()->cameraUnderWater() ? TRUE : FALSE;
- LLPipeline::updateRenderDeferred();
+ LLPipeline::refreshRenderDeferred();
stop_glerror();
if (to_texture)
{
gGL.setColorMask(true, true);
+
if (LLPipeline::sRenderDeferred && !LLPipeline::sUnderWaterRender)
{
gPipeline.mDeferredScreen.bindTarget();
@@ -885,10 +885,26 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
if (LLPipeline::sRenderDeferred && !LLPipeline::sUnderWaterRender)
{
gPipeline.mDeferredScreen.flush();
+ if(LLRenderTarget::sUseFBO)
+ {
+ LLRenderTarget::copyContentsToFramebuffer(gPipeline.mDeferredScreen, 0, 0, gPipeline.mDeferredScreen.getWidth(),
+ gPipeline.mDeferredScreen.getHeight(), 0, 0,
+ gPipeline.mDeferredScreen.getWidth(),
+ gPipeline.mDeferredScreen.getHeight(),
+ GL_DEPTH_BUFFER_BIT, GL_NEAREST);
+ }
}
else
{
gPipeline.mScreen.flush();
+ if(LLRenderTarget::sUseFBO)
+ {
+ LLRenderTarget::copyContentsToFramebuffer(gPipeline.mScreen, 0, 0, gPipeline.mScreen.getWidth(),
+ gPipeline.mScreen.getHeight(), 0, 0,
+ gPipeline.mScreen.getWidth(),
+ gPipeline.mScreen.getHeight(),
+ GL_DEPTH_BUFFER_BIT, GL_NEAREST);
+ }
}
}
@@ -906,9 +922,11 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
render_ui();
}
- gPipeline.rebuildGroups();
-
+
LLSpatialGroup::sNoDelete = FALSE;
+ gPipeline.clearReferences();
+
+ gPipeline.rebuildGroups();
}
LLAppViewer::instance()->pingMainloopTimeout("Display:FrameStats");
@@ -1006,6 +1024,7 @@ void render_hud_attachments()
gPipeline.renderGeom(hud_cam);
LLSpatialGroup::sNoDelete = FALSE;
+ //gPipeline.clearReferences();
render_hud_elements();
diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp
index dca1e33e60..a1c2c926af 100644
--- a/indra/newview/llviewerfloaterreg.cpp
+++ b/indra/newview/llviewerfloaterreg.cpp
@@ -73,6 +73,7 @@
#include "llfloaterlandholdings.h"
#include "llfloatermap.h"
#include "llfloatermemleak.h"
+#include "llfloatermodelwizard.h"
#include "llfloaternamedesc.h"
#include "llfloaternotificationsconsole.h"
#include "llfloateropenobject.h"
@@ -91,6 +92,7 @@
#include "llfloatersettingsdebug.h"
#include "llfloatersidetraytab.h"
#include "llfloatersnapshot.h"
+#include "llfloatersounddevices.h"
#include "llfloatertelehub.h"
#include "llfloatertestinspectors.h"
#include "llfloatertestlistview.h"
@@ -122,8 +124,34 @@
#include "llpreviewtexture.h"
#include "llsyswellwindow.h"
#include "llscriptfloater.h"
+#include "llfloatermodelpreview.h"
+#include "llcommandhandler.h"
+
// *NOTE: Please add files in alphabetical order to keep merges easy.
+// handle secondlife:///app/floater/{NAME} URLs
+class LLFloaterOpenHandler : public LLCommandHandler
+{
+public:
+ // requires trusted browser to trigger
+ LLFloaterOpenHandler() : LLCommandHandler("floater", UNTRUSTED_THROTTLE) { }
+
+ bool handle(const LLSD& params, const LLSD& query_map,
+ LLMediaCtrl* web)
+ {
+ if (params.size() != 1)
+ {
+ return false;
+ }
+
+ const std::string floater_name = LLURI::unescape(params[0].asString());
+ LLFloaterReg::showInstance(floater_name);
+
+ return true;
+ }
+};
+
+LLFloaterOpenHandler gFloaterOpenHandler;
void LLViewerFloaterReg::registerFloaters()
{
@@ -239,6 +267,7 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("sell_land", "floater_sell_land.xml", &LLFloaterSellLand::buildFloater);
LLFloaterReg::add("settings_debug", "floater_settings_debug.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSettingsDebug>);
LLFloaterReg::add("side_bar_tab", "floater_side_bar_tab.xml", &LLFloaterReg::build<LLFloaterSideTrayTab>);
+ LLFloaterReg::add("sound_devices", "floater_sound_devices.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSoundDevices>);
LLFloaterReg::add("stats", "floater_stats.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloater>);
LLFloaterReg::add("start_queue", "floater_script_queue.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterRunQueue>);
LLFloaterReg::add("stop_queue", "floater_script_queue.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterNotRunQueue>);
@@ -249,7 +278,9 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("upload_anim", "floater_animation_preview.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAnimPreview>, "upload");
LLFloaterReg::add("upload_image", "floater_image_preview.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterImagePreview>, "upload");
LLFloaterReg::add("upload_sound", "floater_sound_preview.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSoundPreview>, "upload");
-
+ LLFloaterReg::add("upload_model", "floater_model_preview.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterModelPreview>, "upload");
+ LLFloaterReg::add("upload_model_wizard", "floater_model_wizard.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterModelWizard>);
+
LLFloaterReg::add("voice_controls", "floater_voice_controls.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLCallFloater>);
LLFloaterReg::add("voice_effect", "floater_voice_effect.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterVoiceEffect>);
diff --git a/indra/newview/llviewerfoldertype.cpp b/indra/newview/llviewerfoldertype.cpp
index de1c8d14a8..42f780a8a3 100644
--- a/indra/newview/llviewerfoldertype.cpp
+++ b/indra/newview/llviewerfoldertype.cpp
@@ -126,6 +126,9 @@ LLViewerFolderDictionary::LLViewerFolderDictionary()
addEntry(LLFolderType::FT_CURRENT_OUTFIT, new ViewerFolderEntry("Current Outfit", "Inv_SysOpen", "Inv_SysClosed", TRUE));
addEntry(LLFolderType::FT_OUTFIT, new ViewerFolderEntry("New Outfit", "Inv_LookFolderOpen", "Inv_LookFolderClosed", TRUE));
addEntry(LLFolderType::FT_MY_OUTFITS, new ViewerFolderEntry("My Outfits", "Inv_SysOpen", "Inv_SysClosed", TRUE));
+ addEntry(LLFolderType::FT_MESH, new ViewerFolderEntry("Meshes", "Inv_SysOpen", "Inv_SysClosed", FALSE));
+
+
addEntry(LLFolderType::FT_INBOX, new ViewerFolderEntry("Inbox", "Inv_SysOpen", "Inv_SysClosed", FALSE));
addEntry(LLFolderType::FT_NONE, new ViewerFolderEntry("New Folder", "Inv_FolderOpen", "Inv_FolderClosed", FALSE, "default"));
diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp
index 519514d99c..9e58acdcd3 100644
--- a/indra/newview/llviewerinventory.cpp
+++ b/indra/newview/llviewerinventory.cpp
@@ -183,6 +183,12 @@ public:
return false;
}
+ if (!LLUI::sSettingGroups["config"]->getBOOL("EnableInventory"))
+ {
+ LLNotificationsUtil::add("NoInventory", LLSD(), LLSD(), std::string("SwitchToStandardSkinAndQuit"));
+ return true;
+ }
+
// support secondlife:///app/inventory/show
if (params[0].asString() == "show")
{
@@ -1450,6 +1456,9 @@ private:
void saveFavoritesSLURLs();
+ // Remove record of current user's favorites from file on disk.
+ void removeFavoritesRecordOfUser();
+
void onLandmarkLoaded(const LLUUID& asset_id, LLLandmark* landmark);
void storeFavoriteSLURL(const LLUUID& asset_id, std::string& slurl);
@@ -1534,6 +1543,10 @@ void LLFavoritesOrderStorage::destroyClass()
{
LLFavoritesOrderStorage::instance().saveFavoritesSLURLs();
}
+ else
+ {
+ LLFavoritesOrderStorage::instance().removeFavoritesRecordOfUser();
+ }
}
void LLFavoritesOrderStorage::load()
@@ -1602,6 +1615,28 @@ void LLFavoritesOrderStorage::saveFavoritesSLURLs()
LLSDSerialize::toPrettyXML(fav_llsd, file);
}
+void LLFavoritesOrderStorage::removeFavoritesRecordOfUser()
+{
+ std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "stored_favorites.xml");
+ LLSD fav_llsd;
+ llifstream file;
+ file.open(filename);
+ if (!file.is_open()) return;
+ LLSDSerialize::fromXML(fav_llsd, file);
+
+ LLAvatarName av_name;
+ LLAvatarNameCache::get( gAgentID, &av_name );
+ if (fav_llsd.has(av_name.getLegacyName()))
+ {
+ fav_llsd.erase(av_name.getLegacyName());
+ }
+
+ llofstream out_file;
+ out_file.open(filename);
+ LLSDSerialize::toPrettyXML(fav_llsd, out_file);
+
+}
+
void LLFavoritesOrderStorage::onLandmarkLoaded(const LLUUID& asset_id, LLLandmark* landmark)
{
if (!landmark) return;
diff --git a/indra/newview/llviewerjointmesh.cpp b/indra/newview/llviewerjointmesh.cpp
index e59e685f53..77c8bb0329 100644
--- a/indra/newview/llviewerjointmesh.cpp
+++ b/indra/newview/llviewerjointmesh.cpp
@@ -55,6 +55,7 @@
#include "v4math.h"
#include "m3math.h"
#include "m4math.h"
+#include "llmatrix4a.h"
#if !LL_DARWIN && !LL_LINUX && !LL_SOLARIS
extern PFNGLWEIGHTPOINTERARBPROC glWeightPointerARB;
@@ -375,6 +376,7 @@ const S32 NUM_AXES = 3;
// pivot parent 0-n -- child = n+1
static LLMatrix4 gJointMatUnaligned[32];
+static LLMatrix4a gJointMatAligned[32];
static LLMatrix3 gJointRotUnaligned[32];
static LLVector4 gJointPivot[32];
@@ -460,6 +462,14 @@ void LLViewerJointMesh::uploadJointMatrices()
glUniform4fvARB(gAvatarMatrixParam, 45, mat);
stop_glerror();
}
+ else
+ {
+ //load gJointMatUnaligned into gJointMatAligned
+ for (joint_num = 0; joint_num < reference_mesh->mJointRenderData.count(); ++joint_num)
+ {
+ gJointMatAligned[joint_num].loadu(gJointMatUnaligned[joint_num]);
+ }
+ }
}
//--------------------------------------------------------------------
@@ -501,7 +511,7 @@ int compare_int(const void *a, const void *b)
U32 LLViewerJointMesh::drawShape( F32 pixelArea, BOOL first_pass, BOOL is_dummy)
{
if (!mValid || !mMesh || !mFace || !mVisible ||
- mFace->mVertexBuffer.isNull() ||
+ !mFace->getVertexBuffer() ||
mMesh->getNumFaces() == 0)
{
return 0;
@@ -509,6 +519,8 @@ U32 LLViewerJointMesh::drawShape( F32 pixelArea, BOOL first_pass, BOOL is_dummy)
U32 triangle_count = 0;
+ S32 diffuse_channel = LLDrawPoolAvatar::sDiffuseChannel;
+
stop_glerror();
//----------------------------------------------------------------
@@ -521,7 +533,7 @@ U32 LLViewerJointMesh::drawShape( F32 pixelArea, BOOL first_pass, BOOL is_dummy)
stop_glerror();
- LLGLSSpecular specular(LLColor4(1.f,1.f,1.f,1.f), mShiny && !(mFace->getPool()->getVertexShaderLevel() > 0));
+ LLGLSSpecular specular(LLColor4(1.f,1.f,1.f,1.f), mFace->getPool()->getVertexShaderLevel() > 0 ? 0.f : mShiny);
//----------------------------------------------------------------
// setup current texture
@@ -531,7 +543,7 @@ U32 LLViewerJointMesh::drawShape( F32 pixelArea, BOOL first_pass, BOOL is_dummy)
LLTexUnit::eTextureAddressMode old_mode = LLTexUnit::TAM_WRAP;
if (mTestImageName)
{
- gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, mTestImageName);
+ gGL.getTexUnit(diffuse_channel)->bindManual(LLTexUnit::TT_TEXTURE, mTestImageName);
if (mIsTransparent)
{
@@ -540,24 +552,18 @@ U32 LLViewerJointMesh::drawShape( F32 pixelArea, BOOL first_pass, BOOL is_dummy)
else
{
glColor4f(0.7f, 0.6f, 0.3f, 1.f);
- gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_LERP_TEX_ALPHA, LLTexUnit::TBS_TEX_COLOR, LLTexUnit::TBS_PREV_COLOR);
+ gGL.getTexUnit(diffuse_channel)->setTextureColorBlend(LLTexUnit::TBO_LERP_TEX_ALPHA, LLTexUnit::TBS_TEX_COLOR, LLTexUnit::TBS_PREV_COLOR);
}
}
else if( !is_dummy && mLayerSet )
{
if( mLayerSet->hasComposite() )
{
- gGL.getTexUnit(0)->bind(mLayerSet->getComposite());
+ gGL.getTexUnit(diffuse_channel)->bind(mLayerSet->getComposite());
}
else
{
- // This warning will always trigger if you've hacked the avatar to show as incomplete.
- // Ignore the warning if that's the case.
- if (!gSavedSettings.getBOOL("RenderUnloadedAvatar"))
- {
- //llwarns << "Layerset without composite" << llendl;
- }
- gGL.getTexUnit(0)->bind(LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT));
+ gGL.getTexUnit(diffuse_channel)->bind(LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT));
}
}
else
@@ -567,16 +573,16 @@ U32 LLViewerJointMesh::drawShape( F32 pixelArea, BOOL first_pass, BOOL is_dummy)
{
old_mode = mTexture->getAddressMode();
}
- gGL.getTexUnit(0)->bind(mTexture.get());
- gGL.getTexUnit(0)->bind(mTexture);
- gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_CLAMP);
+ gGL.getTexUnit(diffuse_channel)->bind(mTexture.get());
+ gGL.getTexUnit(diffuse_channel)->bind(mTexture);
+ gGL.getTexUnit(diffuse_channel)->setTextureAddressMode(LLTexUnit::TAM_CLAMP);
}
else
{
- gGL.getTexUnit(0)->bind(LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT));
+ gGL.getTexUnit(diffuse_channel)->bind(LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT));
}
- mFace->mVertexBuffer->setBuffer(sRenderMask);
+ mFace->getVertexBuffer()->setBuffer(sRenderMask);
U32 start = mMesh->mFaceVertexOffset;
U32 end = start + mMesh->mFaceVertexCount - 1;
@@ -593,14 +599,14 @@ U32 LLViewerJointMesh::drawShape( F32 pixelArea, BOOL first_pass, BOOL is_dummy)
}
}
- mFace->mVertexBuffer->drawRange(LLRender::TRIANGLES, start, end, count, offset);
+ mFace->getVertexBuffer()->drawRange(LLRender::TRIANGLES, start, end, count, offset);
}
else
{
glPushMatrix();
LLMatrix4 jointToWorld = getWorldMatrix();
glMultMatrixf((GLfloat*)jointToWorld.mMatrix);
- mFace->mVertexBuffer->drawRange(LLRender::TRIANGLES, start, end, count, offset);
+ mFace->getVertexBuffer()->drawRange(LLRender::TRIANGLES, start, end, count, offset);
glPopMatrix();
}
gPipeline.addTrianglesDrawn(count);
@@ -609,13 +615,13 @@ U32 LLViewerJointMesh::drawShape( F32 pixelArea, BOOL first_pass, BOOL is_dummy)
if (mTestImageName)
{
- gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);
+ gGL.getTexUnit(diffuse_channel)->setTextureBlendType(LLTexUnit::TB_MULT);
}
if (mTexture.notNull() && !is_dummy)
{
- gGL.getTexUnit(0)->bind(mTexture);
- gGL.getTexUnit(0)->setTextureAddressMode(old_mode);
+ gGL.getTexUnit(diffuse_channel)->bind(mTexture);
+ gGL.getTexUnit(diffuse_channel)->setTextureAddressMode(old_mode);
}
return triangle_count;
@@ -626,6 +632,9 @@ U32 LLViewerJointMesh::drawShape( F32 pixelArea, BOOL first_pass, BOOL is_dummy)
//-----------------------------------------------------------------------------
void LLViewerJointMesh::updateFaceSizes(U32 &num_vertices, U32& num_indices, F32 pixel_area)
{
+ //bump num_vertices to next multiple of 4
+ num_vertices = (num_vertices + 0x3) & ~0x3;
+
// Do a pre-alloc pass to determine sizes of data.
if (mMesh && mValid)
{
@@ -648,13 +657,25 @@ static LLFastTimer::DeclareTimer FTM_AVATAR_FACE("Avatar Face");
void LLViewerJointMesh::updateFaceData(LLFace *face, F32 pixel_area, BOOL damp_wind, bool terse_update)
{
+ //IF THIS FUNCTION BREAKS, SEE LLPOLYMESH CONSTRUCTOR AND CHECK ALIGNMENT OF INPUT ARRAYS
+
mFace = face;
- if (mFace->mVertexBuffer.isNull())
+ if (!mFace->getVertexBuffer())
{
return;
}
+ LLDrawPool *poolp = mFace->getPool();
+ BOOL hardware_skinning = (poolp && poolp->getVertexShaderLevel() > 0) ? TRUE : FALSE;
+
+ if (!hardware_skinning && terse_update)
+ { //no need to do terse updates if we're doing software vertex skinning
+ // since mMesh is being copied into mVertexBuffer every frame
+ return;
+ }
+
+
LLFastTimer t(FTM_AVATAR_FACE);
LLStrider<LLVector3> verticesp;
@@ -667,111 +688,59 @@ void LLViewerJointMesh::updateFaceData(LLFace *face, F32 pixel_area, BOOL damp_w
// Copy data into the faces from the polymesh data.
if (mMesh && mValid)
{
- if (mMesh->getNumVertices())
+ const U32 num_verts = mMesh->getNumVertices();
+
+ if (num_verts)
{
- stop_glerror();
face->getGeometryAvatar(verticesp, normalsp, tex_coordsp, vertex_weightsp, clothing_weightsp);
- stop_glerror();
- face->mVertexBuffer->getIndexStrider(indicesp);
- stop_glerror();
+ face->getVertexBuffer()->getIndexStrider(indicesp);
verticesp += mMesh->mFaceVertexOffset;
- tex_coordsp += mMesh->mFaceVertexOffset;
normalsp += mMesh->mFaceVertexOffset;
- vertex_weightsp += mMesh->mFaceVertexOffset;
- clothing_weightsp += mMesh->mFaceVertexOffset;
-
- const U32* __restrict coords = (U32*) mMesh->getCoords();
- const U32* __restrict tex_coords = (U32*) mMesh->getTexCoords();
- const U32* __restrict normals = (U32*) mMesh->getNormals();
- const U32* __restrict weights = (U32*) mMesh->getWeights();
- const U32* __restrict cloth_weights = (U32*) mMesh->getClothingWeights();
-
- const U32 num_verts = mMesh->getNumVertices();
-
- U32 i = 0;
-
- const U32 skip = verticesp.getSkip()/sizeof(U32);
+
+ F32* v = (F32*) verticesp.get();
+ F32* n = (F32*) normalsp.get();
+
+ U32 words = num_verts*4;
- U32* __restrict v = (U32*) verticesp.get();
- U32* __restrict n = (U32*) normalsp.get();
+ LLVector4a::memcpyNonAliased16(v, (F32*) mMesh->getCoords(), words*sizeof(F32));
+ LLVector4a::memcpyNonAliased16(n, (F32*) mMesh->getNormals(), words*sizeof(F32));
+
- if (terse_update)
+ if (!terse_update)
{
- for (S32 i = num_verts; i > 0; --i)
- {
- //morph target application only, only update positions and normals
- v[0] = coords[0];
- v[1] = coords[1];
- v[2] = coords[2];
- coords += 3;
- v += skip;
- }
+ vertex_weightsp += mMesh->mFaceVertexOffset;
+ clothing_weightsp += mMesh->mFaceVertexOffset;
+ tex_coordsp += mMesh->mFaceVertexOffset;
+
+ F32* tc = (F32*) tex_coordsp.get();
+ F32* vw = (F32*) vertex_weightsp.get();
+ F32* cw = (F32*) clothing_weightsp.get();
- for (S32 i = num_verts; i > 0; --i)
- {
- n[0] = normals[0];
- n[1] = normals[1];
- n[2] = normals[2];
- normals += 3;
- n += skip;
- }
+ LLVector4a::memcpyNonAliased16(tc, (F32*) mMesh->getTexCoords(), num_verts*2*sizeof(F32));
+ LLVector4a::memcpyNonAliased16(vw, (F32*) mMesh->getWeights(), num_verts*sizeof(F32));
+ LLVector4a::memcpyNonAliased16(cw, (F32*) mMesh->getClothingWeights(), num_verts*4*sizeof(F32));
}
- else
- {
- U32* __restrict tc = (U32*) tex_coordsp.get();
- U32* __restrict vw = (U32*) vertex_weightsp.get();
- U32* __restrict cw = (U32*) clothing_weightsp.get();
-
- do
- {
- v[0] = *(coords++);
- v[1] = *(coords++);
- v[2] = *(coords++);
- v += skip;
-
- tc[0] = *(tex_coords++);
- tc[1] = *(tex_coords++);
- tc += skip;
-
- n[0] = *(normals++);
- n[1] = *(normals++);
- n[2] = *(normals++);
- n += skip;
-
- vw[0] = *(weights++);
- vw += skip;
-
- cw[0] = *(cloth_weights++);
- cw[1] = *(cloth_weights++);
- cw[2] = *(cloth_weights++);
- cw[3] = *(cloth_weights++);
- cw += skip;
- }
- while (++i < num_verts);
+ const U32 idx_count = mMesh->getNumFaces()*3;
- const U32 idx_count = mMesh->getNumFaces()*3;
+ indicesp += mMesh->mFaceIndexOffset;
- indicesp += mMesh->mFaceIndexOffset;
+ U16* __restrict idx = indicesp.get();
+ S32* __restrict src_idx = (S32*) mMesh->getFaces();
- U16* __restrict idx = indicesp.get();
- S32* __restrict src_idx = (S32*) mMesh->getFaces();
+ const S32 offset = (S32) mMesh->mFaceVertexOffset;
- i = 0;
-
- const S32 offset = (S32) mMesh->mFaceVertexOffset;
-
- do
- {
- *(idx++) = *(src_idx++)+offset;
- }
- while (++i < idx_count);
+ for (S32 i = 0; i < idx_count; ++i)
+ {
+ *(idx++) = *(src_idx++)+offset;
}
}
}
}
+
+
//-----------------------------------------------------------------------------
// updateLOD()
//-----------------------------------------------------------------------------
@@ -789,89 +758,49 @@ void LLViewerJointMesh::updateGeometryOriginal(LLFace *mFace, LLPolyMesh *mMesh)
LLStrider<LLVector3> o_normals;
//get vertex and normal striders
- LLVertexBuffer *buffer = mFace->mVertexBuffer;
+ LLVertexBuffer* buffer = mFace->getVertexBuffer();
buffer->getVertexStrider(o_vertices, 0);
buffer->getNormalStrider(o_normals, 0);
- F32 last_weight = F32_MAX;
- LLMatrix4 gBlendMat;
- LLMatrix3 gBlendRotMat;
+ F32* __restrict vert = o_vertices[0].mV;
+ F32* __restrict norm = o_normals[0].mV;
+
+ const F32* __restrict weights = mMesh->getWeights();
+ const LLVector4a* __restrict coords = (LLVector4a*) mMesh->getCoords();
+ const LLVector4a* __restrict normals = (LLVector4a*) mMesh->getNormals();
+
+ U32 offset = mMesh->mFaceVertexOffset*4;
+ vert += offset;
+ norm += offset;
- const F32* weights = mMesh->getWeights();
- const LLVector3* coords = mMesh->getCoords();
- const LLVector3* normals = mMesh->getNormals();
for (U32 index = 0; index < mMesh->getNumVertices(); index++)
{
- U32 bidx = index + mMesh->mFaceVertexOffset;
-
- // blend by first matrix
- F32 w = weights[index];
-
- // Maybe we don't have to change gBlendMat.
- // Profiles of a single-avatar scene on a Mac show this to be a very
- // common case. JC
- if (w == last_weight)
- {
- o_vertices[bidx] = coords[index] * gBlendMat;
- o_normals[bidx] = normals[index] * gBlendRotMat;
- continue;
- }
-
- last_weight = w;
+ // equivalent to joint = floorf(weights[index]);
+ S32 joint = _mm_cvtt_ss2si(_mm_load_ss(weights+index));
+ F32 w = weights[index] - joint;
- S32 joint = llfloor(w);
- w -= joint;
-
- // No lerp required in this case.
- if (w == 1.0f)
+ LLMatrix4a gBlendMat;
+
+ if (w != 0.f)
{
- gBlendMat = gJointMatUnaligned[joint+1];
- o_vertices[bidx] = coords[index] * gBlendMat;
- gBlendRotMat = gJointRotUnaligned[joint+1];
- o_normals[bidx] = normals[index] * gBlendRotMat;
- continue;
+ // blend between matrices and apply
+ gBlendMat.setLerp(gJointMatAligned[joint+0],
+ gJointMatAligned[joint+1], w);
+
+ LLVector4a res;
+ gBlendMat.affineTransform(coords[index], res);
+ res.store4a(vert+index*4);
+ gBlendMat.rotate(normals[index], res);
+ res.store4a(norm+index*4);
+ }
+ else
+ { // No lerp required in this case.
+ LLVector4a res;
+ gJointMatAligned[joint].affineTransform(coords[index], res);
+ res.store4a(vert+index*4);
+ gJointMatAligned[joint].rotate(normals[index], res);
+ res.store4a(norm+index*4);
}
-
- // Try to keep all the accesses to the matrix data as close
- // together as possible. This function is a hot spot on the
- // Mac. JC
- LLMatrix4 &m0 = gJointMatUnaligned[joint+1];
- LLMatrix4 &m1 = gJointMatUnaligned[joint+0];
-
- gBlendMat.mMatrix[VX][VX] = lerp(m1.mMatrix[VX][VX], m0.mMatrix[VX][VX], w);
- gBlendMat.mMatrix[VX][VY] = lerp(m1.mMatrix[VX][VY], m0.mMatrix[VX][VY], w);
- gBlendMat.mMatrix[VX][VZ] = lerp(m1.mMatrix[VX][VZ], m0.mMatrix[VX][VZ], w);
-
- gBlendMat.mMatrix[VY][VX] = lerp(m1.mMatrix[VY][VX], m0.mMatrix[VY][VX], w);
- gBlendMat.mMatrix[VY][VY] = lerp(m1.mMatrix[VY][VY], m0.mMatrix[VY][VY], w);
- gBlendMat.mMatrix[VY][VZ] = lerp(m1.mMatrix[VY][VZ], m0.mMatrix[VY][VZ], w);
-
- gBlendMat.mMatrix[VZ][VX] = lerp(m1.mMatrix[VZ][VX], m0.mMatrix[VZ][VX], w);
- gBlendMat.mMatrix[VZ][VY] = lerp(m1.mMatrix[VZ][VY], m0.mMatrix[VZ][VY], w);
- gBlendMat.mMatrix[VZ][VZ] = lerp(m1.mMatrix[VZ][VZ], m0.mMatrix[VZ][VZ], w);
-
- gBlendMat.mMatrix[VW][VX] = lerp(m1.mMatrix[VW][VX], m0.mMatrix[VW][VX], w);
- gBlendMat.mMatrix[VW][VY] = lerp(m1.mMatrix[VW][VY], m0.mMatrix[VW][VY], w);
- gBlendMat.mMatrix[VW][VZ] = lerp(m1.mMatrix[VW][VZ], m0.mMatrix[VW][VZ], w);
-
- o_vertices[bidx] = coords[index] * gBlendMat;
-
- LLMatrix3 &n0 = gJointRotUnaligned[joint+1];
- LLMatrix3 &n1 = gJointRotUnaligned[joint+0];
-
- gBlendRotMat.mMatrix[VX][VX] = lerp(n1.mMatrix[VX][VX], n0.mMatrix[VX][VX], w);
- gBlendRotMat.mMatrix[VX][VY] = lerp(n1.mMatrix[VX][VY], n0.mMatrix[VX][VY], w);
- gBlendRotMat.mMatrix[VX][VZ] = lerp(n1.mMatrix[VX][VZ], n0.mMatrix[VX][VZ], w);
-
- gBlendRotMat.mMatrix[VY][VX] = lerp(n1.mMatrix[VY][VX], n0.mMatrix[VY][VX], w);
- gBlendRotMat.mMatrix[VY][VY] = lerp(n1.mMatrix[VY][VY], n0.mMatrix[VY][VY], w);
- gBlendRotMat.mMatrix[VY][VZ] = lerp(n1.mMatrix[VY][VZ], n0.mMatrix[VY][VZ], w);
-
- gBlendRotMat.mMatrix[VZ][VX] = lerp(n1.mMatrix[VZ][VX], n0.mMatrix[VZ][VX], w);
- gBlendRotMat.mMatrix[VZ][VY] = lerp(n1.mMatrix[VZ][VY], n0.mMatrix[VZ][VY], w);
- gBlendRotMat.mMatrix[VZ][VZ] = lerp(n1.mMatrix[VZ][VZ], n0.mMatrix[VZ][VZ], w);
-
- o_normals[bidx] = normals[index] * gBlendRotMat;
}
buffer->setBuffer(0);
@@ -940,7 +869,7 @@ void LLViewerJointMesh::updateJointGeometry()
&& mMesh
&& mFace
&& mMesh->hasWeights()
- && mFace->mVertexBuffer.notNull()
+ && mFace->getVertexBuffer()
&& LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_AVATAR) == 0))
{
return;
diff --git a/indra/newview/llviewerjointmesh_sse.cpp b/indra/newview/llviewerjointmesh_sse.cpp
index 174b6eae29..400b49d046 100644
--- a/indra/newview/llviewerjointmesh_sse.cpp
+++ b/indra/newview/llviewerjointmesh_sse.cpp
@@ -83,13 +83,13 @@ void LLViewerJointMesh::updateGeometrySSE(LLFace *face, LLPolyMesh *mesh)
LLStrider<LLVector3> o_vertices;
LLStrider<LLVector3> o_normals;
- LLVertexBuffer *buffer = face->mVertexBuffer;
+ LLVertexBuffer *buffer = face->getVertexBuffer();
buffer->getVertexStrider(o_vertices, mesh->mFaceVertexOffset);
buffer->getNormalStrider(o_normals, mesh->mFaceVertexOffset);
const F32* weights = mesh->getWeights();
- const LLVector3* coords = mesh->getCoords();
- const LLVector3* normals = mesh->getNormals();
+ const LLVector3* coords = (const LLVector3*)mesh->getCoords();
+ const LLVector3* normals = (const LLVector3*)mesh->getNormals();
for (U32 index = 0, index_end = mesh->getNumVertices(); index < index_end; ++index)
{
if( weight != weights[index])
diff --git a/indra/newview/llviewerjointmesh_sse2.cpp b/indra/newview/llviewerjointmesh_sse2.cpp
index a374ba2471..c2296dd569 100644
--- a/indra/newview/llviewerjointmesh_sse2.cpp
+++ b/indra/newview/llviewerjointmesh_sse2.cpp
@@ -90,13 +90,13 @@ void LLViewerJointMesh::updateGeometrySSE2(LLFace *face, LLPolyMesh *mesh)
LLStrider<LLVector3> o_vertices;
LLStrider<LLVector3> o_normals;
- LLVertexBuffer *buffer = face->mVertexBuffer;
+ LLVertexBuffer *buffer = face->getVertexBuffer();
buffer->getVertexStrider(o_vertices, mesh->mFaceVertexOffset);
buffer->getNormalStrider(o_normals, mesh->mFaceVertexOffset);
const F32* weights = mesh->getWeights();
- const LLVector3* coords = mesh->getCoords();
- const LLVector3* normals = mesh->getNormals();
+ const LLVector3* coords = (const LLVector3*)mesh->getCoords();
+ const LLVector3* normals = (const LLVector3*)mesh->getNormals();
for (U32 index = 0, index_end = mesh->getNumVertices(); index < index_end; ++index)
{
if( weight != weights[index])
diff --git a/indra/newview/llviewerjointmesh_vec.cpp b/indra/newview/llviewerjointmesh_vec.cpp
index c9371030ad..6600d01d17 100644
--- a/indra/newview/llviewerjointmesh_vec.cpp
+++ b/indra/newview/llviewerjointmesh_vec.cpp
@@ -46,6 +46,7 @@
// static
void LLViewerJointMesh::updateGeometryVectorized(LLFace *face, LLPolyMesh *mesh)
{
+#if 0
static LLV4Matrix4 sJointMat[32];
LLDynamicArray<LLJointRenderData*>& joint_data = mesh->getReferenceMesh()->mJointRenderData;
S32 j, joint_num, joint_end = joint_data.count();
@@ -92,4 +93,5 @@ void LLViewerJointMesh::updateGeometryVectorized(LLFace *face, LLPolyMesh *mesh)
}
buffer->setBuffer(0);
+#endif
}
diff --git a/indra/newview/llviewerjoystick.cpp b/indra/newview/llviewerjoystick.cpp
index e1dd72dddc..fbf11f20db 100644
--- a/indra/newview/llviewerjoystick.cpp
+++ b/indra/newview/llviewerjoystick.cpp
@@ -758,7 +758,7 @@ void LLViewerJoystick::moveAvatar(bool reset)
sDelta[RX_I] += (cur_delta[RX_I] - sDelta[RX_I]) * time * feather;
sDelta[RY_I] += (cur_delta[RY_I] - sDelta[RY_I]) * time * feather;
- handleRun(fsqrtf(sDelta[Z_I]*sDelta[Z_I] + sDelta[X_I]*sDelta[X_I]));
+ handleRun((F32) sqrt(sDelta[Z_I]*sDelta[Z_I] + sDelta[X_I]*sDelta[X_I]));
// Allow forward/backward movement some priority
if (dom_axis == Z_I)
diff --git a/indra/newview/llviewerkeyboard.h b/indra/newview/llviewerkeyboard.h
index 925244e89b..ca73212ed1 100644
--- a/indra/newview/llviewerkeyboard.h
+++ b/indra/newview/llviewerkeyboard.h
@@ -28,6 +28,7 @@
#define LL_LLVIEWERKEYBOARD_H
#include "llkeyboard.h" // For EKeystate
+#include "llinitparam.h"
const S32 MAX_NAMED_FUNCTIONS = 100;
const S32 MAX_KEY_BINDINGS = 128; // was 60
diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp
index 037e22584f..1e53274cd6 100644
--- a/indra/newview/llviewermedia.cpp
+++ b/indra/newview/llviewermedia.cpp
@@ -54,6 +54,7 @@
#include "llfilepicker.h"
#include "llnotifications.h"
#include "lldir.h"
+#include "lldiriterator.h"
#include "llevent.h" // LLSimpleListener
#include "llnotificationsutil.h"
#include "lluuid.h"
@@ -61,6 +62,7 @@
#include "llmutelist.h"
#include "llpanelprofile.h"
#include "llappviewer.h"
+#include "lllogininstance.h"
//#include "llfirstuse.h"
#include "llwindow.h"
@@ -913,7 +915,7 @@ void LLViewerMedia::updateMedia(void *dummy_arg)
// Set the low priority size for downsampling to approximately the size the texture is displayed at.
{
- F32 approximate_interest_dimension = fsqrtf(pimpl->getInterest());
+ F32 approximate_interest_dimension = (F32) sqrt(pimpl->getInterest());
pimpl->setLowPrioritySizeLimit(llround(approximate_interest_dimension));
}
@@ -1154,7 +1156,8 @@ void LLViewerMedia::clearAllCookies()
}
// the hard part: iterate over all user directories and delete the cookie file from each one
- while(gDirUtilp->getNextFileInDir(base_dir, "*_*", filename))
+ LLDirIterator dir_iter(base_dir, "*_*");
+ while (dir_iter.next(filename))
{
target = base_dir;
target += filename;
@@ -2341,6 +2344,65 @@ 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 expose_javascript_object = gSavedSettings.getBOOL("BrowserEnableJSObject");
+ mMediaSource->jsExposeObjectEvent( expose_javascript_object );
+
+ // indicate if the values we have are valid (currently do this blanket-fashion for
+ // everything depending on whether you are logged in or not - this may require a
+ // more granular approach once variables are added that ARE valid before login
+ bool logged_in = LLLoginInstance::getInstance()->authSuccess();
+ mMediaSource->jsValuesValidEvent( 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)
@@ -2638,6 +2700,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 5a3baf2650..41d8b57f36 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -37,6 +37,7 @@
// newview includes
#include "llagent.h"
+#include "llagentaccess.h"
#include "llagentcamera.h"
#include "llagentwearables.h"
#include "llagentpilot.h"
@@ -76,6 +77,7 @@
#include "llmoveview.h"
#include "llparcel.h"
#include "llrootview.h"
+#include "llsceneview.h"
#include "llselectmgr.h"
#include "llsidetray.h"
#include "llstatusbar.h"
@@ -104,6 +106,7 @@
#include "llappearancemgr.h"
#include "lltrans.h"
#include "lleconomy.h"
+#include "lltoolgrab.h"
#include "boost/unordered_map.hpp"
using namespace LLVOAvatarDefines;
@@ -167,7 +170,6 @@ LLMenuItemCallGL* gBusyMenu = NULL;
// Local prototypes
// File Menu
-const char* upload_pick(void* data);
void handle_compress_image(void*);
@@ -454,7 +456,7 @@ void init_menus()
gMenuHolder->childSetLabelArg("Upload Sound", "[COST]", upload_cost);
gMenuHolder->childSetLabelArg("Upload Animation", "[COST]", upload_cost);
gMenuHolder->childSetLabelArg("Bulk Upload", "[COST]", upload_cost);
-
+
gAFKMenu = gMenuBarView->getChild<LLMenuItemCallGL>("Set Away", TRUE);
gBusyMenu = gMenuBarView->getChild<LLMenuItemCallGL>("Set Busy", TRUE);
gAttachSubMenu = gMenuBarView->findChildMenuByName("Attach Object", TRUE);
@@ -516,6 +518,11 @@ class LLAdvancedToggleConsole : public view_listener_t
{
toggle_visibility( (void*)gDebugView->mFastTimerView );
}
+ else if ("scene view" == console_type)
+ {
+ toggle_visibility( (void*)gSceneView);
+ }
+
#if MEM_TRACK_MEM
else if ("memory view" == console_type)
{
@@ -551,6 +558,10 @@ class LLAdvancedCheckConsole : public view_listener_t
{
new_value = get_visibility( (void*)gDebugView->mFastTimerView );
}
+ else if ("scene view" == console_type)
+ {
+ new_value = get_visibility( (void*) gSceneView);
+ }
#if MEM_TRACK_MEM
else if ("memory view" == console_type)
{
@@ -698,7 +709,7 @@ U32 render_type_from_string(std::string render_type)
{
return LLPipeline::RENDER_TYPE_AVATAR;
}
- else if ("surfacePath" == render_type)
+ else if ("surfacePatch" == render_type)
{
return LLPipeline::RENDER_TYPE_TERRAIN;
}
@@ -902,6 +913,10 @@ U32 info_display_from_string(std::string info_display)
{
return LLPipeline::RENDER_DEBUG_BBOXES;
}
+ else if ("normals" == info_display)
+ {
+ return LLPipeline::RENDER_DEBUG_NORMALS;
+ }
else if ("points" == info_display)
{
return LLPipeline::RENDER_DEBUG_POINTS;
@@ -914,6 +929,10 @@ U32 info_display_from_string(std::string info_display)
{
return LLPipeline::RENDER_DEBUG_SHADOW_FRUSTA;
}
+ else if ("physics shapes" == info_display)
+ {
+ return LLPipeline::RENDER_DEBUG_PHYSICS_SHAPES;
+ }
else if ("occlusion" == info_display)
{
return LLPipeline::RENDER_DEBUG_OCCLUSION;
@@ -946,6 +965,14 @@ U32 info_display_from_string(std::string info_display)
{
return LLPipeline::RENDER_DEBUG_FACE_AREA;
}
+ else if ("lod info" == info_display)
+ {
+ return LLPipeline::RENDER_DEBUG_LOD_INFO;
+ }
+ else if ("build queue" == info_display)
+ {
+ return LLPipeline::RENDER_DEBUG_BUILD_QUEUE;
+ }
else if ("lights" == info_display)
{
return LLPipeline::RENDER_DEBUG_LIGHTS;
@@ -974,6 +1001,10 @@ U32 info_display_from_string(std::string info_display)
{
return LLPipeline::RENDER_DEBUG_AGENT_TARGET;
}
+ else if ("sculpt" == info_display)
+ {
+ return LLPipeline::RENDER_DEBUG_SCULPTED;
+ }
else
{
return 0;
@@ -1906,19 +1937,20 @@ class LLAdvancedAgentPilot : public view_listener_t
std::string command = userdata.asString();
if ("start playback" == command)
{
- LLAgentPilot::startPlayback(NULL);
+ gAgentPilot.setNumRuns(-1);
+ gAgentPilot.startPlayback();
}
else if ("stop playback" == command)
{
- LLAgentPilot::stopPlayback(NULL);
+ gAgentPilot.stopPlayback();
}
else if ("start record" == command)
{
- LLAgentPilot::startRecord(NULL);
+ gAgentPilot.startRecord();
}
else if ("stop record" == command)
{
- LLAgentPilot::saveRecord(NULL);
+ gAgentPilot.stopRecord();
}
return true;
@@ -1936,7 +1968,7 @@ class LLAdvancedToggleAgentPilotLoop : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
{
- LLAgentPilot::sLoop = !(LLAgentPilot::sLoop);
+ gAgentPilot.setLoop(!gAgentPilot.getLoop());
return true;
}
};
@@ -1945,7 +1977,7 @@ class LLAdvancedCheckAgentPilotLoop : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
{
- bool new_value = LLAgentPilot::sLoop;
+ bool new_value = gAgentPilot.getLoop();
return new_value;
}
};
@@ -2073,7 +2105,7 @@ class LLAdvancedEnableRenderDeferred: public view_listener_t
{
bool handleEvent(const LLSD& userdata)
{
- bool new_value = gSavedSettings.getBOOL("RenderUseFBO") && LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_WINDLIGHT > 0) &&
+ bool new_value = gGLManager.mHasFramebufferObject && LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_WINDLIGHT) > 1 &&
LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_AVATAR) > 0;
return new_value;
}
@@ -2086,7 +2118,8 @@ class LLAdvancedEnableRenderDeferredOptions: public view_listener_t
{
bool handleEvent(const LLSD& userdata)
{
- bool new_value = gSavedSettings.getBOOL("RenderUseFBO") && gSavedSettings.getBOOL("RenderDeferred");
+ bool new_value = gGLManager.mHasFramebufferObject && LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_WINDLIGHT) > 1 &&
+ LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_AVATAR) > 0 && gSavedSettings.getBOOL("RenderDeferred");
return new_value;
}
};
@@ -2388,50 +2421,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);
@@ -5591,6 +5597,14 @@ class LLToggleHelp : public view_listener_t
}
};
+class LLToggleSpeak : public view_listener_t
+{
+ bool handleEvent(const LLSD& userdata)
+ {
+ LLVoiceClient::getInstance()->toggleUserPTTState();
+ return true;
+ }
+};
class LLShowSidetrayPanel : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
@@ -8187,6 +8201,7 @@ void initialize_menus()
commit.add("BuyCurrency", boost::bind(&handle_buy_currency));
view_listener_t::addMenu(new LLShowHelp(), "ShowHelp");
view_listener_t::addMenu(new LLToggleHelp(), "ToggleHelp");
+ view_listener_t::addMenu(new LLToggleSpeak(), "ToggleSpeak");
view_listener_t::addMenu(new LLPromptShowURL(), "PromptShowURL");
view_listener_t::addMenu(new LLShowAgentProfile(), "ShowAgentProfile");
view_listener_t::addMenu(new LLToggleAgentProfile(), "ToggleAgentProfile");
diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp
index fda291f3c1..37640ad0d4 100644
--- a/indra/newview/llviewermenufile.cpp
+++ b/indra/newview/llviewermenufile.cpp
@@ -34,6 +34,7 @@
#include "llfilepicker.h"
#include "llfloaterreg.h"
#include "llbuycurrencyhtml.h"
+#include "llfloatermodelpreview.h"
#include "llfloatersnapshot.h"
#include "llimage.h"
#include "llimagebmp.h"
@@ -52,13 +53,14 @@
#include "llvfs.h"
#include "llviewerinventory.h"
#include "llviewermenu.h" // gMenuHolder
+#include "llviewerparcelmgr.h"
#include "llviewerregion.h"
#include "llviewerstats.h"
#include "llviewerwindow.h"
#include "llappviewer.h"
#include "lluploaddialog.h"
#include "lltrans.h"
-
+#include "llfloaterbuycurrency.h"
// linden libraries
#include "llassetuploadresponders.h"
@@ -66,6 +68,7 @@
#include "llhttpclient.h"
#include "llnotificationsutil.h"
#include "llsdserialize.h"
+#include "llsdutil.h"
#include "llstring.h"
#include "lltransactiontypes.h"
#include "lluuid.h"
@@ -84,6 +87,99 @@ class LLFileEnableUpload : public view_listener_t
}
};
+class LLFileEnableUploadModel : public view_listener_t
+{
+ bool handleEvent(const LLSD& userdata)
+ {
+ return true;
+ }
+};
+
+class LLMeshEnabled : public view_listener_t
+{
+ bool handleEvent(const LLSD& userdata)
+ {
+ return gSavedSettings.getBOOL("MeshEnabled");
+ }
+};
+
+class LLMeshUploadVisible : public view_listener_t
+{
+ bool handleEvent(const LLSD& userdata)
+ {
+ return gSavedSettings.getBOOL("MeshEnabled") &&
+ LLViewerParcelMgr::getInstance()->allowAgentBuild() &&
+ !gAgent.getRegion()->getCapability("ObjectAdd").empty();
+ }
+};
+
+LLMutex* LLFilePickerThread::sMutex = NULL;
+std::queue<LLFilePickerThread*> LLFilePickerThread::sDeadQ;
+
+void LLFilePickerThread::getFile()
+{
+#if LL_WINDOWS
+ start();
+#else
+ run();
+#endif
+}
+
+//virtual
+void LLFilePickerThread::run()
+{
+ LLFilePicker picker;
+#if LL_WINDOWS
+ if (picker.getOpenFile(mFilter, false))
+ {
+ mFile = picker.getFirstFile();
+ }
+#else
+ if (picker.getOpenFile(mFilter, true))
+ {
+ mFile = picker.getFirstFile();
+ }
+#endif
+
+ {
+ LLMutexLock lock(sMutex);
+ sDeadQ.push(this);
+ }
+
+}
+
+//static
+void LLFilePickerThread::initClass()
+{
+ sMutex = new LLMutex(NULL);
+}
+
+//static
+void LLFilePickerThread::cleanupClass()
+{
+ clearDead();
+
+ delete sMutex;
+ sMutex = NULL;
+}
+
+//static
+void LLFilePickerThread::clearDead()
+{
+ if (!sDeadQ.empty())
+ {
+ LLMutexLock lock(sMutex);
+ while (!sDeadQ.empty())
+ {
+ LLFilePickerThread* thread = sDeadQ.front();
+ thread->notify(thread->mFile);
+ delete thread;
+ sDeadQ.pop();
+ }
+ }
+}
+
+
//============================================================================
#if LL_WINDOWS
@@ -97,6 +193,7 @@ static std::string XML_EXTENSIONS = "xml";
static std::string SLOBJECT_EXTENSIONS = "slobject";
#endif
static std::string ALL_FILE_EXTENSIONS = "*.*";
+static std::string MODEL_EXTENSIONS = "dae";
std::string build_extensions_string(LLFilePicker::ELoadFilter filter)
{
@@ -111,6 +208,8 @@ std::string build_extensions_string(LLFilePicker::ELoadFilter filter)
return ANIM_EXTENSIONS;
case LLFilePicker::FFLOAD_SLOBJECT:
return SLOBJECT_EXTENSIONS;
+ case LLFilePicker::FFLOAD_MODEL:
+ return MODEL_EXTENSIONS;
#ifdef _CORY_TESTING
case LLFilePicker::FFLOAD_GEOMETRY:
return GEOMETRY_EXTENSIONS;
@@ -254,6 +353,20 @@ class LLFileUploadImage : public view_listener_t
}
};
+class LLFileUploadModel : public view_listener_t
+{
+ bool handleEvent(const LLSD& userdata)
+ {
+ LLFloaterModelPreview* fmp = (LLFloaterModelPreview*) LLFloaterReg::getInstance("upload_model");
+ if (fmp)
+ {
+ fmp->loadModel(3);
+ }
+
+ return TRUE;
+ }
+};
+
class LLFileUploadSound : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
@@ -315,10 +428,21 @@ class LLFileUploadBulk : public view_listener_t
LLAssetStorage::LLStoreAssetCallback callback = NULL;
S32 expected_upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload();
void *userdata = NULL;
- upload_new_resource(filename, asset_name, asset_name, 0, LLFolderType::FT_NONE, LLInventoryType::IT_NONE,
- LLFloaterPerms::getNextOwnerPerms(), LLFloaterPerms::getGroupPerms(), LLFloaterPerms::getEveryonePerms(),
- display_name,
- callback, expected_upload_cost, userdata);
+
+ upload_new_resource(
+ filename,
+ asset_name,
+ asset_name,
+ 0,
+ LLFolderType::FT_NONE,
+ LLInventoryType::IT_NONE,
+ LLFloaterPerms::getNextOwnerPerms(),
+ LLFloaterPerms::getGroupPerms(),
+ LLFloaterPerms::getEveryonePerms(),
+ display_name,
+ callback,
+ expected_upload_cost,
+ userdata);
// *NOTE: Ew, we don't iterate over the file list here,
// we handle the next files in upload_done_callback()
@@ -473,17 +597,20 @@ void handle_compress_image(void*)
}
}
-void upload_new_resource(const std::string& src_filename, std::string name,
- std::string desc, S32 compression_info,
- LLFolderType::EType destination_folder_type,
- LLInventoryType::EType inv_type,
- U32 next_owner_perms,
- U32 group_perms,
- U32 everyone_perms,
- const std::string& display_name,
- LLAssetStorage::LLStoreAssetCallback callback,
- S32 expected_upload_cost,
- void *userdata)
+LLUUID upload_new_resource(
+ const std::string& src_filename,
+ std::string name,
+ std::string desc,
+ S32 compression_info,
+ LLFolderType::EType destination_folder_type,
+ LLInventoryType::EType inv_type,
+ U32 next_owner_perms,
+ U32 group_perms,
+ U32 everyone_perms,
+ const std::string& display_name,
+ LLAssetStorage::LLStoreAssetCallback callback,
+ S32 expected_upload_cost,
+ void *userdata)
{
// Generate the temporary UUID.
std::string filename = gDirUtilp->getTempFilename();
@@ -493,6 +620,7 @@ void upload_new_resource(const std::string& src_filename, std::string name,
LLSD args;
std::string exten = gDirUtilp->getExtension(src_filename);
+ U32 codec = LLImageBase::getCodecFromExtension(exten);
LLAssetType::EType asset_type = LLAssetType::AT_NONE;
std::string error_message;
@@ -508,68 +636,22 @@ void upload_new_resource(const std::string& src_filename, std::string name,
short_name.c_str());
args["FILE"] = short_name;
upload_error(error_message, "NoFileExtension", filename, args);
- return;
+ return LLUUID();
}
- else if( exten == "bmp")
+ else if (codec != IMG_CODEC_INVALID)
{
+ // It's an image file, the upload procedure is the same for all
asset_type = LLAssetType::AT_TEXTURE;
- if (!LLViewerTextureList::createUploadFile(src_filename,
- filename,
- IMG_CODEC_BMP ))
+ if (!LLViewerTextureList::createUploadFile(src_filename, filename, codec ))
{
error_message = llformat( "Problem with file %s:\n\n%s\n",
- src_filename.c_str(), LLImage::getLastError().c_str());
- args["FILE"] = src_filename;
- args["ERROR"] = LLImage::getLastError();
- upload_error(error_message, "ProblemWithFile", filename, args);
- return;
- }
- }
- else if( exten == "tga")
- {
- asset_type = LLAssetType::AT_TEXTURE;
- if (!LLViewerTextureList::createUploadFile(src_filename,
- filename,
- IMG_CODEC_TGA ))
- {
- error_message = llformat("Problem with file %s:\n\n%s\n",
- src_filename.c_str(), LLImage::getLastError().c_str());
- args["FILE"] = src_filename;
- args["ERROR"] = LLImage::getLastError();
- upload_error(error_message, "ProblemWithFile", filename, args);
- return;
- }
- }
- else if( exten == "jpg" || exten == "jpeg")
- {
- asset_type = LLAssetType::AT_TEXTURE;
- if (!LLViewerTextureList::createUploadFile(src_filename,
- filename,
- IMG_CODEC_JPEG ))
- {
- error_message = llformat("Problem with file %s:\n\n%s\n",
- src_filename.c_str(), LLImage::getLastError().c_str());
+ src_filename.c_str(), LLImage::getLastError().c_str());
args["FILE"] = src_filename;
args["ERROR"] = LLImage::getLastError();
upload_error(error_message, "ProblemWithFile", filename, args);
- return;
+ return LLUUID();
}
}
- else if( exten == "png")
- {
- asset_type = LLAssetType::AT_TEXTURE;
- if (!LLViewerTextureList::createUploadFile(src_filename,
- filename,
- IMG_CODEC_PNG ))
- {
- error_message = llformat("Problem with file %s:\n\n%s\n",
- src_filename.c_str(), LLImage::getLastError().c_str());
- args["FILE"] = src_filename;
- args["ERROR"] = LLImage::getLastError();
- upload_error(error_message, "ProblemWithFile", filename, args);
- return;
- }
- }
else if(exten == "wav")
{
asset_type = LLAssetType::AT_SOUND; // tag it as audio
@@ -595,7 +677,7 @@ void upload_new_resource(const std::string& src_filename, std::string name,
upload_error(error_message, "UnknownVorbisEncodeFailure", filename, args);
break;
}
- return;
+ return LLUUID();
}
}
else if(exten == "tmp")
@@ -635,7 +717,7 @@ void upload_new_resource(const std::string& src_filename, std::string name,
error_message = llformat("corrupt resource file: %s", src_filename.c_str());
args["FILE"] = src_filename;
upload_error(error_message, "CorruptResourceFile", filename, args);
- return;
+ return LLUUID();
}
if (2 == tokens_read)
@@ -663,7 +745,7 @@ void upload_new_resource(const std::string& src_filename, std::string name,
error_message = llformat("unknown linden resource file version in file: %s", src_filename.c_str());
args["FILE"] = src_filename;
upload_error(error_message, "UnknownResourceFileVersion", filename, args);
- return;
+ return LLUUID();
}
}
else
@@ -705,7 +787,7 @@ void upload_new_resource(const std::string& src_filename, std::string name,
error_message = llformat( "Unable to create output file: %s", filename.c_str());
args["FILE"] = filename;
upload_error(error_message, "UnableToCreateOutputFile", filename, args);
- return;
+ return LLUUID();
}
fclose(in);
@@ -719,7 +801,7 @@ void upload_new_resource(const std::string& src_filename, std::string name,
{
error_message = llformat("We do not currently support bulk upload of animation files\n");
upload_error(error_message, "DoNotSupportBulkAnimationUpload", filename, args);
- return;
+ return LLUUID();
}
else
{
@@ -765,9 +847,21 @@ void upload_new_resource(const std::string& src_filename, std::string name,
{
t_disp_name = src_filename;
}
- upload_new_resource(tid, asset_type, name, desc, compression_info, // tid
- destination_folder_type, inv_type, next_owner_perms, group_perms, everyone_perms,
- display_name, callback, expected_upload_cost, userdata);
+ upload_new_resource(
+ tid,
+ asset_type,
+ name,
+ desc,
+ compression_info, // tid
+ destination_folder_type,
+ inv_type,
+ next_owner_perms,
+ group_perms,
+ everyone_perms,
+ display_name,
+ callback,
+ expected_upload_cost,
+ userdata);
}
else
{
@@ -781,9 +875,15 @@ void upload_new_resource(const std::string& src_filename, std::string name,
}
LLFilePicker::instance().reset();
}
+
+ return uuid;
}
-void upload_done_callback(const LLUUID& uuid, void* user_data, S32 result, LLExtStat ext_status) // StoreAssetData callback (fixed)
+void upload_done_callback(
+ const LLUUID& uuid,
+ void* user_data,
+ S32 result,
+ LLExtStat ext_status) // StoreAssetData callback (fixed)
{
LLResourceData* data = (LLResourceData*)user_data;
S32 expected_upload_cost = data ? data->mExpectedUploadCost : 0;
@@ -888,35 +988,102 @@ void upload_done_callback(const LLUUID& uuid, void* user_data, S32 result, LLExt
std::string display_name = LLStringUtil::null;
LLAssetStorage::LLStoreAssetCallback callback = NULL;
void *userdata = NULL;
- upload_new_resource(next_file, asset_name, asset_name, // file
- 0, LLFolderType::FT_NONE, LLInventoryType::IT_NONE,
- PERM_NONE, PERM_NONE, PERM_NONE,
- display_name,
- callback,
- expected_upload_cost, // assuming next in a group of uploads is of roughly the same type, i.e. same upload cost
- userdata);
+ upload_new_resource(
+ next_file,
+ asset_name,
+ asset_name, // file
+ 0,
+ LLFolderType::FT_NONE,
+ LLInventoryType::IT_NONE,
+ PERM_NONE,
+ PERM_NONE,
+ PERM_NONE,
+ display_name,
+ callback,
+ expected_upload_cost, // assuming next in a group of uploads is of roughly the same type, i.e. same upload cost
+ userdata);
}
}
-void upload_new_resource(const LLTransactionID &tid, LLAssetType::EType asset_type,
- std::string name,
- std::string desc, S32 compression_info,
- LLFolderType::EType destination_folder_type,
- LLInventoryType::EType inv_type,
- U32 next_owner_perms,
- U32 group_perms,
- U32 everyone_perms,
- const std::string& display_name,
- LLAssetStorage::LLStoreAssetCallback callback,
- S32 expected_upload_cost,
- void *userdata)
+static LLAssetID upload_new_resource_prep(
+ const LLTransactionID& tid,
+ LLAssetType::EType asset_type,
+ LLInventoryType::EType& inventory_type,
+ std::string& name,
+ const std::string& display_name,
+ std::string& description)
+{
+ LLAssetID uuid = generate_asset_id_for_new_upload(tid);
+
+ increase_new_upload_stats(asset_type);
+
+ assign_defaults_and_show_upload_message(
+ asset_type,
+ inventory_type,
+ name,
+ display_name,
+ description);
+
+ return uuid;
+}
+
+LLSD generate_new_resource_upload_capability_body(
+ LLAssetType::EType asset_type,
+ const std::string& name,
+ const std::string& desc,
+ LLFolderType::EType destination_folder_type,
+ LLInventoryType::EType inv_type,
+ U32 next_owner_perms,
+ U32 group_perms,
+ U32 everyone_perms)
+{
+ LLSD body;
+
+ body["folder_id"] = gInventory.findCategoryUUIDForType(
+ (destination_folder_type == LLFolderType::FT_NONE) ?
+ (LLFolderType::EType) asset_type :
+ destination_folder_type);
+
+ body["asset_type"] = LLAssetType::lookup(asset_type);
+ body["inventory_type"] = LLInventoryType::lookup(inv_type);
+ body["name"] = name;
+ body["description"] = desc;
+ body["next_owner_mask"] = LLSD::Integer(next_owner_perms);
+ body["group_mask"] = LLSD::Integer(group_perms);
+ body["everyone_mask"] = LLSD::Integer(everyone_perms);
+
+ return body;
+}
+
+void upload_new_resource(
+ const LLTransactionID &tid,
+ LLAssetType::EType asset_type,
+ std::string name,
+ std::string desc,
+ S32 compression_info,
+ LLFolderType::EType destination_folder_type,
+ LLInventoryType::EType inv_type,
+ U32 next_owner_perms,
+ U32 group_perms,
+ U32 everyone_perms,
+ const std::string& display_name,
+ LLAssetStorage::LLStoreAssetCallback callback,
+ S32 expected_upload_cost,
+ void *userdata)
{
if(gDisconnected)
{
return ;
}
-
- LLAssetID uuid = tid.makeAssetID(gAgent.getSecureSessionID());
+
+ LLAssetID uuid =
+ upload_new_resource_prep(
+ tid,
+ asset_type,
+ inv_type,
+ name,
+ display_name,
+ desc);
if( LLAssetType::AT_SOUND == asset_type )
{
@@ -961,26 +1128,32 @@ void upload_new_resource(const LLTransactionID &tid, LLAssetType::EType asset_ty
llinfos << "Expected Upload Cost: " << expected_upload_cost << llendl;
lldebugs << "Folder: " << gInventory.findCategoryUUIDForType((destination_folder_type == LLFolderType::FT_NONE) ? LLFolderType::assetTypeToFolderType(asset_type) : destination_folder_type) << llendl;
lldebugs << "Asset Type: " << LLAssetType::lookup(asset_type) << llendl;
- std::string url = gAgent.getRegion()->getCapability("NewFileAgentInventory");
- if (!url.empty())
+
+ std::string url = gAgent.getRegion()->getCapability(
+ "NewFileAgentInventory");
+
+ if ( !url.empty() )
{
llinfos << "New Agent Inventory via capability" << llendl;
- LLSD body;
- body["folder_id"] = gInventory.findCategoryUUIDForType((destination_folder_type == LLFolderType::FT_NONE) ? LLFolderType::assetTypeToFolderType(asset_type) : destination_folder_type);
- body["asset_type"] = LLAssetType::lookup(asset_type);
- body["inventory_type"] = LLInventoryType::lookup(inv_type);
- body["name"] = name;
- body["description"] = desc;
- body["next_owner_mask"] = LLSD::Integer(next_owner_perms);
- body["group_mask"] = LLSD::Integer(group_perms);
- body["everyone_mask"] = LLSD::Integer(everyone_perms);
- body["expected_upload_cost"] = LLSD::Integer(expected_upload_cost);
-
- //std::ostringstream llsdxml;
- //LLSDSerialize::toPrettyXML(body, llsdxml);
- //llinfos << "posting body to capability: " << llsdxml.str() << llendl;
- LLHTTPClient::post(url, body, new LLNewAgentInventoryResponder(body, uuid, asset_type));
+ LLSD body;
+ body = generate_new_resource_upload_capability_body(
+ asset_type,
+ name,
+ desc,
+ destination_folder_type,
+ inv_type,
+ next_owner_perms,
+ group_perms,
+ everyone_perms);
+
+ LLHTTPClient::post(
+ url,
+ body,
+ new LLNewAgentInventoryResponder(
+ body,
+ uuid,
+ asset_type));
}
else
{
@@ -994,10 +1167,10 @@ void upload_new_resource(const LLTransactionID &tid, LLAssetType::EType asset_ty
S32 balance = gStatusBar->getBalance();
if (balance < expected_upload_cost)
{
+ // insufficient funds, bail on this upload
LLStringUtil::format_map_t args;
args["NAME"] = name;
args["AMOUNT"] = llformat("%d", expected_upload_cost);
- // insufficient funds, bail on this upload
LLBuyCurrencyHTML::openCurrencyFloater( LLTrans::getString("UploadingCosts", args), expected_upload_cost );
return;
}
@@ -1021,18 +1194,157 @@ void upload_new_resource(const LLTransactionID &tid, LLAssetType::EType asset_ty
{
asset_callback = callback;
}
- gAssetStorage->storeAssetData(data->mAssetInfo.mTransactionID, data->mAssetInfo.mType,
- asset_callback,
- (void*)data,
- FALSE);
+ gAssetStorage->storeAssetData(
+ data->mAssetInfo.mTransactionID,
+ data->mAssetInfo.mType,
+ asset_callback,
+ (void*)data,
+ FALSE);
+ }
+}
+
+BOOL upload_new_variable_price_resource(
+ const LLTransactionID &tid,
+ LLAssetType::EType asset_type,
+ std::string name,
+ std::string desc,
+ LLFolderType::EType destination_folder_type,
+ LLInventoryType::EType inv_type,
+ U32 next_owner_perms,
+ U32 group_perms,
+ U32 everyone_perms,
+ const std::string& display_name,
+ const LLSD& asset_resources)
+{
+ LLAssetID uuid =
+ upload_new_resource_prep(
+ tid,
+ asset_type,
+ inv_type,
+ name,
+ display_name,
+ desc);
+
+ llinfos << "*** Uploading: " << llendl;
+ llinfos << "Type: " << LLAssetType::lookup(asset_type) << llendl;
+ llinfos << "UUID: " << uuid << llendl;
+ llinfos << "Name: " << name << llendl;
+ llinfos << "Desc: " << desc << llendl;
+ lldebugs << "Folder: "
+ << gInventory.findCategoryUUIDForType((destination_folder_type == LLFolderType::FT_NONE) ? (LLFolderType::EType)asset_type : destination_folder_type) << llendl;
+ lldebugs << "Asset Type: " << LLAssetType::lookup(asset_type) << llendl;
+
+ std::string url = gAgent.getRegion()->getCapability(
+ "NewFileAgentInventoryVariablePrice");
+
+ if ( !url.empty() )
+ {
+ lldebugs
+ << "New Agent Inventory variable price upload" << llendl;
+
+ // Each of the two capabilities has similar data, so
+ // let's reuse that code
+
+ LLSD body;
+
+ body = generate_new_resource_upload_capability_body(
+ asset_type,
+ name,
+ desc,
+ destination_folder_type,
+ inv_type,
+ next_owner_perms,
+ group_perms,
+ everyone_perms);
+
+ body["asset_resources"] = asset_resources;
+
+ LLHTTPClient::post(
+ url,
+ body,
+ new LLNewAgentInventoryVariablePriceResponder(
+ uuid,
+ asset_type,
+ body));
+
+ return TRUE;
+ }
+ else
+ {
+ return FALSE;
+ }
+}
+
+LLAssetID generate_asset_id_for_new_upload(const LLTransactionID& tid)
+{
+ if ( gDisconnected )
+ {
+ LLAssetID rv;
+
+ rv.setNull();
+ return rv;
+ }
+
+ LLAssetID uuid = tid.makeAssetID(gAgent.getSecureSessionID());
+
+ return uuid;
+}
+
+void increase_new_upload_stats(LLAssetType::EType asset_type)
+{
+ if ( LLAssetType::AT_SOUND == asset_type )
+ {
+ LLViewerStats::getInstance()->incStat(
+ LLViewerStats::ST_UPLOAD_SOUND_COUNT );
+ }
+ else if ( LLAssetType::AT_TEXTURE == asset_type )
+ {
+ LLViewerStats::getInstance()->incStat(
+ LLViewerStats::ST_UPLOAD_TEXTURE_COUNT );
+ }
+ else if ( LLAssetType::AT_ANIMATION == asset_type )
+ {
+ LLViewerStats::getInstance()->incStat(
+ LLViewerStats::ST_UPLOAD_ANIM_COUNT );
}
}
+void assign_defaults_and_show_upload_message(
+ LLAssetType::EType asset_type,
+ LLInventoryType::EType& inventory_type,
+ std::string& name,
+ const std::string& display_name,
+ std::string& description)
+{
+ if ( LLInventoryType::IT_NONE == inventory_type )
+ {
+ inventory_type = LLInventoryType::defaultForAssetType(asset_type);
+ }
+ LLStringUtil::stripNonprintable(name);
+ LLStringUtil::stripNonprintable(description);
+
+ if ( name.empty() )
+ {
+ name = "(No Name)";
+ }
+ if ( description.empty() )
+ {
+ description = "(No Description)";
+ }
+
+ // At this point, we're ready for the upload.
+ std::string upload_message = "Uploading...\n\n";
+ upload_message.append(display_name);
+ LLUploadDialog::modalUploadDialog(upload_message);
+}
+
+
void init_menu_file()
{
view_listener_t::addCommit(new LLFileUploadImage(), "File.UploadImage");
view_listener_t::addCommit(new LLFileUploadSound(), "File.UploadSound");
view_listener_t::addCommit(new LLFileUploadAnim(), "File.UploadAnim");
+ view_listener_t::addCommit(new LLFileUploadModel(), "File.UploadModel");
view_listener_t::addCommit(new LLFileUploadBulk(), "File.UploadBulk");
view_listener_t::addCommit(new LLFileCloseWindow(), "File.CloseWindow");
view_listener_t::addCommit(new LLFileCloseAllWindows(), "File.CloseAllWindows");
@@ -1042,6 +1354,9 @@ void init_menu_file()
view_listener_t::addCommit(new LLFileQuit(), "File.Quit");
view_listener_t::addEnable(new LLFileEnableUpload(), "File.EnableUpload");
-
+ view_listener_t::addEnable(new LLFileEnableUploadModel(), "File.EnableUploadModel");
+ view_listener_t::addMenu(new LLMeshEnabled(), "File.MeshEnabled");
+ view_listener_t::addMenu(new LLMeshUploadVisible(), "File.VisibleUploadModel");
+
// "File.SaveTexture" moved to llpanelmaininventory so that it can be properly handled.
}
diff --git a/indra/newview/llviewermenufile.h b/indra/newview/llviewermenufile.h
index 56b9e19049..1597821504 100644
--- a/indra/newview/llviewermenufile.h
+++ b/indra/newview/llviewermenufile.h
@@ -30,39 +30,118 @@
#include "llfoldertype.h"
#include "llassetstorage.h"
#include "llinventorytype.h"
+#include "llfilepicker.h"
class LLTransactionID;
void init_menu_file();
-void upload_new_resource(const std::string& src_filename,
- std::string name,
- std::string desc,
- S32 compression_info,
- LLFolderType::EType destination_folder_type,
- LLInventoryType::EType inv_type,
- U32 next_owner_perms,
- U32 group_perms,
- U32 everyone_perms,
- const std::string& display_name,
- LLAssetStorage::LLStoreAssetCallback callback,
- S32 expected_upload_cost,
- void *userdata);
-
-void upload_new_resource(const LLTransactionID &tid,
- LLAssetType::EType type,
- std::string name,
- std::string desc,
- S32 compression_info,
- LLFolderType::EType destination_folder_type,
- LLInventoryType::EType inv_type,
- U32 next_owner_perms,
- U32 group_perms,
- U32 everyone_perms,
- const std::string& display_name,
- LLAssetStorage::LLStoreAssetCallback callback,
- S32 expected_upload_cost,
- void *userdata);
+LLUUID upload_new_resource(
+ const std::string& src_filename,
+ std::string name,
+ std::string desc,
+ S32 compression_info,
+ LLFolderType::EType destination_folder_type,
+ LLInventoryType::EType inv_type,
+ U32 next_owner_perms,
+ U32 group_perms,
+ U32 everyone_perms,
+ const std::string& display_name,
+ LLAssetStorage::LLStoreAssetCallback callback,
+ S32 expected_upload_cost,
+ void *userdata);
+
+void upload_new_resource(
+ const LLTransactionID &tid,
+ LLAssetType::EType type,
+ std::string name,
+ std::string desc,
+ S32 compression_info,
+ LLFolderType::EType destination_folder_type,
+ LLInventoryType::EType inv_type,
+ U32 next_owner_perms,
+ U32 group_perms,
+ U32 everyone_perms,
+ const std::string& display_name,
+ LLAssetStorage::LLStoreAssetCallback callback,
+ S32 expected_upload_cost,
+ void *userdata);
+
+// TODO* : Move all uploads to use this new function
+// since at some point, that upload path will be deprecated and no longer
+// used
+
+// We make a new function here to ensure that previous code is not broken
+BOOL upload_new_variable_price_resource(
+ const LLTransactionID& tid,
+ LLAssetType::EType type,
+ std::string name,
+ std::string desc,
+ LLFolderType::EType destination_folder_type,
+ LLInventoryType::EType inv_type,
+ U32 next_owner_perms,
+ U32 group_perms,
+ U32 everyone_perms,
+ const std::string& display_name,
+ const LLSD& asset_resources);
+
+LLAssetID generate_asset_id_for_new_upload(const LLTransactionID& tid);
+void increase_new_upload_stats(LLAssetType::EType asset_type);
+void assign_defaults_and_show_upload_message(
+ LLAssetType::EType asset_type,
+ LLInventoryType::EType& inventory_type,
+ std::string& name,
+ const std::string& display_name,
+ std::string& description);
+
+LLSD generate_new_resource_upload_capability_body(
+ LLAssetType::EType asset_type,
+ const std::string& name,
+ const std::string& desc,
+ LLFolderType::EType destination_folder_type,
+ LLInventoryType::EType inv_type,
+ U32 next_owner_perms,
+ U32 group_perms,
+ U32 everyone_perms);
+
+void on_new_single_inventory_upload_complete(
+ LLAssetType::EType asset_type,
+ LLInventoryType::EType inventory_type,
+ const std::string inventory_type_string,
+ const LLUUID& item_folder_id,
+ const std::string& item_name,
+ const std::string& item_description,
+ const LLSD& server_response,
+ S32 upload_price);
+
+class LLFilePickerThread : public LLThread
+{ //multi-threaded file picker (runs system specific file picker in background and calls "notify" from main thread)
+public:
+
+ static std::queue<LLFilePickerThread*> sDeadQ;
+ static LLMutex* sMutex;
+
+ static void initClass();
+ static void cleanupClass();
+ static void clearDead();
+
+ std::string mFile;
+
+ LLFilePicker::ELoadFilter mFilter;
+
+ LLFilePickerThread(LLFilePicker::ELoadFilter filter)
+ : LLThread("file picker"), mFilter(filter)
+ {
+
+ }
+
+ void getFile();
+
+ virtual void run();
+
+ virtual void notify(const std::string& filename) = 0;
+};
+
#endif
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 9641a0901c..01a5cb18db 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -122,6 +122,7 @@
//
const F32 BIRD_AUDIBLE_RADIUS = 32.0f;
const F32 SIT_DISTANCE_FROM_TARGET = 0.25f;
+const F32 CAMERA_POSITION_THRESHOLD_SQUARED = 0.001f * 0.001f;
static const F32 LOGOUT_REPLY_TIME = 3.f; // Wait this long after LogoutReply before quitting.
// Determine how quickly residents' scripts can issue question dialogs
@@ -343,6 +344,11 @@ void process_layer_data(LLMessageSystem *mesgsys, void **user_data)
{
LLViewerRegion *regionp = LLWorld::getInstance()->getRegion(mesgsys->getSender());
+ if(!regionp)
+ {
+ llwarns << "Invalid region for layer data." << llendl;
+ return;
+ }
S32 size;
S8 type;
@@ -2207,7 +2213,9 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
name = clean_name_from_im(name, dialog);
BOOL is_busy = gAgent.getBusy();
- BOOL is_muted = LLMuteList::getInstance()->isMuted(from_id, name, LLMute::flagTextChat);
+ BOOL is_muted = LLMuteList::getInstance()->isMuted(from_id, name, LLMute::flagTextChat)
+ // object IMs contain sender object id in session_id (STORM-1209)
+ || dialog == IM_FROM_TASK && LLMuteList::getInstance()->isMuted(session_id);
BOOL is_linden = LLMuteList::getInstance()->isLinden(name);
BOOL is_owned_by_me = FALSE;
BOOL is_friend = (LLAvatarTracker::instance().getBuddyInfo(from_id) == NULL) ? false : true;
@@ -2595,6 +2603,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;
}
@@ -2794,7 +2805,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
{
LLVector3 pos, look_at;
U64 region_handle;
- U8 region_access = SIM_ACCESS_MIN;
+ U8 region_access;
std::string region_info = ll_safe_string((char*)binary_bucket, binary_bucket_size);
std::string region_access_str = LLStringUtil::null;
std::string region_access_icn = LLStringUtil::null;
@@ -3202,7 +3213,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);
@@ -3251,18 +3261,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:
@@ -3270,13 +3281,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;
}
@@ -4325,6 +4332,9 @@ void process_sound_trigger(LLMessageSystem *msg, void **)
{
return;
}
+
+ // Don't play sounds from gestures if they are not enabled.
+ if (!gSavedSettings.getBOOL("EnableGestureSounds")) return;
gAudiop->triggerSound(sound_id, owner_id, gain, LLAudioEngine::AUDIO_TYPE_SFX, pos_global);
}
@@ -4745,7 +4755,7 @@ void process_avatar_sit_response(LLMessageSystem *mesgsys, void **user_data)
BOOL force_mouselook;
mesgsys->getBOOLFast(_PREHASH_SitTransform, _PREHASH_ForceMouselook, force_mouselook);
- if (isAgentAvatarValid() && dist_vec_squared(camera_eye, camera_at) > 0.0001f)
+ if (isAgentAvatarValid() && dist_vec_squared(camera_eye, camera_at) > CAMERA_POSITION_THRESHOLD_SQUARED)
{
gAgentCamera.setSitCamera(sitObjectID, camera_eye, camera_at);
}
@@ -5365,6 +5375,12 @@ 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;
+ }
+
std::string llsdRaw;
LLSD llsdBlock;
msgsystem->getStringFast(_PREHASH_AlertInfo, _PREHASH_Message, notificationID);
@@ -5521,10 +5537,19 @@ void process_alert_core(const std::string& message, BOOL modal)
}
else
{
- LLSD args;
- std::string new_msg =LLNotifications::instance().getGlobalString(message);
- args["MESSAGE"] = new_msg;
- LLNotificationsUtil::add("SystemMessageTip", args);
+ // Hack fix for EXP-623 (blame fix on RN :)) to avoid a sim deploy
+ const std::string AUTOPILOT_CANCELED_MSG("Autopilot canceled");
+ if (message.find(AUTOPILOT_CANCELED_MSG) == std::string::npos )
+ {
+ LLSD args;
+ std::string new_msg =LLNotifications::instance().getGlobalString(message);
+
+ std::string localized_msg;
+ bool is_message_localized = LLTrans::findString(localized_msg, new_msg);
+
+ args["MESSAGE"] = is_message_localized ? localized_msg : new_msg;
+ LLNotificationsUtil::add("SystemMessageTip", args);
+ }
}
}
@@ -6463,7 +6488,14 @@ void process_script_dialog(LLMessageSystem* msg, void**)
LLUUID object_id;
msg->getUUID("Data", "ObjectID", object_id);
- if (LLMuteList::getInstance()->isMuted(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))
{
return;
}
diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp
index e8828e63a9..e7878d8adf 100644
--- a/indra/newview/llviewerobject.cpp
+++ b/indra/newview/llviewerobject.cpp
@@ -47,6 +47,7 @@
#include "llprimitive.h"
#include "llquantize.h"
#include "llregionhandle.h"
+#include "llsdserialize.h"
#include "lltree_common.h"
#include "llxfermanager.h"
#include "message.h"
@@ -62,6 +63,7 @@
#include "lldrawable.h"
#include "llface.h"
#include "llfloaterproperties.h"
+#include "llfloatertools.h"
#include "llfollowcam.h"
#include "llhudtext.h"
#include "llselectmgr.h"
@@ -100,6 +102,7 @@
#include "lltrans.h"
#include "llsdutil.h"
#include "llmediaentry.h"
+#include "llaccountingquota.h"
//#define DEBUG_UPDATE_TYPE
@@ -202,6 +205,11 @@ LLViewerObject::LLViewerObject(const LLUUID &id, const LLPCode pcode, LLViewerRe
mGLName(0),
mbCanSelect(TRUE),
mFlags(0),
+ mPhysicsShapeType(0),
+ mPhysicsGravity(0),
+ mPhysicsFriction(0),
+ mPhysicsDensity(0),
+ mPhysicsRestitution(0),
mDrawable(),
mCreateSelected(FALSE),
mRenderMedia(FALSE),
@@ -233,6 +241,12 @@ LLViewerObject::LLViewerObject(const LLUUID &id, const LLPCode pcode, LLViewerRe
mState(0),
mMedia(NULL),
mClickAction(0),
+ mObjectCost(0),
+ mLinksetCost(0),
+ mPhysicsCost(0),
+ mLinksetPhysicsCost(0.f),
+ mCostStale(true),
+ mPhysicsShapeUnknown(true),
mAttachmentItemID(LLUUID::null),
mLastUpdateType(OUT_UNKNOWN),
mLastUpdateCached(FALSE)
@@ -845,6 +859,13 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
#ifdef DEBUG_UPDATE_TYPE
llinfos << "Full:" << getID() << llendl;
#endif
+ //clear cost and linkset cost
+ mCostStale = true;
+ if (isSelected())
+ {
+ gFloaterTools->dirty();
+ }
+
LLUUID audio_uuid;
LLUUID owner_id; // only valid if audio_uuid or particle system is not null
F32 gain;
@@ -1410,6 +1431,13 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
#ifdef DEBUG_UPDATE_TYPE
llinfos << "CompFull:" << getID() << llendl;
#endif
+ mCostStale = true;
+
+ if (isSelected())
+ {
+ gFloaterTools->dirty();
+ }
+
dp->unpackU32(crc, "CRC");
mTotalCRC = crc;
dp->unpackU8(material, "Material");
@@ -3014,21 +3042,126 @@ void LLViewerObject::setScale(const LLVector3 &scale, BOOL damped)
}
}
-void LLViewerObject::updateSpatialExtents(LLVector3& newMin, LLVector3 &newMax)
+void LLViewerObject::setObjectCost(F32 cost)
+{
+ mObjectCost = cost;
+ mCostStale = false;
+
+ if (isSelected())
+ {
+ gFloaterTools->dirty();
+ }
+}
+
+void LLViewerObject::setLinksetCost(F32 cost)
+{
+ mLinksetCost = cost;
+ mCostStale = false;
+
+ if (isSelected())
+ {
+ gFloaterTools->dirty();
+ }
+}
+
+void LLViewerObject::setPhysicsCost(F32 cost)
+{
+ mPhysicsCost = cost;
+ mCostStale = false;
+
+ if (isSelected())
+ {
+ gFloaterTools->dirty();
+ }
+}
+
+void LLViewerObject::setLinksetPhysicsCost(F32 cost)
+{
+ mLinksetPhysicsCost = cost;
+ mCostStale = false;
+
+ if (isSelected())
+ {
+ gFloaterTools->dirty();
+ }
+}
+
+
+F32 LLViewerObject::getObjectCost()
+{
+ if (mCostStale)
+ {
+ gObjectList.updateObjectCost(this);
+ }
+
+ return mObjectCost;
+}
+
+F32 LLViewerObject::getLinksetCost()
+{
+ if (mCostStale)
+ {
+ gObjectList.updateObjectCost(this);
+ }
+
+ return mLinksetCost;
+}
+
+F32 LLViewerObject::getPhysicsCost()
+{
+ if (mCostStale)
+ {
+ gObjectList.updateObjectCost(this);
+ }
+
+ return mPhysicsCost;
+}
+
+F32 LLViewerObject::getLinksetPhysicsCost()
+{
+ if (mCostStale)
+ {
+ gObjectList.updateObjectCost(this);
+ }
+
+ return mLinksetPhysicsCost;
+}
+
+F32 LLViewerObject::getStreamingCost(S32* bytes, S32* visible_bytes)
+{
+ return 0.f;
+}
+
+U32 LLViewerObject::getTriangleCount()
{
- LLVector3 center = getRenderPosition();
- LLVector3 size = getScale();
- newMin.setVec(center-size);
- newMax.setVec(center+size);
- mDrawable->setPositionGroup((newMin + newMax) * 0.5f);
+ return 0;
+}
+
+U32 LLViewerObject::getHighLODTriangleCount()
+{
+ return 0;
+}
+
+void LLViewerObject::updateSpatialExtents(LLVector4a& newMin, LLVector4a &newMax)
+{
+ LLVector4a center;
+ center.load3(getRenderPosition().mV);
+ LLVector4a size;
+ size.load3(getScale().mV);
+ newMin.setSub(center, size);
+ newMax.setAdd(center, size);
+
+ mDrawable->setPositionGroup(center);
}
F32 LLViewerObject::getBinRadius()
{
if (mDrawable.notNull())
{
- const LLVector3* ext = mDrawable->getSpatialExtents();
- return (ext[1]-ext[0]).magVec();
+ const LLVector4a* ext = mDrawable->getSpatialExtents();
+ LLVector4a diff;
+ diff.setSub(ext[1], ext[0]);
+ return diff.getLength3().getF32();
}
return getScale().magVec();
@@ -3094,7 +3227,7 @@ void LLViewerObject::boostTexturePriority(BOOL boost_children /* = TRUE */)
getTEImage(i)->setBoostLevel(LLViewerTexture::BOOST_SELECTED);
}
- if (isSculpted())
+ if (isSculpted() && !isMesh())
{
LLSculptParams *sculpt_params = (LLSculptParams *)getParameterEntry(LLNetworkData::PARAMS_SCULPT);
LLUUID sculpt_id = sculpt_params->getSculptTexture();
@@ -3334,6 +3467,15 @@ const LLVector3 LLViewerObject::getPositionEdit() const
const LLVector3 LLViewerObject::getRenderPosition() const
{
+ if (mDrawable.notNull() && mDrawable->isState(LLDrawable::RIGGED))
+ {
+ LLVOAvatar* avatar = getAvatar();
+ if (avatar)
+ {
+ return avatar->getPositionAgent();
+ }
+ }
+
if (mDrawable.isNull() || mDrawable->getGeneration() < 0)
{
return getPositionAgent();
@@ -3352,6 +3494,11 @@ const LLVector3 LLViewerObject::getPivotPositionAgent() const
const LLQuaternion LLViewerObject::getRenderRotation() const
{
LLQuaternion ret;
+ if (mDrawable.notNull() && mDrawable->isState(LLDrawable::RIGGED))
+ {
+ return ret;
+ }
+
if (mDrawable.isNull() || mDrawable->isStatic())
{
ret = getRotationEdit();
@@ -3620,12 +3767,21 @@ BOOL LLViewerObject::lineSegmentBoundingBox(const LLVector3& start, const LLVect
return FALSE;
}
- const LLVector3* ext = mDrawable->getSpatialExtents();
+ const LLVector4a* ext = mDrawable->getSpatialExtents();
- LLVector3 center = (ext[1]+ext[0])*0.5f;
- LLVector3 size = (ext[1]-ext[0])*0.5f;
+ //VECTORIZE THIS
+ LLVector4a center;
+ center.setAdd(ext[1], ext[0]);
+ center.mul(0.5f);
+ LLVector4a size;
+ size.setSub(ext[1], ext[0]);
+ size.mul(0.5f);
- return LLLineSegmentBoxIntersect(start, end, center, size);
+ LLVector4a starta, enda;
+ starta.load3(start.mV);
+ enda.load3(end.mV);
+
+ return LLLineSegmentBoxIntersect(starta, enda, center, size);
}
U8 LLViewerObject::getMediaType() const
@@ -5127,7 +5283,7 @@ bool LLViewerObject::specialHoverCursor() const
|| (mClickAction != 0);
}
-void LLViewerObject::updateFlags()
+void LLViewerObject::updateFlags(BOOL physics_changed)
{
LLViewerRegion* regionp = getRegion();
if(!regionp) return;
@@ -5140,6 +5296,15 @@ void LLViewerObject::updateFlags()
gMessageSystem->addBOOL("IsTemporary", flagTemporaryOnRez() );
gMessageSystem->addBOOL("IsPhantom", flagPhantom() );
gMessageSystem->addBOOL("CastsShadows", flagCastShadows() );
+ 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() );
}
@@ -5172,6 +5337,44 @@ BOOL LLViewerObject::setFlags(U32 flags, BOOL state)
return setit;
}
+void LLViewerObject::setPhysicsShapeType(U8 type)
+{
+ mPhysicsShapeUnknown = false;
+ mPhysicsShapeType = type;
+ mCostStale = true;
+}
+
+void LLViewerObject::setPhysicsGravity(F32 gravity)
+{
+ mPhysicsGravity = gravity;
+}
+
+void LLViewerObject::setPhysicsFriction(F32 friction)
+{
+ mPhysicsFriction = friction;
+}
+
+void LLViewerObject::setPhysicsDensity(F32 density)
+{
+ mPhysicsDensity = density;
+}
+
+void LLViewerObject::setPhysicsRestitution(F32 restitution)
+{
+ mPhysicsRestitution = restitution;
+}
+
+U8 LLViewerObject::getPhysicsShapeType() const
+{
+ if (mPhysicsShapeUnknown)
+ {
+ mPhysicsShapeUnknown = false;
+ gObjectList.updatePhysicsFlags(this);
+ }
+
+ return mPhysicsShapeType;
+}
+
void LLViewerObject::applyAngularVelocity(F32 dt)
{
//do target omega here
@@ -5428,3 +5631,82 @@ const LLUUID &LLViewerObject::extractAttachmentItemID()
setAttachmentItemID(item_id);
return getAttachmentItemID();
}
+
+//virtual
+LLVOAvatar* LLViewerObject::getAvatar() const
+{
+ if (isAttachment())
+ {
+ LLViewerObject* vobj = (LLViewerObject*) getParent();
+
+ while (vobj && !vobj->asAvatar())
+ {
+ vobj = (LLViewerObject*) vobj->getParent();
+ }
+
+ return (LLVOAvatar*) vobj;
+ }
+
+ return NULL;
+}
+
+
+class ObjectPhysicsProperties : public LLHTTPNode
+{
+public:
+ virtual void post(
+ ResponsePtr responder,
+ const LLSD& context,
+ const LLSD& input) const
+ {
+ LLSD object_data = input["body"]["ObjectData"];
+ S32 num_entries = object_data.size();
+
+ for ( S32 i = 0; i < num_entries; i++ )
+ {
+ LLSD& curr_object_data = object_data[i];
+ U32 local_id = curr_object_data["LocalID"].asInteger();
+
+ // Iterate through nodes at end, since it can be on both the regular AND hover list
+ struct f : public LLSelectedNodeFunctor
+ {
+ U32 mID;
+ f(const U32& id) : mID(id) {}
+ virtual bool apply(LLSelectNode* node)
+ {
+ return (node->getObject() && node->getObject()->mLocalID == mID );
+ }
+ } func(local_id);
+
+ LLSelectNode* node = LLSelectMgr::getInstance()->getSelection()->getFirstNode(&func);
+
+ if (node)
+ {
+ // The LLSD message builder doesn't know how to handle U8, so we need to send as S8 and cast
+ U8 type = (U8)curr_object_data["PhysicsShapeType"].asInteger();
+ F32 density = (F32)curr_object_data["Density"].asReal();
+ F32 friction = (F32)curr_object_data["Friction"].asReal();
+ F32 restitution = (F32)curr_object_data["Restitution"].asReal();
+ F32 gravity = (F32)curr_object_data["GravityMultiplier"].asReal();
+
+ node->getObject()->setPhysicsShapeType(type);
+ node->getObject()->setPhysicsGravity(gravity);
+ node->getObject()->setPhysicsFriction(friction);
+ node->getObject()->setPhysicsDensity(density);
+ node->getObject()->setPhysicsRestitution(restitution);
+ }
+ }
+
+ dialog_refresh_all();
+ };
+};
+
+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 7afb7f464b..a0ad52df6b 100644
--- a/indra/newview/llviewerobject.h
+++ b/indra/newview/llviewerobject.h
@@ -43,6 +43,7 @@
#include "v3dmath.h"
#include "v3math.h"
#include "llvertexbuffer.h"
+#include "llaccountingquota.h"
class LLAgent; // TODO: Get rid of this.
class LLAudioSource;
@@ -176,6 +177,7 @@ public:
void setOnActiveList(BOOL on_active) { mOnActiveList = on_active; }
virtual BOOL isAttachment() const { return FALSE; }
+ virtual LLVOAvatar* getAvatar() const; //get the avatar this object is attached to, or NULL if object is not an attachment
virtual BOOL isHUDAttachment() const { return FALSE; }
virtual void updateRadius() {};
virtual F32 getVObjRadius() const; // default implemenation is mDrawable->getRadius()
@@ -224,6 +226,7 @@ public:
virtual BOOL isFlexible() const { return FALSE; }
virtual BOOL isSculpted() const { return FALSE; }
+ virtual BOOL isMesh() const { return FALSE; }
virtual BOOL hasLightTexture() const { return FALSE; }
// This method returns true if the object is over land owned by
@@ -324,6 +327,22 @@ public:
virtual void setScale(const LLVector3 &scale, BOOL damped = FALSE);
+ virtual F32 getStreamingCost(S32* bytes = NULL, S32* visible_bytes = NULL);
+ virtual U32 getTriangleCount();
+ virtual U32 getHighLODTriangleCount();
+
+ void setObjectCost(F32 cost);
+ F32 getObjectCost();
+
+ void setLinksetCost(F32 cost);
+ F32 getLinksetCost();
+
+ void setPhysicsCost(F32 cost);
+ F32 getPhysicsCost();
+
+ void setLinksetPhysicsCost(F32 cost);
+ F32 getLinksetPhysicsCost();
+
void sendShapeUpdate();
U8 getState() { return mState; }
@@ -363,7 +382,7 @@ public:
void markForUpdate(BOOL priority);
void updateVolume(const LLVolumeParams& volume_params);
- virtual void updateSpatialExtents(LLVector3& min, LLVector3& max);
+ virtual void updateSpatialExtents(LLVector4a& min, LLVector4a& max);
virtual F32 getBinRadius();
LLBBox getBoundingBoxAgent() const;
@@ -376,7 +395,7 @@ public:
void clearDrawableState(U32 state, BOOL recursive = TRUE);
// Called when the drawable shifts
- virtual void onShift(const LLVector3 &shift_vector) { }
+ virtual void onShift(const LLVector4a &shift_vector) { }
//////////////////////////////////////
//
@@ -451,6 +470,12 @@ public:
inline BOOL flagCameraDecoupled() const { return ((mFlags & FLAGS_CAMERA_DECOUPLED) != 0); }
inline BOOL flagObjectMove() const { return ((mFlags & FLAGS_OBJECT_MOVE) != 0); }
+ U8 getPhysicsShapeType() const;
+ inline F32 getPhysicsGravity() const { return mPhysicsGravity; }
+ inline F32 getPhysicsFriction() const { return mPhysicsFriction; }
+ inline F32 getPhysicsDensity() const { return mPhysicsDensity; }
+ inline F32 getPhysicsRestitution() const { return mPhysicsRestitution; }
+
bool getIncludeInSearch() const;
void setIncludeInSearch(bool include_in_search);
@@ -464,8 +489,13 @@ 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);
+ void setPhysicsFriction(F32 friction);
+ void setPhysicsDensity(F32 density);
+ void setPhysicsRestitution(F32 restitution);
virtual void dump() const;
static U32 getNumZombieObjects() { return sNumZombieObjects; }
@@ -530,6 +560,13 @@ public:
LL_VO_HUD_PART_GROUP = LL_PCODE_APP | 0xc0,
} EVOType;
+ typedef enum e_physics_shape_types
+ {
+ PHYSICS_SHAPE_PRIM = 0,
+ PHYSICS_SHAPE_NONE,
+ PHYSICS_SHAPE_CONVEX_HULL,
+ } EPhysicsShapeType;
+
LLUUID mID;
// unique within region, not unique across regions
@@ -548,6 +585,14 @@ public:
// Grabbed from UPDATE_FLAGS
U32 mFlags;
+ // Sent to sim in UPDATE_FLAGS, received in ObjectPhysicsProperties
+ U8 mPhysicsShapeType;
+ F32 mPhysicsGravity;
+ F32 mPhysicsFriction;
+ F32 mPhysicsDensity;
+ F32 mPhysicsRestitution;
+
+
// Pipeline classes
LLPointer<LLDrawable> mDrawable;
@@ -599,7 +644,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
@@ -656,6 +705,15 @@ protected:
U8 mState; // legacy
LLViewerObjectMedia* mMedia; // NULL if no media associated
U8 mClickAction;
+ F32 mObjectCost; //resource cost of this object or -1 if unknown
+ F32 mLinksetCost;
+ F32 mPhysicsCost;
+ F32 mLinksetPhysicsCost;
+
+ SelectionQuota mSelectionQuota;
+
+ bool mCostStale;
+ mutable bool mPhysicsShapeUnknown;
static U32 sNumZombieObjects; // Objects which are dead, but not deleted
diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp
index da95bacc41..007b3416f1 100644
--- a/indra/newview/llviewerobjectlist.cpp
+++ b/indra/newview/llviewerobjectlist.cpp
@@ -54,6 +54,7 @@
#include "llviewercamera.h"
#include "llselectmgr.h"
#include "llresmgr.h"
+#include "llsdutil.h"
#include "llviewerregion.h"
#include "llviewerstats.h"
#include "llviewerstatsrecorder.h"
@@ -692,6 +693,189 @@ void LLViewerObjectList::updateApparentAngles(LLAgent &agent)
LLVOAvatar::cullAvatarsByPixelArea();
}
+class LLObjectCostResponder : public LLCurl::Responder
+{
+public:
+ LLObjectCostResponder(const LLSD& object_ids)
+ : mObjectIDs(object_ids)
+ {
+ }
+
+ // Clear's the global object list's pending
+ // request list for all objects requested
+ void clear_object_list_pending_requests()
+ {
+ // TODO*: No more hard coding
+ for (
+ LLSD::array_iterator iter = mObjectIDs.beginArray();
+ iter != mObjectIDs.endArray();
+ ++iter)
+ {
+ gObjectList.onObjectCostFetchFailure(iter->asUUID());
+ }
+ }
+
+ void error(U32 statusNum, const std::string& reason)
+ {
+ llwarns
+ << "Transport error requesting object cost "
+ << "HTTP status: " << statusNum << ", reason: "
+ << reason << "." << llendl;
+
+ // TODO*: Error message to user
+ // For now just clear the request from the pending list
+ clear_object_list_pending_requests();
+ }
+
+ void result(const LLSD& content)
+ {
+ if ( !content.isMap() || content.has("error") )
+ {
+ // Improper response or the request had an error,
+ // show an error to the user?
+ llwarns
+ << "Application level error when fetching object "
+ << "cost. Message: " << content["error"]["message"].asString()
+ << ", identifier: " << content["error"]["identifier"].asString()
+ << llendl;
+
+ // TODO*: Adaptively adjust request size if the
+ // service says we've requested too many and retry
+
+ // TODO*: Error message if not retrying
+ clear_object_list_pending_requests();
+ return;
+ }
+
+ // Success, grab the resource cost and linked set costs
+ // for an object if one was returned
+ for (
+ LLSD::array_iterator iter = mObjectIDs.beginArray();
+ iter != mObjectIDs.endArray();
+ ++iter)
+ {
+ LLUUID object_id = iter->asUUID();
+
+ // Check to see if the request contains data for the object
+ if ( content.has(iter->asString()) )
+ {
+ F32 link_cost =
+ content[iter->asString()]["linked_set_resource_cost"].asReal();
+ F32 object_cost =
+ content[iter->asString()]["resource_cost"].asReal();
+
+ F32 physics_cost = content[iter->asString()]["physics_cost"].asReal();
+ F32 link_physics_cost = content[iter->asString()]["linked_set_physics_cost"].asReal();
+
+ gObjectList.updateObjectCost(object_id, object_cost, link_cost, physics_cost, link_physics_cost);
+ }
+ else
+ {
+ // TODO*: Give user feedback about the missing data?
+ gObjectList.onObjectCostFetchFailure(object_id);
+ }
+ }
+ }
+
+private:
+ LLSD mObjectIDs;
+};
+
+
+class LLPhysicsFlagsResponder : public LLCurl::Responder
+{
+public:
+ LLPhysicsFlagsResponder(const LLSD& object_ids)
+ : mObjectIDs(object_ids)
+ {
+ }
+
+ // Clear's the global object list's pending
+ // request list for all objects requested
+ void clear_object_list_pending_requests()
+ {
+ // TODO*: No more hard coding
+ for (
+ LLSD::array_iterator iter = mObjectIDs.beginArray();
+ iter != mObjectIDs.endArray();
+ ++iter)
+ {
+ gObjectList.onPhysicsFlagsFetchFailure(iter->asUUID());
+ }
+ }
+
+ void error(U32 statusNum, const std::string& reason)
+ {
+ llwarns
+ << "Transport error requesting object physics flags "
+ << "HTTP status: " << statusNum << ", reason: "
+ << reason << "." << llendl;
+
+ // TODO*: Error message to user
+ // For now just clear the request from the pending list
+ clear_object_list_pending_requests();
+ }
+
+ void result(const LLSD& content)
+ {
+ if ( !content.isMap() || content.has("error") )
+ {
+ // Improper response or the request had an error,
+ // show an error to the user?
+ llwarns
+ << "Application level error when fetching object "
+ << "physics flags. Message: " << content["error"]["message"].asString()
+ << ", identifier: " << content["error"]["identifier"].asString()
+ << llendl;
+
+ // TODO*: Adaptively adjust request size if the
+ // service says we've requested too many and retry
+
+ // TODO*: Error message if not retrying
+ clear_object_list_pending_requests();
+ return;
+ }
+
+ // Success, grab the resource cost and linked set costs
+ // for an object if one was returned
+ for (
+ LLSD::array_iterator iter = mObjectIDs.beginArray();
+ iter != mObjectIDs.endArray();
+ ++iter)
+ {
+ LLUUID object_id = iter->asUUID();
+
+ // Check to see if the request contains data for the object
+ if ( content.has(iter->asString()) )
+ {
+ const LLSD& data = content[iter->asString()];
+
+ S32 shape_type = data["PhysicsShapeType"].asInteger();
+
+ gObjectList.updatePhysicsShapeType(object_id, shape_type);
+
+ if (data.has("Density"))
+ {
+ F32 density = data["Density"].asReal();
+ F32 friction = data["Friction"].asReal();
+ F32 restitution = data["Restitution"].asReal();
+ F32 gravity_multiplier = data["GravityMultiplier"].asReal();
+
+ gObjectList.updatePhysicsProperties(object_id,
+ density, friction, restitution, gravity_multiplier);
+ }
+ }
+ else
+ {
+ // TODO*: Give user feedback about the missing data?
+ gObjectList.onPhysicsFlagsFetchFailure(object_id);
+ }
+ }
+ }
+
+private:
+ LLSD mObjectIDs;
+};
void LLViewerObjectList::update(LLAgent &agent, LLWorld &world)
{
@@ -804,6 +988,9 @@ void LLViewerObjectList::update(LLAgent &agent, LLWorld &world)
}
}
+ fetchObjectCosts();
+ fetchPhysicsFlags();
+
mNumSizeCulled = 0;
mNumVisCulled = 0;
@@ -869,6 +1056,119 @@ void LLViewerObjectList::update(LLAgent &agent, LLWorld &world)
LLViewerStats::getInstance()->mNumVisCulledStat.addValue(mNumVisCulled);
}
+void LLViewerObjectList::fetchObjectCosts()
+{
+ // issue http request for stale object physics costs
+ if (!mStaleObjectCost.empty())
+ {
+ LLViewerRegion* regionp = gAgent.getRegion();
+
+ if (regionp)
+ {
+ std::string url = regionp->getCapability("GetObjectCost");
+
+ if (!url.empty())
+ {
+ LLSD id_list;
+ U32 object_index = 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.
+ if ( mPendingObjectCost.find(*iter) ==
+ mPendingObjectCost.end() )
+ {
+ mPendingObjectCost.insert(*iter);
+ id_list[object_index++] = *iter;
+ }
+ }
+
+ // id_list should now contain all
+ // requests in mStaleObjectCost before, so clear
+ // it now
+ mStaleObjectCost.clear();
+
+ if ( id_list.size() > 0 )
+ {
+ LLSD post_data = LLSD::emptyMap();
+
+ post_data["object_ids"] = id_list;
+ LLHTTPClient::post(
+ url,
+ post_data,
+ new LLObjectCostResponder(id_list));
+ }
+ }
+ else
+ {
+ mStaleObjectCost.clear();
+ mPendingObjectCost.clear();
+ }
+ }
+ }
+}
+
+void LLViewerObjectList::fetchPhysicsFlags()
+{
+ // issue http request for stale object physics flags
+ if (!mStalePhysicsFlags.empty())
+ {
+ LLViewerRegion* regionp = gAgent.getRegion();
+
+ if (regionp)
+ {
+ std::string url = regionp->getCapability("GetObjectPhysicsData");
+
+ if (!url.empty())
+ {
+ LLSD id_list;
+ U32 object_index = 0;
+
+ for (
+ std::set<LLUUID>::iterator iter = mStalePhysicsFlags.begin();
+ iter != mStalePhysicsFlags.end();
+ ++iter)
+ {
+ // Check to see if a request for this object
+ // has already been made.
+ if ( mPendingPhysicsFlags.find(*iter) ==
+ mPendingPhysicsFlags.end() )
+ {
+ mPendingPhysicsFlags.insert(*iter);
+ id_list[object_index++] = *iter;
+ }
+ }
+
+ // id_list should now contain all
+ // requests in mStalePhysicsFlags before, so clear
+ // it now
+ mStalePhysicsFlags.clear();
+
+ if ( id_list.size() > 0 )
+ {
+ LLSD post_data = LLSD::emptyMap();
+
+ post_data["object_ids"] = id_list;
+ LLHTTPClient::post(
+ url,
+ post_data,
+ new LLPhysicsFlagsResponder(id_list));
+ }
+ }
+ else
+ {
+ mStalePhysicsFlags.clear();
+ mPendingPhysicsFlags.clear();
+ }
+ }
+ }
+}
+
+
void LLViewerObjectList::clearDebugText()
{
for (vobj_list_t::iterator iter = mObjects.begin(); iter != mObjects.end(); ++iter)
@@ -923,8 +1223,12 @@ void LLViewerObjectList::cleanupReferences(LLViewerObject *objectp)
mNumDeadObjects++;
}
+static LLFastTimer::DeclareTimer FTM_REMOVE_DRAWABLE("Remove Drawable");
+
void LLViewerObjectList::removeDrawable(LLDrawable* drawablep)
{
+ LLFastTimer t(FTM_REMOVE_DRAWABLE);
+
if (!drawablep)
{
return;
@@ -1089,7 +1393,78 @@ void LLViewerObjectList::updateActive(LLViewerObject *objectp)
}
}
+void LLViewerObjectList::updateObjectCost(LLViewerObject* object)
+{
+ mStaleObjectCost.insert(object->getID());
+}
+
+void LLViewerObjectList::updateObjectCost(const LLUUID& object_id, F32 object_cost, F32 link_cost, F32 physics_cost, F32 link_physics_cost)
+{
+ mPendingObjectCost.erase(object_id);
+
+ LLViewerObject* object = findObject(object_id);
+ if (object)
+ {
+ object->setObjectCost(object_cost);
+ object->setLinksetCost(link_cost);
+ object->setPhysicsCost(physics_cost);
+ object->setLinksetPhysicsCost(link_physics_cost);
+ }
+}
+
+void LLViewerObjectList::onObjectCostFetchFailure(const LLUUID& object_id)
+{
+ //llwarns << "Failed to fetch object cost for object: " << object_id << llendl;
+ mPendingObjectCost.erase(object_id);
+}
+
+void LLViewerObjectList::updateQuotaCost( 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());
+}
+
+void LLViewerObjectList::updatePhysicsShapeType(const LLUUID& object_id, S32 type)
+{
+ mPendingPhysicsFlags.erase(object_id);
+ LLViewerObject* object = findObject(object_id);
+ if (object)
+ {
+ object->setPhysicsShapeType(type);
+ }
+}
+
+void LLViewerObjectList::updatePhysicsProperties(const LLUUID& object_id,
+ F32 density,
+ F32 friction,
+ F32 restitution,
+ F32 gravity_multiplier)
+{
+ mPendingPhysicsFlags.erase(object_id);
+ LLViewerObject* object = findObject(object_id);
+ if (object)
+ {
+ object->setPhysicsDensity(density);
+ object->setPhysicsFriction(friction);
+ object->setPhysicsGravity(gravity_multiplier);
+ object->setPhysicsRestitution(restitution);
+ }
+}
+
+void LLViewerObjectList::onPhysicsFlagsFetchFailure(const LLUUID& object_id)
+{
+ //llwarns << "Failed to fetch physics flags for object: " << object_id << llendl;
+ mPendingPhysicsFlags.erase(object_id);
+}
void LLViewerObjectList::shiftObjects(const LLVector3 &offset)
{
diff --git a/indra/newview/llviewerobjectlist.h b/indra/newview/llviewerobjectlist.h
index 22a7f97c38..8e211eaf73 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;
@@ -85,6 +86,24 @@ public:
void updateApparentAngles(LLAgent &agent);
void update(LLAgent &agent, LLWorld &world);
+ void fetchObjectCosts();
+ void fetchPhysicsFlags();
+
+ void updateObjectCost(LLViewerObject* object);
+ void updateObjectCost(const LLUUID& object_id, F32 object_cost, F32 link_cost, F32 physics_cost, F32 link_physics_cost);
+ void onObjectCostFetchFailure(const LLUUID& object_id);
+
+ void updatePhysicsFlags(const LLViewerObject* object);
+ void onPhysicsFlagsFetchFailure(const LLUUID& object_id);
+ void updatePhysicsShapeType(const LLUUID& object_id, S32 type);
+ void updatePhysicsProperties(const LLUUID& object_id,
+ F32 density,
+ F32 friction,
+ F32 restitution,
+ F32 gravity_multiplier);
+
+ void updateQuotaCost( const LLUUID& objectId, const SelectionQuota& costs );
+
void shiftObjects(const LLVector3 &offset);
bool hasMapObjectInRegion(LLViewerRegion* regionp) ;
@@ -186,6 +205,14 @@ protected:
std::map<LLUUID, LLPointer<LLViewerObject> > mUUIDObjectMap;
+ //set of objects that need to update their cost
+ std::set<LLUUID> mStaleObjectCost;
+ std::set<LLUUID> mPendingObjectCost;
+
+ //set of objects that need to update their physics flags
+ std::set<LLUUID> mStalePhysicsFlags;
+ std::set<LLUUID> mPendingPhysicsFlags;
+
std::vector<LLDebugBeacon> mDebugBeacons;
S32 mCurLazyUpdateIndex;
diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp
index e84e4a859a..8db72da1ee 100644
--- a/indra/newview/llviewerparcelmgr.cpp
+++ b/indra/newview/llviewerparcelmgr.cpp
@@ -42,6 +42,7 @@
// Viewer includes
#include "llagent.h"
+#include "llagentaccess.h"
#include "llviewerwindow.h"
#include "llviewercontrol.h"
//#include "llfirstuse.h"
@@ -54,6 +55,7 @@
#include "llresmgr.h"
#include "llsdutil.h"
#include "llsdutil_math.h"
+#include "llslurl.h"
#include "llstatusbar.h"
#include "llui.h"
#include "llviewertexture.h"
@@ -2200,7 +2202,10 @@ bool LLViewerParcelMgr::canAgentBuyParcel(LLParcel* parcel, bool forGroup) const
= parcelOwner == (forGroup ? gAgent.getGroupID() : gAgent.getID());
bool isAuthorized
- = (authorizeBuyer.isNull() || (gAgent.getID() == authorizeBuyer));
+ = (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 d07e06f6a7..26765bdd01 100644
--- a/indra/newview/llviewerparceloverlay.cpp
+++ b/indra/newview/llviewerparceloverlay.cpp
@@ -833,7 +833,7 @@ S32 LLViewerParcelOverlay::renderPropertyLines ()
U8* colorp;
bool render_hidden = LLSelectMgr::sRenderHiddenSelections && LLFloaterReg::instanceVisible("build");
- const F32 PROPERTY_LINE_CLIP_DIST = 256.f;
+ const F32 PROPERTY_LINE_CLIP_DIST_SQUARED = 256.f * 256.f;
for (i = 0; i < mVertexCount; i += vertex_per_edge)
{
@@ -844,7 +844,7 @@ S32 LLViewerParcelOverlay::renderPropertyLines ()
vertex.mV[VY] = *(vertexp+1);
vertex.mV[VZ] = *(vertexp+2);
- if (dist_vec_squared2D(vertex, camera_region) > PROPERTY_LINE_CLIP_DIST*PROPERTY_LINE_CLIP_DIST)
+ if (dist_vec_squared2D(vertex, camera_region) > PROPERTY_LINE_CLIP_DIST_SQUARED)
{
continue;
}
diff --git a/indra/newview/llviewerpartsim.cpp b/indra/newview/llviewerpartsim.cpp
index 4fee85e45c..6b3e04348a 100644
--- a/indra/newview/llviewerpartsim.cpp
+++ b/indra/newview/llviewerpartsim.cpp
@@ -155,8 +155,8 @@ LLViewerPartGroup::LLViewerPartGroup(const LLVector3 &center_agent, const F32 bo
if (group != NULL)
{
- LLVector3 center(group->mOctreeNode->getCenter());
- LLVector3 size(group->mOctreeNode->getSize());
+ LLVector3 center(group->mOctreeNode->getCenter().getF32ptr());
+ LLVector3 size(group->mOctreeNode->getSize().getF32ptr());
size += LLVector3(0.01f, 0.01f, 0.01f);
mMinObjPos = center - size;
mMaxObjPos = center + size;
diff --git a/indra/newview/llviewerprecompiledheaders.h b/indra/newview/llviewerprecompiledheaders.h
index ab07adce5d..faa86d43dd 100644
--- a/indra/newview/llviewerprecompiledheaders.h
+++ b/indra/newview/llviewerprecompiledheaders.h
@@ -99,8 +99,6 @@
#include "llcoord.h"
#include "llcoordframe.h"
#include "llcrc.h"
-#include "llinterp.h"
-#include "llperlin.h"
#include "llplane.h"
#include "llquantize.h"
#include "llrand.h"
@@ -109,7 +107,6 @@
#include "m3math.h"
#include "m4math.h"
#include "llquaternion.h"
-#include "raytrace.h"
#include "v2math.h"
#include "v3color.h"
#include "v3dmath.h"
@@ -117,7 +114,6 @@
#include "v4color.h"
#include "v4coloru.h"
#include "v4math.h"
-////#include "vmath.h"
#include "xform.h"
// Library includes from llvfs
@@ -126,7 +122,4 @@
// Library includes from llmessage project
#include "llcachename.h"
-// llxuixml
-#include "llinitparam.h"
-
#endif
diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp
index c53fdc3393..590c82856d 100644
--- a/indra/newview/llviewerregion.cpp
+++ b/indra/newview/llviewerregion.cpp
@@ -46,6 +46,7 @@
#include "llagentcamera.h"
#include "llcallingcard.h"
#include "llcaphttpsender.h"
+#include "llcapabilitylistener.h"
#include "llcommandhandler.h"
#include "lldir.h"
#include "lleventpoll.h"
@@ -76,6 +77,71 @@
const F32 WATER_TEXTURE_SCALE = 8.f; // Number of times to repeat the water texture across a region
const S16 MAX_MAP_DIST = 10;
+typedef std::map<std::string, std::string> CapabilityMap;
+
+class LLViewerRegionImpl {
+public:
+ LLViewerRegionImpl(LLViewerRegion * region, LLHost const & host)
+ : mHost(host),
+ mCompositionp(NULL),
+ mEventPoll(NULL),
+ // 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
+ // setRegionNameAndZone() replace the instance. Would that pose
+ // consistency problems? Can we even request a capability before calling
+ // setRegionNameAndZone()?
+ // For testability -- the new Michael Feathers paradigm --
+ // LLCapabilityListener binds all the globals it expects to need at
+ // construction time.
+ mCapabilityListener(host.getString(), gMessageSystem, *region,
+ gAgent.getID(), gAgent.getSessionID())
+ {
+ }
+
+ // The surfaces and other layers
+ LLSurface* mLandp;
+
+ // Region geometry data
+ LLVector3d mOriginGlobal; // Location of southwest corner of region (meters)
+ LLVector3d mCenterGlobal; // Location of center in world space (meters)
+ LLHost mHost;
+
+ // The unique ID for this region.
+ LLUUID mRegionID;
+
+ // region/estate owner - usually null.
+ LLUUID mOwnerID;
+
+ // Network statistics for the region's circuit...
+ LLTimer mLastNetUpdate;
+
+ // Misc
+ LLVLComposition *mCompositionp; // Composition layer for the surface
+
+ LLVOCacheEntry::vocache_entry_map_t mCacheMap;
+ // time?
+ // LRU info?
+
+ // Cache ID is unique per-region, across renames, moving locations,
+ // etc.
+ LLUUID mCacheID;
+
+ CapabilityMap mCapabilities;
+
+ LLEventPoll* mEventPoll;
+
+ /// 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)
+ LLCapabilityListener mCapabilityListener;
+
+ //spatial partitions for objects in this region
+ std::vector<LLSpatialPartition*> mObjectPartition;
+
+ LLHTTPClient::ResponderPtr mHttpResponderPtr ;
+};
+
// support for secondlife:///app/region/{REGION} SLapps
// N.B. this is defined to work exactly like the classic secondlife://{REGION}
// However, the later syntax cannot support spaces in the region name because
@@ -191,15 +257,12 @@ LLViewerRegion::LLViewerRegion(const U64 &handle,
const U32 grids_per_region_edge,
const U32 grids_per_patch_edge,
const F32 region_width_meters)
-: mCenterGlobal(),
+: mImpl(new LLViewerRegionImpl(this, host)),
mHandle(handle),
- mHost( host ),
mTimeDilation(1.0f),
mName(""),
mZoning(""),
- mOwnerID(),
mIsEstateManager(FALSE),
- mCompositionp(NULL),
mRegionFlags( REGION_FLAGS_DEFAULT ),
mSimAccess( SIM_ACCESS_MIN ),
mBillableFactor(1.0),
@@ -212,37 +275,27 @@ LLViewerRegion::LLViewerRegion(const U64 &handle,
mHttpUrl(""),
mCacheLoaded(FALSE),
mCacheDirty(FALSE),
- mCacheID(),
- mEventPoll(NULL),
mReleaseNotesRequested(FALSE),
- // 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
- // setRegionNameAndZone() replace the instance. Would that pose
- // consistency problems? Can we even request a capability before calling
- // setRegionNameAndZone()?
- // For testability -- the new Michael Feathers paradigm --
- // LLCapabilityListener binds all the globals it expects to need at
- // construction time.
- mCapabilityListener(host.getString(), gMessageSystem, *this,
- gAgent.getID(), gAgent.getSessionID()),
mCapabilitiesReceived(false)
{
mWidth = region_width_meters;
- mOriginGlobal = from_region_handle(handle);
+ mImpl->mOriginGlobal = from_region_handle(handle);
updateRenderMatrix();
- mLandp = new LLSurface('l', NULL);
+ mImpl->mLandp = new LLSurface('l', NULL);
// Create the composition layer for the surface
- mCompositionp = new LLVLComposition(mLandp, grids_per_region_edge, region_width_meters/grids_per_region_edge);
- mCompositionp->setSurface(mLandp);
+ mImpl->mCompositionp =
+ new LLVLComposition(mImpl->mLandp,
+ grids_per_region_edge,
+ region_width_meters / grids_per_region_edge);
+ mImpl->mCompositionp->setSurface(mImpl->mLandp);
// Create the surfaces
- mLandp->setRegion(this);
- mLandp->create(grids_per_region_edge,
+ mImpl->mLandp->setRegion(this);
+ mImpl->mLandp->create(grids_per_region_edge,
grids_per_patch_edge,
- mOriginGlobal,
+ mImpl->mOriginGlobal,
mWidth);
mParcelOverlay = new LLViewerParcelOverlay(this, region_width_meters);
@@ -255,24 +308,24 @@ LLViewerRegion::LLViewerRegion(const U64 &handle,
//create object partitions
//MUST MATCH declaration of eObjectPartitions
- mObjectPartition.push_back(new LLHUDPartition()); //PARTITION_HUD
- mObjectPartition.push_back(new LLTerrainPartition()); //PARTITION_TERRAIN
- mObjectPartition.push_back(new LLVoidWaterPartition()); //PARTITION_VOIDWATER
- mObjectPartition.push_back(new LLWaterPartition()); //PARTITION_WATER
- mObjectPartition.push_back(new LLTreePartition()); //PARTITION_TREE
- mObjectPartition.push_back(new LLParticlePartition()); //PARTITION_PARTICLE
- mObjectPartition.push_back(new LLCloudPartition()); //PARTITION_CLOUD
- mObjectPartition.push_back(new LLGrassPartition()); //PARTITION_GRASS
- mObjectPartition.push_back(new LLVolumePartition()); //PARTITION_VOLUME
- mObjectPartition.push_back(new LLBridgePartition()); //PARTITION_BRIDGE
- mObjectPartition.push_back(new LLHUDParticlePartition());//PARTITION_HUD_PARTICLE
- mObjectPartition.push_back(NULL); //PARTITION_NONE
+ mImpl->mObjectPartition.push_back(new LLHUDPartition()); //PARTITION_HUD
+ mImpl->mObjectPartition.push_back(new LLTerrainPartition()); //PARTITION_TERRAIN
+ mImpl->mObjectPartition.push_back(new LLVoidWaterPartition()); //PARTITION_VOIDWATER
+ 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
+ mImpl->mObjectPartition.push_back(new LLHUDParticlePartition());//PARTITION_HUD_PARTICLE
+ mImpl->mObjectPartition.push_back(NULL); //PARTITION_NONE
}
void LLViewerRegion::initStats()
{
- mLastNetUpdate.reset();
+ mImpl->mLastNetUpdate.reset();
mPacketsIn = 0;
mBitsIn = 0;
mLastBitsIn = 0;
@@ -287,9 +340,9 @@ void LLViewerRegion::initStats()
LLViewerRegion::~LLViewerRegion()
{
- if(mHttpResponderPtr)
+ if(mImpl->mHttpResponderPtr)
{
- (static_cast<BaseCapabilitiesComplete*>(mHttpResponderPtr.get()))->setRegion(NULL) ;
+ (static_cast<BaseCapabilitiesComplete*>(mImpl->mHttpResponderPtr.get()))->setRegion(NULL) ;
}
gVLManager.cleanupData(this);
@@ -301,21 +354,44 @@ LLViewerRegion::~LLViewerRegion()
gObjectList.killObjects(this);
- delete mCompositionp;
+ delete mImpl->mCompositionp;
delete mParcelOverlay;
- delete mLandp;
- delete mEventPoll;
- LLHTTPSender::clearSender(mHost);
+ delete mImpl->mLandp;
+ delete mImpl->mEventPoll;
+ LLHTTPSender::clearSender(mImpl->mHost);
saveObjectCache();
- std::for_each(mObjectPartition.begin(), mObjectPartition.end(), DeletePointer());
+ std::for_each(mImpl->mObjectPartition.begin(), mImpl->mObjectPartition.end(), DeletePointer());
+
+ delete mImpl;
+ mImpl = NULL;
+}
+
+LLEventPump& LLViewerRegion::getCapAPI() const
+{
+ return mImpl->mCapabilityListener.getCapAPI();
}
/*virtual*/
const LLHost& LLViewerRegion::getHost() const
{
- return mHost;
+ return mImpl->mHost;
+}
+
+LLSurface & LLViewerRegion::getLand() const
+{
+ return *mImpl->mLandp;
+}
+
+const LLUUID& LLViewerRegion::getRegionID() const
+{
+ return mImpl->mRegionID;
+}
+
+void LLViewerRegion::setRegionID(const LLUUID& region_id)
+{
+ mImpl->mRegionID = region_id;
}
void LLViewerRegion::loadObjectCache()
@@ -330,7 +406,7 @@ void LLViewerRegion::loadObjectCache()
if(LLVOCache::hasInstance())
{
- LLVOCache::getInstance()->readFromCache(mHandle, mCacheID, mCacheMap) ;
+ LLVOCache::getInstance()->readFromCache(mHandle, mImpl->mCacheID, mImpl->mCacheMap) ;
}
}
@@ -342,32 +418,32 @@ void LLViewerRegion::saveObjectCache()
return;
}
- if (mCacheMap.empty())
+ if (mImpl->mCacheMap.empty())
{
return;
}
if(LLVOCache::hasInstance())
{
- LLVOCache::getInstance()->writeToCache(mHandle, mCacheID, mCacheMap, mCacheDirty) ;
+ LLVOCache::getInstance()->writeToCache(mHandle, mImpl->mCacheID, mImpl->mCacheMap, mCacheDirty) ;
mCacheDirty = FALSE;
}
- for(LLVOCacheEntry::vocache_entry_map_t::iterator iter = mCacheMap.begin(); iter != mCacheMap.end(); ++iter)
+ for(LLVOCacheEntry::vocache_entry_map_t::iterator iter = mImpl->mCacheMap.begin(); iter != mImpl->mCacheMap.end(); ++iter)
{
delete iter->second;
}
- mCacheMap.clear();
+ mImpl->mCacheMap.clear();
}
void LLViewerRegion::sendMessage()
{
- gMessageSystem->sendMessage(mHost);
+ gMessageSystem->sendMessage(mImpl->mHost);
}
void LLViewerRegion::sendReliableMessage()
{
- gMessageSystem->sendReliable(mHost);
+ gMessageSystem->sendReliable(mImpl->mHost);
}
void LLViewerRegion::setFlags(BOOL b, U32 flags)
@@ -384,12 +460,12 @@ void LLViewerRegion::setFlags(BOOL b, U32 flags)
void LLViewerRegion::setWaterHeight(F32 water_level)
{
- mLandp->setWaterHeight(water_level);
+ mImpl->mLandp->setWaterHeight(water_level);
}
F32 LLViewerRegion::getWaterHeight() const
{
- return mLandp->getWaterHeight();
+ return mImpl->mLandp->getWaterHeight();
}
BOOL LLViewerRegion::isVoiceEnabled() const
@@ -405,9 +481,9 @@ void LLViewerRegion::setRegionFlags(U32 flags)
void LLViewerRegion::setOriginGlobal(const LLVector3d &origin_global)
{
- mOriginGlobal = origin_global;
+ mImpl->mOriginGlobal = origin_global;
updateRenderMatrix();
- mLandp->setOriginGlobal(origin_global);
+ mImpl->mLandp->setOriginGlobal(origin_global);
mWind.setOriginGlobal(origin_global);
mCloudLayer.setOriginGlobal(origin_global);
calculateCenterGlobal();
@@ -423,16 +499,34 @@ void LLViewerRegion::setTimeDilation(F32 time_dilation)
mTimeDilation = time_dilation;
}
+const LLVector3d & LLViewerRegion::getOriginGlobal() const
+{
+ return mImpl->mOriginGlobal;
+}
LLVector3 LLViewerRegion::getOriginAgent() const
{
- return gAgent.getPosAgentFromGlobal(mOriginGlobal);
+ return gAgent.getPosAgentFromGlobal(mImpl->mOriginGlobal);
}
+const LLVector3d & LLViewerRegion::getCenterGlobal() const
+{
+ return mImpl->mCenterGlobal;
+}
LLVector3 LLViewerRegion::getCenterAgent() const
{
- return gAgent.getPosAgentFromGlobal(mCenterGlobal);
+ return gAgent.getPosAgentFromGlobal(mImpl->mCenterGlobal);
+}
+
+void LLViewerRegion::setOwner(const LLUUID& owner_id)
+{
+ mImpl->mOwnerID = owner_id;
+}
+
+const LLUUID& LLViewerRegion::getOwner() const
+{
+ return mImpl->mOwnerID;
}
void LLViewerRegion::setRegionNameAndZone (const std::string& name_zone)
@@ -557,7 +651,10 @@ void LLViewerRegion::processRegionInfo(LLMessageSystem* msg, void**)
LLFloaterReporter::processRegionInfo(msg);
}
-
+void LLViewerRegion::setCacheID(const LLUUID& id)
+{
+ mImpl->mCacheID = id;
+}
S32 LLViewerRegion::renderPropertyLines()
{
@@ -585,7 +682,7 @@ BOOL LLViewerRegion::idleUpdate(F32 max_update_time)
{
LLMemType mt_ivr(LLMemType::MTYPE_IDLE_UPDATE_VIEWER_REGION);
// did_update returns TRUE if we did at least one significant update
- BOOL did_update = mLandp->idleUpdate(max_update_time);
+ BOOL did_update = mImpl->mLandp->idleUpdate(max_update_time);
if (mParcelOverlay)
{
@@ -600,7 +697,7 @@ BOOL LLViewerRegion::idleUpdate(F32 max_update_time)
// As above, but forcibly do the update.
void LLViewerRegion::forceUpdate()
{
- mLandp->idleUpdate(0.f);
+ mImpl->mLandp->idleUpdate(0.f);
if (mParcelOverlay)
{
@@ -610,17 +707,21 @@ void LLViewerRegion::forceUpdate()
void LLViewerRegion::connectNeighbor(LLViewerRegion *neighborp, U32 direction)
{
- mLandp->connectNeighbor(neighborp->mLandp, direction);
+ mImpl->mLandp->connectNeighbor(neighborp->mImpl->mLandp, direction);
mCloudLayer.connectNeighbor(&(neighborp->mCloudLayer), direction);
}
void LLViewerRegion::disconnectAllNeighbors()
{
- mLandp->disconnectAllNeighbors();
+ mImpl->mLandp->disconnectAllNeighbors();
mCloudLayer.disconnectAllNeighbors();
}
+LLVLComposition * LLViewerRegion::getComposition() const
+{
+ return mImpl->mCompositionp;
+}
F32 LLViewerRegion::getCompositionXY(const S32 x, const S32 y) const
{
@@ -714,10 +815,10 @@ F32 LLViewerRegion::getCompositionXY(const S32 x, const S32 y) const
void LLViewerRegion::calculateCenterGlobal()
{
- mCenterGlobal = mOriginGlobal;
- mCenterGlobal.mdV[VX] += 0.5 * mWidth;
- mCenterGlobal.mdV[VY] += 0.5 * mWidth;
- mCenterGlobal.mdV[VZ] = 0.5*mLandp->getMinZ() + mLandp->getMaxZ();
+ mImpl->mCenterGlobal = mImpl->mOriginGlobal;
+ mImpl->mCenterGlobal.mdV[VX] += 0.5 * mWidth;
+ mImpl->mCenterGlobal.mdV[VY] += 0.5 * mWidth;
+ mImpl->mCenterGlobal.mdV[VZ] = 0.5 * mImpl->mLandp->getMinZ() + mImpl->mLandp->getMaxZ();
}
void LLViewerRegion::calculateCameraDistance()
@@ -728,7 +829,7 @@ void LLViewerRegion::calculateCameraDistance()
std::ostream& operator<<(std::ostream &s, const LLViewerRegion &region)
{
s << "{ ";
- s << region.mHost;
+ s << region.mImpl->mHost;
s << " mOriginGlobal = " << region.getOriginGlobal()<< "\n";
std::string name(region.getName()), zone(region.getZoning());
if (! name.empty())
@@ -748,9 +849,9 @@ std::ostream& operator<<(std::ostream &s, const LLViewerRegion &region)
void LLViewerRegion::updateNetStats()
{
- F32 dt = mLastNetUpdate.getElapsedTimeAndResetF32();
+ F32 dt = mImpl->mLastNetUpdate.getElapsedTimeAndResetF32();
- LLCircuitData *cdp = gMessageSystem->mCircuitInfo.findCircuit(mHost);
+ LLCircuitData *cdp = gMessageSystem->mCircuitInfo.findCircuit(mImpl->mHost);
if (!cdp)
{
mAlive = false;
@@ -779,10 +880,10 @@ void LLViewerRegion::updateNetStats()
U32 LLViewerRegion::getPacketsLost() const
{
- LLCircuitData *cdp = gMessageSystem->mCircuitInfo.findCircuit(mHost);
+ LLCircuitData *cdp = gMessageSystem->mCircuitInfo.findCircuit(mImpl->mHost);
if (!cdp)
{
- llinfos << "LLViewerRegion::getPacketsLost couldn't find circuit for " << mHost << llendl;
+ llinfos << "LLViewerRegion::getPacketsLost couldn't find circuit for " << mImpl->mHost << llendl;
return 0;
}
else
@@ -791,6 +892,16 @@ U32 LLViewerRegion::getPacketsLost() const
}
}
+void LLViewerRegion::setHttpResponderPtrNULL()
+{
+ mImpl->mHttpResponderPtr = NULL;
+}
+
+const LLHTTPClient::ResponderPtr LLViewerRegion::getHttpResponderPtr() const
+{
+ return mImpl->mHttpResponderPtr;
+}
+
BOOL LLViewerRegion::pointInRegionGlobal(const LLVector3d &point_global) const
{
LLVector3 pos_region = getPosRegionFromGlobal(point_global);
@@ -817,7 +928,7 @@ BOOL LLViewerRegion::pointInRegionGlobal(const LLVector3d &point_global) const
LLVector3 LLViewerRegion::getPosRegionFromGlobal(const LLVector3d &point_global) const
{
LLVector3 pos_region;
- pos_region.setVec(point_global - mOriginGlobal);
+ pos_region.setVec(point_global - mImpl->mOriginGlobal);
return pos_region;
}
@@ -825,7 +936,7 @@ LLVector3d LLViewerRegion::getPosGlobalFromRegion(const LLVector3 &pos_region) c
{
LLVector3d pos_region_d;
pos_region_d.setVec(pos_region);
- return pos_region_d + mOriginGlobal;
+ return pos_region_d + mImpl->mOriginGlobal;
}
LLVector3 LLViewerRegion::getPosAgentFromRegion(const LLVector3 &pos_region) const
@@ -842,7 +953,7 @@ LLVector3 LLViewerRegion::getPosRegionFromAgent(const LLVector3 &pos_agent) cons
F32 LLViewerRegion::getLandHeightRegion(const LLVector3& region_pos)
{
- return mLandp->resolveHeightRegion( region_pos );
+ return mImpl->mLandp->resolveHeightRegion( region_pos );
}
bool LLViewerRegion::isAlive()
@@ -994,7 +1105,7 @@ void LLViewerRegion::updateCoarseLocations(LLMessageSystem* msg)
// treat the target specially for the map
if(i == target_index)
{
- LLVector3d global_pos(mOriginGlobal);
+ LLVector3d global_pos(mImpl->mOriginGlobal);
global_pos.mdV[VX] += (F64)(x_pos);
global_pos.mdV[VY] += (F64)(y_pos);
global_pos.mdV[VZ] += (F64)(z_pos) * 4.0;
@@ -1034,7 +1145,7 @@ LLViewerRegion::eCacheUpdateResult LLViewerRegion::cacheFullUpdate(LLViewerObjec
U32 local_id = objectp->getLocalID();
U32 crc = objectp->getCRC();
- LLVOCacheEntry* entry = get_if_there(mCacheMap, local_id, (LLVOCacheEntry*)NULL);
+ LLVOCacheEntry* entry = get_if_there(mImpl->mCacheMap, local_id, (LLVOCacheEntry*)NULL);
if (entry)
{
@@ -1047,10 +1158,10 @@ LLViewerRegion::eCacheUpdateResult LLViewerRegion::cacheFullUpdate(LLViewerObjec
}
// Update the cache entry
- mCacheMap.erase(local_id);
+ mImpl->mCacheMap.erase(local_id);
delete entry;
entry = new LLVOCacheEntry(local_id, crc, dp);
- mCacheMap[local_id] = entry;
+ mImpl->mCacheMap[local_id] = entry;
return CACHE_UPDATE_CHANGED;
}
@@ -1058,15 +1169,15 @@ LLViewerRegion::eCacheUpdateResult LLViewerRegion::cacheFullUpdate(LLViewerObjec
// Create new entry and add to map
eCacheUpdateResult result = CACHE_UPDATE_ADDED;
- if (mCacheMap.size() > MAX_OBJECT_CACHE_ENTRIES)
+ if (mImpl->mCacheMap.size() > MAX_OBJECT_CACHE_ENTRIES)
{
- mCacheMap.erase(mCacheMap.begin());
+ mImpl->mCacheMap.erase(mImpl->mCacheMap.begin());
result = CACHE_UPDATE_REPLACED;
}
entry = new LLVOCacheEntry(local_id, crc, dp);
- mCacheMap[local_id] = entry;
+ mImpl->mCacheMap[local_id] = entry;
return result;
}
@@ -1074,9 +1185,9 @@ LLViewerRegion::eCacheUpdateResult LLViewerRegion::cacheFullUpdate(LLViewerObjec
// AND the CRC matches. JC
LLDataPacker *LLViewerRegion::getDP(U32 local_id, U32 crc, U8 &cache_miss_type)
{
- llassert(mCacheLoaded);
+ //llassert(mCacheLoaded); This assert failes often, changing to early-out -- davep, 2010/10/18
- LLVOCacheEntry* entry = get_if_there(mCacheMap, local_id, (LLVOCacheEntry*)NULL);
+ LLVOCacheEntry* entry = get_if_there(mImpl->mCacheMap, local_id, (LLVOCacheEntry*)NULL);
if (entry)
{
@@ -1085,22 +1196,23 @@ LLDataPacker *LLViewerRegion::getDP(U32 local_id, U32 crc, U8 &cache_miss_type)
{
// Record a hit
entry->recordHit();
- cache_miss_type = CACHE_MISS_TYPE_NONE;
+ cache_miss_type = CACHE_MISS_TYPE_NONE;
return entry->getDP(crc);
}
else
{
// llinfos << "CRC miss for " << local_id << llendl;
- cache_miss_type = CACHE_MISS_TYPE_CRC;
+ cache_miss_type = CACHE_MISS_TYPE_CRC;
mCacheMissCRC.put(local_id);
}
}
else
{
// llinfos << "Cache miss for " << local_id << llendl;
- cache_miss_type = CACHE_MISS_TYPE_FULL;
+ cache_miss_type = CACHE_MISS_TYPE_FULL;
mCacheMissFull.put(local_id);
}
+
return NULL;
}
@@ -1203,7 +1315,7 @@ void LLViewerRegion::dumpCache()
}
LLVOCacheEntry *entry;
- for(LLVOCacheEntry::vocache_entry_map_t::iterator iter = mCacheMap.begin(); iter != mCacheMap.end(); ++iter)
+ for(LLVOCacheEntry::vocache_entry_map_t::iterator iter = mImpl->mCacheMap.begin(); iter != mImpl->mCacheMap.end(); ++iter)
{
entry = iter->second ;
@@ -1217,7 +1329,7 @@ void LLViewerRegion::dumpCache()
change_bin[changes]++;
}
- llinfos << "Count " << mCacheMap.size() << llendl;
+ llinfos << "Count " << mImpl->mCacheMap.size() << llendl;
for (i = 0; i < BINS; i++)
{
llinfos << "Hits " << i << " " << hit_bin[i] << llendl;
@@ -1360,10 +1472,10 @@ void LLViewerRegion::setSeedCapability(const std::string& url)
return;
}
- delete mEventPoll;
- mEventPoll = NULL;
+ delete mImpl->mEventPoll;
+ mImpl->mEventPoll = NULL;
- mCapabilities.clear();
+ mImpl->mCapabilities.clear();
setCapability("Seed", url);
LLSD capabilityNames = LLSD::emptyArray();
@@ -1388,12 +1500,17 @@ void LLViewerRegion::setSeedCapability(const std::string& url)
capabilityNames.append("GetDisplayNames");
capabilityNames.append("GetTexture");
+ capabilityNames.append("GetMesh");
+ capabilityNames.append("GetObjectCost");
+ capabilityNames.append("GetObjectPhysicsData");
capabilityNames.append("GroupProposalBallot");
capabilityNames.append("HomeLocation");
capabilityNames.append("LandResources");
capabilityNames.append("MapLayer");
capabilityNames.append("MapLayerGod");
capabilityNames.append("NewFileAgentInventory");
+ capabilityNames.append("NewFileAgentInventoryVariablePrice");
+ capabilityNames.append("ObjectAdd");
capabilityNames.append("ParcelPropertiesUpdate");
capabilityNames.append("ParcelMediaURLFilterList");
capabilityNames.append("ParcelNavigateMedia");
@@ -1408,6 +1525,8 @@ void LLViewerRegion::setSeedCapability(const std::string& url)
capabilityNames.append("SendUserReport");
capabilityNames.append("SendUserReportWithScreenshot");
capabilityNames.append("ServerReleaseNotes");
+ capabilityNames.append("SimConsole");
+ capabilityNames.append("SimulatorFeatures");
capabilityNames.append("SetDisplayName");
capabilityNames.append("SimConsoleAsync");
capabilityNames.append("StartGroupProposal");
@@ -1422,33 +1541,39 @@ 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.
llinfos << "posting to seed " << url << llendl;
- mHttpResponderPtr = BaseCapabilitiesComplete::build(this) ;
- LLHTTPClient::post(url, capabilityNames, mHttpResponderPtr);
+ mImpl->mHttpResponderPtr = BaseCapabilitiesComplete::build(this) ;
+ LLHTTPClient::post(url, capabilityNames, mImpl->mHttpResponderPtr);
}
void LLViewerRegion::setCapability(const std::string& name, const std::string& url)
{
if(name == "EventQueueGet")
{
- delete mEventPoll;
- mEventPoll = NULL;
- mEventPoll = new LLEventPoll(url, getHost());
+ delete mImpl->mEventPoll;
+ mImpl->mEventPoll = NULL;
+ mImpl->mEventPoll = new LLEventPoll(url, getHost());
}
else if(name == "UntrustedSimulatorMessage")
{
- LLHTTPSender::setSender(mHost, new LLCapHTTPSender(url));
+ LLHTTPSender::setSender(mImpl->mHost, new LLCapHTTPSender(url));
}
else
{
- mCapabilities[name] = url;
+ mImpl->mCapabilities[name] = url;
if(name == "GetTexture")
{
mHttpUrl = url ;
@@ -1463,11 +1588,12 @@ bool LLViewerRegion::isSpecialCapabilityName(const std::string &name)
std::string LLViewerRegion::getCapability(const std::string& name) const
{
- CapabilityMap::const_iterator iter = mCapabilities.find(name);
- if(iter == mCapabilities.end())
+ CapabilityMap::const_iterator iter = mImpl->mCapabilities.find(name);
+ if(iter == mImpl->mCapabilities.end())
{
return "";
}
+
return iter->second;
}
@@ -1485,7 +1611,7 @@ void LLViewerRegion::logActiveCapabilities() const
{
int count = 0;
CapabilityMap::const_iterator iter;
- for (iter = mCapabilities.begin(); iter != mCapabilities.end(); iter++, count++)
+ for (iter = mImpl->mCapabilities.begin(); iter != mImpl->mCapabilities.end(); ++iter, ++count)
{
if (!iter->second.empty())
{
@@ -1497,9 +1623,9 @@ void LLViewerRegion::logActiveCapabilities() const
LLSpatialPartition* LLViewerRegion::getSpatialPartition(U32 type)
{
- if (type < mObjectPartition.size())
+ if (type < mImpl->mObjectPartition.size())
{
- return mObjectPartition[type];
+ return mImpl->mObjectPartition[type];
}
return NULL;
}
@@ -1537,3 +1663,4 @@ std::string LLViewerRegion::getDescription() const
{
return stringize(*this);
}
+
diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h
index dd40b876cd..a6e5c47b86 100644
--- a/indra/newview/llviewerregion.h
+++ b/indra/newview/llviewerregion.h
@@ -33,20 +33,16 @@
#include "lldarray.h"
#include "llwind.h"
-#include "llbbox.h"
#include "llcloud.h"
#include "llstat.h"
#include "v3dmath.h"
-#include "llhost.h"
#include "llstring.h"
#include "llregionflags.h"
#include "lluuid.h"
-#include "lldatapacker.h"
-#include "llvocache.h"
#include "llweb.h"
#include "llcapabilityprovider.h"
-#include "llcapabilitylistener.h"
#include "m4math.h" // LLMatrix4
+#include "llhttpclient.h"
// Surface id's
#define LAND 1
@@ -65,6 +61,13 @@ class LLVOCache;
class LLVOCacheEntry;
class LLSpatialPartition;
class LLEventPump;
+class LLCapabilityListener;
+class LLDataPacker;
+class LLDataPackerBinaryBuffer;
+class LLHost;
+class LLBBox;
+
+class LLViewerRegionImpl;
class LLViewerRegion: public LLCapabilityProvider // implements this interface
{
@@ -159,19 +162,19 @@ public:
F32 getTimeDilation() const { return mTimeDilation; }
// Origin height is at zero.
- const LLVector3d &getOriginGlobal() const { return mOriginGlobal; }
+ const LLVector3d &getOriginGlobal() const;
LLVector3 getOriginAgent() const;
// Center is at the height of the water table.
- const LLVector3d &getCenterGlobal() const { return mCenterGlobal; }
+ const LLVector3d &getCenterGlobal() const;
LLVector3 getCenterAgent() const;
void setRegionNameAndZone(const std::string& name_and_zone);
const std::string& getName() const { return mName; }
const std::string& getZoning() const { return mZoning; }
- void setOwner(const LLUUID& owner_id) { mOwnerID = owner_id; }
- const LLUUID& getOwner() const { return mOwnerID; }
+ void setOwner(const LLUUID& owner_id);
+ const LLUUID& getOwner() const;
// Is the current agent on the estate manager list for this region?
void setIsEstateManager(BOOL b) { mIsEstateManager = b; }
@@ -206,7 +209,7 @@ public:
// can process the message.
static void processRegionInfo(LLMessageSystem* msg, void**);
- void setCacheID(const LLUUID& id) { mCacheID = id; }
+ void setCacheID(const LLUUID& id);
F32 getWidth() const { return mWidth; }
@@ -222,8 +225,8 @@ public:
U32 getPacketsLost() const;
- void setHttpResponderPtrNULL() {mHttpResponderPtr = NULL ;}
- const LLHTTPClient::ResponderPtr getHttpResponderPtr() const {return mHttpResponderPtr ;}
+ void setHttpResponderPtrNULL();
+ const LLHTTPClient::ResponderPtr getHttpResponderPtr() const;
// Get/set named capability URLs for this region.
void setSeedCapability(const std::string& url);
@@ -238,21 +241,19 @@ public:
static bool isSpecialCapabilityName(const std::string &name);
void logActiveCapabilities() const;
- /// Capability-request exception
- typedef LLCapabilityListener::ArgError ArgError;
/// Get LLEventPump on which we listen for capability requests
/// (https://wiki.lindenlab.com/wiki/Viewer:Messaging/Messaging_Notes#Capabilities)
- LLEventPump& getCapAPI() { return mCapabilityListener.getCapAPI(); }
+ LLEventPump& getCapAPI() const;
/// implements LLCapabilityProvider
/*virtual*/ const LLHost& getHost() const;
const U64 &getHandle() const { return mHandle; }
- LLSurface &getLand() const { return *mLandp; }
+ LLSurface &getLand() const;
// set and get the region id
- const LLUUID& getRegionID() const { return mRegionID; }
- void setRegionID(const LLUUID& region_id) { mRegionID = region_id; }
+ const LLUUID& getRegionID() const;
+ void setRegionID(const LLUUID& region_id);
BOOL pointInRegionGlobal(const LLVector3d &point_global) const;
LLVector3 getPosRegionFromGlobal(const LLVector3d &point_global) const;
@@ -260,7 +261,7 @@ public:
LLVector3 getPosAgentFromRegion(const LLVector3 &region_pos) const;
LLVector3d getPosGlobalFromRegion(const LLVector3 &offset) const;
- LLVLComposition *getComposition() const { return mCompositionp; }
+ LLVLComposition *getComposition() const;
F32 getCompositionXY(const S32 x, const S32 y) const;
BOOL isOwnedSelf(const LLVector3& pos);
@@ -274,6 +275,7 @@ public:
F32 getLandHeightRegion(const LLVector3& region_pos);
void getInfo(LLSD& info);
+
typedef enum
{
@@ -347,34 +349,19 @@ public:
LLDynamicArray<LLUUID> mMapAvatarIDs;
private:
- // The surfaces and other layers
- LLSurface* mLandp;
+ LLViewerRegionImpl * mImpl;
- // Region geometry data
- LLVector3d mOriginGlobal; // Location of southwest corner of region (meters)
- LLVector3d mCenterGlobal; // Location of center in world space (meters)
F32 mWidth; // Width of region on a side (meters)
-
U64 mHandle;
- LLHost mHost;
-
- // The unique ID for this region.
- LLUUID mRegionID;
-
F32 mTimeDilation; // time dilation of physics simulation on simulator
// simulator name
std::string mName;
std::string mZoning;
- // region/estate owner - usually null.
- LLUUID mOwnerID;
-
// Is this agent on the estate managers list for this region?
BOOL mIsEstateManager;
- // Network statistics for the region's circuit...
- LLTimer mLastNetUpdate;
U32 mPacketsIn;
U32 mBitsIn;
U32 mLastBitsIn;
@@ -386,9 +373,6 @@ private:
U32 mPingDelay;
F32 mDeltaTime; // Time since last measurement of lastPackets, Bits, etc
- // Misc
- LLVLComposition *mCompositionp; // Composition layer for the surface
-
U32 mRegionFlags; // includes damage flags
U8 mSimAccess;
F32 mBillableFactor;
@@ -398,46 +382,24 @@ private:
// Information for Homestead / CR-53
S32 mClassID;
S32 mCPURatio;
+
std::string mColoName;
std::string mProductSKU;
std::string mProductName;
std::string mHttpUrl ;
-
// Maps local ids to cache entries.
// Regions can have order 10,000 objects, so assume
// a structure of size 2^14 = 16,000
BOOL mCacheLoaded;
BOOL mCacheDirty;
- LLVOCacheEntry::vocache_entry_map_t mCacheMap;
+
LLDynamicArray<U32> mCacheMissFull;
LLDynamicArray<U32> mCacheMissCRC;
- // time?
- // LRU info?
-
- // Cache ID is unique per-region, across renames, moving locations,
- // etc.
- LLUUID mCacheID;
- typedef std::map<std::string, std::string> CapabilityMap;
- CapabilityMap mCapabilities;
-
- LLEventPoll* mEventPoll;
-
- /// 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)
- LLCapabilityListener mCapabilityListener;
-
-private:
bool mAlive; // can become false if circuit disconnects
bool mCapabilitiesReceived;
- //spatial partitions for objects in this region
- std::vector<LLSpatialPartition*> mObjectPartition;
-
- LLHTTPClient::ResponderPtr mHttpResponderPtr ;
-
BOOL mReleaseNotesRequested;
};
diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp
index c1abead36e..3e85802ba6 100644
--- a/indra/newview/llviewershadermgr.cpp
+++ b/indra/newview/llviewershadermgr.cpp
@@ -68,9 +68,21 @@ LLGLSLShader gObjectFullbrightProgram;
LLGLSLShader gObjectFullbrightWaterProgram;
LLGLSLShader gObjectFullbrightShinyProgram;
+LLGLSLShader gObjectFullbrightShinyWaterProgram;
LLGLSLShader gObjectShinyProgram;
LLGLSLShader gObjectShinyWaterProgram;
+//object hardware skinning shaders
+LLGLSLShader gSkinnedObjectSimpleProgram;
+LLGLSLShader gSkinnedObjectFullbrightProgram;
+LLGLSLShader gSkinnedObjectFullbrightShinyProgram;
+LLGLSLShader gSkinnedObjectShinySimpleProgram;
+
+LLGLSLShader gSkinnedObjectSimpleWaterProgram;
+LLGLSLShader gSkinnedObjectFullbrightWaterProgram;
+LLGLSLShader gSkinnedObjectFullbrightShinyWaterProgram;
+LLGLSLShader gSkinnedObjectShinySimpleWaterProgram;
+
//environment shaders
LLGLSLShader gTerrainProgram;
LLGLSLShader gTerrainWaterProgram;
@@ -101,6 +113,9 @@ LLGLSLShader gDeferredImpostorProgram;
LLGLSLShader gDeferredEdgeProgram;
LLGLSLShader gDeferredWaterProgram;
LLGLSLShader gDeferredDiffuseProgram;
+LLGLSLShader gDeferredSkinnedDiffuseProgram;
+LLGLSLShader gDeferredSkinnedBumpProgram;
+LLGLSLShader gDeferredSkinnedAlphaProgram;
LLGLSLShader gDeferredBumpProgram;
LLGLSLShader gDeferredTerrainProgram;
LLGLSLShader gDeferredTreeProgram;
@@ -115,12 +130,14 @@ LLGLSLShader gDeferredBlurLightProgram;
LLGLSLShader gDeferredSoftenProgram;
LLGLSLShader gDeferredShadowProgram;
LLGLSLShader gDeferredAvatarShadowProgram;
+LLGLSLShader gDeferredAttachmentShadowProgram;
LLGLSLShader gDeferredAlphaProgram;
LLGLSLShader gDeferredFullbrightProgram;
LLGLSLShader gDeferredGIProgram;
LLGLSLShader gDeferredGIFinalProgram;
LLGLSLShader gDeferredPostGIProgram;
LLGLSLShader gDeferredPostProgram;
+LLGLSLShader gDeferredPostNoDoFProgram;
LLGLSLShader gLuminanceGatherProgram;
@@ -142,6 +159,15 @@ LLViewerShaderMgr::LLViewerShaderMgr() :
mShaderList.push_back(&gObjectSimpleProgram);
mShaderList.push_back(&gObjectFullbrightProgram);
mShaderList.push_back(&gObjectFullbrightShinyProgram);
+ mShaderList.push_back(&gObjectFullbrightShinyWaterProgram);
+ mShaderList.push_back(&gSkinnedObjectSimpleProgram);
+ mShaderList.push_back(&gSkinnedObjectFullbrightProgram);
+ mShaderList.push_back(&gSkinnedObjectFullbrightShinyProgram);
+ mShaderList.push_back(&gSkinnedObjectShinySimpleProgram);
+ mShaderList.push_back(&gSkinnedObjectSimpleWaterProgram);
+ mShaderList.push_back(&gSkinnedObjectFullbrightWaterProgram);
+ mShaderList.push_back(&gSkinnedObjectFullbrightShinyWaterProgram);
+ mShaderList.push_back(&gSkinnedObjectShinySimpleWaterProgram);
mShaderList.push_back(&gTerrainProgram);
mShaderList.push_back(&gTerrainWaterProgram);
mShaderList.push_back(&gObjectSimpleWaterProgram);
@@ -155,6 +181,7 @@ LLViewerShaderMgr::LLViewerShaderMgr() :
mShaderList.push_back(&gDeferredLightProgram);
mShaderList.push_back(&gDeferredMultiLightProgram);
mShaderList.push_back(&gDeferredAlphaProgram);
+ mShaderList.push_back(&gDeferredSkinnedAlphaProgram);
mShaderList.push_back(&gDeferredFullbrightProgram);
mShaderList.push_back(&gDeferredPostGIProgram);
mShaderList.push_back(&gDeferredEdgeProgram);
@@ -189,6 +216,7 @@ void LLViewerShaderMgr::initAttribsAndUniforms(void)
mReservedAttribs.push_back("materialColor");
mReservedAttribs.push_back("specularColor");
mReservedAttribs.push_back("binormal");
+ mReservedAttribs.push_back("object_weight");
mAvatarAttribs.reserve(5);
mAvatarAttribs.push_back("weight");
@@ -370,7 +398,9 @@ void LLViewerShaderMgr::setShaders()
S32 deferred_class = 0;
if (LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferred") &&
- gSavedSettings.getBOOL("RenderDeferred"))
+ gSavedSettings.getBOOL("RenderDeferred") &&
+ gSavedSettings.getBOOL("RenderAvatarVP") &&
+ gSavedSettings.getBOOL("WindLightUseAtmosShaders"))
{
if (gSavedSettings.getS32("RenderShadowDetail") > 0)
{
@@ -388,14 +418,11 @@ void LLViewerShaderMgr::setShaders()
deferred_class = 1;
}
- //make sure framebuffer objects are enabled
- gSavedSettings.setBOOL("RenderUseFBO", TRUE);
-
//make sure hardware skinning is enabled
- gSavedSettings.setBOOL("RenderAvatarVP", TRUE);
+ //gSavedSettings.setBOOL("RenderAvatarVP", TRUE);
//make sure atmospheric shaders are enabled
- gSavedSettings.setBOOL("WindLightUseAtmosShaders", TRUE);
+ //gSavedSettings.setBOOL("WindLightUseAtmosShaders", TRUE);
}
@@ -438,7 +465,6 @@ void LLViewerShaderMgr::setShaders()
// Load all shaders to set max levels
loadShadersEnvironment();
loadShadersWater();
- loadShadersObject();
loadShadersWindLight();
loadShadersEffects();
loadShadersInterface();
@@ -446,14 +472,9 @@ void LLViewerShaderMgr::setShaders()
// Load max avatar shaders to set the max level
mVertexShaderLevel[SHADER_AVATAR] = 3;
mMaxAvatarShaderLevel = 3;
- loadShadersAvatar();
-
-#if 0 && LL_DARWIN // force avatar shaders off for mac
- mVertexShaderLevel[SHADER_AVATAR] = 0;
- sMaxAvatarShaderLevel = 0;
-#else
- if (gSavedSettings.getBOOL("RenderAvatarVP"))
- {
+
+ if (gSavedSettings.getBOOL("RenderAvatarVP") && loadShadersObject())
+ { //hardware skinning is enabled and rigged attachment shaders loaded correctly
BOOL avatar_cloth = gSavedSettings.getBOOL("RenderAvatarCloth");
S32 avatar_class = 1;
@@ -484,17 +505,28 @@ void LLViewerShaderMgr::setShaders()
}
}
else
- {
+ { //hardware skinning not possible, neither is deferred rendering
mVertexShaderLevel[SHADER_AVATAR] = 0;
- gSavedSettings.setBOOL("RenderAvatarCloth", FALSE);
+ mVertexShaderLevel[SHADER_DEFERRED] = 0;
+
+ if (gSavedSettings.getBOOL("RenderAvatarVP"))
+ {
+ gSavedSettings.setBOOL("RenderDeferred", FALSE);
+ gSavedSettings.setBOOL("RenderAvatarCloth", FALSE);
+ gSavedSettings.setBOOL("RenderAvatarVP", FALSE);
+ }
+
loadShadersAvatar(); // unloads
+ loadShadersObject();
}
if (!loadShadersDeferred())
{
gSavedSettings.setBOOL("RenderDeferred", FALSE);
+ reentrance = false;
+ setShaders();
+ return;
}
-#endif
}
else
{
@@ -542,7 +574,20 @@ void LLViewerShaderMgr::unloadShaders()
gObjectShinyProgram.unload();
gObjectFullbrightShinyProgram.unload();
+ gObjectFullbrightShinyWaterProgram.unload();
gObjectShinyWaterProgram.unload();
+
+ gSkinnedObjectSimpleProgram.unload();
+ gSkinnedObjectFullbrightProgram.unload();
+ gSkinnedObjectFullbrightShinyProgram.unload();
+ gSkinnedObjectShinySimpleProgram.unload();
+
+ gSkinnedObjectSimpleWaterProgram.unload();
+ gSkinnedObjectFullbrightWaterProgram.unload();
+ gSkinnedObjectFullbrightShinyWaterProgram.unload();
+ gSkinnedObjectShinySimpleWaterProgram.unload();
+
+
gWaterProgram.unload();
gUnderWaterProgram.unload();
gTerrainProgram.unload();
@@ -562,6 +607,9 @@ void LLViewerShaderMgr::unloadShaders()
gPostNightVisionProgram.unload();
gDeferredDiffuseProgram.unload();
+ gDeferredSkinnedDiffuseProgram.unload();
+ gDeferredSkinnedBumpProgram.unload();
+ gDeferredSkinnedAlphaProgram.unload();
mVertexShaderLevel[SHADER_LIGHTING] = 0;
mVertexShaderLevel[SHADER_OBJECT] = 0;
@@ -620,6 +668,7 @@ BOOL LLViewerShaderMgr::loadBasicShaders()
shaders.push_back( make_pair( "lighting/lightSpecularV.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
shaders.push_back( make_pair( "windlight/atmosphericsV.glsl", mVertexShaderLevel[SHADER_WINDLIGHT] ) );
shaders.push_back( make_pair( "avatar/avatarSkinV.glsl", 1 ) );
+ shaders.push_back( make_pair( "avatar/objectSkinV.glsl", 1 ) );
// We no longer have to bind the shaders to global glhandles, they are automatically added to a map now.
for (U32 i = 0; i < shaders.size(); i++)
@@ -635,7 +684,7 @@ BOOL LLViewerShaderMgr::loadBasicShaders()
// (in order of shader function call depth for reference purposes, deepest level first)
shaders.clear();
- shaders.reserve(12);
+ 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] ) );
@@ -648,6 +697,7 @@ BOOL LLViewerShaderMgr::loadBasicShaders()
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] ) );
for (U32 i = 0; i < shaders.size(); i++)
{
@@ -875,6 +925,9 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
{
gDeferredTreeProgram.unload();
gDeferredDiffuseProgram.unload();
+ gDeferredSkinnedDiffuseProgram.unload();
+ gDeferredSkinnedBumpProgram.unload();
+ gDeferredSkinnedAlphaProgram.unload();
gDeferredBumpProgram.unload();
gDeferredImpostorProgram.unload();
gDeferredTerrainProgram.unload();
@@ -887,6 +940,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
gDeferredSoftenProgram.unload();
gDeferredShadowProgram.unload();
gDeferredAvatarShadowProgram.unload();
+ gDeferredAttachmentShadowProgram.unload();
gDeferredAvatarProgram.unload();
gDeferredAvatarAlphaProgram.unload();
gDeferredAlphaProgram.unload();
@@ -898,7 +952,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
gDeferredGIProgram.unload();
gDeferredGIFinalProgram.unload();
gDeferredWaterProgram.unload();
- return FALSE;
+ return TRUE;
}
mVertexShaderLevel[SHADER_AVATAR] = 1;
@@ -917,6 +971,44 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
if (success)
{
+ gDeferredSkinnedDiffuseProgram.mName = "Deferred Skinned Diffuse Shader";
+ gDeferredSkinnedDiffuseProgram.mFeatures.hasObjectSkinning = true;
+ gDeferredSkinnedDiffuseProgram.mShaderFiles.clear();
+ gDeferredSkinnedDiffuseProgram.mShaderFiles.push_back(make_pair("deferred/diffuseSkinnedV.glsl", GL_VERTEX_SHADER_ARB));
+ gDeferredSkinnedDiffuseProgram.mShaderFiles.push_back(make_pair("deferred/diffuseF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gDeferredSkinnedDiffuseProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
+ success = gDeferredSkinnedDiffuseProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
+ gDeferredSkinnedBumpProgram.mName = "Deferred Skinned Bump Shader";
+ gDeferredSkinnedBumpProgram.mFeatures.hasObjectSkinning = true;
+ gDeferredSkinnedBumpProgram.mShaderFiles.clear();
+ gDeferredSkinnedBumpProgram.mShaderFiles.push_back(make_pair("deferred/bumpSkinnedV.glsl", GL_VERTEX_SHADER_ARB));
+ gDeferredSkinnedBumpProgram.mShaderFiles.push_back(make_pair("deferred/bumpF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gDeferredSkinnedBumpProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
+ success = gDeferredSkinnedBumpProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
+ gDeferredSkinnedAlphaProgram.mName = "Deferred Skinned Alpha Shader";
+ gDeferredSkinnedAlphaProgram.mFeatures.hasObjectSkinning = true;
+ gDeferredSkinnedAlphaProgram.mFeatures.calculatesLighting = true;
+ gDeferredSkinnedAlphaProgram.mFeatures.calculatesAtmospherics = true;
+ gDeferredSkinnedAlphaProgram.mFeatures.hasGamma = true;
+ gDeferredSkinnedAlphaProgram.mFeatures.hasAtmospherics = true;
+ gDeferredSkinnedAlphaProgram.mFeatures.hasLighting = 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.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
+ success = gDeferredSkinnedAlphaProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
gDeferredBumpProgram.mName = "Deferred Bump Shader";
gDeferredBumpProgram.mShaderFiles.clear();
gDeferredBumpProgram.mShaderFiles.push_back(make_pair("deferred/bumpV.glsl", GL_VERTEX_SHADER_ARB));
@@ -959,7 +1051,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
{
gDeferredMultiLightProgram.mName = "Deferred MultiLight Shader";
gDeferredMultiLightProgram.mShaderFiles.clear();
- gDeferredMultiLightProgram.mShaderFiles.push_back(make_pair("deferred/pointLightV.glsl", GL_VERTEX_SHADER_ARB));
+ 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.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
success = gDeferredMultiLightProgram.createShader(NULL, NULL);
@@ -1065,7 +1157,14 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
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.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
+
+ if (gSavedSettings.getBOOL("RenderDeferredSSAO"))
+ { //if using SSAO, take screen space light map into account as if shadows are enabled
+ gDeferredSoftenProgram.mShaderLevel = llmax(gDeferredSoftenProgram.mShaderLevel, 2);
+ }
+
success = gDeferredSoftenProgram.createShader(NULL, NULL);
}
@@ -1092,6 +1191,17 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
if (success)
{
+ gDeferredAttachmentShadowProgram.mName = "Deferred Attachment Shadow Shader";
+ gDeferredAttachmentShadowProgram.mFeatures.hasObjectSkinning = true;
+ gDeferredAttachmentShadowProgram.mShaderFiles.clear();
+ gDeferredAttachmentShadowProgram.mShaderFiles.push_back(make_pair("deferred/attachmentShadowV.glsl", GL_VERTEX_SHADER_ARB));
+ gDeferredAttachmentShadowProgram.mShaderFiles.push_back(make_pair("deferred/attachmentShadowF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gDeferredAttachmentShadowProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
+ success = gDeferredAttachmentShadowProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
gTerrainProgram.mName = "Deferred Terrain Shader";
gDeferredTerrainProgram.mShaderFiles.clear();
gDeferredTerrainProgram.mShaderFiles.push_back(make_pair("deferred/terrainV.glsl", GL_VERTEX_SHADER_ARB));
@@ -1122,11 +1232,31 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
gDeferredAvatarAlphaProgram.mFeatures.hasLighting = true;
gDeferredAvatarAlphaProgram.mShaderFiles.clear();
gDeferredAvatarAlphaProgram.mShaderFiles.push_back(make_pair("deferred/avatarAlphaV.glsl", GL_VERTEX_SHADER_ARB));
- gDeferredAvatarAlphaProgram.mShaderFiles.push_back(make_pair("deferred/avatarAlphaF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gDeferredAvatarAlphaProgram.mShaderFiles.push_back(make_pair("deferred/alphaF.glsl", GL_FRAGMENT_SHADER_ARB));
gDeferredAvatarAlphaProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
success = gDeferredAvatarAlphaProgram.createShader(&mAvatarAttribs, &mAvatarUniforms);
}
+ if (success)
+ {
+ gDeferredPostProgram.mName = "Deferred Post Shader";
+ gDeferredPostProgram.mShaderFiles.clear();
+ gDeferredPostProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredV.glsl", GL_VERTEX_SHADER_ARB));
+ gDeferredPostProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gDeferredPostProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
+ success = gDeferredPostProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
+ gDeferredPostNoDoFProgram.mName = "Deferred Post Shader";
+ gDeferredPostNoDoFProgram.mShaderFiles.clear();
+ gDeferredPostNoDoFProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredV.glsl", GL_VERTEX_SHADER_ARB));
+ gDeferredPostNoDoFProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredNoDoFF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gDeferredPostNoDoFProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
+ success = gDeferredPostNoDoFProgram.createShader(NULL, NULL);
+ }
+
if (mVertexShaderLevel[SHADER_DEFERRED] > 1)
{
if (success)
@@ -1142,15 +1272,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
if (mVertexShaderLevel[SHADER_DEFERRED] > 2)
{
- if (success)
- {
- gDeferredPostProgram.mName = "Deferred Post Shader";
- gDeferredPostProgram.mShaderFiles.clear();
- gDeferredPostProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredV.glsl", GL_VERTEX_SHADER_ARB));
- gDeferredPostProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredF.glsl", GL_FRAGMENT_SHADER_ARB));
- gDeferredPostProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
- success = gDeferredPostProgram.createShader(NULL, NULL);
- }
+
if (success)
{
@@ -1204,12 +1326,22 @@ BOOL LLViewerShaderMgr::loadShadersObject()
{
gObjectShinyProgram.unload();
gObjectFullbrightShinyProgram.unload();
+ gObjectFullbrightShinyWaterProgram.unload();
gObjectShinyWaterProgram.unload();
gObjectSimpleProgram.unload();
gObjectSimpleWaterProgram.unload();
gObjectFullbrightProgram.unload();
gObjectFullbrightWaterProgram.unload();
- return FALSE;
+ gSkinnedObjectSimpleProgram.unload();
+ gSkinnedObjectFullbrightProgram.unload();
+ gSkinnedObjectFullbrightShinyProgram.unload();
+ gSkinnedObjectShinySimpleProgram.unload();
+ gSkinnedObjectSimpleWaterProgram.unload();
+ gSkinnedObjectFullbrightWaterProgram.unload();
+ gSkinnedObjectFullbrightShinyWaterProgram.unload();
+ gSkinnedObjectShinySimpleWaterProgram.unload();
+
+ return TRUE;
}
if (success)
@@ -1318,6 +1450,159 @@ BOOL LLViewerShaderMgr::loadShadersObject()
success = gObjectFullbrightShinyProgram.createShader(NULL, &mShinyUniforms);
}
+ if (success)
+ {
+ gObjectFullbrightShinyWaterProgram.mName = "Fullbright Shiny Water Shader";
+ gObjectFullbrightShinyWaterProgram.mFeatures.calculatesAtmospherics = true;
+ gObjectFullbrightShinyWaterProgram.mFeatures.isFullbright = true;
+ gObjectFullbrightShinyWaterProgram.mFeatures.isShiny = true;
+ gObjectFullbrightShinyWaterProgram.mFeatures.hasGamma = true;
+ gObjectFullbrightShinyWaterProgram.mFeatures.hasTransport = true;
+ gObjectFullbrightShinyWaterProgram.mFeatures.hasWaterFog = true;
+ 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));
+ gObjectFullbrightShinyWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ gObjectFullbrightShinyWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
+ success = gObjectFullbrightShinyWaterProgram.createShader(NULL, &mShinyUniforms);
+ }
+
+ if (mVertexShaderLevel[SHADER_AVATAR] > 0)
+ { //load hardware skinned attachment shaders
+ if (success)
+ {
+ gSkinnedObjectSimpleProgram.mName = "Skinned Simple Shader";
+ gSkinnedObjectSimpleProgram.mFeatures.calculatesLighting = true;
+ gSkinnedObjectSimpleProgram.mFeatures.calculatesAtmospherics = true;
+ gSkinnedObjectSimpleProgram.mFeatures.hasGamma = true;
+ gSkinnedObjectSimpleProgram.mFeatures.hasAtmospherics = true;
+ gSkinnedObjectSimpleProgram.mFeatures.hasLighting = true;
+ gSkinnedObjectSimpleProgram.mFeatures.hasObjectSkinning = 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));
+ gSkinnedObjectSimpleProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ success = gSkinnedObjectSimpleProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
+ gSkinnedObjectFullbrightProgram.mName = "Skinned Fullbright Shader";
+ gSkinnedObjectFullbrightProgram.mFeatures.calculatesAtmospherics = true;
+ gSkinnedObjectFullbrightProgram.mFeatures.hasGamma = true;
+ gSkinnedObjectFullbrightProgram.mFeatures.hasTransport = true;
+ gSkinnedObjectFullbrightProgram.mFeatures.isFullbright = true;
+ gSkinnedObjectFullbrightProgram.mFeatures.hasObjectSkinning = 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));
+ gSkinnedObjectFullbrightProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ success = gSkinnedObjectFullbrightProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
+ gSkinnedObjectFullbrightShinyProgram.mName = "Skinned Fullbright Shiny Shader";
+ gSkinnedObjectFullbrightShinyProgram.mFeatures.calculatesAtmospherics = true;
+ gSkinnedObjectFullbrightShinyProgram.mFeatures.hasGamma = true;
+ gSkinnedObjectFullbrightShinyProgram.mFeatures.hasTransport = true;
+ gSkinnedObjectFullbrightShinyProgram.mFeatures.isShiny = true;
+ gSkinnedObjectFullbrightShinyProgram.mFeatures.isFullbright = true;
+ gSkinnedObjectFullbrightShinyProgram.mFeatures.hasObjectSkinning = 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));
+ gSkinnedObjectFullbrightShinyProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ success = gSkinnedObjectFullbrightShinyProgram.createShader(NULL, &mShinyUniforms);
+ }
+
+ if (success)
+ {
+ gSkinnedObjectShinySimpleProgram.mName = "Skinned Shiny Simple Shader";
+ gSkinnedObjectShinySimpleProgram.mFeatures.calculatesLighting = true;
+ gSkinnedObjectShinySimpleProgram.mFeatures.calculatesAtmospherics = true;
+ gSkinnedObjectShinySimpleProgram.mFeatures.hasGamma = true;
+ gSkinnedObjectShinySimpleProgram.mFeatures.hasAtmospherics = true;
+ gSkinnedObjectShinySimpleProgram.mFeatures.hasObjectSkinning = true;
+ gSkinnedObjectShinySimpleProgram.mFeatures.isShiny = 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));
+ gSkinnedObjectShinySimpleProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ success = gSkinnedObjectShinySimpleProgram.createShader(NULL, &mShinyUniforms);
+ }
+
+ if (success)
+ {
+ gSkinnedObjectSimpleWaterProgram.mName = "Skinned Simple Water Shader";
+ gSkinnedObjectSimpleWaterProgram.mFeatures.calculatesLighting = true;
+ gSkinnedObjectSimpleWaterProgram.mFeatures.calculatesAtmospherics = true;
+ gSkinnedObjectSimpleWaterProgram.mFeatures.hasGamma = true;
+ gSkinnedObjectSimpleWaterProgram.mFeatures.hasAtmospherics = true;
+ gSkinnedObjectSimpleWaterProgram.mFeatures.hasLighting = true;
+ gSkinnedObjectSimpleWaterProgram.mFeatures.hasWaterFog = true;
+ gSkinnedObjectSimpleWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
+ gSkinnedObjectSimpleWaterProgram.mFeatures.hasObjectSkinning = 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));
+ gSkinnedObjectSimpleWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ success = gSkinnedObjectSimpleWaterProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
+ gSkinnedObjectFullbrightWaterProgram.mName = "Skinned Fullbright Water Shader";
+ gSkinnedObjectFullbrightWaterProgram.mFeatures.calculatesAtmospherics = true;
+ gSkinnedObjectFullbrightWaterProgram.mFeatures.hasGamma = true;
+ gSkinnedObjectFullbrightWaterProgram.mFeatures.hasTransport = true;
+ gSkinnedObjectFullbrightWaterProgram.mFeatures.isFullbright = true;
+ gSkinnedObjectFullbrightWaterProgram.mFeatures.hasObjectSkinning = true;
+ gSkinnedObjectFullbrightWaterProgram.mFeatures.hasWaterFog = true;
+ gSkinnedObjectFullbrightWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
+ gSkinnedObjectFullbrightWaterProgram.mShaderFiles.clear();
+ gSkinnedObjectFullbrightWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightSkinnedV.glsl", GL_VERTEX_SHADER_ARB));
+ gSkinnedObjectFullbrightWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gSkinnedObjectFullbrightWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ success = gSkinnedObjectFullbrightWaterProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
+ gSkinnedObjectFullbrightShinyWaterProgram.mName = "Skinned Fullbright Shiny Water Shader";
+ gSkinnedObjectFullbrightShinyWaterProgram.mFeatures.calculatesAtmospherics = true;
+ gSkinnedObjectFullbrightShinyWaterProgram.mFeatures.hasGamma = true;
+ gSkinnedObjectFullbrightShinyWaterProgram.mFeatures.hasTransport = true;
+ gSkinnedObjectFullbrightShinyWaterProgram.mFeatures.isShiny = true;
+ gSkinnedObjectFullbrightShinyWaterProgram.mFeatures.isFullbright = true;
+ gSkinnedObjectFullbrightShinyWaterProgram.mFeatures.hasObjectSkinning = true;
+ gSkinnedObjectFullbrightShinyWaterProgram.mFeatures.hasWaterFog = true;
+ gSkinnedObjectFullbrightShinyWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
+ gSkinnedObjectFullbrightShinyWaterProgram.mShaderFiles.clear();
+ gSkinnedObjectFullbrightShinyWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightShinySkinnedV.glsl", GL_VERTEX_SHADER_ARB));
+ gSkinnedObjectFullbrightShinyWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightShinyWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gSkinnedObjectFullbrightShinyWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ success = gSkinnedObjectFullbrightShinyWaterProgram.createShader(NULL, &mShinyUniforms);
+ }
+
+ if (success)
+ {
+ gSkinnedObjectShinySimpleWaterProgram.mName = "Skinned Shiny Simple Water Shader";
+ gSkinnedObjectShinySimpleWaterProgram.mFeatures.calculatesLighting = true;
+ gSkinnedObjectShinySimpleWaterProgram.mFeatures.calculatesAtmospherics = true;
+ gSkinnedObjectShinySimpleWaterProgram.mFeatures.hasGamma = true;
+ gSkinnedObjectShinySimpleWaterProgram.mFeatures.hasAtmospherics = true;
+ gSkinnedObjectShinySimpleWaterProgram.mFeatures.hasObjectSkinning = true;
+ gSkinnedObjectShinySimpleWaterProgram.mFeatures.isShiny = true;
+ gSkinnedObjectShinySimpleWaterProgram.mFeatures.hasWaterFog = true;
+ gSkinnedObjectShinySimpleWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
+ gSkinnedObjectShinySimpleWaterProgram.mShaderFiles.clear();
+ gSkinnedObjectShinySimpleWaterProgram.mShaderFiles.push_back(make_pair("objects/shinySimpleSkinnedV.glsl", GL_VERTEX_SHADER_ARB));
+ gSkinnedObjectShinySimpleWaterProgram.mShaderFiles.push_back(make_pair("objects/shinyWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gSkinnedObjectShinySimpleWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ success = gSkinnedObjectShinySimpleWaterProgram.createShader(NULL, &mShinyUniforms);
+ }
+ }
if( !success )
{
diff --git a/indra/newview/llviewershadermgr.h b/indra/newview/llviewershadermgr.h
index db880fded6..72ac5e02ee 100644
--- a/indra/newview/llviewershadermgr.h
+++ b/indra/newview/llviewershadermgr.h
@@ -76,6 +76,7 @@ public:
MATERIAL_COLOR = 0,
SPECULAR_COLOR,
BINORMAL,
+ OBJECT_WEIGHT,
END_RESERVED_ATTRIBS
} eGLSLReservedAttribs;
@@ -304,9 +305,20 @@ extern LLGLSLShader gObjectSimpleLODProgram;
extern LLGLSLShader gObjectFullbrightLODProgram;
extern LLGLSLShader gObjectFullbrightShinyProgram;
+extern LLGLSLShader gObjectFullbrightShinyWaterProgram;
extern LLGLSLShader gObjectShinyProgram;
extern LLGLSLShader gObjectShinyWaterProgram;
+extern LLGLSLShader gSkinnedObjectSimpleProgram;
+extern LLGLSLShader gSkinnedObjectFullbrightProgram;
+extern LLGLSLShader gSkinnedObjectFullbrightShinyProgram;
+extern LLGLSLShader gSkinnedObjectShinySimpleProgram;
+
+extern LLGLSLShader gSkinnedObjectSimpleWaterProgram;
+extern LLGLSLShader gSkinnedObjectFullbrightWaterProgram;
+extern LLGLSLShader gSkinnedObjectFullbrightShinyWaterProgram;
+extern LLGLSLShader gSkinnedObjectShinySimpleWaterProgram;
+
//environment shaders
extern LLGLSLShader gTerrainProgram;
extern LLGLSLShader gTerrainWaterProgram;
@@ -337,6 +349,9 @@ extern LLGLSLShader gDeferredImpostorProgram;
extern LLGLSLShader gDeferredEdgeProgram;
extern LLGLSLShader gDeferredWaterProgram;
extern LLGLSLShader gDeferredDiffuseProgram;
+extern LLGLSLShader gDeferredSkinnedDiffuseProgram;
+extern LLGLSLShader gDeferredSkinnedBumpProgram;
+extern LLGLSLShader gDeferredSkinnedAlphaProgram;
extern LLGLSLShader gDeferredBumpProgram;
extern LLGLSLShader gDeferredTerrainProgram;
extern LLGLSLShader gDeferredTreeProgram;
@@ -353,7 +368,9 @@ extern LLGLSLShader gDeferredSoftenProgram;
extern LLGLSLShader gDeferredShadowProgram;
extern LLGLSLShader gDeferredPostGIProgram;
extern LLGLSLShader gDeferredPostProgram;
+extern LLGLSLShader gDeferredPostNoDoFProgram;
extern LLGLSLShader gDeferredAvatarShadowProgram;
+extern LLGLSLShader gDeferredAttachmentShadowProgram;
extern LLGLSLShader gDeferredAlphaProgram;
extern LLGLSLShader gDeferredFullbrightProgram;
extern LLGLSLShader gDeferredAvatarAlphaProgram;
diff --git a/indra/newview/llviewerstats.cpp b/indra/newview/llviewerstats.cpp
index fa60e572ac..0fb94bc44b 100644
--- a/indra/newview/llviewerstats.cpp
+++ b/indra/newview/llviewerstats.cpp
@@ -59,6 +59,7 @@
#include "llworld.h"
#include "llfeaturemanager.h"
#include "llviewernetwork.h"
+#include "llmeshrepository.h" //for LLMeshRepository::sBytesReceived
class StatAttributes
@@ -794,6 +795,7 @@ void send_stats()
download["world_kbytes"] = gTotalWorldBytes / 1024.0;
download["object_kbytes"] = gTotalObjectBytes / 1024.0;
download["texture_kbytes"] = gTotalTextureBytes / 1024.0;
+ download["mesh_kbytes"] = LLMeshRepository::sBytesReceived/1024.0;
LLSD &in = body["stats"]["net"]["in"];
diff --git a/indra/newview/llviewerstats.h b/indra/newview/llviewerstats.h
index 3f9cfb9d9b..f91a1241fe 100644
--- a/indra/newview/llviewerstats.h
+++ b/indra/newview/llviewerstats.h
@@ -196,8 +196,15 @@ public:
S32 mCount;
F32 mSum;
F32 mSumOfSquares;
+ F32 mMinValue;
+ F32 mMaxValue;
U32 mCountOfNextUpdatesToIgnore;
+ inline StatsAccumulator()
+ {
+ reset();
+ }
+
inline void push( F32 val )
{
if ( mCountOfNextUpdatesToIgnore > 0 )
@@ -209,13 +216,31 @@ public:
mCount++;
mSum += val;
mSumOfSquares += val * val;
+ if (mCount == 1 || val > mMaxValue)
+ {
+ mMaxValue = val;
+ }
+ if (mCount == 1 || val < mMinValue)
+ {
+ mMinValue = val;
+ }
}
inline F32 getMean() const
{
return (mCount == 0) ? 0.f : ((F32)mSum)/mCount;
}
-
+
+ inline F32 getMinValue() const
+ {
+ return mMinValue;
+ }
+
+ inline F32 getMaxValue() const
+ {
+ return mMaxValue;
+ }
+
inline F32 getStdDev() const
{
const F32 mean = getMean();
@@ -231,6 +256,8 @@ public:
{
mCount = 0;
mSum = mSumOfSquares = 0.f;
+ mMinValue = 0.0f;
+ mMaxValue = 0.0f;
mCountOfNextUpdatesToIgnore = 0;
}
@@ -240,6 +267,8 @@ public:
data["mean"] = getMean();
data["std_dev"] = getStdDev();
data["count"] = (S32)mCount;
+ data["min"] = getMinValue();
+ data["max"] = getMaxValue();
return data;
}
};
diff --git a/indra/newview/llviewertexteditor.cpp b/indra/newview/llviewertexteditor.cpp
index 0c36970878..4798bb536f 100644
--- a/indra/newview/llviewertexteditor.cpp
+++ b/indra/newview/llviewertexteditor.cpp
@@ -537,6 +537,7 @@ LLUIImagePtr LLEmbeddedItems::getItemImage(llwchar ext_char) const
case LLAssetType::AT_BODYPART: img_name = "Inv_Skin"; break;
case LLAssetType::AT_ANIMATION: img_name = "Inv_Animation"; break;
case LLAssetType::AT_GESTURE: img_name = "Inv_Gesture"; break;
+ case LLAssetType::AT_MESH: img_name = "Inv_Mesh"; break;
default: llassert(0);
}
@@ -846,17 +847,18 @@ BOOL LLViewerTextEditor::handleDragAndDrop(S32 x, S32 y, MASK mask,
{
switch( cargo_type )
{
- case DAD_CALLINGCARD:
- case DAD_TEXTURE:
- case DAD_SOUND:
- case DAD_LANDMARK:
- case DAD_SCRIPT:
- case DAD_CLOTHING:
- case DAD_OBJECT:
- case DAD_NOTECARD:
- case DAD_BODYPART:
- case DAD_ANIMATION:
- case DAD_GESTURE:
+ case DAD_CALLINGCARD:
+ case DAD_TEXTURE:
+ case DAD_SOUND:
+ case DAD_LANDMARK:
+ case DAD_SCRIPT:
+ case DAD_CLOTHING:
+ case DAD_OBJECT:
+ case DAD_NOTECARD:
+ case DAD_BODYPART:
+ case DAD_ANIMATION:
+ case DAD_GESTURE:
+ case DAD_MESH:
{
LLInventoryItem *item = (LLInventoryItem *)cargo_data;
if( item && allowsEmbeddedItems() )
diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp
index f5fb074992..af06421bf9 100644
--- a/indra/newview/llviewertexture.cpp
+++ b/indra/newview/llviewertexture.cpp
@@ -835,7 +835,7 @@ BOOL LLViewerTexture::createGLTexture(S32 discard_level, const LLImageRaw* image
llassert(mGLTexturep.notNull()) ;
BOOL ret = mGLTexturep->createGLTexture(discard_level, imageraw, usename, to_create, category) ;
-
+
if(ret)
{
mFullWidth = mGLTexturep->getCurrentWidth() ;
@@ -1422,8 +1422,15 @@ BOOL LLViewerFetchedTexture::createTexture(S32 usename/*= 0*/)
mOrigWidth = mRawImage->getWidth();
mOrigHeight = mRawImage->getHeight();
- // leave black border, do not scale image content
- mRawImage->expandToPowerOfTwo(MAX_IMAGE_SIZE, FALSE);
+
+ if (mBoostLevel == BOOST_PREVIEW)
+ {
+ mRawImage->biasedScaleToPowerOfTwo(1024);
+ }
+ else
+ { // leave black border, do not scale image content
+ mRawImage->expandToPowerOfTwo(MAX_IMAGE_SIZE, FALSE);
+ }
mFullWidth = mRawImage->getWidth();
mFullHeight = mRawImage->getHeight();
@@ -1583,7 +1590,7 @@ F32 LLViewerFetchedTexture::calcDecodePriority()
S32 cur_discard = getCurrentDiscardLevelForFetching();
bool have_all_data = (cur_discard >= 0 && (cur_discard <= mDesiredDiscardLevel));
- F32 pixel_priority = fsqrtf(mMaxVirtualSize);
+ F32 pixel_priority = (F32) sqrt(mMaxVirtualSize);
F32 priority = 0.f;
@@ -2711,6 +2718,9 @@ void LLViewerFetchedTexture::forceToSaveRawImage(S32 desired_discard)
}
void LLViewerFetchedTexture::destroySavedRawImage()
{
+ mForceToSaveRawImage = FALSE ;
+ mSaveRawImage = FALSE ;
+
clearCallbackEntryList() ;
mSavedRawImage = NULL ;
@@ -2870,7 +2880,7 @@ BOOL LLViewerFetchedTexture::insertToAtlas()
}
//process the waiting_list
- for(ll_face_list_t::iterator iter = waiting_list.begin(); iter != waiting_list.end(); ++iter)
+ for(std::vector<LLFace*>::iterator iter = waiting_list.begin(); iter != waiting_list.end(); ++iter)
{
facep = (LLFace*)*iter ;
groupp = facep->getDrawable()->getSpatialGroup() ;
diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp
index 06f6ff23c2..1ffae7ce83 100644
--- a/indra/newview/llviewertexturelist.cpp
+++ b/indra/newview/llviewertexturelist.cpp
@@ -76,24 +76,27 @@ LLStat LLViewerTextureList::sFormattedMemStat(32, TRUE);
LLViewerTextureList gTextureList;
static LLFastTimer::DeclareTimer FTM_PROCESS_IMAGES("Process Images");
+U32 LLViewerTextureList::sRenderThreadID = 0 ;
///////////////////////////////////////////////////////////////////////////////
LLViewerTextureList::LLViewerTextureList()
: mForceResetTextureStats(FALSE),
mUpdateStats(FALSE),
mMaxResidentTexMemInMegaBytes(0),
- mMaxTotalTextureMemInMegaBytes(0)
+ mMaxTotalTextureMemInMegaBytes(0),
+ mInitialized(FALSE)
{
}
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
@@ -105,6 +108,10 @@ void LLViewerTextureList::doPreloadImages()
{
LL_DEBUGS("ViewerImages") << "Preloading images..." << LL_ENDL;
+ llassert_always(mInitialized) ;
+ llassert_always(mImageList.empty()) ;
+ llassert_always(mUUIDMap.empty()) ;
+
// Set the "missing asset" image
LLViewerFetchedTexture::sMissingAssetImagep = LLViewerTextureManager::getFetchedTextureFromFile("missing_asset.tga", MIPMAP_NO, LLViewerFetchedTexture::BOOST_UI);
@@ -300,6 +307,7 @@ void LLViewerTextureList::destroyGL(BOOL save_state)
void LLViewerTextureList::restoreGL()
{
+ llassert_always(mInitialized) ;
LLImageGL::restoreGL();
}
@@ -477,8 +485,10 @@ LLViewerFetchedTexture *LLViewerTextureList::findImage(const LLUUID &image_id)
return iter->second;
}
-void LLViewerTextureList::addImageToList(LLViewerFetchedTexture *image)
+void LLViewerTextureList::addImageToList(LLViewerFetchedTexture *image, U32 thread_id)
{
+ llassert_always(mInitialized) ;
+ llassert_always(sRenderThreadID == thread_id);
llassert(image);
if (image->isInImageList())
{
@@ -492,8 +502,10 @@ void LLViewerTextureList::addImageToList(LLViewerFetchedTexture *image)
image->setInImageList(TRUE) ;
}
-void LLViewerTextureList::removeImageFromList(LLViewerFetchedTexture *image)
+void LLViewerTextureList::removeImageFromList(LLViewerFetchedTexture *image, U32 thread_id)
{
+ llassert_always(mInitialized) ;
+ llassert_always(sRenderThreadID == thread_id);
llassert(image);
if (!image->isInImageList())
{
@@ -690,9 +702,9 @@ void LLViewerTextureList::updateImagesDecodePriorities()
if ((decode_priority_test < old_priority_test * .8f) ||
(decode_priority_test > old_priority_test * 1.25f))
{
- removeImageFromList(imagep);
+ removeImageFromList(imagep, sRenderThreadID);
imagep->setDecodePriority(decode_priority);
- addImageToList(imagep);
+ addImageToList(imagep, sRenderThreadID);
}
update_counter--;
}
@@ -769,9 +781,8 @@ void LLViewerTextureList::forceImmediateUpdate(LLViewerFetchedTexture* imagep)
imagep->processTextureStats();
F32 decode_priority = LLViewerFetchedTexture::maxDecodePriority() ;
imagep->setDecodePriority(decode_priority);
- mImageList.insert(imagep);
- imagep->setInImageList(TRUE) ;
-
+ addImageToList(imagep);
+
return ;
}
@@ -822,7 +833,7 @@ F32 LLViewerTextureList::updateImagesFetchTextures(F32 max_time)
for (entries_list_t::iterator iter3 = entries.begin();
iter3 != entries.end(); )
{
- LLPointer<LLViewerFetchedTexture> imagep = *iter3++;
+ LLViewerFetchedTexture* imagep = *iter3++;
bool fetching = imagep->updateFetch();
if (fetching)
@@ -864,7 +875,9 @@ void LLViewerTextureList::updateImagesUpdateStats()
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();
@@ -882,8 +895,7 @@ void LLViewerTextureList::decodeAllImages(F32 max_time)
imagep->processTextureStats();
F32 decode_priority = imagep->calcDecodePriority();
imagep->setDecodePriority(decode_priority);
- mImageList.insert(imagep);
- imagep->setInImageList(TRUE) ;
+ addImageToList(imagep);
}
image_list.clear();
@@ -927,99 +939,54 @@ void LLViewerTextureList::decodeAllImages(F32 max_time)
BOOL LLViewerTextureList::createUploadFile(const std::string& filename,
const std::string& out_filename,
const U8 codec)
-{
- // First, load the image.
+{
+ // Load the image
+ LLPointer<LLImageFormatted> image = LLImageFormatted::createFromType(codec);
+ if (image.isNull())
+ {
+ image->setLastError("Couldn't open the image to be uploaded.");
+ return FALSE;
+ }
+ if (!image->load(filename))
+ {
+ image->setLastError("Couldn't load the image to be uploaded.");
+ return FALSE;
+ }
+ // Decompress or expand it in a raw image structure
LLPointer<LLImageRaw> raw_image = new LLImageRaw;
-
- switch (codec)
+ if (!image->decode(raw_image, 0.0f))
{
- case IMG_CODEC_BMP:
- {
- LLPointer<LLImageBMP> bmp_image = new LLImageBMP;
-
- if (!bmp_image->load(filename))
- {
- return FALSE;
- }
-
- if (!bmp_image->decode(raw_image, 0.0f))
- {
- return FALSE;
- }
- }
- break;
- case IMG_CODEC_TGA:
- {
- LLPointer<LLImageTGA> tga_image = new LLImageTGA;
-
- if (!tga_image->load(filename))
- {
- return FALSE;
- }
-
- if (!tga_image->decode(raw_image))
- {
- return FALSE;
- }
-
- if( (tga_image->getComponents() != 3) &&
- (tga_image->getComponents() != 4) )
- {
- tga_image->setLastError( "Image files with less than 3 or more than 4 components are not supported." );
- return FALSE;
- }
- }
- break;
- case IMG_CODEC_JPEG:
- {
- LLPointer<LLImageJPEG> jpeg_image = new LLImageJPEG;
-
- if (!jpeg_image->load(filename))
- {
- return FALSE;
- }
-
- if (!jpeg_image->decode(raw_image, 0.0f))
- {
- return FALSE;
- }
- }
- break;
- case IMG_CODEC_PNG:
- {
- LLPointer<LLImagePNG> png_image = new LLImagePNG;
-
- if (!png_image->load(filename))
- {
- return FALSE;
- }
-
- if (!png_image->decode(raw_image, 0.0f))
- {
- return FALSE;
- }
- }
- break;
- default:
- return FALSE;
+ image->setLastError("Couldn't decode the image to be uploaded.");
+ return FALSE;
}
-
- LLPointer<LLImageJ2C> compressedImage = convertToUploadFile(raw_image);
-
- if( !compressedImage->save(out_filename) )
+ // Check the image constraints
+ if ((image->getComponents() != 3) && (image->getComponents() != 4))
{
- llinfos << "Couldn't create output file " << out_filename << llendl;
+ image->setLastError("Image files with less than 3 or more than 4 components are not supported.");
return FALSE;
}
-
- // test to see if the encode and save worked.
+ // Convert to j2c (JPEG2000) and save the file locally
+ LLPointer<LLImageJ2C> compressedImage = convertToUploadFile(raw_image);
+ if (compressedImage.isNull())
+ {
+ image->setLastError("Couldn't convert the image to jpeg2000.");
+ llinfos << "Couldn't convert to j2c, file : " << filename << llendl;
+ return FALSE;
+ }
+ if (!compressedImage->save(out_filename))
+ {
+ image->setLastError("Couldn't create the jpeg2000 image for upload.");
+ llinfos << "Couldn't create output file : " << out_filename << llendl;
+ return FALSE;
+ }
+ // Test to see if the encode and save worked
LLPointer<LLImageJ2C> integrity_test = new LLImageJ2C;
- if( !integrity_test->loadAndValidate( out_filename ) )
+ if (!integrity_test->loadAndValidate( out_filename ))
{
- llinfos << "Image: " << out_filename << " is corrupt." << llendl;
+ image->setLastError("The created jpeg2000 image is corrupt.");
+ llinfos << "Image file : " << out_filename << " is corrupt" << llendl;
return FALSE;
}
-
return TRUE;
}
@@ -1034,7 +1001,25 @@ LLPointer<LLImageJ2C> LLViewerTextureList::convertToUploadFile(LLPointer<LLImage
(raw_image->getWidth() * raw_image->getHeight() <= LL_IMAGE_REZ_LOSSLESS_CUTOFF * LL_IMAGE_REZ_LOSSLESS_CUTOFF))
compressedImage->setReversible(TRUE);
- compressedImage->encode(raw_image, 0.0f);
+
+ if (gSavedSettings.getBOOL("Jpeg2000AdvancedCompression"))
+ {
+ // This test option will create jpeg2000 images with precincts for each level, RPCL ordering
+ // and PLT markers. The block size is also optionally modifiable.
+ // Note: the images hence created are compatible with older versions of the viewer.
+ // Read the blocks and precincts size settings
+ S32 block_size = gSavedSettings.getS32("Jpeg2000BlocksSize");
+ S32 precinct_size = gSavedSettings.getS32("Jpeg2000PrecinctsSize");
+ llinfos << "Advanced JPEG2000 Compression: precinct = " << precinct_size << ", block = " << block_size << llendl;
+ compressedImage->initEncode(*raw_image, block_size, precinct_size, 0);
+ }
+
+ if (!compressedImage->encode(raw_image, 0.0f))
+ {
+ llinfos << "convertToUploadFile : encode returns with error!!" << llendl;
+ // Clear up the pointer so we don't leak that one
+ compressedImage = NULL;
+ }
return compressedImage;
}
diff --git a/indra/newview/llviewertexturelist.h b/indra/newview/llviewertexturelist.h
index d508ce1ac6..d02b6be6b5 100644
--- a/indra/newview/llviewertexturelist.h
+++ b/indra/newview/llviewertexturelist.h
@@ -83,6 +83,7 @@ public:
void dump();
void destroyGL(BOOL save_state = TRUE);
void restoreGL();
+ BOOL isInitialized() const {return mInitialized;}
LLViewerFetchedTexture *findImage(const LLUUID &image_id);
@@ -120,8 +121,8 @@ private:
void addImage(LLViewerFetchedTexture *image);
void deleteImage(LLViewerFetchedTexture *image);
- void addImageToList(LLViewerFetchedTexture *image);
- void removeImageFromList(LLViewerFetchedTexture *image);
+ void addImageToList(LLViewerFetchedTexture *image, U32 thread_id = LLThread::currentID());
+ void removeImageFromList(LLViewerFetchedTexture *image, U32 thread_id = LLThread::currentID());
LLViewerFetchedTexture * getImage(const LLUUID &image_id,
BOOL usemipmap = TRUE,
@@ -187,6 +188,7 @@ private:
// simply holds on to LLViewerFetchedTexture references to stop them from being purged too soon
std::set<LLPointer<LLViewerFetchedTexture> > mImagePreloads;
+ BOOL mInitialized ;
BOOL mUpdateStats;
S32 mMaxResidentTexMemInMegaBytes;
S32 mMaxTotalTextureMemInMegaBytes;
@@ -206,30 +208,33 @@ public:
private:
static S32 sNumImages;
static void (*sUUIDCallback)(void**, const LLUUID &);
+
+ //debug use
+ static U32 sRenderThreadID;
};
class LLUIImageList : public LLImageProviderInterface, public LLSingleton<LLUIImageList>
{
public:
// LLImageProviderInterface
- /*virtual*/ LLUIImagePtr getUIImageByID(const LLUUID& id, S32 priority);
- /*virtual*/ LLUIImagePtr getUIImage(const std::string& name, S32 priority);
+ /*virtual*/ LLPointer<LLUIImage> getUIImageByID(const LLUUID& id, S32 priority);
+ /*virtual*/ LLPointer<LLUIImage> getUIImage(const std::string& name, S32 priority);
void cleanUp();
bool initFromFile();
- LLUIImagePtr preloadUIImage(const std::string& name, const std::string& filename, BOOL use_mips, const LLRect& scale_rect);
+ LLPointer<LLUIImage> preloadUIImage(const std::string& name, const std::string& filename, BOOL use_mips, const LLRect& scale_rect);
static void onUIImageLoaded( BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* src_aux, S32 discard_level, BOOL final, void* userdata );
private:
- LLUIImagePtr loadUIImageByName(const std::string& name, const std::string& filename,
+ LLPointer<LLUIImage> loadUIImageByName(const std::string& name, const std::string& filename,
BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null,
LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_UI);
- LLUIImagePtr loadUIImageByID(const LLUUID& id,
+ LLPointer<LLUIImage> loadUIImageByID(const LLUUID& id,
BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null,
LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_UI);
- LLUIImagePtr loadUIImage(LLViewerFetchedTexture* imagep, const std::string& name, BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null);
+ LLPointer<LLUIImage> loadUIImage(LLViewerFetchedTexture* imagep, const std::string& name, BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null);
struct LLUIImageLoadData
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index 4305349ea2..34d15a597e 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -25,7 +25,6 @@
*/
#include "llviewerprecompiledheaders.h"
-
#include "llviewerwindow.h"
#if LL_WINDOWS
@@ -41,6 +40,7 @@
#include "llagent.h"
#include "llagentcamera.h"
#include "llfloaterreg.h"
+#include "llmeshrepository.h"
#include "llpanellogin.h"
#include "llviewerkeyboard.h"
#include "llviewermenu.h"
@@ -79,6 +79,7 @@
#include "lltooltip.h"
#include "llmediaentry.h"
#include "llurldispatcher.h"
+#include "raytrace.h"
// newview includes
#include "llagent.h"
@@ -227,6 +228,8 @@ LLVector2 gDebugRaycastTexCoord;
LLVector3 gDebugRaycastNormal;
LLVector3 gDebugRaycastBinormal;
S32 gDebugRaycastFaceHit;
+LLVector3 gDebugRaycastStart;
+LLVector3 gDebugRaycastEnd;
// HUD display lines in lower right
BOOL gDisplayWindInfo = FALSE;
@@ -234,17 +237,12 @@ BOOL gDisplayCameraPos = FALSE;
BOOL gDisplayFOV = FALSE;
BOOL gDisplayBadge = FALSE;
-S32 CHAT_BAR_HEIGHT = 28;
-S32 OVERLAY_BAR_HEIGHT = 20;
-
-const U8 NO_FACE = 255;
+static const U8 NO_FACE = 255;
BOOL gQuietSnapshot = FALSE;
const F32 MIN_AFK_TIME = 2.f; // minimum time after setting away state before coming back
-const F32 MAX_FAST_FRAME_TIME = 0.5f;
-const F32 FAST_FRAME_INCREMENT = 0.1f;
-const F32 MIN_DISPLAY_SCALE = 0.75f;
+static const F32 MIN_DISPLAY_SCALE = 0.75f;
std::string LLViewerWindow::sSnapshotBaseName;
std::string LLViewerWindow::sSnapshotDir;
@@ -329,7 +327,7 @@ public:
mTextColor = LLColor4( 0.86f, 0.86f, 0.86f, 1.f );
// Draw stuff growing up from right lower corner of screen
- U32 xpos = mWindow->getWindowWidthScaled() - 350;
+ U32 xpos = mWindow->getWorldViewWidthScaled() - 350;
U32 ypos = 64;
const U32 y_inc = 20;
@@ -463,6 +461,79 @@ public:
addText(xpos, ypos, "Shaders Disabled");
ypos += y_inc;
}
+
+ if (gGLManager.mHasATIMemInfo)
+ {
+ S32 meminfo[4];
+ glGetIntegerv(GL_TEXTURE_FREE_MEMORY_ATI, meminfo);
+
+ addText(xpos, ypos, llformat("%.2f MB Texture Memory Free", meminfo[0]/1024.f));
+ ypos += y_inc;
+
+ if (gGLManager.mHasVertexBufferObject)
+ {
+ glGetIntegerv(GL_VBO_FREE_MEMORY_ATI, meminfo);
+ addText(xpos, ypos, llformat("%.2f MB VBO Memory Free", meminfo[0]/1024.f));
+ ypos += y_inc;
+ }
+ }
+ else if (gGLManager.mHasNVXMemInfo)
+ {
+ S32 free_memory;
+ glGetIntegerv(GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX, &free_memory);
+ addText(xpos, ypos, llformat("%.2f MB Video Memory Free", free_memory/1024.f));
+ ypos += y_inc;
+ }
+
+ //show streaming cost/triangle count of known prims in current region OR selection
+ {
+ F32 cost = 0.f;
+ S32 count = 0;
+ S32 object_count = 0;
+ S32 total_bytes = 0;
+ S32 visible_bytes = 0;
+
+ const char* label = "Region";
+ if (LLSelectMgr::getInstance()->getSelection()->getObjectCount() == 0)
+ { //region
+ LLViewerRegion* region = gAgent.getRegion();
+ if (region)
+ {
+ for (U32 i = 0; i < gObjectList.getNumObjects(); ++i)
+ {
+ LLViewerObject* object = gObjectList.getObject(i);
+ if (object &&
+ object->getRegion() == region &&
+ object->getVolume())
+ {
+ object_count++;
+ S32 bytes = 0;
+ S32 visible = 0;
+ cost += object->getStreamingCost(&bytes, &visible);
+ count += object->getTriangleCount();
+ total_bytes += bytes;
+ visible_bytes += visible;
+ }
+ }
+ }
+ }
+ else
+ {
+ label = "Selection";
+ cost = LLSelectMgr::getInstance()->getSelection()->getSelectedObjectStreamingCost(&total_bytes, &visible_bytes);
+ count = LLSelectMgr::getInstance()->getSelection()->getSelectedObjectTriangleCount();
+ object_count = LLSelectMgr::getInstance()->getSelection()->getObjectCount();
+ }
+
+ 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));
+ ypos += y_inc;
+
+ }
+
addText(xpos, ypos, llformat("%d MB Vertex Data", LLVertexBuffer::sAllocatedBytes/(1024*1024)));
ypos += y_inc;
@@ -515,6 +586,12 @@ public:
ypos += y_inc;
+ if (!LLSpatialGroup::sPendingQueries.empty())
+ {
+ addText(xpos,ypos, llformat("%d Queries pending", LLSpatialGroup::sPendingQueries.size()));
+ ypos += y_inc;
+ }
+
addText(xpos,ypos, llformat("%d Avatars visible", LLVOAvatar::sNumVisibleAvatars));
@@ -524,6 +601,22 @@ public:
ypos += y_inc;
+ if (gSavedSettings.getBOOL("MeshEnabled"))
+ {
+ addText(xpos, ypos, llformat("%.3f MB Mesh Data Received", LLMeshRepository::sBytesReceived/(1024.f*1024.f)));
+
+ ypos += y_inc;
+
+ addText(xpos, ypos, llformat("%d/%d Mesh HTTP Requests/Retries", LLMeshRepository::sHTTPRequestCount,
+ LLMeshRepository::sHTTPRetryCount));
+
+ ypos += y_inc;
+
+ addText(xpos, ypos, llformat("%.3f/%.3f MB Mesh Cache Read/Write ", LLMeshRepository::sCacheBytesRead/(1024.f*1024.f), LLMeshRepository::sCacheBytesWritten/(1024.f*1024.f)));
+
+ ypos += y_inc;
+ }
+
LLVertexBuffer::sBindCount = LLImageGL::sBindCount =
LLVertexBuffer::sSetCount = LLImageGL::sUniqueCount =
gPipeline.mNumVisibleNodes = LLPipeline::sVisibleLightCount = 0;
@@ -614,6 +707,7 @@ public:
ypos += y_inc;
}
}
+
if(log_texture_traffic)
{
U32 old_y = ypos ;
@@ -630,6 +724,52 @@ public:
addText(xpos, ypos, "Network traffic for textures:");
ypos += y_inc;
}
+ }
+
+ 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())
+ {
+ for (std::vector<LLMeshUploadThread*>::iterator iter = gMeshRepo.mUploads.begin();
+ iter != gMeshRepo.mUploads.end(); ++iter)
+ {
+ 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()));
+ ypos += y_inc;
+ }
+ }
+
+ if (!gMeshRepo.mPendingRequests.empty() ||
+ !gMeshRepo.mThread->mHeaderReqQ.empty() ||
+ !gMeshRepo.mThread->mLODReqQ.empty())
+ {
+ LLMutexLock lock(gMeshRepo.mThread->mMutex);
+ S32 pending = (S32) gMeshRepo.mPendingRequests.size();
+ S32 header = (S32) gMeshRepo.mThread->mHeaderReqQ.size();
+ S32 lod = (S32) gMeshRepo.mThread->mLODReqQ.size();
+
+ addText(xpos, ypos, llformat ("Mesh Queue - %d pending (%d:%d header | %d:%d LOD)",
+ pending,
+ LLMeshRepoThread::sActiveHeaderRequests, header,
+ LLMeshRepoThread::sActiveLODRequests, lod));
+
+ ypos += y_inc;
}
if (gSavedSettings.getBOOL("DebugShowTextureInfo"))
@@ -1436,7 +1576,7 @@ LLViewerWindow::LLViewerWindow(
gSavedSettings.getBOOL("DisableVerticalSync"),
!gHeadlessClient,
ignore_pixel_depth,
- gSavedSettings.getBOOL("RenderUseFBO") ? 0 : gSavedSettings.getU32("RenderFSAASamples")); //don't use window level anti-aliasing if FBOs are enabled
+ gSavedSettings.getBOOL("RenderDeferred") ? 0 : gSavedSettings.getU32("RenderFSAASamples")); //don't use window level anti-aliasing if FBOs are enabled
if (!LLAppViewer::instance()->restoreErrorTrap())
{
@@ -1498,6 +1638,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())
@@ -2608,7 +2749,9 @@ void LLViewerWindow::updateUI()
&gDebugRaycastIntersection,
&gDebugRaycastTexCoord,
&gDebugRaycastNormal,
- &gDebugRaycastBinormal);
+ &gDebugRaycastBinormal,
+ &gDebugRaycastStart,
+ &gDebugRaycastEnd);
}
updateMouseDelta();
@@ -3543,7 +3686,9 @@ LLViewerObject* LLViewerWindow::cursorIntersect(S32 mouse_x, S32 mouse_y, F32 de
LLVector3 *intersection,
LLVector2 *uv,
LLVector3 *normal,
- LLVector3 *binormal)
+ LLVector3 *binormal,
+ LLVector3* start,
+ LLVector3* end)
{
S32 x = mouse_x;
S32 y = mouse_y;
@@ -3575,7 +3720,22 @@ LLViewerObject* LLViewerWindow::cursorIntersect(S32 mouse_x, S32 mouse_y, F32 de
LLVector3 mouse_world_start = mouse_point_global;
LLVector3 mouse_world_end = mouse_point_global + mouse_direction_global * depth;
-
+ if (!LLViewerJoystick::getInstance()->getOverrideCamera())
+ { //always set raycast intersection to mouse_world_end unless
+ //flycam is on (for DoF effect)
+ gDebugRaycastIntersection = mouse_world_end;
+ }
+
+ if (start)
+ {
+ *start = mouse_world_start;
+ }
+
+ if (end)
+ {
+ *end = mouse_world_end;
+ }
+
LLViewerObject* found = NULL;
if (this_object) // check only this object
@@ -3587,8 +3747,7 @@ LLViewerObject* LLViewerWindow::cursorIntersect(S32 mouse_x, S32 mouse_y, F32 de
{
found = this_object;
}
- }
-
+ }
else // is a world object
{
if (this_object->lineSegmentIntersect(mouse_world_start, mouse_world_end, this_face, pick_transparent,
@@ -3596,21 +3755,22 @@ LLViewerObject* LLViewerWindow::cursorIntersect(S32 mouse_x, S32 mouse_y, F32 de
{
found = this_object;
}
- }
- }
-
+ }
+ }
else // check ALL objects
- {
+ {
found = gPipeline.lineSegmentIntersectInHUD(mouse_hud_start, mouse_hud_end, pick_transparent,
face_hit, intersection, uv, normal, binormal);
if (!found) // if not found in HUD, look in world:
-
- {
+ {
found = gPipeline.lineSegmentIntersectInWorld(mouse_world_start, mouse_world_end, pick_transparent,
face_hit, intersection, uv, normal, binormal);
+ if (found && !pick_transparent)
+ {
+ gDebugRaycastIntersection = *intersection;
}
-
+ }
}
return found;
@@ -3968,7 +4128,9 @@ BOOL LLViewerWindow::thumbnailSnapshot(LLImageRaw *raw, S32 preview_width, S32 p
return rawSnapshot(raw, preview_width, preview_height, FALSE, FALSE, show_ui, do_rebuild, type);
}
-// Saves the image from the screen to the specified filename and path.
+// Saves the image from the screen to a raw image
+// Since the required size might be bigger than the available screen, this method rerenders the scene in parts (called subimages) and copy
+// the results over to the final raw image.
BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_height,
BOOL keep_window_aspect, BOOL is_texture, BOOL show_ui, BOOL do_rebuild, ESnapshotType type, S32 max_size)
{
@@ -3986,8 +4148,6 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei
// Hide all the UI widgets first and draw a frame
BOOL prev_draw_ui = gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_UI) ? TRUE : FALSE;
- show_ui = show_ui ? TRUE : FALSE;
-
if ( prev_draw_ui != show_ui)
{
LLPipeline::toggleRenderDebugFeature((void*)LLPipeline::RENDER_DEBUG_FEATURE_UI);
@@ -4007,55 +4167,49 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei
// from window
LLRect window_rect = show_ui ? getWindowRectRaw() : getWorldViewRectRaw();
- S32 snapshot_width = window_rect.getWidth();
+ S32 snapshot_width = window_rect.getWidth();
S32 snapshot_height = window_rect.getHeight();
// SNAPSHOT
- S32 window_width = snapshot_width;
+ S32 window_width = snapshot_width;
S32 window_height = snapshot_height;
+ // Note: Scaling of the UI is currently *not* supported so we limit the output size if UI is requested
if (show_ui)
{
- image_width = llmin(image_width, window_width);
+ // If the user wants the UI, limit the output size to the available screen size
+ image_width = llmin(image_width, window_width);
image_height = llmin(image_height, window_height);
}
F32 scale_factor = 1.0f ;
- if(!keep_window_aspect) //image cropping
- {
+ if (!keep_window_aspect || (image_width > window_width) || (image_height > window_height))
+ {
+ // if image cropping or need to enlarge the scene, compute a scale_factor
F32 ratio = llmin( (F32)window_width / image_width , (F32)window_height / image_height) ;
- snapshot_width = (S32)(ratio * image_width) ;
+ snapshot_width = (S32)(ratio * image_width) ;
snapshot_height = (S32)(ratio * image_height) ;
scale_factor = llmax(1.0f, 1.0f / ratio) ;
}
- else //the scene(window) proportion needs to be maintained.
- {
- if(image_width > window_width || image_height > window_height) //need to enlarge the scene
- {
- F32 ratio = llmin( (F32)window_width / image_width , (F32)window_height / image_height) ;
- snapshot_width = (S32)(ratio * image_width) ;
- snapshot_height = (S32)(ratio * image_height) ;
- scale_factor = llmax(1.0f, 1.0f / ratio) ;
- }
- }
if (show_ui && scale_factor > 1.f)
{
+ // Note: we should never get there...
llwarns << "over scaling UI not supported." << llendl;
}
- S32 buffer_x_offset = llfloor(((window_width - snapshot_width) * scale_factor) / 2.f);
+ S32 buffer_x_offset = llfloor(((window_width - snapshot_width) * scale_factor) / 2.f);
S32 buffer_y_offset = llfloor(((window_height - snapshot_height) * scale_factor) / 2.f);
- S32 image_buffer_x = llfloor(snapshot_width*scale_factor) ;
- S32 image_buffer_y = llfloor(snapshot_height *scale_factor) ;
+ S32 image_buffer_x = llfloor(snapshot_width * scale_factor) ;
+ S32 image_buffer_y = llfloor(snapshot_height * scale_factor) ;
- if(image_buffer_x > max_size || image_buffer_y > max_size) //boundary check to avoid memory overflow
+ if ((image_buffer_x > max_size) || (image_buffer_y > max_size)) // boundary check to avoid memory overflow
{
scale_factor *= llmin((F32)max_size / image_buffer_x, (F32)max_size / image_buffer_y) ;
- image_buffer_x = llfloor(snapshot_width*scale_factor) ;
- image_buffer_y = llfloor(snapshot_height *scale_factor) ;
+ image_buffer_x = llfloor(snapshot_width * scale_factor) ;
+ image_buffer_y = llfloor(snapshot_height * scale_factor) ;
}
- if(image_buffer_x > 0 && image_buffer_y > 0)
+ if ((image_buffer_x > 0) && (image_buffer_y > 0))
{
raw->resize(image_buffer_x, image_buffer_y, 3);
}
@@ -4063,7 +4217,7 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei
{
return FALSE ;
}
- if(raw->isBufferInvalid())
+ if (raw->isBufferInvalid())
{
return FALSE ;
}
@@ -4071,6 +4225,7 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei
BOOL high_res = scale_factor >= 2.f; // Font scaling is slow, only do so if rez is much higher
if (high_res && show_ui)
{
+ // Note: we should never get there...
llwarns << "High res UI snapshot not supported. " << llendl;
/*send_agent_pause();
//rescale fonts
@@ -4085,6 +4240,8 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei
gObjectList.generatePickList(*LLViewerCamera::getInstance());
+ // Subimages are in fact partial rendering of the final view. This happens when the final view is bigger than the screen.
+ // In most common cases, scale_factor is 1 and there's no more than 1 iteration on x and y
for (int subimage_y = 0; subimage_y < scale_factor; ++subimage_y)
{
S32 subimage_y_offset = llclamp(buffer_y_offset - (subimage_y * window_height), 0, window_height);;
@@ -4098,69 +4255,70 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei
gDisplaySwapBuffers = FALSE;
gDepthDirty = TRUE;
- const U32 subfield = subimage_x+(subimage_y*llceil(scale_factor));
-
- if (LLPipeline::sRenderDeferred)
- {
- display(do_rebuild, scale_factor, subfield, TRUE);
- }
- else
- {
- display(do_rebuild, scale_factor, subfield, TRUE);
- // Required for showing the GUI in snapshots and performing bloom composite overlay
- // Call even if show_ui is FALSE
- render_ui(scale_factor, subfield);
- }
-
S32 subimage_x_offset = llclamp(buffer_x_offset - (subimage_x * window_width), 0, window_width);
// handle fractional rows
U32 read_width = llmax(0, (window_width - subimage_x_offset) -
llmax(0, (window_width * (subimage_x + 1)) - (buffer_x_offset + raw->getWidth())));
- for(U32 out_y = 0; out_y < read_height ; out_y++)
+
+ // Skip rendering and sampling altogether if either width or height is degenerated to 0 (common in cropping cases)
+ if (read_width && read_height)
{
- S32 output_buffer_offset = (
- (out_y * (raw->getWidth())) // ...plus iterated y...
- + (window_width * subimage_x) // ...plus subimage start in x...
- + (raw->getWidth() * window_height * subimage_y) // ...plus subimage start in y...
- - output_buffer_offset_x // ...minus buffer padding x...
- - (output_buffer_offset_y * (raw->getWidth())) // ...minus buffer padding y...
- ) * raw->getComponents();
+ const U32 subfield = subimage_x+(subimage_y*llceil(scale_factor));
+ display(do_rebuild, scale_factor, subfield, TRUE);
- // Ping the wathdog thread every 100 lines to keep us alive (arbitrary number, feel free to change)
- if (out_y % 100 == 0)
+ if (!LLPipeline::sRenderDeferred)
{
- LLAppViewer::instance()->pingMainloopTimeout("LLViewerWindow::rawSnapshot");
+ // Required for showing the GUI in snapshots and performing bloom composite overlay
+ // Call even if show_ui is FALSE
+ render_ui(scale_factor, subfield);
}
- if (type == SNAPSHOT_TYPE_COLOR)
- {
- glReadPixels(
- subimage_x_offset, out_y + subimage_y_offset,
- read_width, 1,
- GL_RGB, GL_UNSIGNED_BYTE,
- raw->getData() + output_buffer_offset
- );
- }
- else // SNAPSHOT_TYPE_DEPTH
+ for (U32 out_y = 0; out_y < read_height ; out_y++)
{
- LLPointer<LLImageRaw> depth_line_buffer = new LLImageRaw(read_width, 1, sizeof(GL_FLOAT)); // need to store floating point values
- glReadPixels(
- subimage_x_offset, out_y + subimage_y_offset,
- read_width, 1,
- GL_DEPTH_COMPONENT, GL_FLOAT,
- depth_line_buffer->getData()// current output pixel is beginning of buffer...
- );
-
- for (S32 i = 0; i < (S32)read_width; i++)
+ S32 output_buffer_offset = (
+ (out_y * (raw->getWidth())) // ...plus iterated y...
+ + (window_width * subimage_x) // ...plus subimage start in x...
+ + (raw->getWidth() * window_height * subimage_y) // ...plus subimage start in y...
+ - output_buffer_offset_x // ...minus buffer padding x...
+ - (output_buffer_offset_y * (raw->getWidth())) // ...minus buffer padding y...
+ ) * raw->getComponents();
+
+ // Ping the watchdog thread every 100 lines to keep us alive (arbitrary number, feel free to change)
+ if (out_y % 100 == 0)
{
- F32 depth_float = *(F32*)(depth_line_buffer->getData() + (i * sizeof(F32)));
-
- F32 linear_depth_float = 1.f / (depth_conversion_factor_1 - (depth_float * depth_conversion_factor_2));
- U8 depth_byte = F32_to_U8(linear_depth_float, LLViewerCamera::getInstance()->getNear(), LLViewerCamera::getInstance()->getFar());
- //write converted scanline out to result image
- for(S32 j = 0; j < raw->getComponents(); j++)
+ LLAppViewer::instance()->pingMainloopTimeout("LLViewerWindow::rawSnapshot");
+ }
+
+ if (type == SNAPSHOT_TYPE_COLOR)
+ {
+ glReadPixels(
+ subimage_x_offset, out_y + subimage_y_offset,
+ read_width, 1,
+ GL_RGB, GL_UNSIGNED_BYTE,
+ raw->getData() + output_buffer_offset
+ );
+ }
+ else // SNAPSHOT_TYPE_DEPTH
+ {
+ LLPointer<LLImageRaw> depth_line_buffer = new LLImageRaw(read_width, 1, sizeof(GL_FLOAT)); // need to store floating point values
+ glReadPixels(
+ subimage_x_offset, out_y + subimage_y_offset,
+ read_width, 1,
+ GL_DEPTH_COMPONENT, GL_FLOAT,
+ depth_line_buffer->getData()// current output pixel is beginning of buffer...
+ );
+
+ for (S32 i = 0; i < (S32)read_width; i++)
{
- *(raw->getData() + output_buffer_offset + (i * raw->getComponents()) + j) = depth_byte;
+ F32 depth_float = *(F32*)(depth_line_buffer->getData() + (i * sizeof(F32)));
+
+ F32 linear_depth_float = 1.f / (depth_conversion_factor_1 - (depth_float * depth_conversion_factor_2));
+ U8 depth_byte = F32_to_U8(linear_depth_float, LLViewerCamera::getInstance()->getNear(), LLViewerCamera::getInstance()->getFar());
+ // write converted scanline out to result image
+ for (S32 j = 0; j < raw->getComponents(); j++)
+ {
+ *(raw->getData() + output_buffer_offset + (i * raw->getComponents()) + j) = depth_byte;
+ }
}
}
}
@@ -4579,6 +4737,7 @@ BOOL LLViewerWindow::changeDisplaySettings(LLCoordScreen size, BOOL disable_vsyn
//gResizeScreenTexture = TRUE;
+
//U32 fsaa = gSavedSettings.getU32("RenderFSAASamples");
//U32 old_fsaa = mWindow->getFSAASamples();
diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h
index 5eeb02b080..df6928aa1d 100644
--- a/indra/newview/llviewerwindow.h
+++ b/indra/newview/llviewerwindow.h
@@ -38,13 +38,12 @@
#include "v3dmath.h"
#include "v2math.h"
+#include "llcursortypes.h"
#include "llwindowcallbacks.h"
#include "lltimer.h"
#include "llstat.h"
#include "llmousehandler.h"
-#include "llcursortypes.h"
#include "llhandle.h"
-#include "llimage.h"
#include <boost/function.hpp>
#include <boost/signals2.hpp>
@@ -59,6 +58,7 @@ class LLTool;
class LLVelocityBar;
class LLPanel;
class LLImageRaw;
+class LLImageFormatted;
class LLHUDIcon;
class LLWindow;
class LLRootView;
@@ -346,7 +346,9 @@ public:
LLVector3 *intersection = NULL,
LLVector2 *uv = NULL,
LLVector3 *normal = NULL,
- LLVector3 *binormal = NULL);
+ LLVector3 *binormal = NULL,
+ LLVector3* start = NULL,
+ LLVector3* end = NULL);
// Returns a pointer to the last object hit
@@ -465,12 +467,6 @@ private:
LLPointer<LLViewerObject> mDragHoveredObject;
};
-void toggle_flying(void*);
-void toggle_first_person();
-void toggle_build(void*);
-void reset_viewer_state_on_sim(void);
-void update_saved_window_size(const std::string& control,S32 delta_width, S32 delta_height);
-
//
// Globals
//
@@ -486,8 +482,8 @@ extern LLVector2 gDebugRaycastTexCoord;
extern LLVector3 gDebugRaycastNormal;
extern LLVector3 gDebugRaycastBinormal;
extern S32 gDebugRaycastFaceHit;
-
-extern S32 CHAT_BAR_HEIGHT;
+extern LLVector3 gDebugRaycastStart;
+extern LLVector3 gDebugRaycastEnd;
extern BOOL gDisplayCameraPos;
extern BOOL gDisplayWindInfo;
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index f1934933b5..ec2b5a4c98 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -38,9 +38,9 @@
#include <ctype.h>
#include "llaudioengine.h"
-#include "llcachename.h"
#include "noise.h"
#include "sound_ids.h"
+#include "raytrace.h"
#include "llagent.h" // Get state values from here
#include "llagentcamera.h"
@@ -64,6 +64,8 @@
#include "llkeyframefallmotion.h"
#include "llkeyframestandmotion.h"
#include "llkeyframewalkmotion.h"
+#include "llmanipscale.h" // for get_default_max_prim_scale()
+#include "llmeshrepository.h"
#include "llmutelist.h"
#include "llmoveview.h"
#include "llnotificationsutil.h"
@@ -81,6 +83,7 @@
#include "llviewermenu.h"
#include "llviewerobjectlist.h"
#include "llviewerparcelmgr.h"
+#include "llviewershadermgr.h"
#include "llviewerstats.h"
#include "llvoavatarself.h"
#include "llvovolume.h"
@@ -679,12 +682,14 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id,
mTexHairColor( NULL ),
mTexEyeColor( NULL ),
mNeedsSkin(FALSE),
+ mLastSkinTime(0.f),
mUpdatePeriod(1),
mFullyLoaded(FALSE),
mPreviousFullyLoaded(FALSE),
mFullyLoadedInitialized(FALSE),
mSupportsAlphaLayers(FALSE),
- mLoadedCallbacksPaused(FALSE)
+ mLoadedCallbacksPaused(FALSE),
+ mHasPelvisOffset( FALSE )
{
LLMemType mt(LLMemType::MTYPE_AVATAR);
//VTResume(); // VTune
@@ -759,6 +764,10 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id,
mRuthTimer.reset();
mRuthDebugTimer.reset();
mDebugExistenceTimer.reset();
+ mPelvisOffset = LLVector3(0.0f,0.0f,0.0f);
+ mLastPelvisToFoot = 0.0f;
+ mPelvisFixup = 0.0f;
+ mLastPelvisFixup = 0.0f;
}
//------------------------------------------------------------------------
@@ -1322,7 +1331,17 @@ const LLVector3 LLVOAvatar::getRenderPosition() const
}
else if (isRoot())
{
- return mDrawable->getPositionAgent();
+ if ( !mHasPelvisOffset )
+ {
+ return mDrawable->getPositionAgent();
+ }
+ else
+ {
+ //Apply a pelvis fixup (as defined by the avs skin)
+ LLVector3 pos = mDrawable->getPositionAgent();
+ pos[VZ] += mPelvisFixup;
+ return pos;
+ }
}
else
{
@@ -1335,42 +1354,47 @@ void LLVOAvatar::updateDrawable(BOOL force_damped)
clearChanged(SHIFTED);
}
-void LLVOAvatar::onShift(const LLVector3& shift_vector)
+void LLVOAvatar::onShift(const LLVector4a& shift_vector)
{
- mLastAnimExtents[0] += shift_vector;
- mLastAnimExtents[1] += shift_vector;
+ const LLVector3& shift = reinterpret_cast<const LLVector3&>(shift_vector);
+ mLastAnimExtents[0] += shift;
+ mLastAnimExtents[1] += shift;
mNeedsImpostorUpdate = TRUE;
mNeedsAnimUpdate = TRUE;
}
-void LLVOAvatar::updateSpatialExtents(LLVector3& newMin, LLVector3 &newMax)
+void LLVOAvatar::updateSpatialExtents(LLVector4a& newMin, LLVector4a &newMax)
{
if (isImpostor() && !needsImpostorUpdate())
{
LLVector3 delta = getRenderPosition() -
- ((LLVector3(mDrawable->getPositionGroup())-mImpostorOffset));
+ ((LLVector3(mDrawable->getPositionGroup().getF32ptr())-mImpostorOffset));
- newMin = mLastAnimExtents[0] + delta;
- newMax = mLastAnimExtents[1] + delta;
+ newMin.load3( (mLastAnimExtents[0] + delta).mV);
+ newMax.load3( (mLastAnimExtents[1] + delta).mV);
}
else
{
getSpatialExtents(newMin,newMax);
- mLastAnimExtents[0] = newMin;
- mLastAnimExtents[1] = newMax;
- LLVector3 pos_group = (newMin+newMax)*0.5f;
- mImpostorOffset = pos_group-getRenderPosition();
+ mLastAnimExtents[0].set(newMin.getF32ptr());
+ mLastAnimExtents[1].set(newMax.getF32ptr());
+ LLVector4a pos_group;
+ pos_group.setAdd(newMin,newMax);
+ pos_group.mul(0.5f);
+ mImpostorOffset = LLVector3(pos_group.getF32ptr())-getRenderPosition();
mDrawable->setPositionGroup(pos_group);
}
}
-void LLVOAvatar::getSpatialExtents(LLVector3& newMin, LLVector3& newMax)
+void LLVOAvatar::getSpatialExtents(LLVector4a& newMin, LLVector4a& newMax)
{
- LLVector3 buffer(0.25f, 0.25f, 0.25f);
- LLVector3 pos = getRenderPosition();
- newMin = pos - buffer;
- newMax = pos + buffer;
- float max_attachment_span = DEFAULT_MAX_PRIM_SCALE * 5.0f;
+ LLVector4a buffer(0.25f);
+ LLVector4a pos;
+ pos.load3(getRenderPosition().mV);
+ newMin.setSub(pos, buffer);
+ newMax.setAdd(pos, buffer);
+
+ float max_attachment_span = get_default_max_prim_scale() * 5.0f;
//stretch bounding box by joint positions
for (polymesh_map_t::iterator i = mMeshes.begin(); i != mMeshes.end(); ++i)
@@ -1378,12 +1402,20 @@ void LLVOAvatar::getSpatialExtents(LLVector3& newMin, LLVector3& newMax)
LLPolyMesh* mesh = i->second;
for (S32 joint_num = 0; joint_num < mesh->mJointRenderData.count(); joint_num++)
{
- update_min_max(newMin, newMax,
- mesh->mJointRenderData[joint_num]->mWorldMatrix->getTranslation());
+ LLVector4a trans;
+ trans.load3( mesh->mJointRenderData[joint_num]->mWorldMatrix->getTranslation().mV);
+ update_min_max(newMin, newMax, trans);
}
}
- mPixelArea = LLPipeline::calcPixelArea((newMin+newMax)*0.5f, (newMax-newMin)*0.5f, *LLViewerCamera::getInstance());
+ LLVector4a center, size;
+ center.setAdd(newMin, newMax);
+ center.mul(0.5f);
+
+ size.setSub(newMax,newMin);
+ size.mul(0.5f);
+
+ mPixelArea = LLPipeline::calcPixelArea(center, size, *LLViewerCamera::getInstance());
//stretch bounding box by attachments
for (attachment_map_t::iterator iter = mAttachmentPoints.begin();
@@ -1405,20 +1437,22 @@ void LLVOAvatar::getSpatialExtents(LLVector3& newMin, LLVector3& newMax)
if (attached_object && !attached_object->isHUDAttachment())
{
LLDrawable* drawable = attached_object->mDrawable;
- if (drawable)
+ if (drawable && !drawable->isState(LLDrawable::RIGGED))
{
LLSpatialBridge* bridge = drawable->getSpatialBridge();
if (bridge)
{
- const LLVector3* ext = bridge->getSpatialExtents();
- LLVector3 distance = (ext[1] - ext[0]);
+ const LLVector4a* ext = bridge->getSpatialExtents();
+ LLVector4a distance;
+ distance.setSub(ext[1], ext[0]);
+ LLVector4a max_span(max_attachment_span);
+
+ S32 lt = distance.lessThan(max_span).getGatheredBits() & 0x7;
// Only add the prim to spatial extents calculations if it isn't a megaprim.
// max_attachment_span calculated at the start of the function
// (currently 5 times our max prim size)
- if (distance.mV[0] < max_attachment_span
- && distance.mV[1] < max_attachment_span
- && distance.mV[2] < max_attachment_span)
+ if (lt == 0x7)
{
update_min_max(newMin,newMax,ext[0]);
update_min_max(newMin,newMax,ext[1]);
@@ -1430,8 +1464,9 @@ void LLVOAvatar::getSpatialExtents(LLVector3& newMin, LLVector3& newMax)
}
//pad bounding box
- newMin -= buffer;
- newMax += buffer;
+
+ newMin.sub(buffer);
+ newMax.add(buffer);
}
//-----------------------------------------------------------------------------
@@ -1606,7 +1641,8 @@ BOOL LLVOAvatar::setupBone(const LLVOAvatarBoneInfo* info, LLViewerJoint* parent
info->mRot.mV[VZ], LLQuaternion::XYZ));
joint->setScale(info->mScale);
-
+ joint->setDefaultFromCurrentXform();
+
if (info->mIsJoint)
{
joint->setSkinOffset( info->mPivot );
@@ -1984,26 +2020,29 @@ void LLVOAvatar::updateMeshData()
bool terse_update = false;
- if(facep->mVertexBuffer.isNull())
+ facep->setGeomIndex(0);
+ facep->setIndicesIndex(0);
+
+ LLVertexBuffer* buff = facep->getVertexBuffer();
+ if(!facep->getVertexBuffer())
{
- facep->mVertexBuffer = new LLVertexBufferAvatar();
- facep->mVertexBuffer->allocateBuffer(num_vertices, num_indices, TRUE);
+ buff = new LLVertexBufferAvatar();
+ buff->allocateBuffer(num_vertices, num_indices, TRUE);
+ facep->setVertexBuffer(buff);
}
else
{
- if (facep->mVertexBuffer->getRequestedIndices() == num_indices &&
- facep->mVertexBuffer->getRequestedVerts() == num_vertices)
+ if (buff->getRequestedIndices() == num_indices &&
+ buff->getRequestedVerts() == num_vertices)
{
terse_update = true;
}
else
{
- facep->mVertexBuffer->resizeBuffer(num_vertices, num_indices) ;
- }
+ buff->resizeBuffer(num_vertices, num_indices);
+ }
}
-
- facep->setGeomIndex(0);
- facep->setIndicesIndex(0);
+
// This is a hack! Avatars have their own pool, so we are detecting
// the case of more than one avatar in the pool (thus > 0 instead of >= 0)
@@ -2018,7 +2057,7 @@ void LLVOAvatar::updateMeshData()
}
stop_glerror();
- facep->mVertexBuffer->setBuffer(0);
+ buff->setBuffer(0);
if(!f_num)
{
@@ -2386,9 +2425,19 @@ void LLVOAvatar::idleUpdateVoiceVisualizer(bool voice_enabled)
// here we get the approximate head position and set as sound source for the voice symbol
// (the following version uses a tweak of "mHeadOffset" which handle sitting vs. standing)
//--------------------------------------------------------------------------------------------
- LLVector3 headOffset = LLVector3( 0.0f, 0.0f, mHeadOffset.mV[2] );
- mVoiceVisualizer->setVoiceSourceWorldPosition( mRoot.getWorldPosition() + headOffset );
+ if ( mIsSitting )
+ {
+ LLVector3 headOffset = LLVector3( 0.0f, 0.0f, mHeadOffset.mV[2] );
+ mVoiceVisualizer->setVoiceSourceWorldPosition( mRoot.getWorldPosition() + headOffset );
+ }
+ else
+ {
+ LLVector3 tagPos = mRoot.getWorldPosition();
+ tagPos[VZ] -= mPelvisToFoot;
+ tagPos[VZ] += ( mBodySize[VZ] + 0.125f );
+ mVoiceVisualizer->setVoiceSourceWorldPosition( tagPos );
+ }
}//if ( voiceEnabled )
}
@@ -2452,7 +2501,7 @@ void LLVOAvatar::idleUpdateMisc(bool detailed_update)
if (isImpostor() && !mNeedsImpostorUpdate)
{
- LLVector3 ext[2];
+ LLVector4a ext[2];
F32 distance;
LLVector3 angle;
@@ -2481,12 +2530,22 @@ void LLVOAvatar::idleUpdateMisc(bool detailed_update)
}
else
{
+ //VECTORIZE THIS
getSpatialExtents(ext[0], ext[1]);
- if ((ext[1]-mImpostorExtents[1]).length() > 0.05f ||
- (ext[0]-mImpostorExtents[0]).length() > 0.05f)
+ LLVector4a diff;
+ diff.setSub(ext[1], mImpostorExtents[1]);
+ if (diff.getLength3().getF32() > 0.05f)
{
mNeedsImpostorUpdate = TRUE;
}
+ else
+ {
+ diff.setSub(ext[0], mImpostorExtents[0]);
+ if (diff.getLength3().getF32() > 0.05f)
+ {
+ mNeedsImpostorUpdate = TRUE;
+ }
+ }
}
}
}
@@ -2825,10 +2884,8 @@ void LLVOAvatar::idleUpdateNameTag(const LLVector3& root_pos_last)
}
LLVector3 name_position = idleUpdateNameTagPosition(root_pos_last);
- mNameText->setPositionAgent(name_position);
-
- idleUpdateNameTagText(new_name);
-
+ mNameText->setPositionAgent(name_position);
+ idleUpdateNameTagText(new_name);
idleUpdateNameTagAlpha(new_name, alpha);
}
@@ -3114,8 +3171,9 @@ void LLVOAvatar::invalidateNameTags()
if (avatar->isDead()) continue;
avatar->clearNameTag();
- }
- }
+
+ }
+}
// Compute name tag position during idle update
LLVector3 LLVOAvatar::idleUpdateNameTagPosition(const LLVector3& root_pos_last)
@@ -3134,12 +3192,14 @@ LLVector3 LLVOAvatar::idleUpdateNameTagPosition(const LLVector3& root_pos_last)
local_camera_up.scaleVec(mBodySize * 0.5f);
local_camera_at.scaleVec(mBodySize * 0.5f);
- LLVector3 name_position = mRoot.getWorldPosition() +
- (local_camera_up * root_rot) -
- (projected_vec(local_camera_at * root_rot, camera_to_av));
+ LLVector3 name_position = mRoot.getWorldPosition();
+ name_position[VZ] -= mPelvisToFoot;
+ name_position[VZ] += (mBodySize[VZ]* 0.55f);
+ name_position += (local_camera_up * root_rot) - (projected_vec(local_camera_at * root_rot, camera_to_av));
name_position += pixel_up_vec * 15.f;
+
return name_position;
- }
+}
void LLVOAvatar::idleUpdateNameTagAlpha(BOOL new_name, F32 alpha)
{
@@ -3260,20 +3320,28 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)
mTimeVisible.reset();
}
-
+
//--------------------------------------------------------------------
// the rest should only be done occasionally for far away avatars
//--------------------------------------------------------------------
if (visible && !isSelf() && !mIsDummy && sUseImpostors && !mNeedsAnimUpdate && !sFreezeCounter)
{
+ const LLVector4a* ext = mDrawable->getSpatialExtents();
+ LLVector4a size;
+ size.setSub(ext[1],ext[0]);
+ F32 mag = size.getLength3().getF32()*0.5f;
+
F32 impostor_area = 256.f*512.f*(8.125f - LLVOAvatar::sLODFactor*8.f);
if (LLMuteList::getInstance()->isMuted(getID()))
{ // muted avatars update at 16 hz
mUpdatePeriod = 16;
}
- else if (mVisibilityRank <= LLVOAvatar::sMaxVisible)
+ else if (mVisibilityRank <= LLVOAvatar::sMaxVisible ||
+ mDrawable->mDistanceWRTCamera < 1.f + mag)
{ //first 25% of max visible avatars are not impostored
+ //also, don't impostor avatars whose bounding box may be penetrating the
+ //impostor camera near clip plane
mUpdatePeriod = 1;
}
else if (mVisibilityRank > LLVOAvatar::sMaxVisible * 4)
@@ -3384,7 +3452,7 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)
root_pos = gAgent.getPosGlobalFromAgent(getRenderPosition());
resolveHeightGlobal(root_pos, ground_under_pelvis, normal);
- F32 foot_to_ground = (F32) (root_pos.mdV[VZ] - mPelvisToFoot - ground_under_pelvis.mdV[VZ]);
+ F32 foot_to_ground = (F32) (root_pos.mdV[VZ] - mPelvisToFoot - ground_under_pelvis.mdV[VZ]);
BOOL in_air = ((!LLWorld::getInstance()->getRegionFromPosGlobal(ground_under_pelvis)) ||
foot_to_ground > FOOT_GROUND_COLLISION_TOLERANCE);
@@ -3398,13 +3466,12 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)
// of the agent's physical representation
root_pos.mdV[VZ] -= (0.5f * mBodySize.mV[VZ]) - mPelvisToFoot;
-
LLVector3 newPosition = gAgent.getPosAgentFromGlobal(root_pos);
if (newPosition != mRoot.getXform()->getWorldPosition())
{
mRoot.touch();
- mRoot.setWorldPosition(newPosition ); // regular update
+ mRoot.setWorldPosition( newPosition ); // regular update
}
@@ -3680,7 +3747,6 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)
return TRUE;
}
-
//-----------------------------------------------------------------------------
// updateHeadOffset()
//-----------------------------------------------------------------------------
@@ -3705,7 +3771,41 @@ void LLVOAvatar::updateHeadOffset()
mHeadOffset = lerp(midEyePt, mHeadOffset, u);
}
}
-
+//------------------------------------------------------------------------
+// setPelvisOffset
+//------------------------------------------------------------------------
+void LLVOAvatar::setPelvisOffset( bool hasOffset, const LLVector3& offsetAmount, F32 pelvisFixup )
+{
+ mHasPelvisOffset = hasOffset;
+ if ( mHasPelvisOffset )
+ {
+ //Store off last pelvis to foot value
+ mLastPelvisToFoot = mPelvisToFoot;
+ mPelvisOffset = offsetAmount;
+ mLastPelvisFixup = mPelvisFixup;
+ mPelvisFixup = pelvisFixup;
+ }
+}
+//------------------------------------------------------------------------
+// postPelvisSetRecalc
+//------------------------------------------------------------------------
+void LLVOAvatar::postPelvisSetRecalc( void )
+{
+ computeBodySize();
+ mRoot.touch();
+ mRoot.updateWorldMatrixChildren();
+ dirtyMesh();
+ updateHeadOffset();
+}
+//------------------------------------------------------------------------
+// pelisPoke
+//------------------------------------------------------------------------
+void LLVOAvatar::setPelvisOffset( F32 pelvisFixupAmount )
+{
+ mHasPelvisOffset = true;
+ mLastPelvisFixup = mPelvisFixup;
+ mPelvisFixup = pelvisFixupAmount;
+}
//------------------------------------------------------------------------
// updateVisibility()
//------------------------------------------------------------------------
@@ -3855,6 +3955,46 @@ bool LLVOAvatar::shouldAlphaMask()
}
+U32 LLVOAvatar::renderSkinnedAttachments()
+{
+ /*U32 num_indices = 0;
+
+ const U32 data_mask = LLVertexBuffer::MAP_VERTEX |
+ LLVertexBuffer::MAP_NORMAL |
+ LLVertexBuffer::MAP_TEXCOORD0 |
+ LLVertexBuffer::MAP_COLOR |
+ LLVertexBuffer::MAP_WEIGHT4;
+
+ for (attachment_map_t::const_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)
+ {
+ const LLViewerObject* attached_object = (*attachment_iter);
+ if (attached_object && !attached_object->isHUDAttachment())
+ {
+ const LLDrawable* drawable = attached_object->mDrawable;
+ if (drawable)
+ {
+ for (S32 i = 0; i < drawable->getNumFaces(); ++i)
+ {
+ LLFace* face = drawable->getFace(i);
+ if (face->isState(LLFace::RIGGED))
+ {
+
+ }
+ }
+ }
+ }
+
+ return num_indices;*/
+ return 0;
+}
+
//-----------------------------------------------------------------------------
// renderSkinned()
//-----------------------------------------------------------------------------
@@ -3869,7 +4009,7 @@ U32 LLVOAvatar::renderSkinned(EAvatarRenderPass pass)
LLFace* face = mDrawable->getFace(0);
- bool needs_rebuild = !face || face->mVertexBuffer.isNull() || mDrawable->isState(LLDrawable::REBUILD_GEOMETRY);
+ bool needs_rebuild = !face || !face->getVertexBuffer() || mDrawable->isState(LLDrawable::REBUILD_GEOMETRY);
if (needs_rebuild || mDirtyMesh)
{ //LOD changed or new mesh created, allocate new vertex buffer if needed
@@ -3902,8 +4042,9 @@ U32 LLVOAvatar::renderSkinned(EAvatarRenderPass pass)
mMeshLOD[MESH_ID_HAIR]->updateJointGeometry();
}
mNeedsSkin = FALSE;
-
- LLVertexBuffer* vb = mDrawable->getFace(0)->mVertexBuffer;
+ mLastSkinTime = gFrameTimeSeconds;
+
+ LLVertexBuffer* vb = mDrawable->getFace(0)->getVertexBuffer();
if (vb)
{
vb->setBuffer(0);
@@ -4250,7 +4391,7 @@ void LLVOAvatar::updateTextures()
if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_TEXTURE_AREA))
{
- setDebugText(llformat("%4.0f:%4.0f", fsqrtf(mMinPixelArea),fsqrtf(mMaxPixelArea)));
+ setDebugText(llformat("%4.0f:%4.0f", (F32) sqrt(mMinPixelArea),(F32) sqrt(mMaxPixelArea)));
}
}
@@ -4392,7 +4533,6 @@ void LLVOAvatar::resolveRayCollisionAgent(const LLVector3d start_pt, const LLVec
LLWorld::getInstance()->resolveStepHeightGlobal(this, start_pt, end_pt, out_pos, out_norm, &obj);
}
-
void LLVOAvatar::resolveHeightGlobal(const LLVector3d &inPos, LLVector3d &outPos, LLVector3 &outNorm)
{
LLVector3d zVec(0.0f, 0.0f, 0.5f);
@@ -4789,6 +4929,80 @@ LLJoint *LLVOAvatar::getJoint( const std::string &name )
}
//-----------------------------------------------------------------------------
+// resetJointPositions
+//-----------------------------------------------------------------------------
+void LLVOAvatar::resetJointPositions( void )
+{
+ for(S32 i = 0; i < (S32)mNumJoints; ++i)
+ {
+ mSkeleton[i].restoreOldXform();
+ mSkeleton[i].setId( LLUUID::null );
+ }
+ mHasPelvisOffset = false;
+ mPelvisFixup = mLastPelvisFixup;
+}
+//-----------------------------------------------------------------------------
+// resetSpecificJointPosition
+//-----------------------------------------------------------------------------
+void LLVOAvatar::resetSpecificJointPosition( const std::string& name )
+{
+ LLJoint* pJoint = mRoot.findJoint( name );
+
+ if ( pJoint && pJoint->doesJointNeedToBeReset() )
+ {
+ pJoint->restoreOldXform();
+ pJoint->setId( LLUUID::null );
+ //If we're reseting the pelvis position make sure not to apply offset
+ if ( name == "mPelvis" )
+ {
+ mHasPelvisOffset = false;
+ }
+ }
+ else
+ {
+ llinfos<<"Did not find "<< name.c_str()<<llendl;
+ }
+}
+//-----------------------------------------------------------------------------
+// resetJointPositionsToDefault
+//-----------------------------------------------------------------------------
+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 )
+ {
+ LLJoint* pJoint = (LLJoint*)&mSkeleton[i];
+ if ( pJoint->doesJointNeedToBeReset() )
+ {
+
+ pJoint->setId( LLUUID::null );
+ //restore joints to default positions, however skip over the pelvis
+ if ( pJoint && pPelvis != pJoint )
+ {
+ pJoint->restoreOldXform();
+ }
+ }
+ }
+ //make sure we don't apply the joint offset
+ mHasPelvisOffset = false;
+ mPelvisFixup = mLastPelvisFixup;
+ postPelvisSetRecalc();
+}
+//-----------------------------------------------------------------------------
// getCharacterPosition()
//-----------------------------------------------------------------------------
LLVector3 LLVOAvatar::getCharacterPosition()
@@ -5445,9 +5659,13 @@ void LLVOAvatar::setPixelAreaAndAngle(LLAgent &agent)
return;
}
- const LLVector3* ext = mDrawable->getSpatialExtents();
- LLVector3 center = (ext[1] + ext[0]) * 0.5f;
- LLVector3 size = (ext[1]-ext[0])*0.5f;
+ const LLVector4a* ext = mDrawable->getSpatialExtents();
+ LLVector4a center;
+ center.setAdd(ext[1], ext[0]);
+ center.mul(0.5f);
+ LLVector4a size;
+ size.setSub(ext[1], ext[0]);
+ size.mul(0.5f);
mImpostorPixelArea = LLPipeline::calcPixelArea(center, size, *LLViewerCamera::getInstance());
@@ -5459,7 +5677,7 @@ void LLVOAvatar::setPixelAreaAndAngle(LLAgent &agent)
}
else
{
- F32 radius = size.length();
+ F32 radius = size.getLength3().getF32();
mAppAngle = (F32) atan2( radius, range) * RAD_TO_DEG;
}
@@ -5770,6 +5988,52 @@ void LLVOAvatar::resetHUDAttachments()
}
}
+void LLVOAvatar::rebuildRiggedAttachments( void )
+{
+ for ( attachment_map_t::iterator iter = mAttachmentPoints.begin(); iter != mAttachmentPoints.end(); ++iter )
+ {
+ LLViewerJointAttachment* pAttachment = iter->second;
+ LLViewerJointAttachment::attachedobjs_vec_t::iterator attachmentIterEnd = pAttachment->mAttachedObjects.end();
+
+ for ( LLViewerJointAttachment::attachedobjs_vec_t::iterator attachmentIter = pAttachment->mAttachedObjects.begin();
+ attachmentIter != attachmentIterEnd; ++attachmentIter)
+ {
+ const LLViewerObject* pAttachedObject = *attachmentIter;
+ if ( pAttachment && pAttachedObject->mDrawable.notNull() )
+ {
+ gPipeline.markRebuild(pAttachedObject->mDrawable);
+ }
+ }
+ }
+}
+//-----------------------------------------------------------------------------
+// cleanupAttachedMesh()
+//-----------------------------------------------------------------------------
+void LLVOAvatar::cleanupAttachedMesh( LLViewerObject* pVO )
+{
+ //If a VO has a skin that we'll reset the joint positions to their default
+ if ( pVO && pVO->mDrawable )
+ {
+ LLVOVolume* pVObj = pVO->mDrawable->getVOVolume();
+ if ( pVObj )
+ {
+ const LLMeshSkinInfo* pSkinData = gMeshRepo.getSkinInfo( pVObj->getVolume()->getParams().getSculptID() );
+ if ( pSkinData )
+ {
+ const int jointCnt = pSkinData->mJointNames.size();
+ bool fullRig = ( jointCnt>=20 ) ? true : false;
+ if ( fullRig )
+ {
+ const int bindCnt = pSkinData->mAlternateBindMatrix.size();
+ if ( bindCnt > 0 )
+ {
+ LLVOAvatar::resetJointPositionsToDefault();
+ }
+ }
+ }
+ }
+ }
+}
//-----------------------------------------------------------------------------
// detachObject()
//-----------------------------------------------------------------------------
@@ -5780,14 +6044,23 @@ BOOL LLVOAvatar::detachObject(LLViewerObject *viewer_object)
++iter)
{
LLViewerJointAttachment* attachment = iter->second;
-
+
if (attachment->isObjectAttached(viewer_object))
{
+ cleanupAttachedMesh( viewer_object );
attachment->removeObject(viewer_object);
lldebugs << "Detaching object " << viewer_object->mID << " from " << attachment->getName() << llendl;
return TRUE;
}
}
+
+ std::vector<LLPointer<LLViewerObject> >::iterator iter = std::find(mPendingAttachment.begin(), mPendingAttachment.end(), viewer_object);
+ if (iter != mPendingAttachment.end())
+ {
+ mPendingAttachment.erase(iter);
+ return TRUE;
+ }
+
return FALSE;
}
@@ -7864,7 +8137,7 @@ BOOL LLVOAvatar::updateLOD()
BOOL res = updateJointLODs();
LLFace* facep = mDrawable->getFace(0);
- if (facep->mVertexBuffer.isNull())
+ if (!facep->getVertexBuffer())
{
dirtyMesh(2);
}
@@ -7876,12 +8149,16 @@ BOOL LLVOAvatar::updateLOD()
mNeedsSkin = TRUE;
mDrawable->clearState(LLDrawable::REBUILD_GEOMETRY);
}
-
updateVisibility();
return res;
}
+void LLVOAvatar::updateLODRiggedAttachments( void )
+{
+ updateLOD();
+ rebuildRiggedAttachments();
+}
U32 LLVOAvatar::getPartitionType() const
{
// Avatars merely exist as drawables in the bridge partition
@@ -7933,9 +8210,9 @@ void LLVOAvatar::cacheImpostorValues()
getImpostorValues(mImpostorExtents, mImpostorAngle, mImpostorDistance);
}
-void LLVOAvatar::getImpostorValues(LLVector3* extents, LLVector3& angle, F32& distance) const
+void LLVOAvatar::getImpostorValues(LLVector4a* extents, LLVector3& angle, F32& distance) const
{
- const LLVector3* ext = mDrawable->getSpatialExtents();
+ const LLVector4a* ext = mDrawable->getSpatialExtents();
extents[0] = ext[0];
extents[1] = ext[1];
@@ -7998,7 +8275,9 @@ void LLVOAvatar::idleUpdateRenderCost()
}
}
}
+
}
+
// Diagnostic output to identify all avatar-related textures.
// Does not affect rendering cost calculation.
// Could be wrapped in a debug option if output becomes problematic.
@@ -8038,6 +8317,7 @@ void LLVOAvatar::idleUpdateRenderCost()
}
}
}
+
cost += textures.size() * LLVOVolume::ARC_TEXTURE_COST;
setDebugText(llformat("%d", cost));
diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h
index 3659fb055f..295799fd24 100644
--- a/indra/newview/llvoavatar.h
+++ b/indra/newview/llvoavatar.h
@@ -123,10 +123,11 @@ public:
virtual BOOL idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time);
virtual BOOL updateLOD();
BOOL updateJointLODs();
+ void updateLODRiggedAttachments( void );
virtual BOOL isActive() const; // Whether this object needs to do an idleUpdate.
virtual void updateTextures();
virtual S32 setTETexture(const U8 te, const LLUUID& uuid); // If setting a baked texture, need to request it from a non-local sim.
- virtual void onShift(const LLVector3& shift_vector);
+ virtual void onShift(const LLVector4a& shift_vector);
virtual U32 getPartitionType() const;
virtual const LLVector3 getRenderPosition() const;
virtual void updateDrawable(BOOL force_damped);
@@ -134,8 +135,8 @@ public:
virtual BOOL updateGeometry(LLDrawable *drawable);
virtual void setPixelAreaAndAngle(LLAgent &agent);
virtual void updateRegion(LLViewerRegion *regionp);
- virtual void updateSpatialExtents(LLVector3& newMin, LLVector3 &newMax);
- virtual void getSpatialExtents(LLVector3& newMin, LLVector3& newMax);
+ virtual void updateSpatialExtents(LLVector4a& newMin, LLVector4a &newMax);
+ virtual void getSpatialExtents(LLVector4a& newMin, LLVector4a& newMax);
virtual BOOL lineSegmentIntersect(const LLVector3& start, const LLVector3& end,
S32 face = -1, // which face to check, -1 = ALL_SIDES
BOOL pick_transparent = FALSE,
@@ -167,7 +168,11 @@ public:
virtual LLJoint* getJoint(const std::string &name);
virtual LLJoint* getRootJoint() { return &mRoot; }
-
+
+ void resetJointPositions( void );
+ void resetJointPositionsToDefault( void );
+ void resetSpecificJointPosition( const std::string& name );
+
virtual const char* getAnimationPrefix() { return "avatar"; }
virtual const LLUUID& getID();
virtual LLVector3 getVolumePos(S32 joint_index, LLVector3& volume_offset);
@@ -196,6 +201,10 @@ public:
public:
virtual bool isSelf() const { return false; } // True if this avatar is for this viewer's agent
bool isBuilt() const { return mIsBuilt; }
+
+private: //aligned members
+ LLVector4a mImpostorExtents[2];
+
private:
BOOL mSupportsAlphaLayers; // For backwards compatibility, TRUE for 1.23+ clients
@@ -285,6 +294,16 @@ protected:
public:
void updateHeadOffset();
F32 getPelvisToFoot() const { return mPelvisToFoot; }
+ void setPelvisOffset( bool hasOffset, const LLVector3& translation, F32 offset ) ;
+ bool hasPelvisOffset( void ) { return mHasPelvisOffset; }
+ void postPelvisSetRecalc( void );
+ void setPelvisOffset( F32 pelvixFixupAmount );
+
+ bool mHasPelvisOffset;
+ LLVector3 mPelvisOffset;
+ F32 mLastPelvisToFoot;
+ F32 mPelvisFixup;
+ F32 mLastPelvisFixup;
LLVector3 mHeadOffset; // current head position
LLViewerJoint mRoot;
@@ -352,6 +371,8 @@ public:
U32 renderImpostor(LLColor4U color = LLColor4U(255,255,255,255), S32 diffuse_channel = 0);
U32 renderRigid();
U32 renderSkinned(EAvatarRenderPass pass);
+ F32 getLastSkinTime() { return mLastSkinTime; }
+ U32 renderSkinnedAttachments();
U32 renderTransparent(BOOL first_pass);
void renderCollisionVolumes();
static void deleteCachedImages(bool clearAll=true);
@@ -363,6 +384,8 @@ private:
bool shouldAlphaMask();
BOOL mNeedsSkin; // avatar has been animated and verts have not been updated
+ F32 mLastSkinTime; //value of gFrameTimeSeconds at last skin update
+
S32 mUpdatePeriod;
S32 mNumInitFaces; //number of faces generated when creating the avatar drawable, does not inculde splitted faces due to long vertex buffer.
@@ -402,7 +425,7 @@ public:
BOOL needsImpostorUpdate() const;
const LLVector3& getImpostorOffset() const;
const LLVector2& getImpostorDim() const;
- void getImpostorValues(LLVector3* extents, LLVector3& angle, F32& distance) const;
+ void getImpostorValues(LLVector4a* extents, LLVector3& angle, F32& distance) const;
void cacheImpostorValues();
void setImpostorDim(const LLVector2& dim);
static void resetImpostors();
@@ -413,7 +436,6 @@ private:
LLVector3 mImpostorOffset;
LLVector2 mImpostorDim;
BOOL mNeedsAnimUpdate;
- LLVector3 mImpostorExtents[2];
LLVector3 mImpostorAngle;
F32 mImpostorDistance;
F32 mImpostorPixelArea;
@@ -671,10 +693,12 @@ public:
void clampAttachmentPositions();
virtual const LLViewerJointAttachment* attachObject(LLViewerObject *viewer_object);
virtual BOOL detachObject(LLViewerObject *viewer_object);
+ void cleanupAttachedMesh( LLViewerObject* pVO );
static LLVOAvatar* findAvatarFromAttachment(LLViewerObject* obj);
protected:
LLViewerJointAttachment* getTargetAttachmentPoint(LLViewerObject* viewer_object);
void lazyAttach();
+ void rebuildRiggedAttachments( void );
//--------------------------------------------------------------------
// Map of attachment points, by ID
@@ -786,6 +810,7 @@ protected:
//--------------------------------------------------------------------
public:
void resolveHeightGlobal(const LLVector3d &inPos, LLVector3d &outPos, LLVector3 &outNorm);
+ bool distanceToGround( const LLVector3d &startPoint, LLVector3d &collisionPoint, F32 distToIntersectionAlongRay );
void resolveHeightAgent(const LLVector3 &inPos, LLVector3 &outPos, LLVector3 &outNorm);
void resolveRayCollisionAgent(const LLVector3d start_pt, const LLVector3d end_pt, LLVector3d &out_pos, LLVector3 &out_norm);
void slamPosition(); // Slam position to transmitted position (for teleport);
diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp
index 3b4066e3ca..59883e0bb1 100644
--- a/indra/newview/llvoavatarself.cpp
+++ b/indra/newview/llvoavatarself.cpp
@@ -56,6 +56,8 @@
#include "llviewerstats.h"
#include "llviewerregion.h"
#include "llappearancemgr.h"
+#include "llmeshrepository.h"
+#include "llvovolume.h"
#if LL_MSVC
// disable boost::lexical_cast warning
@@ -623,6 +625,7 @@ BOOL LLVOAvatarSelf::updateCharacter(LLAgent &agent)
mScreenp->updateWorldMatrixChildren();
resetHUDAttachments();
}
+
return LLVOAvatar::updateCharacter(agent);
}
@@ -648,7 +651,11 @@ LLJoint *LLVOAvatarSelf::getJoint(const std::string &name)
}
return LLVOAvatar::getJoint(name);
}
-
+//virtual
+void LLVOAvatarSelf::resetJointPositions( void )
+{
+ return LLVOAvatar::resetJointPositions();
+}
// virtual
BOOL LLVOAvatarSelf::setVisualParamWeight(LLVisualParam *which_param, F32 weight, BOOL upload_bake )
{
@@ -1139,6 +1146,7 @@ const LLViewerJointAttachment *LLVOAvatarSelf::attachObject(LLViewerObject *view
LLAppearanceMgr::instance().registerAttachment(attachment_id);
// Clear any pending requests once the attachment arrives.
removeAttachmentRequest(attachment_id);
+ updateLODRiggedAttachments();
}
return attachment;
@@ -1148,8 +1156,10 @@ const LLViewerJointAttachment *LLVOAvatarSelf::attachObject(LLViewerObject *view
BOOL LLVOAvatarSelf::detachObject(LLViewerObject *viewer_object)
{
const LLUUID attachment_id = viewer_object->getAttachmentItemID();
- if (LLVOAvatar::detachObject(viewer_object))
+ if ( LLVOAvatar::detachObject(viewer_object) )
{
+ LLVOAvatar::cleanupAttachedMesh( viewer_object );
+
// the simulator should automatically handle permission revocation
stopMotionFromSource(attachment_id);
diff --git a/indra/newview/llvoavatarself.h b/indra/newview/llvoavatarself.h
index d13cf5ba38..51f06dee5f 100644
--- a/indra/newview/llvoavatarself.h
+++ b/indra/newview/llvoavatarself.h
@@ -83,7 +83,9 @@ public:
/*virtual*/ void stopMotionFromSource(const LLUUID& source_id);
/*virtual*/ void requestStopMotion(LLMotion* motion);
/*virtual*/ LLJoint* getJoint(const std::string &name);
-
+
+ void resetJointPositions( void );
+
/*virtual*/ BOOL setVisualParamWeight(LLVisualParam *which_param, F32 weight, BOOL upload_bake = FALSE );
/*virtual*/ BOOL setVisualParamWeight(const char* param_name, F32 weight, BOOL upload_bake = FALSE );
/*virtual*/ BOOL setVisualParamWeight(S32 index, F32 weight, BOOL upload_bake = FALSE );
diff --git a/indra/newview/llvocache.cpp b/indra/newview/llvocache.cpp
index b888a263d0..bbb19a63f1 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,11 @@ LLVOCacheEntry::LLVOCacheEntry(LLAPRFile* apr_file)
LLVOCacheEntry::~LLVOCacheEntry()
{
- if(mBuffer)
+ if(mBuffer != mDP.getBuffer())
{
- delete[] mBuffer;
+ delete[] mBuffer ; //just in case
}
+ mDP.freeBuffer();
}
@@ -285,8 +287,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 +339,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 +360,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/llvograss.cpp b/indra/newview/llvograss.cpp
index f57f7b67ea..32822e1181 100644
--- a/indra/newview/llvograss.cpp
+++ b/indra/newview/llvograss.cpp
@@ -340,7 +340,7 @@ void LLVOGrass::updateTextures()
{
if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_TEXTURE_AREA))
{
- setDebugText(llformat("%4.0f", fsqrtf(mPixelArea)));
+ setDebugText(llformat("%4.0f", (F32) sqrt(mPixelArea)));
}
getTEImage(0)->addTextureStats(mPixelArea);
}
@@ -453,7 +453,7 @@ void LLVOGrass::plantBlades()
face->setTexture(getTEImage(0));
face->setState(LLFace::GLOBAL);
face->setSize(mNumBlades * 8, mNumBlades * 12);
- face->mVertexBuffer = NULL;
+ face->setVertexBuffer(NULL);
face->setTEOffset(0);
face->mCenterLocal = mPosition + mRegionp->getOriginAgent();
@@ -640,7 +640,7 @@ BOOL LLVOGrass::lineSegmentIntersect(const LLVector3& start, const LLVector3& en
LLVector2 tc[4];
LLVector3 v[4];
- // LLVector3 n[4]; // unused!
+ //LLVector3 n[4];
F32 closest_t = 1.f;
@@ -686,7 +686,6 @@ BOOL LLVOGrass::lineSegmentIntersect(const LLVector3& start, const LLVector3& en
position.mV[2] += blade_height;
v[3] = v1 = position + mRegionp->getOriginAgent();
-
F32 a,b,t;
BOOL hit = FALSE;
@@ -694,23 +693,23 @@ BOOL LLVOGrass::lineSegmentIntersect(const LLVector3& start, const LLVector3& en
U32 idx0 = 0,idx1 = 0,idx2 = 0;
- if (LLTriangleRayIntersect(v[0], v[1], v[2], start, dir, &a, &b, &t, FALSE))
+ if (LLTriangleRayIntersect(v[0], v[1], v[2], start, dir, a, b, t, FALSE))
{
hit = TRUE;
idx0 = 0; idx1 = 1; idx2 = 2;
}
- else if (LLTriangleRayIntersect(v[1], v[3], v[2], start, dir, &a, &b, &t, FALSE))
+ else if (LLTriangleRayIntersect(v[1], v[3], v[2], start, dir, a, b, t, FALSE))
{
hit = TRUE;
idx0 = 1; idx1 = 3; idx2 = 2;
}
- else if (LLTriangleRayIntersect(v[2], v[1], v[0], start, dir, &a, &b, &t, FALSE))
+ else if (LLTriangleRayIntersect(v[2], v[1], v[0], start, dir, a, b, t, FALSE))
{
normal1 = -normal1;
hit = TRUE;
idx0 = 2; idx1 = 1; idx2 = 0;
}
- else if (LLTriangleRayIntersect(v[2], v[3], v[1], start, dir, &a, &b, &t, FALSE))
+ else if (LLTriangleRayIntersect(v[2], v[3], v[1], start, dir, a, b, t, FALSE))
{
normal1 = -normal1;
hit = TRUE;
diff --git a/indra/newview/llvoground.cpp b/indra/newview/llvoground.cpp
index f032ae8780..ce256fdedf 100644
--- a/indra/newview/llvoground.cpp
+++ b/indra/newview/llvoground.cpp
@@ -97,13 +97,14 @@ BOOL LLVOGround::updateGeometry(LLDrawable *drawable)
drawable->addFace(poolp, NULL);
face = drawable->getFace(0);
- if (face->mVertexBuffer.isNull())
+ if (!face->getVertexBuffer())
{
face->setSize(5, 12);
- face->mVertexBuffer = new LLVertexBuffer(LLDrawPoolGround::VERTEX_DATA_MASK, GL_STREAM_DRAW_ARB);
- face->mVertexBuffer->allocateBuffer(face->getGeomCount(), face->getIndicesCount(), TRUE);
+ LLVertexBuffer* buff = new LLVertexBuffer(LLDrawPoolGround::VERTEX_DATA_MASK, GL_STREAM_DRAW_ARB);
+ buff->allocateBuffer(face->getGeomCount(), face->getIndicesCount(), TRUE);
face->setGeomIndex(0);
face->setIndicesIndex(0);
+ face->setVertexBuffer(buff);
}
index_offset = face->getGeometry(verticesp,normalsp,texCoordsp, indicesp);
@@ -161,7 +162,7 @@ BOOL LLVOGround::updateGeometry(LLDrawable *drawable)
*(texCoordsp++) = LLVector2(0.f, 1.f);
*(texCoordsp++) = LLVector2(0.5f, 0.5f);
- face->mVertexBuffer->setBuffer(0);
+ face->getVertexBuffer()->setBuffer(0);
LLPipeline::sCompiles++;
return TRUE;
}
diff --git a/indra/newview/llvoicechannel.cpp b/indra/newview/llvoicechannel.cpp
index a71539266d..bd12328a6b 100644
--- a/indra/newview/llvoicechannel.cpp
+++ b/indra/newview/llvoicechannel.cpp
@@ -412,6 +412,7 @@ void LLVoiceChannel::doSetState(const EState& new_state)
{
EState old_state = mState;
mState = new_state;
+
if (!mStateChangedCallback.empty())
mStateChangedCallback(old_state, mState, mCallDirection, mCallEndedByAgent);
}
@@ -846,8 +847,13 @@ void LLVoiceChannelP2P::activate()
// otherwise answering the call
else
{
- LLVoiceClient::getInstance()->answerInvite(mSessionHandle);
-
+ if (!LLVoiceClient::getInstance()->answerInvite(mSessionHandle))
+ {
+ mCallEndedByAgent = false;
+ mSessionHandle.clear();
+ handleError(ERROR_UNKNOWN);
+ return;
+ }
// using the session handle invalidates it. Clear it out here so we can't reuse it by accident.
mSessionHandle.clear();
}
diff --git a/indra/newview/llvoicevivox.cpp b/indra/newview/llvoicevivox.cpp
index 08e242af8e..6ee6822e2f 100644
--- a/indra/newview/llvoicevivox.cpp
+++ b/indra/newview/llvoicevivox.cpp
@@ -5088,7 +5088,7 @@ void LLVivoxVoiceClient::enforceTether(void)
}
}
- if(dist_vec(mCameraPosition, tethered) > 0.1)
+ if(dist_vec_squared(mCameraPosition, tethered) > 0.01)
{
mCameraPosition = tethered;
mSpatialCoordsDirty = true;
@@ -5150,7 +5150,7 @@ void LLVivoxVoiceClient::setCameraPosition(const LLVector3d &position, const LLV
void LLVivoxVoiceClient::setAvatarPosition(const LLVector3d &position, const LLVector3 &velocity, const LLMatrix3 &rot)
{
- if(dist_vec(mAvatarPosition, position) > 0.1)
+ if(dist_vec_squared(mAvatarPosition, position) > 0.01)
{
mAvatarPosition = position;
mSpatialCoordsDirty = true;
@@ -6979,13 +6979,6 @@ void LLVivoxProtocolParser::reset()
alias.clear();
numberOfAliases = 0;
applicationString.clear();
- id = 0;
- nameString.clear();
- descriptionString.clear();
- expirationDate = LLDate();
- hasExpired = false;
- fontType = 0;
- fontStatus = 0;
}
//virtual
diff --git a/indra/newview/llvopartgroup.cpp b/indra/newview/llvopartgroup.cpp
index 40833ad259..6f354b78b1 100644
--- a/indra/newview/llvopartgroup.cpp
+++ b/indra/newview/llvopartgroup.cpp
@@ -73,12 +73,14 @@ F32 LLVOPartGroup::getBinRadius()
return mScale.mV[0]*2.f;
}
-void LLVOPartGroup::updateSpatialExtents(LLVector3& newMin, LLVector3& newMax)
+void LLVOPartGroup::updateSpatialExtents(LLVector4a& newMin, LLVector4a& newMax)
{
const LLVector3& pos_agent = getPositionAgent();
- newMin = pos_agent - mScale;
- newMax = pos_agent + mScale;
- mDrawable->setPositionGroup(pos_agent);
+ newMin.load3( (pos_agent - mScale).mV);
+ newMax.load3( (pos_agent + mScale).mV);
+ LLVector4a pos;
+ pos.load3(pos_agent.mV);
+ mDrawable->setPositionGroup(pos);
}
BOOL LLVOPartGroup::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
@@ -358,7 +360,7 @@ U32 LLVOPartGroup::getPartitionType() const
}
LLParticlePartition::LLParticlePartition()
-: LLSpatialPartition(LLDrawPoolAlpha::VERTEX_DATA_MASK, TRUE, GL_DYNAMIC_DRAW_ARB)
+: LLSpatialPartition(LLDrawPoolAlpha::VERTEX_DATA_MASK, TRUE, GL_STREAM_DRAW_ARB)
{
mRenderPass = LLRenderPass::PASS_ALPHA;
mDrawableType = LLPipeline::RENDER_TYPE_PARTICLES;
@@ -461,7 +463,7 @@ void LLParticlePartition::getGeometry(LLSpatialGroup* group)
LLAlphaObject* object = (LLAlphaObject*) facep->getViewerObject();
facep->setGeomIndex(vertex_count);
facep->setIndicesIndex(index_count);
- facep->mVertexBuffer = buffer;
+ facep->setVertexBuffer(buffer);
facep->setPoolType(LLDrawPool::POOL_ALPHA);
object->getGeometry(facep->getTEOffset(), verticesp, normalsp, texcoordsp, colorsp, indicesp);
diff --git a/indra/newview/llvopartgroup.h b/indra/newview/llvopartgroup.h
index b136f2cbfa..4db893b4ef 100644
--- a/indra/newview/llvopartgroup.h
+++ b/indra/newview/llvopartgroup.h
@@ -51,7 +51,7 @@ public:
BOOL idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time);
virtual F32 getBinRadius();
- virtual void updateSpatialExtents(LLVector3& newMin, LLVector3& newMax);
+ virtual void updateSpatialExtents(LLVector4a& newMin, LLVector4a& newMax);
virtual U32 getPartitionType() const;
/*virtual*/ void setPixelAreaAndAngle(LLAgent &agent);
diff --git a/indra/newview/llvosky.cpp b/indra/newview/llvosky.cpp
index 80f43e51d2..6396bc042d 100644
--- a/indra/newview/llvosky.cpp
+++ b/indra/newview/llvosky.cpp
@@ -304,7 +304,7 @@ void LLSkyTex::createGLImage(S32 which)
void LLSkyTex::bindTexture(BOOL curr)
{
- gGL.getTexUnit(0)->bind(mTexture[getWhich(curr)]);
+ gGL.getTexUnit(0)->bind(mTexture[getWhich(curr)], true);
}
/***************************************
@@ -1182,7 +1182,7 @@ BOOL LLVOSky::updateSky()
}
}
- if (mDrawable.notNull() && mDrawable->getFace(0) && mDrawable->getFace(0)->mVertexBuffer.isNull())
+ if (mDrawable.notNull() && mDrawable->getFace(0) && !mDrawable->getFace(0)->getVertexBuffer())
{
gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_VOLUME, TRUE);
}
@@ -1233,10 +1233,11 @@ void LLVOSky::createDummyVertexBuffer()
mFace[FACE_DUMMY] = mDrawable->addFace(poolp, NULL);
}
- if(mFace[FACE_DUMMY]->mVertexBuffer.isNull())
+ if(!mFace[FACE_DUMMY]->getVertexBuffer())
{
- mFace[FACE_DUMMY]->mVertexBuffer = new LLVertexBuffer(LLDrawPoolSky::VERTEX_DATA_MASK, GL_DYNAMIC_DRAW_ARB);
- mFace[FACE_DUMMY]->mVertexBuffer->allocateBuffer(1, 1, TRUE);
+ LLVertexBuffer* buff = new LLVertexBuffer(LLDrawPoolSky::VERTEX_DATA_MASK, GL_DYNAMIC_DRAW_ARB);
+ buff->allocateBuffer(1, 1, TRUE);
+ mFace[FACE_DUMMY]->setVertexBuffer(buff);
}
}
@@ -1255,13 +1256,13 @@ void LLVOSky::updateDummyVertexBuffer()
LLFastTimer t(FTM_RENDER_FAKE_VBO_UPDATE) ;
- if(!mFace[FACE_DUMMY] || mFace[FACE_DUMMY]->mVertexBuffer.isNull())
+ if(!mFace[FACE_DUMMY] || !mFace[FACE_DUMMY]->getVertexBuffer())
createDummyVertexBuffer() ;
LLStrider<LLVector3> vertices ;
- mFace[FACE_DUMMY]->mVertexBuffer->getVertexStrider(vertices, 0);
+ mFace[FACE_DUMMY]->getVertexBuffer()->getVertexStrider(vertices, 0);
*vertices = mCameraPosAgent ;
- mFace[FACE_DUMMY]->mVertexBuffer->setBuffer(0) ;
+ mFace[FACE_DUMMY]->getVertexBuffer()->setBuffer(0) ;
}
//----------------------------------
//end of fake vertex buffer updating
@@ -1304,14 +1305,15 @@ BOOL LLVOSky::updateGeometry(LLDrawable *drawable)
{
face = mFace[FACE_SIDE0 + side];
- if (face->mVertexBuffer.isNull())
+ if (!face->getVertexBuffer())
{
face->setSize(4, 6);
face->setGeomIndex(0);
face->setIndicesIndex(0);
- face->mVertexBuffer = new LLVertexBuffer(LLDrawPoolSky::VERTEX_DATA_MASK, GL_STREAM_DRAW_ARB);
- face->mVertexBuffer->allocateBuffer(4, 6, TRUE);
-
+ LLVertexBuffer* buff = new LLVertexBuffer(LLDrawPoolSky::VERTEX_DATA_MASK, GL_STREAM_DRAW_ARB);
+ buff->allocateBuffer(4, 6, TRUE);
+ face->setVertexBuffer(buff);
+
index_offset = face->getGeometry(verticesp,normalsp,texCoordsp, indicesp);
S32 vtx = 0;
@@ -1344,7 +1346,7 @@ BOOL LLVOSky::updateGeometry(LLDrawable *drawable)
*indicesp++ = index_offset + 3;
*indicesp++ = index_offset + 2;
- face->mVertexBuffer->setBuffer(0);
+ buff->setBuffer(0);
}
}
@@ -1471,13 +1473,14 @@ BOOL LLVOSky::updateHeavenlyBodyGeometry(LLDrawable *drawable, const S32 f, cons
facep = mFace[f];
- if (facep->mVertexBuffer.isNull())
+ if (!facep->getVertexBuffer())
{
- facep->setSize(4, 6);
- facep->mVertexBuffer = new LLVertexBuffer(LLDrawPoolSky::VERTEX_DATA_MASK, GL_STREAM_DRAW_ARB);
- facep->mVertexBuffer->allocateBuffer(facep->getGeomCount(), facep->getIndicesCount(), TRUE);
+ facep->setSize(4, 6);
+ LLVertexBuffer* buff = new LLVertexBuffer(LLDrawPoolSky::VERTEX_DATA_MASK, GL_STREAM_DRAW_ARB);
+ buff->allocateBuffer(facep->getGeomCount(), facep->getIndicesCount(), TRUE);
facep->setGeomIndex(0);
facep->setIndicesIndex(0);
+ facep->setVertexBuffer(buff);
}
index_offset = facep->getGeometry(verticesp,normalsp,texCoordsp, indicesp);
@@ -1506,7 +1509,7 @@ BOOL LLVOSky::updateHeavenlyBodyGeometry(LLDrawable *drawable, const S32 f, cons
*indicesp++ = index_offset + 2;
*indicesp++ = index_offset + 3;
- facep->mVertexBuffer->setBuffer(0);
+ facep->getVertexBuffer()->setBuffer(0);
if (is_sun)
{
@@ -1875,13 +1878,14 @@ void LLVOSky::updateReflectionGeometry(LLDrawable *drawable, F32 H,
LLFace *face = mFace[FACE_REFLECTION];
- if (face->mVertexBuffer.isNull() || quads*4 != face->getGeomCount())
+ if (!face->getVertexBuffer() || quads*4 != face->getGeomCount())
{
face->setSize(quads * 4, quads * 6);
- face->mVertexBuffer = new LLVertexBuffer(LLDrawPoolWater::VERTEX_DATA_MASK, GL_STREAM_DRAW_ARB);
- face->mVertexBuffer->allocateBuffer(face->getGeomCount(), face->getIndicesCount(), TRUE);
+ LLVertexBuffer* buff = new LLVertexBuffer(LLDrawPoolWater::VERTEX_DATA_MASK, GL_STREAM_DRAW_ARB);
+ buff->allocateBuffer(face->getGeomCount(), face->getIndicesCount(), TRUE);
face->setIndicesIndex(0);
face->setGeomIndex(0);
+ face->setVertexBuffer(buff);
}
LLStrider<LLVector3> verticesp;
@@ -2019,7 +2023,7 @@ void LLVOSky::updateReflectionGeometry(LLDrawable *drawable, F32 H,
}
}
- face->mVertexBuffer->setBuffer(0);
+ face->getVertexBuffer()->setBuffer(0);
}
diff --git a/indra/newview/llvosurfacepatch.cpp b/indra/newview/llvosurfacepatch.cpp
index 2eb4398488..dbcd4f50ca 100644
--- a/indra/newview/llvosurfacepatch.cpp
+++ b/indra/newview/llvosurfacepatch.cpp
@@ -54,27 +54,77 @@ public:
LLVertexBuffer(MAP_VERTEX | MAP_NORMAL | MAP_TEXCOORD0 | MAP_TEXCOORD1 | MAP_COLOR, GL_DYNAMIC_DRAW_ARB)
{
//texture coordinates 2 and 3 exist, but use the same data as texture coordinate 1
- mOffsets[TYPE_TEXCOORD3] = mOffsets[TYPE_TEXCOORD2] = mOffsets[TYPE_TEXCOORD1];
- mTypeMask |= MAP_TEXCOORD2 | MAP_TEXCOORD3;
};
- /*// virtual
+ // virtual
void setupVertexBuffer(U32 data_mask) const
- {
- if (LLDrawPoolTerrain::getDetailMode() == 0 || LLPipeline::sShadowRender)
+ {
+ U8* base = useVBOs() ? (U8*) mAlignedOffset : mMappedData;
+
+ //assume tex coords 2 and 3 are present
+ U32 type_mask = mTypeMask | MAP_TEXCOORD2 | MAP_TEXCOORD3;
+
+ if ((data_mask & type_mask) != data_mask)
{
- LLVertexBuffer::setupVertexBuffer(data_mask);
+ llerrs << "LLVertexBuffer::setupVertexBuffer missing required components for supplied data mask." << llendl;
+ }
+
+ if (data_mask & MAP_NORMAL)
+ {
+ glNormalPointer(GL_FLOAT, LLVertexBuffer::sTypeSize[TYPE_NORMAL], (void*)(base + mOffsets[TYPE_NORMAL]));
+ }
+ if (data_mask & MAP_TEXCOORD3)
+ { //substitute tex coord 0 for tex coord 3
+ glClientActiveTextureARB(GL_TEXTURE3_ARB);
+ glTexCoordPointer(2,GL_FLOAT, LLVertexBuffer::sTypeSize[TYPE_TEXCOORD0], (void*)(base + mOffsets[TYPE_TEXCOORD0]));
+ glClientActiveTextureARB(GL_TEXTURE0_ARB);
+ }
+ if (data_mask & MAP_TEXCOORD2)
+ { //substitute tex coord 0 for tex coord 2
+ glClientActiveTextureARB(GL_TEXTURE2_ARB);
+ glTexCoordPointer(2,GL_FLOAT, LLVertexBuffer::sTypeSize[TYPE_TEXCOORD0], (void*)(base + mOffsets[TYPE_TEXCOORD0]));
+ glClientActiveTextureARB(GL_TEXTURE0_ARB);
}
- else if (data_mask & LLVertexBuffer::MAP_TEXCOORD1)
+ if (data_mask & MAP_TEXCOORD1)
{
- LLVertexBuffer::setupVertexBuffer(data_mask);
+ glClientActiveTextureARB(GL_TEXTURE1_ARB);
+ glTexCoordPointer(2,GL_FLOAT, LLVertexBuffer::sTypeSize[TYPE_TEXCOORD1], (void*)(base + mOffsets[TYPE_TEXCOORD1]));
+ glClientActiveTextureARB(GL_TEXTURE0_ARB);
}
- else
+ if (data_mask & MAP_BINORMAL)
{
- LLVertexBuffer::setupVertexBuffer(data_mask);
+ glClientActiveTextureARB(GL_TEXTURE2_ARB);
+ glTexCoordPointer(3,GL_FLOAT, LLVertexBuffer::sTypeSize[TYPE_BINORMAL], (void*)(base + mOffsets[TYPE_BINORMAL]));
+ glClientActiveTextureARB(GL_TEXTURE0_ARB);
}
- llglassertok();
- }*/
+ if (data_mask & MAP_TEXCOORD0)
+ {
+ glTexCoordPointer(2,GL_FLOAT, LLVertexBuffer::sTypeSize[TYPE_TEXCOORD0], (void*)(base + mOffsets[TYPE_TEXCOORD0]));
+ }
+ if (data_mask & MAP_COLOR)
+ {
+ glColorPointer(4, GL_UNSIGNED_BYTE, LLVertexBuffer::sTypeSize[TYPE_COLOR], (void*)(base + mOffsets[TYPE_COLOR]));
+ }
+
+ if (data_mask & MAP_WEIGHT)
+ {
+ glVertexAttribPointerARB(1, 1, GL_FLOAT, FALSE, LLVertexBuffer::sTypeSize[TYPE_WEIGHT], (void*)(base + mOffsets[TYPE_WEIGHT]));
+ }
+
+ if (data_mask & MAP_WEIGHT4 && sWeight4Loc != -1)
+ {
+ glVertexAttribPointerARB(sWeight4Loc, 4, GL_FLOAT, FALSE, LLVertexBuffer::sTypeSize[TYPE_WEIGHT4], (void*)(base+mOffsets[TYPE_WEIGHT4]));
+ }
+
+ if (data_mask & MAP_CLOTHWEIGHT)
+ {
+ glVertexAttribPointerARB(4, 4, GL_FLOAT, TRUE, LLVertexBuffer::sTypeSize[TYPE_CLOTHWEIGHT], (void*)(base + mOffsets[TYPE_CLOTHWEIGHT]));
+ }
+ if (data_mask & MAP_VERTEX)
+ {
+ glVertexPointer(3,GL_FLOAT, LLVertexBuffer::sTypeSize[TYPE_VERTEX], (void*)(base + 0));
+ }
+ }
};
//============================================================================
@@ -840,7 +890,7 @@ void LLVOSurfacePatch::dirtyGeom()
if (mDrawable)
{
gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_ALL, TRUE);
- mDrawable->getFace(0)->mVertexBuffer = NULL;
+ mDrawable->getFace(0)->setVertexBuffer(NULL);
mDrawable->movePartition();
}
}
@@ -939,7 +989,13 @@ BOOL LLVOSurfacePatch::lineSegmentIntersect(const LLVector3& start, const LLVect
//step one meter at a time until intersection point found
- const LLVector3* ext = mDrawable->getSpatialExtents();
+ //VECTORIZE THIS
+ const LLVector4a* exta = mDrawable->getSpatialExtents();
+
+ LLVector3 ext[2];
+ ext[0].set(exta[0].getF32ptr());
+ ext[1].set(exta[1].getF32ptr());
+
F32 rad = (delta*tdelta).magVecSquared();
F32 t = 0.f;
@@ -1001,13 +1057,16 @@ BOOL LLVOSurfacePatch::lineSegmentIntersect(const LLVector3& start, const LLVect
return FALSE;
}
-void LLVOSurfacePatch::updateSpatialExtents(LLVector3& newMin, LLVector3 &newMax)
+void LLVOSurfacePatch::updateSpatialExtents(LLVector4a& newMin, LLVector4a &newMax)
{
LLVector3 posAgent = getPositionAgent();
LLVector3 scale = getScale();
- newMin = posAgent-scale*0.5f; // Changing to 2.f makes the culling a -little- better, but still wrong
- newMax = posAgent+scale*0.5f;
- mDrawable->setPositionGroup((newMin+newMax)*0.5f);
+ newMin.load3( (posAgent-scale*0.5f).mV); // Changing to 2.f makes the culling a -little- better, but still wrong
+ newMax.load3( (posAgent+scale*0.5f).mV);
+ LLVector4a pos;
+ pos.setAdd(newMin,newMax);
+ pos.mul(0.5f);
+ mDrawable->setPositionGroup(pos);
}
U32 LLVOSurfacePatch::getPartitionType() const
@@ -1060,7 +1119,7 @@ void LLTerrainPartition::getGeometry(LLSpatialGroup* group)
facep->setIndicesIndex(indices_index);
facep->setGeomIndex(index_offset);
- facep->mVertexBuffer = buffer;
+ facep->setVertexBuffer(buffer);
LLVOSurfacePatch* patchp = (LLVOSurfacePatch*) facep->getViewerObject();
patchp->getGeometry(vertices, normals, colors, texcoords, texcoords2, indices);
diff --git a/indra/newview/llvosurfacepatch.h b/indra/newview/llvosurfacepatch.h
index bd80e1dbe6..8e75ff2e6e 100644
--- a/indra/newview/llvosurfacepatch.h
+++ b/indra/newview/llvosurfacepatch.h
@@ -72,7 +72,7 @@ public:
/*virtual*/ void updateTextures();
/*virtual*/ void setPixelAreaAndAngle(LLAgent &agent); // generate accurate apparent angle and area
- /*virtual*/ void updateSpatialExtents(LLVector3& newMin, LLVector3& newMax);
+ /*virtual*/ void updateSpatialExtents(LLVector4a& newMin, LLVector4a& newMax);
/*virtual*/ BOOL isActive() const; // Whether this object needs to do an idleUpdate.
void setPatch(LLSurfacePatch *patchp);
diff --git a/indra/newview/llvotextbubble.cpp b/indra/newview/llvotextbubble.cpp
index b61dae53ba..a92172fe23 100644
--- a/indra/newview/llvotextbubble.cpp
+++ b/indra/newview/llvotextbubble.cpp
@@ -39,6 +39,7 @@
#include "llviewertexturelist.h"
#include "llvolume.h"
#include "pipeline.h"
+#include "llvector4a.h"
#include "llviewerregion.h"
LLVOTextBubble::LLVOTextBubble(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp)
@@ -211,7 +212,7 @@ void LLVOTextBubble::updateFaceSize(S32 idx)
else
{
const LLVolumeFace& vol_face = getVolume()->getVolumeFace(idx);
- face->setSize(vol_face.mVertices.size(), vol_face.mIndices.size());
+ face->setSize(vol_face.mNumVertices, vol_face.mNumIndices);
}
}
@@ -229,19 +230,37 @@ void LLVOTextBubble::getGeometry(S32 idx,
const LLVolumeFace& face = getVolume()->getVolumeFace(idx);
- LLVector3 pos = getPositionAgent();
+ LLVector4a pos;
+ pos.load3(getPositionAgent().mV);
+
+ LLVector4a scale;
+ scale.load3(getScale().mV);
+
LLColor4U color = LLColor4U(getTE(idx)->getColor());
U32 offset = mDrawable->getFace(idx)->getGeomIndex();
- for (U32 i = 0; i < face.mVertices.size(); i++)
+ LLVector4a* dst_pos = (LLVector4a*) verticesp.get();
+ LLVector4a* src_pos = (LLVector4a*) face.mPositions;
+
+ LLVector4a* dst_norm = (LLVector4a*) normalsp.get();
+ LLVector4a* src_norm = (LLVector4a*) face.mNormals;
+
+ LLVector2* dst_tc = (LLVector2*) texcoordsp.get();
+ LLVector2* src_tc = (LLVector2*) face.mTexCoords;
+
+ LLVector4a::memcpyNonAliased16((F32*) dst_norm, (F32*) src_norm, face.mNumVertices*4*sizeof(F32));
+ LLVector4a::memcpyNonAliased16((F32*) dst_tc, (F32*) src_tc, face.mNumVertices*2*sizeof(F32));
+
+
+ for (U32 i = 0; i < face.mNumVertices; i++)
{
- *verticesp++ = face.mVertices[i].mPosition.scaledVec(getScale()) + pos;
- *normalsp++ = face.mVertices[i].mNormal;
- *texcoordsp++ = face.mVertices[i].mTexCoord;
+ LLVector4a t;
+ t.setMul(src_pos[i], scale);
+ dst_pos[i].setAdd(t, pos);
*colorsp++ = color;
}
- for (U32 i = 0; i < face.mIndices.size(); i++)
+ for (U32 i = 0; i < face.mNumIndices; i++)
{
*indicesp++ = face.mIndices[i] + offset;
}
diff --git a/indra/newview/llvotree.cpp b/indra/newview/llvotree.cpp
index 37a974be28..8946d4e0b6 100644
--- a/indra/newview/llvotree.cpp
+++ b/indra/newview/llvotree.cpp
@@ -50,6 +50,7 @@
#include "pipeline.h"
#include "llspatialpartition.h"
#include "llnotificationsutil.h"
+#include "raytrace.h"
extern LLPipeline gPipeline;
@@ -485,7 +486,7 @@ void LLVOTree::updateTextures()
{
if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_TEXTURE_AREA))
{
- setDebugText(llformat("%4.0f", fsqrtf(mPixelArea)));
+ setDebugText(llformat("%4.0f", (F32) sqrt(mPixelArea)));
}
mTreeImagep->addTextureStats(mPixelArea);
}
@@ -525,11 +526,11 @@ BOOL LLVOTree::updateGeometry(LLDrawable *drawable)
if(mTrunkLOD >= sMAX_NUM_TREE_LOD_LEVELS) //do not display the tree.
{
mReferenceBuffer = NULL ;
- mDrawable->getFace(0)->mVertexBuffer = NULL ;
+ mDrawable->getFace(0)->setVertexBuffer(NULL);
return TRUE ;
}
- if (mReferenceBuffer.isNull() || mDrawable->getFace(0)->mVertexBuffer.isNull())
+ if (mReferenceBuffer.isNull() || !mDrawable->getFace(0)->getVertexBuffer())
{
const F32 SRR3 = 0.577350269f; // sqrt(1/3)
const F32 SRR2 = 0.707106781f; // sqrt(1/2)
@@ -863,7 +864,7 @@ BOOL LLVOTree::updateGeometry(LLDrawable *drawable)
if (gSavedSettings.getBOOL("RenderAnimateTrees"))
{
- mDrawable->getFace(0)->mVertexBuffer = mReferenceBuffer;
+ mDrawable->getFace(0)->setVertexBuffer(mReferenceBuffer);
}
else
{
@@ -921,8 +922,9 @@ void LLVOTree::updateMesh()
calcNumVerts(vert_count, index_count, mTrunkLOD, stop_depth, mDepth, mTrunkDepth, mBranches);
LLFace* facep = mDrawable->getFace(0);
- facep->mVertexBuffer = new LLVertexBuffer(LLDrawPoolTree::VERTEX_DATA_MASK, GL_STATIC_DRAW_ARB);
- facep->mVertexBuffer->allocateBuffer(vert_count, index_count, TRUE);
+ LLVertexBuffer* buff = new LLVertexBuffer(LLDrawPoolTree::VERTEX_DATA_MASK, GL_STATIC_DRAW_ARB);
+ buff->allocateBuffer(vert_count, index_count, TRUE);
+ facep->setVertexBuffer(buff);
LLStrider<LLVector3> vertices;
LLStrider<LLVector3> normals;
@@ -930,16 +932,15 @@ void LLVOTree::updateMesh()
LLStrider<U16> indices;
U16 idx_offset = 0;
- facep->mVertexBuffer->getVertexStrider(vertices);
- facep->mVertexBuffer->getNormalStrider(normals);
- facep->mVertexBuffer->getTexCoord0Strider(tex_coords);
- facep->mVertexBuffer->getIndexStrider(indices);
+ buff->getVertexStrider(vertices);
+ buff->getNormalStrider(normals);
+ buff->getTexCoord0Strider(tex_coords);
+ buff->getIndexStrider(indices);
genBranchPipeline(vertices, normals, tex_coords, indices, idx_offset, scale_mat, mTrunkLOD, stop_depth, mDepth, mTrunkDepth, 1.0, mTwist, droop, mBranches, alpha);
mReferenceBuffer->setBuffer(0);
- facep->mVertexBuffer->setBuffer(0);
-
+ buff->setBuffer(0);
}
void LLVOTree::appendMesh(LLStrider<LLVector3>& vertices,
@@ -1260,7 +1261,7 @@ void LLVOTree::updateRadius()
mDrawable->setRadius(32.0f);
}
-void LLVOTree::updateSpatialExtents(LLVector3& newMin, LLVector3& newMax)
+void LLVOTree::updateSpatialExtents(LLVector4a& newMin, LLVector4a& newMax)
{
F32 radius = getScale().length()*0.05f;
LLVector3 center = getRenderPosition();
@@ -1270,9 +1271,11 @@ void LLVOTree::updateSpatialExtents(LLVector3& newMin, LLVector3& newMax)
center += LLVector3(0, 0, size.mV[2]) * getRotation();
- newMin.set(center-size);
- newMax.set(center+size);
- mDrawable->setPositionGroup(center);
+ newMin.load3((center-size).mV);
+ newMax.load3((center+size).mV);
+ LLVector4a pos;
+ pos.load3(center.mV);
+ mDrawable->setPositionGroup(pos);
}
BOOL LLVOTree::lineSegmentIntersect(const LLVector3& start, const LLVector3& end, S32 face, BOOL pick_transparent, S32 *face_hitp,
@@ -1285,8 +1288,13 @@ BOOL LLVOTree::lineSegmentIntersect(const LLVector3& start, const LLVector3& end
return FALSE;
}
- const LLVector3* ext = mDrawable->getSpatialExtents();
+ const LLVector4a* exta = mDrawable->getSpatialExtents();
+ //VECTORIZE THIS
+ LLVector3 ext[2];
+ ext[0].set(exta[0].getF32ptr());
+ ext[1].set(exta[1].getF32ptr());
+
LLVector3 center = (ext[1]+ext[0])*0.5f;
LLVector3 size = (ext[1]-ext[0]);
@@ -1323,7 +1331,7 @@ U32 LLVOTree::getPartitionType() const
}
LLTreePartition::LLTreePartition()
-: LLSpatialPartition(0, FALSE, 0)
+: LLSpatialPartition(0, FALSE, GL_DYNAMIC_DRAW_ARB)
{
mDrawableType = LLPipeline::RENDER_TYPE_TREE;
mPartitionType = LLViewerRegion::PARTITION_TREE;
diff --git a/indra/newview/llvotree.h b/indra/newview/llvotree.h
index fd0ebdf8e2..1e1deede26 100644
--- a/indra/newview/llvotree.h
+++ b/indra/newview/llvotree.h
@@ -68,7 +68,7 @@ public:
/*virtual*/ LLDrawable* createDrawable(LLPipeline *pipeline);
/*virtual*/ BOOL updateGeometry(LLDrawable *drawable);
- /*virtual*/ void updateSpatialExtents(LLVector3 &min, LLVector3 &max);
+ /*virtual*/ void updateSpatialExtents(LLVector4a &min, LLVector4a &max);
virtual U32 getPartitionType() const;
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index a207d3e050..e9a8c9b80a 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -30,12 +30,16 @@
#include "llvovolume.h"
+#include <sstream>
+
#include "llviewercontrol.h"
#include "lldir.h"
#include "llflexibleobject.h"
+#include "llfloatertools.h"
#include "llmaterialtable.h"
#include "llprimitive.h"
#include "llvolume.h"
+#include "llvolumeoctree.h"
#include "llvolumemgr.h"
#include "llvolumemessage.h"
#include "material_codes.h"
@@ -44,6 +48,7 @@
#include "object_flags.h"
#include "llagentconstants.h"
#include "lldrawable.h"
+#include "lldrawpoolavatar.h"
#include "lldrawpoolbump.h"
#include "llface.h"
#include "llspatialpartition.h"
@@ -51,18 +56,25 @@
#include "llflexibleobject.h"
#include "llsky.h"
#include "lltexturefetch.h"
+#include "llvector4a.h"
#include "llviewercamera.h"
#include "llviewertexturelist.h"
+#include "llviewerobjectlist.h"
#include "llviewerregion.h"
#include "llviewertextureanim.h"
#include "llworld.h"
#include "llselectmgr.h"
#include "pipeline.h"
#include "llsdutil.h"
+#include "llmatrix4a.h"
#include "llmediaentry.h"
#include "llmediadataclient.h"
+#include "llmeshrepository.h"
#include "llagent.h"
#include "llviewermediafocus.h"
+#include "lldatapacker.h"
+#include "llvoavatar.h"
+#include "llvocache.h"
const S32 MIN_QUIET_FRAMES_COALESCE = 30;
const F32 FORCE_SIMPLE_RENDER_AREA = 512.f;
@@ -82,6 +94,7 @@ LLPointer<LLObjectMediaNavigateClient> LLVOVolume::sObjectMediaNavigateClient =
static LLFastTimer::DeclareTimer FTM_GEN_TRIANGLES("Generate Triangles");
static LLFastTimer::DeclareTimer FTM_GEN_VOLUME("Generate Volumes");
+static LLFastTimer::DeclareTimer FTM_VOLUME_TEXTURES("Volume Textures");
// Implementation class of LLMediaDataClientObject. See llmediadataclient.h
class LLMediaDataClientObjectImpl : public LLMediaDataClientObject
@@ -692,6 +705,7 @@ BOOL LLVOVolume::isVisible() const
void LLVOVolume::updateTextureVirtualSize()
{
+ LLFastTimer ftm(FTM_VOLUME_TEXTURES);
// Update the pixel area of all faces
if(!isVisible())
@@ -725,7 +739,7 @@ void LLVOVolume::updateTextureVirtualSize()
const LLTextureEntry *te = face->getTextureEntry();
LLViewerTexture *imagep = face->getTexture();
if (!imagep || !te ||
- face->mExtents[0] == face->mExtents[1])
+ face->mExtents[0].equals3(face->mExtents[1]))
{
continue;
}
@@ -784,10 +798,12 @@ void LLVOVolume::updateTextureVirtualSize()
if (isSculpted())
{
LLSculptParams *sculpt_params = (LLSculptParams *)getParameterEntry(LLNetworkData::PARAMS_SCULPT);
- LLUUID id = sculpt_params->getSculptTexture();
+ LLUUID id = sculpt_params->getSculptTexture();
updateSculptTexture();
+
+
if (mSculptTexture.notNull())
{
mSculptTexture->setBoostLevel(llmax((S32)mSculptTexture->getBoostLevel(),
@@ -828,6 +844,7 @@ void LLVOVolume::updateTextureVirtualSize()
mSculptTexture->getHeight(), mSculptTexture->getWidth()));
}
}
+
}
if (getLightTextureID().notNull())
@@ -843,18 +860,18 @@ void LLVOVolume::updateTextureVirtualSize()
*camera));
}
}
-
+
if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_TEXTURE_AREA))
{
- setDebugText(llformat("%.0f:%.0f", fsqrtf(min_vsize),fsqrtf(max_vsize)));
+ setDebugText(llformat("%.0f:%.0f", (F32) sqrt(min_vsize),(F32) sqrt(max_vsize)));
}
else if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_TEXTURE_PRIORITY))
{
- setDebugText(llformat("%.0f:%.0f", fsqrtf(min_vsize),fsqrtf(max_vsize)));
+ setDebugText(llformat("%.0f:%.0f", (F32) sqrt(min_vsize),(F32) sqrt(max_vsize)));
}
else if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_FACE_AREA))
{
- setDebugText(llformat("%.0f:%.0f", fsqrtf(min_vsize),fsqrtf(max_vsize)));
+ setDebugText(llformat("%.0f:%.0f", (F32) sqrt(min_vsize),(F32) sqrt(max_vsize)));
}
if (mPixelArea == 0)
@@ -865,7 +882,8 @@ void LLVOVolume::updateTextureVirtualSize()
BOOL LLVOVolume::isActive() const
{
- return !mStatic || mTextureAnimp || (mVolumeImpl && mVolumeImpl->isActive());
+ return !mStatic || mTextureAnimp || (mVolumeImpl && mVolumeImpl->isActive()) ||
+ (mDrawable.notNull() && mDrawable->isActive());
}
BOOL LLVOVolume::setMaterial(const U8 material)
@@ -939,8 +957,35 @@ LLDrawable *LLVOVolume::createDrawable(LLPipeline *pipeline)
return mDrawable;
}
-BOOL LLVOVolume::setVolume(const LLVolumeParams &volume_params, const S32 detail, bool unique_volume)
+BOOL LLVOVolume::setVolume(const LLVolumeParams &params_in, const S32 detail, bool unique_volume)
{
+ LLVolumeParams volume_params = params_in;
+
+ S32 last_lod = mVolumep.notNull() ? LLVolumeLODGroup::getVolumeDetailFromScale(mVolumep->getDetail()) : -1;
+ S32 lod = mLOD;
+
+ BOOL is404 = FALSE;
+
+ if (isSculpted())
+ {
+ // if it's a mesh
+ if ((volume_params.getSculptType() & LL_SCULPT_TYPE_MASK) == LL_SCULPT_TYPE_MESH)
+ { //meshes might not have all LODs, get the force detail to best existing LOD
+
+ LLUUID mesh_id = volume_params.getSculptID();
+
+ //profile and path params don't matter for meshes
+ volume_params.setType(LL_PCODE_PROFILE_SQUARE, LL_PCODE_PATH_LINE);
+
+ lod = gMeshRepo.getActualMeshLOD(volume_params, lod);
+ if (lod == -1)
+ {
+ is404 = TRUE;
+ lod = 0;
+ }
+ }
+ }
+
// Check if we need to change implementations
bool is_flexible = (volume_params.getPathParams().getCurveType() == LL_PCODE_PATH_FLEXIBLE);
if (is_flexible)
@@ -968,29 +1013,53 @@ BOOL LLVOVolume::setVolume(const LLVolumeParams &volume_params, const S32 detail
}
}
- if ((LLPrimitive::setVolume(volume_params, mLOD, (mVolumeImpl && mVolumeImpl->isVolumeUnique()))) || mSculptChanged)
+ if (is404)
+ {
+ setIcon(LLViewerTextureManager::getFetchedTextureFromFile("icons/Inv_Mesh.png", TRUE, LLViewerTexture::BOOST_UI));
+ }
+
+ if ((LLPrimitive::setVolume(volume_params, lod, (mVolumeImpl && mVolumeImpl->isVolumeUnique()))) || mSculptChanged)
{
mFaceMappingChanged = TRUE;
if (mVolumeImpl)
{
- mVolumeImpl->onSetVolume(volume_params, detail);
+ mVolumeImpl->onSetVolume(volume_params, mLOD);
}
updateSculptTexture();
+
if (isSculpted())
{
updateSculptTexture();
-
- if (mSculptTexture.notNull())
+ // if it's a mesh
+ if ((volume_params.getSculptType() & LL_SCULPT_TYPE_MASK) == LL_SCULPT_TYPE_MESH)
{
- sculpt();
+ if (getVolume()->getNumVolumeFaces() == 0 || getVolume()->isTetrahedron())
+ {
+ //load request not yet issued, request pipeline load this mesh
+ LLUUID asset_id = volume_params.getSculptID();
+ S32 available_lod = gMeshRepo.loadMesh(this, volume_params, lod, last_lod);
+ if (available_lod != lod)
+ {
+ LLPrimitive::setVolume(volume_params, available_lod);
+ }
+ }
+
+ }
+ else // otherwise is sculptie
+ {
+ if (mSculptTexture.notNull())
+ {
+ sculpt();
+ }
}
}
return TRUE;
}
+
return FALSE;
}
@@ -998,7 +1067,7 @@ void LLVOVolume::updateSculptTexture()
{
LLPointer<LLViewerFetchedTexture> old_sculpt = mSculptTexture;
- if (isSculpted())
+ if (isSculpted() && !isMesh())
{
LLSculptParams *sculpt_params = (LLSculptParams *)getParameterEntry(LLNetworkData::PARAMS_SCULPT);
LLUUID id = sculpt_params->getSculptTexture();
@@ -1026,6 +1095,14 @@ void LLVOVolume::updateSculptTexture()
}
+
+
+void LLVOVolume::notifyMeshLoaded()
+{
+ mSculptChanged = TRUE;
+ gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_GEOMETRY, TRUE);
+}
+
// sculpt replaces generate() for sculpted surfaces
void LLVOVolume::sculpt()
{
@@ -1129,10 +1206,26 @@ BOOL LLVOVolume::calcLOD()
S32 cur_detail = 0;
- F32 radius = getVolume()->mLODScaleBias.scaledVec(getScale()).length();
- F32 distance = mDrawable->mDistanceWRTCamera; //llmin(mDrawable->mDistanceWRTCamera, MAX_LOD_DISTANCE);
+ F32 radius;
+ F32 distance;
+
+ if (mDrawable->isState(LLDrawable::RIGGED))
+ {
+ LLVOAvatar* avatar = getAvatar();
+ distance = avatar->mDrawable->mDistanceWRTCamera;
+ radius = avatar->getBinRadius();
+ }
+ else
+ {
+ distance = mDrawable->mDistanceWRTCamera;
+ radius = getVolume()->mLODScaleBias.scaledVec(getScale()).length();
+ }
+
+ //hold onto unmodified distance for debugging
+ F32 debug_distance = distance;
+
distance *= sDistanceFactor;
-
+
F32 rampDist = LLVOVolume::sLODFactor * 2;
if (distance < rampDist)
@@ -1149,6 +1242,12 @@ BOOL LLVOVolume::calcLOD()
cur_detail = computeLODDetail(llround(distance, 0.01f),
llround(radius, 0.01f));
+
+ if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_LOD_INFO))
+ {
+ setDebugText(llformat("%.2f:%.2f, %d", debug_distance, radius, cur_detail));
+ }
+
if (cur_detail != mLOD)
{
mAppAngle = llround((F32) atan2( mDrawable->getRadius(), mDrawable->mDistanceWRTCamera) * RAD_TO_DEG, 0.01f);
@@ -1176,7 +1275,7 @@ BOOL LLVOVolume::updateLOD()
mLODChanged = TRUE;
}
- lod_changed |= LLViewerObject::updateLOD();
+ lod_changed = lod_changed || LLViewerObject::updateLOD();
return lod_changed;
}
@@ -1212,6 +1311,11 @@ void LLVOVolume::updateFaceFlags()
for (S32 i = 0; i < getVolume()->getNumFaces(); i++)
{
LLFace *face = mDrawable->getFace(i);
+ if (!face)
+ {
+ return;
+ }
+
BOOL fullbright = getTE(i)->getFullbright();
face->clearState(LLFace::FULLBRIGHT | LLFace::HUD_RENDER | LLFace::LIGHT);
@@ -1291,14 +1395,28 @@ BOOL LLVOVolume::genBBoxes(BOOL force_global)
{
BOOL res = TRUE;
- LLVector3 min,max;
+ LLVector4a min,max;
- BOOL rebuild = mDrawable->isState(LLDrawable::REBUILD_VOLUME | LLDrawable::REBUILD_POSITION);
+ min.clear();
+ max.clear();
- for (S32 i = 0; i < getVolume()->getNumFaces(); i++)
+ BOOL rebuild = mDrawable->isState(LLDrawable::REBUILD_VOLUME | LLDrawable::REBUILD_POSITION | LLDrawable::REBUILD_RIGGED);
+
+// bool rigged = false;
+ LLVolume* volume = mRiggedVolume;
+ if (!volume)
+ {
+ volume = getVolume();
+ }
+
+ for (S32 i = 0; i < getVolume()->getNumVolumeFaces(); i++)
{
LLFace *face = mDrawable->getFace(i);
- res &= face->genVolumeBBoxes(*getVolume(), i,
+ if (!face)
+ {
+ continue;
+ }
+ res &= face->genVolumeBBoxes(*volume, i,
mRelativeXform, mRelativeXformInvTrans,
(mVolumeImpl && mVolumeImpl->isVolumeGlobal()) || force_global);
@@ -1311,17 +1429,8 @@ BOOL LLVOVolume::genBBoxes(BOOL force_global)
}
else
{
- for (U32 i = 0; i < 3; i++)
- {
- if (face->mExtents[0].mV[i] < min.mV[i])
- {
- min.mV[i] = face->mExtents[0].mV[i];
- }
- if (face->mExtents[1].mV[i] > max.mV[i])
- {
- max.mV[i] = face->mExtents[1].mV[i];
- }
- }
+ min.setMin(min, face->mExtents[0]);
+ max.setMax(max, face->mExtents[1]);
}
}
}
@@ -1329,7 +1438,9 @@ BOOL LLVOVolume::genBBoxes(BOOL force_global)
if (rebuild)
{
mDrawable->setSpatialExtents(min,max);
- mDrawable->setPositionGroup((min+max)*0.5f);
+ min.add(max);
+ min.mul(0.5f);
+ mDrawable->setPositionGroup(min);
}
updateRadius();
@@ -1356,7 +1467,21 @@ void LLVOVolume::updateRelativeXform()
LLDrawable* drawable = mDrawable;
- if (drawable->isActive())
+ if (drawable->isState(LLDrawable::RIGGED) && mRiggedVolume.notNull())
+ { //rigged volume (which is in agent space) is used for generating bounding boxes etc
+ //inverse of render matrix should go to partition space
+ mRelativeXform = getRenderMatrix();
+
+ F32* dst = (F32*) mRelativeXformInvTrans.mMatrix;
+ F32* src = (F32*) mRelativeXform.mMatrix;
+ dst[0] = src[0]; dst[1] = src[1]; dst[2] = src[2];
+ dst[3] = src[4]; dst[4] = src[5]; dst[5] = src[6];
+ dst[6] = src[8]; dst[7] = src[9]; dst[8] = src[10];
+
+ mRelativeXform.invert();
+ mRelativeXformInvTrans.transpose();
+ }
+ else if (drawable->isActive())
{
// setup relative transforms
LLQuaternion delta_rot;
@@ -1438,11 +1563,22 @@ void LLVOVolume::updateRelativeXform()
static LLFastTimer::DeclareTimer FTM_GEN_FLEX("Generate Flexies");
static LLFastTimer::DeclareTimer FTM_UPDATE_PRIMITIVES("Update Primitives");
+static LLFastTimer::DeclareTimer FTM_UPDATE_RIGGED_VOLUME("Update Rigged");
BOOL LLVOVolume::updateGeometry(LLDrawable *drawable)
{
LLFastTimer t(FTM_UPDATE_PRIMITIVES);
+ if (mDrawable->isState(LLDrawable::REBUILD_RIGGED))
+ {
+ {
+ LLFastTimer t(FTM_UPDATE_RIGGED_VOLUME);
+ updateRiggedVolume();
+ }
+ genBBoxes(FALSE);
+ mDrawable->clearState(LLDrawable::REBUILD_RIGGED);
+ }
+
if (mVolumeImpl != NULL)
{
BOOL res;
@@ -1519,6 +1655,17 @@ BOOL LLVOVolume::updateGeometry(LLDrawable *drawable)
regenFaces();
}
genBBoxes(FALSE);
+
+ if (mSculptChanged)
+ { //changes in sculpt maps can thrash an object bounding box without
+ //triggering a spatial group bounding box update -- force spatial group
+ //to update bounding boxes
+ LLSpatialGroup* group = mDrawable->getSpatialGroup();
+ if (group)
+ {
+ group->unbound();
+ }
+ }
}
}
}
@@ -1538,12 +1685,12 @@ BOOL LLVOVolume::updateGeometry(LLDrawable *drawable)
{
LLPipeline::sCompiles++;
}
-
+
mVolumeChanged = FALSE;
mLODChanged = FALSE;
mSculptChanged = FALSE;
mFaceMappingChanged = FALSE;
-
+
return LLViewerObject::updateGeometry(drawable);
}
@@ -1552,19 +1699,14 @@ void LLVOVolume::updateFaceSize(S32 idx)
LLFace* facep = mDrawable->getFace(idx);
if (idx >= getVolume()->getNumVolumeFaces())
{
- facep->setSize(0,0);
+ facep->setSize(0,0, true);
}
else
{
const LLVolumeFace& vol_face = getVolume()->getVolumeFace(idx);
- if (LLPipeline::sUseTriStrips)
- {
- facep->setSize(vol_face.mVertices.size(), vol_face.mTriStrip.size());
- }
- else
- {
- facep->setSize(vol_face.mVertices.size(), vol_face.mIndices.size());
- }
+ facep->setSize(vol_face.mNumVertices, vol_face.mNumIndices,
+ true); // <--- volume faces should be padded for 16-byte alignment
+
}
}
@@ -1819,21 +1961,25 @@ bool LLVOVolume::hasMedia() const
LLVector3 LLVOVolume::getApproximateFaceNormal(U8 face_id)
{
LLVolume* volume = getVolume();
- LLVector3 result;
+ LLVector4a result;
+ result.clear();
+
+ LLVector3 ret;
if (volume && face_id < volume->getNumVolumeFaces())
{
const LLVolumeFace& face = volume->getVolumeFace(face_id);
- for (S32 i = 0; i < (S32)face.mVertices.size(); ++i)
+ for (S32 i = 0; i < (S32)face.mNumVertices; ++i)
{
- result += face.mVertices[i].mNormal;
+ result.add(face.mNormals[i]);
}
- result = volumeDirectionToAgent(result);
- result.normVec();
+ LLVector3 ret(result.getF32ptr());
+ ret = volumeDirectionToAgent(ret);
+ ret.normVec();
}
- return result;
+ return ret;
}
void LLVOVolume::requestMediaDataUpdate(bool isNew)
@@ -2630,6 +2776,23 @@ BOOL LLVOVolume::isSculpted() const
return FALSE;
}
+BOOL LLVOVolume::isMesh() const
+{
+ if (isSculpted())
+ {
+ LLSculptParams *sculpt_params = (LLSculptParams *)getParameterEntry(LLNetworkData::PARAMS_SCULPT);
+ U8 sculpt_type = sculpt_params->getSculptType();
+
+ if ((sculpt_type & LL_SCULPT_TYPE_MASK) == LL_SCULPT_TYPE_MESH)
+ // mesh is a mesh
+ {
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
BOOL LLVOVolume::hasLightTexture() const
{
if (getParameterEntryInUse(LLNetworkData::PARAMS_LIGHT_IMAGE))
@@ -2646,6 +2809,11 @@ BOOL LLVOVolume::isVolumeGlobal() const
{
return mVolumeImpl->isVolumeGlobal() ? TRUE : FALSE;
}
+ else if (mRiggedVolume.notNull())
+ {
+ return TRUE;
+ }
+
return FALSE;
}
@@ -2730,7 +2898,7 @@ void LLVOVolume::generateSilhouette(LLSelectNode* nodep, const LLVector3& view_p
trans_mat.translate(getRegion()->getOriginAgent());
}
- volume->generateSilhouetteVertices(nodep->mSilhouetteVertices, nodep->mSilhouetteNormals, nodep->mSilhouetteSegments, view_vector, trans_mat, mRelativeXformInvTrans, nodep->getTESelectMask());
+ volume->generateSilhouetteVertices(nodep->mSilhouetteVertices, nodep->mSilhouetteNormals, view_vector, trans_mat, mRelativeXformInvTrans, nodep->getTESelectMask());
nodep->mSilhouetteExists = TRUE;
}
@@ -2916,6 +3084,62 @@ U32 LLVOVolume::getRenderCost(std::set<LLUUID> &textures) const
}
+F32 LLVOVolume::getStreamingCost(S32* bytes, S32* visible_bytes)
+{
+ 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;
+}
+
+U32 LLVOVolume::getTriangleCount()
+{
+ U32 count = 0;
+ LLVolume* volume = getVolume();
+ if (volume)
+ {
+ count = volume->getNumTriangles();
+ }
+
+ return count;
+}
+
+U32 LLVOVolume::getHighLODTriangleCount()
+{
+ U32 ret = 0;
+
+ LLVolume* volume = getVolume();
+
+ if (!isSculpted())
+ {
+ LLVolume* ref = LLPrimitive::getVolumeManager()->refVolume(volume->getParams(), 3);
+ ret = ref->getNumTriangles();
+ LLPrimitive::getVolumeManager()->unrefVolume(ref);
+ }
+ else if (isMesh())
+ {
+ LLVolume* ref = LLPrimitive::getVolumeManager()->refVolume(volume->getParams(), 3);
+ if (ref->isTetrahedron() || ref->getNumVolumeFaces() == 0)
+ {
+ gMeshRepo.loadMesh(this, volume->getParams(), LLModel::LOD_HIGH);
+ }
+ ret = ref->getNumTriangles();
+ LLPrimitive::getVolumeManager()->unrefVolume(ref);
+ }
+ else
+ { //default sculpts have a constant number of triangles
+ ret = 31*2*31; //31 rows of 31 columns of quads for a 32x32 vertex patch
+ }
+
+ return ret;
+}
+
//static
void LLVOVolume::preUpdateGeom()
{
@@ -2953,7 +3177,7 @@ void LLVOVolume::setSelected(BOOL sel)
}
}
-void LLVOVolume::updateSpatialExtents(LLVector3& newMin, LLVector3& newMax)
+void LLVOVolume::updateSpatialExtents(LLVector4a& newMin, LLVector4a& newMax)
{
}
@@ -2961,7 +3185,9 @@ F32 LLVOVolume::getBinRadius()
{
F32 radius;
- const LLVector3* ext = mDrawable->getSpatialExtents();
+ F32 scale = 1.f;
+
+ const LLVector4a* ext = mDrawable->getSpatialExtents();
BOOL shrink_wrap = mDrawable->isAnimating();
BOOL alpha_wrap = FALSE;
@@ -2993,7 +3219,10 @@ F32 LLVOVolume::getBinRadius()
}
else if (shrink_wrap)
{
- radius = (ext[1]-ext[0]).length()*0.5f;
+ LLVector4a rad;
+ rad.setSub(ext[1], ext[0]);
+
+ radius = rad.getLength3().getF32()*0.5f;
}
else if (mDrawable->isStatic())
{
@@ -3017,7 +3246,7 @@ F32 LLVOVolume::getBinRadius()
radius = 8.f;
}
- return llclamp(radius, 0.5f, 256.f);
+ return llclamp(radius*scale, 0.5f, 256.f);
}
const LLVector3 LLVOVolume::getPivotPositionAgent() const
@@ -3029,7 +3258,7 @@ const LLVector3 LLVOVolume::getPivotPositionAgent() const
return LLViewerObject::getPivotPositionAgent();
}
-void LLVOVolume::onShift(const LLVector3 &shift_vector)
+void LLVOVolume::onShift(const LLVector4a &shift_vector)
{
if (mVolumeImpl)
{
@@ -3106,12 +3335,37 @@ BOOL LLVOVolume::lineSegmentIntersect(const LLVector3& start, const LLVector3& e
BOOL ret = FALSE;
LLVolume* volume = getVolume();
+
+ bool transform = true;
+
+ if (mDrawable->isState(LLDrawable::RIGGED))
+ {
+ if (LLFloater::isVisible(gFloaterTools) && getAvatar()->isSelf())
+ {
+ gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_RIGGED, TRUE);
+ volume = mRiggedVolume;
+ transform = false;
+ }
+ else
+ { //cannot pick rigged attachments on other avatars or when not in build mode
+ return FALSE;
+ }
+ }
+
if (volume)
{
LLVector3 v_start, v_end, v_dir;
- v_start = agentPositionToVolume(start);
- v_end = agentPositionToVolume(end);
+ if (transform)
+ {
+ v_start = agentPositionToVolume(start);
+ v_end = agentPositionToVolume(end);
+ }
+ else
+ {
+ v_start = start;
+ v_end = end;
+ }
LLVector3 p;
LLVector3 n;
@@ -3152,8 +3406,15 @@ BOOL LLVOVolume::lineSegmentIntersect(const LLVector3& start, const LLVector3& e
end_face = face+1;
}
+ bool special_cursor = specialHoverCursor();
for (S32 i = start_face; i < end_face; ++i)
{
+ if (!special_cursor && !pick_transparent && getTE(i)->getColor().mV[3] == 0.f)
+ { //don't attempt to pick completely transparent faces unless
+ //pick_transparent is true
+ continue;
+ }
+
face_hit = volume->lineSegmentIntersect(v_start, v_end, i,
&p, &tc, &n, &bn);
@@ -3171,18 +3432,40 @@ BOOL LLVOVolume::lineSegmentIntersect(const LLVector3& start, const LLVector3& e
if (intersection != NULL)
{
- *intersection = volumePositionToAgent(p); // must map back to agent space
+ if (transform)
+ {
+ *intersection = volumePositionToAgent(p); // must map back to agent space
+ }
+ else
+ {
+ *intersection = p;
+ }
}
if (normal != NULL)
{
- *normal = volumeDirectionToAgent(n);
+ if (transform)
+ {
+ *normal = volumeDirectionToAgent(n);
+ }
+ else
+ {
+ *normal = n;
+ }
+
(*normal).normVec();
}
if (bi_normal != NULL)
{
- *bi_normal = volumeDirectionToAgent(bn);
+ if (transform)
+ {
+ *bi_normal = volumeDirectionToAgent(bn);
+ }
+ else
+ {
+ *bi_normal = bn;
+ }
(*bi_normal).normVec();
}
@@ -3200,6 +3483,201 @@ BOOL LLVOVolume::lineSegmentIntersect(const LLVector3& start, const LLVector3& e
return ret;
}
+bool LLVOVolume::treatAsRigged()
+{
+ return LLFloater::isVisible(gFloaterTools) &&
+ isAttachment() &&
+ getAvatar() &&
+ getAvatar()->isSelf() &&
+ mDrawable.notNull() &&
+ mDrawable->isState(LLDrawable::RIGGED);
+}
+
+LLRiggedVolume* LLVOVolume::getRiggedVolume()
+{
+ return mRiggedVolume;
+}
+
+void LLVOVolume::clearRiggedVolume()
+{
+ if (mRiggedVolume.notNull())
+ {
+ mRiggedVolume = NULL;
+ updateRelativeXform();
+ }
+}
+
+void LLVOVolume::updateRiggedVolume()
+{
+ //Update mRiggedVolume to match current animation frame of avatar.
+ //Also update position/size in octree.
+
+ if (!treatAsRigged())
+ {
+ clearRiggedVolume();
+
+ return;
+ }
+
+ LLVolume* volume = getVolume();
+
+ const LLMeshSkinInfo* skin = gMeshRepo.getSkinInfo(volume->getParams().getSculptID());
+
+ if (!skin)
+ {
+ clearRiggedVolume();
+ return;
+ }
+
+ LLVOAvatar* avatar = getAvatar();
+
+ if (!avatar)
+ {
+ clearRiggedVolume();
+ return;
+ }
+
+ if (!mRiggedVolume)
+ {
+ LLVolumeParams p;
+ mRiggedVolume = new LLRiggedVolume(p);
+ updateRelativeXform();
+ }
+
+ mRiggedVolume->update(skin, avatar, volume);
+
+}
+
+static LLFastTimer::DeclareTimer FTM_SKIN_RIGGED("Skin");
+static LLFastTimer::DeclareTimer FTM_RIGGED_OCTREE("Octree");
+
+void LLRiggedVolume::update(const LLMeshSkinInfo* skin, LLVOAvatar* avatar, const LLVolume* volume)
+{
+ bool copy = false;
+ if (volume->getNumVolumeFaces() != getNumVolumeFaces())
+ {
+ copy = true;
+ }
+
+ for (S32 i = 0; i < volume->getNumVolumeFaces() && !copy; ++i)
+ {
+ const LLVolumeFace& src_face = volume->getVolumeFace(i);
+ const LLVolumeFace& dst_face = getVolumeFace(i);
+
+ if (src_face.mNumIndices != dst_face.mNumIndices ||
+ src_face.mNumVertices != dst_face.mNumVertices)
+ {
+ copy = true;
+ }
+ }
+
+ if (copy)
+ {
+ copyVolumeFaces(volume);
+ }
+
+ //build matrix palette
+ LLMatrix4a mp[64];
+ LLMatrix4* mat = (LLMatrix4*) mp;
+
+ for (U32 j = 0; j < skin->mJointNames.size(); ++j)
+ {
+ LLJoint* joint = avatar->getJoint(skin->mJointNames[j]);
+ if (joint)
+ {
+ mat[j] = skin->mInvBindMatrix[j];
+ mat[j] *= joint->getWorldMatrix();
+ }
+ }
+
+ for (S32 i = 0; i < volume->getNumVolumeFaces(); ++i)
+ {
+ const LLVolumeFace& vol_face = volume->getVolumeFace(i);
+
+ LLVolumeFace& dst_face = mVolumeFaces[i];
+
+ LLVector4a* weight = vol_face.mWeights;
+
+ LLMatrix4a bind_shape_matrix;
+ bind_shape_matrix.loadu(skin->mBindShapeMatrix);
+
+ LLVector4a* pos = dst_face.mPositions;
+
+ {
+ LLFastTimer t(FTM_SKIN_RIGGED);
+
+ for (U32 j = 0; j < dst_face.mNumVertices; ++j)
+ {
+ LLMatrix4a final_mat;
+ final_mat.clear();
+
+ S32 idx[4];
+
+ LLVector4 wght;
+
+ F32 scale = 0.f;
+ for (U32 k = 0; k < 4; k++)
+ {
+ F32 w = weight[j][k];
+
+ idx[k] = (S32) floorf(w);
+ wght[k] = w - floorf(w);
+ scale += wght[k];
+ }
+
+ wght *= 1.f/scale;
+
+ for (U32 k = 0; k < 4; k++)
+ {
+ F32 w = wght[k];
+
+ LLMatrix4a src;
+ src.setMul(mp[idx[k]], w);
+
+ final_mat.add(src);
+ }
+
+
+ LLVector4a& v = vol_face.mPositions[j];
+ LLVector4a t;
+ LLVector4a dst;
+ bind_shape_matrix.affineTransform(v, t);
+ final_mat.affineTransform(t, dst);
+ pos[j] = dst;
+ }
+
+ //update bounding box
+ LLVector4a& min = dst_face.mExtents[0];
+ LLVector4a& max = dst_face.mExtents[1];
+
+ min = pos[0];
+ max = pos[1];
+
+ for (U32 j = 1; j < dst_face.mNumVertices; ++j)
+ {
+ min.setMin(min, pos[j]);
+ max.setMax(max, pos[j]);
+ }
+
+ dst_face.mCenter->setAdd(dst_face.mExtents[0], dst_face.mExtents[1]);
+ dst_face.mCenter->mul(0.5f);
+
+ }
+
+ {
+ LLFastTimer t(FTM_RIGGED_OCTREE);
+ delete dst_face.mOctree;
+ dst_face.mOctree = NULL;
+
+ LLVector4a size;
+ size.setSub(dst_face.mExtents[1], dst_face.mExtents[0]);
+ size.splat(size.getLength3().getF32()*0.5f);
+
+ dst_face.createOctree(1.f);
+ }
+ }
+}
+
U32 LLVOVolume::getPartitionType() const
{
if (isHUDAttachment())
@@ -3252,7 +3730,7 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep,
(type == LLRenderPass::PASS_INVISIBLE) ||
(type == LLRenderPass::PASS_ALPHA && facep->isState(LLFace::FULLBRIGHT));
- if (!fullbright && type != LLRenderPass::PASS_GLOW && !facep->mVertexBuffer->hasDataType(LLVertexBuffer::TYPE_NORMAL))
+ if (!fullbright && type != LLRenderPass::PASS_GLOW && !facep->getVertexBuffer()->hasDataType(LLVertexBuffer::TYPE_NORMAL))
{
llwarns << "Non fullbright face has no normals!" << llendl;
return;
@@ -3274,22 +3752,20 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep,
else
{
model_mat = &(drawable->getRegion()->mRenderMatrix);
+ if (model_mat->isIdentity())
+ {
+ model_mat = NULL;
+ }
}
-
U8 bump = (type == LLRenderPass::PASS_BUMP || type == LLRenderPass::PASS_POST_BUMP) ? facep->getTextureEntry()->getBumpmap() : 0;
LLViewerTexture* tex = facep->getTexture();
U8 glow = (U8) (facep->getTextureEntry()->getGlow() * 255);
- if (facep->mVertexBuffer.isNull())
- {
- llerrs << "WTF?" << llendl;
- }
-
if (idx >= 0 &&
- draw_vec[idx]->mVertexBuffer == facep->mVertexBuffer &&
+ draw_vec[idx]->mVertexBuffer == facep->getVertexBuffer() &&
draw_vec[idx]->mEnd == facep->getGeomIndex()-1 &&
(LLPipeline::sTextureBindTest || draw_vec[idx]->mTexture == tex) &&
#if LL_DARWIN
@@ -3305,7 +3781,7 @@ 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());
- validate_draw_info(*draw_vec[idx]);
+ 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]);
}
@@ -3316,7 +3792,7 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep,
U32 offset = facep->getIndicesStart();
U32 count = facep->getIndicesCount();
LLPointer<LLDrawInfo> draw_info = new LLDrawInfo(start,end,count,offset, tex,
- facep->mVertexBuffer, fullbright, bump);
+ facep->getVertexBuffer(), fullbright, bump);
draw_info->mGroup = group;
draw_info->mVSize = facep->getVirtualSize();
draw_vec.push_back(draw_info);
@@ -3329,12 +3805,13 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep,
}
draw_info->mExtents[0] = facep->mExtents[0];
draw_info->mExtents[1] = facep->mExtents[1];
- validate_draw_info(*draw_info);
if (LLPipeline::sUseTriStrips)
{
draw_info->mDrawMode = LLRender::TRIANGLE_STRIP;
}
+
+ draw_info->validate();
}
}
@@ -3346,6 +3823,32 @@ void LLVolumeGeometryManager::getGeometry(LLSpatialGroup* group)
static LLFastTimer::DeclareTimer FTM_REBUILD_VOLUME_VB("Volume");
static LLFastTimer::DeclareTimer FTM_REBUILD_VBO("VBO Rebuilt");
+static LLDrawPoolAvatar* get_avatar_drawpool(LLViewerObject* vobj)
+{
+ LLVOAvatar* avatar = vobj->getAvatar();
+
+ if (avatar)
+ {
+ LLDrawable* drawable = avatar->mDrawable;
+ if (drawable && drawable->getNumFaces() > 0)
+ {
+ LLFace* face = drawable->getFace(0);
+ if (face)
+ {
+ LLDrawPool* drawpool = face->getPool();
+ if (drawpool)
+ {
+ if (drawpool->getType() == LLDrawPool::POOL_AVATAR)
+ {
+ return (LLDrawPoolAvatar*) drawpool;
+ }
+ }
+ }
+ }
+ }
+
+ return NULL;
+}
void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
{
@@ -3384,8 +3887,8 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
std::vector<LLFace*> alpha_faces;
U32 useage = group->mSpatialPartition->mBufferUsage;
- U32 max_vertices = (gSavedSettings.getS32("RenderMaxVBOSize")*1024)/LLVertexBuffer::calcStride(group->mSpatialPartition->mVertexDataMask);
- U32 max_total = (gSavedSettings.getS32("RenderMaxNodeSize")*1024)/LLVertexBuffer::calcStride(group->mSpatialPartition->mVertexDataMask);
+ U32 max_vertices = (gSavedSettings.getS32("RenderMaxVBOSize")*1024)/LLVertexBuffer::calcVertexSize(group->mSpatialPartition->mVertexDataMask);
+ U32 max_total = (gSavedSettings.getS32("RenderMaxNodeSize")*1024)/LLVertexBuffer::calcVertexSize(group->mSpatialPartition->mVertexDataMask);
max_vertices = llmin(max_vertices, (U32) 65535);
U32 cur_total = 0;
@@ -3406,29 +3909,210 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
}
LLVOVolume* vobj = drawablep->getVOVolume();
+
+ if (vobj->getVolume() && vobj->getVolume()->isTetrahedron())
+ {
+ continue;
+ }
+
llassert_always(vobj);
vobj->updateTextureVirtualSize();
vobj->preRebuild();
drawablep->clearState(LLDrawable::HAS_ALPHA);
+ bool rigged = vobj->isAttachment() &&
+ vobj->isMesh() &&
+ gMeshRepo.getSkinInfo(vobj->getVolume()->getParams().getSculptID());
+
+ bool bake_sunlight = LLPipeline::sBakeSunlight && drawablep->isStatic();
+
+ bool is_rigged = false;
+
//for each face
for (S32 i = 0; i < drawablep->getNumFaces(); i++)
{
+ LLFace* facep = drawablep->getFace(i);
+
+ //ALWAYS null out vertex buffer on rebuild -- if the face lands in a render
+ // batch, it will recover its vertex buffer reference from the spatial group
+ facep->setVertexBuffer(NULL);
+
//sum up face verts and indices
drawablep->updateFaceSize(i);
- LLFace* facep = drawablep->getFace(i);
+
+
+
+ if (rigged)
+ {
+ if (!facep->isState(LLFace::RIGGED))
+ { //completely reset vertex buffer
+ facep->clearVertexBuffer();
+ }
+
+ facep->setState(LLFace::RIGGED);
+ is_rigged = true;
+
+ //get drawpool of avatar with rigged face
+ LLDrawPoolAvatar* pool = get_avatar_drawpool(vobj);
+
+ //Determine if we've received skininfo that contains an
+ //alternate bind matrix - if it does then apply the translational component
+ //to the joints of the avatar.
+ LLVOAvatar* pAvatarVO = vobj->getAvatar();
+ bool pelvisGotSet = false;
+
+ if ( pAvatarVO )
+ {
+ LLUUID currentId = vobj->getVolume()->getParams().getSculptID();
+ const LLMeshSkinInfo* pSkinData = gMeshRepo.getSkinInfo( currentId );
+
+ if ( pSkinData )
+ {
+ const int bindCnt = pSkinData->mAlternateBindMatrix.size();
+ if ( bindCnt > 0 )
+ {
+ const int jointCnt = pSkinData->mJointNames.size();
+ const F32 pelvisZOffset = pSkinData->mPelvisOffset;
+ bool fullRig = (jointCnt>=20) ? true : false;
+ if ( fullRig )
+ {
+ for ( int i=0; i<jointCnt; ++i )
+ {
+ std::string lookingForJoint = pSkinData->mJointNames[i].c_str();
+ //llinfos<<"joint name "<<lookingForJoint.c_str()<<llendl;
+ LLJoint* pJoint = pAvatarVO->getJoint( lookingForJoint );
+ if ( pJoint && pJoint->getId() != currentId )
+ {
+ pJoint->setId( currentId );
+ const LLVector3& jointPos = pSkinData->mAlternateBindMatrix[i].getTranslation();
+ //Set the joint position
+ pJoint->storeCurrentXform( jointPos );
+ //If joint is a pelvis then handle old/new pelvis to foot values
+ if ( lookingForJoint == "mPelvis" )
+ {
+ pJoint->storeCurrentXform( jointPos );
+ if ( !pAvatarVO->hasPelvisOffset() )
+ {
+ pAvatarVO->setPelvisOffset( true, jointPos, pelvisZOffset );
+ //Trigger to rebuild viewer AV
+ pelvisGotSet = true;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ //If we've set the pelvis to a new position we need to also rebuild some information that the
+ //viewer does at launch (e.g. body size etc.)
+ if ( pelvisGotSet )
+ {
+ pAvatarVO->postPelvisSetRecalc();
+ }
+
+ if (pool)
+ {
+ const LLTextureEntry* te = facep->getTextureEntry();
+
+ //remove face from old pool if it exists
+ LLDrawPool* old_pool = facep->getPool();
+ if (old_pool && old_pool->getType() == LLDrawPool::POOL_AVATAR)
+ {
+ ((LLDrawPoolAvatar*) old_pool)->removeRiggedFace(facep);
+ }
+
+ //add face to new pool
+ LLViewerTexture* tex = facep->getTexture();
+ U32 type = gPipeline.getPoolTypeFromTE(te, tex);
+
+ if (type == LLDrawPool::POOL_ALPHA)
+ {
+ if (te->getFullbright())
+ {
+ pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_FULLBRIGHT_ALPHA);
+ }
+ else
+ {
+ pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_ALPHA);
+ }
+ }
+ else if (te->getShiny())
+ {
+ if (te->getFullbright())
+ {
+ pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_FULLBRIGHT_SHINY);
+ }
+ else
+ {
+ if (LLPipeline::sRenderDeferred)
+ {
+ pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_SIMPLE);
+ }
+ else
+ {
+ pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_SHINY);
+ }
+ }
+ }
+ else
+ {
+ if (te->getFullbright())
+ {
+ pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_FULLBRIGHT);
+ }
+ else
+ {
+ pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_SIMPLE);
+ }
+ }
+
+ if (te->getGlow())
+ {
+ pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_GLOW);
+ }
+
+ if (LLPipeline::sRenderDeferred)
+ {
+ if (type != LLDrawPool::POOL_ALPHA && !te->getFullbright())
+ {
+ if (te->getBumpmap())
+ {
+ pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_DEFERRED_BUMP);
+ }
+ else
+ {
+ pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_DEFERRED_SIMPLE);
+ }
+ }
+ }
+ }
+
+ continue;
+ }
+ else
+ {
+ if (facep->isState(LLFace::RIGGED))
+ { //face is not rigged but used to be, remove from rigged face pool
+ LLDrawPoolAvatar* pool = (LLDrawPoolAvatar*) facep->getPool();
+ if (pool)
+ {
+ pool->removeRiggedFace(facep);
+ }
+ facep->clearState(LLFace::RIGGED);
+ }
+ }
if (cur_total > max_total || facep->getIndicesCount() <= 0 || facep->getGeomCount() <= 0)
{
- facep->mVertexBuffer = NULL;
- facep->mLastVertexBuffer = NULL;
+ facep->clearVertexBuffer();
continue;
}
cur_total += facep->getGeomCount();
- if (facep->hasGeometry() && facep->mPixelArea > FORCE_CULL_AREA)
+ if (facep->hasGeometry() && facep->getPixelArea() > FORCE_CULL_AREA)
{
const LLTextureEntry* te = facep->getTextureEntry();
LLViewerTexture* tex = facep->getTexture();
@@ -3441,7 +4125,7 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
}
}
- BOOL force_simple = (facep->mPixelArea < FORCE_SIMPLE_RENDER_AREA);
+ BOOL force_simple = (facep->getPixelArea() < FORCE_SIMPLE_RENDER_AREA);
U32 type = gPipeline.getPoolTypeFromTE(te, tex);
if (type != LLDrawPool::POOL_ALPHA && force_simple)
{
@@ -3513,7 +4197,7 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
bump_faces.push_back(facep);
}
else if ((te->getShiny() && LLPipeline::sRenderBump) ||
- !te->getFullbright())
+ !(te->getFullbright() || bake_sunlight))
{ //needs normal
simple_faces.push_back(facep);
}
@@ -3527,10 +4211,18 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
}
else
{ //face has no renderable geometry
- facep->mVertexBuffer = NULL;
- facep->mLastVertexBuffer = NULL;
+ facep->clearVertexBuffer();
}
}
+
+ if (is_rigged)
+ {
+ drawablep->setState(LLDrawable::RIGGED);
+ }
+ else
+ {
+ drawablep->clearState(LLDrawable::RIGGED);
+ }
}
group->mBufferUsage = useage;
@@ -3545,7 +4237,7 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
{
bump_mask |= LLVertexBuffer::MAP_BINORMAL;
}
-
+
genDrawInfo(group, simple_mask, simple_faces);
genDrawInfo(group, bump_mask, bump_faces);
genDrawInfo(group, fullbright_mask, fullbright_faces);
@@ -3591,24 +4283,25 @@ void LLVolumeGeometryManager::rebuildMesh(LLSpatialGroup* group)
LLFastTimer t(FTM_VOLUME_GEOM_PARTIAL);
LLDrawable* drawablep = *drawable_iter;
- if (drawablep->isDead() || drawablep->isState(LLDrawable::FORCE_INVISIBLE) )
- {
- continue;
- }
-
- if (drawablep->isState(LLDrawable::REBUILD_ALL))
+ if (!drawablep->isDead() && drawablep->isState(LLDrawable::REBUILD_ALL) )
{
LLVOVolume* vobj = drawablep->getVOVolume();
vobj->preRebuild();
+
LLVolume* volume = vobj->getVolume();
for (S32 i = 0; i < drawablep->getNumFaces(); ++i)
{
LLFace* face = drawablep->getFace(i);
- if (face && face->mVertexBuffer.notNull())
+ if (face && face->getVertexBuffer())
{
face->getGeometryVolume(*volume, face->getTEOffset(),
vobj->getRelativeXform(), vobj->getRelativeXformInvTrans(), face->getGeomIndex());
}
+
+ if (!face)
+ {
+ llerrs << "WTF?" << llendl;
+ }
}
drawablep->clearState(LLDrawable::REBUILD_ALL);
@@ -3651,9 +4344,10 @@ void LLVolumeGeometryManager::rebuildMesh(LLSpatialGroup* group)
for (S32 i = 0; i < drawablep->getNumFaces(); ++i)
{
LLFace* face = drawablep->getFace(i);
- if (face && face->mVertexBuffer.notNull() && face->mVertexBuffer->isLocked())
+ LLVertexBuffer* buff = face->getVertexBuffer();
+ if (face && buff && buff->isLocked())
{
- face->mVertexBuffer->setBuffer(0) ;
+ buff->setBuffer(0) ;
}
}
}
@@ -3671,7 +4365,7 @@ void LLVolumeGeometryManager::rebuildMesh(LLSpatialGroup* group)
void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::vector<LLFace*>& faces, BOOL distance_sort)
{
//calculate maximum number of vertices to store in a single buffer
- U32 max_vertices = (gSavedSettings.getS32("RenderMaxVBOSize")*1024)/LLVertexBuffer::calcStride(group->mSpatialPartition->mVertexDataMask);
+ U32 max_vertices = (gSavedSettings.getS32("RenderMaxVBOSize")*1024)/LLVertexBuffer::calcVertexSize(group->mSpatialPartition->mVertexDataMask);
max_vertices = llmin(max_vertices, (U32) 65535);
if (!distance_sort)
@@ -3718,10 +4412,12 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::
buffer_index = 0;
}
+ bool bake_sunlight = LLPipeline::sBakeSunlight && facep->getDrawable()->isStatic();
+
U32 index_count = facep->getIndicesCount();
U32 geom_count = facep->getGeomCount();
- //sum up vertices needed for this texture
+ //sum up vertices needed for this render batch
std::vector<LLFace*>::iterator i = face_iter;
++i;
@@ -3731,7 +4427,7 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::
facep = *i;
if (geom_count + facep->getGeomCount() > max_vertices)
- { //cut vertex buffers on geom count too big
+ { //cut batches on geom count too big
break;
}
@@ -3759,10 +4455,11 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::
buffer->allocateBuffer(geom_count, index_count, TRUE);
}
else
- {
- if (LLVertexBuffer::sEnableVBOs && buffer->getUsage() != group->mBufferUsage)
+ { //resize pre-existing buffer
+ if (LLVertexBuffer::sEnableVBOs && buffer->getUsage() != group->mBufferUsage ||
+ buffer->getTypeMask() != mask)
{
- buffer = createVertexBuffer(group->mSpatialPartition->mVertexDataMask,
+ buffer = createVertexBuffer(mask,
group->mBufferUsage);
buffer->allocateBuffer(geom_count, index_count, TRUE);
}
@@ -3780,15 +4477,18 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::
U16 index_offset = 0;
while (face_iter < i)
- {
+ { //update face indices for new buffer
facep = *face_iter;
- facep->mIndicesIndex = indices_index;
- facep->mGeomIndex = index_offset;
- facep->mVertexBuffer = buffer;
+ facep->setIndicesIndex(indices_index);
+ facep->setGeomIndex(index_offset);
+ facep->setVertexBuffer(buffer);
+
{
+ //for debugging, set last time face was updated vs moved
facep->updateRebuildFlags();
+
if (!LLPipeline::sDelayVBUpdate)
- {
+ { //copy face geometry into vertex buffer
LLDrawable* drawablep = facep->getDrawable();
LLVOVolume* vobj = drawablep->getVOVolume();
LLVolume* volume = vobj->getVolume();
@@ -3805,9 +4505,12 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::
}
index_offset += facep->getGeomCount();
- indices_index += facep->mIndicesCount;
+ indices_index += facep->getIndicesCount();
+
- BOOL force_simple = facep->mPixelArea < FORCE_SIMPLE_RENDER_AREA;
+ //append face to appropriate render batch
+
+ BOOL force_simple = facep->getPixelArea() < FORCE_SIMPLE_RENDER_AREA;
BOOL fullbright = facep->isState(LLFace::FULLBRIGHT);
if ((mask & LLVertexBuffer::MAP_NORMAL) == 0)
{ //paranoia check to make sure GL doesn't try to read non-existant normals
@@ -3823,7 +4526,7 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::
// can we safely treat this as an alpha mask?
if (facep->canRenderAsMask())
{
- if (te->getFullbright())
+ if (te->getFullbright() || LLPipeline::sNoAlpha)
{
registerFace(group, facep, LLRenderPass::PASS_FULLBRIGHT_ALPHA_MASK);
}
@@ -3887,7 +4590,7 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::
{ //invisiprim
registerFace(group, facep, LLRenderPass::PASS_INVISIBLE);
}
- else if (fullbright)
+ else if (fullbright || bake_sunlight)
{ //fullbright
registerFace(group, facep, LLRenderPass::PASS_FULLBRIGHT);
if (LLPipeline::sRenderDeferred && LLPipeline::sRenderBump && te->getBumpmap())
@@ -3974,7 +4677,7 @@ void LLGeometryManager::addGeometryCount(LLSpatialGroup* group, U32 &vertex_coun
//sum up face verts and indices
drawablep->updateFaceSize(i);
LLFace* facep = drawablep->getFace(i);
- if (facep->hasGeometry() && facep->mPixelArea > FORCE_CULL_AREA)
+ if (facep->hasGeometry() && facep->getPixelArea() > FORCE_CULL_AREA)
{
vertex_count += facep->getGeomCount();
index_count += facep->getIndicesCount();
@@ -3984,8 +4687,7 @@ void LLGeometryManager::addGeometryCount(LLSpatialGroup* group, U32 &vertex_coun
}
else
{
- facep->mVertexBuffer = NULL;
- facep->mLastVertexBuffer = NULL;
+ facep->clearVertexBuffer();
}
}
}
@@ -4001,7 +4703,7 @@ LLHUDPartition::LLHUDPartition()
mLODPeriod = 1;
}
-void LLHUDPartition::shift(const LLVector3 &offset)
+void LLHUDPartition::shift(const LLVector4a &offset)
{
//HUD objects don't shift with region crossing. That would be silly.
}
diff --git a/indra/newview/llvovolume.h b/indra/newview/llvovolume.h
index 8b68e7c78a..fc00f0c0d0 100644
--- a/indra/newview/llvovolume.h
+++ b/indra/newview/llvovolume.h
@@ -40,6 +40,8 @@ class LLDrawPool;
class LLSelectNode;
class LLObjectMediaDataClient;
class LLObjectMediaNavigateClient;
+class LLVOAvatar;
+class LLMeshSkinInfo;
typedef std::vector<viewer_media_t> media_list_t;
@@ -48,6 +50,18 @@ enum LLVolumeInterfaceType
INTERFACE_FLEXIBLE = 1,
};
+
+class LLRiggedVolume : public LLVolume
+{
+public:
+ LLRiggedVolume(const LLVolumeParams& params)
+ : LLVolume(params, 0.f)
+ {
+ }
+
+ void update(const LLMeshSkinInfo* skin, LLVOAvatar* avatar, const LLVolume* src_volume);
+};
+
// Base class for implementations of the volume - Primitive, Flexible Object, etc.
class LLVolumeInterface
{
@@ -60,7 +74,7 @@ public:
virtual void onSetVolume(const LLVolumeParams &volume_params, const S32 detail) = 0;
virtual void onSetScale(const LLVector3 &scale, BOOL damped) = 0;
virtual void onParameterChanged(U16 param_type, LLNetworkData *data, BOOL in_use, bool local_origin) = 0;
- virtual void onShift(const LLVector3 &shift_vector) = 0;
+ virtual void onShift(const LLVector4a &shift_vector) = 0;
virtual bool isVolumeUnique() const = 0; // Do we need a unique LLVolume instance?
virtual bool isVolumeGlobal() const = 0; // Are we in global space?
virtual bool isActive() const = 0; // Is this object currently active?
@@ -116,7 +130,9 @@ public:
const LLMatrix3& getRelativeXformInvTrans() const { return mRelativeXformInvTrans; }
/*virtual*/ const LLMatrix4 getRenderMatrix() const;
U32 getRenderCost(std::set<LLUUID> &textures) const;
-
+ /*virtual*/ F32 getStreamingCost(S32* bytes = NULL, S32* visible_bytes = NULL);
+ /*virtual*/ U32 getTriangleCount();
+ /*virtual*/ U32 getHighLODTriangleCount();
/*virtual*/ BOOL lineSegmentIntersect(const LLVector3& start, const LLVector3& end,
S32 face = -1, // which face to check, -1 = ALL_SIDES
BOOL pick_transparent = FALSE,
@@ -140,7 +156,7 @@ public:
void markForUpdate(BOOL priority) { LLViewerObject::markForUpdate(priority); mVolumeChanged = TRUE; }
- /*virtual*/ void onShift(const LLVector3 &shift_vector); // Called when the drawable shifts
+ /*virtual*/ void onShift(const LLVector4a &shift_vector); // Called when the drawable shifts
/*virtual*/ void parameterChanged(U16 param_type, bool local_origin);
/*virtual*/ void parameterChanged(U16 param_type, LLNetworkData* data, BOOL in_use, bool local_origin);
@@ -179,6 +195,11 @@ public:
void updateSculptTexture();
void setIndexInTex(S32 index) { mIndexInTex = index ;}
void sculpt();
+ static void rebuildMeshAssetCallback(LLVFS *vfs,
+ const LLUUID& asset_uuid,
+ LLAssetType::EType type,
+ void* user_data, S32 status, LLExtStat ext_status);
+
void updateRelativeXform();
/*virtual*/ BOOL updateGeometry(LLDrawable *drawable);
/*virtual*/ void updateFaceSize(S32 idx);
@@ -191,7 +212,7 @@ public:
void regenFaces();
BOOL genBBoxes(BOOL force_global);
void preRebuild();
- virtual void updateSpatialExtents(LLVector3& min, LLVector3& max);
+ virtual void updateSpatialExtents(LLVector4a& min, LLVector4a& max);
virtual F32 getBinRadius();
virtual U32 getPartitionType() const;
@@ -225,6 +246,7 @@ public:
U32 getVolumeInterfaceID() const;
virtual BOOL isFlexible() const;
virtual BOOL isSculpted() const;
+ virtual BOOL isMesh() const;
virtual BOOL hasLightTexture() const;
BOOL isVolumeGlobal() const;
@@ -249,6 +271,7 @@ public:
void mediaNavigated(LLViewerMediaImpl *impl, LLPluginClassMedia* plugin, std::string new_location);
void mediaEvent(LLViewerMediaImpl *impl, LLPluginClassMedia* plugin, LLViewerMediaObserver::EMediaEvent event);
+
// Sync the given media data with the impl and the given te
void syncMediaData(S32 te, const LLSD &media_data, bool merge, bool ignore_agent);
@@ -264,9 +287,11 @@ public:
LLVector3 getApproximateFaceNormal(U8 face_id);
+ void notifyMeshLoaded();
+
// Returns 'true' iff the media data for this object is in flight
bool isMediaDataBeingFetched() const;
-
+
// Returns the "last fetched" media version, or -1 if not fetched yet
S32 getLastFetchedMediaVersion() const { return mLastFetchedMediaVersion; }
@@ -274,6 +299,21 @@ public:
void removeMDCImpl() { --mMDCImplCount; }
S32 getMDCImplCount() { return mMDCImplCount; }
+
+ //rigged volume update (for raycasting)
+ void updateRiggedVolume();
+ LLRiggedVolume* getRiggedVolume();
+
+ //returns true if volume should be treated as a rigged volume
+ // - Build tools are open
+ // - object is an attachment
+ // - object is attached to self
+ // - object is rendered as rigged
+ bool treatAsRigged();
+
+ //clear out rigged volume and revert back to non-rigged state for picking/LOD/distance updates
+ void clearRiggedVolume();
+
protected:
S32 computeLODDetail(F32 distance, F32 radius);
BOOL calcLOD();
@@ -307,6 +347,9 @@ private:
S32 mLastFetchedMediaVersion; // as fetched from the server, starts as -1
S32 mIndexInTex;
S32 mMDCImplCount;
+
+ LLPointer<LLRiggedVolume> mRiggedVolume;
+
// statics
public:
static F32 sLODSlopDistanceFactor;// Changing this to zero, effectively disables the LOD transition slop
diff --git a/indra/newview/llvowater.cpp b/indra/newview/llvowater.cpp
index 71f08ec36d..69ebad61ac 100644
--- a/indra/newview/llvowater.cpp
+++ b/indra/newview/llvowater.cpp
@@ -166,16 +166,18 @@ BOOL LLVOWater::updateGeometry(LLDrawable *drawable)
face->setSize(vertices_per_quad * num_quads,
indices_per_quad * num_quads);
- if (face->mVertexBuffer.isNull())
+ LLVertexBuffer* buff = face->getVertexBuffer();
+ if (!buff)
{
- face->mVertexBuffer = new LLVertexBuffer(LLDrawPoolWater::VERTEX_DATA_MASK, GL_DYNAMIC_DRAW_ARB);
- face->mVertexBuffer->allocateBuffer(face->getGeomCount(), face->getIndicesCount(), TRUE);
+ buff = new LLVertexBuffer(LLDrawPoolWater::VERTEX_DATA_MASK, GL_DYNAMIC_DRAW_ARB);
+ buff->allocateBuffer(face->getGeomCount(), face->getIndicesCount(), TRUE);
face->setIndicesIndex(0);
face->setGeomIndex(0);
+ face->setVertexBuffer(buff);
}
else
{
- face->mVertexBuffer->resizeBuffer(face->getGeomCount(), face->getIndicesCount());
+ buff->resizeBuffer(face->getGeomCount(), face->getIndicesCount());
}
index_offset = face->getGeometry(verticesp,normalsp,texCoordsp, indicesp);
@@ -229,7 +231,7 @@ BOOL LLVOWater::updateGeometry(LLDrawable *drawable)
}
}
- face->mVertexBuffer->setBuffer(0);
+ buff->setBuffer(0);
mDrawable->movePartition();
LLPipeline::sCompiles++;
@@ -261,15 +263,21 @@ void LLVOWater::setIsEdgePatch(const BOOL edge_patch)
mIsEdgePatch = edge_patch;
}
-void LLVOWater::updateSpatialExtents(LLVector3 &newMin, LLVector3& newMax)
+void LLVOWater::updateSpatialExtents(LLVector4a &newMin, LLVector4a& newMax)
{
- LLVector3 pos = getPositionAgent();
- LLVector3 scale = getScale();
-
- newMin = pos - scale * 0.5f;
- newMax = pos + scale * 0.5f;
+ LLVector4a pos;
+ pos.load3(getPositionAgent().mV);
+ LLVector4a scale;
+ scale.load3(getScale().mV);
+ scale.mul(0.5f);
+
+ newMin.setSub(pos, scale);
+ newMax.setAdd(pos, scale);
+
+ pos.setAdd(newMin,newMax);
+ pos.mul(0.5f);
- mDrawable->setPositionGroup((newMin + newMax) * 0.5f);
+ mDrawable->setPositionGroup(pos);
}
U32 LLVOWater::getPartitionType() const
@@ -283,7 +291,7 @@ U32 LLVOVoidWater::getPartitionType() const
}
LLWaterPartition::LLWaterPartition()
-: LLSpatialPartition(0, FALSE, 0)
+: LLSpatialPartition(0, FALSE, GL_DYNAMIC_DRAW_ARB)
{
mInfiniteFarClip = TRUE;
mDrawableType = LLPipeline::RENDER_TYPE_WATER;
diff --git a/indra/newview/llvowater.h b/indra/newview/llvowater.h
index cb9584cabf..ed709dd840 100644
--- a/indra/newview/llvowater.h
+++ b/indra/newview/llvowater.h
@@ -61,7 +61,7 @@ public:
/*virtual*/ BOOL idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time);
/*virtual*/ LLDrawable* createDrawable(LLPipeline *pipeline);
/*virtual*/ BOOL updateGeometry(LLDrawable *drawable);
- /*virtual*/ void updateSpatialExtents(LLVector3& newMin, LLVector3& newMax);
+ /*virtual*/ void updateSpatialExtents(LLVector4a& newMin, LLVector4a& newMax);
/*virtual*/ void updateTextures();
/*virtual*/ void setPixelAreaAndAngle(LLAgent &agent); // generate accurate apparent angle and area
diff --git a/indra/newview/llvowlsky.cpp b/indra/newview/llvowlsky.cpp
index ca57c0144b..51664cb31d 100644
--- a/indra/newview/llvowlsky.cpp
+++ b/indra/newview/llvowlsky.cpp
@@ -332,7 +332,7 @@ BOOL LLVOWLSky::updateGeometry(LLDrawable * drawable)
{
const U32 max_buffer_bytes = gSavedSettings.getS32("RenderMaxVBOSize")*1024;
const U32 data_mask = LLDrawPoolWLSky::SKY_VERTEX_DATA_MASK;
- const U32 max_verts = max_buffer_bytes / LLVertexBuffer::calcStride(data_mask);
+ const U32 max_verts = max_buffer_bytes / LLVertexBuffer::calcVertexSize(data_mask);
const U32 total_stacks = getNumStacks();
diff --git a/indra/newview/llwaterparammanager.cpp b/indra/newview/llwaterparammanager.cpp
index 4b3a9a4dc3..67bb965f99 100644
--- a/indra/newview/llwaterparammanager.cpp
+++ b/indra/newview/llwaterparammanager.cpp
@@ -33,6 +33,7 @@
#include "pipeline.h"
#include "llsky.h"
+#include "lldiriterator.h"
#include "llfloaterreg.h"
#include "llsliderctrl.h"
#include "llspinctrl.h"
@@ -87,11 +88,12 @@ void LLWaterParamManager::loadAllPresets(const std::string& file_name)
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;
+ bool found = true;
+ LLDirIterator app_settings_iter(path_name, "*.xml");
while(found)
{
std::string name;
- found = gDirUtilp->getNextFileInDir(path_name, "*.xml", name);
+ found = app_settings_iter.next(name);
if(found)
{
@@ -113,11 +115,12 @@ void LLWaterParamManager::loadAllPresets(const std::string& file_name)
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;
+ found = true;
+ LLDirIterator user_settings_iter(path_name2, "*.xml");
while(found)
{
std::string name;
- found = gDirUtilp->getNextFileInDir(path_name2, "*.xml", name);
+ found = user_settings_iter.next(name);
if(found)
{
name=name.erase(name.length()-4);
diff --git a/indra/newview/llwearableitemslist.h b/indra/newview/llwearableitemslist.h
index b060c9f076..a8a5ef3117 100644
--- a/indra/newview/llwearableitemslist.h
+++ b/indra/newview/llwearableitemslist.h
@@ -396,7 +396,6 @@ protected:
*/
class LLWearableItemsList : public LLInventoryItemsList
{
- LOG_CLASS(LLWearableItemsList);
public:
/**
* Context menu.
diff --git a/indra/newview/llwearabletype.cpp b/indra/newview/llwearabletype.cpp
index f933be4d8f..c090ab5c3d 100644
--- a/indra/newview/llwearabletype.cpp
+++ b/indra/newview/llwearabletype.cpp
@@ -80,7 +80,7 @@ LLWearableDictionary::LLWearableDictionary()
addEntry(LLWearableType::WT_ALPHA, new WearableEntry("alpha", "New Alpha", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_ALPHA, FALSE, TRUE));
addEntry(LLWearableType::WT_TATTOO, new WearableEntry("tattoo", "New Tattoo", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_TATTOO, FALSE, TRUE));
- addEntry(LLWearableType::WT_PHYSICS, new WearableEntry("physics", "New Physics", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_PHYSICS, TRUE, FALSE));
+ addEntry(LLWearableType::WT_PHYSICS, new WearableEntry("physics", "New Physics", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_PHYSICS, TRUE, TRUE));
addEntry(LLWearableType::WT_INVALID, new WearableEntry("invalid", "Invalid Wearable", LLAssetType::AT_NONE, LLInventoryIcon::ICONNAME_NONE, FALSE, FALSE));
addEntry(LLWearableType::WT_NONE, new WearableEntry("none", "Invalid Wearable", LLAssetType::AT_NONE, LLInventoryIcon::ICONNAME_NONE, FALSE, FALSE));
@@ -144,6 +144,7 @@ BOOL LLWearableType::getDisableCameraSwitch(LLWearableType::EType type)
{
const LLWearableDictionary *dict = LLWearableDictionary::getInstance();
const WearableEntry *entry = dict->lookup(type);
+ if (!entry) return FALSE;
return entry->mDisableCameraSwitch;
}
@@ -152,6 +153,7 @@ BOOL LLWearableType::getAllowMultiwear(LLWearableType::EType type)
{
const LLWearableDictionary *dict = LLWearableDictionary::getInstance();
const WearableEntry *entry = dict->lookup(type);
+ if (!entry) return FALSE;
return entry->mAllowMultiwear;
}
diff --git a/indra/newview/llwlparammanager.cpp b/indra/newview/llwlparammanager.cpp
index e5f52dfc97..848efcbb49 100644
--- a/indra/newview/llwlparammanager.cpp
+++ b/indra/newview/llwlparammanager.cpp
@@ -31,6 +31,7 @@
#include "pipeline.h"
#include "llsky.h"
+#include "lldiriterator.h"
#include "llfloaterreg.h"
#include "llsliderctrl.h"
#include "llspinctrl.h"
@@ -100,11 +101,12 @@ void LLWLParamManager::loadPresets(const std::string& file_name)
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;
+ bool found = true;
+ LLDirIterator app_settings_iter(path_name, "*.xml");
while(found)
{
std::string name;
- found = gDirUtilp->getNextFileInDir(path_name, "*.xml", name);
+ found = app_settings_iter.next(name);
if(found)
{
@@ -126,11 +128,12 @@ void LLWLParamManager::loadPresets(const std::string& file_name)
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;
+ found = true;
+ LLDirIterator user_settings_iter(path_name2, "*.xml");
while(found)
{
std::string name;
- found = gDirUtilp->getNextFileInDir(path_name2, "*.xml", name);
+ found = user_settings_iter.next(name);
if(found)
{
name=name.erase(name.length()-4);
diff --git a/indra/newview/llworld.cpp b/indra/newview/llworld.cpp
index 6b2af1f8b7..ec24b02934 100644
--- a/indra/newview/llworld.cpp
+++ b/indra/newview/llworld.cpp
@@ -50,6 +50,7 @@
#include "llviewerstats.h"
#include "llvlcomposition.h"
#include "llvoavatar.h"
+#include "llvocache.h"
#include "llvowater.h"
#include "message.h"
#include "pipeline.h"
@@ -596,7 +597,7 @@ void LLWorld::updateVisibilities()
region_list_t::iterator curiter = iter++;
LLViewerRegion* regionp = *curiter;
F32 height = regionp->getLand().getMaxZ() - regionp->getLand().getMinZ();
- F32 radius = 0.5f*fsqrtf(height * height + diagonal_squared);
+ F32 radius = 0.5f*(F32) sqrt(height * height + diagonal_squared);
if (!regionp->getLand().hasZData()
|| LLViewerCamera::getInstance()->sphereInFrustum(regionp->getCenterAgent(), radius))
{
@@ -617,7 +618,7 @@ void LLWorld::updateVisibilities()
}
F32 height = regionp->getLand().getMaxZ() - regionp->getLand().getMinZ();
- F32 radius = 0.5f*fsqrtf(height * height + diagonal_squared);
+ F32 radius = 0.5f*(F32) sqrt(height * height + diagonal_squared);
if (LLViewerCamera::getInstance()->sphereInFrustum(regionp->getCenterAgent(), radius))
{
regionp->calculateCameraDistance();
@@ -866,42 +867,6 @@ void LLWorld::waterHeightRegionInfo(std::string const& sim_name, F32 water_heigh
}
}
-// There are three types of water objects:
-// Region water objects: the water in a region.
-// Hole water objects: water in the void but within current draw distance.
-// Edge water objects: the water outside the draw distance, up till the horizon.
-//
-// For example:
-//
-// -----------------------horizon-------------------------
-// | | | |
-// | Edge Water | | |
-// | | | |
-// | | | |
-// | | | |
-// | | | |
-// | | rwidth | |
-// | | <-----> | |
-// -------------------------------------------------------
-// | |Hole |other| | |
-// | |Water|reg. | | |
-// | |-----------------| |
-// | |other|cur. |<--> | |
-// | |reg. | reg.| \__|_ draw distance |
-// | |-----------------| |
-// | | | |<--->| |
-// | | | | \__|_ range |
-// -------------------------------------------------------
-// | |<----width------>|<--horizon ext.->|
-// | | | |
-// | | | |
-// | | | |
-// | | | |
-// | | | |
-// | | | |
-// | | | |
-// -------------------------------------------------------
-//
void LLWorld::updateWaterObjects()
{
if (!gAgent.getRegion())
@@ -914,265 +879,128 @@ void LLWorld::updateWaterObjects()
return;
}
- // Region width in meters.
- S32 const rwidth = (S32)REGION_WIDTH_U32;
+ // First, determine the min and max "box" of water objects
+ S32 min_x = 0;
+ S32 min_y = 0;
+ S32 max_x = 0;
+ S32 max_y = 0;
+ U32 region_x, region_y;
- // The distance we might see into the void
- // when standing on the edge of a region, in meters.
- S32 const draw_distance = llceil(mLandFarClip);
+ S32 rwidth = 256;
- // We can only have "holes" in the water (where there no region) if we
- // can have existing regions around it. Taking into account that this
- // code is only executed when we enter a region, and not when we walk
- // around in it, we (only) need to take into account regions that fall
- // within the draw_distance.
- //
- // Set 'range' to draw_distance, rounded up to the nearest multiple of rwidth.
- S32 const nsims = (draw_distance + rwidth - 1) / rwidth;
- S32 const range = nsims * rwidth;
+ // We only want to fill in water for stuff that's near us, say, within 256 or 512m
+ S32 range = LLViewerCamera::getInstance()->getFar() > 256.f ? 512 : 256;
- // Get South-West corner of current region.
- LLViewerRegion const* regionp = gAgent.getRegion();
- U32 region_x, region_y;
+ LLViewerRegion* regionp = gAgent.getRegion();
from_region_handle(regionp->getHandle(), &region_x, &region_y);
- // The min. and max. coordinates of the South-West corners of the Hole water objects.
- S32 const min_x = (S32)region_x - range;
- S32 const min_y = (S32)region_y - range;
- S32 const max_x = (S32)region_x + range;
- S32 const max_y = (S32)region_y + range;
-
- // Attempt to determine a sensible water height for all the
- // Hole Water objects.
- //
- // It make little sense to try to guess what the best water
- // height should be when that isn't completely obvious: if it's
- // impossible to satisfy every region's water height without
- // getting a jump in the water height.
- //
- // In order to keep the reasoning simple, we assume something
- // logical as a group of connected regions, where the coastline
- // is at the outer edge. Anything more complex that would "break"
- // under such an assumption would probably break anyway (would
- // depend on terrain editing and existing mega prims, say, if
- // anything would make sense at all).
- //
- // So, what we do is find all connected regions within the
- // draw distance that border void, and then pick the lowest
- // water height of those (coast) regions.
- S32 const n = 2 * nsims + 1;
- S32 const origin = nsims + nsims * n;
- std::vector<F32> water_heights(n * n);
- std::vector<U8> checked(n * n, 0); // index = nx + ny * n + origin;
- U8 const region_bit = 1;
- U8 const hole_bit = 2;
- U8 const bordering_hole_bit = 4;
- U8 const bordering_edge_bit = 8;
- // Use the legacy waterheight for the Edge water in the case
- // that we don't find any Hole water at all.
- F32 water_height = DEFAULT_WATER_HEIGHT;
- int max_count = 0;
- LL_DEBUGS("WaterHeight") << "Current region: " << regionp->getName() << "; water height: " << regionp->getWaterHeight() << " m." << LL_ENDL;
- std::map<S32, int> water_height_counts;
- typedef std::queue<std::pair<S32, S32>, std::deque<std::pair<S32, S32> > > nxny_pairs_type;
- nxny_pairs_type nxny_pairs;
- nxny_pairs.push(nxny_pairs_type::value_type(0, 0));
- water_heights[origin] = regionp->getWaterHeight();
- checked[origin] = region_bit;
- // For debugging purposes.
- int number_of_connected_regions = 1;
- int uninitialized_regions = 0;
- int bordering_hole = 0;
- int bordering_edge = 0;
- while(!nxny_pairs.empty())
- {
- S32 const nx = nxny_pairs.front().first;
- S32 const ny = nxny_pairs.front().second;
- LL_DEBUGS("WaterHeight") << "nx,ny = " << nx << "," << ny << LL_ENDL;
- S32 const index = nx + ny * n + origin;
- nxny_pairs.pop();
- for (S32 dir = 0; dir < 4; ++dir)
- {
- S32 const cnx = nx + gDirAxes[dir][0];
- S32 const cny = ny + gDirAxes[dir][1];
- LL_DEBUGS("WaterHeight") << "dir = " << dir << "; cnx,cny = " << cnx << "," << cny << LL_ENDL;
- S32 const cindex = cnx + cny * n + origin;
- bool is_hole = false;
- bool is_edge = false;
- LLViewerRegion* new_region_found = NULL;
- if (cnx < -nsims || cnx > nsims ||
- cny < -nsims || cny > nsims)
- {
- LL_DEBUGS("WaterHeight") << " Edge Water!" << LL_ENDL;
- // Bumped into Edge water object.
- is_edge = true;
- }
- else if (checked[cindex])
- {
- LL_DEBUGS("WaterHeight") << " Already checked before!" << LL_ENDL;
- // Already checked.
- is_hole = (checked[cindex] & hole_bit);
- }
- else
- {
- S32 x = (S32)region_x + cnx * rwidth;
- S32 y = (S32)region_y + cny * rwidth;
- U64 region_handle = to_region_handle(x, y);
- new_region_found = getRegionFromHandle(region_handle);
- is_hole = !new_region_found;
- checked[cindex] = is_hole ? hole_bit : region_bit;
- }
- if (is_hole)
- {
- // This was a region that borders at least one 'hole'.
- // Count the found coastline.
- F32 new_water_height = water_heights[index];
- LL_DEBUGS("WaterHeight") << " This is void; counting coastline with water height of " << new_water_height << LL_ENDL;
- S32 new_water_height_cm = llround(new_water_height * 100);
- int count = (water_height_counts[new_water_height_cm] += 1);
- // Just use the lowest water height: this is mainly about the horizon water,
- // and whatever we do, we don't want it to be possible to look under the water
- // when looking in the distance: it is better to make a step downwards in water
- // height when going away from the avie than a step upwards. However, since
- // everyone is used to DEFAULT_WATER_HEIGHT, don't allow a single region
- // to drag the water level below DEFAULT_WATER_HEIGHT on it's own.
- if (bordering_hole == 0 || // First time we get here.
- (new_water_height >= DEFAULT_WATER_HEIGHT &&
- new_water_height < water_height) ||
- (new_water_height < DEFAULT_WATER_HEIGHT &&
- count > max_count)
- )
- {
- water_height = new_water_height;
- }
- if (count > max_count)
- {
- max_count = count;
- }
- if (!(checked[index] & bordering_hole_bit))
- {
- checked[index] |= bordering_hole_bit;
- ++bordering_hole;
- }
- }
- else if (is_edge && !(checked[index] & bordering_edge_bit))
- {
- checked[index] |= bordering_edge_bit;
- ++bordering_edge;
- }
- if (!new_region_found)
- {
- // Dead end, there is no region here.
- continue;
- }
- // Found a new connected region.
- ++number_of_connected_regions;
- if (new_region_found->getName().empty())
- {
- // Uninitialized LLViewerRegion, don't use it's water height.
- LL_DEBUGS("WaterHeight") << " Uninitialized region." << LL_ENDL;
- ++uninitialized_regions;
- continue;
- }
- nxny_pairs.push(nxny_pairs_type::value_type(cnx, cny));
- water_heights[cindex] = new_region_found->getWaterHeight();
- LL_DEBUGS("WaterHeight") << " Found a new region (name: " << new_region_found->getName() << "; water height: " << water_heights[cindex] << " m)!" << LL_ENDL;
- }
- }
- llinfos << "Number of connected regions: " << number_of_connected_regions << " (" << uninitialized_regions <<
- " uninitialized); number of regions bordering Hole water: " << bordering_hole <<
- "; number of regions bordering Edge water: " << bordering_edge << llendl;
- llinfos << "Coastline count (height, count): ";
- bool first = true;
- for (std::map<S32, int>::iterator iter = water_height_counts.begin(); iter != water_height_counts.end(); ++iter)
- {
- if (!first) llcont << ", ";
- llcont << "(" << (iter->first / 100.f) << ", " << iter->second << ")";
- first = false;
- }
- llcont << llendl;
- llinfos << "Water height used for Hole and Edge water objects: " << water_height << llendl;
+ min_x = (S32)region_x - range;
+ min_y = (S32)region_y - range;
+ max_x = (S32)region_x + range;
+ max_y = (S32)region_y + range;
- // Update all Region water objects.
- for (region_list_t::iterator iter = mRegionList.begin(); iter != mRegionList.end(); ++iter)
+ F32 height = 0.f;
+
+ for (region_list_t::iterator iter = mRegionList.begin();
+ iter != mRegionList.end(); ++iter)
{
LLViewerRegion* regionp = *iter;
LLVOWater* waterp = regionp->getLand().getWaterObj();
+ height += regionp->getWaterHeight();
if (waterp)
{
gObjectList.updateActive(waterp);
}
}
- // Clean up all existing Hole water objects.
for (std::list<LLVOWater*>::iterator iter = mHoleWaterObjects.begin();
- iter != mHoleWaterObjects.end(); ++iter)
+ iter != mHoleWaterObjects.end(); ++ iter)
{
LLVOWater* waterp = *iter;
gObjectList.killObject(waterp);
}
mHoleWaterObjects.clear();
- // Let the Edge and Hole water boxes be 1024 meter high so that they
- // are never too small to be drawn (A LL_VO_*_WATER box has water
- // rendered on it's bottom surface only), and put their bottom at
- // the current regions water height.
- F32 const box_height = 1024;
- F32 const water_center_z = water_height + box_height / 2;
-
- // Create new Hole water objects within 'range' where there is no region.
- for (S32 x = min_x; x <= max_x; x += rwidth)
+ // Now, get a list of the holes
+ S32 x, y;
+ for (x = min_x; x <= max_x; x += rwidth)
{
- for (S32 y = min_y; y <= max_y; y += rwidth)
+ for (y = min_y; y <= max_y; y += rwidth)
{
U64 region_handle = to_region_handle(x, y);
if (!getRegionFromHandle(region_handle))
{
- LLVOWater* waterp = (LLVOWater*)gObjectList.createObjectViewer(LLViewerObject::LL_VO_VOID_WATER, gAgent.getRegion());
+ LLVOWater* waterp = (LLVOWater *)gObjectList.createObjectViewer(LLViewerObject::LL_VO_WATER, gAgent.getRegion());
waterp->setUseTexture(FALSE);
- waterp->setPositionGlobal(LLVector3d(x + rwidth / 2, y + rwidth / 2, water_center_z));
- waterp->setScale(LLVector3((F32)rwidth, (F32)rwidth, box_height));
+ waterp->setPositionGlobal(LLVector3d(x + rwidth/2,
+ y + rwidth/2,
+ 256.f+DEFAULT_WATER_HEIGHT));
+ waterp->setScale(LLVector3((F32)rwidth, (F32)rwidth, 512.f));
gPipeline.createObject(waterp);
mHoleWaterObjects.push_back(waterp);
}
}
}
- // Center of the region.
- S32 const center_x = region_x + rwidth / 2;
- S32 const center_y = region_y + rwidth / 2;
- // Width of the area with Hole water objects.
- S32 const width = rwidth + 2 * range;
- S32 const horizon_extend = 2048 + 512 - range; // Legacy value.
- // The overlap is needed to get rid of sky pixels being visible between the
- // Edge and Hole water object at greater distances (due to floating point
- // round off errors).
- S32 const edge_hole_overlap = 1; // Twice the actual overlap.
+ // Update edge water objects
+ S32 wx, wy;
+ S32 center_x, center_y;
+ wx = (max_x - min_x) + rwidth;
+ wy = (max_y - min_y) + rwidth;
+ center_x = min_x + (wx >> 1);
+ center_y = min_y + (wy >> 1);
+
+ S32 add_boundary[4] = {
+ 512 - (max_x - region_x),
+ 512 - (max_y - region_y),
+ 512 - (region_x - min_x),
+ 512 - (region_y - min_y) };
- for (S32 dir = 0; dir < 8; ++dir)
+ S32 dir;
+ for (dir = 0; dir < 8; dir++)
{
- // Size of the Edge water objects.
- S32 const dim_x = (gDirAxes[dir][0] == 0) ? width : (horizon_extend + edge_hole_overlap);
- S32 const dim_y = (gDirAxes[dir][1] == 0) ? width : (horizon_extend + edge_hole_overlap);
- // And their position.
- S32 const water_center_x = center_x + (width + horizon_extend) / 2 * gDirAxes[dir][0];
- S32 const water_center_y = center_y + (width + horizon_extend) / 2 * gDirAxes[dir][1];
+ S32 dim[2] = { 0 };
+ switch (gDirAxes[dir][0])
+ {
+ case -1: dim[0] = add_boundary[2]; break;
+ case 0: dim[0] = wx; break;
+ default: dim[0] = add_boundary[0]; break;
+ }
+ switch (gDirAxes[dir][1])
+ {
+ case -1: dim[1] = add_boundary[3]; break;
+ case 0: dim[1] = wy; break;
+ default: dim[1] = add_boundary[1]; break;
+ }
+ // Resize and reshape the water objects
+ const S32 water_center_x = center_x + llround((wx + dim[0]) * 0.5f * gDirAxes[dir][0]);
+ const S32 water_center_y = center_y + llround((wy + dim[1]) * 0.5f * gDirAxes[dir][1]);
+
LLVOWater* waterp = mEdgeWaterObjects[dir];
if (!waterp || waterp->isDead())
{
// The edge water objects can be dead because they're attached to the region that the
// agent was in when they were originally created.
- mEdgeWaterObjects[dir] = (LLVOWater *)gObjectList.createObjectViewer(LLViewerObject::LL_VO_VOID_WATER, gAgent.getRegion());
+ mEdgeWaterObjects[dir] = (LLVOWater *)gObjectList.createObjectViewer(LLViewerObject::LL_VO_VOID_WATER,
+ gAgent.getRegion());
waterp = mEdgeWaterObjects[dir];
waterp->setUseTexture(FALSE);
- waterp->setIsEdgePatch(TRUE); // Mark that this is edge water and not hole water.
+ waterp->setIsEdgePatch(TRUE);
gPipeline.createObject(waterp);
}
waterp->setRegion(gAgent.getRegion());
- LLVector3d water_pos(water_center_x, water_center_y, water_center_z);
- LLVector3 water_scale((F32) dim_x, (F32) dim_y, box_height);
+ LLVector3d water_pos(water_center_x, water_center_y,
+ DEFAULT_WATER_HEIGHT+256.f);
+ LLVector3 water_scale((F32) dim[0], (F32) dim[1], 512.f);
+
+ //stretch out to horizon
+ water_scale.mV[0] += fabsf(2048.f * gDirAxes[dir][0]);
+ water_scale.mV[1] += fabsf(2048.f * gDirAxes[dir][1]);
+
+ water_pos.mdV[0] += 1024.f * gDirAxes[dir][0];
+ water_pos.mdV[1] += 1024.f * gDirAxes[dir][1];
waterp->setPositionGlobal(water_pos);
waterp->setScale(water_scale);
@@ -1181,6 +1009,7 @@ void LLWorld::updateWaterObjects()
}
}
+
void LLWorld::shiftRegions(const LLVector3& offset)
{
for (region_list_t::const_iterator i = getRegionList().begin(); i != getRegionList().end(); ++i)
@@ -1438,6 +1267,8 @@ static LLVector3d unpackLocalToGlobalPosition(U32 compact_local, const LLVector3
void LLWorld::getAvatars(uuid_vec_t* avatar_ids, std::vector<LLVector3d>* positions, const LLVector3d& relative_to, F32 radius) const
{
+ F32 radius_squared = radius * radius;
+
if(avatar_ids != NULL)
{
avatar_ids->clear();
@@ -1458,7 +1289,7 @@ void LLWorld::getAvatars(uuid_vec_t* avatar_ids, std::vector<LLVector3d>* positi
if(!uuid.isNull())
{
LLVector3d pos_global = pVOAvatar->getPositionGlobal();
- if(dist_vec(pos_global, relative_to) <= radius)
+ if(dist_vec_squared(pos_global, relative_to) <= radius_squared)
{
if(positions != NULL)
{
@@ -1482,7 +1313,7 @@ void LLWorld::getAvatars(uuid_vec_t* avatar_ids, std::vector<LLVector3d>* positi
for (S32 i = 0; i < count; i++)
{
LLVector3d pos_global = unpackLocalToGlobalPosition(regionp->mMapAvatars.get(i), origin_global);
- if(dist_vec(pos_global, relative_to) <= radius)
+ if(dist_vec_squared(pos_global, relative_to) <= radius_squared)
{
LLUUID uuid = regionp->mMapAvatarIDs.get(i);
// if this avatar doesn't already exist in the list, add it
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 6dc8f28265..845a87b8cf 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -67,6 +67,7 @@
#include "llhudnametag.h"
#include "llhudtext.h"
#include "lllightconstants.h"
+#include "llmeshrepository.h"
#include "llresmgr.h"
#include "llselectmgr.h"
#include "llsky.h"
@@ -74,6 +75,7 @@
#include "lltool.h"
#include "lltoolmgr.h"
#include "llviewercamera.h"
+#include "llviewermediafocus.h"
#include "llviewertexturelist.h"
#include "llviewerobject.h"
#include "llviewerobjectlist.h"
@@ -100,8 +102,29 @@
#include "llspatialpartition.h"
#include "llmutelist.h"
#include "lltoolpie.h"
+#include "llcurl.h"
+void check_stack_depth(S32 stack_depth)
+{
+ if (gDebugGL || gDebugSession)
+ {
+ GLint depth;
+ glGetIntegerv(GL_MODELVIEW_STACK_DEPTH, &depth);
+ if (depth != stack_depth)
+ {
+ if (gDebugSession)
+ {
+ ll_fail("GL matrix stack corrupted.");
+ }
+ else
+ {
+ llerrs << "GL matrix stack corrupted!" << llendl;
+ }
+ }
+ }
+}
+
#ifdef _DEBUG
// Debug indices is disabled for now for debug performance - djs 4/24/02
//#define DEBUG_INDICES
@@ -169,19 +192,20 @@ std::string gPoolNames[] =
// Correspond to LLDrawpool enum render type
"NONE",
"POOL_SIMPLE",
- "POOL_TERRAIN",
+ "POOL_GROUND",
+ "POOL_FULLBRIGHT",
"POOL_BUMP",
- "POOL_TREE",
+ "POOL_TERRAIN,"
"POOL_SKY",
"POOL_WL_SKY",
- "POOL_GROUND",
+ "POOL_TREE",
+ "POOL_GRASS",
"POOL_INVISIBLE",
"POOL_AVATAR",
+ "POOL_VOIDWATER",
"POOL_WATER",
- "POOL_GRASS",
- "POOL_FULLBRIGHT",
"POOL_GLOW",
- "POOL_ALPHA",
+ "POOL_ALPHA"
};
void drawBox(const LLVector3& c, const LLVector3& r);
@@ -216,6 +240,16 @@ glh::matrix4f glh_get_current_projection()
return glh_copy_matrix(gGLProjection);
}
+glh::matrix4f glh_get_last_modelview()
+{
+ return glh_copy_matrix(gGLLastModelView);
+}
+
+glh::matrix4f glh_get_last_projection()
+{
+ return glh_copy_matrix(gGLLastProjection);
+}
+
void glh_copy_matrix(const glh::matrix4f& src, GLdouble* dst)
{
for (U32 i = 0; i < 16; i++)
@@ -268,6 +302,8 @@ BOOL LLPipeline::sAutoMaskAlphaDeferred = TRUE;
BOOL LLPipeline::sAutoMaskAlphaNonDeferred = FALSE;
BOOL LLPipeline::sDisableShaders = FALSE;
BOOL LLPipeline::sRenderBump = TRUE;
+BOOL LLPipeline::sBakeSunlight = FALSE;
+BOOL LLPipeline::sNoAlpha = FALSE;
BOOL LLPipeline::sUseTriStrips = TRUE;
BOOL LLPipeline::sUseFarClip = TRUE;
BOOL LLPipeline::sShadowRender = FALSE;
@@ -281,7 +317,6 @@ BOOL LLPipeline::sRenderFrameTest = FALSE;
BOOL LLPipeline::sRenderAttachedLights = TRUE;
BOOL LLPipeline::sRenderAttachedParticles = TRUE;
BOOL LLPipeline::sRenderDeferred = FALSE;
-BOOL LLPipeline::sAllowRebuildPriorityGroup = FALSE ;
S32 LLPipeline::sVisibleLightCount = 0;
F32 LLPipeline::sMinRenderSize = 0.f;
@@ -328,6 +363,8 @@ LLPipeline::LLPipeline() :
mRenderDebugFeatureMask(0),
mRenderDebugMask(0),
mOldRenderDebugMask(0),
+ mGroupQ1Locked(false),
+ mGroupQ2Locked(false),
mLastRebuildPool(NULL),
mAlphaPool(NULL),
mSkyPool(NULL),
@@ -359,6 +396,7 @@ void LLPipeline::init()
sRenderBump = gSavedSettings.getBOOL("RenderObjectBump");
sUseTriStrips = gSavedSettings.getBOOL("RenderUseTriStrips");
LLVertexBuffer::sUseStreamDraw = gSavedSettings.getBOOL("RenderUseStreamVBO");
+ LLVertexBuffer::sPreferStreamDraw = gSavedSettings.getBOOL("RenderPreferStreamDraw");
sRenderAttachedLights = gSavedSettings.getBOOL("RenderAttachedLights");
sRenderAttachedParticles = gSavedSettings.getBOOL("RenderAttachedParticles");
@@ -393,6 +431,14 @@ void LLPipeline::init()
toggleRenderType(RENDER_TYPE_GROUND);
}
+ // make sure RenderPerformanceTest persists (hackity hack hack)
+ // disables non-object rendering (UI, sky, water, etc)
+ if (gSavedSettings.getBOOL("RenderPerformanceTest"))
+ {
+ gSavedSettings.setBOOL("RenderPerformanceTest", FALSE);
+ gSavedSettings.setBOOL("RenderPerformanceTest", TRUE);
+ }
+
mOldRenderDebugMask = mRenderDebugMask;
mBackfaceCull = TRUE;
@@ -526,6 +572,22 @@ void LLPipeline::resizeScreenTexture()
}
}
+void LLPipeline::allocatePhysicsBuffer()
+{
+ GLuint resX = gViewerWindow->getWorldViewWidthRaw();
+ GLuint resY = gViewerWindow->getWorldViewHeightRaw();
+
+ 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);
+ }
+ }
+}
+
void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)
{
// remember these dimensions
@@ -534,6 +596,11 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)
//never use more than 4 samples for render targets
U32 samples = llmin(gSavedSettings.getU32("RenderFSAASamples"), (U32) 4);
+ if (gGLManager.mIsATI)
+ { //disable multisampling of render targets where ATI is involved
+ samples = 0;
+ }
+
U32 res_mod = gSavedSettings.getU32("RenderResolutionDivisor");
if (res_mod > 1 && res_mod < resX && res_mod < resY)
@@ -549,41 +616,105 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)
if (LLPipeline::sRenderDeferred)
{
+ S32 shadow_detail = gSavedSettings.getS32("RenderShadowDetail");
+ BOOL ssao = gSavedSettings.getBOOL("RenderDeferredSSAO");
+ 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);
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);
+
+#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
- for (U32 i = 0; i < 3; i++)
+ 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);
+ }
+ else
{
- mDeferredLight[i].allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE);
+ mDeferredLight[0].release();
}
- for (U32 i = 0; i < 2; i++)
+ if (ssao)
+ { //only need mDeferredLight[1] for ssao
+ mDeferredLight[1].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);
+ mDeferredLight[1].release();
+ }
+
+ if (gi)
+ { //only need mDeferredLight[2] and mGIMapPost for gi
+ mDeferredLight[2].allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE);
+ 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
+ {
+ mDeferredLight[2].release();
+
+ for (U32 i = 0; i < 2; i++)
+ {
+ mGIMapPost[i].release();
+ }
}
F32 scale = gSavedSettings.getF32("RenderShadowResolutionScale");
+#if LL_DARWIN
+ U32 shadow_fmt = 0;
+#else
//HACK: make alpha masking work on ATI depth shadows (work around for ATI driver bug)
U32 shadow_fmt = gGLManager.mIsATI ? GL_ALPHA : 0;
+#endif
- for (U32 i = 0; i < 4; i++)
+ if (shadow_detail > 0)
+ { //allocate 4 sun shadow maps
+ for (U32 i = 0; i < 4; i++)
+ {
+ mShadow[i].allocate(U32(resX*scale),U32(resY*scale), shadow_fmt, TRUE, FALSE, LLTexUnit::TT_RECT_TEXTURE);
+ }
+ }
+ else
{
- mShadow[i].allocate(U32(resX*scale),U32(resY*scale), shadow_fmt, TRUE, FALSE, LLTexUnit::TT_RECT_TEXTURE);
+ for (U32 i = 0; i < 4; i++)
+ {
+ mShadow[i].release();
+ }
}
-
U32 width = nhpo2(U32(resX*scale))/2;
U32 height = width;
- for (U32 i = 4; i < 6; i++)
+ if (shadow_detail > 1)
+ { //allocate two spot shadow maps
+ for (U32 i = 4; i < 6; i++)
+ {
+ mShadow[i].allocate(width, height, shadow_fmt, TRUE, FALSE);
+ }
+ }
+ else
{
- mShadow[i].allocate(width, height, shadow_fmt, TRUE, FALSE);
+ for (U32 i = 4; i < 6; i++)
+ {
+ mShadow[i].release();
+ }
}
width = nhpo2(resX)/2;
@@ -592,30 +723,55 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)
}
else
{
+ for (U32 i = 0; i < 3; i++)
+ {
+ mDeferredLight[i].release();
+ }
+ for (U32 i = 0; i < 2; i++)
+ {
+ mGIMapPost[i].release();
+ }
+ for (U32 i = 0; i < 6; i++)
+ {
+ mShadow[i].release();
+ }
+ mScreen.release();
+ mDeferredScreen.release(); //make sure to release any render targets that share a depth buffer with mDeferredScreen first
+ mDeferredDepth.release();
+ mEdgeMap.release();
+ mLuminanceMap.release();
+
mScreen.allocate(resX, resY, GL_RGBA, TRUE, TRUE, LLTexUnit::TT_RECT_TEXTURE, FALSE);
}
-
- if (LLRenderTarget::sUseFBO && gGLManager.mHasFramebufferMultisample && samples > 1)
- {
+ 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
- mDeferredScreen.shareDepthBuffer(mDeferredLight[i]);
+ if (mDeferredLight[i].getTexture(0))
+ {
+ mDeferredScreen.shareDepthBuffer(mDeferredLight[i]);
+ }
}
}
@@ -636,7 +792,26 @@ void LLPipeline::updateRenderDeferred()
gSavedSettings.getBOOL("WindLightUseAtmosShaders")) ? TRUE : FALSE) &&
!gUseWireframe;
- sRenderDeferred = deferred;
+ sRenderDeferred = deferred;
+ if (deferred)
+ { //must render glow when rendering deferred since post effect pass is needed to present any lighting at all
+ sRenderGlow = TRUE;
+ }
+}
+
+//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() ;
+ }
}
void LLPipeline::releaseGLBuffers()
@@ -664,8 +839,9 @@ void LLPipeline::releaseGLBuffers()
mWaterRef.release();
mWaterDis.release();
mScreen.release();
+ mPhysicsDisplay.release();
mUIScreen.release();
- mSampleBuffer.releaseSampleBuffer();
+ mSampleBuffer.release();
mDeferredScreen.release();
mDeferredDepth.release();
for (U32 i = 0; i < 3; i++)
@@ -690,6 +866,7 @@ void LLPipeline::releaseGLBuffers()
mGlow[i].release();
}
+ gBumpImageList.destroyGL();
LLVOAvatar::resetImpostors();
}
@@ -728,7 +905,6 @@ void LLPipeline::createGLBuffers()
allocateScreenBuffer(resX,resY);
mScreenWidth = 0;
mScreenHeight = 0;
-
}
if (sRenderDeferred)
@@ -813,6 +989,8 @@ void LLPipeline::createGLBuffers()
addDeferredAttachments(mGIMap);
}
}
+
+ gBumpImageList.restoreGL();
}
void LLPipeline::restoreGL()
@@ -872,7 +1050,7 @@ BOOL LLPipeline::canUseWindLightShadersOnObjects() const
BOOL LLPipeline::canUseAntiAliasing() const
{
- return TRUE; //(gSavedSettings.getBOOL("RenderUseFBO"));
+ return TRUE;
}
void LLPipeline::unloadShaders()
@@ -910,11 +1088,10 @@ S32 LLPipeline::getMaxLightingDetail() const
S32 LLPipeline::setLightingDetail(S32 level)
{
LLMemType mt_ld(LLMemType::MTYPE_PIPELINE_LIGHTING_DETAIL);
- assertInitialized();
if (level < 0)
{
- if (gSavedSettings.getBOOL("VertexShaderEnable"))
+ if (gSavedSettings.getBOOL("RenderLocalLights"))
{
level = 1;
}
@@ -924,15 +1101,8 @@ S32 LLPipeline::setLightingDetail(S32 level)
}
}
level = llclamp(level, 0, getMaxLightingDetail());
- if (level != mLightingDetail)
- {
- mLightingDetail = level;
-
- if (mVertexShadersLoaded == 1)
- {
- LLViewerShaderMgr::instance()->setShaders();
- }
- }
+ mLightingDetail = level;
+
return mLightingDetail;
}
@@ -1158,9 +1328,15 @@ void LLPipeline::allocDrawable(LLViewerObject *vobj)
}
+static LLFastTimer::DeclareTimer FTM_UNLINK("Unlink");
+static LLFastTimer::DeclareTimer FTM_REMOVE_FROM_MOVE_LIST("Movelist");
+static LLFastTimer::DeclareTimer FTM_REMOVE_FROM_SPATIAL_PARTITION("Spatial Partition");
+static LLFastTimer::DeclareTimer FTM_REMOVE_FROM_LIGHT_SET("Light Set");
+static LLFastTimer::DeclareTimer FTM_REMOVE_FROM_HIGHLIGHT_SET("Highlight Set");
+
void LLPipeline::unlinkDrawable(LLDrawable *drawable)
{
- LLFastTimer t(FTM_PIPELINE);
+ LLFastTimer t(FTM_UNLINK);
assertInitialized();
@@ -1169,6 +1345,7 @@ void LLPipeline::unlinkDrawable(LLDrawable *drawable)
// Based on flags, remove the drawable from the queues that it's on.
if (drawablep->isState(LLDrawable::ON_MOVE_LIST))
{
+ LLFastTimer t(FTM_REMOVE_FROM_MOVE_LIST);
LLDrawable::drawable_vector_t::iterator iter = std::find(mMovedList.begin(), mMovedList.end(), drawablep);
if (iter != mMovedList.end())
{
@@ -1178,6 +1355,7 @@ void LLPipeline::unlinkDrawable(LLDrawable *drawable)
if (drawablep->getSpatialGroup())
{
+ LLFastTimer t(FTM_REMOVE_FROM_SPATIAL_PARTITION);
if (!drawablep->getSpatialGroup()->mSpatialPartition->remove(drawablep, drawablep->getSpatialGroup()))
{
#ifdef LL_RELEASE_FOR_DOWNLOAD
@@ -1188,18 +1366,23 @@ void LLPipeline::unlinkDrawable(LLDrawable *drawable)
}
}
- mLights.erase(drawablep);
- for (light_set_t::iterator iter = mNearbyLights.begin();
- iter != mNearbyLights.end(); iter++)
{
- if (iter->drawable == drawablep)
+ LLFastTimer t(FTM_REMOVE_FROM_LIGHT_SET);
+ mLights.erase(drawablep);
+
+ for (light_set_t::iterator iter = mNearbyLights.begin();
+ iter != mNearbyLights.end(); iter++)
{
- mNearbyLights.erase(iter);
- break;
+ if (iter->drawable == drawablep)
+ {
+ mNearbyLights.erase(iter);
+ break;
+ }
}
}
{
+ LLFastTimer t(FTM_REMOVE_FROM_HIGHLIGHT_SET);
HighlightItem item(drawablep);
mHighlightSet.erase(item);
@@ -1492,11 +1675,214 @@ F32 LLPipeline::calcPixelArea(LLVector3 center, LLVector3 size, LLCamera &camera
return radius*radius * F_PI;
}
+//static
+F32 LLPipeline::calcPixelArea(const LLVector4a& center, const LLVector4a& size, LLCamera &camera)
+{
+ LLVector4a origin;
+ origin.load3(camera.getOrigin().mV);
+
+ LLVector4a lookAt;
+ lookAt.setSub(center, origin);
+ F32 dist = lookAt.getLength3().getF32();
+
+ //ramp down distance for nearby objects
+ //shrink dist by dist/16.
+ if (dist < 16.f)
+ {
+ dist /= 16.f;
+ dist *= dist;
+ dist *= 16.f;
+ }
+
+ //get area of circle around node
+ F32 app_angle = atanf(size.getLength3().getF32()/dist);
+ F32 radius = app_angle*LLDrawable::sCurPixelAngle;
+ return radius*radius * F_PI;
+}
+
void LLPipeline::grabReferences(LLCullResult& result)
{
sCull = &result;
}
+void LLPipeline::clearReferences()
+{
+ sCull = NULL;
+}
+
+void check_references(LLSpatialGroup* group, LLDrawable* drawable)
+{
+ for (LLSpatialGroup::element_iter i = group->getData().begin(); i != group->getData().end(); ++i)
+ {
+ if (drawable == *i)
+ {
+ llerrs << "LLDrawable deleted while actively reference by LLPipeline." << llendl;
+ }
+ }
+}
+
+void check_references(LLDrawable* drawable, LLFace* face)
+{
+ for (S32 i = 0; i < drawable->getNumFaces(); ++i)
+ {
+ if (drawable->getFace(i) == face)
+ {
+ llerrs << "LLFace deleted while actively referenced by LLPipeline." << llendl;
+ }
+ }
+}
+
+void check_references(LLSpatialGroup* group, LLFace* face)
+{
+ for (LLSpatialGroup::element_iter i = group->getData().begin(); i != group->getData().end(); ++i)
+ {
+ LLDrawable* drawable = *i;
+ check_references(drawable, face);
+ }
+}
+
+void LLPipeline::checkReferences(LLFace* face)
+{
+#if 0
+ if (sCull)
+ {
+ for (LLCullResult::sg_list_t::iterator iter = sCull->beginVisibleGroups(); iter != sCull->endVisibleGroups(); ++iter)
+ {
+ LLSpatialGroup* group = *iter;
+ check_references(group, face);
+ }
+
+ for (LLCullResult::sg_list_t::iterator iter = sCull->beginAlphaGroups(); iter != sCull->endAlphaGroups(); ++iter)
+ {
+ LLSpatialGroup* group = *iter;
+ check_references(group, face);
+ }
+
+ for (LLCullResult::sg_list_t::iterator iter = sCull->beginDrawableGroups(); iter != sCull->endDrawableGroups(); ++iter)
+ {
+ LLSpatialGroup* group = *iter;
+ check_references(group, face);
+ }
+
+ for (LLCullResult::drawable_list_t::iterator iter = sCull->beginVisibleList(); iter != sCull->endVisibleList(); ++iter)
+ {
+ LLDrawable* drawable = *iter;
+ check_references(drawable, face);
+ }
+ }
+#endif
+}
+
+void LLPipeline::checkReferences(LLDrawable* drawable)
+{
+#if 0
+ if (sCull)
+ {
+ for (LLCullResult::sg_list_t::iterator iter = sCull->beginVisibleGroups(); iter != sCull->endVisibleGroups(); ++iter)
+ {
+ LLSpatialGroup* group = *iter;
+ check_references(group, drawable);
+ }
+
+ for (LLCullResult::sg_list_t::iterator iter = sCull->beginAlphaGroups(); iter != sCull->endAlphaGroups(); ++iter)
+ {
+ LLSpatialGroup* group = *iter;
+ check_references(group, drawable);
+ }
+
+ for (LLCullResult::sg_list_t::iterator iter = sCull->beginDrawableGroups(); iter != sCull->endDrawableGroups(); ++iter)
+ {
+ LLSpatialGroup* group = *iter;
+ check_references(group, drawable);
+ }
+
+ for (LLCullResult::drawable_list_t::iterator iter = sCull->beginVisibleList(); iter != sCull->endVisibleList(); ++iter)
+ {
+ if (drawable == *iter)
+ {
+ llerrs << "LLDrawable deleted while actively referenced by LLPipeline." << llendl;
+ }
+ }
+ }
+#endif
+}
+
+void check_references(LLSpatialGroup* group, LLDrawInfo* draw_info)
+{
+ for (LLSpatialGroup::draw_map_t::iterator i = group->mDrawMap.begin(); i != group->mDrawMap.end(); ++i)
+ {
+ LLSpatialGroup::drawmap_elem_t& draw_vec = i->second;
+ for (LLSpatialGroup::drawmap_elem_t::iterator j = draw_vec.begin(); j != draw_vec.end(); ++j)
+ {
+ LLDrawInfo* params = *j;
+ if (params == draw_info)
+ {
+ llerrs << "LLDrawInfo deleted while actively referenced by LLPipeline." << llendl;
+ }
+ }
+ }
+}
+
+
+void LLPipeline::checkReferences(LLDrawInfo* draw_info)
+{
+#if 0
+ if (sCull)
+ {
+ for (LLCullResult::sg_list_t::iterator iter = sCull->beginVisibleGroups(); iter != sCull->endVisibleGroups(); ++iter)
+ {
+ LLSpatialGroup* group = *iter;
+ check_references(group, draw_info);
+ }
+
+ for (LLCullResult::sg_list_t::iterator iter = sCull->beginAlphaGroups(); iter != sCull->endAlphaGroups(); ++iter)
+ {
+ LLSpatialGroup* group = *iter;
+ check_references(group, draw_info);
+ }
+
+ for (LLCullResult::sg_list_t::iterator iter = sCull->beginDrawableGroups(); iter != sCull->endDrawableGroups(); ++iter)
+ {
+ LLSpatialGroup* group = *iter;
+ check_references(group, draw_info);
+ }
+ }
+#endif
+}
+
+void LLPipeline::checkReferences(LLSpatialGroup* group)
+{
+#if 0
+ if (sCull)
+ {
+ for (LLCullResult::sg_list_t::iterator iter = sCull->beginVisibleGroups(); iter != sCull->endVisibleGroups(); ++iter)
+ {
+ if (group == *iter)
+ {
+ llerrs << "LLSpatialGroup deleted while actively referenced by LLPipeline." << llendl;
+ }
+ }
+
+ for (LLCullResult::sg_list_t::iterator iter = sCull->beginAlphaGroups(); iter != sCull->endAlphaGroups(); ++iter)
+ {
+ if (group == *iter)
+ {
+ llerrs << "LLSpatialGroup deleted while actively referenced by LLPipeline." << llendl;
+ }
+ }
+
+ for (LLCullResult::sg_list_t::iterator iter = sCull->beginDrawableGroups(); iter != sCull->endDrawableGroups(); ++iter)
+ {
+ if (group == *iter)
+ {
+ llerrs << "LLSpatialGroup deleted while actively referenced by LLPipeline." << llendl;
+ }
+ }
+ }
+#endif
+}
+
+
BOOL LLPipeline::visibleObjectsInFrustum(LLCamera& camera)
{
for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin();
@@ -1563,7 +1949,7 @@ BOOL LLPipeline::getVisibleExtents(LLCamera& camera, LLVector3& min, LLVector3&
static LLFastTimer::DeclareTimer FTM_CULL("Object Culling");
-void LLPipeline::updateCull(LLCamera& camera, LLCullResult& result, S32 water_clip)
+void LLPipeline::updateCull(LLCamera& camera, LLCullResult& result, S32 water_clip, LLPlane* planep)
{
LLFastTimer t(FTM_CULL);
LLMemType mt_uc(LLMemType::MTYPE_PIPELINE_UPDATE_CULL);
@@ -1583,6 +1969,11 @@ void LLPipeline::updateCull(LLCamera& camera, LLCullResult& result, S32 water_cl
mScreen.bindTarget();
}
+ if (sUseOcclusion > 1)
+ {
+ gGL.setColorMask(false, false);
+ }
+
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadMatrixd(gGLLastProjection);
@@ -1597,10 +1988,37 @@ void LLPipeline::updateCull(LLCamera& camera, LLCullResult& result, S32 water_cl
LLGLDisable test(GL_ALPHA_TEST);
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
- if (sUseOcclusion > 1)
+
+ //setup a clip plane in projection matrix for reflection renders (prevents flickering from occlusion culling)
+ LLViewerRegion* region = gAgent.getRegion();
+ LLPlane plane;
+
+ if (planep)
{
- gGL.setColorMask(false, false);
+ plane = *planep;
+ }
+ else
+ {
+ if (region)
+ {
+ LLVector3 pnorm;
+ F32 height = region->getWaterHeight();
+ if (water_clip < 0)
+ { //camera is above water, clip plane points up
+ pnorm.setVec(0,0,1);
+ plane.setVec(pnorm, -height);
+ }
+ else if (water_clip > 0)
+ { //camera is below water, clip plane points down
+ pnorm = LLVector3(0,0,-1);
+ plane.setVec(pnorm, height);
+ }
+ }
}
+
+ glh::matrix4f modelview = glh_get_last_modelview();
+ glh::matrix4f proj = glh_get_last_projection();
+ LLGLUserClipPlane clip(plane, modelview, proj, water_clip != 0 && LLPipeline::sReflectionRender);
LLGLDepthTest depth(GL_TRUE, GL_FALSE);
@@ -1692,7 +2110,7 @@ void LLPipeline::markNotCulled(LLSpatialGroup* group, LLCamera& camera)
}
if (sMinRenderSize > 0.f &&
- llmax(llmax(group->mBounds[1].mV[0], group->mBounds[1].mV[1]), group->mBounds[1].mV[2]) < sMinRenderSize)
+ llmax(llmax(group->mBounds[1][0], group->mBounds[1][1]), group->mBounds[1][2]) < sMinRenderSize)
{
return;
}
@@ -1736,33 +2154,34 @@ void LLPipeline::markOccluder(LLSpatialGroup* group)
void LLPipeline::doOcclusion(LLCamera& camera)
{
- LLVertexBuffer::unbind();
-
- if (hasRenderDebugMask(LLPipeline::RENDER_DEBUG_OCCLUSION))
- {
- gGL.setColorMask(true, false, false, false);
- }
- else
+ if (LLPipeline::sUseOcclusion > 1 && sCull->hasOcclusionGroups())
{
- gGL.setColorMask(false, false);
- }
- LLGLDisable blend(GL_BLEND);
- LLGLDisable test(GL_ALPHA_TEST);
- gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
- LLGLDepthTest depth(GL_TRUE, GL_FALSE);
+ LLVertexBuffer::unbind();
- LLGLDisable cull(GL_CULL_FACE);
- if (LLPipeline::sUseOcclusion > 1)
- {
+ if (hasRenderDebugMask(LLPipeline::RENDER_DEBUG_OCCLUSION))
+ {
+ gGL.setColorMask(true, false, false, false);
+ }
+ else
+ {
+ gGL.setColorMask(false, false);
+ }
+ LLGLDisable blend(GL_BLEND);
+ LLGLDisable test(GL_ALPHA_TEST);
+ gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+ LLGLDepthTest depth(GL_TRUE, GL_FALSE);
+
+ LLGLDisable cull(GL_CULL_FACE);
+
for (LLCullResult::sg_list_t::iterator iter = sCull->beginOcclusionGroups(); iter != sCull->endOcclusionGroups(); ++iter)
{
LLSpatialGroup* group = *iter;
group->doOcclusion(&camera);
group->clearOcclusionState(LLSpatialGroup::ACTIVE_OCCLUSION);
}
+
+ gGL.setColorMask(true, false);
}
-
- gGL.setColorMask(true, false);
}
BOOL LLPipeline::updateDrawableGeom(LLDrawable* drawablep, BOOL priority)
@@ -1789,17 +2208,14 @@ void LLPipeline::updateGL()
void LLPipeline::rebuildPriorityGroups()
{
- if(!sAllowRebuildPriorityGroup)
- {
- return ;
- }
- sAllowRebuildPriorityGroup = FALSE ;
-
LLTimer update_timer;
LLMemType mt(LLMemType::MTYPE_PIPELINE);
assertInitialized();
+ gMeshRepo.notifyLoadedMeshes();
+
+ mGroupQ1Locked = true;
// Iterate through all drawables on the priority build queue,
for (LLSpatialGroup::sg_vector_t::iterator iter = mGroupQ1.begin();
iter != mGroupQ1.end(); ++iter)
@@ -1810,10 +2226,18 @@ void LLPipeline::rebuildPriorityGroups()
}
mGroupQ1.clear();
+ mGroupQ1Locked = false;
+
}
void LLPipeline::rebuildGroups()
{
+ if (mGroupQ2.empty())
+ {
+ return;
+ }
+
+ mGroupQ2Locked = true;
// Iterate through some drawables on the non-priority build queue
S32 size = (S32) mGroupQ2.size();
S32 min_count = llclamp((S32) ((F32) (size * size)/4096*0.25f), 1, size);
@@ -1823,33 +2247,30 @@ void LLPipeline::rebuildGroups()
std::sort(mGroupQ2.begin(), mGroupQ2.end(), LLSpatialGroup::CompareUpdateUrgency());
LLSpatialGroup::sg_vector_t::iterator iter;
+ LLSpatialGroup::sg_vector_t::iterator last_iter = mGroupQ2.begin();
+
for (iter = mGroupQ2.begin();
- iter != mGroupQ2.end(); ++iter)
+ iter != mGroupQ2.end() && count <= min_count; ++iter)
{
LLSpatialGroup* group = *iter;
+ last_iter = iter;
- if (group->isDead())
+ if (!group->isDead())
{
- continue;
+ group->rebuildGeom();
+
+ if (group->mSpatialPartition->mRenderByGroup)
+ {
+ count++;
+ }
}
- group->rebuildGeom();
-
- if (group->mSpatialPartition->mRenderByGroup)
- {
- count++;
- }
-
group->clearState(LLSpatialGroup::IN_BUILD_Q2);
-
- if (count > min_count)
- {
- ++iter;
- break;
- }
}
- mGroupQ2.erase(mGroupQ2.begin(), iter);
+ mGroupQ2.erase(mGroupQ2.begin(), ++last_iter);
+
+ mGroupQ2Locked = false;
updateMovedList(mMovedBridge);
}
@@ -2075,6 +2496,9 @@ void LLPipeline::shiftObjects(const LLVector3 &offset)
glClear(GL_DEPTH_BUFFER_BIT);
gDepthDirty = TRUE;
+ LLVector4a offseta;
+ offseta.load3(offset.mV);
+
for (LLDrawable::drawable_vector_t::iterator iter = mShiftList.begin();
iter != mShiftList.end(); iter++)
{
@@ -2083,7 +2507,7 @@ void LLPipeline::shiftObjects(const LLVector3 &offset)
{
continue;
}
- drawablep->shiftPos(offset);
+ drawablep->shiftPos(offseta);
drawablep->clearState(LLDrawable::ON_SHIFT_LIST);
}
mShiftList.resize(0);
@@ -2097,7 +2521,7 @@ void LLPipeline::shiftObjects(const LLVector3 &offset)
LLSpatialPartition* part = region->getSpatialPartition(i);
if (part)
{
- part->shift(offset);
+ part->shift(offseta);
}
}
}
@@ -2129,8 +2553,7 @@ void LLPipeline::markGLRebuild(LLGLUpdate* glu)
void LLPipeline::markRebuild(LLSpatialGroup* group, BOOL priority)
{
LLMemType mt(LLMemType::MTYPE_PIPELINE);
- //assert_main_thread();
-
+
if (group && !group->isDead() && group->mSpatialPartition)
{
if (group->mSpatialPartition->mPartitionType == LLViewerRegion::PARTITION_HUD)
@@ -2142,6 +2565,8 @@ void LLPipeline::markRebuild(LLSpatialGroup* group, BOOL priority)
{
if (!group->isState(LLSpatialGroup::IN_BUILD_Q1))
{
+ llassert_always(!mGroupQ1Locked);
+
mGroupQ1.push_back(group);
group->setState(LLSpatialGroup::IN_BUILD_Q1);
@@ -2158,11 +2583,7 @@ void LLPipeline::markRebuild(LLSpatialGroup* group, BOOL priority)
}
else if (!group->isState(LLSpatialGroup::IN_BUILD_Q2 | LLSpatialGroup::IN_BUILD_Q1))
{
- //llerrs << "Non-priority updates not yet supported!" << llendl;
- if (std::find(mGroupQ2.begin(), mGroupQ2.end(), group) != mGroupQ2.end())
- {
- llerrs << "WTF?" << llendl;
- }
+ llassert_always(!mGroupQ2Locked);
mGroupQ2.push_back(group);
group->setState(LLSpatialGroup::IN_BUILD_Q2);
@@ -2242,6 +2663,42 @@ void LLPipeline::stateSort(LLCamera& camera, LLCullResult &result)
}
}
}
+
+ if (LLViewerCamera::sCurCameraID == LLViewerCamera::CAMERA_WORLD)
+ {
+ LLSpatialGroup* last_group = NULL;
+ for (LLCullResult::bridge_list_t::iterator i = sCull->beginVisibleBridge(); i != sCull->endVisibleBridge(); ++i)
+ {
+ LLCullResult::bridge_list_t::iterator cur_iter = i;
+ LLSpatialBridge* bridge = *cur_iter;
+ LLSpatialGroup* group = bridge->getSpatialGroup();
+
+ if (last_group == NULL)
+ {
+ last_group = group;
+ }
+
+ if (!bridge->isDead() && group && !group->isOcclusionState(LLSpatialGroup::OCCLUDED))
+ {
+ stateSort(bridge, camera);
+ }
+
+ if (LLViewerCamera::sCurCameraID == LLViewerCamera::CAMERA_WORLD &&
+ last_group != group && last_group->changeLOD())
+ {
+ last_group->mLastUpdateDistance = last_group->mDistance;
+ }
+
+ last_group = group;
+ }
+
+ if (LLViewerCamera::sCurCameraID == LLViewerCamera::CAMERA_WORLD &&
+ last_group && last_group->changeLOD())
+ {
+ last_group->mLastUpdateDistance = last_group->mDistance;
+ }
+ }
+
for (LLCullResult::sg_list_t::iterator iter = sCull->beginVisibleGroups(); iter != sCull->endVisibleGroups(); ++iter)
{
LLSpatialGroup* group = *iter;
@@ -2257,19 +2714,6 @@ void LLPipeline::stateSort(LLCamera& camera, LLCullResult &result)
}
}
- if (LLViewerCamera::sCurCameraID == LLViewerCamera::CAMERA_WORLD)
- {
- for (LLCullResult::bridge_list_t::iterator i = sCull->beginVisibleBridge(); i != sCull->endVisibleBridge(); ++i)
- {
- LLCullResult::bridge_list_t::iterator cur_iter = i;
- LLSpatialBridge* bridge = *cur_iter;
- LLSpatialGroup* group = bridge->getSpatialGroup();
- if (!bridge->isDead() && group && !group->isOcclusionState(LLSpatialGroup::OCCLUDED))
- {
- stateSort(bridge, camera);
- }
- }
- }
{
LLFastTimer ftm(FTM_STATESORT_DRAWABLE);
for (LLCullResult::drawable_list_t::iterator iter = sCull->beginVisibleList();
@@ -2300,6 +2744,11 @@ void LLPipeline::stateSort(LLSpatialGroup* group, LLCamera& camera)
LLDrawable* drawablep = *i;
stateSort(drawablep, camera);
}
+
+ if (LLViewerCamera::sCurCameraID == LLViewerCamera::CAMERA_WORLD)
+ { //avoid redundant stateSort calls
+ group->mLastUpdateDistance = group->mDistance;
+ }
}
}
@@ -2307,7 +2756,7 @@ void LLPipeline::stateSort(LLSpatialGroup* group, LLCamera& camera)
void LLPipeline::stateSort(LLSpatialBridge* bridge, LLCamera& camera)
{
LLMemType mt(LLMemType::MTYPE_PIPELINE_STATE_SORT);
- if (!sShadowRender && bridge->getSpatialGroup()->changeLOD())
+ if (bridge->getSpatialGroup()->changeLOD())
{
bool force_update = false;
bridge->updateDistance(camera, force_update);
@@ -2366,21 +2815,17 @@ void LLPipeline::stateSort(LLDrawable* drawablep, LLCamera& camera)
if (LLViewerCamera::sCurCameraID == LLViewerCamera::CAMERA_WORLD)
{
- LLSpatialGroup* group = drawablep->getSpatialGroup();
- if (!group || group->changeLOD())
+ //if (drawablep->isVisible()) isVisible() check here is redundant, if it wasn't visible, it wouldn't be here
{
- if (drawablep->isVisible())
+ if (!drawablep->isActive())
{
- if (!drawablep->isActive())
- {
- bool force_update = false;
- drawablep->updateDistance(camera, force_update);
- }
- else if (drawablep->isAvatar())
- {
- bool force_update = false;
- drawablep->updateDistance(camera, force_update); // calls vobj->updateLOD() which calls LLVOAvatar::updateVisibility()
- }
+ bool force_update = false;
+ drawablep->updateDistance(camera, force_update);
+ }
+ else if (drawablep->isAvatar())
+ {
+ bool force_update = false;
+ drawablep->updateDistance(camera, force_update); // calls vobj->updateLOD() which calls LLVOAvatar::updateVisibility()
}
}
}
@@ -2608,21 +3053,6 @@ void LLPipeline::postSort(LLCamera& camera)
//rebuild groups
sCull->assertDrawMapsEmpty();
- /*LLSpatialGroup::sNoDelete = FALSE;
- for (LLCullResult::sg_list_t::iterator i = sCull->beginVisibleGroups(); i != sCull->endVisibleGroups(); ++i)
- {
- LLSpatialGroup* group = *i;
- if (sUseOcclusion &&
- group->isState(LLSpatialGroup::OCCLUDED))
- {
- continue;
- }
-
- group->rebuildGeom();
- }
- LLSpatialGroup::sNoDelete = TRUE;*/
-
-
rebuildPriorityGroups();
llpushcallstacks ;
@@ -2668,8 +3098,10 @@ void LLPipeline::postSort(LLCamera& camera)
{
if (sMinRenderSize > 0.f)
{
- LLVector3 bounds = (*k)->mExtents[1]-(*k)->mExtents[0];
- if (llmax(llmax(bounds.mV[0], bounds.mV[1]), bounds.mV[2]) > sMinRenderSize)
+ LLVector4a bounds;
+ bounds.setSub((*k)->mExtents[1],(*k)->mExtents[0]);
+
+ if (llmax(llmax(bounds[0], bounds[1]), bounds[2]) > sMinRenderSize)
{
sCull->pushDrawInfo(j->first, *k);
}
@@ -2830,7 +3262,7 @@ void render_hud_elements()
gGL.color4f(1,1,1,1);
if (!LLPipeline::sReflectionRender && gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_UI))
{
- LLGLEnable multisample(GL_MULTISAMPLE_ARB);
+ LLGLEnable multisample(gSavedSettings.getU32("RenderFSAASamples") > 0 ? GL_MULTISAMPLE_ARB : 0);
gViewerWindow->renderSelections(FALSE, FALSE, FALSE); // For HUD version in render_ui_3d()
// Draw the tracking overlays
@@ -3044,6 +3476,13 @@ void LLPipeline::renderGeom(LLCamera& camera, BOOL forceVBOUpdate)
}
}
+ S32 stack_depth = 0;
+
+ if (gDebugGL)
+ {
+ glGetIntegerv(GL_MODELVIEW_STACK_DEPTH, &stack_depth);
+ }
+
///////////////////////////////////////////
//
// Sync and verify GL state
@@ -3074,7 +3513,7 @@ void LLPipeline::renderGeom(LLCamera& camera, BOOL forceVBOUpdate)
glMatrixMode(GL_MODELVIEW);
LLGLSPipeline gls_pipeline;
- LLGLEnable multisample(GL_MULTISAMPLE_ARB);
+ LLGLEnable multisample(gSavedSettings.getU32("RenderFSAASamples") > 0 ? GL_MULTISAMPLE_ARB : 0);
LLGLState gls_color_material(GL_COLOR_MATERIAL, mLightingDetail < 2);
@@ -3168,18 +3607,9 @@ void LLPipeline::renderGeom(LLCamera& camera, BOOL forceVBOUpdate)
}
poolp->endRenderPass(i);
LLVertexBuffer::unbind();
- if (gDebugGL || gDebugPipeline)
+ if (gDebugGL)
{
- GLint depth;
- glGetIntegerv(GL_MODELVIEW_STACK_DEPTH, &depth);
- if (depth > 3)
- {
- if (gDebugSession)
- {
- ll_fail("GL matrix stack corrupted.");
- }
- llerrs << "GL matrix stack corrupted!" << llendl;
- }
+ check_stack_depth(stack_depth);
std::string msg = llformat("%s pass %d", gPoolNames[cur_type].c_str(), i);
LLGLState::checkStates(msg);
LLGLState::checkTextureChannels(msg);
@@ -3202,11 +3632,11 @@ void LLPipeline::renderGeom(LLCamera& camera, BOOL forceVBOUpdate)
iter1 = iter2;
stop_glerror();
}
-
- LLAppViewer::instance()->pingMainloopTimeout("Pipeline:RenderDrawPoolsEnd");
-
- LLVertexBuffer::unbind();
+ LLAppViewer::instance()->pingMainloopTimeout("Pipeline:RenderDrawPoolsEnd");
+
+ LLVertexBuffer::unbind();
+
gGLLastMatrix = NULL;
glLoadMatrixd(gGLModelView);
@@ -3253,9 +3683,9 @@ void LLPipeline::renderGeom(LLCamera& camera, BOOL forceVBOUpdate)
{
if (gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_UI))
{
- // Render debugging beacons.
- gObjectList.renderObjectBeacons();
- gObjectList.resetObjectBeacons();
+ // Render debugging beacons.
+ gObjectList.renderObjectBeacons();
+ gObjectList.resetObjectBeacons();
}
else
{
@@ -3314,7 +3744,7 @@ void LLPipeline::renderGeomDeferred(LLCamera& camera)
}
}
- LLGLEnable multisample(GL_MULTISAMPLE_ARB);
+ LLGLEnable multisample(gSavedSettings.getU32("RenderFSAASamples") > 0 ? GL_MULTISAMPLE_ARB : 0);
LLVertexBuffer::unbind();
@@ -3403,7 +3833,7 @@ void LLPipeline::renderGeomPostDeferred(LLCamera& camera)
LLGLEnable cull(GL_CULL_FACE);
- LLGLEnable multisample(GL_MULTISAMPLE_ARB);
+ LLGLEnable multisample(gSavedSettings.getU32("RenderFSAASamples") > 0 ? GL_MULTISAMPLE_ARB : 0);
calcNearbyLights(camera);
setupHWLights(NULL);
@@ -3588,6 +4018,59 @@ void LLPipeline::addTrianglesDrawn(S32 index_count, U32 render_type)
}
}
+void LLPipeline::renderPhysicsDisplay()
+{
+ if (!hasRenderDebugMask(LLPipeline::RENDER_DEBUG_PHYSICS_SHAPES))
+ {
+ return;
+ }
+
+ allocatePhysicsBuffer();
+
+ gGL.flush();
+ mPhysicsDisplay.bindTarget();
+ glClearColor(0,0,0,1);
+ gGL.setColorMask(true, true);
+ mPhysicsDisplay.clear();
+ glClearColor(0,0,0,0);
+
+ gGL.setColorMask(true, false);
+
+ for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin();
+ iter != LLWorld::getInstance()->getRegionList().end(); ++iter)
+ {
+ LLViewerRegion* region = *iter;
+ for (U32 i = 0; i < LLViewerRegion::NUM_PARTITIONS; i++)
+ {
+ LLSpatialPartition* part = region->getSpatialPartition(i);
+ if (part)
+ {
+ if (hasRenderType(part->mDrawableType))
+ {
+ part->renderPhysicsShapes();
+ }
+ }
+ }
+ }
+
+ for (LLCullResult::bridge_list_t::const_iterator i = sCull->beginVisibleBridge(); i != sCull->endVisibleBridge(); ++i)
+ {
+ LLSpatialBridge* bridge = *i;
+ if (!bridge->isDead() && hasRenderType(bridge->mDrawableType))
+ {
+ glPushMatrix();
+ glMultMatrixf((F32*)bridge->mDrawable->getRenderMatrix().mMatrix);
+ bridge->renderPhysicsShapes();
+ glPopMatrix();
+ }
+ }
+
+
+ gGL.flush();
+ mPhysicsDisplay.flush();
+}
+
+
void LLPipeline::renderDebug()
{
LLMemType mt(LLMemType::MTYPE_PIPELINE);
@@ -3600,6 +4083,8 @@ void LLPipeline::renderDebug()
glLoadMatrixd(gGLModelView);
gGL.setColorMask(true, false);
+ bool hud_only = hasRenderType(LLPipeline::RENDER_TYPE_HUD);
+
// Debug stuff.
for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin();
iter != LLWorld::getInstance()->getRegionList().end(); ++iter)
@@ -3610,7 +4095,8 @@ void LLPipeline::renderDebug()
LLSpatialPartition* part = region->getSpatialPartition(i);
if (part)
{
- if (hasRenderType(part->mDrawableType))
+ if ( hud_only && (part->mDrawableType == RENDER_TYPE_HUD || part->mDrawableType == RENDER_TYPE_HUD_PARTICLES) ||
+ !hud_only && hasRenderType(part->mDrawableType) )
{
part->renderDebug();
}
@@ -3630,8 +4116,67 @@ 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();
+
LLGLEnable blend(GL_BLEND);
LLGLDepthTest depth(TRUE, FALSE);
LLGLDisable cull(GL_CULL_FACE);
@@ -3695,7 +4240,7 @@ void LLPipeline::renderDebug()
if (i < 4)
{
- if (i == 0 || !mShadowFrustPoints[i].empty())
+ //if (i == 0 || !mShadowFrustPoints[i].empty())
{
//render visible point cloud
gGL.flush();
@@ -3735,11 +4280,12 @@ void LLPipeline::renderDebug()
gGL.vertex3fv(frust[2].mV); gGL.vertex3fv(frust[6].mV);
gGL.vertex3fv(frust[3].mV); gGL.vertex3fv(frust[7].mV);
gGL.end();
- }
-
+ }
}
- /*for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin();
+ /*gGL.flush();
+ glLineWidth(16-i*2);
+ for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin();
iter != LLWorld::getInstance()->getRegionList().end(); ++iter)
{
LLViewerRegion* region = *iter;
@@ -3754,7 +4300,9 @@ void LLPipeline::renderDebug()
}
}
}
- }*/
+ }
+ gGL.flush();
+ glLineWidth(1.f);*/
}
}
@@ -3794,13 +4342,19 @@ void LLPipeline::renderDebug()
if (mRenderDebugMask & LLPipeline::RENDER_DEBUG_BUILD_QUEUE)
{
U32 count = 0;
- U32 size = mBuildQ2.size();
+ U32 size = mGroupQ2.size();
LLColor4 col;
+ LLVertexBuffer::unbind();
LLGLEnable blend(GL_BLEND);
+ gGL.setSceneBlendType(LLRender::BT_ALPHA);
LLGLDepthTest depth(GL_TRUE, GL_FALSE);
gGL.getTexUnit(0)->bind(LLViewerFetchedTexture::sWhiteImagep);
+ gGL.pushMatrix();
+ glLoadMatrixd(gGLModelView);
+ gGLLastMatrix = NULL;
+
for (LLSpatialGroup::sg_vector_t::iterator iter = mGroupQ2.begin(); iter != mGroupQ2.end(); ++iter)
{
LLSpatialGroup* group = *iter;
@@ -3822,7 +4376,7 @@ void LLPipeline::renderDebug()
glMultMatrixf((F32*)bridge->mDrawable->getRenderMatrix().mMatrix);
}
- F32 alpha = (F32) (size-count)/size;
+ F32 alpha = llclamp((F32) (size-count)/size, 0.f, 1.f);
LLVector2 c(1.f-alpha, alpha);
@@ -3830,7 +4384,7 @@ void LLPipeline::renderDebug()
++count;
- col.set(c.mV[0], c.mV[1], 0, alpha*0.5f+0.1f);
+ col.set(c.mV[0], c.mV[1], 0, alpha*0.5f+0.5f);
group->drawObjectBox(col);
if (bridge)
@@ -3838,9 +4392,13 @@ void LLPipeline::renderDebug()
gGL.popMatrix();
}
}
+
+ gGL.popMatrix();
}
gGL.flush();
+
+ gPipeline.renderPhysicsDisplay();
}
void LLPipeline::rebuildPools()
@@ -4172,16 +4730,19 @@ void LLPipeline::setupAvatarLights(BOOL for_edit)
light_pos.normalize();
+ LLLightState* light = gGL.getLight(1);
+
mHWLightColors[1] = diffuse;
- glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse.mV);
- glLightfv(GL_LIGHT1, GL_AMBIENT, LLColor4::black.mV);
- glLightfv(GL_LIGHT1, GL_SPECULAR, LLColor4::black.mV);
- glLightfv(GL_LIGHT1, GL_POSITION, light_pos.mV);
- glLightf (GL_LIGHT1, GL_CONSTANT_ATTENUATION, 1.0f);
- glLightf (GL_LIGHT1, GL_LINEAR_ATTENUATION, 0.0f);
- glLightf (GL_LIGHT1, GL_QUADRATIC_ATTENUATION, 0.0f);
- glLightf (GL_LIGHT1, GL_SPOT_EXPONENT, 0.0f);
- glLightf (GL_LIGHT1, GL_SPOT_CUTOFF, 180.0f);
+
+ light->setDiffuse(diffuse);
+ light->setAmbient(LLColor4::black);
+ light->setSpecular(LLColor4::black);
+ light->setPosition(light_pos);
+ light->setConstantAttenuation(1.f);
+ light->setLinearAttenuation(0.f);
+ light->setQuadraticAttenuation(0.f);
+ light->setSpotExponent(0.f);
+ light->setSpotCutoff(180.f);
}
else if (gAvatarBacklight) // Always true (unless overridden in a devs .ini)
{
@@ -4212,22 +4773,28 @@ void LLPipeline::setupAvatarLights(BOOL for_edit)
backlight_diffuse *= backlight_mag / max_component;
mHWLightColors[1] = backlight_diffuse;
- glLightfv(GL_LIGHT1, GL_POSITION, backlight_pos.mV); // this is just sun/moon direction
- glLightfv(GL_LIGHT1, GL_DIFFUSE, backlight_diffuse.mV);
- glLightfv(GL_LIGHT1, GL_AMBIENT, LLColor4::black.mV);
- glLightfv(GL_LIGHT1, GL_SPECULAR, LLColor4::black.mV);
- glLightf (GL_LIGHT1, GL_CONSTANT_ATTENUATION, 1.0f);
- glLightf (GL_LIGHT1, GL_LINEAR_ATTENUATION, 0.0f);
- glLightf (GL_LIGHT1, GL_QUADRATIC_ATTENUATION, 0.0f);
- glLightf (GL_LIGHT1, GL_SPOT_EXPONENT, 0.0f);
- glLightf (GL_LIGHT1, GL_SPOT_CUTOFF, 180.0f);
+
+ LLLightState* light = gGL.getLight(1);
+
+ light->setPosition(backlight_pos);
+ light->setDiffuse(backlight_diffuse);
+ light->setAmbient(LLColor4::black);
+ light->setSpecular(LLColor4::black);
+ light->setConstantAttenuation(1.f);
+ light->setLinearAttenuation(0.f);
+ light->setQuadraticAttenuation(0.f);
+ light->setSpotExponent(0.f);
+ light->setSpotCutoff(180.f);
}
else
{
+ LLLightState* light = gGL.getLight(1);
+
mHWLightColors[1] = LLColor4::black;
- glLightfv(GL_LIGHT1, GL_DIFFUSE, LLColor4::black.mV);
- glLightfv(GL_LIGHT1, GL_AMBIENT, LLColor4::black.mV);
- glLightfv(GL_LIGHT1, GL_SPECULAR, LLColor4::black.mV);
+
+ light->setDiffuse(LLColor4::black);
+ light->setAmbient(LLColor4::black);
+ light->setSpecular(LLColor4::black);
}
}
@@ -4246,7 +4813,7 @@ static F32 calc_light_dist(LLVOVolume* light, const LLVector3& cam_pos, F32 max_
{
return max_dist;
}
- F32 dist = fsqrtf(dist2);
+ F32 dist = (F32) sqrt(dist2);
dist *= 1.f / inten;
dist -= radius;
if (selected)
@@ -4275,7 +4842,7 @@ void LLPipeline::calcNearbyLights(LLCamera& camera)
// mNearbyLight (and all light_set_t's) are sorted such that
// begin() == the closest light and rbegin() == the farthest light
const S32 MAX_LOCAL_LIGHTS = 6;
-// LLVector3 cam_pos = gAgentCamera.getCameraPositionAgent();
+// LLVector3 cam_pos = gAgent.getCameraPositionAgent();
LLVector3 cam_pos = LLViewerJoystick::getInstance()->getOverrideCamera() ?
camera.getOrigin() :
gAgent.getPositionAgent();
@@ -4408,15 +4975,17 @@ void LLPipeline::setupHWLights(LLDrawPool* pool)
LLVector4 light_pos(mSunDir, 0.0f);
LLColor4 light_diffuse = mSunDiffuse;
mHWLightColors[0] = light_diffuse;
- glLightfv(GL_LIGHT0, GL_POSITION, light_pos.mV); // this is just sun/moon direction
- glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse.mV);
- glLightfv(GL_LIGHT0, GL_AMBIENT, LLColor4::black.mV);
- glLightfv(GL_LIGHT0, GL_SPECULAR, LLColor4::black.mV);
- glLightf (GL_LIGHT0, GL_CONSTANT_ATTENUATION, 1.0f);
- glLightf (GL_LIGHT0, GL_LINEAR_ATTENUATION, 0.0f);
- glLightf (GL_LIGHT0, GL_QUADRATIC_ATTENUATION, 0.0f);
- glLightf (GL_LIGHT0, GL_SPOT_EXPONENT, 0.0f);
- glLightf (GL_LIGHT0, GL_SPOT_CUTOFF, 180.0f);
+
+ LLLightState* light = gGL.getLight(0);
+ light->setPosition(light_pos);
+ light->setDiffuse(light_diffuse);
+ light->setAmbient(LLColor4::black);
+ light->setSpecular(LLColor4::black);
+ light->setConstantAttenuation(1.f);
+ light->setLinearAttenuation(0.f);
+ light->setQuadraticAttenuation(0.f);
+ light->setSpotExponent(0.f);
+ light->setSpotCutoff(180.f);
}
// Light 1 = Backlight (for avatars)
@@ -4474,13 +5043,23 @@ void LLPipeline::setupHWLights(LLDrawPool* pool)
float linatten = x / (light_radius); // % of brightness at radius
mHWLightColors[cur_light] = light_color;
- S32 gllight = GL_LIGHT0+cur_light;
- glLightfv(gllight, GL_POSITION, light_pos_gl.mV);
- glLightfv(gllight, GL_DIFFUSE, light_color.mV);
- glLightfv(gllight, GL_AMBIENT, LLColor4::black.mV);
- glLightf (gllight, GL_CONSTANT_ATTENUATION, 0.0f);
- glLightf (gllight, GL_LINEAR_ATTENUATION, linatten);
- glLightf (gllight, GL_QUADRATIC_ATTENUATION, 0.0f);
+ LLLightState* light_state = gGL.getLight(cur_light);
+
+ light_state->setPosition(light_pos_gl);
+ light_state->setDiffuse(light_color);
+ light_state->setAmbient(LLColor4::black);
+ light_state->setConstantAttenuation(0.f);
+ if (sRenderDeferred)
+ {
+ light_state->setLinearAttenuation(light_radius*1.5f);
+ light_state->setQuadraticAttenuation(light->getLightFalloff()*0.5f+1.f);
+ }
+ else
+ {
+ light_state->setLinearAttenuation(linatten);
+ light_state->setQuadraticAttenuation(0.f);
+ }
+
if (light->isLightSpotlight() // directional (spot-)light
&& (LLPipeline::sRenderDeferred || gSavedSettings.getBOOL("RenderSpotLightsInNondeferred"))) // these are only rendered as GL spotlights if we're in deferred rendering mode *or* the setting forces them on
{
@@ -4488,22 +5067,21 @@ void LLPipeline::setupHWLights(LLDrawPool* pool)
LLQuaternion quat = light->getRenderRotation();
LLVector3 at_axis(0,0,-1); // this matches deferred rendering's object light direction
at_axis *= quat;
- //llinfos << "SPOT!!!!!!! fov: " << spotparams.mV[0] << " focus: " << spotparams.mV[1] << " dir: " << at_axis << llendl;
- glLightfv(gllight, GL_SPOT_DIRECTION, at_axis.mV);
- glLightf (gllight, GL_SPOT_EXPONENT, 2.0f); // 2.0 = good old dot product ^ 2
- glLightf (gllight, GL_SPOT_CUTOFF, 90.0f); // hemisphere
- const float specular[] = {0.f, 0.f, 0.f, 0.f};
- glLightfv(gllight, GL_SPECULAR, specular);
+
+ light_state->setSpotDirection(at_axis);
+ light_state->setSpotCutoff(90.f);
+ light_state->setSpotExponent(2.f);
+
+ light_state->setSpecular(LLColor4::black);
}
else // omnidirectional (point) light
{
- glLightf (gllight, GL_SPOT_EXPONENT, 0.0f);
- glLightf (gllight, GL_SPOT_CUTOFF, 180.0f);
-
+ light_state->setSpotExponent(0.f);
+ light_state->setSpotCutoff(180.f);
+
// we use specular.w = 1.0 as a cheap hack for the shaders to know that this is omnidirectional rather than a spotlight
- const float specular[] = {0.f, 0.f, 0.f, 1.f};
- glLightfv(gllight, GL_SPECULAR, specular);
- //llinfos << "boring light" << llendl;
+ const LLColor4 specular(0.f, 0.f, 0.f, 1.f);
+ light_state->setSpecular(specular);
}
cur_light++;
if (cur_light >= 8)
@@ -4515,13 +5093,13 @@ void LLPipeline::setupHWLights(LLDrawPool* pool)
for ( ; cur_light < 8 ; cur_light++)
{
mHWLightColors[cur_light] = LLColor4::black;
- S32 gllight = GL_LIGHT0+cur_light;
- glLightfv(gllight, GL_DIFFUSE, LLColor4::black.mV);
- glLightfv(gllight, GL_AMBIENT, LLColor4::black.mV);
- glLightfv(gllight, GL_SPECULAR, LLColor4::black.mV);
- }
+ LLLightState* light = gGL.getLight(cur_light);
- if (isAgentAvatarValid() &&
+ light->setDiffuse(LLColor4::black);
+ light->setAmbient(LLColor4::black);
+ light->setSpecular(LLColor4::black);
+ }
+ if (gAgentAvatarp &&
gAgentAvatarp->mSpecialRenderMode == 3)
{
LLColor4 light_color = LLColor4::white;
@@ -4536,23 +5114,24 @@ void LLPipeline::setupHWLights(LLDrawPool* pool)
float linatten = x / (light_radius); // % of brightness at radius
mHWLightColors[2] = light_color;
- S32 gllight = GL_LIGHT2;
- glLightfv(gllight, GL_POSITION, light_pos_gl.mV);
- glLightfv(gllight, GL_DIFFUSE, light_color.mV);
- glLightfv(gllight, GL_AMBIENT, LLColor4::black.mV);
- glLightfv(gllight, GL_SPECULAR, LLColor4::black.mV);
- glLightf (gllight, GL_CONSTANT_ATTENUATION, 0.0f);
- glLightf (gllight, GL_LINEAR_ATTENUATION, linatten);
- glLightf (gllight, GL_QUADRATIC_ATTENUATION, 0.0f);
- glLightf (gllight, GL_SPOT_EXPONENT, 0.0f);
- glLightf (gllight, GL_SPOT_CUTOFF, 180.0f);
+ LLLightState* light = gGL.getLight(2);
+
+ light->setPosition(light_pos_gl);
+ light->setDiffuse(light_color);
+ light->setAmbient(LLColor4::black);
+ light->setSpecular(LLColor4::black);
+ light->setQuadraticAttenuation(0.f);
+ light->setConstantAttenuation(0.f);
+ light->setLinearAttenuation(linatten);
+ light->setSpotExponent(0.f);
+ light->setSpotCutoff(180.f);
}
// Init GL state
glDisable(GL_LIGHTING);
- for (S32 gllight=GL_LIGHT0; gllight<=GL_LIGHT7; gllight++)
+ for (S32 i = 0; i < 8; ++i)
{
- glDisable(gllight);
+ gGL.getLight(i)->disable();
}
mLightMask = 0;
}
@@ -4577,15 +5156,16 @@ void LLPipeline::enableLights(U32 mask)
stop_glerror();
for (S32 i=0; i<8; i++)
{
+ LLLightState* light = gGL.getLight(i);
if (mask & (1<<i))
{
- glEnable(GL_LIGHT0 + i);
- glLightfv(GL_LIGHT0 + i, GL_DIFFUSE, mHWLightColors[i].mV);
+ light->enable();
+ light->setDiffuse(mHWLightColors[i]);
}
else
{
- glDisable(GL_LIGHT0 + i);
- glLightfv(GL_LIGHT0 + i, GL_DIFFUSE, LLColor4::black.mV);
+ light->disable();
+ light->setDiffuse(LLColor4::black);
}
}
stop_glerror();
@@ -4609,7 +5189,6 @@ void LLPipeline::enableLightsStatic()
if (mLightingDetail >= 2)
{
mask |= mLightMovingMask; // Hardware moving lights
- glColor4f(0.f, 0.f, 0.f, 1.0f); // no local lighting by default
}
else
{
@@ -4623,11 +5202,7 @@ void LLPipeline::enableLightsDynamic()
assertInitialized();
U32 mask = 0xff & (~2); // Local lights
enableLights(mask);
- if (mLightingDetail >= 2)
- {
- glColor4f(0.f, 0.f, 0.f, 1.f); // no local lighting by default
- }
-
+
if (isAgentAvatarValid() && getLightingDetail() <= 0)
{
if (gAgentAvatarp->mSpecialRenderMode == 0) // normal
@@ -4648,6 +5223,65 @@ void LLPipeline::enableLightsAvatar()
enableLights(mask);
}
+void LLPipeline::enableLightsPreview()
+{
+ disableLights();
+
+ glEnable(GL_LIGHTING);
+ LLColor4 ambient = gSavedSettings.getColor4("PreviewAmbientColor");
+ glLightModelfv(GL_LIGHT_MODEL_AMBIENT,ambient.mV);
+
+
+ LLColor4 diffuse0 = gSavedSettings.getColor4("PreviewDiffuse0");
+ LLColor4 specular0 = gSavedSettings.getColor4("PreviewSpecular0");
+ LLColor4 diffuse1 = gSavedSettings.getColor4("PreviewDiffuse1");
+ LLColor4 specular1 = gSavedSettings.getColor4("PreviewSpecular1");
+ LLColor4 diffuse2 = gSavedSettings.getColor4("PreviewDiffuse2");
+ LLColor4 specular2 = gSavedSettings.getColor4("PreviewSpecular2");
+
+ LLVector3 dir0 = gSavedSettings.getVector3("PreviewDirection0");
+ LLVector3 dir1 = gSavedSettings.getVector3("PreviewDirection1");
+ LLVector3 dir2 = gSavedSettings.getVector3("PreviewDirection2");
+
+ dir0.normVec();
+ dir1.normVec();
+ dir2.normVec();
+
+ LLVector4 light_pos(dir0, 0.0f);
+
+ LLLightState* light = gGL.getLight(0);
+
+ light->enable();
+ light->setPosition(light_pos);
+ light->setDiffuse(diffuse0);
+ light->setAmbient(LLColor4::black);
+ light->setSpecular(specular0);
+ light->setSpotExponent(0.f);
+ light->setSpotCutoff(180.f);
+
+ light_pos = LLVector4(dir1, 0.f);
+
+ light = gGL.getLight(1);
+ light->enable();
+ light->setPosition(light_pos);
+ light->setDiffuse(diffuse1);
+ light->setAmbient(LLColor4::black);
+ light->setSpecular(specular1);
+ light->setSpotExponent(0.f);
+ light->setSpotCutoff(180.f);
+
+ light_pos = LLVector4(dir2, 0.f);
+ light = gGL.getLight(2);
+ light->enable();
+ light->setPosition(light_pos);
+ light->setDiffuse(diffuse2);
+ light->setAmbient(LLColor4::black);
+ light->setSpecular(specular2);
+ light->setSpotExponent(0.f);
+ light->setSpotCutoff(180.f);
+}
+
+
void LLPipeline::enableLightsAvatarEdit(const LLColor4& color)
{
U32 mask = 0x2002; // Avatar backlight only, set ambient
@@ -4664,16 +5298,11 @@ void LLPipeline::enableLightsFullbright(const LLColor4& color)
enableLights(mask);
glLightModelfv(GL_LIGHT_MODEL_AMBIENT,color.mV);
- /*if (mLightingDetail >= 2)
- {
- glColor4f(0.f, 0.f, 0.f, 1.f); // no local lighting by default
- }*/
}
void LLPipeline::disableLights()
{
enableLights(0); // no lighting (full bright)
- glColor4f(1.f, 1.f, 1.f, 1.f); // lighting color = white by default
}
//============================================================================
@@ -4939,6 +5568,18 @@ BOOL LLPipeline::toggleRenderDebugFeatureControl(void* data)
return gPipeline.hasRenderDebugFeatureMask(bit);
}
+void LLPipeline::setRenderDebugFeatureControl(U32 bit, bool value)
+{
+ if (value)
+ {
+ gPipeline.mRenderDebugFeatureMask |= bit;
+ }
+ else
+ {
+ gPipeline.mRenderDebugFeatureMask &= !bit;
+ }
+}
+
// static
void LLPipeline::setRenderScriptedBeacons(BOOL val)
{
@@ -5289,17 +5930,12 @@ void LLPipeline::resetVertexBuffers(LLDrawable* drawable)
for (S32 i = 0; i < drawable->getNumFaces(); i++)
{
LLFace* facep = drawable->getFace(i);
- facep->mVertexBuffer = NULL;
- facep->mLastVertexBuffer = NULL;
+ facep->clearVertexBuffer();
}
}
void LLPipeline::resetVertexBuffers()
-{
- sRenderBump = gSavedSettings.getBOOL("RenderObjectBump");
- sUseTriStrips = gSavedSettings.getBOOL("RenderUseTriStrips");
- LLVertexBuffer::sUseStreamDraw = gSavedSettings.getBOOL("RenderUseStreamVBO");
-
+{
for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin();
iter != LLWorld::getInstance()->getRegionList().end(); ++iter)
{
@@ -5339,8 +5975,16 @@ void LLPipeline::resetVertexBuffers()
llwarns << "VBO name pool cleanup failed." << llendl;
}
- LLVertexBuffer::unbind();
-
+ LLVertexBuffer::unbind();
+
+ sRenderBump = gSavedSettings.getBOOL("RenderObjectBump");
+ sUseTriStrips = gSavedSettings.getBOOL("RenderUseTriStrips");
+ LLVertexBuffer::sUseStreamDraw = gSavedSettings.getBOOL("RenderUseStreamVBO");
+ LLVertexBuffer::sPreferStreamDraw = gSavedSettings.getBOOL("RenderPreferStreamDraw");
+ LLVertexBuffer::sEnableVBOs = gSavedSettings.getBOOL("RenderVBOEnable");
+ LLVertexBuffer::sDisableVBOMapping = LLVertexBuffer::sEnableVBOs && gSavedSettings.getBOOL("RenderVBOMappingDisable") ;
+ sBakeSunlight = gSavedSettings.getBOOL("RenderBakeSunlight");
+ sNoAlpha = gSavedSettings.getBOOL("RenderNoAlpha");
LLPipeline::sTextureBindTest = gSavedSettings.getBOOL("RenderDebugTextureBind");
}
@@ -5355,42 +5999,6 @@ void LLPipeline::renderObjects(U32 type, U32 mask, BOOL texture)
gGLLastMatrix = NULL;
}
-void LLPipeline::setUseVBO(BOOL use_vbo)
-{
- if (use_vbo != LLVertexBuffer::sEnableVBOs)
- {
- if (use_vbo)
- {
- llinfos << "Enabling VBO." << llendl;
- }
- else
- {
- llinfos << "Disabling VBO." << llendl;
- }
-
- resetVertexBuffers();
- LLVertexBuffer::initClass(use_vbo, gSavedSettings.getBOOL("RenderVBOMappingDisable"));
- }
-}
-
-void LLPipeline::setDisableVBOMapping(BOOL no_vbo_mapping)
-{
- if (LLVertexBuffer::sEnableVBOs && no_vbo_mapping != LLVertexBuffer::sDisableVBOMapping)
- {
- if (no_vbo_mapping)
- {
- llinfos << "Disabling VBO glMapBufferARB." << llendl;
- }
- else
- {
- llinfos << "Enabling VBO glMapBufferARB." << llendl;
- }
-
- resetVertexBuffers();
- LLVertexBuffer::initClass(true, no_vbo_mapping);
- }
-}
-
void apply_cube_face_rotation(U32 face)
{
switch (face)
@@ -5422,21 +6030,21 @@ void apply_cube_face_rotation(U32 face)
void validate_framebuffer_object()
{
GLenum status;
- status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
+ status = glCheckFramebufferStatus(GL_FRAMEBUFFER_EXT);
switch(status)
{
- case GL_FRAMEBUFFER_COMPLETE_EXT:
+ case GL_FRAMEBUFFER_COMPLETE:
//framebuffer OK, no error.
break;
- case GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT:
+ case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT:
// frame buffer not OK: probably means unsupported depth buffer format
- llerrs << "Framebuffer Incomplete Dimensions." << llendl;
+ llerrs << "Framebuffer Incomplete Missing Attachment." << llendl;
break;
- case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT:
+ case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT:
// frame buffer not OK: probably means unsupported depth buffer format
llerrs << "Framebuffer Incomplete Attachment." << llendl;
break;
- case GL_FRAMEBUFFER_UNSUPPORTED_EXT:
+ case GL_FRAMEBUFFER_UNSUPPORTED:
/* choose different formats */
llerrs << "Framebuffer unsupported." << llendl;
break;
@@ -5484,8 +6092,6 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)
tc2 /= (F32) res_mod;
}
- gGL.setColorMask(true, true);
-
LLFastTimer ftm(FTM_RENDER_BLOOM);
gGL.color4f(1,1,1,1);
LLGLDepthTest depth(GL_FALSE);
@@ -5681,7 +6287,7 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)
if (LLRenderTarget::sUseFBO)
{
LLFastTimer ftm(FTM_RENDER_BLOOM_FBO);
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
+ glBindFramebuffer(GL_FRAMEBUFFER, 0);
}
gGLViewport[0] = gViewerWindow->getWorldViewRectRaw().mLeft;
@@ -5697,16 +6303,149 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)
LLVertexBuffer::unbind();
- if (LLPipeline::sRenderDeferred && LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_DEFERRED) > 2)
+ if (LLPipeline::sRenderDeferred && !LLViewerCamera::getInstance()->cameraUnderWater())
{
+ bool dof_enabled = true;
+
+ LLGLSLShader* shader = &gDeferredPostProgram;
+ if (LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_DEFERRED) > 2)
+ {
+ shader = &gDeferredGIFinalProgram;
+ dof_enabled = false;
+ }
+ else if (LLToolMgr::getInstance()->inBuildMode() || !gSavedSettings.getBOOL("RenderDepthOfField"))
+ { //squish focal length when in build mode (or if DoF is disabled) so DoF doesn't make editing objects difficult
+ shader = &gDeferredPostNoDoFProgram;
+ dof_enabled = false;
+ }
+
+
LLGLDisable blend(GL_BLEND);
- bindDeferredShader(gDeferredGIFinalProgram);
+ bindDeferredShader(*shader);
+
+ if (dof_enabled)
+ {
+ //depth of field focal plane calculations
+
+ static F32 current_distance = 16.f;
+ static F32 start_distance = 16.f;
+ static F32 transition_time = 1.f;
+
+ LLVector3 focus_point;
+
+ LLViewerObject* obj = LLViewerMediaFocus::getInstance()->getFocusedObject();
+ if (obj && obj->mDrawable && obj->isSelected())
+ { //focus on selected media object
+ S32 face_idx = LLViewerMediaFocus::getInstance()->getFocusedFace();
+ if (obj && obj->mDrawable)
+ {
+ LLFace* face = obj->mDrawable->getFace(face_idx);
+ if (face)
+ {
+ focus_point = face->getPositionAgent();
+ }
+ }
+ }
+
+ if (focus_point.isExactlyZero())
+ {
+ if (LLViewerJoystick::getInstance()->getOverrideCamera())
+ { //focus on point under cursor
+ focus_point = gDebugRaycastIntersection;
+ }
+ else if (gAgentCamera.cameraMouselook())
+ { //focus on point under mouselook crosshairs
+ gViewerWindow->cursorIntersect(-1, -1, 512.f, NULL, -1, FALSE,
+ NULL,
+ &focus_point);
+ }
+ else
+ {
+ LLViewerObject* obj = gAgentCamera.getFocusObject();
+ if (obj)
+ { //focus on alt-zoom target
+ focus_point = LLVector3(gAgentCamera.getFocusGlobal()-gAgent.getRegion()->getOriginGlobal());
+ }
+ else
+ { //focus on your avatar
+ focus_point = gAgent.getPositionAgent();
+ }
+ }
+ }
+
+ LLVector3 eye = LLViewerCamera::getInstance()->getOrigin();
+ F32 target_distance = 16.f;
+ if (!focus_point.isExactlyZero())
+ {
+ target_distance = LLViewerCamera::getInstance()->getAtAxis() * (focus_point-eye);
+ }
+
+ if (transition_time >= 1.f &&
+ fabsf(current_distance-target_distance)/current_distance > 0.01f)
+ { //large shift happened, interpolate smoothly to new target distance
+ transition_time = 0.f;
+ start_distance = current_distance;
+ }
+ else if (transition_time < 1.f)
+ { //currently in a transition, continue interpolating
+ transition_time += 1.f/gSavedSettings.getF32("CameraFocusTransitionTime")*gFrameIntervalSeconds;
+ transition_time = llmin(transition_time, 1.f);
+
+ F32 t = cosf(transition_time*F_PI+F_PI)*0.5f+0.5f;
+ current_distance = start_distance + (target_distance-start_distance)*t;
+ }
+ else
+ { //small or no change, just snap to target distance
+ current_distance = target_distance;
+ }
+
+ //convert to mm
+ F32 subject_distance = current_distance*1000.f;
+ F32 fnumber = gSavedSettings.getF32("CameraFNumber");
+ F32 default_focal_length = gSavedSettings.getF32("CameraFocalLength");
+
+ F32 fov = LLViewerCamera::getInstance()->getView();
+
+ const F32 default_fov = gSavedSettings.getF32("CameraFieldOfView") * F_PI/180.f;
+ //const F32 default_aspect_ratio = gSavedSettings.getF32("CameraAspectRatio");
+
+ //F32 aspect_ratio = (F32) mScreen.getWidth()/(F32)mScreen.getHeight();
+
+ F32 dv = 2.f*default_focal_length * tanf(default_fov/2.f);
+ //F32 dh = 2.f*default_focal_length * tanf(default_fov*default_aspect_ratio/2.f);
+
+ F32 focal_length = dv/(2*tanf(fov/2.f));
+
+ //F32 tan_pixel_angle = tanf(LLDrawable::sCurPixelAngle);
+
+ // from wikipedia -- c = |s2-s1|/s2 * f^2/(N(S1-f))
+ // where N = fnumber
+ // s2 = dot distance
+ // s1 = subject distance
+ // f = focal length
+ //
+
+ F32 blur_constant = focal_length*focal_length/(fnumber*(subject_distance-focal_length));
+ blur_constant /= 1000.f; //convert to meters for shader
+ F32 magnification = focal_length/(subject_distance-focal_length);
+
+ shader->uniform1f("focal_distance", -subject_distance/1000.f);
+ shader->uniform1f("blur_constant", blur_constant);
+ shader->uniform1f("tan_pixel_angle", tanf(1.f/LLDrawable::sCurPixelAngle));
+ shader->uniform1f("magnification", magnification);
+ }
- S32 channel = gDeferredGIFinalProgram.enableTexture(LLViewerShaderMgr::DEFERRED_DIFFUSE, LLTexUnit::TT_RECT_TEXTURE);
+ S32 channel = shader->enableTexture(LLViewerShaderMgr::DEFERRED_DIFFUSE, LLTexUnit::TT_RECT_TEXTURE);
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)
+ //{
+ //gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_BILINEAR);
+ //}
gGL.begin(LLRender::TRIANGLE_STRIP);
gGL.texCoord2f(tc1.mV[0], tc1.mV[1]);
@@ -5720,11 +6459,10 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)
gGL.end();
- unbindDeferredShader(gDeferredGIFinalProgram);
+ unbindDeferredShader(*shader);
}
else
{
-
if (res_mod > 1)
{
tc2 /= (F32) res_mod;
@@ -5772,7 +6510,7 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)
gGL.getTexUnit(1)->bind(&mScreen);
gGL.getTexUnit(1)->activate();
- LLGLEnable multisample(GL_MULTISAMPLE_ARB);
+ LLGLEnable multisample(gSavedSettings.getU32("RenderFSAASamples") > 0 ? GL_MULTISAMPLE_ARB : 0);
buff->setBuffer(mask);
buff->drawArrays(LLRender::TRIANGLE_STRIP, 0, 3);
@@ -5782,16 +6520,41 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)
gGL.getTexUnit(0)->activate();
gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);
+ }
- if (LLRenderTarget::sUseFBO)
- { //copy depth buffer from mScreen to framebuffer
- LLRenderTarget::copyContentsToFramebuffer(mScreen, 0, 0, mScreen.getWidth(), mScreen.getHeight(),
- 0, 0, mScreen.getWidth(), mScreen.getHeight(), GL_DEPTH_BUFFER_BIT, GL_NEAREST);
- }
+ if (LLRenderTarget::sUseFBO)
+ { //copy depth buffer from mScreen to framebuffer
+ LLRenderTarget::copyContentsToFramebuffer(mScreen, 0, 0, mScreen.getWidth(), mScreen.getHeight(),
+ 0, 0, mScreen.getWidth(), mScreen.getHeight(), GL_DEPTH_BUFFER_BIT, GL_NEAREST);
}
-
gGL.setSceneBlendType(LLRender::BT_ALPHA);
+
+ if (hasRenderDebugMask(LLPipeline::RENDER_DEBUG_PHYSICS_SHAPES))
+ {
+ LLVector2 tc1(0,0);
+ LLVector2 tc2((F32) gViewerWindow->getWorldViewWidthRaw()*2,
+ (F32) gViewerWindow->getWorldViewHeightRaw()*2);
+
+ LLGLEnable blend(GL_BLEND);
+ gGL.color4f(1,1,1,0.75f);
+
+ gGL.getTexUnit(0)->bind(&mPhysicsDisplay);
+
+ gGL.begin(LLRender::TRIANGLE_STRIP);
+ gGL.texCoord2f(tc1.mV[0], tc1.mV[1]);
+ gGL.vertex2f(-1,-1);
+
+ gGL.texCoord2f(tc1.mV[0], tc2.mV[1]);
+ gGL.vertex2f(-1,3);
+
+ gGL.texCoord2f(tc2.mV[0], tc1.mV[1]);
+ gGL.vertex2f(3,-1);
+
+ gGL.end();
+ gGL.flush();
+ }
+
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
@@ -6174,6 +6937,7 @@ void LLPipeline::bindDeferredShader(LLGLSLShader& shader, U32 light_index, LLRen
shader.uniform2f("proj_shadow_res", mShadow[4].getWidth(), mShadow[4].getHeight());
shader.uniform1f("depth_cutoff", gSavedSettings.getF32("RenderEdgeDepthCutoff"));
shader.uniform1f("norm_cutoff", gSavedSettings.getF32("RenderEdgeNormCutoff"));
+
if (shader.getUniformLocation("norm_mat") >= 0)
{
@@ -6211,7 +6975,7 @@ void LLPipeline::renderDeferredLighting()
0, 0, mDeferredDepth.getWidth(), mDeferredDepth.getHeight(), GL_DEPTH_BUFFER_BIT, GL_NEAREST);
}
- LLGLEnable multisample(GL_MULTISAMPLE_ARB);
+ LLGLEnable multisample(gSavedSettings.getU32("RenderFSAASamples") > 0 ? GL_MULTISAMPLE_ARB : 0);
if (gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_HUD))
{
@@ -6250,16 +7014,15 @@ void LLPipeline::renderDeferredLighting()
glTexCoord4f(tc.v[0], tc.v[1], tc.v[2], 0);
}
- glPushMatrix();
- glLoadIdentity();
- glMatrixMode(GL_PROJECTION);
- glPushMatrix();
- glLoadIdentity();
-
- mDeferredLight[0].bindTarget();
+ glPushMatrix();
+ glLoadIdentity();
+ glMatrixMode(GL_PROJECTION);
+ glPushMatrix();
+ glLoadIdentity();
if (gSavedSettings.getBOOL("RenderDeferredSSAO") || gSavedSettings.getS32("RenderShadowDetail") > 0)
{
+ mDeferredLight[0].bindTarget();
{ //paint shadow/SSAO light map (direct lighting lightmap)
LLFastTimer ftm(FTM_SUN_SHADOW);
bindDeferredShader(gDeferredSunProgram, 0);
@@ -6300,16 +7063,9 @@ void LLPipeline::renderDeferredLighting()
unbindDeferredShader(gDeferredSunProgram);
}
- }
- else
- {
- glClearColor(1,1,1,1);
- mDeferredLight[0].clear(GL_COLOR_BUFFER_BIT);
- glClearColor(0,0,0,0);
- }
-
mDeferredLight[0].flush();
-
+ }
+
{ //global illumination specific block (still experimental)
if (gSavedSettings.getBOOL("RenderDeferredBlurLight") &&
gSavedSettings.getBOOL("RenderDeferredGI"))
@@ -6352,7 +7108,7 @@ void LLPipeline::renderDeferredLighting()
mLuminanceMap.flush();
gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, mLuminanceMap.getTexture(), true);
gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_TRILINEAR);
- glGenerateMipmapEXT(GL_TEXTURE_2D);
+ glGenerateMipmap(GL_TEXTURE_2D);
}
}
@@ -6415,75 +7171,74 @@ void LLPipeline::renderDeferredLighting()
}
if (gSavedSettings.getBOOL("RenderDeferredSSAO"))
- { //soften direct lighting lightmap
- LLFastTimer ftm(FTM_SOFTEN_SHADOW);
- //blur lightmap
- mDeferredLight[1].bindTarget();
+ { //soften direct lighting lightmap
+ LLFastTimer ftm(FTM_SOFTEN_SHADOW);
+ //blur lightmap
+ mDeferredLight[1].bindTarget();
- glClearColor(1,1,1,1);
- mDeferredLight[1].clear(GL_COLOR_BUFFER_BIT);
- glClearColor(0,0,0,0);
-
- bindDeferredShader(gDeferredBlurLightProgram);
+ glClearColor(1,1,1,1);
+ mDeferredLight[1].clear(GL_COLOR_BUFFER_BIT);
+ glClearColor(0,0,0,0);
+
+ bindDeferredShader(gDeferredBlurLightProgram);
- LLVector3 go = gSavedSettings.getVector3("RenderShadowGaussian");
- const U32 kern_length = 4;
- F32 blur_size = gSavedSettings.getF32("RenderShadowBlurSize");
- F32 dist_factor = gSavedSettings.getF32("RenderShadowBlurDistFactor");
+ LLVector3 go = gSavedSettings.getVector3("RenderShadowGaussian");
+ const U32 kern_length = 4;
+ F32 blur_size = gSavedSettings.getF32("RenderShadowBlurSize");
+ F32 dist_factor = gSavedSettings.getF32("RenderShadowBlurDistFactor");
- // sample symmetrically with the middle sample falling exactly on 0.0
- F32 x = 0.f;
+ // sample symmetrically with the middle sample falling exactly on 0.0
+ F32 x = 0.f;
- LLVector3 gauss[32]; // xweight, yweight, offset
+ LLVector3 gauss[32]; // xweight, yweight, offset
- for (U32 i = 0; i < kern_length; i++)
- {
- gauss[i].mV[0] = llgaussian(x, go.mV[0]);
- gauss[i].mV[1] = llgaussian(x, go.mV[1]);
- gauss[i].mV[2] = x;
- x += 1.f;
- }
+ for (U32 i = 0; i < kern_length; i++)
+ {
+ gauss[i].mV[0] = llgaussian(x, go.mV[0]);
+ gauss[i].mV[1] = llgaussian(x, go.mV[1]);
+ gauss[i].mV[2] = x;
+ x += 1.f;
+ }
- gDeferredBlurLightProgram.uniform2f("delta", 1.f, 0.f);
- gDeferredBlurLightProgram.uniform1f("dist_factor", dist_factor);
- gDeferredBlurLightProgram.uniform3fv("kern[0]", kern_length, gauss[0].mV);
- gDeferredBlurLightProgram.uniform3fv("kern", kern_length, gauss[0].mV);
- gDeferredBlurLightProgram.uniform1f("kern_scale", blur_size * (kern_length/2.f - 0.5f));
+ gDeferredBlurLightProgram.uniform2f("delta", 1.f, 0.f);
+ gDeferredBlurLightProgram.uniform1f("dist_factor", dist_factor);
+ gDeferredBlurLightProgram.uniform3fv("kern", kern_length, gauss[0].mV);
+ gDeferredBlurLightProgram.uniform1f("kern_scale", blur_size * (kern_length/2.f - 0.5f));
+
+ {
+ LLGLDisable blend(GL_BLEND);
+ LLGLDepthTest depth(GL_TRUE, GL_FALSE, GL_ALWAYS);
+ stop_glerror();
+ glDrawArrays(GL_TRIANGLE_STRIP, 0, 3);
+ stop_glerror();
+ }
- {
- LLGLDisable blend(GL_BLEND);
- LLGLDepthTest depth(GL_TRUE, GL_FALSE, GL_ALWAYS);
- stop_glerror();
- glDrawArrays(GL_TRIANGLE_STRIP, 0, 3);
- stop_glerror();
- }
-
- mDeferredLight[1].flush();
- unbindDeferredShader(gDeferredBlurLightProgram);
+ mDeferredLight[1].flush();
+ unbindDeferredShader(gDeferredBlurLightProgram);
- bindDeferredShader(gDeferredBlurLightProgram, 1);
- mDeferredLight[0].bindTarget();
+ bindDeferredShader(gDeferredBlurLightProgram, 1);
+ mDeferredLight[0].bindTarget();
- gDeferredBlurLightProgram.uniform2f("delta", 0.f, 1.f);
+ gDeferredBlurLightProgram.uniform2f("delta", 0.f, 1.f);
- {
- LLGLDisable blend(GL_BLEND);
- LLGLDepthTest depth(GL_TRUE, GL_FALSE, GL_ALWAYS);
- stop_glerror();
- glDrawArrays(GL_TRIANGLE_STRIP, 0, 3);
- stop_glerror();
- }
- mDeferredLight[0].flush();
- unbindDeferredShader(gDeferredBlurLightProgram);
+ {
+ LLGLDisable blend(GL_BLEND);
+ LLGLDepthTest depth(GL_TRUE, GL_FALSE, GL_ALWAYS);
+ stop_glerror();
+ glDrawArrays(GL_TRIANGLE_STRIP, 0, 3);
+ stop_glerror();
}
+ mDeferredLight[0].flush();
+ unbindDeferredShader(gDeferredBlurLightProgram);
+ }
- stop_glerror();
- glPopMatrix();
- stop_glerror();
- glMatrixMode(GL_MODELVIEW);
- stop_glerror();
- glPopMatrix();
- stop_glerror();
+ stop_glerror();
+ glPopMatrix();
+ stop_glerror();
+ glMatrixMode(GL_MODELVIEW);
+ stop_glerror();
+ glPopMatrix();
+ stop_glerror();
//copy depth and stencil from deferred screen
//mScreen.copyContents(mDeferredScreen, 0, 0, mDeferredScreen.getWidth(), mDeferredScreen.getHeight(),
@@ -6549,10 +7304,8 @@ void LLPipeline::renderDeferredLighting()
gPipeline.popRenderTypeMask();
}
- BOOL render_local = gSavedSettings.getBOOL("RenderDeferredLocalLights");
- BOOL render_fullscreen = gSavedSettings.getBOOL("RenderDeferredFullscreenLights");
-
-
+ BOOL render_local = gSavedSettings.getBOOL("RenderLocalLights");
+
if (LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_DEFERRED) > 2)
{
mDeferredLight[1].flush();
@@ -6560,7 +7313,7 @@ void LLPipeline::renderDeferredLighting()
mDeferredLight[2].clear(GL_COLOR_BUFFER_BIT);
}
- if (render_local || render_fullscreen)
+ if (render_local)
{
gGL.setSceneBlendType(LLRender::BT_ADD);
std::list<LLVector4> fullscreen_lights;
@@ -6574,10 +7327,11 @@ void LLPipeline::renderDeferredLighting()
std::list<LLVector4> light_colors;
+ LLVertexBuffer::unbind();
+
F32 v[24];
glVertexPointer(3, GL_FLOAT, 0, v);
- BOOL render_local = gSavedSettings.getBOOL("RenderDeferredLocalLights");
-
+
{
bindDeferredShader(gDeferredLightProgram);
LLGLDepthTest depth(GL_TRUE, GL_FALSE);
@@ -6600,8 +7354,9 @@ void LLPipeline::renderDeferredLighting()
}
- LLVector3 center = drawablep->getPositionAgent();
- F32* c = center.mV;
+ LLVector4a center;
+ center.load3(drawablep->getPositionAgent().mV);
+ const F32* c = center.getF32ptr();
F32 s = volume->getLightRadius()*1.5f;
LLColor3 col = volume->getLightColor();
@@ -6617,7 +7372,9 @@ void LLPipeline::renderDeferredLighting()
continue;
}
- if (camera->AABBInFrustumNoFarClip(center, LLVector3(s,s,s)) == 0)
+ LLVector4a sa;
+ sa.splat(s);
+ if (camera->AABBInFrustumNoFarClip(center, sa) == 0)
{
continue;
}
@@ -6661,11 +7418,11 @@ void LLPipeline::renderDeferredLighting()
glTexCoord4f(tc.v[0], tc.v[1], tc.v[2], s*s);
glColor4f(col.mV[0], col.mV[1], col.mV[2], volume->getLightFalloff()*0.5f);
glDrawRangeElements(GL_TRIANGLE_FAN, 0, 7, 8,
- GL_UNSIGNED_BYTE, get_box_fan_indices(camera, center));
+ GL_UNSIGNED_BYTE, get_box_fan_indices_ptr(camera, center));
stop_glerror();
}
}
- else if (render_fullscreen)
+ else
{
if (volume->isLightSpotlight())
{
@@ -6695,8 +7452,9 @@ void LLPipeline::renderDeferredLighting()
LLVOVolume* volume = drawablep->getVOVolume();
- LLVector3 center = drawablep->getPositionAgent();
- F32* c = center.mV;
+ LLVector4a center;
+ center.load3(drawablep->getPositionAgent().mV);
+ const F32* c = center.getF32ptr();
F32 s = volume->getLightRadius()*1.5f;
sVisibleLightCount++;
@@ -6726,7 +7484,7 @@ void LLPipeline::renderDeferredLighting()
glTexCoord4f(tc.v[0], tc.v[1], tc.v[2], s*s);
glColor4f(col.mV[0], col.mV[1], col.mV[2], volume->getLightFalloff()*0.5f);
glDrawRangeElements(GL_TRIANGLE_FAN, 0, 7, 8,
- GL_UNSIGNED_BYTE, get_box_fan_indices(camera, center));
+ GL_UNSIGNED_BYTE, get_box_fan_indices_ptr(camera, center));
}
gDeferredSpotLightProgram.disableTexture(LLViewerShaderMgr::DEFERRED_PROJECTION);
unbindDeferredShader(gDeferredSpotLightProgram);
@@ -6768,9 +7526,7 @@ void LLPipeline::renderDeferredLighting()
if (count == max_count || fullscreen_lights.empty())
{
gDeferredMultiLightProgram.uniform1i("light_count", count);
- gDeferredMultiLightProgram.uniform4fv("light[0]", count, (GLfloat*) light);
gDeferredMultiLightProgram.uniform4fv("light", count, (GLfloat*) light);
- gDeferredMultiLightProgram.uniform4fv("light_col[0]", count, (GLfloat*) col);
gDeferredMultiLightProgram.uniform4fv("light_col", count, (GLfloat*) col);
gDeferredMultiLightProgram.uniform1f("far_z", far_z);
far_z = 0.f;
@@ -7138,11 +7894,6 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)
LLCamera camera = camera_in;
camera.setFar(camera.getFar()*0.87654321f);
LLPipeline::sReflectionRender = TRUE;
- S32 occlusion = LLPipeline::sUseOcclusion;
-
- LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_WORLD;
-
- LLPipeline::sUseOcclusion = llmin(occlusion, 1);
gPipeline.pushRenderTypeMask();
@@ -7178,22 +7929,27 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)
if (!LLViewerCamera::getInstance()->cameraUnderWater())
{ //generate planar reflection map
+
+ //disable occlusion culling for reflection map for now
+ S32 occlusion = LLPipeline::sUseOcclusion;
+ LLPipeline::sUseOcclusion = 0;
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
glClearColor(0,0,0,0);
mWaterRef.bindTarget();
+ LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_WATER0;
gGL.setColorMask(true, true);
mWaterRef.clear();
gGL.setColorMask(true, false);
mWaterRef.getViewport(gGLViewport);
-
+
stop_glerror();
glPushMatrix();
mat.set_scale(glh::vec3f(1,1,-1));
mat.set_translate(glh::vec3f(0,0,height*2.f));
-
+
glh::matrix4f current = glh_get_current_modelview();
mat = current * mat;
@@ -7213,47 +7969,46 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)
glCullFace(GL_FRONT);
static LLCullResult ref_result;
-
+
if (LLDrawPoolWater::sNeedsDistortionUpdate)
{
//initial sky pass (no user clip plane)
{ //mask out everything but the sky
gPipeline.pushRenderTypeMask();
gPipeline.andRenderTypeMask(LLPipeline::RENDER_TYPE_SKY,
- LLPipeline::RENDER_TYPE_WL_SKY,
- LLPipeline::END_RENDER_TYPES);
+ LLPipeline::RENDER_TYPE_WL_SKY,
+ LLPipeline::RENDER_TYPE_CLOUDS,
+ LLPipeline::END_RENDER_TYPES);
+
static LLCullResult result;
updateCull(camera, result);
stateSort(camera, result);
- andRenderTypeMask(LLPipeline::RENDER_TYPE_SKY,
- LLPipeline::RENDER_TYPE_CLOUDS,
- LLPipeline::RENDER_TYPE_WL_SKY,
- LLPipeline::END_RENDER_TYPES);
renderGeom(camera, TRUE);
+
gPipeline.popRenderTypeMask();
}
gPipeline.pushRenderTypeMask();
clearRenderTypeMask(LLPipeline::RENDER_TYPE_WATER,
- LLPipeline::RENDER_TYPE_VOIDWATER,
- LLPipeline::RENDER_TYPE_GROUND,
- LLPipeline::RENDER_TYPE_SKY,
- LLPipeline::RENDER_TYPE_CLOUDS,
- LLPipeline::END_RENDER_TYPES);
+ LLPipeline::RENDER_TYPE_VOIDWATER,
+ LLPipeline::RENDER_TYPE_GROUND,
+ LLPipeline::RENDER_TYPE_SKY,
+ LLPipeline::RENDER_TYPE_CLOUDS,
+ LLPipeline::END_RENDER_TYPES);
- S32 detail = gSavedSettings.getS32("RenderReflectionDetail");
+ S32 detail = gSavedSettings.getS32("RenderReflectionDetail");
if (detail > 0)
{ //mask out selected geometry based on reflection detail
if (detail < 4)
{
clearRenderTypeMask(LLPipeline::RENDER_TYPE_PARTICLES, END_RENDER_TYPES);
- if (detail < 3)
- {
- clearRenderTypeMask(LLPipeline::RENDER_TYPE_AVATAR, END_RENDER_TYPES);
- if (detail < 2)
+ if (detail < 3)
{
+ clearRenderTypeMask(LLPipeline::RENDER_TYPE_AVATAR, END_RENDER_TYPES);
+ if (detail < 2)
+ {
clearRenderTypeMask(LLPipeline::RENDER_TYPE_VOLUME, END_RENDER_TYPES);
}
}
@@ -7261,19 +8016,19 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)
LLGLUserClipPlane clip_plane(plane, mat, projection);
LLGLDisable cull(GL_CULL_FACE);
- updateCull(camera, ref_result, 1);
+ updateCull(camera, ref_result, -water_clip, &plane);
stateSort(camera, ref_result);
- }
-
- if (LLDrawPoolWater::sNeedsDistortionUpdate)
- {
- if (gSavedSettings.getS32("RenderReflectionDetail") > 0)
+ }
+
+ if (LLDrawPoolWater::sNeedsDistortionUpdate)
{
- gPipeline.grabReferences(ref_result);
- LLGLUserClipPlane clip_plane(plane, mat, projection);
- renderGeom(camera);
- }
- }
+ if (gSavedSettings.getS32("RenderReflectionDetail") > 0)
+ {
+ gPipeline.grabReferences(ref_result);
+ LLGLUserClipPlane clip_plane(plane, mat, projection);
+ renderGeom(camera);
+ }
+ }
gPipeline.popRenderTypeMask();
}
@@ -7281,6 +8036,7 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)
glPopMatrix();
mWaterRef.flush();
glh_set_current_modelview(current);
+ LLPipeline::sUseOcclusion = occlusion;
}
camera.setOrigin(camera_in.getOrigin());
@@ -7311,15 +8067,18 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)
LLColor4& col = LLDrawPoolWater::sWaterFogColor;
glClearColor(col.mV[0], col.mV[1], col.mV[2], 0.f);
mWaterDis.bindTarget();
+ LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_WATER1;
mWaterDis.getViewport(gGLViewport);
if (!LLPipeline::sUnderWaterRender || LLDrawPoolWater::sNeedsReflectionUpdate)
{
//clip out geometry on the same side of water as the camera
mat = glh_get_current_modelview();
- LLGLUserClipPlane clip_plane(LLPlane(-pnorm, -(pd+pad)), mat, projection);
+ LLPlane plane(-pnorm, -(pd+pad));
+
+ LLGLUserClipPlane clip_plane(plane, mat, projection);
static LLCullResult result;
- updateCull(camera, result, water_clip);
+ updateCull(camera, result, water_clip, &plane);
stateSort(camera, result);
gGL.setColorMask(true, true);
@@ -7347,8 +8106,8 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)
gPipeline.popRenderTypeMask();
LLDrawPoolWater::sNeedsReflectionUpdate = FALSE;
LLDrawPoolWater::sNeedsDistortionUpdate = FALSE;
- LLViewerCamera::getInstance()->setUserClipPlane(LLPlane(-pnorm, -pd));
- LLPipeline::sUseOcclusion = occlusion;
+ LLPlane npnorm(-pnorm, -pd);
+ LLViewerCamera::getInstance()->setUserClipPlane(npnorm);
LLGLState::checkStates();
LLGLState::checkTextureChannels();
@@ -7358,6 +8117,8 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)
{
gAgentAvatarp->updateAttachmentVisibility(gAgentCamera.getCameraMode());
}
+
+ LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_WORLD;
}
}
@@ -7460,14 +8221,14 @@ void LLPipeline::renderShadow(glh::matrix4f& view, glh::matrix4f& proj, LLCamera
glLoadMatrixf(proj.m);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
- glLoadMatrixf(view.m);
+ glLoadMatrixd(gGLModelView);
stop_glerror();
gGLLastMatrix = NULL;
{
- LLGLDepthTest depth(GL_TRUE);
- glClear(GL_DEPTH_BUFFER_BIT);
+ //LLGLDepthTest depth(GL_TRUE);
+ //glClear(GL_DEPTH_BUFFER_BIT);
}
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
@@ -7480,6 +8241,8 @@ void LLPipeline::renderShadow(glh::matrix4f& view, glh::matrix4f& proj, LLCamera
//glCullFace(GL_FRONT);
+ LLVertexBuffer::unbind();
+
{
LLFastTimer ftm(FTM_SHADOW_SIMPLE);
LLGLDisable test(GL_ALPHA_TEST);
@@ -7547,14 +8310,13 @@ BOOL LLPipeline::getVisiblePointCloud(LLCamera& camera, LLVector3& min, LLVector
}
//get set of planes on bounding box
- std::vector<LLPlane> bp;
-
- bp.push_back(LLPlane(min, LLVector3(-1,0,0)));
- bp.push_back(LLPlane(min, LLVector3(0,-1,0)));
- bp.push_back(LLPlane(min, LLVector3(0,0,-1)));
- bp.push_back(LLPlane(max, LLVector3(1,0,0)));
- bp.push_back(LLPlane(max, LLVector3(0,1,0)));
- bp.push_back(LLPlane(max, LLVector3(0,0,1)));
+ LLPlane bp[] = {
+ LLPlane(min, LLVector3(-1,0,0)),
+ LLPlane(min, LLVector3(0,-1,0)),
+ LLPlane(min, LLVector3(0,0,-1)),
+ LLPlane(max, LLVector3(1,0,0)),
+ LLPlane(max, LLVector3(0,1,0)),
+ LLPlane(max, LLVector3(0,0,1))};
//potential points
std::vector<LLVector3> pp;
@@ -7602,7 +8364,8 @@ BOOL LLPipeline::getVisiblePointCloud(LLCamera& camera, LLVector3& min, LLVector
const LLPlane& cp = camera.getAgentPlane(j);
const LLVector3& v1 = pp[bs[i*2+0]];
const LLVector3& v2 = pp[bs[i*2+1]];
- const LLVector3 n(cp.mV);
+ LLVector3 n;
+ cp.getVector3(n);
LLVector3 line = v1-v2;
@@ -7616,8 +8379,8 @@ BOOL LLPipeline::getVisiblePointCloud(LLCamera& camera, LLVector3& min, LLVector
LLVector3 intersect = v2+line*t;
pp.push_back(intersect);
}
- }
}
+ }
//camera frustum line segments
const U32 fs[] =
@@ -7625,7 +8388,7 @@ BOOL LLPipeline::getVisiblePointCloud(LLCamera& camera, LLVector3& min, LLVector
0,1,
1,2,
2,3,
- 3,1,
+ 3,0,
4,5,
5,6,
@@ -7648,7 +8411,8 @@ BOOL LLPipeline::getVisiblePointCloud(LLCamera& camera, LLVector3& min, LLVector
const LLVector3& v1 = pp[fs[i*2+0]+8];
const LLVector3& v2 = pp[fs[i*2+1]+8];
const LLPlane& cp = bp[j];
- const LLVector3 n(cp.mV);
+ LLVector3 n;
+ cp.getVector3(n);
LLVector3 line = v1-v2;
@@ -7663,7 +8427,7 @@ BOOL LLPipeline::getVisiblePointCloud(LLCamera& camera, LLVector3& min, LLVector
pp.push_back(intersect);
}
}
- }
+ }
LLVector3 ext[] = { min-LLVector3(0.05f,0.05f,0.05f),
max+LLVector3(0.05f,0.05f,0.05f) };
@@ -8027,6 +8791,14 @@ void LLPipeline::generateSunShadow(LLCamera& camera)
LLVector3 n = gSavedSettings.getVector3("RenderShadowNearDist");
//F32 nearDist[] = { n.mV[0], n.mV[1], n.mV[2], n.mV[2] };
+ //put together a universal "near clip" plane for shadow frusta
+ LLPlane shadow_near_clip;
+ {
+ LLVector3 p = gAgent.getPositionAgent();
+ p += mSunDir * gSavedSettings.getF32("RenderFarClip")*2.f;
+ shadow_near_clip.setVec(p, mSunDir);
+ }
+
LLVector3 lightDir = -mSunDir;
lightDir.normVec();
@@ -8101,7 +8873,7 @@ void LLPipeline::generateSunShadow(LLCamera& camera)
near_clip = -max.mV[2];
F32 far_clip = -min.mV[2]*2.f;
- far_clip = llmin(far_clip, 128.f);
+ //far_clip = llmin(far_clip, 128.f);
far_clip = llmin(far_clip, camera.getFar());
F32 range = far_clip-near_clip;
@@ -8391,11 +9163,6 @@ void LLPipeline::generateSunShadow(LLCamera& camera)
fovx = acos(fovx);
fovz = acos(fovz);
- if (fovx > cutoff || llround(fovz, 0.01f) > cutoff)
- {
- // llerrs << "WTF?" << llendl;
- }
-
mShadowFOV.mV[j] = cutoff;
}
@@ -8451,7 +9218,7 @@ void LLPipeline::generateSunShadow(LLCamera& camera)
}
}
- shadow_cam.setFar(128.f);
+ //shadow_cam.setFar(128.f);
shadow_cam.setOriginAndLookAt(eye, up, center);
shadow_cam.setOrigin(0,0,0);
@@ -8461,7 +9228,8 @@ void LLPipeline::generateSunShadow(LLCamera& camera)
LLViewerCamera::updateFrustumPlanes(shadow_cam, FALSE, FALSE, TRUE);
- shadow_cam.ignoreAgentFrustumPlane(LLCamera::AGENT_PLANE_NEAR);
+ //shadow_cam.ignoreAgentFrustumPlane(LLCamera::AGENT_PLANE_NEAR);
+ shadow_cam.getAgentPlane(LLCamera::AGENT_PLANE_NEAR).set(shadow_near_clip);
//translate and scale to from [-1, 1] to [0, 1]
glh::matrix4f trans(0.5f, 0.f, 0.f, 0.5f,
@@ -8488,7 +9256,8 @@ void LLPipeline::generateSunShadow(LLCamera& camera)
mShadow[j].bindTarget();
mShadow[j].getViewport(gGLViewport);
-
+ mShadow[j].clear();
+
{
static LLCullResult result[4];
@@ -8507,152 +9276,138 @@ void LLPipeline::generateSunShadow(LLCamera& camera)
//hack to disable projector shadows
- static bool clear = true;
bool gen_shadow = gSavedSettings.getS32("RenderShadowDetail") > 1;
if (gen_shadow)
{
- clear = true;
- F32 fade_amt = gFrameIntervalSeconds * llmax(LLViewerCamera::getInstance()->getVelocityStat()->getCurrentPerSec(), 1.f);
-
- //update shadow targets
- for (U32 i = 0; i < 2; i++)
- { //for each current shadow
- LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_SHADOW4+i;
+ F32 fade_amt = gFrameIntervalSeconds * llmax(LLViewerCamera::getInstance()->getVelocityStat()->getCurrentPerSec(), 1.f);
- if (mShadowSpotLight[i].notNull() &&
- (mShadowSpotLight[i] == mTargetShadowSpotLight[0] ||
- mShadowSpotLight[i] == mTargetShadowSpotLight[1]))
- { //keep this spotlight
- mSpotLightFade[i] = llmin(mSpotLightFade[i]+fade_amt, 1.f);
- }
- else
- { //fade out this light
- mSpotLightFade[i] = llmax(mSpotLightFade[i]-fade_amt, 0.f);
-
- if (mSpotLightFade[i] == 0.f || mShadowSpotLight[i].isNull())
- { //faded out, grab one of the pending spots (whichever one isn't already taken)
- if (mTargetShadowSpotLight[0] != mShadowSpotLight[(i+1)%2])
- {
- mShadowSpotLight[i] = mTargetShadowSpotLight[0];
- }
- else
- {
- mShadowSpotLight[i] = mTargetShadowSpotLight[1];
+ //update shadow targets
+ for (U32 i = 0; i < 2; i++)
+ { //for each current shadow
+ LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_SHADOW4+i;
+
+ if (mShadowSpotLight[i].notNull() &&
+ (mShadowSpotLight[i] == mTargetShadowSpotLight[0] ||
+ mShadowSpotLight[i] == mTargetShadowSpotLight[1]))
+ { //keep this spotlight
+ mSpotLightFade[i] = llmin(mSpotLightFade[i]+fade_amt, 1.f);
+ }
+ else
+ { //fade out this light
+ mSpotLightFade[i] = llmax(mSpotLightFade[i]-fade_amt, 0.f);
+
+ if (mSpotLightFade[i] == 0.f || mShadowSpotLight[i].isNull())
+ { //faded out, grab one of the pending spots (whichever one isn't already taken)
+ if (mTargetShadowSpotLight[0] != mShadowSpotLight[(i+1)%2])
+ {
+ mShadowSpotLight[i] = mTargetShadowSpotLight[0];
+ }
+ else
+ {
+ mShadowSpotLight[i] = mTargetShadowSpotLight[1];
+ }
}
}
}
- }
-
- for (S32 i = 0; i < 2; i++)
- {
- glh_set_current_modelview(saved_view);
- glh_set_current_projection(saved_proj);
- if (mShadowSpotLight[i].isNull())
+ for (S32 i = 0; i < 2; i++)
{
- continue;
- }
+ glh_set_current_modelview(saved_view);
+ glh_set_current_projection(saved_proj);
- LLVOVolume* volume = mShadowSpotLight[i]->getVOVolume();
+ if (mShadowSpotLight[i].isNull())
+ {
+ continue;
+ }
- if (!volume)
- {
- mShadowSpotLight[i] = NULL;
- continue;
- }
+ LLVOVolume* volume = mShadowSpotLight[i]->getVOVolume();
- LLDrawable* drawable = mShadowSpotLight[i];
+ if (!volume)
+ {
+ mShadowSpotLight[i] = NULL;
+ continue;
+ }
- LLVector3 params = volume->getSpotLightParams();
- F32 fov = params.mV[0];
+ LLDrawable* drawable = mShadowSpotLight[i];
- //get agent->light space matrix (modelview)
- LLVector3 center = drawable->getPositionAgent();
- LLQuaternion quat = volume->getRenderRotation();
+ LLVector3 params = volume->getSpotLightParams();
+ F32 fov = params.mV[0];
- //get near clip plane
- LLVector3 scale = volume->getScale();
- LLVector3 at_axis(0,0,-scale.mV[2]*0.5f);
- at_axis *= quat;
+ //get agent->light space matrix (modelview)
+ LLVector3 center = drawable->getPositionAgent();
+ LLQuaternion quat = volume->getRenderRotation();
- LLVector3 np = center+at_axis;
- at_axis.normVec();
+ //get near clip plane
+ LLVector3 scale = volume->getScale();
+ LLVector3 at_axis(0,0,-scale.mV[2]*0.5f);
+ at_axis *= quat;
- //get origin that has given fov for plane np, at_axis, and given scale
- F32 dist = (scale.mV[1]*0.5f)/tanf(fov*0.5f);
+ LLVector3 np = center+at_axis;
+ at_axis.normVec();
- LLVector3 origin = np - at_axis*dist;
+ //get origin that has given fov for plane np, at_axis, and given scale
+ F32 dist = (scale.mV[1]*0.5f)/tanf(fov*0.5f);
- LLMatrix4 mat(quat, LLVector4(origin, 1.f));
+ LLVector3 origin = np - at_axis*dist;
- view[i+4] = glh::matrix4f((F32*) mat.mMatrix);
+ LLMatrix4 mat(quat, LLVector4(origin, 1.f));
- view[i+4] = view[i+4].inverse();
+ view[i+4] = glh::matrix4f((F32*) mat.mMatrix);
- //get perspective matrix
- F32 near_clip = dist+0.01f;
- F32 width = scale.mV[VX];
- F32 height = scale.mV[VY];
- F32 far_clip = dist+volume->getLightRadius()*1.5f;
+ view[i+4] = view[i+4].inverse();
- F32 fovy = fov * RAD_TO_DEG;
- F32 aspect = width/height;
-
- proj[i+4] = gl_perspective(fovy, aspect, near_clip, far_clip);
+ //get perspective matrix
+ F32 near_clip = dist+0.01f;
+ F32 width = scale.mV[VX];
+ F32 height = scale.mV[VY];
+ F32 far_clip = dist+volume->getLightRadius()*1.5f;
- //translate and scale to from [-1, 1] to [0, 1]
- glh::matrix4f trans(0.5f, 0.f, 0.f, 0.5f,
- 0.f, 0.5f, 0.f, 0.5f,
- 0.f, 0.f, 0.5f, 0.5f,
- 0.f, 0.f, 0.f, 1.f);
+ F32 fovy = fov * RAD_TO_DEG;
+ F32 aspect = width/height;
+
+ proj[i+4] = gl_perspective(fovy, aspect, near_clip, far_clip);
- glh_set_current_modelview(view[i+4]);
- glh_set_current_projection(proj[i+4]);
+ //translate and scale to from [-1, 1] to [0, 1]
+ glh::matrix4f trans(0.5f, 0.f, 0.f, 0.5f,
+ 0.f, 0.5f, 0.f, 0.5f,
+ 0.f, 0.f, 0.5f, 0.5f,
+ 0.f, 0.f, 0.f, 1.f);
- mSunShadowMatrix[i+4] = trans*proj[i+4]*view[i+4]*inv_view;
-
- for (U32 j = 0; j < 16; j++)
- {
- gGLLastModelView[j] = mShadowModelview[i+4].m[j];
- gGLLastProjection[j] = mShadowProjection[i+4].m[j];
- }
+ glh_set_current_modelview(view[i+4]);
+ glh_set_current_projection(proj[i+4]);
- mShadowModelview[i+4] = view[i+4];
- mShadowProjection[i+4] = proj[i+4];
+ mSunShadowMatrix[i+4] = trans*proj[i+4]*view[i+4]*inv_view;
+
+ for (U32 j = 0; j < 16; j++)
+ {
+ gGLLastModelView[j] = mShadowModelview[i+4].m[j];
+ gGLLastProjection[j] = mShadowProjection[i+4].m[j];
+ }
- LLCamera shadow_cam = camera;
- shadow_cam.setFar(far_clip);
- shadow_cam.setOrigin(origin);
+ mShadowModelview[i+4] = view[i+4];
+ mShadowProjection[i+4] = proj[i+4];
- LLViewerCamera::updateFrustumPlanes(shadow_cam, FALSE, FALSE, TRUE);
+ LLCamera shadow_cam = camera;
+ shadow_cam.setFar(far_clip);
+ shadow_cam.setOrigin(origin);
- stop_glerror();
+ LLViewerCamera::updateFrustumPlanes(shadow_cam, FALSE, FALSE, TRUE);
- mShadow[i+4].bindTarget();
- mShadow[i+4].getViewport(gGLViewport);
+ stop_glerror();
- static LLCullResult result[2];
+ mShadow[i+4].bindTarget();
+ mShadow[i+4].getViewport(gGLViewport);
+ mShadow[i+4].clear();
- LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_SHADOW0+i+4;
+ static LLCullResult result[2];
- renderShadow(view[i+4], proj[i+4], shadow_cam, result[i], FALSE, FALSE);
+ LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_SHADOW0+i+4;
- mShadow[i+4].flush();
- }
- }
- else
- {
- if (clear)
- {
- clear = false;
- for (U32 i = 4; i < 6; i++)
- {
- mShadow[i].bindTarget();
- mShadow[i].clear();
- mShadow[i].flush();
- }
- }
+ renderShadow(view[i+4], proj[i+4], shadow_cam, result[i], FALSE, FALSE);
+
+ mShadow[i+4].flush();
+ }
}
if (!gSavedSettings.getBOOL("CameraOffset"))
@@ -8772,7 +9527,7 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar)
stateSort(*LLViewerCamera::getInstance(), result);
- const LLVector3* ext = avatar->mDrawable->getSpatialExtents();
+ const LLVector4a* ext = avatar->mDrawable->getSpatialExtents();
LLVector3 pos(avatar->getRenderPosition()+avatar->getImpostorOffset());
LLCamera camera = *viewer_camera;
@@ -8781,25 +9536,30 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar)
LLVector2 tdim;
- LLVector3 half_height = (ext[1]-ext[0])*0.5f;
- LLVector3 left = camera.getLeftAxis();
- left *= left;
- left.normalize();
+ LLVector4a half_height;
+ half_height.setSub(ext[1], ext[0]);
+ half_height.mul(0.5f);
+
+ LLVector4a left;
+ left.load3(camera.getLeftAxis().mV);
+ left.mul(left);
+ left.normalize3fast();
- LLVector3 up = camera.getUpAxis();
- up *= up;
- up.normalize();
+ LLVector4a up;
+ up.load3(camera.getUpAxis().mV);
+ up.mul(up);
+ up.normalize3fast();
- tdim.mV[0] = fabsf(half_height * left);
- tdim.mV[1] = fabsf(half_height * up);
+ tdim.mV[0] = fabsf(half_height.dot3(left).getF32());
+ tdim.mV[1] = fabsf(half_height.dot3(up).getF32());
glMatrixMode(GL_PROJECTION);
glPushMatrix();
- //glh::matrix4f ortho = gl_ortho(-tdim.mV[0], tdim.mV[0], -tdim.mV[1], tdim.mV[1], 1.0, 256.0);
+
F32 distance = (pos-camera.getOrigin()).length();
F32 fov = atanf(tdim.mV[1]/distance)*2.f*RAD_TO_DEG;
- F32 aspect = tdim.mV[0]/tdim.mV[1]; //128.f/256.f;
+ F32 aspect = tdim.mV[0]/tdim.mV[1];
glh::matrix4f persp = gl_perspective(fov, aspect, 1.f, 256.f);
glh_set_current_projection(persp);
glLoadMatrixf(persp.m);
@@ -8816,9 +9576,7 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar)
glClearColor(0.0f,0.0f,0.0f,0.0f);
gGL.setColorMask(true, true);
- glStencilMask(0xFFFFFFFF);
- glClearStencil(0);
-
+
// get the number of pixels per angle
F32 pa = gViewerWindow->getWindowHeightRaw() / (RAD_TO_DEG * viewer_camera->getView());
@@ -8829,7 +9587,7 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar)
if (!avatar->mImpostor.isComplete() || resX != avatar->mImpostor.getWidth() ||
resY != avatar->mImpostor.getHeight())
{
- avatar->mImpostor.allocate(resX,resY,GL_RGBA,TRUE,TRUE);
+ avatar->mImpostor.allocate(resX,resY,GL_RGBA,TRUE,FALSE);
if (LLPipeline::sRenderDeferred)
{
@@ -8841,43 +9599,30 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar)
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
}
- LLGLEnable stencil(GL_STENCIL_TEST);
- glStencilMask(0xFFFFFFFF);
- glStencilFunc(GL_ALWAYS, 1, 0xFFFFFFFF);
- glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
+ avatar->mImpostor.bindTarget();
- {
- LLGLEnable scissor(GL_SCISSOR_TEST);
- glScissor(0, 0, resX, resY);
- avatar->mImpostor.bindTarget();
- avatar->mImpostor.clear();
- }
-
if (LLPipeline::sRenderDeferred)
{
- stop_glerror();
+ avatar->mImpostor.clear();
renderGeomDeferred(camera);
renderGeomPostDeferred(camera);
}
else
{
+ LLGLEnable scissor(GL_SCISSOR_TEST);
+ glScissor(0, 0, resX, resY);
+ avatar->mImpostor.clear();
renderGeom(camera);
}
- glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
- glStencilFunc(GL_EQUAL, 1, 0xFFFFFF);
-
- { //create alpha mask based on stencil buffer (grey out if muted)
- LLVector3 left = camera.getLeftAxis()*tdim.mV[0]*2.f;
- LLVector3 up = camera.getUpAxis()*tdim.mV[1]*2.f;
-
+ { //create alpha mask based on depth buffer (grey out if muted)
if (LLPipeline::sRenderDeferred)
{
- GLuint buff = GL_COLOR_ATTACHMENT0_EXT;
+ GLuint buff = GL_COLOR_ATTACHMENT0;
glDrawBuffersARB(1, &buff);
}
- LLGLEnable blend(muted ? 0 : GL_BLEND);
+ LLGLDisable blend(GL_BLEND);
if (muted)
{
@@ -8888,25 +9633,34 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar)
gGL.setColorMask(false, true);
}
- gGL.setSceneBlendType(LLRender::BT_ADD);
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
- LLGLDepthTest depth(GL_FALSE, GL_FALSE);
+ LLGLDepthTest depth(GL_TRUE, GL_FALSE, GL_GREATER);
+
+ gGL.flush();
+
+ glPushMatrix();
+ glLoadIdentity();
+ glMatrixMode(GL_PROJECTION);
+ glPushMatrix();
+ glLoadIdentity();
+
+ static const F32 clip_plane = 0.99999f;
- gGL.color4f(1,1,1,1);
gGL.color4ub(64,64,64,255);
gGL.begin(LLRender::QUADS);
- gGL.vertex3fv((pos+left-up).mV);
- gGL.vertex3fv((pos-left-up).mV);
- gGL.vertex3fv((pos-left+up).mV);
- gGL.vertex3fv((pos+left+up).mV);
+ gGL.vertex3f(-1, -1, clip_plane);
+ gGL.vertex3f(1, -1, clip_plane);
+ gGL.vertex3f(1, 1, clip_plane);
+ gGL.vertex3f(-1, 1, clip_plane);
gGL.end();
gGL.flush();
- gGL.setSceneBlendType(LLRender::BT_ALPHA);
+ glPopMatrix();
+ glMatrixMode(GL_MODELVIEW);
+ glPopMatrix();
}
-
avatar->mImpostor.flush();
avatar->setImpostorDim(tdim);
diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h
index 92ae40ebb0..e9a250cd6d 100644
--- a/indra/newview/pipeline.h
+++ b/indra/newview/pipeline.h
@@ -42,6 +42,10 @@
#include <stack>
+#include <stack>
+
+#include <stack>
+
class LLViewerTexture;
class LLEdge;
class LLFace;
@@ -54,6 +58,9 @@ class LLCubeMap;
class LLCullResult;
class LLVOAvatar;
class LLGLSLShader;
+class LLCurlRequest;
+
+class LLMeshResponder;
typedef enum e_avatar_skinning_method
{
@@ -107,11 +114,11 @@ public:
void resizeScreenTexture();
void releaseGLBuffers();
void createGLBuffers();
- void allocateScreenBuffer(U32 resX, U32 resY);
+ void allocateScreenBuffer(U32 resX, U32 resY);
+ void allocatePhysicsBuffer();
+
void resetVertexBuffers(LLDrawable* drawable);
- void setUseVBO(BOOL use_vbo);
- void setDisableVBOMapping(BOOL no_vbo_mapping);
void generateImpostor(LLVOAvatar* avatar);
void bindScreenToTexture();
void renderBloom(BOOL for_snapshot, F32 zoom_factor = 1.f, int subfield = 0);
@@ -201,7 +208,7 @@ public:
BOOL visibleObjectsInFrustum(LLCamera& camera);
BOOL getVisibleExtents(LLCamera& camera, LLVector3 &min, LLVector3& max);
BOOL getVisiblePointCloud(LLCamera& camera, LLVector3 &min, LLVector3& max, std::vector<LLVector3>& fp, LLVector3 light_dir = LLVector3(0,0,0));
- void updateCull(LLCamera& camera, LLCullResult& result, S32 water_clip = 0); //if water_clip is 0, ignore water plane, 1, cull to above plane, -1, cull to below plane
+ 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 updateGeom(F32 max_dtime);
@@ -211,6 +218,7 @@ public:
//calculate pixel area of given box from vantage point of given camera
static F32 calcPixelArea(LLVector3 center, LLVector3 size, LLCamera& camera);
+ static F32 calcPixelArea(const LLVector4a& center, const LLVector4a& size, LLCamera &camera);
void stateSort(LLCamera& camera, LLCullResult& result);
void stateSort(LLSpatialGroup* group, LLCamera& camera);
@@ -223,6 +231,14 @@ public:
void renderGroups(LLRenderPass* pass, U32 type, U32 mask, BOOL texture);
void grabReferences(LLCullResult& result);
+ void clearReferences();
+
+ //check references will assert that there are no references in sCullResult to the provided data
+ void checkReferences(LLFace* face);
+ void checkReferences(LLDrawable* drawable);
+ void checkReferences(LLDrawInfo* draw_info);
+ void checkReferences(LLSpatialGroup* group);
+
void renderGeom(LLCamera& camera, BOOL forceVBOUpdate = FALSE);
void renderGeomDeferred(LLCamera& camera);
@@ -245,6 +261,7 @@ public:
void generateGI(LLCamera& camera, LLVector3& lightDir, std::vector<LLVector3>& vpc);
void renderHighlights();
void renderDebug();
+ void renderPhysicsDisplay();
void rebuildPools(); // Rebuild pools
@@ -260,6 +277,7 @@ public:
void enableLightsStatic();
void enableLightsDynamic();
void enableLightsAvatar();
+ void enableLightsPreview();
void enableLightsAvatarEdit(const LLColor4& color);
void enableLightsFullbright(const LLColor4& color);
void disableLights();
@@ -303,6 +321,7 @@ public:
static BOOL toggleRenderTypeControlNegated(void* data);
static BOOL toggleRenderDebugControl(void* data);
static BOOL toggleRenderDebugFeatureControl(void* data);
+ static void setRenderDebugFeatureControl(U32 bit, bool value);
static void setRenderParticleBeacons(BOOL val);
static void toggleRenderParticleBeacons(void* data);
@@ -337,6 +356,7 @@ public:
static BOOL getRenderHighlights(void* data);
static void updateRenderDeferred();
+ static void refreshRenderDeferred();
private:
void unloadShaders();
@@ -430,6 +450,9 @@ public:
RENDER_DEBUG_BUILD_QUEUE = 0x0200000,
RENDER_DEBUG_AGENT_TARGET = 0x0400000,
RENDER_DEBUG_UPDATE_TYPE = 0x0800000,
+ RENDER_DEBUG_PHYSICS_SHAPES = 0x1000000,
+ RENDER_DEBUG_NORMALS = 0x2000000,
+ RENDER_DEBUG_LOD_INFO = 0x4000000,
};
public:
@@ -452,6 +475,10 @@ public:
S32 mNumVisibleNodes;
S32 mVerticesRelit;
+ S32 mDebugTextureUploadCost;
+ S32 mDebugSculptUploadCost;
+ S32 mDebugMeshUploadCost;
+
S32 mLightingChanges;
S32 mGeometryChanges;
@@ -467,6 +494,8 @@ public:
static BOOL sAutoMaskAlphaNonDeferred;
static BOOL sDisableShaders; // if TRUE, rendering will be done without shaders
static BOOL sRenderBump;
+ static BOOL sBakeSunlight;
+ static BOOL sNoAlpha;
static BOOL sUseTriStrips;
static BOOL sUseFarClip;
static BOOL sShadowRender;
@@ -482,7 +511,6 @@ public:
static BOOL sRenderAttachedLights;
static BOOL sRenderAttachedParticles;
static BOOL sRenderDeferred;
- static BOOL sAllowRebuildPriorityGroup;
static S32 sVisibleLightCount;
static F32 sMinRenderSize;
@@ -501,6 +529,7 @@ public:
LLRenderTarget mGIMapPost[2];
LLRenderTarget mLuminanceMap;
LLRenderTarget mHighlight;
+ LLRenderTarget mPhysicsDisplay;
//sun shadow map
LLRenderTarget mShadow[6];
@@ -608,6 +637,8 @@ protected:
LLDrawable::drawable_list_t mBuildQ2; // non-priority
LLSpatialGroup::sg_vector_t mGroupQ1; //priority
LLSpatialGroup::sg_vector_t mGroupQ2; // non-priority
+ bool mGroupQ2Locked;
+ bool mGroupQ1Locked;
LLViewerObject::vobj_list_t mCreateQ;
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..38d04b4b5c 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
diff --git a/indra/newview/skins/default/colors.xml b/indra/newview/skins/default/colors.xml
index 72a4dd7f63..973df6998a 100644
--- a/indra/newview/skins/default/colors.xml
+++ b/indra/newview/skins/default/colors.xml
@@ -760,4 +760,32 @@
<color
name="MenuBarProjectBgColor"
reference="MdBlue" />
+
+ <color
+ name="MeshImportTableNormalColor"
+ value="1 1 1 1"/>
+ <color
+ name="MeshImportTableHighlightColor"
+ value="0.2 0.8 1 1"/>
+
+ <color
+ name="DirectChatColor"
+ reference="LtOrange" />
+
+ <!-- Generic color names (legacy) -->
+ <color
+ name="white"
+ value="1 1 1 1"/>
+ <color
+ name="black"
+ value="0 0 0 1"/>
+ <color
+ name="red"
+ value="1 0 0 1"/>
+ <color
+ name="green"
+ value="0 1 0 1"/>
+ <color
+ name="blue"
+ value="0 0 1 1"/>
</colors>
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_Mesh.png b/indra/newview/skins/default/textures/icons/Inv_Mesh.png
new file mode 100644
index 0000000000..f1f21f7941
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Inv_Mesh.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/check_mark.png b/indra/newview/skins/default/textures/icons/check_mark.png
new file mode 100644
index 0000000000..2c05297f4f
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/check_mark.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/model_wizard/divider_line.png b/indra/newview/skins/default/textures/model_wizard/divider_line.png
new file mode 100644
index 0000000000..76c9e68767
--- /dev/null
+++ b/indra/newview/skins/default/textures/model_wizard/divider_line.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/model_wizard/progress_bar_bg.png b/indra/newview/skins/default/textures/model_wizard/progress_bar_bg.png
new file mode 100644
index 0000000000..d0b213cdc5
--- /dev/null
+++ b/indra/newview/skins/default/textures/model_wizard/progress_bar_bg.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/model_wizard/progress_light.png b/indra/newview/skins/default/textures/model_wizard/progress_light.png
new file mode 100644
index 0000000000..019344f812
--- /dev/null
+++ b/indra/newview/skins/default/textures/model_wizard/progress_light.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index 1ca48b01a8..cc7cce99c9 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -73,7 +73,22 @@ with the same filename but different name
<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="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"/>
+ <texture name="BreadCrumbBtn_Left_Press" file_name="widgets/BreadCrumbBtn_Left_Press.png" preload="false"/>
+
+ <texture name="BreadCrumbBtn_Middle_Disabled" file_name="widgets/BreadCrumbBtn_Middle_Disabled.png" preload="false"/>
+ <texture name="BreadCrumbBtn_Middle_Off" file_name="widgets/BreadCrumbBtn_Middle_Off.png" preload="false"/>
+ <texture name="BreadCrumbBtn_Middle_Over" file_name="widgets/BreadCrumbBtn_Middle_Over.png" preload="false"/>
+ <texture name="BreadCrumbBtn_Middle_Press" file_name="widgets/BreadCrumbBtn_Middle_Press.png" preload="false"/>
+
+ <texture name="BreadCrumbBtn_Right_Disabled" file_name="widgets/BreadCrumbBtn_Right_Disabled.png" preload="false"/>
+ <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" />
@@ -102,6 +117,7 @@ with the same filename but different name
<texture name="Checkbox_On" file_name="widgets/Checkbox_On.png" preload="true" />
<texture name="Checkbox_On_Press" file_name="widgets/Checkbox_On_Press.png" preload="true" />
<texture name="Checkbox_Press" file_name="widgets/Checkbox_Press.png" preload="true" />
+ <texture name="Check_Mark" file_name="icons/check_mark" preload="true" />
<texture name="ComboButton_Disabled" file_name="widgets/ComboButton_Disabled.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
<texture name="ComboButton_Selected" file_name="widgets/ComboButton_Selected.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
@@ -211,6 +227,7 @@ with the same filename but different name
<texture name="Inv_LostClosed" file_name="icons/Inv_LostClosed.png" preload="false" />
<texture name="Inv_LostOpen" file_name="icons/Inv_LostOpen.png" preload="false" />
<texture name="Inv_Landmark" file_name="icons/Inv_Landmark.png" preload="false" />
+ <texture name="Inv_Mesh" file_name="icons/Inv_Mesh.png" preload="false" />
<texture name="Inv_Notecard" file_name="icons/Inv_Notecard.png" preload="false" />
<texture name="Inv_Object" file_name="icons/Inv_Object.png" preload="false" />
<texture name="Inv_Object_Multi" file_name="icons/Inv_Object_Multi.png" preload="false" />
@@ -258,6 +275,10 @@ with the same filename but different name
<texture name="menu_separator" file_name="navbar/FileMenu_Divider.png" scale.left="4" scale.top="166" scale.right="0" scale.bottom="0" />
+ <texture name="ModelImport_Status_Good" file_name="lag_status_good.tga" preload="false"/>
+ <texture name="ModelImport_Status_Warning" file_name="lag_status_warning.tga" preload="false"/>
+ <texture name="ModelImport_Status_Error" file_name="lag_status_critical.tga" preload="false"/>
+
<texture name="MouseLook_View_Off" file_name="bottomtray/MouseLook_view_off.png" preload="false" />
<texture name="MouseLook_View_On" file_name="bottomtray/MouseLook_view_on.png" preload="false" />
@@ -626,6 +647,8 @@ with the same filename but different name
<texture name="icon_for_sale.tga" file_name="icons/Icon_For_Sale.png" />
<texture name="icon_top_pick.tga" />
+ <texture name="inv_folder_mesh.tga"/>
+ <texture name="inv_item_mesh.tga"/>
<texture name="lag_status_critical.tga" />
<texture name="lag_status_good.tga" />
<texture name="lag_status_warning.tga" />
diff --git a/indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Left_Disabled.png b/indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Left_Disabled.png
new file mode 100644
index 0000000000..c7c0eaa96b
--- /dev/null
+++ b/indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Left_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Left_Off.png b/indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Left_Off.png
new file mode 100644
index 0000000000..4a73c254fc
--- /dev/null
+++ b/indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Left_Off.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Left_Over.png b/indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Left_Over.png
new file mode 100644
index 0000000000..6fb5c432de
--- /dev/null
+++ b/indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Left_Over.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Left_Press.png b/indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Left_Press.png
new file mode 100644
index 0000000000..fa18517933
--- /dev/null
+++ b/indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Left_Press.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Middle_Disabled.png b/indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Middle_Disabled.png
new file mode 100644
index 0000000000..bed1a701bd
--- /dev/null
+++ b/indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Middle_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Middle_Off.png b/indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Middle_Off.png
new file mode 100644
index 0000000000..57ce9af574
--- /dev/null
+++ b/indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Middle_Off.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Middle_Over.png b/indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Middle_Over.png
new file mode 100644
index 0000000000..2c43022f0e
--- /dev/null
+++ b/indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Middle_Over.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Middle_Press.png b/indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Middle_Press.png
new file mode 100644
index 0000000000..6b8c1baca4
--- /dev/null
+++ b/indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Middle_Press.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Right_Disabled.png b/indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Right_Disabled.png
new file mode 100644
index 0000000000..51505e80c5
--- /dev/null
+++ b/indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Right_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Right_Off.png b/indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Right_Off.png
new file mode 100644
index 0000000000..9f93efbd93
--- /dev/null
+++ b/indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Right_Off.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Right_Over.png b/indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Right_Over.png
new file mode 100644
index 0000000000..3a4ec1a315
--- /dev/null
+++ b/indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Right_Over.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Right_Press.png b/indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Right_Press.png
new file mode 100644
index 0000000000..1f1b4c2ed5
--- /dev/null
+++ b/indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Right_Press.png
Binary files differ
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_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_env_settings.xml b/indra/newview/skins/default/xui/da/floater_env_settings.xml
index 8d9c05500b..a6fbc05734 100644
--- a/indra/newview/skins/default/xui/da/floater_env_settings.xml
+++ b/indra/newview/skins/default/xui/da/floater_env_settings.xml
@@ -4,7 +4,8 @@
[hour12,datetime,utc]:[min,datetime,utc] [ampm,datetime,utc]
</floater.string>
<text name="EnvTimeText">
- Tid på dagen
+ Tid på
+dagen
</text>
<text name="EnvTimeText2">
00:00
@@ -15,11 +16,13 @@
</text>
<slider label="" name="EnvCloudSlider"/>
<text name="EnvWaterColorText">
- Farve på vand
+ Farve på
+vand
</text>
<color_swatch label="" name="EnvWaterColor" tool_tip="Klik for at åbne farvevælger"/>
<text name="EnvWaterFogText">
- Tåge på vand
+ Tåge på
+vand
</text>
<slider label="" name="EnvWaterFogSlider"/>
<button label="Benyt tid fra estate" name="EnvUseEstateTimeButton"/>
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_tools.xml b/indra/newview/skins/default/xui/da/floater_tools.xml
index 9e673d0d5b..8264e366c0 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>
diff --git a/indra/newview/skins/default/xui/da/floater_tos.xml b/indra/newview/skins/default/xui/da/floater_tos.xml
index 760f60c996..af9ee0bd06 100644
--- a/indra/newview/skins/default/xui/da/floater_tos.xml
+++ b/indra/newview/skins/default/xui/da/floater_tos.xml
@@ -4,7 +4,7 @@
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
+ data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Henter %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="Fortsæt" label_selected="Fortsæt" name="Continue"/>
<button label="Annullér" label_selected="Annullér" name="Cancel"/>
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..0080f7a59e 100644
--- a/indra/newview/skins/default/xui/da/menu_avatar_self.xml
+++ b/indra/newview/skins/default/xui/da/menu_avatar_self.xml
@@ -21,7 +21,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..9ac296904a 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="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="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_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_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_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..f59a0622be 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">
@@ -222,7 +223,9 @@
<menu label="Vis info" name="Display Info">
<menu_item_check label="Vis tid" name="Show Time"/>
<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 +243,9 @@
<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="Opdatér type" name="Update Type"/>
+ </menu>
<menu label="Gengivelse" name="Rendering">
<menu_item_check label="Akser" name="Axes"/>
<menu_item_check label="Wireframe" name="Wireframe"/>
diff --git a/indra/newview/skins/default/xui/da/notifications.xml b/indra/newview/skins/default/xui/da/notifications.xml
index a3c4897ee1..0d2aaf45ce 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?
@@ -748,6 +741,7 @@ Prøv venligst igen senere.
[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]
@@ -1663,7 +1657,7 @@ Knappen vil blive vist når der er nok plads til den.
&lt;nolink&gt;[ITEMS]&lt;/nolink&gt;
-Med følgende beboere:
+Me følgende beboere:
[RESIDENTS]
<usetemplate name="okcancelbuttons" notext="Annullér" yestext="Ok"/>
@@ -1755,9 +1749,6 @@ Sluk for alles lyd?
<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>
@@ -1795,6 +1786,38 @@ 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="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.
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..925492b2d7 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">
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..0626976cb5 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 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_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/strings.xml b/indra/newview/skins/default/xui/da/strings.xml
index aa02fc14e5..afc826d6d7 100644
--- a/indra/newview/skins/default/xui/da/strings.xml
+++ b/indra/newview/skins/default/xui/da/strings.xml
@@ -1037,7 +1037,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 : "/>
@@ -1455,7 +1455,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 +1819,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 +1936,9 @@ Forventet .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
<string name="Other">
Andet
</string>
+ <string name="Rental">
+ Leje
+ </string>
<string name="Any">
Enhver
</string>
@@ -3861,7 +3858,7 @@ Krænkelsesanmeldelse
<string name="Notices">
Beskeder
</string>
- <string name="Chat">
+ <string name="Chat" value=" Chat : ">
Chat
</string>
<string name="DeleteItems">
@@ -3873,4 +3870,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_land.xml b/indra/newview/skins/default/xui/de/floater_about_land.xml
index 2d8459479a..f1e42232c8 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>
diff --git a/indra/newview/skins/default/xui/de/floater_beacons.xml b/indra/newview/skins/default/xui/de/floater_beacons.xml
index 6e83e0419b..1a052bd814 100644
--- a/indra/newview/skins/default/xui/de/floater_beacons.xml
+++ b/indra/newview/skins/default/xui/de/floater_beacons.xml
@@ -17,5 +17,6 @@
<check_box label="Nur berühren" name="touch_only"/>
<check_box label="Soundquellen" name="sounds"/>
<check_box label="Partikelquellen" name="particles"/>
+ <check_box label="Medienquellen" name="moapbeacon"/>
</panel>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_buy_land.xml b/indra/newview/skins/default/xui/de/floater_buy_land.xml
index 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_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_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_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_tos.xml b/indra/newview/skins/default/xui/de/floater_tos.xml
index 1f3ef2f0b4..ba329371f8 100644
--- a/indra/newview/skins/default/xui/de/floater_tos.xml
+++ b/indra/newview/skins/default/xui/de/floater_tos.xml
@@ -4,7 +4,7 @@
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
+ data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Wird geladen %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3EServicebedingungen%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E
</floater.string>
<button label="Weiter" label_selected="Weiter" name="Continue"/>
<button label="Abbrechen" label_selected="Abbrechen" name="Cancel"/>
diff --git a/indra/newview/skins/default/xui/de/floater_water.xml b/indra/newview/skins/default/xui/de/floater_water.xml
index 097a60a444..bb0dd9c75d 100644
--- a/indra/newview/skins/default/xui/de/floater_water.xml
+++ b/indra/newview/skins/default/xui/de/floater_water.xml
@@ -3,9 +3,10 @@
<floater.string name="WLDefaultWaterNames">
Default:Glassy:Pond:Murky:Second Plague:SNAKE!!!:Valdez
</floater.string>
- <text name="KeyFramePresetsText" width="116">
+ <text name="KeyFramePresetsText" width="110">
Voreinstellungen:
</text>
+ <combo_box left_delta="110" name="WaterPresetsCombo"/>
<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"/>
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/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_avatar_self.xml b/indra/newview/skins/default/xui/de/menu_avatar_self.xml
index 40557b7ad8..c49f4b198b 100644
--- a/indra/newview/skins/default/xui/de/menu_avatar_self.xml
+++ b/indra/newview/skins/default/xui/de/menu_avatar_self.xml
@@ -14,6 +14,7 @@
<menu_item_call label="Unterhemd" name="Self Undershirt"/>
<menu_item_call label="Unterhose" name="Self Underpants"/>
<menu_item_call label="Tätowierung" name="Self Tattoo"/>
+ <menu_item_call label="Physik" name="Self Physics"/>
<menu_item_call label="Alpha" name="Self Alpha"/>
<menu_item_call label="Alle Kleider" name="All Clothes"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_bottomtray.xml b/indra/newview/skins/default/xui/de/menu_bottomtray.xml
index 660cd2eaf3..da36be59d0 100644
--- a/indra/newview/skins/default/xui/de/menu_bottomtray.xml
+++ b/indra/newview/skins/default/xui/de/menu_bottomtray.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="hide_camera_move_controls_menu">
- <menu_item_check label="Voice aktiviert" name="EnableVoiceChat"/>
+ <menu_item_check label="Schaltfläche „Sprechen“" name="EnableVoiceChat"/>
<menu_item_check label="Schaltfläche Gesten" name="ShowGestureButton"/>
<menu_item_check label="Schaltfläche Bewegungssteuerung" name="ShowMoveButton"/>
<menu_item_check label="Schaltfläche Ansicht" name="ShowCameraButton"/>
diff --git a/indra/newview/skins/default/xui/de/menu_inventory.xml b/indra/newview/skins/default/xui/de/menu_inventory.xml
index 43722e0dcf..9fcd41e62a 100644
--- a/indra/newview/skins/default/xui/de/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/de/menu_inventory.xml
@@ -25,6 +25,7 @@
<menu_item_call label="Neue Unterhose" name="New Underpants"/>
<menu_item_call label="Neue Alpha-Maske" name="New Alpha Mask"/>
<menu_item_call label="Neue Tätowierung" name="New Tattoo"/>
+ <menu_item_call label="Neue Physik" name="New Physics"/>
</menu>
<menu label="Neue Körperteile" name="New Body Parts">
<menu_item_call label="Neue Form/Gestalt" name="New Shape"/>
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 dccee6712d..165e9a9264 100644
--- a/indra/newview/skins/default/xui/de/menu_inventory_add.xml
+++ b/indra/newview/skins/default/xui/de/menu_inventory_add.xml
@@ -23,6 +23,7 @@
<menu_item_call label="Neue Unterhose" name="New Underpants"/>
<menu_item_call label="Neues Alpha" name="New Alpha"/>
<menu_item_call label="Neue Tätowierung" name="New Tattoo"/>
+ <menu_item_call label="Neue Physik" name="New Physics"/>
</menu>
<menu label="Neue Körperteile" name="New Body Parts">
<menu_item_call label="Neue Form/Gestalt" name="New Shape"/>
diff --git a/indra/newview/skins/default/xui/de/menu_media_ctrl.xml b/indra/newview/skins/default/xui/de/menu_media_ctrl.xml
new file mode 100644
index 0000000000..781796670a
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/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="Ausschneiden" name="Cut"/>
+ <menu_item_call label="Kopieren" name="Copy"/>
+ <menu_item_call label="Einfügen" name="Paste"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_outfit_gear.xml b/indra/newview/skins/default/xui/de/menu_outfit_gear.xml
index 897154ec56..d56c93533c 100644
--- a/indra/newview/skins/default/xui/de/menu_outfit_gear.xml
+++ b/indra/newview/skins/default/xui/de/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="Anziehen - Aktuelles Outfit ersetzen" name="wear"/>
<menu_item_call label="Anziehen - Aktuelles Outfit hinzufügen" name="wear_add"/>
<menu_item_call label="Ausziehen - Aus aktuellem Outfit entfernen" name="take_off"/>
@@ -14,6 +14,7 @@
<menu_item_call label="Neues Unterhemd" name="New Undershirt"/>
<menu_item_call label="Neue Unterhose" name="New Underpants"/>
<menu_item_call label="Neues Alpha" name="New Alpha"/>
+ <menu_item_call label="Neue Physik" name="New Physics"/>
<menu_item_call label="Neue Tätowierung" name="New Tattoo"/>
</menu>
<menu label="Neue Körperteile" name="New Body Parts">
@@ -24,4 +25,4 @@
</menu>
<menu_item_call label="Outfit neu benennen" name="rename"/>
<menu_item_call label="Outfit löschen" name="delete_outfit"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_viewer.xml b/indra/newview/skins/default/xui/de/menu_viewer.xml
index 17bcb013cc..9d5a69105d 100644
--- a/indra/newview/skins/default/xui/de/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/de/menu_viewer.xml
@@ -413,6 +413,7 @@
<menu_item_call label="Rock" name="Skirt"/>
<menu_item_call label="Alpha" name="Alpha"/>
<menu_item_call label="Tätowierung" name="Tattoo"/>
+ <menu_item_call label="Physik" name="Physics"/>
<menu_item_call label="Alle Kleider" name="All Clothes"/>
</menu>
<menu label="Hilfe" name="Help">
diff --git a/indra/newview/skins/default/xui/de/notifications.xml b/indra/newview/skins/default/xui/de/notifications.xml
index 3c63c093d2..c172f7ea2d 100644
--- a/indra/newview/skins/default/xui/de/notifications.xml
+++ b/indra/newview/skins/default/xui/de/notifications.xml
@@ -2853,6 +2853,13 @@ Alle stummschalten?
<notification label="Stehen" name="HintSit">
Um aufzustehen, klicken Sie auf die Schaltfläche „Stehen“.
</notification>
+ <notification label="Sprechen" name="HintSpeak">
+ Auf Schaltfläche „Sprechen“ klicken, um das Mikrofon ein- und auszuschalten.
+
+Auf den Pfeil nach oben klicken, um die Sprachsteuerung zu sehen.
+
+Durch Ausblenden der Schaltfläche „Sprechen“ wird die Sprechfunktion deaktiviert.
+ </notification>
<notification label="Welt erkunden" name="HintDestinationGuide">
Im Reiseführer finden Sie Tausende von interessanten Orten. Wählen Sie einfach einen Ort aus und klicken Sie auf „Teleportieren“.
</notification>
@@ -2862,12 +2869,14 @@ Alle stummschalten?
<notification label="Bewegen" name="HintMove">
Um zu gehen oder zu rennen, öffnen Sie das Bedienfeld „Bewegen“ und klicken Sie auf die Pfeile. Sie können auch die Pfeiltasten auf Ihrer Tastatur verwenden.
</notification>
+ <notification label="" name="HintMoveClick">
+ 1. Zum Gehen klicken: Auf beliebige Stelle am Boden klicken, um zu dieser Stelle zu gehen.
+
+2. Zum Drehen der Anzeige klicken und ziehen: Auf beliebige Stelle in der Welt klicken und ziehen, um Ihre Ansicht zu ändern.
+ </notification>
<notification label="Anzeigename" name="HintDisplayName">
Hier können Sie Ihren anpassbaren Anzeigenamen festlegen. Der Anzeigename unterscheidet sich von Ihrem eindeutigen Benutzernamen, der nicht geändert werden kann. In den Einstellungen können Sie festlegen, welcher Name von anderen Einwohnern angezeigt wird.
</notification>
- <notification label="Bewegen" name="HintMoveArrows">
- Verwenden Sie zum Gehen die Pfeiltasten auf Ihrer Tastatur. Drücken Sie die Nach-oben-Taste zweimal, um zu rennen.
- </notification>
<notification label="Ansicht" name="HintView">
Um die Kameraansicht zu ändern, verwenden Sie die Schwenk- und Kreissteuerungen. Um die Ansicht zurückzusetzen, drücken Sie die Esc-Taste oder laufen Sie einfach.
</notification>
diff --git a/indra/newview/skins/default/xui/de/panel_edit_physics.xml b/indra/newview/skins/default/xui/de/panel_edit_physics.xml
new file mode 100644
index 0000000000..bd9c84577a
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/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="Brust – Hüpfen"/>
+ <accordion_tab name="physics_breasts_inout_tab" title="Brust – Dekolleté"/>
+ <accordion_tab name="physics_breasts_leftright_tab" title="Brust – Schwingen"/>
+ <accordion_tab name="physics_belly_tab" title="Bauch – Hüpfen"/>
+ <accordion_tab name="physics_butt_tab" title="Po – Hüpfen"/>
+ <accordion_tab name="physics_butt_leftright_tab" title="Po – Wiegen"/>
+ <accordion_tab name="physics_advanced_tab" title="Erweiterte Parameter"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_edit_wearable.xml b/indra/newview/skins/default/xui/de/panel_edit_wearable.xml
index 271db4c15c..94a79a0bbd 100644
--- a/indra/newview/skins/default/xui/de/panel_edit_wearable.xml
+++ b/indra/newview/skins/default/xui/de/panel_edit_wearable.xml
@@ -45,6 +45,9 @@
<string name="edit_tattoo_title">
Tätowierung bearbeiten
</string>
+ <string name="edit_physics_title">
+ Physik bearbeiten
+ </string>
<string name="shape_desc_text">
Form:
</string>
@@ -90,6 +93,9 @@
<string name="tattoo_desc_text">
Tätowierung:
</string>
+ <string name="physics_desc_text">
+ Physik:
+ </string>
<labeled_back_button label="Speichern" name="back_btn" tool_tip="Zurück zu Outfit bearbeiten"/>
<text name="edit_wearable_title" value="Form bearbeiten"/>
<panel label="Hemd" name="wearable_type_panel">
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_preferences_chat.xml b/indra/newview/skins/default/xui/de/panel_preferences_chat.xml
index 8c8cdd31fe..ca8af27f58 100644
--- a/indra/newview/skins/default/xui/de/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/de/panel_preferences_chat.xml
@@ -30,7 +30,9 @@
<spinner label="Lebenszeit von Toasts für Chat in der Nähe:" name="nearby_toasts_lifetime"/>
<spinner label="Ein-/Ausblenddauer von Toasts für Chat in der Nähe:" name="nearby_toasts_fadingtime"/>
<check_box name="translate_chat_checkbox"/>
- <text name="translate_chb_label" >Bei Chat Maschinenübersetzung verwenden (Service von Google)</text>
+ <text name="translate_chb_label">
+ Beim Chatten Maschinenübersetzung verwenden (von Google bereitgestellt)
+ </text>
<text name="translate_language_text">
Chat übersetzen in:
</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 63161c954e..78cb03a50a 100644
--- a/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml
@@ -39,6 +39,10 @@
<combo_box.item label="Alle Avatare und Objekte" name="3"/>
<combo_box.item label="Alles" name="4"/>
</combo_box>
+ <slider label="Avatar-Physik:" name="AvatarPhysicsDetail"/>
+ <text name="AvatarPhysicsDetailText">
+ Niedrig
+ </text>
<slider label="Sichtweite:" name="DrawDistance"/>
<text name="DrawDistanceMeterText2">
m
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_preferences_sound.xml b/indra/newview/skins/default/xui/de/panel_preferences_sound.xml
index 07631b6a91..c118e4e4dd 100644
--- a/indra/newview/skins/default/xui/de/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/de/panel_preferences_sound.xml
@@ -5,7 +5,9 @@
</panel.string>
<slider label="Master-Lautstärke" name="System Volume"/>
<check_box initial_value="true" name="mute_when_minimized"/>
- <text name="mute_chb_label">Stummschalten, wenn minimiert</text>
+ <text name="mute_chb_label">
+ Stummschalten, wenn minimiert
+ </text>
<slider label="Schaltflächen" name="UI Volume"/>
<slider label="Umgebung" name="Wind Volume"/>
<slider label="Soundeffekte" name="SFX Volume"/>
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
new file mode 100644
index 0000000000..990193574e
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_scrolling_param_base.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="LLScrollingPanelParamBase">
+ <slider label="[BESCHR]" name="param slider"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/strings.xml b/indra/newview/skins/default/xui/de/strings.xml
index 0c621db6b0..f32eb21dd3 100644
--- a/indra/newview/skins/default/xui/de/strings.xml
+++ b/indra/newview/skins/default/xui/de/strings.xml
@@ -876,6 +876,9 @@
<string name="tattoo">
Tätowierung
</string>
+ <string name="physics">
+ Physik
+ </string>
<string name="invalid">
ungültig
</string>
@@ -915,6 +918,9 @@
<string name="tattoo_not_worn">
Tätowierung nicht getragen
</string>
+ <string name="physics_not_worn">
+ Physik nicht getragen
+ </string>
<string name="invalid_not_worn">
ungültig
</string>
@@ -963,6 +969,9 @@
<string name="create_new_tattoo">
Neue Tätowierung erstellen
</string>
+ <string name="create_new_physics">
+ Neue Physik erstellen
+ </string>
<string name="create_new_invalid">
ungültig
</string>
@@ -2247,6 +2256,114 @@ Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_
<string name="Bulbous Nose">
Knollennase
</string>
+ <string name="Breast Physics Mass">
+ Brust – Masse
+ </string>
+ <string name="Breast Physics Smoothing">
+ Brust – Glättung
+ </string>
+ <string name="Breast Physics Gravity">
+ Brust – Schwerkraft
+ </string>
+ <string name="Breast Physics Drag">
+ Brust – Luftwiderstand
+ </string>
+ <string name="Breast Physics InOut Max Effect">
+ Max. Effekt
+ </string>
+ <string name="Breast Physics InOut Spring">
+ Federn
+ </string>
+ <string name="Breast Physics InOut Gain">
+ Verstärkung
+ </string>
+ <string name="Breast Physics InOut Damping">
+ Dämpfung
+ </string>
+ <string name="Breast Physics UpDown Max Effect">
+ Max. Effekt
+ </string>
+ <string name="Breast Physics UpDown Spring">
+ Federn
+ </string>
+ <string name="Breast Physics UpDown Gain">
+ Verstärkung
+ </string>
+ <string name="Breast Physics UpDown Damping">
+ Dämpfung
+ </string>
+ <string name="Breast Physics LeftRight Max Effect">
+ Max. Effekt
+ </string>
+ <string name="Breast Physics LeftRight Spring">
+ Federn
+ </string>
+ <string name="Breast Physics LeftRight Gain">
+ Verstärkung
+ </string>
+ <string name="Breast Physics LeftRight Damping">
+ Dämpfung
+ </string>
+ <string name="Belly Physics Mass">
+ Bauch – Masse
+ </string>
+ <string name="Belly Physics Smoothing">
+ Bauch – Glättung
+ </string>
+ <string name="Belly Physics Gravity">
+ Bauch – Schwerkraft
+ </string>
+ <string name="Belly Physics Drag">
+ Bauch – Luftwiderstand
+ </string>
+ <string name="Belly Physics UpDown Max Effect">
+ Max. Effekt
+ </string>
+ <string name="Belly Physics UpDown Spring">
+ Federn
+ </string>
+ <string name="Belly Physics UpDown Gain">
+ Verstärkung
+ </string>
+ <string name="Belly Physics UpDown Damping">
+ Dämpfung
+ </string>
+ <string name="Butt Physics Mass">
+ Po – Masse
+ </string>
+ <string name="Butt Physics Smoothing">
+ Po – Glättung
+ </string>
+ <string name="Butt Physics Gravity">
+ Po – Schwerkraft
+ </string>
+ <string name="Butt Physics Drag">
+ Po – Luftwiderstand
+ </string>
+ <string name="Butt Physics UpDown Max Effect">
+ Max. Effekt
+ </string>
+ <string name="Butt Physics UpDown Spring">
+ Federn
+ </string>
+ <string name="Butt Physics UpDown Gain">
+ Verstärkung
+ </string>
+ <string name="Butt Physics UpDown Damping">
+ Dämpfung
+ </string>
+ <string name="Butt Physics LeftRight Max Effect">
+ Max. Effekt
+ </string>
+ <string name="Butt Physics LeftRight Spring">
+ Federn
+ </string>
+ <string name="Butt Physics LeftRight Gain">
+ Verstärkung
+ </string>
+ <string name="Butt Physics LeftRight Damping">
+ Dämpfung
+ </string>
<string name="Bushy Eyebrows">
Buschige Augenbrauen
</string>
@@ -2256,6 +2373,9 @@ Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_
<string name="Butt Size">
Hintern, Größe
</string>
+ <string name="Butt Gravity">
+ Po – Schwerkraft
+ </string>
<string name="bustle skirt">
Tournürenrock
</string>
@@ -3764,6 +3884,9 @@ Missbrauchsbericht
<string name="New Tattoo">
Neue Tätowierung
</string>
+ <string name="New Physics">
+ Neue Physik
+ </string>
<string name="Invalid Wearable">
Ungültiges Objekt
</string>
diff --git a/indra/newview/skins/default/xui/en/floater_about.xml b/indra/newview/skins/default/xui/en/floater_about.xml
index f5365be11f..a8b3ce9c28 100644
--- a/indra/newview/skins/default/xui/en/floater_about.xml
+++ b/indra/newview/skins/default/xui/en/floater_about.xml
@@ -139,28 +139,32 @@ Thank you to the following Residents for helping to ensure that this is the best
word_wrap="true">
3Dconnexion SDK Copyright (C) 1992-2007 3Dconnexion
APR Copyright (C) 2000-2004 The Apache Software Foundation
+Collada DOM Copyright 2005 Sony Computer Entertainment Inc.
cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se)
DBus/dbus-glib Copyright (C) 2002, 2003 CodeFactory AB / Copyright (C) 2003, 2004 Red Hat, Inc.
expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd.
FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org).
GL Copyright (C) 1999-2004 Brian Paul.
+GLOD Copyright (C) 2003-04 Jonathan Cohen, Nat Duca, Chris Niski, Johns Hopkins University and David Luebke, Brenden Schubert, University of Virginia.
google-perftools Copyright (c) 2005, Google Inc.
Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited.
jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW)
jpeglib Copyright (C) 1991-1998, Thomas G. Lane.
ogg/vorbis Copyright (C) 2001, Xiphophorus
OpenSSL Copyright (C) 1998-2002 The OpenSSL Project.
-Pth Copyright (C) 1999-2006 Ralf S. Engelschall &lt;rse@gnu.org&gt;
+PCRE Copyright (c) 1997-2008 University of Cambridge
SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
xmlrpc-epi Copyright (C) 2000 Epinions, Inc.
zlib Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler.
google-perftools Copyright (c) 2005, Google Inc.
+Second Life Viewer uses Havok (TM) Physics. (c)Copyright 1999-2010 Havok.com Inc. (and its Licensors). All Rights Reserved. See www.havok.com for details.
+
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>
+ </text_editor>
</panel>
</tab_container>
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_buy_contents.xml b/indra/newview/skins/default/xui/en/floater_buy_contents.xml
index babbf0f5ca..92001534e7 100644
--- a/indra/newview/skins/default/xui/en/floater_buy_contents.xml
+++ b/indra/newview/skins/default/xui/en/floater_buy_contents.xml
@@ -34,7 +34,7 @@
layout="topleft"
name="contains_text"
width="276">
- [NAME] contains:
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; contains:
</text>
<scroll_list
background_visible="true"
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_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_import_collada.xml b/indra/newview/skins/default/xui/en/floater_import_collada.xml
new file mode 100644
index 0000000000..441ab6a2de
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_import_collada.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater can_close="false" can_drag_on_left="false" can_minimize="false"
+ can_resize="false" height="160" min_height="160" width="300" min_width="300"
+ name="Import Collada" title="Import Scene">
+
+ <text bottom_delta="40" left="20" name="mesh count" height="15" follows="top|left">
+ Meshes: [COUNT]
+ </text>
+
+ <text bottom_delta="20" left="20" name="texture count" height="15" follows="top|left">
+ Textures: [COUNT]
+ </text>
+
+ <text bottom_delta="40" left="10" name="status" height="15" follows="top|left">
+ Status: [STATUS]
+ </text>
+
+ <button
+ bottom_delta="40"
+ name="cancel"
+ label="Cancel"
+ enabled="true"
+ height="20"
+ layout="topleft"
+ left="125"
+ width="75" />
+
+ <button
+ bottom_delta="0"
+ name="ok"
+ label="OK"
+ enabled="true"
+ height="20"
+ layout="topleft"
+ left="210"
+ width="75" />
+
+ <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/en/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/en/floater_inventory_view_finder.xml
index 90fee857fb..c86ed595a7 100644
--- a/indra/newview/skins/default/xui/en/floater_inventory_view_finder.xml
+++ b/indra/newview/skins/default/xui/en/floater_inventory_view_finder.xml
@@ -95,6 +95,23 @@
width="126" />
<icon
height="16"
+ image_name="Inv_Mesh"
+ layout="topleft"
+ left="8"
+ mouse_opaque="true"
+ name="icon_mesh"
+ top="142"
+ width="16" />
+ <check_box
+ height="16"
+ label="Meshes"
+ layout="topleft"
+ left_pad="2"
+ name="check_mesh"
+ top_delta="0"
+ width="126" />
+ <icon
+ height="16"
image_name="Inv_Notecard"
layout="topleft"
left="8"
@@ -117,7 +134,7 @@
left="8"
mouse_opaque="true"
name="icon_object"
- top="142"
+ top="162"
width="16" />
<check_box
height="16"
@@ -134,7 +151,7 @@
left="8"
mouse_opaque="true"
name="icon_script"
- top="162"
+ top="182"
width="16" />
<check_box
height="16"
@@ -151,7 +168,7 @@
left="8"
mouse_opaque="true"
name="icon_sound"
- top="182"
+ top="202"
width="16" />
<check_box
height="16"
@@ -168,7 +185,7 @@
left="8"
mouse_opaque="true"
name="icon_texture"
- top="202"
+ top="222"
width="16" />
<check_box
height="16"
@@ -185,7 +202,7 @@
left="8"
mouse_opaque="true"
name="icon_snapshot"
- top="222"
+ top="242"
width="16" />
<check_box
height="16"
@@ -203,7 +220,7 @@
layout="topleft"
left="8"
name="All"
- top="242"
+ top="262"
width="100" />
<button
follows="left|top"
diff --git a/indra/newview/skins/default/xui/en/floater_model_preview.xml b/indra/newview/skins/default/xui/en/floater_model_preview.xml
new file mode 100644
index 0000000000..dce55dae12
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_model_preview.xml
@@ -0,0 +1,547 @@
+<?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">
+
+ <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> <!-- Text to display in physics layer combo box for "all layers" -->
+ <string name="decomposing">Analyzing...</string>
+ <string name="simplifying">Simplifying...</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" 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">
+ Preview:
+ </text>
+ <combo_box bottom_delta="20" follows="left|top" height="18"
+ name="preview_lod_combo" width="240" 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>
+
+ <menu_button follows="top|left"
+ image_hover_unselected="Toolbar_Left_Over"
+ image_overlay="OptionsMenu_Off"
+ image_selected="Toolbar_Left_Selected"
+ image_unselected="Toolbar_Left_Off"
+ layout="topleft"
+ left_pad="5"
+ name="options_gear_btn"
+ width="31"
+ height="25"/>
+ <!-- Placeholder panel for 3D preview render -->
+ <panel
+ name="preview_panel"
+ left="15"
+ bevel_style="none"
+ border_style="line"
+ border="true"
+ 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>
+ <text left="25" top_pad="5" follows="bottom|left" height="15" name="upload fee">
+ Upload Fee: N/A
+ </text>
+ </panel>
+
+ <text left="10" bottom="540" width="290" height="15" follows="bottom|left|right" name="status">[STATUS]</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"/>
+
+ <tab_container
+ follows="right|top|bottom"
+ top="15"
+ left="310"
+ height="470"
+ width="300"
+ name="import_tab"
+ border="true"
+ tab_position="top">
+
+ <!-- LOD PANEL -->
+ <panel
+ border="true"
+ label="Level of Detail"
+ name="lod_panel">
+
+ <text left="10" width="240" bottom="20" height="15" follows="left|top" name="lod_table_header">
+ Select Level of Detail:
+ </text>
+
+ <text valign="center" halign="center" bg_visible="true" bottom_delta="16" left="75" width="65" height="18" follows="left|top" value="Triangles"/>
+ <text valign="center" halign="center" bg_visible="true" left_pad="0" width="65" height="18" follows="left|top" value="Vertices"/>
+ <text valign="center" halign="center" left_pad="0" width="65" bg_visible="true" height="18" follows="left|top" value="Status"/>
+
+ <text valign="center" halign="center" bg_visible="true" name="high_label" left="10" top_pad="0" width="65" height="18" follows="left|top" value="High"/>
+ <text valign="center" halign="center" bg_visible="true" name="high_triangles" left_pad="0" width="65" height="18" follows="left|top" value="0"/>
+ <text valign="center" halign="center" bg_visible="true" name="high_vertices" left_pad="0" width="65" height="18" follows="left|top" value="0"/>
+ <text valign="center" halign="center" bg_visible="true" name="high_status" left_pad="0" width="65" height="18" follows="left|top" value=""/>
+ <icon height="16" width="16" image_name="lag_status_critical.tga" mouse_opaque="true" name="status_icon_high" left_delta="20" top_delta="0" />
+
+ <text valign="center" halign="center" bg_visible="true" name="medium_label" left="10" top_pad="0" width="65" height="18" follows="left|top" value="Medium"/>
+ <text valign="center" halign="center" bg_visible="true" name="medium_triangles" left_pad="0" width="65" height="18" follows="left|top" value="0"/>
+ <text valign="center" halign="center" bg_visible="true" name="medium_vertices" left_pad="0" width="65" height="18" follows="left|top" value="0"/>
+ <text valign="center" halign="center" bg_visible="true" name="medium_status" left_pad="0" width="65" height="18" follows="left|top" value=""/>
+ <icon height="16" width="16" image_name="lag_status_critical.tga" mouse_opaque="true" name="status_icon_medium" left_delta="20" top_delta="0" />
+
+ <text valign="center" halign="center" bg_visible="true" name="low_label" left="10" top_pad="0" width="65" height="18" follows="left|top" value="Low"/>
+ <text valign="center" halign="center" bg_visible="true" name="low_triangles" left_pad="0" width="65" height="18" follows="left|top" value="0"/>
+ <text valign="center" halign="center" bg_visible="true" name="low_vertices" left_pad="0" width="65" height="18" follows="left|top" value="0"/>
+ <text valign="center" halign="center" bg_visible="true" name="low_status" left_pad="0" width="65" height="18" follows="left|top" value=""/>
+ <icon height="16" width="16" image_name="lag_status_critical.tga" mouse_opaque="true" name="status_icon_low" left_delta="20" top_delta="0" />
+
+ <text valign="center" halign="center" bg_visible="true" name="lowest_label" left="10" top_pad="0" width="65" height="18" follows="left|top" value="Lowest"/>
+ <text valign="center" halign="center" bg_visible="true" name="lowest_triangles" left_pad="0" width="65" height="18" follows="left|top" value="0"/>
+ <text valign="center" halign="center" bg_visible="true" name="lowest_vertices" left_pad="0" width="65" height="18" follows="left|top" value="0"/>
+ <text valign="center" halign="center" bg_visible="true" name="lowest_status" left_pad="0" width="65" height="18" follows="left|top" value=""/>
+ <icon height="16" width="16" image_name="lag_status_critical.tga" mouse_opaque="true" name="status_icon_lowest" left_delta="20" top_delta="0" />
+
+ <text left="10" width="240" height="15" top_pad="15" follows="left|top" name="lod_table_footer">
+ Level of Detail: [DETAIL]
+ </text>
+
+ <icon height="16" width="16" left="20" follows="left|top" name="lod_status_message_icon"/>
+ <text left_pad="5" width="200" height="28" follows="left|top" top_pad="-15" wrap="true" name="lod_status_message_text"/>
+
+ <text top_pad="-3" left="10" height="15" follows="left|top">
+ Mesh
+ </text>
+
+ <radio_group follows="top|left" height="210" left="30" name="lod_file_or_limit" width="240" value="lod_from_file">
+ <radio_item bottom="195" label="Load from file" name="lod_from_file"/>
+ <radio_item bottom="150" label="Auto generate" name="lod_auto_generate"/>
+ <radio_item bottom="0" label="None" name="lod_none"/>
+ </radio_group>
+
+ <line_editor follows="left|top" bottom_delta="-170" width="140" left="45" value="" name="lod_file" height="20"/>
+ <button bottom_delta="3" name="lod_browse" label="Browse..." left_pad="5" follows="left|top" width="70" height="25"/>
+
+ <combo_box follows="top|left" name="lod_mode" top_pad="22" width="100" left="45" height="20">
+ <combo_item name="triangle_limit">
+ Triangle Limit
+ </combo_item>
+ <combo_item name="error_threshold">
+ Error Threshold
+ </combo_item>
+ </combo_box>
+ <spinner follows="top|left" name="lod_triangle_limit" increment="10" left_pad="5" height="20" width="100" decimal_digits="0" enabled="true"/>
+ <spinner left_delta="0" bottom_delta="0" increment="0.01" follows="top|left" name="lod_error_threshold" min_val="0" max_val="100" height="20" width="100" decimal_digits="3" visible="false" enabled="true"/>
+
+ <text follows="top|left" name="build_operator_text" left="45" top_pad="10" width="100" height="15">
+ Build Operator:
+ </text>
+ <text follows="top|left" name="queue_mode_text" left_pad="5" width="100" height="15">
+ Queue Mode:
+ </text>
+ <combo_box follows="top|left" name="build_operator" top_pad="5" left="45" width="100" height="20">
+ <combo_item name="edge_collapse">
+ Edge Collapse
+ </combo_item>
+ <combo_item name="half_edge_collapse">
+ Half Edge Collapse
+ </combo_item>
+ </combo_box>
+
+ <combo_box follows="top|left" name="queue_mode" left_pad="5" width="100" height="20">
+ <combo_item name="greedy">
+ Greedy
+ </combo_item>
+ <combo_item name="lazy">
+ Lazy
+ </combo_item>
+ <combo_item name="independent">
+ Independent
+ </combo_item>
+ </combo_box>
+
+ <text top_pad="10" name="border_mode_text" left="45" follows="left|top" width="100" height="15">
+ Border Mode:
+ </text>
+
+ <text left_pad="5" name="share_tolderance_text" follows="left|top" width="100" height="15">
+ Share Tolerance:
+ </text>
+
+ <combo_box follows="left|top" left="45" height="20" name="border_mode" width="100">
+ <combo_item name="border_unlock">
+ Unlock
+ </combo_item>
+ <combo_item name="border_lock">
+ Lock
+ </combo_item>
+ </combo_box>
+ <spinner follows="left|top" name="share_tolerance" left_pad="5" width="100" decimal_digits="5" initial_value="0.00001" height="20"/>
+
+ <text left="10" top_pad="35" follows="top|left" width="240" height="15">
+ Generate Normals
+ </text>
+ <text left="35" top_pad="5" follows="top|left" width="100" height="15" name="crease_label">
+ Crease Angle:
+ </text>
+ <spinner follows="top|left" left_pad="5" min_val="0" max_val="180" value="75" width="60" height="20" name="crease_angle"/>
+ </panel>
+
+ <!-- PANEL -->
+ <panel
+ border="true"
+ label="Physics"
+ name="physics_panel">
+
+ <!-- PHYSICS GEOMETRY-->
+ <panel
+ follows="top|left"
+ name="physics geometry"
+ left="0"
+ top="0"
+ width="300"
+ height="65"
+ visible="true"
+ border="true"
+ bevel_style="none" bg_alpha_color="0 0 0 0" bg_opaque_color="0 0 0 0.3">
+
+ <radio_group follows="top|left" top="10" width="240" height="40" name="physics_load_radio" value="physics_load_from_file">
+ <radio_item bottom="0" name="physics_load_from_file" label="File:"/>
+ <radio_item bottom="23" name="physics_use_lod" label="Use Level of Detail:"/>
+ </radio_group>
+
+ <combo_box left="180" top="10" follows="left|top" height="18"
+ name="physics_lod_combo" width="110" 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>
+
+ <line_editor follows="left|top" top_pad="5" width="140" left="60" value="" name="physics_file" height="20"/>
+ <button left_pad="10" name="physics_browse" label="Browse..." follows="left|top" width="70" height="20"/>
+
+ <!--
+ <check_box name="physics_optimize" follows="left|top" width="130" left="10" top_pad="5" height="20" label="Optimize"/>
+ <check_box name="physics_use_hull" follows="left|top" width="130" left_pad="5" height="20" label="Use Convex Hull"/>
+ -->
+ </panel>
+
+
+ <!-- PHYSICS ANALYSIS-->
+ <panel
+ follows="top|left"
+ name="physics analysis"
+ top_pad="0"
+ left="0"
+ width="300"
+ height="130"
+ visible="true"
+ border="true"
+ bevel_style="none" bg_alpha_color="0 0 0 0" bg_opaque_color="0 0 0 0.3">
+
+ <text follows="left|top" bottom="40" height="30" left="10" font="SansSerifBig">
+ Step 1: Analysis
+ </text>
+
+ <text top_pad="5" width="50" follows="top|left" height="15">
+ Method:
+ </text>
+ <combo_box name="Method" follows="top|left" left_pad="5" bottom_delta="2" height="20" width="80"/>
+ <text left="160" bottom_delta="-2" width="50" follows="top|left" height="15">
+ Quality:
+ </text>
+ <combo_box name="Decompose Quality" bottom_delta="2" follows="top|left" left_pad="5" height="20" width="80"/>
+
+ <slider name="Smooth" left="10" width="280" follows="top|left" top_pad="10" height="20" label="Smooth:"/>
+
+ <check_box name="Close Holes (Slow)" follows="top|left" top_pad="10" height="15" label="Close Holes (slow)"/>
+
+ <button left="200" bottom_delta="0" width="90" follows="top|left" label="Analyze" name="Decompose" height="20"/>
+ <button left="200" bottom_delta="0" width="90" follows="top|left" label="Cancel" name="decompose_cancel" visble="false" height="20"/>
+ </panel>
+
+
+ <!-- PHYSICS SIMPLIFICATION -->
+ <panel
+ follows="top|left"
+ name="physics simplification"
+ left="0"
+ top_pad="0"
+ width="300"
+ height="150"
+ visible="true"
+ border="true"
+ bevel_style="none" bg_alpha_color="0 0 0 0" bg_opaque_color="0 0 0 0.3">
+
+ <text follows="left|top" bottom="40" height="30" left="10" font="SansSerifBig">
+ Step 2: Simplification
+ </text>
+
+ <text left="10" top_pad="5" height="15" width="140" follows="top|left">
+ Method:
+ </text>
+
+ <combo_box left_pad="5" height="20" width="120" follows="top|left" name="Simplify Method"/>
+
+ <slider left="10" name="Combine Quality" label="Passes:" label_width="120" width="270" follows="top|left" top_pad="10" height="20"/>
+ <slider name="Detail Scale" label="Detail Scale:" label_width="120" width="270" follows="top|left" top_pad="10" height="20"/>
+ <slider name="Retain%" label="Retain:" label_width="120" width="270" follows="top|left" bottom_delta="0" left_delta="0" visible="false" height="20"/>
+ <button left="190" width="90" follows="top|left" label="Simplify" name="Simplify" height="20"/>
+ <button left="190" bottom_delta="0" width="90" follows="top|left" label="Cancel" name="simplify_cancel" height="20"/>
+
+ </panel>
+
+ <!-- INFO PANEL -->
+ <panel
+ left="0"
+ top_pad="0"
+ width="300"
+ height="100"
+ follows="left|top"
+ name="physics info"
+ visible="true"
+ border="true"
+ bevel_style="none" bg_alpha_color="0 0 0 0" bg_opaque_color="0 0 0 0.3">
+
+ <slider name="physics_explode" follows="top|left" top="10" left="10" label="Preview Spread:" min_val="0.0" max_val="3.0" height="20" width="280"/>
+
+ <text follows="top|left" name="physics_triangles" top_pad="10" height="15" left="10">
+ Triangles: [TRIANGLES]
+ </text>
+ <text follows="top|left" name="physics_points" top_pad="5" height="15">
+ Vertices: [POINTS]
+ </text>
+ <text follows="top|left" name="physics_hulls" top_pad="5" height="15">
+ Hulls: [HULLS]
+ </text>
+
+
+ </panel>
+ </panel>
+
+ <!-- MODIFIERS PANEL -->
+ <panel
+ border="true"
+ label="Modifiers"
+ name="modifiers_panel">
+ <text left="10" width="90" bottom="30" follows="top|left" height="15">
+ Scale:
+ </text>
+ <text left_pad="5" width="140" follows="top|left" height="15">
+ Dimensions:
+ </text>
+
+ <spinner left="10" height="20" follows="top|left" width="80" top_pad="5" value="1.0" min_val="0.01" max_val="64.0" name="import_scale"/>
+
+ <text left_pad="20" height="15" name="import_dimensions" follows="top|left">
+ [X] x [Y] x [Z] m
+ </text>
+
+ <text left="10" top_pad="20" follows="top|left" height="15">
+ Include:
+ </text>
+
+ <check_box top_pad="5" name="upload_textures" height="15" follows="top|left" label="Textures"/>
+ <check_box top_pad="5" name="upload_skin" height="15" follows="top|left" label="Skin weight"/>
+ <check_box top_pad="5" left="20" name="upload_joints" height="15" follows="top|left" label="Joint positions"/>
+
+ <text left="10" top_pad="4" width="90" bottom="30" follows="top|left" height="15">
+ Pelvis Z Offset:
+ </text>
+
+ <spinner left="10" top_pad="4" height="20" follows="top|left" width="80" value="0.0" min_val="-3.00" max_val="3.0" name="pelvis_offset"/>
+
+ </panel>
+ </tab_container>
+
+ <!--
+ <button bottom_delta="0" left="10" width="120" name="auto fill" label="Generate LOD" tool_tip="Automatically generate levels of detail"/>
+ <button bottom_delta="0" left="140" width="120" name="smooth normals" label="Generate Normals" tool_tip="Regenerate normals based on mesh shape"/>
+ <button bottom_delta="0" left="260" width="120" name="consolidate" label="Consolidate" tool_tip="Combine similar submeshes (reduces number of submeshes)"/>
+ <button bottom_delta="30" left="260" width="120" name="scrub materials" label="Scrub Materials" tool_tip="Remove all material information (clear textures, set all colors to white)."/>
+
+ <spinner bottom_delta="0" left="140" width="120" height="16" initial_value="75" label_width="60" name="edge threshold" decimal_digits="0" min_val="0" max_val="180" increment="5" label="Hard Angle" tool_tip="Maximum angle that will be smoothed between triangles when using Generate Normals"/>
+
+ <text bottom_delta="30" follows="top|left" height="15" left="10" name="high_lod_label">
+ High LOD:
+ </text>
+ <combo_box bottom_delta="0" left="97" follows="left|top" height="18"
+ name="high detail combo" width="100" tool_tip="Specify mesh for this level of detail">
+ <combo_item name="high none" value="none">
+ None
+ </combo_item>
+ <combo_item name="high choose file" value="file">
+ Choose File...
+ </combo_item>
+ <combo_item name="high triangle limit" value="limit">
+ Triangle Limit
+ </combo_item>
+ </combo_box>
+ <spinner bottom_delta="-5" left="200" width="120" name="high limit" decimal_digits="0" increment="1" min_val="0" max_val="100" tool_tip="Triangle budget for this LOD"/>
+ <text bottom_delta="25" follows="top|left" height="15" left="10" name="high info" width="300">
+ [TRIANGLES] Triangles, [VERTICES] Vertices, [SUBMESHES] Submeshes.
+ [MESSAGE]
+ </text>
+
+ <text bottom_delta="35" follows="top|left" height="15" left="10" name="medium_lod_label">
+ Medium LOD:
+ </text>
+ <combo_box bottom_delta="0" left="97" follows="left|top" height="18"
+ name="medium detail combo" width="100" tool_tip="Specify mesh for this level of detail">
+ <combo_item name="medium none" value="none">
+ None
+ </combo_item>
+ <combo_item name="medium choose file" value="file">
+ Choose File...
+ </combo_item>
+ <combo_item name="medium triangle limit" value="limit">
+ Triangle Limit
+ </combo_item>
+ </combo_box>
+ <spinner bottom_delta="-5" left="200" width="120" name="medium limit" decimal_digits="0" increment="1" min_val="0" max_val="100" tool_tip="Triangle budget for this LOD"/>
+ <text bottom_delta="25" follows="top|left" height="15" left="10" name="medium info" width="300">
+ [TRIANGLES] Triangles, [VERTICES] Vertices, [SUBMESHES] Submeshes.
+ [MESSAGE]
+ </text>
+
+ <text bottom_delta="35" follows="top|left" height="15" left="10" name="low_lod_label">
+ Low LOD:
+ </text>
+ <combo_box bottom_delta="0" left="97" follows="left|top" height="18"
+ name="low detail combo" width="100" tool_tip="Specify mesh for this level of detail">
+ <combo_item name="low none" value="none">
+ None
+ </combo_item>
+ <combo_item name="low choose file" value="file">
+ Choose File...
+ </combo_item>
+ <combo_item name="low triangle limit" value="limit">
+ Triangle Limit
+ </combo_item>
+ </combo_box>
+ <spinner bottom_delta="-5" left="200" width="120" name="low limit" decimal_digits="0" increment="1" min_val="0" max_val="100" tool_tip="Triangle budget for this LOD"/>
+ <text bottom_delta="25" follows="top|left" height="15" left="10" name="low info" width="300">
+ [TRIANGLES] Triangles, [VERTICES] Vertices, [SUBMESHES] Submeshes
+ [MESSAGE]
+ </text>
+
+ <text bottom_delta="35" follows="top|left" height="15" left="10" name="lowest_lod_label">
+ Lowest LOD:
+ </text>
+ <combo_box bottom_delta="0" left="97" follows="left|top" height="18"
+ name="lowest detail combo" width="100" tool_tip="Specify mesh for this level of detail">
+ <combo_item name="lowest none" value="none">
+ None
+ </combo_item>
+ <combo_item name="lowest choose file" value="file">
+ Choose File...
+ </combo_item>
+ <combo_item name="lowest triangle limit" value="limit">
+ Triangle Limit
+ </combo_item>
+ </combo_box>
+ <spinner bottom_delta="-5" left="200" width="120" name="lowest limit" decimal_digits="0" increment="1" min_val="0" max_val="100" tool_tip="Triangle budget for this LOD"/>
+ <text bottom_delta="25" follows="top|left" height="15" left="10" name="lowest info" width="300">
+ [TRIANGLES] Triangles, [VERTICES] Vertices, [SUBMESHES] Submeshes
+ [MESSAGE]
+ </text>
+
+ <text bottom_delta="35" follows="top|left" height="15" left="10" name="physics_lod_label">
+ Physical Shape:
+ </text>
+ <combo_box bottom_delta="0" left="97" follows="left|top" height="18"
+ name="physics detail combo" width="100">
+ <combo_item name="physics none" value="none">
+ None
+ </combo_item>
+ <combo_item name="physics choose file" value="file">
+ Choose File...
+ </combo_item>
+ <combo_item name="physics triangle limit" value="limit">
+ Triangle Limit...
+ </combo_item>
+ </combo_box>
+ <spinner bottom_delta="-5" left="200" width="90" name="physics limit" decimal_digits="0" increment="1" min_val="0" max_val="100" tool_tip="Triangle budget for this LOD"/>
+ <button bottom_delta="0" left="290" width="30" follows="left|top" height="20" label=">>"
+ name="decompose_btn" tool_tip="Create convex decomposition."/>
+ <text bottom_delta="25" follows="top|left" height="15" left="10" name="physics info" width="300">
+ [TRIANGLES] Triangles, [HULLS] Hulls, [POINTS] Points
+ </text>
+
+ <text bottom_delta="25" follows="top|left" height="15" left="10" name="include label" width="300">
+ Include:
+ </text>
+
+ <check_box bottom_delta="20" follow="bottom|left" height="20" label="Textures"
+ left="15" width="125" name="upload_textures" tool_tip="Upload associated textures "/>
+
+ <check_box bottom_delta="20" follow="bottom|left" height="20" label="Skin Weights"
+ left="15" width="125" name="upload_skin" tool_tip="Upload vertex skin weighting information."/>
+
+ <check_box bottom_delta="20" follow="bottom|left" height="20" label="Joint Positions"
+ left="15" width="125" name="upload_joints" tool_tip="Upload joint position information (will override avatar joint positions when mesh is worn)."/>
+
+
+ <button bottom_delta="25" follows="bottom|left" height="20" label="Upload"
+ left="15" name="ok_btn" width="125" tool_tip="Upload to simulator"/>
+
+ <text bottom_delta="20" left="15" width="280" follows="top|left" height="15" name="description_label" text_color="1 0.82 0.46 1">
+ (No charge for upload during First Look)
+ </text>
+ <text bottom_delta="20" left="15" width="280" follows="top|left" height="15" name="upload_message">
+ [MESSAGE]
+ </text>
+
+ <spinner bottom_delta="20" label="Scale" left="15" width="120" name="debug scale" decimal_digits="3" increment="0.1" min_val="0" max_val="64" initial_value="1" tool_tip="Multiplier for incoming object scale. If incoming dimensions are very small or very large, modify this value to get dimensions into an acceptable range."/>
+ <text bottom_delta="30" left="15" width="280" follows="top|left" height="15" name="dimensions">
+ Model Dimensions: [X]m x [Y]m x [Z]m
+ </text>
+ -->
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_model_wizard.xml b/indra/newview/skins/default/xui/en/floater_model_wizard.xml
new file mode 100644
index 0000000000..47b2e5fd79
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_model_wizard.xml
@@ -0,0 +1,1039 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ legacy_header_height="18"
+ layout="topleft"
+ name="Model Wizard"
+ help_topic="model_wizard"
+ bg_opaque_image_overlay="0.5 0.5 0.5 1"
+ height="480"
+ save_rect="true"
+ title="UPLOAD MODEL WIZARD"
+ width="535">
+ <button
+ top="32"
+ tab_stop="false"
+ left="410"
+ height="32"
+ name="upload_btn"
+ enabled="false"
+ label="5. Upload"
+ border="false"
+ image_unselected="BreadCrumbBtn_Right_Off"
+ image_selected="BreadCrumbBtn_Right_Press"
+ image_hover_unselected="BreadCrumbBtn_Right_Over"
+ image_disabled="BreadCrumbBtn_Right_Disabled"
+ image_disabled_selected="BreadCrumbBtn_Right_Disabled"
+ width="110">
+ <button.commit_callback
+ function="Wizard.Upload"/>
+ </button>
+ <button
+ top="32"
+ left="310"
+ height="32"
+ tab_stop="false"
+ name="review_btn"
+ label="4. Review"
+ 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.Review"/>
+ </button>
+ <button
+ 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"
+ 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.Physics"/>
+ </button>
+ <button
+ top="32"
+ left="115"
+ name="optimize_btn"
+ label="2. Optimize"
+ tab_stop="false"
+ height="32"
+ 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.Optimize"/>
+ </button>
+ <button
+ top="32"
+ left="15"
+ name="choose_file_btn"
+ tab_stop="false"
+ enabled="false"
+ label="1. Choose File"
+ height="32"
+ image_unselected="BreadCrumbBtn_Left_Off"
+ image_selected="BreadCrumbBtn_Left_Press"
+ image_hover_unselected="BreadCrumbBtn_Left_Over"
+ image_disabled="BreadCrumbBtn_Left_Disabled"
+ image_disabled_selected="BreadCrumbBtn_Left_Disabled"
+ width="110">
+ <button.commit_callback
+ function="Wizard.Choose"/>
+ </button>
+ <panel
+ height="388"
+ top_pad="0"
+ name="choose_file_panel"
+ visible="false"
+ width="535"
+ left="0">
+ <panel
+ height="22"
+ top_pad="15"
+ width="505"
+ name="header_panel"
+ bg_opaque_color="DkGray2"
+ background_visible="true"
+ background_opaque="true"
+ left="15">
+ <text
+ width="200"
+ left="10"
+ top="3"
+ name="header_text"
+ text_color="White"
+ height="10"
+ font="SansSerifBig"
+ layout="topleft">
+ Upload Model
+ </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"
+ left="15"
+ height="270"
+ width="505"
+ name="content"
+ bg_opaque_color="DkGray2"
+ background_visible="true"
+ background_opaque="true">
+ <text
+ type="string"
+ length="1"
+ text_color="White"
+ follows="left|top"
+ top="10"
+ height="10"
+ layout="topleft"
+ left_delta="10"
+ name="Cache location"
+ width="300">
+ Filename:
+ </text>
+ <line_editor
+ border_style="line"
+ border_thickness="1"
+ follows="left|top"
+ font="SansSerifSmall"
+ height="20"
+ layout="topleft"
+ left_delta="0"
+ max_length="4096"
+ name="lod_file"
+ top_pad="5"
+ width="220" />
+ <button
+ follows="left|top"
+ height="23"
+ label="Browse..."
+ label_selected="Browse..."
+ layout="topleft"
+ left_pad="5"
+ name="browse"
+ top_delta="-1"
+ width="85">
+ </button>
+ <text
+ top_delta="-15"
+ width="200"
+ height="15"
+ font="SansSerifSmall"
+ layout="topleft"
+ text_color="White"
+ left_pad="19">
+ Model Preview:
+ </text>
+ <!-- Placeholder panel for 3D preview render -->
+ <panel
+ left_delta="0"
+ top_pad="0"
+ name="preview_panel"
+ bevel_style="none"
+ highlight_light_color="0.09 0.09 0.09 1"
+ border="true"
+ height="150"
+ follows="all"
+ width="150">
+ </panel>
+ <text
+ top_pad="10"
+ width="130"
+ height="14"
+ left="340"
+ 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="356"/>
+ <text
+ top_delta="0"
+ width="160"
+ height="15"
+ name="dimension_y"
+ left="403"/>
+ <text
+ top_delta="0"
+ width="160"
+ 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>
+ </panel>
+ </panel>
+
+
+ <panel
+ height="388"
+ top_delta="0"
+ name="optimize_panel"
+ visible="false"
+ 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"
+ top="3"
+ text_color="White"
+ height="10"
+ font="SansSerifBig"
+ layout="topleft">
+ Optimize
+ </text>
+ </panel>
+ <text
+ top_pad="14"
+ width="460"
+ height="20"
+ font="SansSerifSmall"
+ layout="topleft"
+ 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.
+ </text>
+ <panel
+ top_delta="40"
+ visible="false"
+ left="15"
+ height="270"
+ width="505"
+ name="content"
+ bg_opaque_color="DkGray2"
+ background_visible="true"
+ background_opaque="true">
+ <text
+ top="20"
+ width="300"
+ height="12"
+ font="SansSerifBold"
+ left="112">Generating Level of Detail</text>
+ <progress_bar
+ name="optimize_progress_bar"
+ image_fill="model_wizard\progress_light.png"
+ color_bg="1 1 1 1"
+ color_bar="1 1 1 0.96"
+ follows="left|right|top"
+ width="260"
+ height="16"
+ image_bar="model_wizard\progress_bar_bg.png"
+ top_pad="14"
+ left="110"/>
+ <icon
+ top_pad="10"
+ left_delta="0"
+ width="13"
+ height="12"
+ image_name="model_wizard\check_mark.png"/>
+ <text
+ top_delta="0"
+ left_delta="18"
+ name="high_detail_text"
+ width="200"
+ height="14">Generate Level of Detail: High</text>
+ <icon
+ top_pad="10"
+ left_delta="-18"
+ width="13"
+ height="12"
+ image_name="model_wizard\check_mark.png"/>
+ <text
+ top_delta="0"
+ left_delta="18"
+ name="medium_detail_text"
+ width="200"
+ height="14">Generate Level of Detail: Medium</text>
+ <icon
+ top_pad="10"
+ left_delta="-18"
+ width="13"
+ height="12"
+ image_name="model_wizard\check_mark.png"/>
+ <text
+ top_delta="0"
+ left_delta="18"
+ name="low_detail_text"
+ width="200"
+ height="14">Generate Level of Detail: Low</text>
+ <icon
+ top_pad="10"
+ left_delta="-18"
+ width="13"
+ height="12"
+ image_name="model_wizard\check_mark.png"/>
+ <text
+ top_delta="0"
+ left_delta="18"
+ name="lowest_detail_text"
+ width="200"
+ height="14">Generate Level of Detail: Lowest</text>
+ </panel>
+ <panel
+ top_delta="0"
+ left_delta="0"
+ height="270"
+ width="505"
+ name="content2"
+ 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>
+
+ <slider
+ follows="left|top"
+ height="20"
+ increment="1"
+ layout="topleft"
+ left="204"
+ max_val="3"
+ initial_value="2"
+ min_val="0"
+ name="accuracy_slider"
+ show_text="false"
+ top="130"
+ width="290" />
+ <text
+ font="SansSerifSmall"
+ top_pad="0"
+ width="300"
+ 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
+ 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>
+ </panel>
+
+ <panel
+ height="388"
+ top_delta="0"
+ name="physics_panel"
+ visible="false"
+ 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"
+ top="3"
+ height="10"
+ font="SansSerifBig"
+ text_color="White"
+ layout="topleft">
+ Physics
+ </text>
+ </panel>
+ <text
+ top_pad="10"
+ width="474"
+ height="50"
+ font="SansSerifSmall"
+ layout="topleft"
+ 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:
+ </text>
+ <panel
+ top_delta="44"
+ left="15"
+ height="270"
+ width="505"
+ name="content"
+ bg_opaque_color="DkGray2"
+ background_visible="true"
+ background_opaque="true">
+ <text top="15" left="20" text_color="White" font="SansSerifSmallBold" width="110" height="30" wrap="true" halign="center">Higher 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="15" left="372" text_color="White" font="SansSerifSmallBold" width="90" height="30" wrap="true" halign="center">Higher 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>
+
+ <slider
+ follows="left|top"
+ height="22"
+ increment=".1"
+ layout="topleft"
+ left="20"
+ max_val="1"
+ initial_value="0.5"
+ min_val="0"
+ name="physics_slider"
+ 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:
+ </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">
+ <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"/>
+ <text top="60" width="180" text_color="White" left="225" name="streaming cost" height="20">Resource Cost: [COST]</text>
+ </panel>
+ </panel>
+
+ <panel
+ height="388"
+ top_delta="0"
+ name="review_panel"
+ visible="false"
+ 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">
+ Review
+ </text>
+ </panel>
+ <text
+ 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"
+ 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"/>
+ </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>
+
+
+
+
+ <panel
+ height="388"
+ top_delta="0"
+ name="upload_panel"
+ visible="false"
+ 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"
+ top="3"
+ text_color="White"
+ height="10"
+ font="SansSerifBig"
+ layout="topleft">
+ Upload Complete!
+ </text>
+ </panel>
+ <text
+ top_pad="14"
+ width="474"
+ height="20"
+ font="SansSerifSmall"
+ layout="topleft"
+ name="description"
+ 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.
+ </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"
+ width="90"
+ height="22"
+ name="back"
+ label="&lt;&lt; Back" />
+ <button
+ top_delta="0"
+ right="-150"
+ width="90"
+ height="22"
+ name="next"
+ label="Next &gt;&gt; " />
+ <button
+ top_delta="0"
+ right="-150"
+ width="90"
+ height="22"
+ visible="false"
+ name="upload"
+ tool_tip="Upload to simulator"
+ label="Upload" />
+ <button
+ top_delta="0"
+ right="-15"
+ width="90"
+ height="22"
+ name="cancel"
+ label="Cancel" />
+ <button
+ top_delta="0"
+ right="-15"
+ width="90"
+ height="22"
+ name="close"
+ visible="false"
+ label="Close" />
+ <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_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>
+ <!-- Text to display in physics layer combo box for "all layers" -->
+
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_postcard.xml b/indra/newview/skins/default/xui/en/floater_postcard.xml
index b4ecedd981..8da35e9d7f 100644
--- a/indra/newview/skins/default/xui/en/floater_postcard.xml
+++ b/indra/newview/skins/default/xui/en/floater_postcard.xml
@@ -36,6 +36,7 @@
Recipient&apos;s Email:
</text>
<line_editor
+ control_name="LastPostcardRecipient"
follows="left|top"
height="20"
layout="topleft"
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 a17cf8eea8..9f6199fada 100644
--- a/indra/newview/skins/default/xui/en/floater_preview_gesture.xml
+++ b/indra/newview/skins/default/xui/en/floater_preview_gesture.xml
@@ -120,14 +120,14 @@
font.style="BOLD"
name="key_label"
top_pad="10"
- width="150">
+ width="130">
Shortcut Key:
</text>
<combo_box
height="20"
label="None"
layout="topleft"
- left_delta="154"
+ left_delta="135"
name="modifier_combo"
top_delta="-4"
width="55" />
diff --git a/indra/newview/skins/default/xui/en/floater_price_for_listing.xml b/indra/newview/skins/default/xui/en/floater_price_for_listing.xml
new file mode 100644
index 0000000000..6312366b86
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_price_for_listing.xml
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ legacy_header_height="18"
+ can_minimize="false"
+ height="240"
+ layout="topleft"
+ name="price_for_listing"
+ help_topic="price_for_listing"
+ title="PUBLISH CLASSIFIED AD"
+ width="320">
+ <text
+ type="string"
+ length="1"
+ bottom="200"
+ follows="top|left"
+ font="SansSerif"
+ height="165"
+ layout="topleft"
+ left="15"
+ word_wrap="true"
+ name="explanation_text">
+ Your classified ad will run for one week from the day it is published.
+
+Your ad&apos;s position in the classified listings is determined by how much you choose to pay.
+
+The highest paid ads go to the top of the list, and appear higher in searches.
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="top|right"
+ font="SansSerif"
+ height="20"
+ layout="topleft"
+ left="140"
+ name="price_text"
+ top_delta="135"
+ width="85">
+ Price for Ad:
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="top|right"
+ font="SansSerif"
+ height="20"
+ layout="topleft"
+ left_pad="4"
+ name="price_symbol"
+ top_delta="0"
+ width="20">
+ L$
+ </text>
+ <line_editor
+ follows="top|left"
+ height="20"
+ layout="topleft"
+ left_pad="0"
+ max_length="6"
+ top_delta="-4"
+ name="price_edit"
+ width="60" />
+ <button
+ follows="top|left"
+ height="22"
+ label="OK"
+ layout="topleft"
+ left="105"
+ name="set_price_btn"
+ top_pad="22"
+ width="100" />
+ <button
+ follows="top|left"
+ height="22"
+ label="Cancel"
+ layout="topleft"
+ left_pad="5"
+ name="cancel_btn"
+ width="100" />
+
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_script_debug_panel.xml b/indra/newview/skins/default/xui/en/floater_script_debug_panel.xml
index d1db5c17ba..ce96ea232e 100644
--- a/indra/newview/skins/default/xui/en/floater_script_debug_panel.xml
+++ b/indra/newview/skins/default/xui/en/floater_script_debug_panel.xml
@@ -20,5 +20,6 @@
parse_highlights="true"
read_only="true"
width="420"
+ track_bottom="true"
word_wrap="true" />
</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 857932e51a..ec190ab656 100644
--- a/indra/newview/skins/default/xui/en/floater_snapshot.xml
+++ b/indra/newview/skins/default/xui/en/floater_snapshot.xml
@@ -11,7 +11,7 @@
save_rect="true"
save_visibility="true"
title="SNAPSHOT PREVIEW"
- width="215">
+ width="245">
<floater.string
name="unknown">
unknown
@@ -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"
diff --git a/indra/newview/skins/default/xui/en/floater_sound_devices.xml b/indra/newview/skins/default/xui/en/floater_sound_devices.xml
new file mode 100644
index 0000000000..304987c3d5
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_sound_devices.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater
+ border_visible="false"
+ border="false"
+ legacy_header_height="18"
+ can_minimize="true"
+ can_resize="false"
+ can_close="false"
+ save_dock_state="true"
+ save_visibility="true"
+ save_rect="true"
+ single_instance="true"
+ bevel_style="in"
+ height="164"
+ layout="topleft"
+ name="floater_sound_devices"
+ title="Sound Devices"
+ width="315">
+ <panel
+ layout="topleft"
+ follows="all"
+ filename="panel_sound_devices.xml"
+ name="device_settings_panel"
+ width="400"
+ left="2"
+ top="26"
+ class="panel_voice_device_settings"/>
+ <text
+ name="voice_label"
+ top="136"
+ left="12"
+ height="14"
+ width="80"
+ layout="topleft"
+ >Voice Chat</text>
+ <check_box
+ layout="topleft"
+ control_name="EnableVoiceChat"
+ follows="bottom|left"
+ top="138"
+ left="80"
+ name="enable_voice"
+ width="100"
+ height="14"
+ label="Enabled"
+ />
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml
index 85182c1c28..40bf7bfed7 100644
--- a/indra/newview/skins/default/xui/en/floater_tools.xml
+++ b/indra/newview/skins/default/xui/en/floater_tools.xml
@@ -295,22 +295,24 @@
width="100">
þ: [COUNT]
</text>
- <check_box
+ <check_box
control_name="ScaleUniform"
height="19"
label=""
layout="topleft"
left="143"
name="checkbox uniform"
- top="50"
+ top="50"
width="20" />
<text
height="19"
label="Stretch Both Sides"
- left="163"
+ left_delta="20"
name="checkbox uniform label"
- top="55"
+ top_delta="2"
width="120"
+ layout="topleft"
+ follows="top|left"
wrap="true">
Stretch Both Sides
</text>
@@ -323,6 +325,7 @@
left="143"
name="checkbox stretch textures"
top_pad="-6"
+ follows="left|top"
width="134" />
<check_box
control_name="SnapEnabled"
@@ -361,9 +364,10 @@
image_selected="ForwardArrow_Press"
image_unselected="ForwardArrow_Off"
layout="topleft"
+ follows="top|left"
name="Options..."
tool_tip="See more grid options"
- top_delta="0"
+ top_pad="-22"
right="-10"
width="18"
height="23" >
@@ -745,18 +749,73 @@
<button.commit_callback
function="BuildTool.applyToSelection"/>
</button>
- <text
+ <text
+ text_color="LtGray_50"
+ type="string"
+ length="1"
+ height="10"
+ follows="left|top"
+ halign="right"
+ layout="topleft"
+ right="-10"
+ name="obj_count"
+ top_pad="5"
+ width="143">
+ Objects: [COUNT]
+ </text>
+ <text
text_color="LtGray_50"
type="string"
length="1"
- height="10"
+ height="10"
follows="left|top"
halign="right"
layout="topleft"
right="-10"
- name="obj_count"
- top_pad="7"
+ name="prim_count"
width="143">
+ Prims: [COUNT]
+ </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">
+ Linked Sets: [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="-120"
+ name="object_count"
+ width="80">
Objects: [COUNT]
</text>
<text
@@ -766,11 +825,39 @@
follows="left|top"
halign="right"
layout="topleft"
- right="-10"
- name="prim_count"
- width="143">
- Prims: [COUNT]
+ top_delta="0"
+ 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" -->
+ <!-- length="1" -->
+ <!-- height="10" -->
+ <!-- follows="left|top" -->
+ <!-- halign="right" -->
+ <!-- layout="topleft" -->
+ <!-- right="-10" -->
+ <!-- name="obj_count" -->
+ <!-- top_pad="5" -->
+ <!-- width="143"> -->
+ <!-- Objects: [COUNT] -->
+ <!-- </text> -->
+ <!-- <text -->
+ <!-- text_color="LtGray_50" -->
+ <!-- type="string" -->
+ <!-- length="1" -->
+ <!-- follows="left|top" -->
+ <!-- halign="right" -->
+ <!-- layout="topleft" -->
+ <!-- right="-10" -->
+ <!-- name="prim_count" -->
+ <!-- width="143"> -->
+ <!-- Prims: [COUNT] -->
+ <!-- </text> -->
<tab_container
follows="left|top"
height="410"
@@ -783,7 +870,8 @@
tab_height="25"
top="173"
width="295">
- <panel
+
+<panel
border="false"
follows="all"
label="General"
@@ -1253,7 +1341,7 @@ even though the user gets a free copy.
<panel
border="false"
follows="all"
- height="367"
+ height="567"
label="Object"
layout="topleft"
left_delta="0"
@@ -1372,7 +1460,7 @@ even though the user gets a free copy.
label_width="10"
layout="topleft"
left_delta="0"
- max_val="10"
+ max_val="64"
min_val="0.01"
name="Scale X"
text_enabled_color="1 1 1 1"
@@ -1387,7 +1475,7 @@ even though the user gets a free copy.
label_width="10"
layout="topleft"
left_delta="0"
- max_val="10"
+ max_val="64"
min_val="0.01"
name="Scale Y"
text_enabled_color="1 1 1 1"
@@ -1402,7 +1490,7 @@ even though the user gets a free copy.
label_width="10"
layout="topleft"
left_delta="0"
- max_val="10"
+ max_val="64"
min_val="0.01"
name="Scale Z"
text_enabled_color="1 1 1 1"
@@ -1468,7 +1556,6 @@ even though the user gets a free copy.
text_enabled_color="1 1 1 1"
top_pad="3"
width="87" />
-
<!-- <text
type="string"
length="1"
@@ -1521,41 +1608,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"
@@ -1856,26 +1908,26 @@ even though the user gets a free copy.
<spinner
follows="left|top"
height="19"
- increment="0.025"
+ increment="0.02"
initial_value="0"
label="B"
label_width="10"
layout="topleft"
left_delta="0"
- max_val="0.95"
+ max_val="0.98"
name="Path Limit Begin"
top_pad="3"
width="68" />
<spinner
follows="left|top"
height="19"
- increment="0.025"
+ increment="0.02"
initial_value="1"
label="E"
label_width="10"
layout="topleft"
left_pad="10"
- min_val="0.05"
+ min_val="0.02"
name="Path Limit End"
top_delta="0"
width="68" />
@@ -2046,6 +2098,10 @@ 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>
</panel>
<panel
@@ -2060,6 +2116,9 @@ even though the user gets a free copy.
name="Features"
top_delta="0"
width="295">
+ <panel.string name="None">None</panel.string>
+ <panel.string name="Prim">Prim</panel.string>
+ <panel.string name="Convex Hull">Convex Hull</panel.string>
<text
type="string"
length="1"
@@ -2202,6 +2261,7 @@ even though the user gets a free copy.
name="FlexForceZ"
top_pad="4"
width="128" />
+
<check_box
height="16"
label="Light"
@@ -2312,6 +2372,119 @@ even though the user gets a free copy.
mouse_opaque="true"
name="Light Ambiance"
width="120" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ name="label physicsshapetype"
+ top="38"
+ width="121">
+ Physics Shape Type:
+ </text>
+ <combo_box
+ height="19"
+ top_delta="15"
+ layout="topleft"
+ follows="left|top"
+ 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"
+ height="19"
+ increment="1"
+ initial_value="1"
+ label="Gravity"
+ label_width="70"
+ layout="topleft"
+ min_val="-1"
+ max_val="28"
+ name="Physics Gravity"
+ top_pad="10"
+ width="132" />
+
+ <spinner
+ follows="left|top"
+ height="19"
+ increment="0.1"
+ initial_value="0"
+ label="Friction"
+ label_width="70"
+ layout="topleft"
+ left_delta="0"
+ max_val="255"
+ min_val="0"
+ name="Physics Friction"
+ top_pad="4"
+ width="132" />
+
+ <spinner
+ follows="left|top"
+ height="19"
+ increment="0.1"
+ initial_value="0"
+ label="Density"
+ label_width="70"
+ layout="topleft"
+ left_delta="0"
+ max_val="22587"
+ min_val="1"
+ name="Physics Density"
+ top_pad="4"
+ width="132" />
+
+ <spinner
+ follows="left|top"
+ height="19"
+ increment="0.01"
+ initial_value="0"
+ label="Restitution"
+ label_width="70"
+ layout="topleft"
+ left_delta="0"
+ max_val="1"
+ min_val="0"
+ name="Physics Restitution"
+ top_pad="4"
+ width="132" />
</panel>
<panel
border="false"
@@ -2378,7 +2551,7 @@ even though the user gets a free copy.
initial_value="0"
layout="topleft"
left_delta="0"
- max_val="90"
+ max_val="100"
name="ColorTrans"
top_pad="4"
width="80" />
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_windlight_options.xml b/indra/newview/skins/default/xui/en/floater_windlight_options.xml
index 249ad95c41..7923dd87fa 100644
--- a/indra/newview/skins/default/xui/en/floater_windlight_options.xml
+++ b/indra/newview/skins/default/xui/en/floater_windlight_options.xml
@@ -22,13 +22,13 @@
left="10"
name="KeyFramePresetsText"
top="34"
- width="85">
+ width="135">
Sky Presets:
</text>
<combo_box
height="23"
layout="topleft"
- left_delta="85"
+ left_delta="135"
name="WLPresetsCombo"
top_delta="-4"
width="150" />
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 e5ae0b950a..3ead67ca57 100644
--- a/indra/newview/skins/default/xui/en/main_view.xml
+++ b/indra/newview/skins/default/xui/en/main_view.xml
@@ -8,12 +8,6 @@
tab_stop="false"
name="main_view"
width="1024">
- <panel top="0"
- follows="all"
- height="768"
- mouse_opaque="false"
- name="login_panel_holder"
- width="1024"/>
<layout_stack border_size="0"
follows="all"
mouse_opaque="false"
@@ -133,7 +127,14 @@
user_resize="false"
visible="false"
width="333"/>
- </layout_stack>
+ </layout_stack>
+ <panel top="0"
+ follows="all"
+ height="500"
+ mouse_opaque="false"
+ name="login_panel_holder"
+ width="1024"/>
+
<panel follows="all"
height="500"
left="0"
@@ -171,6 +172,7 @@
top="0"
width="1024"
visible="false"/>
+
<view mouse_opaque="false"
follows="all"
name="menu_bar_holder"
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 90e8db3709..b36b82ebd8 100644
--- a/indra/newview/skins/default/xui/en/menu_inventory_add.xml
+++ b/indra/newview/skins/default/xui/en/menu_inventory_add.xml
@@ -42,6 +42,30 @@
<menu_item_call.on_enable
function="File.EnableUpload" />
</menu_item_call>
+ <menu_item_call
+ label="Model..."
+ layout="topleft"
+ name="Upload Model">
+ <menu_item_call.on_click
+ function="File.UploadModel"
+ parameter="" />
+ <menu_item_call.on_enable
+ function="File.EnableUploadModel" />
+ <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
label="Bulk (L$[COST] per file)..."
layout="topleft"
@@ -239,4 +263,4 @@
parameter="eyes" />
</menu_item_call>
</menu>
-</menu> \ No newline at end of file
+</menu>
diff --git a/indra/newview/skins/default/xui/en/menu_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_model_import_gear_default.xml b/indra/newview/skins/default/xui/en/menu_model_import_gear_default.xml
new file mode 100644
index 0000000000..2650903f88
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_model_import_gear_default.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<toggleable_menu
+ bottom="806"
+ layout="topleft"
+ left="0"
+ mouse_opaque="false"
+ name="model_menu_gear_default"
+ visible="false">
+ <menu_item_check
+ label="Show edges"
+ layout="topleft"
+ name="show_edges">
+ <on_click
+ function="ModelImport.ViewOption.Action"
+ parameter="show_edges" />
+ <on_check
+ function="ModelImport.ViewOption.Check"
+ parameter="show_edges" />
+ <on_enable
+ function="ModelImport.ViewOption.Enabled"
+ parameter="show_edges" />
+ </menu_item_check>
+ <menu_item_check
+ label="Show physics"
+ layout="topleft"
+ name="show_physics">
+ <on_click
+ function="ModelImport.ViewOption.Action"
+ parameter="show_physics" />
+ <on_check
+ function="ModelImport.ViewOption.Check"
+ parameter="show_physics" />
+ <on_enable
+ function="ModelImport.ViewOption.Enabled"
+ parameter="show_physics" />
+ </menu_item_check>
+ <menu_item_check
+ label="Show textures"
+ layout="topleft"
+ name="show_textures">
+ <on_click
+ function="ModelImport.ViewOption.Action"
+ parameter="show_textures" />
+ <on_check
+ function="ModelImport.ViewOption.Check"
+ parameter="show_textures" />
+ <on_enable
+ function="ModelImport.ViewOption.Enabled"
+ parameter="show_textures" />
+ </menu_item_check>
+ <menu_item_check
+ label="Show skin weight"
+ layout="topleft"
+ name="show_skin_weight">
+ <on_click
+ function="ModelImport.ViewOption.Action"
+ parameter="show_skin_weight" />
+ <on_check
+ function="ModelImport.ViewOption.Check"
+ parameter="show_skin_weight" />
+ <on_enable
+ function="ModelImport.ViewOption.Enabled"
+ parameter="show_skin_weight" />
+ </menu_item_check>
+ <menu_item_check
+ label="Show joint positions"
+ layout="topleft"
+ name="show_joint_positions">
+ <on_click
+ function="ModelImport.ViewOption.Action"
+ parameter="show_joint_positions" />
+ <on_check
+ function="ModelImport.ViewOption.Check"
+ parameter="show_joint_positions" />
+ <on_enable
+ function="ModelImport.ViewOption.Enabled"
+ parameter="show_joint_positions" />
+ </menu_item_check>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index 51610c0ae0..81046e99a0 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -89,7 +89,7 @@
visibility_control="VoiceMorphingEnabled">
<menu_item_check.on_check
function="Floater.Visible"
- parameter="voice_effect" />
+ Parameter="voice_effect" />
<menu_item_check.on_click
function="Floater.Toggle"
parameter="voice_effect" />
@@ -972,6 +972,30 @@
parameter="Upload Animation" />
</menu_item_call>
<menu_item_call
+ label="Model..."
+ layout="topleft"
+ name="Upload Model">
+ <menu_item_call.on_click
+ function="File.UploadModel"
+ parameter="" />
+ <menu_item_call.on_enable
+ function="File.EnableUploadModel" />
+ <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
label="Bulk (L$[COST] per file)..."
layout="topleft"
name="Bulk Upload">
@@ -1342,15 +1366,15 @@
parameter="character" />
</menu_item_check>
<menu_item_check
- label="SurfacePath"
- name="SurfacePath"
+ label="Surface Patch"
+ name="Surface Patch"
shortcut="control|alt|shift|5">
<menu_item_check.on_check
function="Advanced.CheckRenderType"
- parameter="surfacePath" />
+ parameter="surfacePatch" />
<menu_item_check.on_click
function="Advanced.ToggleRenderType"
- parameter="surfacePath" />
+ parameter="surfacePatch" />
</menu_item_check>
<menu_item_check
label="Sky"
@@ -1877,6 +1901,16 @@
function="Advanced.ToggleConsole"
parameter="memory view" />
</menu_item_check>
+ <menu_item_check
+ label="Scene Statistics"
+ name="Scene Statistics">
+ <menu_item_check.on_check
+ function="Advanced.CheckConsole"
+ parameter="scene view" />
+ <menu_item_check.on_click
+ function="Advanced.ToggleConsole"
+ parameter="scene view" />
+ </menu_item_check>
<menu_item_separator/>
@@ -1961,6 +1995,17 @@
function="ToggleControl"
parameter="DebugShowTime" />
</menu_item_check>
+ <menu_item_check
+ label="Show Upload Cost"
+ layout="topleft"
+ name="Show Upload Cost">
+ <menu_item_check.on_check
+ function="CheckControl"
+ parameter="DebugShowUploadCost" />
+ <menu_item_check.on_click
+ function="ToggleControl"
+ parameter="DebugShowUploadCost" />
+ </menu_item_check>
<menu_item_check
label="Show Render Info"
name="Show Render Info">
@@ -2144,6 +2189,16 @@
parameter="bboxes" />
</menu_item_check>
<menu_item_check
+ label="Normals"
+ name="Normals">
+ <menu_item_check.on_check
+ function="Advanced.CheckInfoDisplay"
+ parameter="normals" />
+ <menu_item_check.on_click
+ function="Advanced.ToggleInfoDisplay"
+ parameter="normals" />
+ </menu_item_check>
+ <menu_item_check
label="Octree"
name="Octree">
<menu_item_check.on_check
@@ -2164,6 +2219,16 @@
parameter="shadow frusta" />
</menu_item_check>
<menu_item_check
+ label="Physics Shapes"
+ name="Physics Shapes">
+ <menu_item_check.on_check
+ function="Advanced.CheckInfoDisplay"
+ parameter="physics shapes" />
+ <menu_item_check.on_click
+ function="Advanced.ToggleInfoDisplay"
+ parameter="physics shapes" />
+ </menu_item_check>
+ <menu_item_check
label="Occlusion"
name="Occlusion">
<menu_item_check.on_check
@@ -2234,6 +2299,26 @@
parameter="face area" />
</menu_item_check>
<menu_item_check
+ label="LOD Info"
+ name="LOD Info">
+ <menu_item_check.on_check
+ function="Advanced.CheckInfoDisplay"
+ parameter="lod info" />
+ <menu_item_check.on_click
+ function="Advanced.ToggleInfoDisplay"
+ parameter="lod info" />
+ </menu_item_check>
+ <menu_item_check
+ label="Build Queue"
+ name="Build Queue">
+ <menu_item_check.on_check
+ function="Advanced.CheckInfoDisplay"
+ parameter="build queue" />
+ <menu_item_check.on_click
+ function="Advanced.ToggleInfoDisplay"
+ parameter="build queue" />
+ </menu_item_check>
+ <menu_item_check
label="Lights"
name="Lights">
<menu_item_check.on_check
@@ -2263,6 +2348,16 @@
function="Advanced.ToggleInfoDisplay"
parameter="raycast" />
</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"
@@ -2319,19 +2414,6 @@
<menu_item_check.on_enable
function="Advanced.EnableObjectObjectOcclusion" />
</menu_item_check>
- <menu_item_check
- label="Framebuffer Objects"
- name="Framebuffer Objects">
- <menu_item_check.on_check
- function="CheckControl"
- parameter="RenderUseFBO" />
- <menu_item_check.on_click
- function="ToggleControl"
- parameter="RenderUseFBO" />
- <menu_item_check.on_enable
- function="Advanced.EnableRenderFBO" />
- </menu_item_check>
-
<menu_item_separator />
<menu_item_check
@@ -2696,7 +2778,7 @@
<menu_item_call
label="Web Content Browser"
name="Web Content Browser"
- shortcut="control|alt|W">
+ shortcut="control|shift|Z">
<menu_item_call.on_click
function="Advanced.WebContentTest"
parameter="http://google.com"/>
@@ -2758,7 +2840,6 @@
function="Floater.Toggle"
parameter="region_debug_console" />
</menu_item_check>
-
<menu_item_separator />
<menu_item_check
@@ -3113,6 +3194,16 @@
function="ToggleControl"
parameter="ImagePipelineUseHTTP" />
</menu_item_check>
+ <menu_item_check
+ label="HTTP Inventory"
+ name="HTTP Inventory">
+ <menu_item_check.on_check
+ function="CheckControl"
+ parameter="UseHTTPInventory" />
+ <menu_item_check.on_click
+ function="ToggleControl"
+ parameter="UseHTTPInventory" />
+ </menu_item_check>
<menu_item_call
label="Compress Images"
name="Compress Images">
@@ -3156,7 +3247,7 @@
<menu_item_call.on_click
function="Advanced.LeaveAdminStatus" />
</menu_item_call>
- <menu_item_check
+ <menu_item_check
label="Show Admin Menu"
name="View Admin Options">
<menu_item_check.on_enable
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index 318bc9251f..ce96c488b4 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -4763,6 +4763,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"
@@ -5227,6 +5239,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.
@@ -6721,7 +6747,7 @@ Unable to find the help topic for this element.
<tag>fail</tag>
</notification>
- <notification
+ <notification
icon="alertmodal.tga"
name="ObjectMediaFailure"
type="alertmodal">
@@ -6753,6 +6779,17 @@ Your voice has been muted by moderator.
name="okbutton"
yestext="OK"/>
</notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="UploadCostConfirmation"
+ type="alertmodal">
+This upload will cost L$[PRICE], do you wish to continue with the upload?
+ <usetemplate
+ name="okcancelbuttons"
+ notext="Cancel"
+ yestext="Upload"/>
+ </notification>
<notification
icon="alertmodal.tga"
@@ -6781,6 +6818,14 @@ The button will be shown when there is enough space for it.
type="notifytip">
Select residents to share with.
</notification>
+
+ <notification
+ name="MeshUploadError"
+ icon="alert.tga"
+ type="alert">
+ [LABEL] failed to upload: [MESSAGE] [IDENTIFIER] [INVALIDITY_IDENTIFIER]
+ </notification>
+
<notification
icon="notifytip.tga"
name="ShareItemsConfirmation"
@@ -6817,6 +6862,34 @@ Deed to group failed.
<notification
icon="notifytip.tga"
+ name="ReleaseLandThrottled"
+ type="notifytip">
+The parcel [PARCEL_NAME] can not be abandoned at this time.
+ <tag>fail</tag>
+ </notification>
+
+ <notification
+ icon="notifytip.tga"
+ name="ReleasedLandWithReclaim"
+ type="notifytip">
+The [AREA] m² parcel &apos;[PARCEL_NAME]&apos; has been released.
+
+You will have [RECLAIM_PERIOD] hours to reclaim for L$0 before it is set for sale to anyone.
+ <tag>fail</tag>
+ </notification>
+
+ <notification
+ icon="notifytip.tga"
+ name="ReleasedLandNoReclaim"
+ type="notifytip">
+The [AREA] m² parcel &apos;[PARCEL_NAME]&apos; has been released.
+
+It is now available for purchase by anyone.
+ <tag>fail</tag>
+ </notification>
+
+ <notification
+ icon="notifytip.tga"
name="AvatarRezNotification"
type="notifytip">
( [EXISTENCE] seconds alive )
@@ -6967,7 +7040,6 @@ Mute everyone?
notext="Cancel"
unique="true"/>
</notification>
-
<notification
name="HintChat"
label="Chat"
@@ -7146,6 +7218,20 @@ The site at &apos;&lt;nolink&gt;[HOST_NAME]&lt;/nolink&gt;&apos; in realm &apos;
</notification>
<notification
+ name="NoPlaceInfo"
+ label=""
+ type="alertmodal"
+ unique="true">
+ <tag>fail</tag>
+ <tag>confirm</tag>
+ Viewing place profile is only available in Advanced mode. Would you like to quit and change modes? The mode selector can be found on the login screen.
+ <usetemplate
+ name="okcancelbuttons"
+ yestext="Quit"
+ notext="Don't Quit"/>
+ </notification>
+
+ <notification
name="NoPicks"
label=""
type="alertmodal"
@@ -7214,10 +7300,48 @@ The site at &apos;&lt;nolink&gt;[HOST_NAME]&lt;/nolink&gt;&apos; in realm &apos;
yestext="Quit"
notext="Don't Quit"/>
</notification>
-
- <global name="UnsupportedCPU">
-- Your CPU speed does not meet the minimum requirements.
- </global>
+
+ <notification
+ name="NoInventory"
+ label=""
+ type="alertmodal"
+ unique="true">
+ <tag>fail</tag>
+ <tag>confirm</tag>
+ Viewing inventory is only available in Advanced mode. Would you like to logout and change modes?
+ <usetemplate
+ name="okcancelbuttons"
+ yestext="Quit"
+ notext="Don't Quit"/>
+ </notification>
+
+ <notification
+ name="NoAppearance"
+ label=""
+ type="alertmodal"
+ unique="true">
+ <tag>fail</tag>
+ <tag>confirm</tag>
+ The appearance editor is only available in Advanced mode. Would you like to logout and change modes?
+ <usetemplate
+ name="okcancelbuttons"
+ yestext="Quit"
+ notext="Don't Quit"/>
+ </notification>
+
+ <notification
+ name="NoSearch"
+ label=""
+ type="alertmodal"
+ unique="true">
+ <tag>fail</tag>
+ <tag>confirm</tag>
+ Search is only available in Advanced mode. Would you like to logout and change modes?
+ <usetemplate
+ name="okcancelbuttons"
+ yestext="Quit"
+ notext="Don't Quit"/>
+ </notification>
<global name="UnsupportedGLRequirements">
You do not appear to have the proper hardware requirements for [APP_NAME]. [APP_NAME] requires an OpenGL graphics card that has multitexture support. If this is the case, you may want to make sure that you have the latest drivers for your graphics card, and service packs and patches for your operating system.
diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
index a92cc886e7..c8f8d07701 100644
--- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml
+++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
@@ -5,121 +5,121 @@
bg_opaque_color="DkGray"
chrome="true"
follows="left|bottom|right"
- focus_root="true"
+ focus_root="true"
height="33"
layout="topleft"
left="0"
name="bottom_tray"
top="28"
width="1310">
- <string
+ <string
name="DragIndicationImageName"
value="Accordion_ArrowOpened_Off" />
- <string
+ <string
name="SpeakBtnToolTip"
value="Turns microphone on/off" />
- <string
+ <string
name="VoiceControlBtnToolTip"
value="Shows/hides voice control panel" />
- <layout_stack
+ <layout_stack
border_size="0"
clip="false"
follows="all"
height="28"
- layout="topleft"
- left="0"
+ layout="topleft"
+ left="0"
mouse_opaque="false"
name="toolbar_stack"
orientation="horizontal"
top="0"
width="1310">
- <layout_panel
+ <layout_panel
auto_resize="false"
- user_resize="false"
+ user_resize="false"
min_width="2"
width="2" />
- <layout_panel
+ <layout_panel
auto_resize="false"
layout="topleft"
max_width="320"
min_width="214"
- height="28"
+ height="28"
mouse_opaque="false"
- name="chat_bar_layout_panel"
+ name="chat_bar_layout_panel"
user_resize="true"
- width="310" >
+ width="310" >
<panel
name="chat_bar"
filename="panel_nearby_chat_bar.xml"
left="0"
height="28"
- width="308"
+ width="308"
top="0"
mouse_opaque="false"
follows="left|right"
/>
- </layout_panel>
- <!--
+ </layout_panel>
+ <!--
This 5px Panel is an indicator of where the resize handle is.
The panel provides a gap between the resize handle icon and a button to the right.
-->
- <layout_panel
- auto_resize="false"
- layout="topleft"
- max_width="5"
- min_width="5"
- name="chat_bar_resize_handle_panel"
- user_resize="false"
- width="5">
- <icon
- follows="top|right"
- height="25"
- image_name="ChatBarHandle"
- layout="topleft"
- left="-7"
- name="resize_handle"
- top="4"
- width="5" />
- </layout_panel>
- <layout_panel
- auto_resize="false"
- follows="left|right"
- height="28"
- layout="topleft"
- min_height="28"
- min_width="59"
- mouse_opaque="false"
- name="speak_panel"
- top_delta="0"
- user_resize="false"
- width="108">
- <talk_button
- follows="left|right"
- height="23"
- layout="topleft"
- left="0"
- name="talk"
- top="5"
- width="105">
- <show_button
- tab_stop="true">
- <init_callback
- function="Button.SetDockableFloaterToggle"
- parameter="voice_controls" />
- </show_button>
- <!-- do not remove halign attribute with default value. otherwise it can't be overridden in other locales.
+ <layout_panel
+ auto_resize="false"
+ layout="topleft"
+ max_width="5"
+ min_width="5"
+ name="chat_bar_resize_handle_panel"
+ user_resize="false"
+ width="5">
+ <icon
+ follows="top|right"
+ height="25"
+ image_name="ChatBarHandle"
+ layout="topleft"
+ left="-7"
+ name="resize_handle"
+ top="4"
+ width="5" />
+ </layout_panel>
+ <layout_panel
+ auto_resize="false"
+ follows="left|right"
+ height="28"
+ layout="topleft"
+ min_height="28"
+ min_width="59"
+ mouse_opaque="false"
+ name="speak_panel"
+ top_delta="0"
+ user_resize="false"
+ width="108">
+ <talk_button
+ follows="left|right"
+ height="23"
+ layout="topleft"
+ left="0"
+ name="talk"
+ top="5"
+ width="105">
+ <show_button
+ tab_stop="true">
+ <init_callback
+ function="Button.SetDockableFloaterToggle"
+ parameter="voice_controls" />
+ </show_button>
+ <!-- do not remove halign attribute with default value. otherwise it can't be overridden in other locales.
& pad_right is default value for long label which can be right aligned. See EXT-6318 -->
- <speak_button
- halign="center"
- label="Speak"
- label_selected="Speak"
- name="speak_btn"
- pad_right="20"
- tab_stop="true"
- use_ellipses="true" />
- </talk_button>
- </layout_panel>
- <layout_panel
+ <speak_button
+ halign="center"
+ label="Speak"
+ label_selected="Speak"
+ name="speak_btn"
+ pad_right="20"
+ tab_stop="true"
+ use_ellipses="true" />
+ </talk_button>
+ </layout_panel>
+ <layout_panel
auto_resize="false"
follows="right"
height="28"
@@ -131,7 +131,7 @@
top_delta="0"
user_resize="false"
width="85">
- <gesture_combo_list
+ <gesture_combo_list
follows="left|right"
height="23"
label="Gesture"
@@ -141,46 +141,46 @@
tool_tip="Shows/hides gestures"
top="5"
width="82">
- <combo_button
+ <combo_button
pad_right="10"
use_ellipses="true" />
- <combo_list
+ <combo_list
page_lines="17" />
- </gesture_combo_list>
- </layout_panel>
- <layout_panel
+ </gesture_combo_list>
+ </layout_panel>
+ <layout_panel
auto_resize="false"
- follows="right"
- height="28"
- layout="topleft"
- min_height="28"
- min_width="52"
- mouse_opaque="false"
- name="movement_panel"
- user_resize="false"
- width="83">
- <bottomtray_button
- follows="left|right"
- height="23"
- image_pressed="PushButton_Press"
- image_pressed_selected="PushButton_Selected_Press"
- image_selected="PushButton_Selected_Press"
- is_toggle="true"
- label="Move"
- layout="topleft"
- name="movement_btn"
- tool_tip="Shows/hides movement controls"
- top="5"
- use_ellipses="true"
- width="80">
- <init_callback
- function="Button.SetDockableFloaterToggle"
- parameter="moveview" />
- </bottomtray_button>
+ follows="right"
+ height="28"
+ layout="topleft"
+ min_height="28"
+ min_width="52"
+ mouse_opaque="false"
+ name="movement_panel"
+ user_resize="false"
+ width="83">
+ <bottomtray_button
+ follows="left|right"
+ height="23"
+ image_pressed="PushButton_Press"
+ image_pressed_selected="PushButton_Selected_Press"
+ image_selected="PushButton_Selected_Press"
+ is_toggle="true"
+ label="Move"
+ layout="topleft"
+ name="movement_btn"
+ tool_tip="Shows/hides movement controls"
+ top="5"
+ use_ellipses="true"
+ width="80">
+ <init_callback
+ function="Button.SetDockableFloaterToggle"
+ parameter="moveview" />
+ </bottomtray_button>
- </layout_panel>
- <layout_panel
- auto_resize="false"
+ </layout_panel>
+ <layout_panel
+ auto_resize="false"
follows="left|right"
height="28"
layout="topleft"
@@ -190,7 +190,7 @@
name="cam_panel"
user_resize="false"
width="83">
- <bottomtray_button
+ <bottomtray_button
follows="left|right"
height="23"
image_pressed="PushButton_Press"
@@ -205,83 +205,83 @@
top="5"
use_ellipses="true"
width="80">
- <init_callback
+ <init_callback
function="Button.SetDockableFloaterToggle"
parameter="camera" />
- </bottomtray_button>
- </layout_panel>
- <layout_panel
+ </bottomtray_button>
+ </layout_panel>
+ <layout_panel
auto_resize="false"
follows="left|right"
height="28"
layout="topleft"
- min_width="40"
- mouse_opaque="false"
- name="snapshot_panel"
- user_resize="false"
- width="39">
- <bottomtray_button
- follows="left|right"
- height="23"
- image_overlay="Snapshot_Off"
- image_pressed="PushButton_Press"
- image_pressed_selected="PushButton_Selected_Press"
- image_selected="PushButton_Selected_Press"
- is_toggle="true"
- layout="topleft"
- left="0"
- name="snapshots"
- tool_tip="Take snapshot"
- top="5"
- width="36">
- <init_callback
- function="Button.SetFloaterToggle"
- parameter="snapshot" />
- </bottomtray_button>
- </layout_panel>
- <layout_panel
- auto_resize="false"
- follows="left|right"
- height="28"
- layout="topleft"
- min_height="28"
- min_width="52"
- mouse_opaque="false"
- name="build_btn_panel"
- user_resize="false"
- width="83">
-<!--*FIX: Build Floater is not opened with default registration. Will be fixed soon.
+ min_width="40"
+ mouse_opaque="false"
+ name="snapshot_panel"
+ user_resize="false"
+ width="39">
+ <bottomtray_button
+ follows="left|right"
+ height="23"
+ image_overlay="Snapshot_Off"
+ image_pressed="PushButton_Press"
+ image_pressed_selected="PushButton_Selected_Press"
+ image_selected="PushButton_Selected_Press"
+ is_toggle="true"
+ layout="topleft"
+ left="0"
+ name="snapshots"
+ tool_tip="Take snapshot"
+ top="5"
+ width="36">
+ <init_callback
+ function="Button.SetFloaterToggle"
+ parameter="snapshot" />
+ </bottomtray_button>
+ </layout_panel>
+ <layout_panel
+ auto_resize="false"
+ follows="left|right"
+ height="28"
+ layout="topleft"
+ min_height="28"
+ min_width="52"
+ mouse_opaque="false"
+ name="build_btn_panel"
+ user_resize="false"
+ width="83">
+ <!--*FIX: Build Floater is not opened with default registration. Will be fixed soon.
Disabled for now.
-->
- <bottomtray_button
- follows="left|right"
- height="23"
- image_pressed="PushButton_Press"
- image_pressed_selected="PushButton_Selected_Press"
- image_selected="PushButton_Selected_Press"
- is_toggle="true"
- label="Build"
- layout="topleft"
- left="0"
- name="build_btn"
- tool_tip="Shows/hides Build Tools"
- top="5"
- use_ellipses="true"
- width="80">
- <commit_callback
- function="Build.Toggle"
- parameter="build" />
- </bottomtray_button>
- </layout_panel>
- <layout_panel
- auto_resize="false"
- follows="left|right"
- height="28"
- layout="topleft"
+ <bottomtray_button
+ follows="left|right"
+ height="23"
+ image_pressed="PushButton_Press"
+ image_pressed_selected="PushButton_Selected_Press"
+ image_selected="PushButton_Selected_Press"
+ is_toggle="true"
+ label="Build"
+ layout="topleft"
+ left="0"
+ name="build_btn"
+ tool_tip="Shows/hides Build Tools"
+ top="5"
+ use_ellipses="true"
+ width="80">
+ <commit_callback
+ function="Build.Toggle"
+ parameter="build" />
+ </bottomtray_button>
+ </layout_panel>
+ <layout_panel
+ auto_resize="false"
+ follows="left|right"
+ height="28"
+ layout="topleft"
min_height="28"
- min_width="52"
+ min_width="52"
mouse_opaque="false"
- name="search_btn_panel"
+ name="search_btn_panel"
user_resize="false"
width="83">
<bottomtray_button
@@ -341,7 +341,7 @@ Disabled for now.
height="28"
layout="topleft"
min_height="28"
- min_width="52"
+ min_width="52"
mouse_opaque="false"
name="mini_map_btn_panel"
user_resize="false"
@@ -378,7 +378,7 @@ Disabled for now.
width="189">
<!--*NOTE: min_width of the chiclet_panel (chiclet_list) must be the same
as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly. EXT-991-->
- <chiclet_panel
+ <chiclet_panel
chiclet_padding="4"
follows="left|right"
height="24"
@@ -389,7 +389,7 @@ as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly.
name="chiclet_list"
top="7"
width="189">
- <button
+ <button
auto_resize="true"
follows="right"
height="29"
@@ -406,7 +406,7 @@ as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly.
top="-28"
visible="false"
width="7" />
- <button
+ <button
auto_resize="true"
follows="right"
height="29"
@@ -423,13 +423,13 @@ as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly.
top="-28"
visible="false"
width="7" />
- </chiclet_panel>
- </layout_panel>
- <layout_panel auto_resize="false"
- user_resize="false"
+ </chiclet_panel>
+ </layout_panel>
+ <layout_panel auto_resize="false"
+ user_resize="false"
width="4"
min_width="4"/>
- <layout_panel
+ <layout_panel
auto_resize="false"
follows="right"
height="28"
@@ -440,7 +440,7 @@ as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly.
top="0"
user_resize="false"
width="37">
- <chiclet_im_well
+ <chiclet_im_well
follows="right"
height="28"
layout="topleft"
@@ -449,7 +449,7 @@ as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly.
name="im_well"
top="0"
width="35">
- <!--
+ <!--
Emulate 4 states of button by background images, see details in EXT-3147. The same should be for notification_well button
xml attribute Description
image_unselected "Unlit" - there are no new messages
@@ -457,7 +457,7 @@ image_selected "Unlit" + "Selected" - there are no new messages and the
image_pressed "Lit" - there are new messages
image_pressed_selected "Lit" + "Selected" - there are new messages and the Well is open
-->
- <button
+ <button
auto_resize="true"
follows="right"
halign="center"
@@ -472,13 +472,13 @@ image_pressed_selected "Lit" + "Selected" - there are new messages and the Well
name="Unread IM messages"
tool_tip="Conversations"
width="34">
- <init_callback
+ <init_callback
function="Button.SetDockableFloaterToggle"
parameter="im_well_window" />
- </button>
- </chiclet_im_well>
- </layout_panel>
- <layout_panel
+ </button>
+ </chiclet_im_well>
+ </layout_panel>
+ <layout_panel
auto_resize="false"
follows="right"
height="28"
@@ -489,7 +489,7 @@ image_pressed_selected "Lit" + "Selected" - there are new messages and the Well
top="0"
user_resize="false"
width="37">
- <chiclet_notification
+ <chiclet_notification
follows="right"
height="23"
layout="topleft"
@@ -498,7 +498,7 @@ image_pressed_selected "Lit" + "Selected" - there are new messages and the Well
name="notification_well"
top="5"
width="35">
- <button
+ <button
auto_resize="true"
bottom_pad="3"
follows="right"
@@ -514,17 +514,17 @@ image_pressed_selected "Lit" + "Selected" - there are new messages and the Well
name="Unread"
tool_tip="Notifications"
width="34">
- <init_callback
+ <init_callback
function="Button.SetDockableFloaterToggle"
parameter="notification_well_window" />
- </button>
- </chiclet_notification>
- </layout_panel>
- <layout_panel
- auto_resize="false"
- user_resize="false"
- min_width="4"
- name="DUMMY2"
- width="8" />
- </layout_stack>
+ </button>
+ </chiclet_notification>
+ </layout_panel>
+ <layout_panel
+ auto_resize="false"
+ user_resize="false"
+ min_width="4"
+ name="DUMMY2"
+ width="8" />
+ </layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_cof_wearables.xml b/indra/newview/skins/default/xui/en/panel_cof_wearables.xml
index f438e3d42d..bbeb592e96 100644
--- a/indra/newview/skins/default/xui/en/panel_cof_wearables.xml
+++ b/indra/newview/skins/default/xui/en/panel_cof_wearables.xml
@@ -53,9 +53,6 @@
name="list_attachments"
top="0"
width="311">
- <flat_list_view.no_items_text
- value="No attachments worn" />
- </flat_list_view>
</accordion_tab>
<accordion_tab
layout="topleft"
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_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_place_profile.xml b/indra/newview/skins/default/xui/en/panel_place_profile.xml
index 7e89860c60..774a9e8bbf 100644
--- a/indra/newview/skins/default/xui/en/panel_place_profile.xml
+++ b/indra/newview/skins/default/xui/en/panel_place_profile.xml
@@ -191,7 +191,7 @@
width="310">
<panel
bg_alpha_color="DkGray2"
- follows="left|top|right"
+ follows="left|top|right|bottom"
height="580"
layout="topleft"
left="0"
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 404537e1f2..ea09286592 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
@@ -150,7 +150,7 @@
top_pad="20"
left="30"
height="10"
- width="180">
+ width="400">
Enable incoming chat popups:
</text>
<check_box
@@ -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 d74197d965..f7666bdc4c 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
@@ -193,8 +193,18 @@
left_delta="0"
name="BumpShiny"
top_pad="1"
+ width="256" />
+ <check_box
+ control_name="RenderLocalLights"
+ height="16"
+ initial_value="true"
+ label="Local Lights"
+ layout="topleft"
+ left_delta="0"
+ name="LocalLights"
+ top_pad="1"
width="256" />
- <check_box
+ <check_box
control_name="VertexShaderEnable"
height="16"
initial_value="true"
@@ -221,7 +231,6 @@
<check_box.commit_callback
function="Pref.VertexShaderEnable" />
</check_box>
-<!-- DISABLED UNTIL WE REALLY WANT TO SUPPORT THIS
<check_box
control_name="RenderDeferred"
height="16"
@@ -248,6 +257,19 @@
<check_box.commit_callback
function="Pref.VertexShaderEnable" />
</check_box>
+ <check_box
+ control_name="RenderDepthOfField"
+ height="16"
+ initial_value="true"
+ label="Depth of Field"
+ layout="topleft"
+ left_delta="0"
+ name="UseDoF"
+ top_pad="1"
+ width="256">
+ <check_box.commit_callback
+ function="Pref.VertexShaderEnable" />
+ </check_box>
<text
type="string"
@@ -283,7 +305,7 @@
name="2"
value="2"/>
</combo_box>
--->
+
<text
type="string"
length="1"
@@ -701,7 +723,7 @@
follows="left|top"
height="12"
layout="topleft"
- left="358"
+ left="407"
left_pad="-30"
name="TerrainDetailText"
top="250"
@@ -713,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..1c22a5c02e 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"
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 f89494da72..1745c1e4b0 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>
@@ -479,163 +492,12 @@
width="190">
</button>
<panel
- background_visible="false"
- bg_alpha_color="DkGray"
+ layout="topleft"
+ filename="panel_sound_devices.xml"
visiblity_control="ShowDeviceSettings"
- border="false"
- follows="top|left"
- height="100"
- label="Device Settings"
- layout="topleft"
- left_delta="-2"
name="device_settings_panel"
- class="panel_voice_device_settings"
- width="470"
- top_pad="0">
- <panel.string
- name="default_text">
- Default
- </panel.string>
- <panel.string
- name="default system device">
- Default system device
- </panel.string>
- <panel.string
- name="no device">
- No device
- </panel.string>
- <icon
- height="18"
- image_name="Microphone_On"
- left_delta="4"
- name="microphone_icon"
- mouse_opaque="false"
- top="7"
- visible="true"
- width="18" />
- <text
- type="string"
- length="1"
- font.style="BOLD"
- follows="left|top"
- height="16"
- layout="topleft"
- left_pad="3"
- name="Input"
- width="70">
- Input
- </text>
- <combo_box
- height="23"
- control_name="VoiceInputAudioDevice"
- layout="topleft"
- left_pad="0"
- 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="left|top"
- 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
- type="string"
- text_color="EmphasisColor"
- length="1"
- follows="left|top"
- height="18"
- layout="topleft"
- left_pad="5"
- name="wait_text"
- top_delta="-1"
- width="110">
- Please wait
- </text>
- <locate
- height="20"
- layout="topleft"
- left_delta="0"
- name="bar0"
- top_delta="-2"
- width="20" />
- <locate
- height="20"
- layout="topleft"
- left_pad="5"
- name="bar1"
- top_delta="0"
- width="20" />
- <locate
- height="20"
- layout="topleft"
- left_pad="5"
- name="bar2"
- top_delta="0"
- width="20" />
- <locate
- height="20"
- layout="topleft"
- left_pad="5"
- name="bar3"
- top_delta="0"
- width="20" />
- <locate
- height="20"
- layout="topleft"
- left_pad="5"
- 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"
- layout="topleft"
- left_pad="0"
- max_chars="128"
- name="voice_output_device"
- top_delta="-3"
- width="200" />
- </panel>
+ top="314"
+ width="345"
+ left="18"
+ class="panel_voice_device_settings"/>
</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 ca9579284b..3f9195d092 100644
--- a/indra/newview/skins/default/xui/en/panel_region_general.xml
+++ b/indra/newview/skins/default/xui/en/panel_region_general.xml
@@ -114,7 +114,7 @@
layout="topleft"
left="10"
name="allow_land_resell_check"
- top="160"
+ top="150"
width="80" />
<check_box
height="20"
@@ -122,7 +122,7 @@
layout="topleft"
left="10"
name="allow_parcel_changes_check"
- top="180"
+ top="170"
width="80" />
<check_box
height="20"
@@ -131,7 +131,17 @@
left="10"
name="block_parcel_search_check"
tool_tip="Let people see this region and its parcels in search results"
- top="200"
+ top="190"
+ width="80" />
+ <check_box
+ visible="FALSE"
+ height="20"
+ label="Allow Mesh Objects"
+ layout="topleft"
+ left="10"
+ name="mesh_rez_enabled_check"
+ tool_tip="Let people rez mesh objects on this region"
+ top="210"
width="80" />
<spinner
decimal_digits="0"
diff --git a/indra/newview/skins/default/xui/en/panel_sound_devices.xml b/indra/newview/skins/default/xui/en/panel_sound_devices.xml
new file mode 100644
index 0000000000..ccae7c5350
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_sound_devices.xml
@@ -0,0 +1,155 @@
+<panel
+ background_visible="false"
+ bg_alpha_color="DkGray"
+ follows="all"
+ height="200"
+ label="Device Settings"
+ 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
+ type="string"
+ length="1"
+ font.style="BOLD"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left_pad="3"
+ name="Input"
+ width="70">
+ Input
+ </text>
+ <combo_box
+ height="23"
+ control_name="VoiceInputAudioDevice"
+ follows="left|top"
+ layout="topleft"
+ left_pad="0"
+ 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
+ type="string"
+ text_color="EmphasisColor"
+ length="1"
+ follows="right|top"
+ height="18"
+ layout="topleft"
+ left_pad="5"
+ name="wait_text"
+ top_delta="-1"
+ width="110">
+ Please wait
+ </text>
+ <locate
+ follows="right|top"
+ height="20"
+ layout="topleft"
+ left_delta="0"
+ name="bar0"
+ top_delta="-2"
+ width="20" />
+ <locate
+ follows="right|top"
+ height="20"
+ layout="topleft"
+ left_pad="5"
+ name="bar1"
+ top_delta="0"
+ width="20" />
+ <locate
+ follows="right|top"
+ height="20"
+ layout="topleft"
+ left_pad="5"
+ name="bar2"
+ top_delta="0"
+ width="20" />
+ <locate
+ follows="right|top"
+ height="20"
+ layout="topleft"
+ left_pad="5"
+ name="bar3"
+ top_delta="0"
+ width="20" />
+ <locate
+ follows="right|top"
+ height="20"
+ layout="topleft"
+ left_pad="5"
+ 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>
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index 27295150c5..71f48c833d 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -58,6 +58,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>
@@ -198,6 +275,7 @@
<string name="favorite">favorite</string>
<string name="symbolic link">link</string>
<string name="symbolic folder link">folder link</string>
+ <string name="mesh">mesh</string>
<!-- llvoavatar. Displayed in the avatar chat bubble -->
<string name="AvatarEditingAppearance">(Editing Appearance)</string>
@@ -1830,6 +1908,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>
@@ -2008,11 +2095,14 @@ Requests name of an avatar. When data is available the dataserver event will be
<string name="InvFolder Initial Outfits">Initial Outfits</string>
<string name="InvFolder My Outfits">My Outfits</string>
<string name="InvFolder Accessories">Accessories</string>
+ <string name="InvFolder Meshes">Meshes</string>
<!-- are used for Friends and Friends/All folders in Inventory "Calling cards" folder. See EXT-694-->
<string name="InvFolder Friends">Friends</string>
<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>
@@ -3214,6 +3304,8 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
The session initialization is timed out
</string>
+ <string name="Home position set.">Home position set.</string>
+
<string name="voice_morphing_url">http://secondlife.com/landing/voicemorphing</string>
<!-- Financial operations strings -->
diff --git a/indra/newview/skins/default/xui/en/widgets/avatar_icon.xml b/indra/newview/skins/default/xui/en/widgets/avatar_icon.xml
index a1e32e44de..4d69dda7eb 100644
--- a/indra/newview/skins/default/xui/en/widgets/avatar_icon.xml
+++ b/indra/newview/skins/default/xui/en/widgets/avatar_icon.xml
@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<avatar_icon
+ name="avatar_icon"
default_icon_name="Generic_Person_Large"
use_draw_context_alpha="false">
</avatar_icon>
diff --git a/indra/newview/skins/default/xui/en/widgets/chiclet_im_p2p.xml b/indra/newview/skins/default/xui/en/widgets/chiclet_im_p2p.xml
index 99807d4717..d27c14f4e7 100644
--- a/indra/newview/skins/default/xui/en/widgets/chiclet_im_p2p.xml
+++ b/indra/newview/skins/default/xui/en/widgets/chiclet_im_p2p.xml
@@ -21,6 +21,7 @@
width="20" />
<chiclet_im_p2p.avatar_icon
bottom="3"
+ color="white"
follows="left|top|bottom"
height="20"
left="2"
diff --git a/indra/newview/skins/default/xui/en/widgets/loading_indicator.xml b/indra/newview/skins/default/xui/en/widgets/loading_indicator.xml
index 6040d24128..ea1d89c975 100644
--- a/indra/newview/skins/default/xui/en/widgets/loading_indicator.xml
+++ b/indra/newview/skins/default/xui/en/widgets/loading_indicator.xml
@@ -3,6 +3,20 @@
follows="left|top"
mouse_opaque="false"
name="loading_indicator"
- rotations_per_sec="1.0"
- tab_stop="false"
-/>
+ images_per_sec="1.0"
+ tab_stop="false">
+ <images>
+ <image name="Progress_1"/>
+ <image name="Progress_2"/>
+ <image name="Progress_3"/>
+ <image name="Progress_4"/>
+ <image name="Progress_5"/>
+ <image name="Progress_6"/>
+ <image name="Progress_7"/>
+ <image name="Progress_8"/>
+ <image name="Progress_9"/>
+ <image name="Progress_10"/>
+ <image name="Progress_11"/>
+ <image name="Progress_12"/>
+ </images>
+</loading_indicator> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/en/widgets/scroll_bar.xml b/indra/newview/skins/default/xui/en/widgets/scroll_bar.xml
index 830ea12e41..e6d4bff8b5 100644
--- a/indra/newview/skins/default/xui/en/widgets/scroll_bar.xml
+++ b/indra/newview/skins/default/xui/en/widgets/scroll_bar.xml
@@ -6,20 +6,24 @@
track_color="ScrollbarTrackColor"
thumb_color="ScrollbarThumbColor"
thickness="15">
- <up_button image_unselected="ScrollArrow_Up"
+ <up_button name="up_button"
+ image_unselected="ScrollArrow_Up"
image_selected="ScrollArrow_Up"
scale_image="true"
hover_glow_amount="0.35"/>
- <down_button image_unselected="ScrollArrow_Down"
+ <down_button name="down_button"
+ image_unselected="ScrollArrow_Down"
image_selected="ScrollArrow_Down"
scale_image="true"
hover_glow_amount="0.35"/>
- <left_button image_unselected="ScrollArrow_Left"
+ <left_button name="left_button"
+ image_unselected="ScrollArrow_Left"
image_selected="ScrollArrow_Left"
scale_image="true"
hover_glow_amount="0.35"/>
- <right_button image_unselected="ScrollArrow_Right"
- image_selected="ScrollArrow_Right"
- scale_image="true"
- hover_glow_amount="0.35"/>
+ <right_button name="right_button"
+ image_unselected="ScrollArrow_Right"
+ image_selected="ScrollArrow_Right"
+ scale_image="true"
+ hover_glow_amount="0.35"/>
</scroll_bar>
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_beacons.xml b/indra/newview/skins/default/xui/es/floater_beacons.xml
index b86967755c..49f990c84d 100644
--- a/indra/newview/skins/default/xui/es/floater_beacons.xml
+++ b/indra/newview/skins/default/xui/es/floater_beacons.xml
@@ -17,5 +17,6 @@
<check_box label="Sólo tocar" name="touch_only"/>
<check_box label="Origen de sonidos" name="sounds"/>
<check_box label="Origen de partículas" name="particles"/>
+ <check_box label="Fuentes de media" name="moapbeacon"/>
</panel>
</floater>
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..2f92cb55eb 100644
--- a/indra/newview/skins/default/xui/es/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/es/floater_buy_currency.xml
@@ -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_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_preview_gesture.xml b/indra/newview/skins/default/xui/es/floater_preview_gesture.xml
index c58eb227aa..bd13262dcd 100644
--- a/indra/newview/skins/default/xui/es/floater_preview_gesture.xml
+++ b/indra/newview/skins/default/xui/es/floater_preview_gesture.xml
@@ -30,15 +30,15 @@
<text name="trigger_label">
Palabra clave:
</text>
- <text left="208" name="replace_text" tool_tip="Reemplaza la/s palabra/s clave con estas palabras. Por ejemplo, si cambia la palabra clave &apos;hola&apos; por &apos;qué tal&apos;, se cambiará en el chat &apos;Quise decir hola&apos; por &apos;Quise decir qué tal&apos; en cuanto realice el gesto.">
+ <text name="replace_text" tool_tip="Reemplaza la/s palabra/s clave con estas palabras. Por ejemplo, si cambia la palabra clave &apos;hola&apos; por &apos;qué tal&apos;, se cambiará en el chat &apos;Quise decir hola&apos; por &apos;Quise decir qué tal&apos; en cuanto realice el gesto.">
Reemplazar por:
</text>
<line_editor name="replace_editor" tool_tip="Reemplaza la/s palabra/s clave con estas palabras. Por ejemplo, si cambia la palabra clave &apos;hola&apos; por &apos;qué tal&apos;, se cambiará en el chat &apos;Quise decir hola&apos; por &apos;Quise decir qué tal&apos; en cuanto realice el gesto."/>
<text name="key_label">
Atajo de teclado:
</text>
- <combo_box label="Ninguno" left="116" name="modifier_combo" width="76"/>
- <combo_box label="Ninguno" left_delta="80" name="key_combo" width="76"/>
+ <combo_box label="Ninguno" name="modifier_combo" width="76"/>
+ <combo_box label="Ninguno" name="key_combo" width="50"/>
<text name="library_label">
Biblioteca:
</text>
@@ -55,20 +55,20 @@
<button label="Arriba" name="up_btn"/>
<button label="Abajo" name="down_btn"/>
<button label="Quitar" name="delete_btn"/>
- <text left="230" name="options_text" width="200">
+ <text name="options_text" width="200">
(opciones)
</text>
<radio_group name="animation_trigger_type">
<radio_item label="Empezar" name="start"/>
<radio_item label="Parar" name="stop"/>
</radio_group>
- <check_box bottom_delta="34" label="hasta que las animaciones estén hechas" name="wait_anim_check"/>
- <check_box bottom_delta="-30" label="tiempo en segundos:" name="wait_time_check"/>
- <line_editor left_delta="130" name="wait_time_editor"/>
+ <check_box label="hasta que las animaciones estén hechas" name="wait_anim_check"/>
+ <check_box label="tiempo en segundos:" name="wait_time_check"/>
+ <line_editor name="wait_time_editor"/>
<text name="help_label">
Todos los pasos suceden a la vez, a menos que añadas pasos de espera.
</text>
- <check_box label="Disponible" left="130" name="active_check" tool_tip="Los gestos disponibles pueden realizarse escribiendo en el chat su frase clave o pulsando su tecla de acceso rápido. Generalmente, los gestos pasan a no disponibles cuando hay un conflicto de teclas."/>
- <button label="Vista previa" name="preview_btn" width="85"/>
+ <check_box label="Disponible" name="active_check" tool_tip="Los gestos disponibles pueden realizarse escribiendo en el chat su frase clave o pulsando su tecla de acceso rápido. Generalmente, los gestos pasan a no disponibles cuando hay un conflicto de teclas."/>
+ <button label="Vista previa" name="preview_btn" width="82"/>
<button label="Guardar" name="save_btn"/>
</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_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..9d29bc40bf 100644
--- a/indra/newview/skins/default/xui/es/floater_tools.xml
+++ b/indra/newview/skins/default/xui/es/floater_tools.xml
@@ -58,7 +58,7 @@
<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"/>
@@ -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_tos.xml b/indra/newview/skins/default/xui/es/floater_tos.xml
index f4a0897d73..89092201d9 100644
--- a/indra/newview/skins/default/xui/es/floater_tos.xml
+++ b/indra/newview/skins/default/xui/es/floater_tos.xml
@@ -4,7 +4,7 @@
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
+ data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Cargando %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3Elas%20Condiciones%20del%20servicio%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E
</floater.string>
<button label="Continuar" label_selected="Continuar" name="Continue"/>
<button label="Cancelar" label_selected="Cancelar" name="Cancel"/>
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_avatar_self.xml b/indra/newview/skins/default/xui/es/menu_avatar_self.xml
index a2d86d78c1..268d6f70ab 100644
--- a/indra/newview/skins/default/xui/es/menu_avatar_self.xml
+++ b/indra/newview/skins/default/xui/es/menu_avatar_self.xml
@@ -14,6 +14,7 @@
<menu_item_call label="Camiseta" name="Self Undershirt"/>
<menu_item_call label="Ropa interior" name="Self Underpants"/>
<menu_item_call label="Tatuaje" name="Self Tattoo"/>
+ <menu_item_call label="Física" name="Self Physics"/>
<menu_item_call label="Alfa" name="Self Alpha"/>
<menu_item_call label="Toda la ropa" name="All Clothes"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_bottomtray.xml b/indra/newview/skins/default/xui/es/menu_bottomtray.xml
index a16da5ae9e..40058a1749 100644
--- a/indra/newview/skins/default/xui/es/menu_bottomtray.xml
+++ b/indra/newview/skins/default/xui/es/menu_bottomtray.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="hide_camera_move_controls_menu">
- <menu_item_check label="Voz activada" name="EnableVoiceChat"/>
+ <menu_item_check label="Botón Hablar" name="EnableVoiceChat"/>
<menu_item_check label="Botón Gestos" name="ShowGestureButton"/>
<menu_item_check label="Botón Moverse" name="ShowMoveButton"/>
<menu_item_check label="Botón Vista" name="ShowCameraButton"/>
diff --git a/indra/newview/skins/default/xui/es/menu_favorites.xml b/indra/newview/skins/default/xui/es/menu_favorites.xml
index c8a7858ddb..85210d5c49 100644
--- a/indra/newview/skins/default/xui/es/menu_favorites.xml
+++ b/indra/newview/skins/default/xui/es/menu_favorites.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="Popup">
- <menu_item_call label="Teleportarse" name="Teleport To Landmark"/>
+ <menu_item_call label="Teleportar" name="Teleport To Landmark"/>
<menu_item_call label="Ver/Editar el hito" name="Landmark Open"/>
<menu_item_call label="Copiar la SLurl" name="Copy slurl"/>
<menu_item_call label="Mostrar en el mapa" name="Show On Map"/>
diff --git a/indra/newview/skins/default/xui/es/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/es/menu_inspect_avatar_gear.xml
index bee4c61da2..82fc8ddd39 100644
--- a/indra/newview/skins/default/xui/es/menu_inspect_avatar_gear.xml
+++ b/indra/newview/skins/default/xui/es/menu_inspect_avatar_gear.xml
@@ -4,7 +4,7 @@
<menu_item_call label="Añadir como amigo" name="add_friend"/>
<menu_item_call label="MI" name="im"/>
<menu_item_call label="Llamada" name="call"/>
- <menu_item_call label="Teleportarse" name="teleport"/>
+ <menu_item_call label="Teleportar" name="teleport"/>
<menu_item_call label="Invitar al grupo" name="invite_to_group"/>
<menu_item_call label="Ignorar" name="block"/>
<menu_item_call label="Designorar" name="unblock"/>
diff --git a/indra/newview/skins/default/xui/es/menu_inventory.xml b/indra/newview/skins/default/xui/es/menu_inventory.xml
index 94ee162bbc..e873d31580 100644
--- a/indra/newview/skins/default/xui/es/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/es/menu_inventory.xml
@@ -25,6 +25,7 @@
<menu_item_call label="Ropa interior nueva" name="New Underpants"/>
<menu_item_call label="Nueva capa Alpha" name="New Alpha Mask"/>
<menu_item_call label="Tatuaje nuevo" name="New Tattoo"/>
+ <menu_item_call label="Nueva física" name="New Physics"/>
</menu>
<menu label="Nuevas partes del cuerpo" name="New Body Parts">
<menu_item_call label="Forma nueva" name="New Shape"/>
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 ba106e8335..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>
@@ -23,6 +25,7 @@
<menu_item_call label="Ropa interior nueva" name="New Underpants"/>
<menu_item_call label="Nueva Alfa" name="New Alpha"/>
<menu_item_call label="Tatuaje nuevo" name="New Tattoo"/>
+ <menu_item_call label="Nueva física" name="New Physics"/>
</menu>
<menu label="Nuevas partes del cuerpo" name="New Body Parts">
<menu_item_call label="Forma nueva" name="New Shape"/>
diff --git a/indra/newview/skins/default/xui/es/menu_media_ctrl.xml b/indra/newview/skins/default/xui/es/menu_media_ctrl.xml
new file mode 100644
index 0000000000..8ea9286d8e
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/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="Cortar" name="Cut"/>
+ <menu_item_call label="Copiar" name="Copy"/>
+ <menu_item_call label="Pegar" name="Paste"/>
+</context_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_outfit_gear.xml b/indra/newview/skins/default/xui/es/menu_outfit_gear.xml
index 3b11bceecf..558ff6afd3 100644
--- a/indra/newview/skins/default/xui/es/menu_outfit_gear.xml
+++ b/indra/newview/skins/default/xui/es/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="Ponerme - Reemplazar el vestuario actual" name="wear"/>
<menu_item_call label="Ponerme - Añadir al vestuario actual" name="wear_add"/>
<menu_item_call label="Quitarme - Quitar del vestuario actual" name="take_off"/>
@@ -14,6 +14,7 @@
<menu_item_call label="Camiseta nueva" name="New Undershirt"/>
<menu_item_call label="Ropa interior nueva" name="New Underpants"/>
<menu_item_call label="Nueva Alfa" name="New Alpha"/>
+ <menu_item_call label="Nueva física" name="New Physics"/>
<menu_item_call label="Tatuaje nuevo" name="New Tattoo"/>
</menu>
<menu label="Nuevas partes del cuerpo" name="New Body Parts">
@@ -24,4 +25,4 @@
</menu>
<menu_item_call label="Renombrar el vestuario" name="rename"/>
<menu_item_call label="Borrar el vestuario" name="delete_outfit"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_teleport_history_item.xml b/indra/newview/skins/default/xui/es/menu_teleport_history_item.xml
index ed33c55aca..c482907812 100644
--- a/indra/newview/skins/default/xui/es/menu_teleport_history_item.xml
+++ b/indra/newview/skins/default/xui/es/menu_teleport_history_item.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<context_menu name="Teleport History Item Context Menu">
- <menu_item_call label="Teleportarse" name="Teleport"/>
+ <menu_item_call label="Teleportar" name="Teleport"/>
<menu_item_call label="Más información" name="More Information"/>
<menu_item_call label="Copiar al portapapeles" name="CopyToClipboard"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_viewer.xml b/indra/newview/skins/default/xui/es/menu_viewer.xml
index c48203f95c..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"/>
@@ -336,4 +346,9 @@
</menu>
<menu_item_call label="God Tools" name="God Tools"/>
</menu>
+ <menu label="Admin" name="Deprecated">
+ <menu label="Take Off Clothing" name="Take Off Clothing">
+ <menu_item_call label="Física" name="Physics"/>
+ </menu>
+ </menu>
</menu_bar>
diff --git a/indra/newview/skins/default/xui/es/notifications.xml b/indra/newview/skins/default/xui/es/notifications.xml
index 1379f710c3..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.
@@ -2841,6 +2870,13 @@ Si lo haces, todos los residentes que se unan posteriormente a la llamada tambi
<notification label="Levantarme" name="HintSit">
Para levantarte y salir de la posición de sentado, haz clic en el botón Levantarme.
</notification>
+ <notification label="Hablar" name="HintSpeak">
+ Pulsa en el botón: Hablar para conectar y desconectar el micrófono.
+
+Pulsa en el cursor arriba para ver el panel de control de voz.
+
+Al ocultar el botón Hablar se desactiva la función de voz.
+ </notification>
<notification label="Explora el mundo" name="HintDestinationGuide">
La Guía de destinos contiene miles de nuevos lugares por descubrir. Selecciona una ubicación y elige Teleportarme para iniciar la exploración.
</notification>
@@ -2850,12 +2886,14 @@ Si lo haces, todos los residentes que se unan posteriormente a la llamada tambi
<notification label="Mover" name="HintMove">
Si deseas caminar o correr, abre el panel Mover y utiliza las flechas de dirección para navegar. También puedes utilizar las flechas de dirección del teclado.
</notification>
+ <notification label="" name="HintMoveClick">
+ 1. Pulsa para caminar: Pulsa en cualquier punto del terreno para ir a él.
+
+2. Pulsa y arrastra para girar la vista: Pulsa y arrastra el cursor a cualquier parte del mundo para girar la vista.
+ </notification>
<notification label="Nombre mostrado" name="HintDisplayName">
Configura y personaliza aquí tu nombre mostrado. Esto se añadirá a tu nombre de usuario personal, que no puedes modificar. Puedes cambiar la manera en que ves los nombres de otras personas en tus preferencias.
</notification>
- <notification label="Mover" name="HintMoveArrows">
- Para caminar, utiliza las flechas de dirección del teclado. Para correr, pulsa dos veces la flecha hacia arriba.
- </notification>
<notification label="Visión" name="HintView">
Para cambiar la vista de la cámara, utiliza los controles Orbital y Panorámica. Para restablecer tu vista, pulsa Esc o camina.
</notification>
@@ -2893,6 +2931,10 @@ Si lo haces, todos los residentes que se unan posteriormente a la llamada tambi
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"/>
@@ -2913,9 +2955,18 @@ Si lo haces, todos los residentes que se unan posteriormente a la llamada tambi
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_physics.xml b/indra/newview/skins/default/xui/es/panel_edit_physics.xml
new file mode 100644
index 0000000000..dfb5ab330a
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/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="Rebote de los senos"/>
+ <accordion_tab name="physics_breasts_inout_tab" title="Canalillo de los senos"/>
+ <accordion_tab name="physics_breasts_leftright_tab" title="Bamboleo de los senos"/>
+ <accordion_tab name="physics_belly_tab" title="Rebote de la barriga"/>
+ <accordion_tab name="physics_butt_tab" title="Rebote del culo"/>
+ <accordion_tab name="physics_butt_leftright_tab" title="Bamboleo del culo"/>
+ <accordion_tab name="physics_advanced_tab" title="Parámetros avanzados"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_edit_wearable.xml b/indra/newview/skins/default/xui/es/panel_edit_wearable.xml
index 15c683f375..799512968d 100644
--- a/indra/newview/skins/default/xui/es/panel_edit_wearable.xml
+++ b/indra/newview/skins/default/xui/es/panel_edit_wearable.xml
@@ -45,6 +45,9 @@
<string name="edit_tattoo_title">
Modificando los tatuajes
</string>
+ <string name="edit_physics_title">
+ Modificar la física
+ </string>
<string name="shape_desc_text">
Anatomía:
</string>
@@ -90,6 +93,9 @@
<string name="tattoo_desc_text">
Tatuaje:
</string>
+ <string name="physics_desc_text">
+ Física:
+ </string>
<labeled_back_button label="Guardar" name="back_btn" tool_tip="Regresar a Editar el vestuario"/>
<text name="edit_wearable_title" value="Modificando la anatomía"/>
<panel label="Camisa" name="wearable_type_panel">
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_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 aba85f9ff1..d8fd43469d 100644
--- a/indra/newview/skins/default/xui/es/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/es/panel_preferences_chat.xml
@@ -30,7 +30,9 @@
<spinner label="Duración de los interlocutores favoritos:" name="nearby_toasts_lifetime"/>
<spinner label="Tiempo de los otros interlocutores:" name="nearby_toasts_fadingtime"/>
<check_box name="translate_chat_checkbox"/>
- <text name="translate_chb_label" >Usar la traducción automática (con Google) en el chat</text>
+ <text name="translate_chb_label">
+ Usar en el chat el traductor automático de Google
+ </text>
<text name="translate_language_text">
Traducir el chat al:
</text>
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 edd417d564..e6e4c13203 100644
--- a/indra/newview/skins/default/xui/es/panel_preferences_colors.xml
+++ b/indra/newview/skins/default/xui/es/panel_preferences_colors.xml
@@ -22,17 +22,20 @@
<text name="text_box5">
Errores
</text>
+ <text name="text_box10">
+ Directo
+ </text>
<text name="text_box7">
Propietario
</text>
<text name="text_box9">
- URL
+ URLs
</text>
<text name="bubble_chat">
Color de fondo de la etiqueta del nombre (afectará también a los bocadillos del chat):
</text>
- <color_swatch name="background" tool_tip="Seleccionar el color de la etiqueta del nombre"/>
- <slider label="Opacidad:" name="bubble_chat_opacity" tool_tip="Seleccionar opacidad de la etiqueta del nombre"/>
+ <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>
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 c569db3376..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>
@@ -39,12 +51,16 @@
<combo_box.item label="Todos los avatares y objetos" name="3"/>
<combo_box.item label="Todo" name="4"/>
</combo_box>
+ <slider label="Física del avatar:" name="AvatarPhysicsDetail"/>
+ <text name="AvatarPhysicsDetailText">
+ Bajo
+ </text>
<slider label="Distancia de dibujo:" name="DrawDistance"/>
<text name="DrawDistanceMeterText2">
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:
@@ -82,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 2bc82307a8..fa7806a75a 100644
--- a/indra/newview/skins/default/xui/es/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/es/panel_preferences_sound.xml
@@ -5,14 +5,16 @@
</panel.string>
<slider label="Volumen general" name="System Volume"/>
<check_box initial_value="true" name="mute_when_minimized"/>
- <text name="mute_chb_label">Silenciar cuando minimice</text>
+ <text name="mute_chb_label">
+ Silenciar cuando minimice
+ </text>
<slider label="Botones" name="UI Volume"/>
<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"/>
<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_region_terrain.xml b/indra/newview/skins/default/xui/es/panel_region_terrain.xml
index 903b826a0b..98b10e4895 100644
--- a/indra/newview/skins/default/xui/es/panel_region_terrain.xml
+++ b/indra/newview/skins/default/xui/es/panel_region_terrain.xml
@@ -8,7 +8,7 @@
</text>
<spinner label="Nivel del agua" name="water_height_spin"/>
<button label="?" name="water_height_help"/>
- <spinner label="Límite de elevación del &#10;terreno" name="terrain_raise_spin"/>
+ <spinner label="Límite de elevación &#10;del terreno" name="terrain_raise_spin"/>
<button label="?" name="terrain_raise_help"/>
<spinner label="Límite de bajada del &#10;terreno" name="terrain_lower_spin" bottom_delta="-34"/>
<button label="?" name="terrain_lower_help"/>
diff --git a/indra/newview/skins/default/xui/es/panel_scrolling_param_base.xml b/indra/newview/skins/default/xui/es/panel_scrolling_param_base.xml
new file mode 100644
index 0000000000..fa659040ea
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/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/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 cd1fb767c8..3731b6b57c 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
@@ -855,6 +991,9 @@
<string name="tattoo">
Tatuaje
</string>
+ <string name="physics">
+ Física
+ </string>
<string name="invalid">
inválido/a
</string>
@@ -894,6 +1033,9 @@
<string name="tattoo_not_worn">
Tatuaje no puesto
</string>
+ <string name="physics_not_worn">
+ Física no puesta
+ </string>
<string name="invalid_not_worn">
no válido/a
</string>
@@ -942,6 +1084,9 @@
<string name="create_new_tattoo">
Crear un tatuaje nuevo
</string>
+ <string name="create_new_physics">
+ Crear nueva física
+ </string>
<string name="create_new_invalid">
no válido/a
</string>
@@ -1144,6 +1289,9 @@
<string name="InvFolder Accessories">
Accesorios
</string>
+ <string name="InvFolder Meshes">
+ Redes
+ </string>
<string name="InvFolder Friends">
Amigos
</string>
@@ -1457,8 +1605,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">
@@ -1907,7 +2055,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
@@ -2178,6 +2326,114 @@ Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE].
<string name="Bulbous Nose">
Nariz de porra
</string>
+ <string name="Breast Physics Mass">
+ Masa del busto
+ </string>
+ <string name="Breast Physics Smoothing">
+ Suavizado del busto
+ </string>
+ <string name="Breast Physics Gravity">
+ Gravedad del busto
+ </string>
+ <string name="Breast Physics Drag">
+ Aerodinámica del busto
+ </string>
+ <string name="Breast Physics InOut Max Effect">
+ Efecto máx.
+ </string>
+ <string name="Breast Physics InOut Spring">
+ Elasticidad
+ </string>
+ <string name="Breast Physics InOut Gain">
+ Ganancia
+ </string>
+ <string name="Breast Physics InOut Damping">
+ Amortiguación
+ </string>
+ <string name="Breast Physics UpDown Max Effect">
+ Efecto máx.
+ </string>
+ <string name="Breast Physics UpDown Spring">
+ Elasticidad
+ </string>
+ <string name="Breast Physics UpDown Gain">
+ Ganancia
+ </string>
+ <string name="Breast Physics UpDown Damping">
+ Amortiguación
+ </string>
+ <string name="Breast Physics LeftRight Max Effect">
+ Efecto máx.
+ </string>
+ <string name="Breast Physics LeftRight Spring">
+ Elasticidad
+ </string>
+ <string name="Breast Physics LeftRight Gain">
+ Ganancia
+ </string>
+ <string name="Breast Physics LeftRight Damping">
+ Amortiguación
+ </string>
+ <string name="Belly Physics Mass">
+ Masa de la barriga
+ </string>
+ <string name="Belly Physics Smoothing">
+ Suavizado de la barriga
+ </string>
+ <string name="Belly Physics Gravity">
+ Gravedad de la barriga
+ </string>
+ <string name="Belly Physics Drag">
+ Aerodinámica de la barriga
+ </string>
+ <string name="Belly Physics UpDown Max Effect">
+ Efecto máx.
+ </string>
+ <string name="Belly Physics UpDown Spring">
+ Elasticidad
+ </string>
+ <string name="Belly Physics UpDown Gain">
+ Ganancia
+ </string>
+ <string name="Belly Physics UpDown Damping">
+ Amortiguación
+ </string>
+ <string name="Butt Physics Mass">
+ Masa del culo
+ </string>
+ <string name="Butt Physics Smoothing">
+ Suavizado del culo
+ </string>
+ <string name="Butt Physics Gravity">
+ Gravedad del culo
+ </string>
+ <string name="Butt Physics Drag">
+ Aerodinámica del culo
+ </string>
+ <string name="Butt Physics UpDown Max Effect">
+ Efecto máx.
+ </string>
+ <string name="Butt Physics UpDown Spring">
+ Elasticidad
+ </string>
+ <string name="Butt Physics UpDown Gain">
+ Ganancia
+ </string>
+ <string name="Butt Physics UpDown Damping">
+ Amortiguación
+ </string>
+ <string name="Butt Physics LeftRight Max Effect">
+ Efecto máx.
+ </string>
+ <string name="Butt Physics LeftRight Spring">
+ Elasticidad
+ </string>
+ <string name="Butt Physics LeftRight Gain">
+ Ganancia
+ </string>
+ <string name="Butt Physics LeftRight Damping">
+ Amortiguación
+ </string>
<string name="Bushy Eyebrows">
Cejijuntas
</string>
@@ -2187,6 +2443,9 @@ Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE].
<string name="Butt Size">
Culo: tamaño
</string>
+ <string name="Butt Gravity">
+ Gravedad del culo
+ </string>
<string name="bustle skirt">
Polisón
</string>
@@ -3468,6 +3727,9 @@ Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE].
<string name="conference-title-incoming">
Conferencia con [AGENT_NAME]
</string>
+ <string name="inventory_item_offered-im">
+ Ofrecido el item del inventario
+ </string>
<string name="no_session_message">
(La sesión de MI no existe)
</string>
@@ -3540,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>
@@ -3662,6 +3927,9 @@ Denuncia de infracción
<string name="New Tattoo">
Tatuaje nuevo
</string>
+ <string name="New Physics">
+ Nueva física
+ </string>
<string name="Invalid Wearable">
No se puede poner
</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_beacons.xml b/indra/newview/skins/default/xui/fr/floater_beacons.xml
index d61115a2db..ebd4dab683 100644
--- a/indra/newview/skins/default/xui/fr/floater_beacons.xml
+++ b/indra/newview/skins/default/xui/fr/floater_beacons.xml
@@ -17,5 +17,6 @@
<check_box label="Toucher uniquement" name="touch_only"/>
<check_box label="Sources sonores" name="sounds"/>
<check_box label="Sources des particules" name="particles"/>
+ <check_box label="Sources des médias" name="moapbeacon"/>
</panel>
</floater>
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_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_tos.xml b/indra/newview/skins/default/xui/fr/floater_tos.xml
index 8a2a1e1d25..6d58cf77ca 100644
--- a/indra/newview/skins/default/xui/fr/floater_tos.xml
+++ b/indra/newview/skins/default/xui/fr/floater_tos.xml
@@ -4,7 +4,7 @@
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
+ data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Chargement %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3Eles%20Conditions%20d%27utilisation%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E
</floater.string>
<button label="Continuer" label_selected="Continuer" name="Continue"/>
<button label="Annuler" label_selected="Annuler" name="Cancel"/>
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/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_avatar_self.xml b/indra/newview/skins/default/xui/fr/menu_avatar_self.xml
index 21528cd43b..6310a2177a 100644
--- a/indra/newview/skins/default/xui/fr/menu_avatar_self.xml
+++ b/indra/newview/skins/default/xui/fr/menu_avatar_self.xml
@@ -14,6 +14,7 @@
<menu_item_call label="Débardeur" name="Self Undershirt"/>
<menu_item_call label="Caleçon" name="Self Underpants"/>
<menu_item_call label="Tatouage" name="Self Tattoo"/>
+ <menu_item_call label="Propriétés physiques" name="Self Physics"/>
<menu_item_call label="Alpha" name="Self Alpha"/>
<menu_item_call label="Tous les habits" name="All Clothes"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_bottomtray.xml b/indra/newview/skins/default/xui/fr/menu_bottomtray.xml
index ddaea517fc..d0d245b286 100644
--- a/indra/newview/skins/default/xui/fr/menu_bottomtray.xml
+++ b/indra/newview/skins/default/xui/fr/menu_bottomtray.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="hide_camera_move_controls_menu">
- <menu_item_check label="Voix activée" name="EnableVoiceChat"/>
+ <menu_item_check label="Bouton Parler" name="EnableVoiceChat"/>
<menu_item_check label="Bouton Geste" name="ShowGestureButton"/>
<menu_item_check label="Bouton Bouger" name="ShowMoveButton"/>
<menu_item_check label="Bouton Affichage" name="ShowCameraButton"/>
diff --git a/indra/newview/skins/default/xui/fr/menu_inventory.xml b/indra/newview/skins/default/xui/fr/menu_inventory.xml
index a2279cf0ac..fa0e264d14 100644
--- a/indra/newview/skins/default/xui/fr/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/fr/menu_inventory.xml
@@ -25,6 +25,7 @@
<menu_item_call label="Nouveau caleçon" name="New Underpants"/>
<menu_item_call label="Nouveau masque alpha" name="New Alpha Mask"/>
<menu_item_call label="Nouveau tatouage" name="New Tattoo"/>
+ <menu_item_call label="Nouvelles propriétés physiques" name="New Physics"/>
</menu>
<menu label="Nouvelles parties du corps" name="New Body Parts">
<menu_item_call label="Nouvelle silhouette" name="New Shape"/>
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 fe096b4a7e..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>
@@ -23,6 +25,7 @@
<menu_item_call label="Nouveau caleçon" name="New Underpants"/>
<menu_item_call label="Nouvel alpha" name="New Alpha"/>
<menu_item_call label="Nouveau tatouage" name="New Tattoo"/>
+ <menu_item_call label="Nouvelles propriétés physiques" name="New Physics"/>
</menu>
<menu label="Nouvelles parties du corps" name="New Body Parts">
<menu_item_call label="Nouvelle silhouette" name="New Shape"/>
diff --git a/indra/newview/skins/default/xui/fr/menu_media_ctrl.xml b/indra/newview/skins/default/xui/fr/menu_media_ctrl.xml
new file mode 100644
index 0000000000..787a5b3af2
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/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="Couper" name="Cut"/>
+ <menu_item_call label="Copier" name="Copy"/>
+ <menu_item_call label="Coller" name="Paste"/>
+</context_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_outfit_gear.xml b/indra/newview/skins/default/xui/fr/menu_outfit_gear.xml
index 5db7f176b5..b5181f4f82 100644
--- a/indra/newview/skins/default/xui/fr/menu_outfit_gear.xml
+++ b/indra/newview/skins/default/xui/fr/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="Porter - Remplacer la tenue actuelle" name="wear"/>
<menu_item_call label="Porter - Ajouter à la tenue actuelle" name="wear_add"/>
<menu_item_call label="Enlever - Supprimer de la tenue actuelle" name="take_off"/>
@@ -14,6 +14,7 @@
<menu_item_call label="Nouveau débardeur" name="New Undershirt"/>
<menu_item_call label="Nouveau caleçon" name="New Underpants"/>
<menu_item_call label="Nouvel alpha" name="New Alpha"/>
+ <menu_item_call label="Nouvelles propriétés physiques" name="New Physics"/>
<menu_item_call label="Nouveau tatouage" name="New Tattoo"/>
</menu>
<menu label="Nouvelles parties du corps" name="New Body Parts">
@@ -24,4 +25,4 @@
</menu>
<menu_item_call label="Renommer la tenue" name="rename"/>
<menu_item_call label="Supprimer la tenue" name="delete_outfit"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_viewer.xml b/indra/newview/skins/default/xui/fr/menu_viewer.xml
index ee1ab8c601..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"/>
@@ -412,6 +422,7 @@
<menu_item_call label="Jupe" name="Skirt"/>
<menu_item_call label="Alpha" name="Alpha"/>
<menu_item_call label="Tatouage" name="Tattoo"/>
+ <menu_item_call label="Propriétés physiques" name="Physics"/>
<menu_item_call label="Tous les habits" name="All Clothes"/>
</menu>
<menu label="Aide" name="Help">
diff --git a/indra/newview/skins/default/xui/fr/notifications.xml b/indra/newview/skins/default/xui/fr/notifications.xml
index e984ea66ed..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.
@@ -2838,6 +2864,13 @@ Ignorer les autres ?
<notification label="Se lever" name="HintSit">
Pour passer d&apos;une position assise à une position debout, cliquez sur le bouton Me lever.
</notification>
+ <notification label="Parler" name="HintSpeak">
+ Cliquez sur le bouton Parler pour activer/désactiver le micro.
+
+Cliquez sur la flèche vers le haut pour afficher le panneau de contrôle de la voix.
+
+Si vous masquez le bouton Parler, la fonction Voix sera désactivée.
+ </notification>
<notification label="Explorer le monde" name="HintDestinationGuide">
Le Guide des destinations comprend des milliers d&apos;endroits nouveaux à découvrir. Sélectionnez-en un, puis cliquez sur Téléporter pour commencer à l&apos;explorer.
</notification>
@@ -2847,12 +2880,16 @@ Ignorer les autres ?
<notification label="Bouger" name="HintMove">
Pour marcher ou courir, cliquez sur le bouton Bouger, puis naviguez à l&apos;aide des flèches directionnelles. Vous pouvez également utiliser les touches fléchées de votre clavier.
</notification>
+ <notification label="" name="HintMoveClick">
+ 1. Cliquer pour marcher
+Cliquez n&apos;importe où sur le sol pour vous diriger vers ce point en marchant.
+
+2. Cliquer et faire glisser pour faire pivoter la vue
+Cliquez sur un point dans le monde et faites glisser votre souris pour faire tourner la caméra.
+ </notification>
<notification label="Nom d&apos;affichage" name="HintDisplayName">
Définissez ici votre nom d&apos;affichage personnalisable. Cette fonctionnalité vous est fournie en plus de votre nom d&apos;utilisateur unique qui, lui, ne peut être changé. Vous pouvez modifier l&apos;apparence des noms des autres résidents dans vos préférences.
</notification>
- <notification label="Bouger" name="HintMoveArrows">
- Pour marcher, utilisez les touches fléchées de votre clavier. Pour courir, appuyez deux fois sur la flèche vers le haut.
- </notification>
<notification label="Affichage" name="HintView">
Pour changer d&apos;angle de vision, utilisez les contrôles Faire tourner et Faire un panoramique. Pour réinitialiser la vue, appuyez sur Échap ou marchez.
</notification>
@@ -2890,6 +2927,10 @@ Ignorer les autres ?
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"/>
@@ -2910,9 +2951,18 @@ Ignorer les autres ?
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_physics.xml b/indra/newview/skins/default/xui/fr/panel_edit_physics.xml
new file mode 100644
index 0000000000..d79f7df90a
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/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="Rebond des seins"/>
+ <accordion_tab name="physics_breasts_inout_tab" title="Décolleté"/>
+ <accordion_tab name="physics_breasts_leftright_tab" title="Balancement des seins"/>
+ <accordion_tab name="physics_belly_tab" title="Rebond du ventre"/>
+ <accordion_tab name="physics_butt_tab" title="Rebond des fesses"/>
+ <accordion_tab name="physics_butt_leftright_tab" title="Balancement des fesses"/>
+ <accordion_tab name="physics_advanced_tab" title="Paramètres avancés"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_edit_wearable.xml b/indra/newview/skins/default/xui/fr/panel_edit_wearable.xml
index d7a3d3bd85..def158cf68 100644
--- a/indra/newview/skins/default/xui/fr/panel_edit_wearable.xml
+++ b/indra/newview/skins/default/xui/fr/panel_edit_wearable.xml
@@ -45,6 +45,9 @@
<string name="edit_tattoo_title">
Modification du tatouage
</string>
+ <string name="edit_physics_title">
+ Modification des propriétés physiques
+ </string>
<string name="shape_desc_text">
Silhouette :
</string>
@@ -90,6 +93,9 @@
<string name="tattoo_desc_text">
Tatouage :
</string>
+ <string name="physics_desc_text">
+ Propriétés physiques :
+ </string>
<labeled_back_button label="Enregistrer" name="back_btn" tool_tip="Revenir à Modifier la tenue"/>
<text name="edit_wearable_title" value="Modification de la silhouette"/>
<panel label="Chemise" name="wearable_type_panel">
diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml b/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml
index d5cecfc698..e9e6e6350f 100644
--- a/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml
@@ -30,7 +30,9 @@
<spinner label="Durée de vie du popup Chat près de moi :" name="nearby_toasts_lifetime"/>
<spinner label="Disparition progressive du popup Chat près de moi :" name="nearby_toasts_fadingtime"/>
<check_box name="translate_chat_checkbox"/>
- <text name="translate_chb_label" >Utiliser la traduction automatique lors des chats (fournie par Google)</text>
+ <text name="translate_chb_label">
+ Utiliser la traduction automatique lors des chats (fournie par Google)
+ </text>
<text name="translate_language_text">
Traduire le chat en :
</text>
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 4e7d75e1b9..e50fd2b6f3 100644
--- a/indra/newview/skins/default/xui/fr/panel_preferences_colors.xml
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_colors.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Couleurs" name="colors_panel">
<text name="effects_color_textbox">
- Mes effets (faisceau de sélection lumineux) :
+ Mes effets (faisceau de sélection) :
</text>
<color_swatch name="effect_color_swatch" tool_tip="Cliquer pour ouvrir le sélecteur de couleurs."/>
<text name="font_colors">
- Couleurs de la police du chat :
+ Couleurs pour le chat :
</text>
<text name="text_box1">
Moi
@@ -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 c90edd443e..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>
@@ -39,6 +51,10 @@
<combo_box.item label="Tous les objets et avatars" name="3"/>
<combo_box.item label="Tout" name="4"/>
</combo_box>
+ <slider label="Propriétés physiques de l&apos;avatar :" name="AvatarPhysicsDetail"/>
+ <text name="AvatarPhysicsDetailText">
+ Faible
+ </text>
<slider label="Limite d&apos;affichage :" name="DrawDistance"/>
<text name="DrawDistanceMeterText2">
m
@@ -77,7 +93,7 @@
Faible
</text>
<text name="AvatarRenderingText">
- Rendu de l&apos;avatar :
+ Rendu de l&apos;avatar :
</text>
<check_box initial_value="true" label="Avatars éloignés en 2D" name="AvatarImpostors"/>
<check_box initial_value="true" label="Accélération du rendu" name="AvatarVertexProgram"/>
diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_sound.xml b/indra/newview/skins/default/xui/fr/panel_preferences_sound.xml
index ac7f72d367..a404aae483 100644
--- a/indra/newview/skins/default/xui/fr/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_sound.xml
@@ -5,7 +5,9 @@
</panel.string>
<slider label="Volume principal" name="System Volume"/>
<check_box initial_value="true" name="mute_when_minimized"/>
- <text name="mute_chb_label">Couper quand minimisé</text>
+ <text name="mute_chb_label">
+ Couper lorsque minimisé
+ </text>
<slider label="Boutons" name="UI Volume"/>
<slider label="Ambiant" name="Wind Volume"/>
<slider label="Effets sonores" name="SFX Volume"/>
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_scrolling_param_base.xml b/indra/newview/skins/default/xui/fr/panel_scrolling_param_base.xml
new file mode 100644
index 0000000000..fa659040ea
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/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/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 a7c71dc0f0..3ec85551da 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>
@@ -876,6 +1012,9 @@
<string name="tattoo">
Tatouage
</string>
+ <string name="physics">
+ Propriétés physiques
+ </string>
<string name="invalid">
non valide
</string>
@@ -915,6 +1054,9 @@
<string name="tattoo_not_worn">
Tatouage non porté
</string>
+ <string name="physics_not_worn">
+ Propriétés physiques non portées
+ </string>
<string name="invalid_not_worn">
non valide
</string>
@@ -963,6 +1105,9 @@
<string name="create_new_tattoo">
Créer un nouveau tatouage
</string>
+ <string name="create_new_physics">
+ Créer de nouvelles propriétés physiques
+ </string>
<string name="create_new_invalid">
non valide
</string>
@@ -1171,6 +1316,9 @@
<string name="InvFolder Accessories">
Accessoires
</string>
+ <string name="InvFolder Meshes">
+ Maillages
+ </string>
<string name="InvFolder Friends">
Amis
</string>
@@ -1485,7 +1633,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">
@@ -2247,6 +2395,114 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
<string name="Bulbous Nose">
Nez en bulbe
</string>
+ <string name="Breast Physics Mass">
+ Masse des seins
+ </string>
+ <string name="Breast Physics Smoothing">
+ Lissage des seins
+ </string>
+ <string name="Breast Physics Gravity">
+ Gravité des seins
+ </string>
+ <string name="Breast Physics Drag">
+ Résistance de l&apos;air sur les seins
+ </string>
+ <string name="Breast Physics InOut Max Effect">
+ Effet max.
+ </string>
+ <string name="Breast Physics InOut Spring">
+ Vibration
+ </string>
+ <string name="Breast Physics InOut Gain">
+ Amplification
+ </string>
+ <string name="Breast Physics InOut Damping">
+ Amortissement
+ </string>
+ <string name="Breast Physics UpDown Max Effect">
+ Effet max.
+ </string>
+ <string name="Breast Physics UpDown Spring">
+ Vibration
+ </string>
+ <string name="Breast Physics UpDown Gain">
+ Amplification
+ </string>
+ <string name="Breast Physics UpDown Damping">
+ Amortissement
+ </string>
+ <string name="Breast Physics LeftRight Max Effect">
+ Effet max.
+ </string>
+ <string name="Breast Physics LeftRight Spring">
+ Vibration
+ </string>
+ <string name="Breast Physics LeftRight Gain">
+ Amplification
+ </string>
+ <string name="Breast Physics LeftRight Damping">
+ Amortissement
+ </string>
+ <string name="Belly Physics Mass">
+ Masse du ventre
+ </string>
+ <string name="Belly Physics Smoothing">
+ Lissage du ventre
+ </string>
+ <string name="Belly Physics Gravity">
+ Gravité du ventre
+ </string>
+ <string name="Belly Physics Drag">
+ Résistance de l&apos;air sur le ventre
+ </string>
+ <string name="Belly Physics UpDown Max Effect">
+ Effet max.
+ </string>
+ <string name="Belly Physics UpDown Spring">
+ Vibration
+ </string>
+ <string name="Belly Physics UpDown Gain">
+ Amplification
+ </string>
+ <string name="Belly Physics UpDown Damping">
+ Amortissement
+ </string>
+ <string name="Butt Physics Mass">
+ Masse des fesses
+ </string>
+ <string name="Butt Physics Smoothing">
+ Lissage des fesses
+ </string>
+ <string name="Butt Physics Gravity">
+ Gravité des fesses
+ </string>
+ <string name="Butt Physics Drag">
+ Résistance de l&apos;air sur les fesses
+ </string>
+ <string name="Butt Physics UpDown Max Effect">
+ Effet max.
+ </string>
+ <string name="Butt Physics UpDown Spring">
+ Vibration
+ </string>
+ <string name="Butt Physics UpDown Gain">
+ Amplification
+ </string>
+ <string name="Butt Physics UpDown Damping">
+ Amortissement
+ </string>
+ <string name="Butt Physics LeftRight Max Effect">
+ Effet max.
+ </string>
+ <string name="Butt Physics LeftRight Spring">
+ Vibration
+ </string>
+ <string name="Butt Physics LeftRight Gain">
+ Amplification
+ </string>
+ <string name="Butt Physics LeftRight Damping">
+ Amortissement
+ </string>
<string name="Bushy Eyebrows">
Sourcils touffus
</string>
@@ -2256,6 +2512,9 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
<string name="Butt Size">
Taille des fesses
</string>
+ <string name="Butt Gravity">
+ Gravité des fesses
+ </string>
<string name="bustle skirt">
Jupe gonflante
</string>
@@ -3642,6 +3901,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>
@@ -3764,6 +4026,9 @@ de l&apos;infraction signalée
<string name="New Tattoo">
Nouveau tatouage
</string>
+ <string name="New Physics">
+ Nouvelles propriétés physiques
+ </string>
<string name="Invalid Wearable">
Objet à porter non valide
</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_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_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_preview_gesture.xml b/indra/newview/skins/default/xui/it/floater_preview_gesture.xml
index 7e29db6336..2172b9848b 100644
--- a/indra/newview/skins/default/xui/it/floater_preview_gesture.xml
+++ b/indra/newview/skins/default/xui/it/floater_preview_gesture.xml
@@ -34,10 +34,10 @@
Sostituisci con:
</text>
<line_editor name="replace_editor" tool_tip="Sostituisci le parole chiave con questi termini. Per esempio, sostituire la parola chiave &apos;salve&apos; con &apos;ciao&apos; modificherà la chat &apos;Volevo solo dire salve&apos; in &apos;Volevo solo dire ciao&apos; e avvierà la gesture!"/>
- <text name="key_label">
+ <text name="key_label" width="147">
Scorciatoia da tastiera:
</text>
- <combo_box label="Nessuno" name="modifier_combo" />
+ <combo_box left_delta="150" label="Nessuno" name="modifier_combo" />
<combo_box label="Nessuno" name="key_combo" />
<text name="library_label">
Libreria:
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_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
index c6ab646fbf..b25f0a6266 100644
--- a/indra/newview/skins/default/xui/it/floater_water.xml
+++ b/indra/newview/skins/default/xui/it/floater_water.xml
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Water Floater" title="EDITOR AVANZATO DELL&apos;ACQUA">
- <text name="KeyFramePresetsText" width="224">
+ <text name="KeyFramePresetsText" width="245">
Impostazioni predeterminate dell&apos;acqua:
</text>
- <combo_box left_delta="230" name="WaterPresetsCombo" width="150"/>
+ <combo_box left_delta="245" 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"/>
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
index 1f6f0fab58..6828d05be0 100644
--- a/indra/newview/skins/default/xui/it/floater_windlight_options.xml
+++ b/indra/newview/skins/default/xui/it/floater_windlight_options.xml
@@ -1,8 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="WindLight floater" title="EDITOR AVANZATO DEL CIELO">
- <text name="KeyFramePresetsText">
+ <text name="KeyFramePresetsText" width="105">
Cieli predefiniti:
</text>
+ <combo_box left_delta="105" name="WLPresetsCombo"/>
<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"/>
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_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..b24a4055f7 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>
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..cbe8ef24c4 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 :"/>
@@ -1141,6 +1295,9 @@
<string name="InvFolder Accessories">
Accessori
</string>
+ <string name="InvFolder Meshes">
+ Reticoli
+ </string>
<string name="InvFolder Friends">
Amici
</string>
@@ -1454,8 +1611,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 +1894,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 +1976,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 +2093,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 +2332,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 +2449,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 +3740,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 +3805,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 +3829,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 +3850,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 +3930,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 +4132,7 @@ Segnala abuso
<string name="Notices">
Avvisi
</string>
- <string name="Chat">
+ <string name="Chat" value="Chat :">
Chat
</string>
<string name="DeleteItems">
@@ -3867,4 +4144,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_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_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..0b14f92ae7 100644
--- a/indra/newview/skins/default/xui/ja/floater_tools.xml
+++ b/indra/newview/skins/default/xui/ja/floater_tools.xml
@@ -64,6 +64,8 @@
<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>
@@ -123,6 +125,18 @@
<text name="prim_count">
プリム: [COUNT]
</text>
+ <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" tab_max_width="150" tab_min_width="30">
<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>
@@ -375,6 +396,23 @@
<spinner label="焦点" name="Light Focus"/>
<spinner label="弱まる" label_width="72" name="Light Falloff" width="135"/>
<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">
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_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/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_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..c7f71c6de0 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>
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..a6691fb764 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=" アニメーションを停止:"/>
@@ -1162,6 +1316,9 @@
<string name="InvFolder Accessories">
アクセサリ
</string>
+ <string name="InvFolder Meshes">
+ メッシュ
+ </string>
<string name="InvFolder Friends">
フレンド
</string>
@@ -1764,11 +1921,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 +2012,6 @@
<string name="accel-win-shift">
Shift+
</string>
- <string name="Esc">
- Esc
- </string>
- <string name="Home">
- ホーム
- </string>
<string name="FileSaved">
ファイルが保存されました
</string>
@@ -1892,7 +2040,7 @@
</string>
<string name="Direction_Back">
- 後ろ
+ 戻る
</string>
<string name="Direction_North">
@@ -1981,6 +2129,9 @@
<string name="Other">
その他
</string>
+ <string name="Rental">
+ レンタル
+ </string>
<string name="Any">
全員
</string>
@@ -2244,6 +2395,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 +2512,9 @@ www.secondlife.com から最新バージョンをダウンロードしてくだ
<string name="Butt Size">
お尻の大きさ
</string>
+ <string name="Butt Gravity">
+ お尻の垂れ具合
+ </string>
<string name="bustle skirt">
後ろの膨らみ
</string>
@@ -3574,7 +3836,7 @@ www.secondlife.com から最新バージョンをダウンロードしてくだ
このセッションにいるユーザーはあなただけです。
</string>
<string name="offline_message">
- [NAME] はオフラインです。
+ [NAME] はオフライン中です。
</string>
<string name="invite_message">
このボイスチャットに応答・接続する場合は、[BUTTON NAME] をクリックしてください。
@@ -3639,11 +3901,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 +3925,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 +3946,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 +4026,9 @@ www.secondlife.com から最新バージョンをダウンロードしてくだ
<string name="New Tattoo">
新しいタトゥ
</string>
+ <string name="New Physics">
+ 新規の物理作用
+ </string>
<string name="Invalid Wearable">
無効な着用物
</string>
@@ -3951,7 +4228,7 @@ www.secondlife.com から最新バージョンをダウンロードしてくだ
<string name="Notices">
通知
</string>
- <string name="Chat">
+ <string name="Chat" value=" チャット:">
チャット
</string>
<string name="DeleteItems">
@@ -3963,4 +4240,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_windlight_options.xml b/indra/newview/skins/default/xui/nl/floater_windlight_options.xml
index d97c9679a9..b26dd7916e 100644
--- a/indra/newview/skins/default/xui/nl/floater_windlight_options.xml
+++ b/indra/newview/skins/default/xui/nl/floater_windlight_options.xml
@@ -1,14 +1,12 @@
<?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" />
+ <combo_box allow_text_entry="false" follows="left|top" mouse_opaque="true" name="WLPresetsCombo"/>
<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="Verwijderen" label_selected="Verwijderen" name="WLDeletePreset"/>
<button label="Dag cyclus editor" label_selected="Dag cyclus editor" name="WLDayCycleMenuButton"/>
<tab_container name="WindLight Tabs">
<panel label="Atmosfeer" name="Atmosphere">
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..a53c0769dc 100644
--- a/indra/newview/skins/default/xui/nl/strings.xml
+++ b/indra/newview/skins/default/xui/nl/strings.xml
@@ -1231,8 +1231,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_about_land.xml b/indra/newview/skins/default/xui/pl/floater_about_land.xml
index b935615fcb..badff11a59 100644
--- a/indra/newview/skins/default/xui/pl/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/pl/floater_about_land.xml
@@ -349,6 +349,7 @@ Jedynie większe posiadłości mogą być umieszczone w bazie wyszukiwarki.
<combo_box.item label="Park i natura" name="item9"/>
<combo_box.item label="Mieszkalna" name="item10"/>
<combo_box.item label="Zakupy" name="item11"/>
+ <combo_box.item label="Opłata za wynajęcie" name="item13"/>
<combo_box.item label="Inna" name="item12"/>
</combo_box>
<combo_box name="land category">
@@ -363,6 +364,7 @@ Jedynie większe posiadłości mogą być umieszczone w bazie wyszukiwarki.
<combo_box.item label="Parki i natura" name="item9"/>
<combo_box.item label="Mieszkalna" name="item10"/>
<combo_box.item label="Zakupy" name="item11"/>
+ <combo_box.item label="Opłata za wynajęcie" name="item13"/>
<combo_box.item label="Inna" name="item12"/>
</combo_box>
<check_box label="Treść &apos;Mature&apos;" name="MatureCheck" tool_tip=""/>
@@ -430,7 +432,7 @@ Mediów:
(Zdefiniowane przez Majątek)
</panel.string>
<panel.string name="allow_public_access">
- Udostępnij publicznie ([MATURITY])
+ Udostępniaj publicznie ([MATURITY]) (Pamiętaj: w przypadku braku zaznaczenia tej opcji widoczne będą linie bana.)
</panel.string>
<panel.string name="estate_override">
Jedna lub więcej z tych opcji ustawiona jest z poziomu Posiadłości
diff --git a/indra/newview/skins/default/xui/pl/floater_beacons.xml b/indra/newview/skins/default/xui/pl/floater_beacons.xml
index 547db2b351..e6286a6ac1 100644
--- a/indra/newview/skins/default/xui/pl/floater_beacons.xml
+++ b/indra/newview/skins/default/xui/pl/floater_beacons.xml
@@ -17,5 +17,6 @@
<check_box label="Obiekty dotykalne" name="touch_only"/>
<check_box label="Źródła dźwięku" name="sounds"/>
<check_box label="Źródła cząsteczek" name="particles"/>
+ <check_box label="Źródła mediów" name="moapbeacon"/>
</panel>
</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_map.xml b/indra/newview/skins/default/xui/pl/floater_map.xml
index fd151e91ad..e01c4c8a82 100644
--- a/indra/newview/skins/default/xui/pl/floater_map.xml
+++ b/indra/newview/skins/default/xui/pl/floater_map.xml
@@ -3,6 +3,9 @@
<floater.string name="ToolTipMsg">
[REGION](Podwójne kliknięcie otwiera Mapę, Shift i przeciągnięcie kursorem zmienia skalę)
</floater.string>
+ <floater.string name="AltToolTipMsg">
+ [REGION](Podwójne kliknięcie aktywuje teleportację, wciśnij Shift i przeciągnij aby przesunąć)
+ </floater.string>
<floater.string name="mini_map_caption">
MINIMAPA
</floater.string>
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_tools.xml b/indra/newview/skins/default/xui/pl/floater_tools.xml
index 337998efc9..9e6fed8387 100644
--- a/indra/newview/skins/default/xui/pl/floater_tools.xml
+++ b/indra/newview/skins/default/xui/pl/floater_tools.xml
@@ -64,6 +64,8 @@
<radio_item label="Wybierz teksturę" name="radio select face"/>
</radio_group>
<check_box label="Edytuj połączone części" name="checkbox edit linked parts"/>
+ <button label="Linkuj" name="link_btn"/>
+ <button label="Rozlinkuj" name="unlink_btn"/>
<text name="RenderingCost" tool_tip="Pokazuje koszt renderowania tego obiektu">
þ: [COUNT]
</text>
@@ -301,7 +303,7 @@
<combo_box.item label="Kwadrat" name="Square"/>
<combo_box.item label="Trójkąt" name="Triangle"/>
</combo_box>
- <text name="text twist" left_delta="-5" width="160">
+ <text left_delta="-5" name="text twist" width="160">
Skręcenie (początek/koniec)
</text>
<spinner label="P" name="Twist Begin"/>
diff --git a/indra/newview/skins/default/xui/pl/floater_tos.xml b/indra/newview/skins/default/xui/pl/floater_tos.xml
index bb2de773f0..8cdf267f4b 100644
--- a/indra/newview/skins/default/xui/pl/floater_tos.xml
+++ b/indra/newview/skins/default/xui/pl/floater_tos.xml
@@ -4,7 +4,7 @@
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
+ data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Ładowanie %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3EWarunki%20Serwisu%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E
</floater.string>
<button label="Kontynuuj" label_selected="Kontynuuj" name="Continue"/>
<button label="Anuluj" label_selected="Anuluj" name="Cancel"/>
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/menu_attachment_self.xml b/indra/newview/skins/default/xui/pl/menu_attachment_self.xml
index c19b0a1c2e..163b3a231e 100644
--- a/indra/newview/skins/default/xui/pl/menu_attachment_self.xml
+++ b/indra/newview/skins/default/xui/pl/menu_attachment_self.xml
@@ -5,7 +5,7 @@
<menu_item_call label="Odłącz" name="Detach"/>
<menu_item_call label="Usiądź tutaj" name="Sit Down Here"/>
<menu_item_call label="Wstań" name="Stand Up"/>
- <menu_item_call label="Zmień strój" name="Change Outfit"/>
+ <menu_item_call label="Mój wygląd" name="Change Outfit"/>
<menu_item_call label="Edytuj mój strój" name="Edit Outfit"/>
<menu_item_call label="Edytuj mój kształt" name="Edit My Shape"/>
<menu_item_call label="Moi znajomi" name="Friends..."/>
diff --git a/indra/newview/skins/default/xui/pl/menu_avatar_self.xml b/indra/newview/skins/default/xui/pl/menu_avatar_self.xml
index ea151788c6..8eb501c5b8 100644
--- a/indra/newview/skins/default/xui/pl/menu_avatar_self.xml
+++ b/indra/newview/skins/default/xui/pl/menu_avatar_self.xml
@@ -14,6 +14,7 @@
<menu_item_call label="Podkoszulek" name="Self Undershirt"/>
<menu_item_call label="Bieliznę" name="Self Underpants"/>
<menu_item_call label="Tatuaż" name="Self Tattoo"/>
+ <menu_item_call label="Fizyka" name="Self Physics"/>
<menu_item_call label="Ubranie alpha" name="Self Alpha"/>
<menu_item_call label="Wszystko" name="All Clothes"/>
</context_menu>
@@ -21,7 +22,7 @@
<context_menu label="Odłącz" name="Object Detach"/>
<menu_item_call label="Odłącz wszystko" name="Detach All"/>
</context_menu>
- <menu_item_call label="Zmień strój" name="Chenge Outfit"/>
+ <menu_item_call label="Mój wygląd" name="Chenge Outfit"/>
<menu_item_call label="Edytuj mój strój" name="Edit Outfit"/>
<menu_item_call label="Edytuj mój kształt" name="Edit My Shape"/>
<menu_item_call label="Moi znajomi" name="Friends..."/>
diff --git a/indra/newview/skins/default/xui/pl/menu_bottomtray.xml b/indra/newview/skins/default/xui/pl/menu_bottomtray.xml
index a4a6ea484d..1ec5883cfe 100644
--- a/indra/newview/skins/default/xui/pl/menu_bottomtray.xml
+++ b/indra/newview/skins/default/xui/pl/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="Rozpocznij rozmowę głosową" name="EnableVoiceChat"/>
<menu_item_check label="Przycisk gesturki" name="ShowGestureButton"/>
<menu_item_check label="Przycisk ruchu" name="ShowMoveButton"/>
<menu_item_check label="Przycisk widoku" name="ShowCameraButton"/>
<menu_item_check label="Przycisk zdjęć" name="ShowSnapshotButton"/>
- <menu_item_check label="Schowek" name="ShowSidebarButton"/>
<menu_item_check label="Buduj" name="ShowBuildButton"/>
<menu_item_check label="Szukaj" name="ShowSearchButton"/>
<menu_item_check label="Mapa" name="ShowWorldMapButton"/>
diff --git a/indra/newview/skins/default/xui/pl/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/pl/menu_inspect_avatar_gear.xml
index 5c27d53d90..59560f236c 100644
--- a/indra/newview/skins/default/xui/pl/menu_inspect_avatar_gear.xml
+++ b/indra/newview/skins/default/xui/pl/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="Zobacz profil" name="view_profile"/>
<menu_item_call label="Dodaj znajomość" name="add_friend"/>
<menu_item_call label="IM" name="im"/>
@@ -11,9 +11,11 @@
<menu_item_call label="Raport" name="report"/>
<menu_item_call label="Unieruchom" name="freeze"/>
<menu_item_call label="Wyrzuć" name="eject"/>
+ <menu_item_call label="Kopnij" name="kick"/>
+ <menu_item_call label="CSR" name="csr"/>
<menu_item_call label="Debugowanie tekstur" name="debug"/>
<menu_item_call label="Znajdź na mapie" name="find_on_map"/>
<menu_item_call label="Przybliż" name="zoom_in"/>
<menu_item_call label="Zapłać" name="pay"/>
<menu_item_call label="Udostępnij" name="share"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/pl/menu_inspect_self_gear.xml
index 90d71371e8..c4ef9761d9 100644
--- a/indra/newview/skins/default/xui/pl/menu_inspect_self_gear.xml
+++ b/indra/newview/skins/default/xui/pl/menu_inspect_self_gear.xml
@@ -1,10 +1,31 @@
-<?xml version="1.0" encoding="utf-8"?>
-<menu name="Gear Menu">
- <menu_item_call label="Usiądź tutaj" name="sit_down_here"/>
- <menu_item_call label="Wstań" name="stand_up"/>
- <menu_item_call label="Zmień strój" name="change_outfit"/>
- <menu_item_call label="Mój profil" name="my_profile"/>
- <menu_item_call label="Moi znajomi" name="my_friends"/>
- <menu_item_call label="Moje grupy" name="my_groups"/>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="Gear Menu">
+ <menu_item_call label="Usiądź tutaj" name="Sit Down Here"/>
+ <menu_item_call label="Wstań" name="Stand Up"/>
+ <context_menu label="Zdejmij" name="Take Off &gt;">
+ <context_menu label="Ubranie" name="Clothes &gt;">
+ <menu_item_call label="Bluzka" name="Shirt"/>
+ <menu_item_call label="Spodnie" name="Pants"/>
+ <menu_item_call label="Spódnica" name="Skirt"/>
+ <menu_item_call label="Buty" name="Shoes"/>
+ <menu_item_call label="Skarpetki" name="Socks"/>
+ <menu_item_call label="Kurtka" name="Jacket"/>
+ <menu_item_call label="Rękawiczki" name="Gloves"/>
+ <menu_item_call label="Podkoszulek" name="Self Undershirt"/>
+ <menu_item_call label="Bielizna" name="Self Underpants"/>
+ <menu_item_call label="Tatuaż" name="Self Tattoo"/>
+ <menu_item_call label="Alpha" name="Self Alpha"/>
+ <menu_item_call label="Ubranie" name="All Clothes"/>
+ </context_menu>
+ <context_menu label="HUD" name="Object Detach HUD"/>
+ <context_menu label="Odłącz" name="Object Detach"/>
+ <menu_item_call label="Odłącz wszystko" name="Detach All"/>
+ </context_menu>
+ <menu_item_call label="Zmień strój" name="Chenge Outfit"/>
+ <menu_item_call label="Edytuj mój strój" name="Edit Outfit"/>
+ <menu_item_call label="Edytuj mój kształt" name="Edit My Shape"/>
+ <menu_item_call label="Znajomi" name="Friends..."/>
+ <menu_item_call label="Moje grupy" name="Groups..."/>
+ <menu_item_call label="Mój profil" name="Profile..."/>
<menu_item_call label="Debugowanie tekstur" name="Debug..."/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_inventory.xml b/indra/newview/skins/default/xui/pl/menu_inventory.xml
index e47ffa0e18..5492f78b26 100644
--- a/indra/newview/skins/default/xui/pl/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/pl/menu_inventory.xml
@@ -25,6 +25,7 @@
<menu_item_call label="Nowa bielizna" name="New Underpants"/>
<menu_item_call label="Nowa maska alpha" name="New Alpha Mask"/>
<menu_item_call label="Nowy tatuaż" name="New Tattoo"/>
+ <menu_item_call label="Nowa fizyka" name="New Physics"/>
</menu>
<menu label="Nowa Część Ciała" name="New Body Parts">
<menu_item_call label="Nowy kształt" name="New Shape"/>
diff --git a/indra/newview/skins/default/xui/pl/menu_inventory_add.xml b/indra/newview/skins/default/xui/pl/menu_inventory_add.xml
index 4a56586aaf..04f9b94f7c 100644
--- a/indra/newview/skins/default/xui/pl/menu_inventory_add.xml
+++ b/indra/newview/skins/default/xui/pl/menu_inventory_add.xml
@@ -23,6 +23,7 @@
<menu_item_call label="Nowa bielizna" name="New Underpants"/>
<menu_item_call label="Nowa maska alpha" name="New Alpha"/>
<menu_item_call label="Nowy tatuaż" name="New Tattoo"/>
+ <menu_item_call label="Nowa fizyka" name="New Physics"/>
</menu>
<menu label="Nowa Część Ciała" name="New Body Parts">
<menu_item_call label="Nowy kształt" name="New Shape"/>
diff --git a/indra/newview/skins/default/xui/pl/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/pl/menu_inventory_gear_default.xml
index 491b4deeaa..591c3a81d5 100644
--- a/indra/newview/skins/default/xui/pl/menu_inventory_gear_default.xml
+++ b/indra/newview/skins/default/xui/pl/menu_inventory_gear_default.xml
@@ -3,6 +3,7 @@
<menu_item_call label="Nowe okno Szafy" name="new_window"/>
<menu_item_check label="Porządkuj według nazwy" name="sort_by_name"/>
<menu_item_check label="Porządkuj według daty" name="sort_by_recent"/>
+ <menu_item_check label="Sortuj foldery zawsze według nazwy" name="sort_folders_by_name"/>
<menu_item_check label="Posortuj foldery systemowe od góry" name="sort_system_folders_to_top"/>
<menu_item_call label="Pokaż filtry" name="show_filters"/>
<menu_item_call label="Zresetuj filtry" name="reset_filters"/>
diff --git a/indra/newview/skins/default/xui/pl/menu_media_ctrl.xml b/indra/newview/skins/default/xui/pl/menu_media_ctrl.xml
new file mode 100644
index 0000000000..60dc3673a9
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/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="Wytnij" name="Cut"/>
+ <menu_item_call label="Kopiuj" name="Copy"/>
+ <menu_item_call label="Wklej" name="Paste"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_object.xml b/indra/newview/skins/default/xui/pl/menu_object.xml
index 2173401dd2..3da6c5c890 100644
--- a/indra/newview/skins/default/xui/pl/menu_object.xml
+++ b/indra/newview/skins/default/xui/pl/menu_object.xml
@@ -16,14 +16,14 @@
<context_menu label="Dołącz" name="Object Attach"/>
<context_menu label="Dołącz HUD" name="Object Attach HUD"/>
</context_menu>
- <context_menu label="Usuń" name="Remove">
+ <context_menu label="Zarządzaj" name="Remove">
<menu_item_call label="Raport" name="Report Abuse..."/>
<menu_item_call label="Zablokuj" name="Object Mute"/>
<menu_item_call label="Zwróć" name="Return..."/>
- <menu_item_call label="Usuń" name="Delete"/>
</context_menu>
<menu_item_call label="Weź" name="Pie Object Take"/>
<menu_item_call label="Weź kopię" name="Take Copy"/>
<menu_item_call label="Zapłać" name="Pay..."/>
<menu_item_call label="Kup" name="Buy..."/>
+ <menu_item_call label="Skasuj" name="Delete"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_outfit_gear.xml b/indra/newview/skins/default/xui/pl/menu_outfit_gear.xml
index 1a70e76ec7..c093557e86 100644
--- a/indra/newview/skins/default/xui/pl/menu_outfit_gear.xml
+++ b/indra/newview/skins/default/xui/pl/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="Załóż - Zastąp obecny strój" name="wear"/>
<menu_item_call label="Załóż - Dodaj do bieżącego stroju" name="wear_add"/>
<menu_item_call label="Zdejmij - Usuń z obecnego stroju" name="take_off"/>
@@ -14,6 +14,7 @@
<menu_item_call label="Nowa podkoszulka" name="New Undershirt"/>
<menu_item_call label="Nowa bielizna" name="New Underpants"/>
<menu_item_call label="Nowa maska alpha" name="New Alpha"/>
+ <menu_item_call label="Nowa fizyka" name="New Physics"/>
<menu_item_call label="Nowy tatuaż" name="New Tattoo"/>
</menu>
<menu label="Nowe części ciała" name="New Body Parts">
@@ -24,4 +25,4 @@
</menu>
<menu_item_call label="Zmień nazwę stroju" name="rename"/>
<menu_item_call label="Usuń strój" name="delete_outfit"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_places_gear_folder.xml b/indra/newview/skins/default/xui/pl/menu_places_gear_folder.xml
index 65417cef22..d1f283b7aa 100644
--- a/indra/newview/skins/default/xui/pl/menu_places_gear_folder.xml
+++ b/indra/newview/skins/default/xui/pl/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="Dodaj do landmarków" name="add_landmark"/>
<menu_item_call label="Dodaj folder" name="add_folder"/>
+ <menu_item_call label="Przywróć obiekt" name="restore_item"/>
<menu_item_call label="Wytnij" name="cut"/>
<menu_item_call label="Kopiuj" name="copy_folder"/>
<menu_item_call label="Wklej" name="paste"/>
@@ -12,4 +13,4 @@
<menu_item_call label="Rozwiń wszystkie foldery" name="expand_all"/>
<menu_item_call label="Schowaj wszystkie foldery" name="collapse_all"/>
<menu_item_check label="Sortuj według daty" name="sort_by_date"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_places_gear_landmark.xml b/indra/newview/skins/default/xui/pl/menu_places_gear_landmark.xml
index 36787dd0aa..0139d3a987 100644
--- a/indra/newview/skins/default/xui/pl/menu_places_gear_landmark.xml
+++ b/indra/newview/skins/default/xui/pl/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="Teleportuj" name="teleport"/>
<menu_item_call label="Więcej informacji" name="more_info"/>
<menu_item_call label="Pokaż na mapie" name="show_on_map"/>
<menu_item_call label="Dodaj do landmarków" name="add_landmark"/>
<menu_item_call label="Dodaj folder" name="add_folder"/>
+ <menu_item_call label="Przywróć obiekt" name="restore_item"/>
<menu_item_call label="Wytnij" name="cut"/>
<menu_item_call label="Kopiuj landmark" name="copy_landmark"/>
<menu_item_call label="Kopiuj SLurl" name="copy_slurl"/>
@@ -15,4 +16,4 @@
<menu_item_call label="Schowaj wszystkie foldery" name="collapse_all"/>
<menu_item_check label="Sortuj według daty" name="sort_by_date"/>
<menu_item_call label="Stwórz Ulubione" name="create_pick"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_viewer.xml b/indra/newview/skins/default/xui/pl/menu_viewer.xml
index e6a9d360c4..e869806d04 100644
--- a/indra/newview/skins/default/xui/pl/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/pl/menu_viewer.xml
@@ -5,7 +5,7 @@
<menu_item_call label="Dashboard" name="Manage My Account"/>
<menu_item_call label="Kup L$" name="Buy and Sell L$"/>
<menu_item_call label="Mój Profil" name="Profile"/>
- <menu_item_call label="Zmień strój" name="ChangeOutfit"/>
+ <menu_item_call label="Mój wygląd" name="ChangeOutfit"/>
<menu_item_check label="Moja Szafa" name="Inventory"/>
<menu_item_check label="Moja Szafa" name="ShowSidetrayInventory"/>
<menu_item_check label="Moje gesturki" name="Gestures"/>
@@ -33,6 +33,7 @@
<menu label="Świat" name="World">
<menu_item_check label="Mini-Mapa" name="Mini-Map"/>
<menu_item_check label="Mapa Świata" name="World Map"/>
+ <menu_item_check label="Szukaj" name="Search"/>
<menu_item_call label="Zrób zdjęcie" name="Take Snapshot"/>
<menu_item_call label="Zapamiętaj to miejsce (LM)" name="Create Landmark Here"/>
<menu label="Miejsce" name="Land">
@@ -222,7 +223,9 @@
<menu label="Pokaż informacje" name="Display Info">
<menu_item_check label="Pokaż czas" name="Show Time"/>
<menu_item_check label="Pokaż informacje o renderowaniu" name="Show Render Info"/>
+ <menu_item_check label="Pokaż informację o teksturze" name="Show Texture Info"/>
<menu_item_check label="Pokaż kolor pod kursorem" name="Show Color Under Cursor"/>
+ <menu_item_check label="Pokaż pamięć" name="Show Memory"/>
<menu_item_check label="Pokaż aktualizacje obiektów" name="Show Updates"/>
</menu>
<menu label="Reset błędu" name="Force Errors">
@@ -240,6 +243,9 @@
<menu_item_check label="Losowa ilość klatek" name="Randomize Framerate"/>
<menu_item_check label="Test klatki obrazu" name="Frame Test"/>
</menu>
+ <menu label="Render Metadata" name="Render Metadata">
+ <menu_item_check label="Aktualizuj typ" name="Update Type"/>
+ </menu>
<menu label="Renderowanie" name="Rendering">
<menu_item_check label="Osie" name="Axes"/>
<menu_item_check label="Tryb obrazu szkieletowego" name="Wireframe"/>
@@ -328,4 +334,9 @@
</menu>
<menu_item_call label="Boskie narzędzia" name="God Tools"/>
</menu>
+ <menu label="Admin" name="Deprecated">
+ <menu label="Take Off Clothing" name="Take Off Clothing">
+ <menu_item_call label="Fizyka" name="Physics"/>
+ </menu>
+ </menu>
</menu_bar>
diff --git a/indra/newview/skins/default/xui/pl/notifications.xml b/indra/newview/skins/default/xui/pl/notifications.xml
index 25fa5da3ab..63f976a314 100644
--- a/indra/newview/skins/default/xui/pl/notifications.xml
+++ b/indra/newview/skins/default/xui/pl/notifications.xml
@@ -72,9 +72,9 @@ Szczegóły błędu: Błąd o nazwie &apos;[_NAME]&apos; nie został odnaleziony
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="LoginFailedNoNetwork">
- Brak połączenia z [SECOND_LIFE_GRID].
-&apos;[DIAGNOSTIC]&apos;
-Sprawdź stan swojego połączenia sieciowego.
+ Nie można połączyć z [SECOND_LIFE_GRID].
+ &apos;[DIAGNOSTIC]&apos;
+Upewnij się, że Twoje połączenie z internetem działa.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="MessageTemplateNotFound">
@@ -331,13 +331,6 @@ Potrzebujesz konta aby się zalogować do [SECOND_LIFE]. Czy chcesz utworzyć je
<notification name="InvalidCredentialFormat">
Należy wprowadzić nazwę użytkownika lub imię oraz nazwisko Twojego awatara w pole nazwy użytkownika a następnie ponownie się zalogować.
</notification>
- <notification name="AddClassified">
- Ogłoszenia reklamowe ukazują się w zakładce Reklama w wyszukiwarce (Szukaj) oraz na [http://secondlife.com/community/classifieds secondlife.com] przez tydzień.
-Napisz treść swojej reklamy, kliknij Zamieść by dodać katalogu ogłoszeń.
-Po zamieszczeniu reklamy zostaniesz poproszony o sprecyzowanie opłaty za Reklamę.
-Im wyższa opłata tym wyżej Twoja reklama wyświetla się w katalogu i wyszukiwarce po wpisaniu słów kluczowych.
- <usetemplate ignoretext="Jak stworzyć nową reklamę?" name="okcancelignore" notext="Anuluj" yestext="OK"/>
- </notification>
<notification name="DeleteClassified">
Usunąć reklamę &apos;[NAME]&apos;?
Pamiętaj! Nie ma rekompensaty za poniesione koszta.
@@ -2723,7 +2716,7 @@ Przycisk zostanie wyświetlony w przypadku dostatecznej ilości przestrzeni.
Zaznacz Rezydentów, z którymi chcesz się podzielić.
</notification>
<notification name="ShareItemsConfirmation">
- Jesteś pewien/pewna, że chcesz udostępnić następujące obiekty:
+ Czy na pewno chcesz udostępnić następujące obiekty:
&lt;nolink&gt;[ITEMS]&lt;/nolink&gt;
@@ -2814,24 +2807,32 @@ Wyciszyć wszystkich?
<notification label="Wstań" name="HintSit">
Aby wstać i opuścić pozycję siedzącą, kliknij przycisk Wstań.
</notification>
+ <notification label="Mów" name="HintSpeak">
+ Kliknij przycisk &quot;Mów&quot; aby włączyć i wyłączyć Twój mikrofon.
+
+Kliknij w strzałkę aby zobaczyć panel kontroli głosu.
+
+Ukrycie przycisku &quot;Mów&quot; zdezaktywuje głos.
+ </notification>
<notification label="Odkrywaj Świat" name="HintDestinationGuide">
Destination Guide zawiera tysiące nowych miejsc do odkrycia. Wybierz lokalizację i teleportuj się aby rozpocząć zwiedzanie.
</notification>
- <notification label="Zmień wygląd swojego awatara" name="HintAvatarPicker">
- Czy chcesz inaczej wyglądać? Kliknij poniższy przycisk aby zobaczyć więcej przykładów awatarów.
- </notification>
<notification label="Schowek" name="HintSidePanel">
Schowek umożliwia szybki dostęp do Twojej Szafy, ubrań, profili i innych w panelu bocznym.
</notification>
<notification label="Ruch" name="HintMove">
Aby chodzić lub biegać, otwórz panel ruchu i użyj strzałek do nawigacji. Możesz także używać strzałek z klawiatury.
</notification>
+ <notification label="" name="HintMoveClick">
+ 1. Kliknij aby chodzić.
+Kliknij gdziekolwiek na ziemi aby przejść do wskazanego miejsca.
+
+2. Kliknij i przeciągnij aby zmienić widok.
+Kliknij i przeciągnij gdziekolwiek aby obrócić widok.
+ </notification>
<notification label="Wyświetlana nazwa" name="HintDisplayName">
Ustaw wyświetlaną nazwę, którą możesz zmieniać tutaj. Jest ona dodatkiem do unikatowej nazwy użytkownika, która nie może być zmieniona. Możesz zmienić sposób w jaki widzisz nazwy innych osób w Twoich Ustawieniach.
</notification>
- <notification label="Ruch" name="HintMoveArrows">
- Użyj przycisków ze strzałkami z klawiatury aby chodzić. Jeśli wciśniesz strzałkę &apos;do góry&apos; podwójnie, zaczniesz biec.
- </notification>
<notification label="Widok" name="HintView">
To change your camera view, use the Orbit and Pan controls. Zresetuj widok poprzez wciśnięcie klawisza Esc lub chodzenie.
</notification>
@@ -2857,6 +2858,38 @@ Wyciszyć wszystkich?
<button name="cancel" text="Anuluj"/>
</form>
</notification>
+ <notification label="" name="ModeChange">
+ Zmiana trybu wymaga restartu.
+ <usetemplate name="okcancelbuttons" notext="Nie zamykaj" yestext="Zamknij"/>
+ </notification>
+ <notification label="" name="NoClassifieds">
+ Tworzenie i edycja reklam jest możliwa tylko w trybie zaawansowanym. Czy chcesz wylogować się i zmienić tryb? Opcja wyboru trybu życia jest widoczna na ekranie logowania.
+ <usetemplate name="okcancelbuttons" notext="Nie zamykaj" yestext="Zamknij"/>
+ </notification>
+ <notification label="" name="NoGroupInfo">
+ Tworzenie i edycja grup jest możliwa tylko w trybie zaawansowanym. Czy chcesz wylogować się i zmienić tryb? Opcja wyboru trybu życia jest widoczna na ekranie logowania.
+ <usetemplate name="okcancelbuttons" notext="Nie zamykaj" yestext="Zamknij"/>
+ </notification>
+ <notification label="" name="NoPicks">
+ Tworzenie i edycja Ulubionych jest możliwa jedynie w trybie zaawansowanym. Czy chcesz się wylogować i zmienić tryb? Opcja wyboru trybu życia jest widoczna na ekranie logowania.
+ <usetemplate name="okcancelbuttons" notext="Nie zamykaj" yestext="Zamknij"/>
+ </notification>
+ <notification label="" name="NoWorldMap">
+ Oglądanie mapy świata jest możliwe tylko w trybie zaawansowanym. Czy chcesz się wylogować i zmienić tryb? Opcja wyboru trybu życia jest widoczna na ekranie logowania.
+ <usetemplate name="okcancelbuttons" notext="Nie zamykaj" yestext="Zamknij"/>
+ </notification>
+ <notification label="" name="NoVoiceCall">
+ Rozmowy głosowe są możliwe tylko w trybie zaawansowanym. Czy chcesz wylogować się i zmienić tryb?
+ <usetemplate name="okcancelbuttons" notext="Nie zamykaj" yestext="Zamknij"/>
+ </notification>
+ <notification label="" name="NoAvatarShare">
+ Udostępnienie jest możliwe tylko w trybie zaawansowanym. Czy chcesz wylogować się i zmienić tryb? Opcja wyboru trybu życia jest widoczna na ekranie logowania.
+ <usetemplate name="okcancelbuttons" notext="Nie zamykaj" yestext="Zamknij"/>
+ </notification>
+ <notification label="" name="NoAvatarPay">
+ Płacenie innym Rezydentom jest możliwe tylko w trybie zaawansowanym. Czy chcesz się wylogować i zmienić tryb? Opcja wyboru trybu życia jest widoczna na ekranie logowania.
+ <usetemplate name="okcancelbuttons" notext="Nie zamykaj" yestext="Zamknij"/>
+ </notification>
<global name="UnsupportedCPU">
- Prędkość Twojego CPU nie spełnia minimalnych wymagań.
</global>
diff --git a/indra/newview/skins/default/xui/pl/panel_edit_physics.xml b/indra/newview/skins/default/xui/pl/panel_edit_physics.xml
new file mode 100644
index 0000000000..a773a52a59
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/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="Podskakiwanie piersi"/>
+ <accordion_tab name="physics_breasts_inout_tab" title="Rowek między piersiami"/>
+ <accordion_tab name="physics_breasts_leftright_tab" title="Kołysanie piersi"/>
+ <accordion_tab name="physics_belly_tab" title="Poskakiwanie brzucha"/>
+ <accordion_tab name="physics_butt_tab" title="Podksakiwanie pośladków"/>
+ <accordion_tab name="physics_butt_leftright_tab" title="Kołysanie pośladków"/>
+ <accordion_tab name="physics_advanced_tab" title="Zaawansowane parametry"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_edit_wearable.xml b/indra/newview/skins/default/xui/pl/panel_edit_wearable.xml
index d1157b910d..2027b8715b 100644
--- a/indra/newview/skins/default/xui/pl/panel_edit_wearable.xml
+++ b/indra/newview/skins/default/xui/pl/panel_edit_wearable.xml
@@ -45,6 +45,9 @@
<string name="edit_tattoo_title">
Edycja tatuażu
</string>
+ <string name="edit_physics_title">
+ Edycja fizyki
+ </string>
<string name="shape_desc_text">
Kształt:
</string>
@@ -90,6 +93,9 @@
<string name="tattoo_desc_text">
Tatuaż:
</string>
+ <string name="physics_desc_text">
+ Fizyka:
+ </string>
<labeled_back_button label="Zapisz" name="back_btn" tool_tip="Powrót do edycji stroju"/>
<text name="edit_wearable_title" value="Edycja kształtu"/>
<panel label="Koszula" name="wearable_type_panel">
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_login.xml b/indra/newview/skins/default/xui/pl/panel_login.xml
index 81da94a659..dc8e7399af 100644
--- a/indra/newview/skins/default/xui/pl/panel_login.xml
+++ b/indra/newview/skins/default/xui/pl/panel_login.xml
@@ -14,6 +14,13 @@
</text>
<check_box label="Zapamiętaj hasło" name="remember_check"/>
<button label="Połącz" name="connect_btn"/>
+ <text name="mode_selection_text">
+ Tryb życia:
+ </text>
+ <combo_box name="mode_combo" tool_tip="Wybierz tryb życia. Wybierz tryb turystyczny dla łatwego zwiedzania i czatowania. Wybierz tryb zaawansowany aby mieć dostęp do większej ilości opcji.">
+ <combo_box.item label="Turystyczny" name="Basic"/>
+ <combo_box.item label="Zaawansowany" name="Advanced"/>
+ </combo_box>
<text name="start_location_text">
Rozpocznij w:
</text>
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_nearby_media.xml b/indra/newview/skins/default/xui/pl/panel_nearby_media.xml
index c9f951f7c6..d77c6d7852 100644
--- a/indra/newview/skins/default/xui/pl/panel_nearby_media.xml
+++ b/indra/newview/skins/default/xui/pl/panel_nearby_media.xml
@@ -19,7 +19,7 @@
<button label="Zatrzymaj" name="all_nearby_media_disable_btn" tool_tip="Wyłącz wszystkie media w pobliżu"/>
<button label="Włącz" name="all_nearby_media_enable_btn" tool_tip="Włącz wszystkie media w pobliżu"/>
<button name="open_prefs_btn" tool_tip="Uruchom preferencje medialne"/>
- <button label="Więcej &gt;&gt;" label_selected="Mniej &lt;&lt;" name="more_btn" tool_tip="Zaawansowane"/>
+ <button label="Więcej &gt;&gt;" label_selected="&lt;&lt; Mniej" name="more_btn" tool_tip="Zaawansowane"/>
<button label="Więcej &gt;&gt;" label_selected="Mniej &lt;&lt;" name="less_btn" tool_tip="Zaawansowane"/>
</panel>
<panel name="nearby_media_panel">
diff --git a/indra/newview/skins/default/xui/pl/panel_people.xml b/indra/newview/skins/default/xui/pl/panel_people.xml
index 1bd5b4a912..da9f84cb2e 100644
--- a/indra/newview/skins/default/xui/pl/panel_people.xml
+++ b/indra/newview/skins/default/xui/pl/panel_people.xml
@@ -18,6 +18,8 @@ Chcesz spotkać ludzi? Spróbuj [secondlife:///app/worldmap Mapa Świata].
<string name="groups_filter_label" value="Filtruj grupy"/>
<string name="no_filtered_groups_msg" value="Nie znaleziono tego czego szukasz? Spróbuj [secondlife:///app/search/groups/[SEARCH_TERM] Szukaj]."/>
<string name="no_groups_msg" value="Chcesz dołączyć do grup? Spróbuj [secondlife:///app/search/groups Szukaj]."/>
+ <string name="MiniMapToolTipMsg" value="[REGION](Podwójne kliknięcie otwiera mapę, wciśnij Shift i przeciągnij aby przesunąć)"/>
+ <string name="AltMiniMapToolTipMsg" value="[REGION](Podwójne kliknięcie aktywuje teleport, wciśnij Shift i przeciągnij aby przesunąć)"/>
<filter_editor label="Filtr" name="filter_input"/>
<tab_container name="tabs">
<panel label="W POBLIŻU" name="nearby_panel">
diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml b/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml
index 4a4e6509ab..3251099f74 100644
--- a/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml
@@ -30,7 +30,9 @@
<spinner label="Czas widoczności czatu w pobliżu:" name="nearby_toasts_lifetime"/>
<spinner label="Czas znikania czatu w pobliżu:" name="nearby_toasts_fadingtime"/>
<check_box name="translate_chat_checkbox"/>
- <text name="translate_chb_label" >Używaj translatora podczas rozmowy (wspierany przez Google)</text>
+ <text name="translate_chb_label">
+ Użyj translatora podczas rozmowy (wspierany przez Google)
+ </text>
<text name="translate_language_text">
Przetłumacz czat na:
</text>
diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_colors.xml b/indra/newview/skins/default/xui/pl/panel_preferences_colors.xml
index 3d1160882b..3affda57bf 100644
--- a/indra/newview/skins/default/xui/pl/panel_preferences_colors.xml
+++ b/indra/newview/skins/default/xui/pl/panel_preferences_colors.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Kolory" name="colors_panel">
<text name="effects_color_textbox">
- Moje efekty (selection beam):
+ Moje efekty (opcje wyboru):
</text>
<color_swatch name="effect_color_swatch" tool_tip="Kliknij aby wybrać kolor"/>
<text name="font_colors">
- Kolor czcionki czatu:
+ Kolory czcionki czatu:
</text>
<text name="text_box1">
Ja
@@ -34,8 +34,8 @@
<color_swatch name="background" tool_tip="Wybierz kolor taga"/>
<slider label="Przeźroczystość:" name="bubble_chat_opacity" tool_tip="Wybierz przeźroczystość taga"/>
<text name="floater_opacity">
- Przeźroczystość:
+ Floater Opacity:
</text>
- <slider label="Aktywny:" name="active"/>
- <slider label="Niekatywny:" name="inactive"/>
+ <slider label="Aktywne:" name="active"/>
+ <slider label="Nieaktywne:" name="inactive"/>
</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/pl/panel_preferences_graphics1.xml
index 0f21aa9dd1..f2beef091a 100644
--- a/indra/newview/skins/default/xui/pl/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/pl/panel_preferences_graphics1.xml
@@ -40,6 +40,10 @@
<combo_box.item label="Awatary i obiekty" name="3"/>
<combo_box.item label="Wszystko" name="4"/>
</combo_box>
+ <slider label="Fizyka awatara:" name="AvatarPhysicsDetail"/>
+ <text name="AvatarPhysicsDetailText">
+ Niska
+ </text>
<slider label="Pole widzenia:" name="DrawDistance"/>
<text name="DrawDistanceMeterText2">
m
@@ -78,7 +82,7 @@
Mało
</text>
<text name="AvatarRenderingText">
- Rendering awatarów
+ Rendering awatara:
</text>
<check_box initial_value="true" label="Impostoryzacja awatarowa" name="AvatarImpostors"/>
<check_box initial_value="true" label="Rendering awatara przez GPU" name="AvatarVertexProgram"/>
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/panel_preferences_sound.xml b/indra/newview/skins/default/xui/pl/panel_preferences_sound.xml
index 692f24715b..46f5ebb8e2 100644
--- a/indra/newview/skins/default/xui/pl/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/pl/panel_preferences_sound.xml
@@ -5,12 +5,14 @@
</panel.string>
<slider label="Główny" name="System Volume"/>
<check_box initial_value="true" name="mute_when_minimized"/>
- <text name="mute_chb_label">Wycisz podczas minimalizacji</text>
+ <text name="mute_chb_label">
+ Wycisz podczas minimalizacji
+ </text>
<slider label="Interfejs" name="UI Volume"/>
<slider label="Otoczenie" name="Wind Volume"/>
<slider label="Efekty dźwiękowe" name="SFX Volume"/>
<slider label="Muzyka strumieniowa" name="Music Volume"/>
- <check_box label="Odtwarzaj media audio" name="enable_music"/>
+ <check_box label="Aktywny" name="enable_music"/>
<slider label="Media" name="Media Volume"/>
<check_box label="Odtwarzaj media" name="enable_media"/>
<slider label="Komunikacja głosowa" name="Voice Volume"/>
diff --git a/indra/newview/skins/default/xui/pl/panel_profile.xml b/indra/newview/skins/default/xui/pl/panel_profile.xml
index 4152c00386..77dd951bc4 100644
--- a/indra/newview/skins/default/xui/pl/panel_profile.xml
+++ b/indra/newview/skins/default/xui/pl/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:"/>
<text name="title_partner_text" value="Partner:"/>
<panel name="partner_data_panel">
- <name_box initial_value="(przetwarzanie)" name="partner_text"/>
+ <text initial_value="(przetwarzanie)" name="partner_text"/>
</panel>
<text name="title_groups_text" value="Grupy:"/>
</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_script_ed.xml b/indra/newview/skins/default/xui/pl/panel_script_ed.xml
index e18900af68..b05223aa0f 100644
--- a/indra/newview/skins/default/xui/pl/panel_script_ed.xml
+++ b/indra/newview/skins/default/xui/pl/panel_script_ed.xml
@@ -15,6 +15,9 @@
<panel.string name="Title">
Skrypt: [NAME]
</panel.string>
+ <panel.string name="external_editor_not_set">
+ Wybierz edytor poprzez ustawienie zmiennej środowiska LL_SCRIPT_EDITOR lub ustawienie ExternalEditor.
+ </panel.string>
<menu_bar name="script_menu">
<menu label="Plik" name="File">
<menu_item_call label="Zapisz" name="Save"/>
diff --git a/indra/newview/skins/default/xui/pl/panel_scrolling_param_base.xml b/indra/newview/skins/default/xui/pl/panel_scrolling_param_base.xml
new file mode 100644
index 0000000000..fa659040ea
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/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/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 e6019bf66d..6eceed46d3 100644
--- a/indra/newview/skins/default/xui/pl/strings.xml
+++ b/indra/newview/skins/default/xui/pl/strings.xml
@@ -852,6 +852,9 @@
<string name="tattoo">
Tatuaż
</string>
+ <string name="physics">
+ Fizyka
+ </string>
<string name="invalid">
niewłaściwa funkcja
</string>
@@ -891,6 +894,9 @@
<string name="tattoo_not_worn">
Tatuaż nie jest założony
</string>
+ <string name="physics_not_worn">
+ Fizyka niezałożona
+ </string>
<string name="invalid_not_worn">
nieważny
</string>
@@ -939,6 +945,9 @@
<string name="create_new_tattoo">
Nowy tatuaż
</string>
+ <string name="create_new_physics">
+ Stwórz nową fizykę
+ </string>
<string name="create_new_invalid">
nieważny
</string>
@@ -1037,7 +1046,7 @@
</string>
<string name="WornOnAttachmentPoint" value=" (założony na [ATTACHMENT_POINT])"/>
<string name="ActiveGesture" value="[GESLABEL] (aktywne)"/>
- <string name="Chat" value=" Czat :"/>
+ <string name="Chat Message" value="Czat:"/>
<string name="Sound" value=" Dźwięk :"/>
<string name="Wait" value=" --- Zaczekaj :"/>
<string name="AnimFlagStop" value=" Zatrzymaj animację :"/>
@@ -1455,7 +1464,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">
@@ -1819,12 +1828,6 @@ Expected .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
<string name="accel-win-shift">
Shift+
</string>
- <string name="Esc">
- Esc
- </string>
- <string name="Home">
- Miejsce Startu
- </string>
<string name="FileSaved">
Zapisane pliki
</string>
@@ -1847,13 +1850,13 @@ Expected .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
Do przodu
</string>
<string name="Direction_Left">
- W lewo
+ Lewo
</string>
<string name="Direction_Right">
- W prawo
+ Prawo
</string>
<string name="Direction_Back">
- Wróć
+ Wstecz
</string>
<string name="Direction_North">
Północ
@@ -1942,6 +1945,9 @@ Expected .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
<string name="Other">
Inna
</string>
+ <string name="Rental">
+ Wynajem
+ </string>
<string name="Any">
Jakiekolwiek
</string>
@@ -2178,6 +2184,114 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj się z [SUPPORT_SITE].
<string name="Bulbous Nose">
Bulwiasty nos
</string>
+ <string name="Breast Physics Mass">
+ Masa piersi
+ </string>
+ <string name="Breast Physics Smoothing">
+ Wygładzanie piersi
+ </string>
+ <string name="Breast Physics Gravity">
+ Grawitacja piersi
+ </string>
+ <string name="Breast Physics Drag">
+ Ściśnięcie piersi
+ </string>
+ <string name="Breast Physics InOut Max Effect">
+ Efekt max
+ </string>
+ <string name="Breast Physics InOut Spring">
+ Sprężystość
+ </string>
+ <string name="Breast Physics InOut Gain">
+ Wzmocnienie
+ </string>
+ <string name="Breast Physics InOut Damping">
+ Tłumienie
+ </string>
+ <string name="Breast Physics UpDown Max Effect">
+ Efekt max
+ </string>
+ <string name="Breast Physics UpDown Spring">
+ Sprężystość
+ </string>
+ <string name="Breast Physics UpDown Gain">
+ Wzmocnienie
+ </string>
+ <string name="Breast Physics UpDown Damping">
+ Tłumienie
+ </string>
+ <string name="Breast Physics LeftRight Max Effect">
+ Efekt max
+ </string>
+ <string name="Breast Physics LeftRight Spring">
+ Sprężystość
+ </string>
+ <string name="Breast Physics LeftRight Gain">
+ Wzmocnienie
+ </string>
+ <string name="Breast Physics LeftRight Damping">
+ Tłumienie
+ </string>
+ <string name="Belly Physics Mass">
+ Masa brzucha
+ </string>
+ <string name="Belly Physics Smoothing">
+ Wygładzanie brzucha
+ </string>
+ <string name="Belly Physics Gravity">
+ Grawitacja brzucha
+ </string>
+ <string name="Belly Physics Drag">
+ Ściśnięcie brzucha
+ </string>
+ <string name="Belly Physics UpDown Max Effect">
+ Efekt max
+ </string>
+ <string name="Belly Physics UpDown Spring">
+ Sprężystość
+ </string>
+ <string name="Belly Physics UpDown Gain">
+ Wzmocnienie
+ </string>
+ <string name="Belly Physics UpDown Damping">
+ Tłumienie
+ </string>
+ <string name="Butt Physics Mass">
+ Masa pośladków
+ </string>
+ <string name="Butt Physics Smoothing">
+ Wygładzanie pośladków
+ </string>
+ <string name="Butt Physics Gravity">
+ Grawitacja pośladków
+ </string>
+ <string name="Butt Physics Drag">
+ Ściśnięcie pośladków
+ </string>
+ <string name="Butt Physics UpDown Max Effect">
+ Efekt max
+ </string>
+ <string name="Butt Physics UpDown Spring">
+ Sprężystość
+ </string>
+ <string name="Butt Physics UpDown Gain">
+ Wzmocnienie
+ </string>
+ <string name="Butt Physics UpDown Damping">
+ Tłumienie
+ </string>
+ <string name="Butt Physics LeftRight Max Effect">
+ Efekt max
+ </string>
+ <string name="Butt Physics LeftRight Spring">
+ Sprężystość
+ </string>
+ <string name="Butt Physics LeftRight Gain">
+ Wzmocnienie
+ </string>
+ <string name="Butt Physics LeftRight Damping">
+ Tłumienie
+ </string>
<string name="Bushy Eyebrows">
Bujne brwi
</string>
@@ -2187,6 +2301,9 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj się z [SUPPORT_SITE].
<string name="Butt Size">
Rozmiar pośladków
</string>
+ <string name="Butt Gravity">
+ Grawitacja pośladków
+ </string>
<string name="bustle skirt">
Bustle Skirt
</string>
@@ -3662,6 +3779,9 @@ Raport o Nadużyciu
<string name="New Tattoo">
Nowy tatuaż
</string>
+ <string name="New Physics">
+ Nowa fizyka
+ </string>
<string name="Invalid Wearable">
Nieaktualne ubranie/część ciała
</string>
@@ -3861,7 +3981,7 @@ Raport o Nadużyciu
<string name="Notices">
Ogłoszenia
</string>
- <string name="Chat">
+ <string name="Chat" value=" Czat :">
Czat
</string>
<string name="DeleteItems">
@@ -3873,4 +3993,348 @@ Raport o Nadużyciu
<string name="EmptyOutfitText">
W tym stroju nie ma elementów
</string>
+ <string name="ExternalEditorNotSet">
+ Wybierz edytor używając ustawień ExternalEditor.
+ </string>
+ <string name="ExternalEditorNotFound">
+ Nie odnaleziono zewnętrzego edytora wskazanego przez Ciebie.
+Spróbuj załączyć ścieżkę do edytora w cytowaniu.
+(np. &quot;/ścieżka do mojego/edytora&quot; &quot;%s&quot;)
+ </string>
+ <string name="ExternalEditorCommandParseError">
+ Błąd w składni komendy zewnętrznego edytora.
+ </string>
+ <string name="ExternalEditorFailedToRun">
+ Uruchomienie zewnętrznego edytora nie powiodło się.
+ </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">
+ Miejsce Startu
+ </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">
+ Dodaj
+ </string>
+ <string name="Subtract">
+ Odejmij
+ </string>
+ <string name="Multiply">
+ Mnożenie
+ </string>
+ <string name="Divide">
+ Podziel
+ </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">
+ Podgląd lokalizatorów cząsteczek (niebieski)
+ </string>
+ <string name="BeaconPhysical">
+ Podgląd lokalizatorów fizycznych obiektów (zielony)
+ </string>
+ <string name="BeaconScripted">
+ Podgląd lokalizatorów obiektów skryptowanych (czerwony)
+ </string>
+ <string name="BeaconScriptedTouch">
+ Podgląd lokalizatorów obiektów skryptowanych z opcją dotyku (czerwony)
+ </string>
+ <string name="BeaconSound">
+ Podgląd lokalizatorów dźwięków (żółty)
+ </string>
+ <string name="BeaconMedia">
+ Podgląd lokalizatorów mediów (biały)
+ </string>
+ <string name="ParticleHiding">
+ Ukryj cząsteczki
+ </string>
</strings>
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_beacons.xml b/indra/newview/skins/default/xui/pt/floater_beacons.xml
index b16ff6003e..f8ae3cd2d8 100644
--- a/indra/newview/skins/default/xui/pt/floater_beacons.xml
+++ b/indra/newview/skins/default/xui/pt/floater_beacons.xml
@@ -17,5 +17,6 @@
<check_box label="Só tocar" name="touch_only"/>
<check_box label="Fontes de som" name="sounds"/>
<check_box label="Fontes de partículas" name="particles"/>
+ <check_box label="Fontes de mídia" name="moapbeacon"/>
</panel>
</floater>
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_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_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_pay.xml b/indra/newview/skins/default/xui/pt/floater_pay.xml
index 26d5710c4a..8094ad376c 100644
--- a/indra/newview/skins/default/xui/pt/floater_pay.xml
+++ b/indra/newview/skins/default/xui/pt/floater_pay.xml
@@ -6,18 +6,18 @@
<string name="payee_resident">
Pagar residente
</string>
- <text left="5" name="payee_label" width="110">
+ <text left="5" name="payee_label">
Pagar:
</text>
<icon name="icon_person" tool_tip="Pessoa"/>
- <text left="115" name="payee_name">
+ <text name="payee_name">
Test Name That Is Extremely Long To Check Clipping
</text>
- <button label="L$1" label_selected="L$1" left="112" name="fastpay 1"/>
+ <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" left="112" name="fastpay 10"/>
+ <button label="L$10" label_selected="L$10" name="fastpay 10"/>
<button label="L$20" label_selected="L$20" name="fastpay 20"/>
- <text left="4" name="amount text">
+ <text name="amount text">
Outro valor:
</text>
<button label="Pagar" label_selected="Pagar" name="pay btn"/>
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_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_tos.xml b/indra/newview/skins/default/xui/pt/floater_tos.xml
index 2675979783..c4954cb61f 100644
--- a/indra/newview/skins/default/xui/pt/floater_tos.xml
+++ b/indra/newview/skins/default/xui/pt/floater_tos.xml
@@ -4,7 +4,7 @@
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 Carregando %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
+ data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Carregando %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETermos%20de%20Serviço%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E
</floater.string>
<button label="Continuar" label_selected="Continuar" name="Continue"/>
<button label="Cancelar" label_selected="Cancelar" name="Cancel"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_water.xml b/indra/newview/skins/default/xui/pt/floater_water.xml
index b4613e0890..b2a06f4ff2 100644
--- a/indra/newview/skins/default/xui/pt/floater_water.xml
+++ b/indra/newview/skins/default/xui/pt/floater_water.xml
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Water Floater" title="EDITOR DE ÁGUA AVANÇADO">
- <text name="KeyFramePresetsText" width="154">
+ <text name="KeyFramePresetsText" width="175">
Pré-configurações da Água:
</text>
- <combo_box left_delta="160" name="WaterPresetsCombo" width="150"/>
+ <combo_box left_delta="175" 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"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_windlight_options.xml b/indra/newview/skins/default/xui/pt/floater_windlight_options.xml
index 22632a4ef8..ec459bbb26 100644
--- a/indra/newview/skins/default/xui/pt/floater_windlight_options.xml
+++ b/indra/newview/skins/default/xui/pt/floater_windlight_options.xml
@@ -1,9 +1,9 @@
<?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">
+ <text name="KeyFramePresetsText" width="140">
Pré-definições de Céu:
</text>
- <combo_box left_delta="130" name="WLPresetsCombo"/>
+ <combo_box left_delta="140" 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"/>
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_avatar_self.xml b/indra/newview/skins/default/xui/pt/menu_avatar_self.xml
index e2fd61745f..e84dcb093d 100644
--- a/indra/newview/skins/default/xui/pt/menu_avatar_self.xml
+++ b/indra/newview/skins/default/xui/pt/menu_avatar_self.xml
@@ -14,6 +14,7 @@
<menu_item_call label="Camiseta" name="Self Undershirt"/>
<menu_item_call label="Roupa de baixo" name="Self Underpants"/>
<menu_item_call label="Tatuagem" name="Self Tattoo"/>
+ <menu_item_call label="Físico" name="Self Physics"/>
<menu_item_call label="Alpha" name="Self Alpha"/>
<menu_item_call label="Todas as roupas" name="All Clothes"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_bottomtray.xml b/indra/newview/skins/default/xui/pt/menu_bottomtray.xml
index bd628c94d3..7585160954 100644
--- a/indra/newview/skins/default/xui/pt/menu_bottomtray.xml
+++ b/indra/newview/skins/default/xui/pt/menu_bottomtray.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="hide_camera_move_controls_menu">
- <menu_item_check label="Voz ativada" name="EnableVoiceChat"/>
+ <menu_item_check label="Botão Falar" name="EnableVoiceChat"/>
<menu_item_check label="Botão de gestos" name="ShowGestureButton"/>
<menu_item_check label="Botão de movimento" name="ShowMoveButton"/>
<menu_item_check label="Botão de ver" name="ShowCameraButton"/>
diff --git a/indra/newview/skins/default/xui/pt/menu_inventory.xml b/indra/newview/skins/default/xui/pt/menu_inventory.xml
index 1b1efd3270..7aa3b836a4 100644
--- a/indra/newview/skins/default/xui/pt/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/pt/menu_inventory.xml
@@ -25,6 +25,7 @@
<menu_item_call label="Nova roupa de baixo" name="New Underpants"/>
<menu_item_call label="Nova máscara alfa" name="New Alpha Mask"/>
<menu_item_call label="Nova tatuagem" name="New Tattoo"/>
+ <menu_item_call label="Novo físico" name="New Physics"/>
</menu>
<menu label="Nova parte do corpo" name="New Body Parts">
<menu_item_call label="Nova forma" name="New Shape"/>
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 2723f39287..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>
@@ -23,6 +25,7 @@
<menu_item_call label="Novas roupa de baixo" name="New Underpants"/>
<menu_item_call label="Novo alpha" name="New Alpha"/>
<menu_item_call label="Nova tatuagem" name="New Tattoo"/>
+ <menu_item_call label="Novo físico" name="New Physics"/>
</menu>
<menu label="Nova parte do corpo" name="New Body Parts">
<menu_item_call label="Nova forma" name="New Shape"/>
diff --git a/indra/newview/skins/default/xui/pt/menu_media_ctrl.xml b/indra/newview/skins/default/xui/pt/menu_media_ctrl.xml
new file mode 100644
index 0000000000..44117c8865
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/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="Cortar" name="Cut"/>
+ <menu_item_call label="Cortar" name="Copy"/>
+ <menu_item_call label="Colar" name="Paste"/>
+</context_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_outfit_gear.xml b/indra/newview/skins/default/xui/pt/menu_outfit_gear.xml
index 11b3e653c6..894f1d741c 100644
--- a/indra/newview/skins/default/xui/pt/menu_outfit_gear.xml
+++ b/indra/newview/skins/default/xui/pt/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="Vestir - Substituir look atual" name="wear"/>
<menu_item_call label="Vestir - Adicionar ao look atual" name="wear_add"/>
<menu_item_call label="Tirar - Tirar do look atual" name="take_off"/>
@@ -14,6 +14,7 @@
<menu_item_call label="Nova camiseta" name="New Undershirt"/>
<menu_item_call label="Novas roupa de baixo" name="New Underpants"/>
<menu_item_call label="Novo alpha" name="New Alpha"/>
+ <menu_item_call label="Novo físico" name="New Physics"/>
<menu_item_call label="Nova tatuagem" name="New Tattoo"/>
</menu>
<menu label="Nova parte do corpo" name="New Body Parts">
@@ -24,4 +25,4 @@
</menu>
<menu_item_call label="Renomear look" name="rename"/>
<menu_item_call label="Excluir visual" name="delete_outfit"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_viewer.xml b/indra/newview/skins/default/xui/pt/menu_viewer.xml
index 538b20e01f..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"/>
@@ -336,4 +346,9 @@
</menu>
<menu_item_call label="God Tools" name="God Tools"/>
</menu>
+ <menu label="Admin" name="Deprecated">
+ <menu label="Take Off Clothing" name="Take Off Clothing">
+ <menu_item_call label="Físico" name="Physics"/>
+ </menu>
+ </menu>
</menu_bar>
diff --git a/indra/newview/skins/default/xui/pt/notifications.xml b/indra/newview/skins/default/xui/pt/notifications.xml
index 31e29fb6c1..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,8 +2739,11 @@ 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 items abaixo?
+ Tem certeza de que quer compartilhar os itens abaixo?
&lt;nolink&gt;[ITEMS]&lt;/nolink&gt;
@@ -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.
@@ -2822,6 +2848,13 @@ Silenciar todos?
<notification label="Levantar-se" name="HintSit">
Para se levantar quando estiver sentado, clique em Levantar-se
</notification>
+ <notification label="Falar" name="HintSpeak">
+ Clique no botão Falar para ligar ou desligar o microfone.
+
+Clique na seta para cima para ver o painel de controles de voz.
+
+Se o botão Falar for ocultado, o recurso de voz será desabilitado.
+ </notification>
<notification label="Explore o mundo" name="HintDestinationGuide">
O Guia de Destinos traz milhares de lugares novos para você explorar e conhecer. Selecione um lugar, clique em Teletransportar e comece suas descobertas.
</notification>
@@ -2831,12 +2864,14 @@ Silenciar todos?
<notification label="Movimentar" name="HintMove">
Para andar ou correr, clique no botão Movimentar e use as setas para controlar a direção. Ou use as setas do teclado.
</notification>
+ <notification label="" name="HintMoveClick">
+ 1. Clique para andar Clique em qualquer lugar no solo para andar até o local.
+
+2. Clique e arraste para girar a exibição Clique e arraste em qualquer lugar no mundo para girar a exibição
+ </notification>
<notification label="Nome de tela" name="HintDisplayName">
Defina seu nome de tela personalizável. O nome de tele é separado do seu nome de usuário, que não pode ser modificado. Você pode mudar a visualização dos nomes de outras pessoas nas suas preferências.
</notification>
- <notification label="Movimentar" name="HintMoveArrows">
- Para andar, use as setas do teclado. Para correr, pressione a seta para cima duas vezes.
- </notification>
<notification label="Exibir" name="HintView">
Para mudar o ângulo de visualização, use os controles Órbita e Pan. Volte à visualização normal pressionando a tecla Escape ou começando a andar.
</notification>
@@ -2874,6 +2909,10 @@ Silenciar todos?
É 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"/>
@@ -2894,9 +2933,18 @@ Silenciar todos?
É 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_physics.xml b/indra/newview/skins/default/xui/pt/panel_edit_physics.xml
new file mode 100644
index 0000000000..967aab8bc3
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/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="Seios - movimento vertical"/>
+ <accordion_tab name="physics_breasts_inout_tab" title="Seios - decote"/>
+ <accordion_tab name="physics_breasts_leftright_tab" title="Seios - movimento lateral"/>
+ <accordion_tab name="physics_belly_tab" title="Barriga - movimento vertical"/>
+ <accordion_tab name="physics_butt_tab" title="Nádegas - movimento vertical"/>
+ <accordion_tab name="physics_butt_leftright_tab" title="Nádegas - movimento lateral"/>
+ <accordion_tab name="physics_advanced_tab" title="Parâmetros avançados"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_edit_wearable.xml b/indra/newview/skins/default/xui/pt/panel_edit_wearable.xml
index 679bb524b4..2e3e3d6305 100644
--- a/indra/newview/skins/default/xui/pt/panel_edit_wearable.xml
+++ b/indra/newview/skins/default/xui/pt/panel_edit_wearable.xml
@@ -45,6 +45,9 @@
<string name="edit_tattoo_title">
Editando tatuagem
</string>
+ <string name="edit_physics_title">
+ Editando o físico
+ </string>
<string name="shape_desc_text">
Forma:
</string>
@@ -90,6 +93,9 @@
<string name="tattoo_desc_text">
Tatuagem:
</string>
+ <string name="physics_desc_text">
+ Físico:
+ </string>
<labeled_back_button label="Salvar" name="back_btn" tool_tip="Voltar à edição de look"/>
<text name="edit_wearable_title" value="Editando forma"/>
<panel label="Camisa" name="wearable_type_panel">
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_preferences_chat.xml b/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml
index 412bdbb13e..e5aa42aae0 100644
--- a/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml
@@ -30,7 +30,9 @@
<spinner label="Transição de avisos de bate-papos por perto:" name="nearby_toasts_lifetime"/>
<spinner label="Transição de avisos de bate-papos por perto:" name="nearby_toasts_fadingtime"/>
<check_box name="translate_chat_checkbox"/>
- <text name="translate_chb_label" >Traduzir bate-papo automaticamente (via Google)</text>
+ <text name="translate_chb_label">
+ Traduzir bate-papo automaticamente (via Google)
+ </text>
<text name="translate_language_text">
Traduzir bate-papo para:
</text>
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 5f2f341e3f..d6c6f66e37 100644
--- a/indra/newview/skins/default/xui/pt/panel_preferences_colors.xml
+++ b/indra/newview/skins/default/xui/pt/panel_preferences_colors.xml
@@ -14,7 +14,7 @@
Outros
</text>
<text name="text_box3">
- Objetos
+ Objects
</text>
<text name="text_box4">
Sistema
@@ -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 c2efbf0300..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>
@@ -40,6 +52,10 @@ rápido
<combo_box.item label="Avatares e objetos" name="3"/>
<combo_box.item label="Tudo" name="4"/>
</combo_box>
+ <slider label="Físico do avatar:" name="AvatarPhysicsDetail"/>
+ <text name="AvatarPhysicsDetailText">
+ Baixo
+ </text>
<slider label="Distancia de desenho:" name="DrawDistance"/>
<text name="DrawDistanceMeterText2">
m
@@ -78,7 +94,7 @@ rápido
Baixo
</text>
<text name="AvatarRenderingText">
- Renderização de Avatar:
+ Renderização do avatar:
</text>
<check_box initial_value="true" label="Atributos do Avatar" name="AvatarImpostors"/>
<check_box initial_value="true" label="Melhoria de Hardware" name="AvatarVertexProgram"/>
diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_sound.xml b/indra/newview/skins/default/xui/pt/panel_preferences_sound.xml
index 6053deb5b1..4164147e5c 100644
--- a/indra/newview/skins/default/xui/pt/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/pt/panel_preferences_sound.xml
@@ -5,7 +5,9 @@
</panel.string>
<slider label="Volume principal" name="System Volume"/>
<check_box initial_value="true" name="mute_when_minimized"/>
- <text name="mute_chb_label">Silenciar ao minimizar</text>
+ <text name="mute_chb_label">
+ Silenciar ao minimizar
+ </text>
<slider label="Botões" name="UI Volume"/>
<slider label="Ambiente" name="Wind Volume"/>
<slider label="Efeitos sonoros" name="SFX Volume"/>
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_scrolling_param_base.xml b/indra/newview/skins/default/xui/pt/panel_scrolling_param_base.xml
new file mode 100644
index 0000000000..0a5a2e2572
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/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/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 47813604ff..c5268966c1 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>
@@ -855,6 +952,9 @@
<string name="tattoo">
Tatuagem
</string>
+ <string name="physics">
+ Físico
+ </string>
<string name="invalid">
Inválido
</string>
@@ -894,6 +994,9 @@
<string name="tattoo_not_worn">
Tatuagem não usada
</string>
+ <string name="physics_not_worn">
+ Físico não usado
+ </string>
<string name="invalid_not_worn">
inválido
</string>
@@ -942,6 +1045,9 @@
<string name="create_new_tattoo">
Criar nova tatuagem
</string>
+ <string name="create_new_physics">
+ Criar novo físico
+ </string>
<string name="create_new_invalid">
inválido
</string>
@@ -1144,6 +1250,9 @@
<string name="InvFolder Accessories">
Acessórios
</string>
+ <string name="InvFolder Meshes">
+ Meshes:
+ </string>
<string name="InvFolder Friends">
Amigos
</string>
@@ -1457,8 +1566,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">
@@ -2177,6 +2286,114 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<string name="Bulbous Nose">
Nariz em bulbo
</string>
+ <string name="Breast Physics Mass">
+ Seios - massa
+ </string>
+ <string name="Breast Physics Smoothing">
+ Seios - suavização
+ </string>
+ <string name="Breast Physics Gravity">
+ Seios - gravidade
+ </string>
+ <string name="Breast Physics Drag">
+ Seios - resistência do ar
+ </string>
+ <string name="Breast Physics InOut Max Effect">
+ Efeito máximo
+ </string>
+ <string name="Breast Physics InOut Spring">
+ Vibração
+ </string>
+ <string name="Breast Physics InOut Gain">
+ Ganho
+ </string>
+ <string name="Breast Physics InOut Damping">
+ Duração
+ </string>
+ <string name="Breast Physics UpDown Max Effect">
+ Efeito máximo
+ </string>
+ <string name="Breast Physics UpDown Spring">
+ Vibração
+ </string>
+ <string name="Breast Physics UpDown Gain">
+ Ganho
+ </string>
+ <string name="Breast Physics UpDown Damping">
+ Duração
+ </string>
+ <string name="Breast Physics LeftRight Max Effect">
+ Efeito máximo
+ </string>
+ <string name="Breast Physics LeftRight Spring">
+ Vibração
+ </string>
+ <string name="Breast Physics LeftRight Gain">
+ Ganho
+ </string>
+ <string name="Breast Physics LeftRight Damping">
+ Duração
+ </string>
+ <string name="Belly Physics Mass">
+ Barriga - massa
+ </string>
+ <string name="Belly Physics Smoothing">
+ Barriga - suavização
+ </string>
+ <string name="Belly Physics Gravity">
+ Barriga - gravidade
+ </string>
+ <string name="Belly Physics Drag">
+ Barriga - resistência do ar
+ </string>
+ <string name="Belly Physics UpDown Max Effect">
+ Efeito máximo
+ </string>
+ <string name="Belly Physics UpDown Spring">
+ Vibração
+ </string>
+ <string name="Belly Physics UpDown Gain">
+ Ganho
+ </string>
+ <string name="Belly Physics UpDown Damping">
+ Duração
+ </string>
+ <string name="Butt Physics Mass">
+ Nádegas - massa
+ </string>
+ <string name="Butt Physics Smoothing">
+ Nádegas - suavização
+ </string>
+ <string name="Butt Physics Gravity">
+ Nádegas - gravidade
+ </string>
+ <string name="Butt Physics Drag">
+ Nádegas - resistência do ar
+ </string>
+ <string name="Butt Physics UpDown Max Effect">
+ Efeito máximo
+ </string>
+ <string name="Butt Physics UpDown Spring">
+ Vibração
+ </string>
+ <string name="Butt Physics UpDown Gain">
+ Ganho
+ </string>
+ <string name="Butt Physics UpDown Damping">
+ Duração
+ </string>
+ <string name="Butt Physics LeftRight Max Effect">
+ Efeito máximo
+ </string>
+ <string name="Butt Physics LeftRight Spring">
+ Vibração
+ </string>
+ <string name="Butt Physics LeftRight Gain">
+ Ganho
+ </string>
+ <string name="Butt Physics LeftRight Damping">
+ Duração
+ </string>
<string name="Bushy Eyebrows">
Sobrancelhas grossas
</string>
@@ -2186,6 +2403,9 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<string name="Butt Size">
Tamanho do traseiro
</string>
+ <string name="Butt Gravity">
+ Nádegas - gravidade
+ </string>
<string name="bustle skirt">
Saia armada
</string>
@@ -3467,6 +3687,9 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<string name="conference-title-incoming">
Conversa com [AGENT_NAME]
</string>
+ <string name="inventory_item_offered-im">
+ Oferta de item de inventário
+ </string>
<string name="no_session_message">
(Sessão de MI inexistente)
</string>
@@ -3539,6 +3762,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>
@@ -3661,6 +3887,9 @@ Denunciar abuso
<string name="New Tattoo">
Nova tatuagem
</string>
+ <string name="New Physics">
+ Novo físico
+ </string>
<string name="Invalid Wearable">
Item inválido
</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..58e8c41c38
--- /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 Version: [LIBCURL_VERSION]
+J2C Decoder Version: [J2C_VERSION]
+Audio Driver Version: [AUDIO_DRIVER_VERSION]
+Qt Webkit Version: [QT_WEBKIT_VERSION]
+Voice Server 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..a9142b22ad
--- /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">
+ Adult
+ </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">
+ Adult
+ </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">
+ Adult Content
+ </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">
+ Allow other Residents to:
+ </text>
+ <check_box label="Edit Terrain" name="edit land check" tool_tip="If checked, anyone can terraform your land. It is best to leave this unchecked, as you can always edit your own land."/>
+ <check_box label="飛行" name="check fly" tool_tip="If checked, Residents can fly on your land. If unchecked, they can only fly into and over your land."/>
+ <text name="allow_label2">
+ 建造:
+ </text>
+ <check_box label="任何人" name="edit objects check"/>
+ <check_box label="社團" name="edit group objects check"/>
+ <text name="allow_label3">
+ Object Entry:
+ </text>
+ <check_box label="任何人" name="all object entry check"/>
+ <check_box label="社團" name="group object entry check"/>
+ <text name="allow_label4">
+ Run Scripts:
+ </text>
+ <check_box label="任何人" name="check other scripts"/>
+ <check_box label="社團" name="check group scripts"/>
+ <text name="land_options_label">
+ Land Options:
+ </text>
+ <check_box label="安全(無傷害)" name="check safe" tool_tip="If checked, sets the land to Safe, disabling damage combat. If cleared, damage combat is enabled."/>
+ <check_box label="禁止推撞" name="PushRestrictCheck" tool_tip="Prevents scripts from pushing. Checking this option may be useful for preventing disruptive behavior on your land."/>
+ <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="Adult" 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">
+ Banned Residents
+ </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..b4d7f71eec
--- /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">
+ Unable to read animation file.
+
+[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">
+ Cannot open BVH file.
+ </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="Priority" 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..90fd7c029e
--- /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="Friends" name="FriendsPanel">
+ <text name="InstructSelectFriend">
+ 選擇一個人:
+ </text>
+ </panel>
+ <panel label="接近我" name="NearMePanel">
+ <text name="InstructSelectResident">
+ Select a person nearby:
+ </text>
+ <slider label="Range" name="near_me_range"/>
+ <text name="meters">
+ 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..fb17c0bb8a
--- /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="Hair" name="hair-baked"/>
+ <texture_picker label="Hair" name="hair_grain"/>
+ <texture_picker label="Hair Alpha" name="hair_alpha"/>
+ <texture_picker label="Head" name="head-baked"/>
+ <texture_picker label="Makeup" name="head_bodypaint"/>
+ <texture_picker label="Head Alpha" name="head_alpha"/>
+ <texture_picker label="Head Tattoo" 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..0c4514600f
--- /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">
+ My new balance will be
+ </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..023c531692
--- /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">
+ Your account must be upgraded to own land.
+ </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">
+ This parcel is [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">
+ (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_day_cycle_options.xml b/indra/newview/skins/default/xui/zh/floater_day_cycle_options.xml
new file mode 100644
index 0000000000..8adc094fca
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_day_cycle_options.xml
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Day Cycle Floater" title="日循環編輯器">
+ <tab_container name="Day Cycle Tabs">
+ <panel label="日循環" name="Day Cycle">
+ <multi_slider initial_value="0" name="WLTimeSlider"/>
+ <multi_slider initial_value="0" name="WLDayCycleKeys"/>
+ <text name="WL12am">
+ 12am
+ </text>
+ <text name="WL3am">
+ 3am
+ </text>
+ <text name="WL6am">
+ 6am
+ </text>
+ <text name="WL9amHash">
+ 9am
+ </text>
+ <text name="WL12pmHash">
+ 12pm
+ </text>
+ <text name="WL3pm">
+ 3pm
+ </text>
+ <text name="WL6pm">
+ 6pm
+ </text>
+ <text name="WL9pm">
+ 9pm
+ </text>
+ <text name="WL12am2">
+ 12am
+ </text>
+ <text name="WL12amHash">
+ |
+ </text>
+ <text name="WL3amHash">
+ I
+ </text>
+ <text name="WL6amHash">
+ |
+ </text>
+ <text name="WL9amHash2">
+ I
+ </text>
+ <text name="WL12pmHash2">
+ |
+ </text>
+ <text name="WL3pmHash">
+ I
+ </text>
+ <text name="WL6pmHash">
+ |
+ </text>
+ <text name="WL9pmHash">
+ I
+ </text>
+ <text name="WL12amHash2">
+ |
+ </text>
+ <button label="Add Key" label_selected="Add Key" name="WLAddKey"/>
+ <button label="Delete Key" label_selected="Delete Key" name="WLDeleteKey"/>
+ <text name="WLCurKeyFrameText">
+ Key Frame Settings:
+ </text>
+ <text name="WLCurKeyTimeText">
+ Key Time:
+ </text>
+ <spinner label="Hour" name="WLCurKeyHour"/>
+ <spinner label="Min" name="WLCurKeyMin"/>
+ <text name="WLCurKeyTimeText2">
+ Key Preset:
+ </text>
+ <combo_box label="Preset" name="WLKeyPresets"/>
+ <text name="DayCycleText">
+ Snap:
+ </text>
+ <combo_box label="五分鐘" name="WLSnapOptions"/>
+ <text name="DayCycleText2">
+ Length of Cycle:
+ </text>
+ <spinner label="小時" name="WLLengthOfDayHour"/>
+ <spinner label="分" name="WLLengthOfDayMin"/>
+ <spinner label="秒" name="WLLengthOfDaySec"/>
+ <text name="DayCycleText3">
+ 預覽:
+ </text>
+ <button label="Play" label_selected="Play" name="WLAnimSky"/>
+ <button label="Stop!" label_selected="Stop" name="WLStopAnimSky"/>
+ <button label="Use Estate Time" label_selected="Go to Estate Time" name="WLUseLindenTime"/>
+ <button label="Save Test Day" label_selected="Save Test Day" name="WLSaveDayCycle"/>
+ <button label="Load Test Day" label_selected="Load Test Day" name="WLLoadDayCycle"/>
+ </panel>
+ </tab_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_display_name.xml b/indra/newview/skins/default/xui/zh/floater_display_name.xml
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_env_settings.xml b/indra/newview/skins/default/xui/zh/floater_env_settings.xml
new file mode 100644
index 0000000000..65a97f0cff
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_env_settings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Environment Editor Floater" title="ENVIRONMENT EDITOR">
+ <floater.string name="timeStr">
+ [hour12,datetime,utc]:[min,datetime,utc] [ampm,datetime,utc]
+ </floater.string>
+ <text name="EnvTimeText">
+ Time of Day
+ </text>
+ <text name="EnvTimeText2">
+ 12:00 PM
+ </text>
+ <text name="EnvCloudText">
+ Cloud Cover
+ </text>
+ <text name="EnvWaterColorText">
+ Water Color
+ </text>
+ <color_swatch name="EnvWaterColor" tool_tip="Click to open color picker"/>
+ <text name="EnvWaterFogText">
+ Water Fog
+ </text>
+ <button label="Use Estate Time" name="EnvUseEstateTimeButton"/>
+ <button label="Advanced Sky" name="EnvAdvancedSkyButton"/>
+ <button label="Advanced Water" name="EnvAdvancedWaterButton"/>
+</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..2dcb46fb77
--- /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="Make new gesture"/>
+ <button name="activate_btn" tool_tip="Activate/Deactivate selected gesture"/>
+ <button name="del_btn" tool_tip="Delete this gesture"/>
+ </panel>
+ <button label="編輯" name="edit_btn"/>
+ <button label="Play" name="play_btn"/>
+ <button label="Stop" 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..86403494e0
--- /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="GOD TOOLS">
+ <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..7eef0177ef
--- /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="Hair" name="Hair" value="Hair"/>
+ <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..4f678dbd9d
--- /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">
+ 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>
+ <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="Reject" label_selected="Reject" 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..a442eb9cbc
--- /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="Animation" 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="Scripts" 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..616c326d6b
--- /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="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="Back" name="back"/>
+ <button label="Forward" name="forward"/>
+ <button label="Reload" name="reload"/>
+ <button label="Go" name="go"/>
+ </layout_panel>
+ <layout_panel name="time_controls">
+ <button label="rewind" name="rewind"/>
+ <button label="stop" name="stop"/>
+ <button label="forward" name="seek"/>
+ </layout_panel>
+ <layout_panel name="parcel_owner_controls">
+ <button label="Send Current Page to Parcel" name="assign"/>
+ </layout_panel>
+ <layout_panel name="external_controls">
+ <button label="Open in My Web Browser" name="open_browser"/>
+ <check_box label="Always open in my web browser" 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..3fa62b1b60
--- /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="Stop" 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..bed7c20ba5
--- /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="NEARBY CHAT">
+ <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..eeaaf0ab7d
--- /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">
+ Pay Group
+ </string>
+ <string name="payee_resident">
+ Pay 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">
+ Or, choose amount:
+ </text>
+ <button label="Pay" label_selected="Pay" 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..234aa9f7af
--- /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">
+ Pay Group
+ </string>
+ <string name="payee_resident">
+ Pay Resident
+ </string>
+ <text name="payee_name">
+ Ericacita Moostopolison
+ </text>
+ <text name="object_name_label">
+ Via object:
+ </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="Pay" label_selected="Pay" 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..5ac2de4dc5
--- /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">
+ Animation: [NAME]
+ </floater.string>
+ <text name="desc txt">
+ 描述:
+ </text>
+ <button label="Play Inworld" label_selected="Stop" name="Anim play btn" tool_tip="Play this animation so that others can see it"/>
+ <button label="Play Locally" label_selected="Stop" 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..52e6a9d8e4
--- /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">
+ Stop
+ </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="Animation"/>
+ <scroll_list.rows name="action_sound" value="Sound"/>
+ <scroll_list.rows name="action_chat" value="聊天"/>
+ <scroll_list.rows name="action_wait" value="Wait"/>
+ </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="Start" name="start"/>
+ <radio_item label="Stop" name="stop"/>
+ </radio_group>
+ <check_box label="until animations are done" 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..12e646785d
--- /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="Script Warning/Error"/>
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..b6a929caeb
--- /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="Specific person:" 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..c9a66c1644
--- /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="Send" 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..54c5ba5cc0
--- /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="STATISTICS">
+ <scroll_container name="statistics_scroll">
+ <container_view name="statistics_view">
+ <stat_view label="Basic" name="basic">
+ <stat_bar label="FPS" name="fps"/>
+ <stat_bar label="Bandwidth" name="bandwidth"/>
+ <stat_bar label="封包損失" name="packet_loss"/>
+ <stat_bar label="Ping Sim" name="ping"/>
+ </stat_view>
+ <stat_view label="Advanced" 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="Total Objects" name="objs"/>
+ <stat_bar label="New Objects" name="newobjs"/>
+ </stat_view>
+ <stat_view label="材質" name="texture">
+ <stat_bar label="Count" name="numimagesstat"/>
+ <stat_bar label="Raw Count" name="numrawimagesstat"/>
+ <stat_bar label="GL Mem" name="gltexmemstat"/>
+ <stat_bar label="Formatted Mem" name="formattedmemstat"/>
+ <stat_bar label="Raw Mem" name="rawmemstat"/>
+ <stat_bar label="Bound Mem" name="glboundmemstat"/>
+ </stat_view>
+ <stat_view label="Network" name="network">
+ <stat_bar label="Packets In" name="packetsinstat"/>
+ <stat_bar label="Packets Out" name="packetsoutstat"/>
+ <stat_bar label="Objects" name="objectkbitstat"/>
+ <stat_bar label="材質" name="texturekbitstat"/>
+ <stat_bar label="Asset" 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="Simulator" 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="Memory Allocated" 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="Objects" name="simobjects"/>
+ <stat_bar label="Active Objects" name="simactiveobjects"/>
+ <stat_bar label="Active Scripts" name="simactivescripts"/>
+ <stat_bar label="Script Events" name="simscripteps"/>
+ <stat_bar label="Packets In" name="siminpps"/>
+ <stat_bar label="Packets Out" name="simoutpps"/>
+ <stat_bar label="擱置下載" 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="Script Time" 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..7ba1a0d6c4
--- /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="Focus"/>
+ <button name="button move" tool_tip="移動"/>
+ <button name="button edit" tool_tip="編輯"/>
+ <button name="button create" tool_tip="Create"/>
+ <button name="button land" tool_tip="Land"/>
+ <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="Stretch (Ctrl+Shift)" name="radio stretch"/>
+ <radio_item label="Select Face" name="radio select face"/>
+ </radio_group>
+ <check_box label="Edit linked" name="checkbox edit linked parts"/>
+ <button label="Link" name="link_btn"/>
+ <button label="Unlink" name="unlink_btn"/>
+ <text name="RenderingCost" tool_tip="Shows the rendering cost calculated for this object">
+ þ: [COUNT]
+ </text>
+ <text label="Stretch Both Sides" name="checkbox uniform label">
+ Stretch Both Sides
+ </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="See more grid options"/>
+ <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="Keep Tool selected" name="checkbox sticky"/>
+ <check_box label="Copy selection" 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="Select Land" name="radio select land"/>
+ <radio_item label="Flatten" name="radio flatten"/>
+ <radio_item label="Raise" name="radio raise"/>
+ <radio_item label="Lower" name="radio lower"/>
+ <radio_item label="Smooth" name="radio smooth"/>
+ <radio_item label="Roughen" name="radio noise"/>
+ <radio_item label="Revert" name="radio revert"/>
+ </radio_group>
+ <text name="Bulldozer:">
+ Bulldozer:
+ </text>
+ <text name="Dozer Size:">
+ 尺寸
+ </text>
+ <slider_bar initial_value="2.0" name="slider brush size"/>
+ <text name="Strength:">
+ Strength
+ </text>
+ <slider_bar initial_value="0.00" name="slider force"/>
+ <button label="套用" label_selected="套用" name="button apply to selection" tool_tip="Modify selected land"/>
+ <text name="obj_count">
+ Objects: [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">
+ 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">
+ You must select entire object to set permissions
+ </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="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="Choose a group to share this object&apos;s permissions"/>
+ <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">
+ Click to:
+ </text>
+ <combo_box name="clickaction">
+ <combo_box.item label="Touch (default)" name="Touch/grab(default)"/>
+ <combo_box.item label="Sit on object" name="Sitonobject"/>
+ <combo_box.item label="Buy object" name="Buyobject"/>
+ <combo_box.item label="Pay object" name="Payobject"/>
+ <combo_box.item label="Open" name="Open"/>
+ <combo_box.item label="Zoom" 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="Let people see this object in search results"/>
+ <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="Object" name="Object">
+ <check_box label="鎖定" name="checkbox locked" tool_tip="Prevents object from being moved or deleted. Frequently useful during building to avoid unintended edits."/>
+ <check_box label="物理性" name="Physical Checkbox Ctrl" tool_tip="Allows object to be pushed and affected by gravity"/>
+ <check_box label="暫時性" name="Temporary Checkbox Ctrl" tool_tip="Causes object to be deleted 1 minute after creation"/>
+ <check_box label="幻影性" name="Phantom Checkbox Ctrl" tool_tip="Causes object to not collide with other objects or avatars"/>
+ <text name="label position">
+ Position (meters)
+ </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">
+ Rotation (degrees)
+ </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="Metal" name="Metal"/>
+ <combo_box.item label="Glass" name="Glass"/>
+ <combo_box.item label="Wood" name="Wood"/>
+ <combo_box.item label="Flesh" name="Flesh"/>
+ <combo_box.item label="Plastic" name="Plastic"/>
+ <combo_box.item label="Rubber" 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">
+ Hollow
+ </text>
+ <text name="text skew">
+ Skew
+ </text>
+ <text name="Hollow Shape">
+ 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="Features" name="Features">
+ <text name="select_single">
+ Select only one primitive to edit features.
+ </text>
+ <text name="edit_object">
+ Edit object features:
+ </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="Click to open color picker"/>
+ <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">
+ Repeats Per Meter
+ </panel.string>
+ <panel.string name="string repeats per face">
+ Repeats Per Face
+ </panel.string>
+ <texture_picker label="材質" name="texture control" tool_tip="點擊以挑選圖片"/>
+ <color_swatch label="Color" name="colorswatch" tool_tip="Click to open color picker"/>
+ <text name="color trans">
+ Transparency %
+ </text>
+ <text name="glow label">
+ Glow
+ </text>
+ <check_box label="Full Bright" name="checkbox fullbright"/>
+ <text name="tex gen">
+ Mapping
+ </text>
+ <combo_box name="combobox texgen">
+ <combo_box.item label="預設" name="Default"/>
+ <combo_box.item label="Planar" name="Planar"/>
+ </combo_box>
+ <text name="label shininess">
+ Shininess
+ </text>
+ <combo_box name="combobox shininess">
+ <combo_box.item label="無" name="None"/>
+ <combo_box.item label="Low" name="Low"/>
+ <combo_box.item label="Medium" name="Medium"/>
+ <combo_box.item label="High" name="High"/>
+ </combo_box>
+ <text name="label bumpiness">
+ 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="Align planar faces" name="checkbox planar align" tool_tip="Align textures on all selected faces with the last selected face. Requires Planar texture mapping."/>
+ <text name="rpt">
+ Repeats / Face
+ </text>
+ <spinner label="Horizontal (U)" name="TexScaleU"/>
+ <check_box label="Flip" name="checkbox flip s"/>
+ <spinner label="Vertical (V)" name="TexScaleV"/>
+ <check_box label="Flip" name="checkbox flip t"/>
+ <spinner label="Rotation˚" name="TexRot"/>
+ <spinner label="Repeats / Meter" name="rptctrl"/>
+ <button label="套用" label_selected="套用" name="button apply"/>
+ <text name="tex offset">
+ 材質位移
+ </text>
+ <spinner label="Horizontal (U)" name="TexOffsetU"/>
+ <spinner label="Vertical (V)" name="TexOffsetV"/>
+ <panel name="Add_Media">
+ <text name="media_tex">
+ Media
+ </text>
+ <button name="add_media" tool_tip="Add Media"/>
+ <button name="delete_media" tool_tip="刪除這個媒體材質"/>
+ <button name="edit_media" tool_tip="Edit this Media"/>
+ <button label="Align" label_selected="Align Media" name="button align" tool_tip="Align media texture (must load first)"/>
+ </panel>
+ </panel>
+ <panel label="Content" name="Contents">
+ <button label="New Script" label_selected="New Script" name="button new script"/>
+ <button label="Permissions" name="button permissions"/>
+ </panel>
+ </tab_container>
+ <panel name="land info panel">
+ <text name="label_parcel_info">
+ Parcel Information
+ </text>
+ <text name="label_area_price">
+ Price: L$[PRICE] for [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:
+
+Green = Your land
+Aqua = Your group&apos;s land
+Red = Owned by others
+Yellow = For sale
+Purple = For auction
+Grey = Public"/>
+ <text name="label_parcel_modify">
+ Modify Parcel
+ </text>
+ <button label="Subdivide" label_selected="Subdivide" name="button subdivide land"/>
+ <button label="Join" label_selected="Join" name="button join land"/>
+ <text name="label_parcel_trans">
+ Land Transactions
+ </text>
+ <button label="購買土地" label_selected="購買土地" name="button buy land"/>
+ <button label="Abandon Land" label_selected="Abandon Land" 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..c1ad927bbb
--- /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">
+ Score
+ </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="Score" 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">
+ Object ID:
+ </text>
+ <button label="Show Beacon" name="show_beacon_btn"/>
+ <text name="obj_name_text">
+ 物件名稱:
+ </text>
+ <button label="Filter" name="filter_object_btn"/>
+ <text name="owner_name_text">
+ 擁有者:
+ </text>
+ <button label="Filter" name="filter_owner_btn"/>
+ <button label="Return Selected" name="return_selected_btn"/>
+ <button label="全部退回" name="return_all_btn"/>
+ <button label="Disable Selected" name="disable_selected_btn"/>
+ <button label="Disable All" 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..04945ac83b
--- /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">
+ Media 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..e45c7c59ac
--- /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="Stop" 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_water.xml b/indra/newview/skins/default/xui/zh/floater_water.xml
new file mode 100644
index 0000000000..fba0415967
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_water.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Water Floater" title="進階水文編輯器">
+ <floater.string name="WLDefaultWaterNames">
+ Default:Glassy:Pond:Murky:Second Plague:SNAKE!!!:Valdez
+ </floater.string>
+ <text name="KeyFramePresetsText">
+ Water Presets:
+ </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">
+ Water Fog Color
+ </text>
+ <color_swatch name="WaterFogColor" tool_tip="Click to open color picker"/>
+ <text name="WaterFogDensText">
+ Fog Density Exponent
+ </text>
+ <text name="WaterUnderWaterFogModText">
+ Underwater Fog Modifier
+ </text>
+ <text name="BDensText">
+ Reflection Wavelet Scale
+ </text>
+ <slider label="1" name="WaterNormalScaleX"/>
+ <slider label="2" name="WaterNormalScaleY"/>
+ <slider label="3" name="WaterNormalScaleZ"/>
+ <text name="HDText">
+ Fresnel Scale
+ </text>
+ <text name="FresnelOffsetText">
+ Fresnel Offset
+ </text>
+ <text name="DensMultText">
+ Refract Scale Above
+ </text>
+ <text name="WaterScaleBelowText">
+ Refract Scale Below
+ </text>
+ <text name="MaxAltText">
+ Blur Multiplier
+ </text>
+ </panel>
+ <panel label="圖像" name="Waves">
+ <text name="BHText">
+ Big Wave Direction
+ </text>
+ <text name="WaterWave1DirXText">
+ X
+ </text>
+ <text name="WaterWave1DirYText">
+ Y
+ </text>
+ <text name="BHText2">
+ Little Wave Direction
+ </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/zh/floater_web_content.xml b/indra/newview/skins/default/xui/zh/floater_web_content.xml
new file mode 100644
index 0000000000..2670e223d3
--- /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="Stop navigation"/>
+ <button name="reload" tool_tip="重載頁面"/>
+ <combo_box name="address" tool_tip="Enter URL here"/>
+ <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_windlight_options.xml b/indra/newview/skins/default/xui/zh/floater_windlight_options.xml
new file mode 100644
index 0000000000..fce851cc90
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_windlight_options.xml
@@ -0,0 +1,167 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="WindLight floater" title="進階天空編輯器">
+ <floater.string name="WLDefaultSkyNames">
+ A-12AM:A-12PM:A-3AM:A-3PM:A-4.30PM:A-6AM:A-6PM:A-9AM:A-9PM:Barcelona:Blizzard:Blue Midday:Coastal Afternoon:Coastal Sunset:Default:Desert Sunset:Fine Day:Fluffy Big Clouds:Foggy:Funky Funky:Funky Funky Funky:Gelatto:Ghost:Incongruent Truths:Midday 1:Midday 2:Midday 3:Midday 4:Night:Pirate:Purple:Sailor&apos;s Delight:Sheer Sensuality
+ </floater.string>
+ <text name="KeyFramePresetsText">
+ Sky Presets:
+ </text>
+ <button label="新增" label_selected="新增" name="WLNewPreset"/>
+ <button label="儲存" label_selected="儲存" name="WLSavePreset"/>
+ <button label="刪除" label_selected="刪除" name="WLDeletePreset"/>
+ <button label="Day Cycle Editor" label_selected="Day Cycle Editor" name="WLDayCycleMenuButton"/>
+ <tab_container name="WindLight Tabs">
+ <panel label="ATMOSPHERE" name="Atmosphere">
+ <text name="BHText">
+ Blue Horizon
+ </text>
+ <text name="BHText2">
+ R
+ </text>
+ <text name="BHText3">
+ G
+ </text>
+ <text name="BHText4">
+ B
+ </text>
+ <text name="BHText5">
+ I
+ </text>
+ <text name="BDensText">
+ Haze Horizon
+ </text>
+ <text name="BDensText2">
+ Blue Density
+ </text>
+ <text name="BHText6">
+ R
+ </text>
+ <text name="BHText7">
+ G
+ </text>
+ <text name="BHText8">
+ B
+ </text>
+ <text name="BHText9">
+ I
+ </text>
+ <text name="HDText">
+ Haze Density
+ </text>
+ <text name="DensMultText">
+ Density Multiplier
+ </text>
+ <text name="WLDistanceMultText">
+ Distance Multiplier
+ </text>
+ <text name="MaxAltText">
+ Max Altitude
+ </text>
+ </panel>
+ <panel label="LIGHTING" name="Lighting">
+ <text name="SLCText">
+ Sun/Moon Color
+ </text>
+ <text name="BHText">
+ R
+ </text>
+ <text name="BHText2">
+ G
+ </text>
+ <text name="BHText3">
+ B
+ </text>
+ <text name="BHText4">
+ I
+ </text>
+ <text name="TODText">
+ Sun/Moon Position
+ </text>
+ <text name="WLAmbientText">
+ Ambient
+ </text>
+ <text name="BHText5">
+ R
+ </text>
+ <text name="BHText6">
+ G
+ </text>
+ <text name="BHText7">
+ B
+ </text>
+ <text name="BHText8">
+ I
+ </text>
+ <text name="WLEastAngleText">
+ East Angle
+ </text>
+ <text name="SunGlowText">
+ Sun Glow
+ </text>
+ <slider label="Focus" name="WLGlowB"/>
+ <slider label="尺寸" name="WLGlowR"/>
+ <text name="SceneGammaText">
+ Scene Gamma
+ </text>
+ <text name="WLStarText">
+ Star Brightness
+ </text>
+ </panel>
+ <panel label="CLOUDS" name="Clouds">
+ <text name="WLCloudColorText">
+ Cloud Color
+ </text>
+ <text name="BHText">
+ R
+ </text>
+ <text name="BHText2">
+ G
+ </text>
+ <text name="BHText3">
+ B
+ </text>
+ <text name="BHText4">
+ I
+ </text>
+ <text name="WLCloudColorText2">
+ Cloud XY/Density
+ </text>
+ <text name="BHText5">
+ X
+ </text>
+ <text name="BHText6">
+ Y
+ </text>
+ <text name="BHText7">
+ D
+ </text>
+ <text name="WLCloudCoverageText">
+ Cloud Coverage
+ </text>
+ <text name="WLCloudScaleText">
+ Cloud Scale
+ </text>
+ <text name="WLCloudDetailText">
+ Cloud Detail (XY/Density)
+ </text>
+ <text name="BHText8">
+ X
+ </text>
+ <text name="BHText9">
+ Y
+ </text>
+ <text name="BHText10">
+ D
+ </text>
+ <text name="WLCloudScrollXText">
+ Cloud Scroll X
+ </text>
+ <check_box label="Lock" name="WLCloudLockX"/>
+ <text name="WLCloudScrollYText">
+ Cloud Scroll Y
+ </text>
+ <check_box label="Lock" name="WLCloudLockY"/>
+ <check_box label="Draw Classic Clouds" name="DrawClassicClouds"/>
+ </panel>
+ </tab_container>
+</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..e47238482f
--- /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="width x height">
+ <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..47038e3b3d
--- /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">
+ Person
+ </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">
+ Adult
+ </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..01649496bc
--- /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">
+ Free to join
+ </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="Join" name="join_btn"/>
+ <button label="Leave" 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..f1fe037087
--- /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="Pay" 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..cba82e7dce
--- /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="Pay" 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..1da583b3d0
--- /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="Remove Friend..." 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..283367708b
--- /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="Pay" 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..8e30a15562
--- /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="Copy 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..bae7cf3f05
--- /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="Pay" 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..dab95fcadc
--- /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="Touch" name="touch"/>
+ <menu_item_call label="Sit" name="sit"/>
+ <menu_item_call label="Pay" name="pay"/>
+ <menu_item_call label="購買" name="buy"/>
+ <menu_item_call label="Take" name="take"/>
+ <menu_item_call label="取得副本" name="take_copy"/>
+ <menu_item_call label="Open" name="open"/>
+ <menu_item_call label="編輯" name="edit"/>
+ <menu_item_call label="Wear" name="wear"/>
+ <menu_item_call label="Add" 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="Remove" 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..fd8f73e4ea
--- /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="New Shape" name="New Shape"/>
+ <menu_item_call label="New Skin" name="New Skin"/>
+ <menu_item_call label="New Hair" name="New Hair"/>
+ <menu_item_call label="New Eyes" name="New Eyes"/>
+ </menu>
+ <menu label="Change Type" 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="Shape" 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="Open" name="Animation Open"/>
+ <menu_item_call label="Open" 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="Open" 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="Copy Asset 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="Play" 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="Send Instant Message" 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..8c938222e7
--- /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="Sort Folders Always by Name" name="sort_folders_by_name"/>
+ <menu_item_check label="Sort System Folders to Top" name="sort_system_folders_to_top"/>
+ <menu_item_call label="Show Filters" name="show_filters"/>
+ <menu_item_call label="Reset Filters" name="reset_filters"/>
+ <menu_item_call label="關閉全部資料夾" name="close_folders"/>
+ <menu_item_call label="Empty 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..5f7657db79
--- /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="Create Pick" 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..27a0baf560
--- /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/Color Settings" name="UI/Color Settings"/>
+ <menu_item_call label="XUI Preview Tool" 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="Show Critical Message" 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="Show Grid Picker" name="Show Grid Picker"/>
+ <menu_item_call label="Show Notifications Console" 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..169dbf2187
--- /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="New Shape" name="New Shape"/>
+ <menu_item_call label="New Skin" name="New Skin"/>
+ <menu_item_call label="New Hair" name="New Hair"/>
+ <menu_item_call label="New Eyes" 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..7b6f6f954e
--- /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="Pay" 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..06247ab249
--- /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="Display Group Icons" 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..73b754e059
--- /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="Pay" 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..4ffbcaff83
--- /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="Pay" 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..9e55c633f9
--- /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="New Pick" 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..6ffdf329df
--- /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="Create Pick" 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..7f1d091f44
--- /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="Restore Item" 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..8578751a28
--- /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="Create Pick" 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..c06b7dc039
--- /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="Pay" 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..e7016dc663
--- /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="Zoom to Selection" 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="Save Back to Object Contents" 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="Recompile Scripts (Mono)" name="Mono"/>
+ <menu_item_call label="Recompile Scripts (LSL)" name="LSL"/>
+ <menu_item_call label="Reset Scripts" name="Reset Scripts"/>
+ <menu_item_call label="Set Scripts to Running" name="Set Scripts to Running"/>
+ <menu_item_call label="Set Scripts to Not Running" 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="Snap Object XY to Grid" 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="Sound (L$[COST])..." name="Upload Sound"/>
+ <menu_item_call label="Animation (L$[COST])..." name="Upload Animation"/>
+ <menu_item_call label="Bulk (L$[COST] per file)..." name="Bulk Upload"/>
+ <menu_item_call label="Set Default Upload Permissions" 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="Limit Select Distance" 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="Quiet Snapshots to Disk" name="QuietSnapshotsToDisk"/>
+ <menu_item_check label="Compress Snapshots to Disk" name="CompressSnapshotsToDisk"/>
+ <menu label="Performance Tools" 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="Highlight Transparent" name="Highlight Transparent"/>
+ <menu_item_check label="Show HUD Attachments" 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="Mouselook" 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="Show Time" 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="Avatar" name="Character">
+ <menu label="Grab Baked Texture" name="Grab Baked Texture">
+ <menu_item_call label="Iris" name="Iris"/>
+ <menu_item_call label="Head" 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="Animation Info" name="Animation Info"/>
+ <menu_item_check label="Slow Motion Animations" name="Slow Motion Animations"/>
+ <menu_item_check label="Show Look At" name="Show Look At"/>
+ <menu_item_check label="Show Point At" 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..d2d1321c2a
--- /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">
+ Text
+ </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..16d4965d5a
--- /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">
+ You can only have [MAX_BANNED] Banned Residents.
+ </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">
+ You can only have [MAX_MANAGER] Estate Managers.
+ </notification>
+ <notification name="OwnerCanNotBeDenied">
+ Can&apos;t add estate owner to estate &apos;Banned Resident&apos; list.
+ </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">
+ 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="DownloadWindows">
+ 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="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="Later..." yestext="Install now and restart [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="Later..." yestext="Install now and restart [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">
+ We must restart [APP_NAME] to install the update.
+ <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="Confirm that I want to teleport to a location in Picks" name="okcancelignore" notext="取消" yestext="Teleport"/>
+ </notification>
+ <notification name="TeleportToClassified">
+ 瞬間傳送到 [CLASSIFIED]?
+ <usetemplate ignoretext="Confirm that I want to teleport to a location in Classifieds" name="okcancelignore" notext="取消" yestext="瞬間傳送"/>
+ </notification>
+ <notification name="TeleportToHistoryEntry">
+ 瞬間傳送到 [HISTORY_ENTRY]?
+ <usetemplate ignoretext="Confirm that I want to teleport to a history location" name="okcancelignore" notext="取消" yestext="瞬間傳送"/>
+ </notification>
+ <notification label="Message everyone in your Estate" 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="Can&apos;t Buy Objects" name="BuyObjectOneOwner">
+ Cannot buy objects from different owners at the same time.
+Please select only one object and try again.
+ </notification>
+ <notification label="Can&apos;t Buy Contents" 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="Can&apos;t Buy Contents" 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="Busy Mode Warning" 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..c9e47984e2
--- /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="Leave Call" 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..23b76eea9b
--- /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="(loading)"/>
+ <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..0578fe9ef1
--- /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="Color"/>
+ <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..b453fdc758
--- /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="Click to open color picker"/>
+ </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..0f1f72ceb9
--- /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="Edit Pick" name="panel_edit_pick">
+ <panel.string name="location_notice">
+ (will update after save)
+ </panel.string>
+ <text name="title">
+ Edit Pick
+ </text>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <icon label="" name="edit_icon" tool_tip="點擊以選擇圖像"/>
+ <text name="Name:">
+ Title:
+ </text>
+ <text name="description_label">
+ 描述:
+ </text>
+ <text name="location_label">
+ 位置:
+ </text>
+ <text name="pick_location">
+ 載入中...
+ </text>
+ <button label="Set to Current Location" 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="Save Pick" name="save_changes_btn"/>
+ </layout_panel>
+ <layout_panel name="layout_panel1">
+ <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..da6049ea75
--- /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">
+ Meters
+ </string>
+ <string name="feet">
+ Feet
+ </string>
+ <string name="height">
+ Height:
+ </string>
+ <panel label="襯衫" name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="shape_body_tab" title="Body"/>
+ <accordion_tab name="shape_head_tab" title="Head"/>
+ <accordion_tab name="shape_eyes_tab" title="眼睛"/>
+ <accordion_tab name="shape_ears_tab" title="Ears"/>
+ <accordion_tab name="shape_nose_tab" title="Nose"/>
+ <accordion_tab name="shape_mouth_tab" title="Mouth"/>
+ <accordion_tab name="shape_chin_tab" title="Chin"/>
+ <accordion_tab name="shape_torso_tab" title="Torso"/>
+ <accordion_tab name="shape_legs_tab" title="Legs"/>
+ </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..321fb68756
--- /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="Click to open color picker"/>
+ </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..096a83c871
--- /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="Click to open color picker"/>
+ </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..dab132bad2
--- /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="Click to open color picker"/>
+ </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..d183e6897d
--- /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="Head Tattoo" name="Head Tattoo" tool_tip="點擊以挑選圖片"/>
+ <texture_picker label="Upper Tattoo" name="Upper Tattoo" tool_tip="Click to choose a picture"/>
+ <texture_picker label="Lower Tattoo" name="Lower Tattoo" tool_tip="點擊以挑選圖片"/>
+ <color_swatch label="Color/Tint" name="Color/Tint" tool_tip="Click to open color picker"/>
+ </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..d741ed70df
--- /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">
+ Shape:
+ </string>
+ <string name="skin_desc_text">
+ Skin:
+ </string>
+ <string name="hair_desc_text">
+ Hair:
+ </string>
+ <string name="eyes_desc_text">
+ Eyes:
+ </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..1706541f2b
--- /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">
+ General group information has changed
+ </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">
+ Free
+ </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="General Content" 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..0a0a1f1941
--- /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="Send Invitations" 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..71f139a3e6
--- /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="Type" name="type"/>
+ <scroll_list.columns label="Area" name="area"/>
+ <scroll_list.columns label="Hidden" 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..5fed96dbd9
--- /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">
+ There are no past notices
+ </panel.string>
+ <text name="lbl2">
+ Notices are kept for 14 days.
+Maximum 200 per group daily
+ </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">
+ 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="Remove attachment from your notification"/>
+ <button label="Send" label_selected="Send" 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">
+ Archived Notice
+ </text>
+ <text name="lbl2">
+ To send a new notice, click the + button
+ </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..8947ab6e45
--- /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="Donation" 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..881f8eac0b
--- /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="Pay" 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
new file mode 100644
index 0000000000..b227fbcfc8
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_login.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_login">
+ <panel.string name="create_account_url">
+ http://join.secondlife.com/
+ </panel.string>
+ <panel.string name="forgot_password_url">
+ http://secondlife.com/account/request.php
+ </panel.string>
+ <layout_stack name="login_widgets">
+ <layout_panel name="login">
+ <text name="username_text">
+ 使用者名稱:
+ </text>
+ <combo_box name="username_combo" tool_tip="使用者名稱是你註冊時所挑選的,像是 bobsmith12 或 Steller Sunshine"/>
+ <text name="password_text">
+ 密碼:
+ </text>
+ <check_box label="記住密碼:" name="remember_check"/>
+ <button label="登入" name="connect_btn"/>
+ <text name="mode_selection_text">
+ 模式:
+ </text>
+ <combo_box name="mode_combo" tool_tip="請選擇你的模式。選用基本模式可以快速、簡單地探索與聊天;選用進階模式則可以使用更多功能。">
+ <combo_box.item label="基本" name="Basic"/>
+ <combo_box.item label="進階" name="Advanced"/>
+ </combo_box>
+ <text name="start_location_text">
+ 開始地點:
+ </text>
+ <combo_box name="start_location_combo">
+ <combo_box.item label="我上一次位置" name="MyLastLocation"/>
+ <combo_box.item label="我的家" name="MyHome"/>
+ <combo_box.item label="&lt; 請輸入地區名稱 &gt;" name="Typeregionname"/>
+ </combo_box>
+ </layout_panel>
+ <layout_panel name="links">
+ <text name="create_new_account_text">
+ 註冊
+ </text>
+ <text name="forgot_password_text">
+ 忘記你的使用者名稱或密碼?
+ </text>
+ <text name="login_help">
+ 登入時需要幫助?
+ </text>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/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..abdbfd7429
--- /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="MY PICKS" 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..f3163e3c19
--- /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">
+ Current Page:
+ </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..6e2d47c09e
--- /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">
+ Controls:
+ </text>
+ <combo_box name="controls">
+ <combo_item name="Standard">
+ Standard
+ </combo_item>
+ <combo_item name="Mini">
+ Mini
+ </combo_item>
+ </combo_box>
+ <text name="owner_label">
+ Owner
+ </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">
+ Anyone
+ </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..724cd54bf1
--- /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="Press Enter to say, Ctrl+Enter to shout"/>
+ <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..0b8a7a5f42
--- /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="Stop selected media"/>
+ </layout_panel>
+ <layout_panel name="play">
+ <button name="play_btn" tool_tip="Play selected media"/>
+ </layout_panel>
+ <layout_panel name="pause">
+ <button name="pause_btn" tool_tip="Pause selected media"/>
+ </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..bdbc89f71c
--- /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="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="message"/>
+ </panel>
+ <panel label="control_panel" name="control_panel">
+ <button label="Submit" 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..6ceaf447a7
--- /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="Click to replace your existing shape"/>
+ <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="Add More..." 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="Wear Item" 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..8da75e334e
--- /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="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="Call this Resident"/>
+ </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="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..44ae5703c6
--- /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="Pick Info"/>
+ <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..3b356967f9
--- /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="Picks" name="panel_picks">
+ <string name="no_picks" value="No Picks"/>
+ <string name="no_classifieds" value="No Classifieds"/>
+ <accordion name="accordion">
+ <accordion_tab name="tab_picks" title="Picks"/>
+ <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="Create a new pick or classified at the current location"/>
+ </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="Show pick information"/>
+ </layout_panel>
+ <layout_panel name="teleport_btn_lp">
+ <button label="瞬間傳送" name="teleport_btn" tool_tip="Teleport to the corresponding area"/>
+ </layout_panel>
+ <layout_panel name="show_on_map_btn_lp">
+ <button label="地圖" name="show_on_map_btn" tool_tip="Show the corresponding area on the World Map"/>
+ </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..b0919c9151
--- /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="(Sale Pending)"/>
+ <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="Push:"/>
+ <text name="push_value" value="Off"/>
+ <text name="build_label" value="Build:"/>
+ <text name="build_value" value="On"/>
+ <text name="scripts_label" value="Scripts:"/>
+ <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="Adult"/>
+ <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="Scripts:"/>
+ <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..a39402c858
--- /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">
+ Translate chat into:
+ </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..c7299ad8a9
--- /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">
+ (Requires restart)
+ </text>
+ <text name="maturity_desired_prompt">
+ I want to access content rated:
+ </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">
+ Name tags:
+ </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="Show briefly" name="radio3" value="2"/>
+ </radio_group>
+ <check_box label="My name" name="show_my_name_checkbox1"/>
+ <check_box label="使用者名稱" name="show_slids" tool_tip="Show username, like bobsmith123"/>
+ <check_box label="社團頭銜" name="show_all_title_checkbox1" tool_tip="Show group titles, like Officer or Member"/>
+ <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">
+ Pressing letter keys:
+ </text>
+ <radio_group name="inworld_typing_preference">
+ <radio_item label="Starts local chat" name="radio_start_chat" value="1"/>
+ <radio_item label="Affects movement (i.e. WASD)" name="radio_move" value="0"/>
+ </radio_group>
+ <text name="title_afk_text">
+ Away timeout:
+ </text>
+ <combo_box label="Away timeout:" name="afk">
+ <combo_box.item label="2 minutes" name="item0"/>
+ <combo_box.item label="5 minutes" name="item1"/>
+ <combo_box.item label="10 minutes" name="item2"/>
+ <combo_box.item label="30 minutes" name="item3"/>
+ <combo_box.item label="never" 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..ff582d774b
--- /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="Arrow keys always move me" name="arrow_keys_move_avatar_check"/>
+ <check_box label="Tap-tap-hold to run" name="tap_tap_hold_to_run"/>
+ <check_box label="Double-Click to:" 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..2cab05e2ad
--- /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="Sound Effects" name="SFX Volume"/>
+ <slider label="Streaming music" name="Music Volume"/>
+ <check_box label="Enabled" name="enable_music"/>
+ <slider label="Media" name="Media Volume"/>
+ <check_box label="Enabled" name="enable_media"/>
+ <slider label="Voice Chat" name="Voice Volume"/>
+ <check_box label="Enabled" name="enable_voice_check"/>
+ <check_box label="Allow Media to auto-play" name="media_auto_play_btn" tool_tip="Check this to let media auto-play if it wants" value="true"/>
+ <check_box label="Play media attached to other avatars" 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">
+ Voice Chat Settings
+ </text>
+ <text name="Listen from">
+ Listen from:
+ </text>
+ <radio_group name="ear_location">
+ <radio_item label="Camera position" name="0"/>
+ <radio_item label="Avatar position" name="1"/>
+ </radio_group>
+ <check_box label="Move avatar lips when speaking" 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="Set Key" 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">
+ My volume:
+ </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..71de9f861a
--- /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="Stop media"/>
+ </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..7536311daf
--- /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="Resident Since:"/>
+ <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="Pay money to or share inventory with the Resident"/>
+ </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..ac8c7cad3d
--- /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="PICKS" 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..2e52efb804
--- /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">
+ Adult
+ </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>
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..798831bc84
--- /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">
+ Object Return
+ </text>
+ <text name="resident_text_lbl">
+ Resident:
+ </text>
+ <line_editor name="target_avatar_name">
+ (無)
+ </line_editor>
+ <button label="Choose" name="choose_avatar_btn"/>
+ <text name="options_text_lbl">
+ 選項:
+ </text>
+ <check_box label="With scripts" name="return_scripts" tool_tip="Return only objects which have scripts"/>
+ <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="Return" 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="Restart Region" name="restart_btn" tool_tip="Give 2 minute countdown and restart region"/>
+ <button label="Delay Restart" name="cancel_restart_btn" tool_tip="Delay region restart by one hour"/>
+</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..899191c3f0
--- /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..71caaf1144
--- /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">
+ Version:
+ </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="Allow Land Resell" name="allow_land_resell_check"/>
+ <check_box label="Allow Land Join/Divide" 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="Agent Limit" 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="Adult" 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..85ac4613dd
--- /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..6c81ede76c
--- /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/ 搜尋]。"/>
+ <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..6f8f19b26d
--- /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">
+ (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..de5a10ba51
--- /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">
+ Click to:
+ </text>
+ <combo_box name="clickaction">
+ <combo_box.item label="Touch (default)" name="Touch/grab(default)"/>
+ <combo_box.item label="Sit on object" name="Sitonobject"/>
+ <combo_box.item label="Buy object" name="Buyobject"/>
+ <combo_box.item label="Pay object" name="Payobject"/>
+ <combo_box.item label="Open" name="Open"/>
+ </combo_box>
+ <panel name="perms_inv">
+ <text name="perm_modify">
+ You can modify this object
+ </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="Open" name="open_btn"/>
+ <button label="Pay" name="pay_btn"/>
+ <button label="購買" name="buy_btn"/>
+ <button label="Details" 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..211d91a707
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/strings.xml
@@ -0,0 +1,4454 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- This file contains strings that used to be hardcoded in the source.
+ It is only for those strings which do not belong in a floater.
+ For example, the strings used in avatar chat bubbles, and strings
+ that are returned from one component and may appear in many places-->
+<strings>
+ <string name="SECOND_LIFE">
+ Second Life
+ </string>
+ <string name="APP_NAME">
+ Second Life
+ </string>
+ <string name="CAPITALIZED_APP_NAME">
+ SECOND LIFE
+ </string>
+ <string name="SECOND_LIFE_GRID">
+ Second Life Grid
+ </string>
+ <string name="SUPPORT_SITE">
+ Second Life Support Portal
+ </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">
+ This region may be experiencing trouble. Please check your connection to the Internet.
+ </string>
+ <string name="SavingSettings">
+ Saving your settings...
+ </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">
+ Testing viewer disconnect
+ </string>
+ <string name="TooltipPerson">
+ Person
+ </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">
+ No Build
+ </string>
+ <string name="TooltipFlagNoEdit">
+ Group Build
+ </string>
+ <string name="TooltipFlagNotSafe">
+ Not Safe
+ </string>
+ <string name="TooltipFlagNoFly">
+ 禁止飛行
+ </string>
+ <string name="TooltipFlagGroupScripts">
+ Group Scripts
+ </string>
+ <string name="TooltipFlagNoScripts">
+ No Scripts
+ </string>
+ <string name="TooltipLand">
+ 土地:
+ </string>
+ <string name="TooltipMustSingleDrop">
+ Only a single item can be dragged here
+ </string>
+ <string name="TooltipPrice" value="L$[AMOUNT]:"/>
+ <string name="TooltipHttpUrl">
+ 點擊以察看這個網頁
+ </string>
+ <string name="TooltipSLURL">
+ Click to view this location&apos;s information
+ </string>
+ <string name="TooltipAgentUrl">
+ Click to view this Resident&apos;s profile
+ </string>
+ <string name="TooltipAgentInspect">
+ Learn more about this Resident
+ </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">
+ Click to Pay this Resident
+ </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">
+ Pay
+ </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">
+ 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">
+ No error
+ </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">
+ Unknown status
+ </string>
+ <string name="texture">
+ 材質
+ </string>
+ <string name="sound">
+ 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">
+ Offline
+ </string>
+ <string name="worldmap_item_tooltip_format">
+ [AREA] m² L$[PRICE]
+ </string>
+ <string name="worldmap_results_none_found">
+ 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">
+ Adult
+ </string>
+ <string name="SIM_ACCESS_DOWN">
+ Offline
+ </string>
+ <string name="SIM_ACCESS_MIN">
+ 未知
+ </string>
+ <string name="land_type_unknown">
+ (未知)
+ </string>
+ <string name="Estate / Full Region">
+ Estate / Full Region
+ </string>
+ <string name="Estate / Homestead">
+ Estate / Homestead
+ </string>
+ <string name="Mainland / Homestead">
+ Mainland / Homestead
+ </string>
+ <string name="Mainland / Full Region">
+ Mainland / Full Region
+ </string>
+ <string name="all_files">
+ 全部檔案
+ </string>
+ <string name="sound_files">
+ Sounds
+ </string>
+ <string name="animation_files">
+ Animations
+ </string>
+ <string name="image_files">
+ 圖像
+ </string>
+ <string name="save_file_verb">
+ Save
+ </string>
+ <string name="load_file_verb">
+ Load
+ </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">
+ Compressed Images
+ </string>
+ <string name="load_files">
+ Load Files
+ </string>
+ <string name="choose_the_directory">
+ Choose Directory
+ </string>
+ <string name="AvatarSetNotAway">
+ Not Away
+ </string>
+ <string name="AvatarSetAway">
+ Away
+ </string>
+ <string name="AvatarSetNotBusy">
+ Not Busy
+ </string>
+ <string name="AvatarSetBusy">
+ Busy
+ </string>
+ <string name="shape">
+ Shape
+ </string>
+ <string name="skin">
+ Skin
+ </string>
+ <string name="hair">
+ 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">
+ invalid
+ </string>
+ <string name="none">
+ 無
+ </string>
+ <string name="shirt_not_worn">
+ Shirt not worn
+ </string>
+ <string name="pants_not_worn">
+ Pants not worn
+ </string>
+ <string name="shoes_not_worn">
+ Shoes not worn
+ </string>
+ <string name="socks_not_worn">
+ Socks not worn
+ </string>
+ <string name="jacket_not_worn">
+ Jacket not worn
+ </string>
+ <string name="gloves_not_worn">
+ Gloves not worn
+ </string>
+ <string name="undershirt_not_worn">
+ Undershirt not worn
+ </string>
+ <string name="underpants_not_worn">
+ Underpants not worn
+ </string>
+ <string name="skirt_not_worn">
+ Skirt not worn
+ </string>
+ <string name="alpha_not_worn">
+ Alpha not worn
+ </string>
+ <string name="tattoo_not_worn">
+ Tattoo not worn
+ </string>
+ <string name="physics_not_worn">
+ Physics not worn
+ </string>
+ <string name="invalid_not_worn">
+ invalid
+ </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">
+ Create new shirt
+ </string>
+ <string name="create_new_pants">
+ Create new pants
+ </string>
+ <string name="create_new_shoes">
+ Create new shoes
+ </string>
+ <string name="create_new_socks">
+ Create new socks
+ </string>
+ <string name="create_new_jacket">
+ Create new jacket
+ </string>
+ <string name="create_new_gloves">
+ Create new gloves
+ </string>
+ <string name="create_new_undershirt">
+ Create new undershirt
+ </string>
+ <string name="create_new_underpants">
+ Create new underpants
+ </string>
+ <string name="create_new_skirt">
+ 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">
+ invalid
+ </string>
+ <string name="NewWearable">
+ New [WEARABLE_ITEM]
+ </string>
+ <string name="next">
+ Next
+ </string>
+ <string name="ok">
+ 確定
+ </string>
+ <string name="GroupNotifyGroupNotice">
+ 社團通知
+ </string>
+ <string name="GroupNotifyGroupNotices">
+ 社團通知
+ </string>
+ <string name="GroupNotifySentBy">
+ Sent by
+ </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">
+ New notifications arrived while you were away.
+ </string>
+ <string name="OverflowInfoChannelString">
+ You have %d more notification
+ </string>
+ <string name="BodyPartsRightArm">
+ Right Arm
+ </string>
+ <string name="BodyPartsHead">
+ Head
+ </string>
+ <string name="BodyPartsLeftArm">
+ Left Arm
+ </string>
+ <string name="BodyPartsLeftLeg">
+ Left Leg
+ </string>
+ <string name="BodyPartsTorso">
+ Torso
+ </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 My Favorites">
+ My Favorites
+ </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">
+ Favorites
+ </string>
+ <string name="InvFolder favorite">
+ Favorites
+ </string>
+ <string name="InvFolder Current Outfit">
+ 目前裝扮
+ </string>
+ <string name="InvFolder Initial Outfits">
+ 初始裝扮
+ </string>
+ <string name="InvFolder My Outfits">
+ 我的裝扮
+ </string>
+ <string name="InvFolder Accessories">
+ 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">
+ 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">
+ 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">
+ 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">
+ User has no picks or classifieds
+ </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">
+ 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">
+ 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">
+ 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">
+ Adult Region
+ </string>
+ <string name="LocationCtrlModerateIconTooltip">
+ Moderate Region
+ </string>
+ <string name="LocationCtrlGeneralIconTooltip">
+ General Region
+ </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..9702832f44
--- /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/textures/bottomtray/Speak_Btn_Off.png b/indra/newview/skins/minimal/textures/bottomtray/Speak_Btn_Off.png
new file mode 100644
index 0000000000..b6e9eef891
--- /dev/null
+++ b/indra/newview/skins/minimal/textures/bottomtray/Speak_Btn_Off.png
Binary files differ
diff --git a/indra/newview/skins/minimal/textures/bottomtray/Speak_Btn_Selected_Press.png b/indra/newview/skins/minimal/textures/bottomtray/Speak_Btn_Selected_Press.png
new file mode 100644
index 0000000000..687cb7fb53
--- /dev/null
+++ b/indra/newview/skins/minimal/textures/bottomtray/Speak_Btn_Selected_Press.png
Binary files differ
diff --git a/indra/newview/skins/minimal/textures/textures.xml b/indra/newview/skins/minimal/textures/textures.xml
index b4848a0619..e3ed01721a 100644
--- a/indra/newview/skins/minimal/textures/textures.xml
+++ b/indra/newview/skins/minimal/textures/textures.xml
@@ -6,4 +6,6 @@
<texture name="bottomtray_close_off" file_name="bottomtray/close_off.png" preload="true" />
<texture name="bottomtray_close_over" file_name="bottomtray/close_over.png" preload="true" />
<texture name="bottomtray_close_press" file_name="bottomtray/close_press.png" preload="true" />
-</textures>
+ <texture name="Speak_Btn_Off" file_name="bottomtray/Speak_Btn_Off.png" preload="true" scale.left="4" scale.top="16" scale.right="8" scale.bottom="4" />
+ <texture name="Speak_Btn_Selected_Press" file_name="bottomtray/Speak_Btn_Selected_Press.png" preload="true" scale.left="4" scale.top="16" scale.right="8" scale.bottom="4" />
+ </textures>
diff --git a/indra/newview/skins/minimal/xui/da/floater_camera.xml b/indra/newview/skins/minimal/xui/da/floater_camera.xml
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..d3028c32f9
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/floater_media_browser.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_about" title="MEDIE VÆLGER">
+ <layout_stack name="stack1">
+ <layout_panel name="nav_controls">
+ <button label="Tilbage" name="back"/>
+ <button label="Frem" name="forward"/>
+ <button label="Opdater" name="reload"/>
+ <button label="Gå til" name="go"/>
+ </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 browser" name="open_browser"/>
+ <check_box label="Åben altid i min browser" 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..74092e88ec
--- /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="Navigér tilbage"/>
+ <button name="forward" tool_tip="Navigér frem"/>
+ <button name="stop" tool_tip="Stop navigering"/>
+ <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 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..5470c32761
--- /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="Profil" name="View Profile"/>
+ <menu_item_call label="Tilføj ven" name="Add Friend"/>
+ <menu_item_call label="Fjern ven" name="Remove Friend"/>
+ <menu_item_call label="Besked" 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..0d2aaf45ce
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/notifications.xml
@@ -0,0 +1,1833 @@
+<?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 object med navnet &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt; ejet af [NAME_SLURL] har givet dig denne [OBJECTTYPE]:
+[ITEM_SLURL]
+ <form name="form">
+ <button name="Keep" text="Behold"/>
+ <button name="Discard" text="Smid væk"/>
+ <button name="Mute" text="Blokér"/>
+ </form>
+ </notification>
+ <notification name="UserGiveItem">
+ [NAME_SLURL] har givet dig denne/dette [OBJECTTYPE]:
+[ITEM_SLURL]
+ <form name="form">
+ <button name="Show" text="Vis"/>
+ <button name="Discard" text="Smid væk"/>
+ <button name="Mute" text="Blokér"/>
+ </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..1953fad31f
--- /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 opkald" 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..53a30136ae
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/da/panel_bottomtray.xml
@@ -0,0 +1,39 @@
+<?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="gesture_panel">
+ <gesture_combo_list label="Bevægelse" name="Gesture" tool_tip="Skjuler/viser bevægelser"/>
+ </layout_panel>
+ <layout_panel name="cam_panel">
+ <bottomtray_button label="Vis" name="camera_btn" tool_tip="Vis/Skjul kamerakontroller"/>
+ </layout_panel>
+ <layout_panel name="avatar_and_destinations_panel">
+ <radio_group name="avatar_and_destination_btns">
+ <radio_item name="destination_btn" value="0"/>
+ <radio_item name="avatar_btn" value="1"/>
+ </radio_group>
+ </layout_panel>
+ <layout_panel name="people_panel">
+ <bottomtray_button label="Personer" name="show_people_button" tool_tip="Vis person-vindue"/>
+ </layout_panel>
+ <layout_panel name="profile_panel">
+ <bottomtray_button label="Profil" name="show_profile_btn" tool_tip="Vis profil vindue"/>
+ </layout_panel>
+ <layout_panel name="howto_panel">
+ <bottomtray_button label="Hvordan" name="show_help_btn" tool_tip="Åben Second Life &quot;How To topics&quot;"/>
+ </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..26fe4f6ebe
--- /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 opkald" name="end_call_btn"/>
+ </layout_panel>
+ <layout_panel name="voice_ctrls_btn_panel">
+ <button label="Åben stemmekontroller" 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..5cecb93d40
--- /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 kald" 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..fdcc550d82
--- /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 (Standard)" 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..a540025343
--- /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="Kald" name="call_btn" tool_tip="Opkald 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/en/main_view.xml b/indra/newview/skins/minimal/xui/en/main_view.xml
index 45ba785c1f..6e8ad9adaf 100644
--- a/indra/newview/skins/minimal/xui/en/main_view.xml
+++ b/indra/newview/skins/minimal/xui/en/main_view.xml
@@ -8,13 +8,13 @@
tab_stop="false"
name="main_view"
width="1024">
- <panel top="0"
- follows="all"
- height="768"
- mouse_opaque="false"
- name="login_panel_holder"
- width="1024"/>
-
+ <panel top="0"
+ follows="all"
+ height="768"
+ mouse_opaque="false"
+ name="login_panel_holder"
+ width="1024"/>
+
<layout_stack border_size="0"
follows="all"
mouse_opaque="false"
@@ -96,6 +96,7 @@
name="stand_stop_flying_container"
visible="false"
width="500"/>
+
<panel follows="all"
height="500"
left="0"
diff --git a/indra/newview/skins/minimal/xui/en/menu_attachment_other.xml b/indra/newview/skins/minimal/xui/en/menu_attachment_other.xml
index b55e677276..80cf365c46 100644
--- a/indra/newview/skins/minimal/xui/en/menu_attachment_other.xml
+++ b/indra/newview/skins/minimal/xui/en/menu_attachment_other.xml
@@ -25,6 +25,14 @@
<menu_item_call.on_click
function="Avatar.SendIM" />
</menu_item_call>
+ <menu_item_call
+ label="Call"
+ name="Call">
+ <menu_item_call.on_click
+ function="Avatar.Call" />
+ <menu_item_call.on_enable
+ function="Avatar.EnableCall" />
+ </menu_item_call>
<menu_item_separator />
<menu_item_call
enabled="false"
diff --git a/indra/newview/skins/minimal/xui/en/menu_avatar_other.xml b/indra/newview/skins/minimal/xui/en/menu_avatar_other.xml
index b76629f401..2c81b5a778 100644
--- a/indra/newview/skins/minimal/xui/en/menu_avatar_other.xml
+++ b/indra/newview/skins/minimal/xui/en/menu_avatar_other.xml
@@ -25,6 +25,14 @@
<menu_item_call.on_click
function="Avatar.SendIM" />
</menu_item_call>
+ <menu_item_call
+ label="Call"
+ name="Call">
+ <menu_item_call.on_click
+ function="Avatar.Call" />
+ <menu_item_call.on_enable
+ function="Avatar.EnableCall" />
+ </menu_item_call>
<menu_item_separator />
<menu_item_call
enabled="false"
diff --git a/indra/newview/skins/minimal/xui/en/menu_inspect_avatar_gear.xml b/indra/newview/skins/minimal/xui/en/menu_inspect_avatar_gear.xml
index 5a4a059781..a11e367d66 100644
--- a/indra/newview/skins/minimal/xui/en/menu_inspect_avatar_gear.xml
+++ b/indra/newview/skins/minimal/xui/en/menu_inspect_avatar_gear.xml
@@ -27,6 +27,15 @@
function="InspectAvatar.IM"/>
</menu_item_call>
<menu_item_call
+ label="Call"
+ enabled="true"
+ name="call">
+ <menu_item_call.on_click
+ function="InspectAvatar.Call"/>
+ <menu_item_call.on_enable
+ function="InspectAvatar.Gear.EnableCall"/>
+ </menu_item_call>
+ <menu_item_call
label="Teleport"
name="teleport">
<menu_item_call.on_click
diff --git a/indra/newview/skins/minimal/xui/en/menu_people_nearby.xml b/indra/newview/skins/minimal/xui/en/menu_people_nearby.xml
index 3d64133f54..1840ebd491 100644
--- a/indra/newview/skins/minimal/xui/en/menu_people_nearby.xml
+++ b/indra/newview/skins/minimal/xui/en/menu_people_nearby.xml
@@ -36,6 +36,16 @@
<menu_item_call.on_click
function="Avatar.IM" />
</menu_item_call>
+ <menu_item_call
+ label="Call"
+ layout="topleft"
+ name="Call">
+ <menu_item_call.on_click
+ function="Avatar.Call" />
+ <menu_item_call.on_enable
+ function="Avatar.EnableItem"
+ parameter="can_call" />
+ </menu_item_call>
<menu_item_check
label="Block/Unblock"
layout="topleft"
diff --git a/indra/newview/skins/minimal/xui/en/notification_visibility.xml b/indra/newview/skins/minimal/xui/en/notification_visibility.xml
index 616b544847..bdd3c3d4a4 100644
--- a/indra/newview/skins/minimal/xui/en/notification_visibility.xml
+++ b/indra/newview/skins/minimal/xui/en/notification_visibility.xml
@@ -1,12 +1,9 @@
<?xml version="1.0" ?>
<notification_visibility>
- <respond name="VoiceInviteP2P" response="Decline"/>
- <respond name="VoiceInviteAdHoc" response="Decline"/>
<respond name="VoiceInviteGroup" response="Decline"/>
<!-- group and voice are disabled features -->
<hide tag="group"/>
- <hide tag="voice"/>
<!-- no spammy scripts -->
<!-- <hide name="ScriptDialog"/> -->
@@ -16,6 +13,7 @@
<hide name="FirstInventory"/>
<hide name="HintSidePanel"/>
<hide name="HintMove"/>
+ <hide name="HintSpeak"/>
<hide name="HintDisplayName"/>
<hide name="HintInventory"/>
<hide name="HintLindenDollar"/>
diff --git a/indra/newview/skins/minimal/xui/en/panel_adhoc_control_panel.xml b/indra/newview/skins/minimal/xui/en/panel_adhoc_control_panel.xml
index 5730adab8a..39d1a90850 100644
--- a/indra/newview/skins/minimal/xui/en/panel_adhoc_control_panel.xml
+++ b/indra/newview/skins/minimal/xui/en/panel_adhoc_control_panel.xml
@@ -42,5 +42,40 @@
show_speaking_indicator="false"
width="147" />
</layout_panel>
+ <layout_panel
+ auto_resize="false"
+ follows="top|left|right"
+ height="25"
+ layout="topleft"
+ min_height="25"
+ width="130"
+ name="call_btn_panel"
+ user_resize="false"
+ visible="false">
+ <button
+ follows="all"
+ height="20"
+ label="Call"
+ name="call_btn"
+ width="130"
+ top="5" />
+ </layout_panel>
+ <layout_panel
+ auto_resize="false"
+ follows="top|left|right"
+ height="25"
+ layout="topleft"
+ min_height="25"
+ width="130"
+ name="end_call_btn_panel"
+ user_resize="false"
+ visible="false">
+ <button
+ follows="all"
+ height="20"
+ label="Leave Call"
+ name="end_call_btn"
+ top="5"/>
+ </layout_panel>
</layout_stack>
</panel>
diff --git a/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml b/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml
index d0a77e8c2a..d722c54081 100644
--- a/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml
+++ b/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml
@@ -47,7 +47,7 @@
mouse_opaque="false"
name="chat_bar_layout_panel"
user_resize="true"
- width="308" >
+ width="312" >
<panel
name="chat_bar"
filename="panel_nearby_chat_bar.xml"
@@ -59,7 +59,80 @@
follows="left|right"
/>
</layout_panel>
- <layout_panel
+ <layout_panel
+ auto_resize="false"
+ follows="left|right"
+ height="28"
+ layout="topleft"
+ min_height="28"
+ min_width="35"
+ mouse_opaque="false"
+ name="speak_panel"
+ top_delta="0"
+ user_resize="false"
+ width="85">
+ <button
+ follows="left|right"
+ height="23"
+ layout="topleft"
+ label="Speak"
+ left="0"
+ name="speak_btn"
+ tool_tip="Turn your microphone on and off"
+ pad_right="30"
+ halign="center"
+ use_ellipses="true"
+ tab_stop="true"
+ is_toggle="true"
+ image_selected="Speak_Btn_Selected_Press"
+ image_unselected="Speak_Btn_Off"
+ image_pressed="Speak_Btn_Selected_Press"
+ image_pressed_selected="Speak_Btn_Selected_Press"
+ top="5"
+ width="85">
+
+ <commit_callback
+ function="ToggleSpeak"
+ parameter="f1_help" />
+ </button>
+ </layout_panel>
+
+ <layout_panel
+ auto_resize="false"
+ follows="left|right"
+ height="28"
+ layout="topleft"
+ min_height="28"
+ min_width="20"
+ mouse_opaque="false"
+ name="speak_flyout_panel"
+ top_delta="0"
+ user_resize="false"
+ width="26">
+ <button
+ follows="left|right"
+ width="20"
+ top="5"
+ left="0"
+ height="23"
+ name="flyout_btn"
+ label=""
+ tab_stop="false"
+ tool_tip="Change your sound preferences"
+ is_toggle="true"
+ image_disabled="ComboButton_UpOff"
+ image_unselected="ComboButton_UpOff"
+ image_selected="ComboButton_On"
+ image_pressed="ComboButton_UpSelected"
+ image_pressed_selected="ComboButton_Selected">
+ <init_callback
+ function="Button.SetDockableFloaterToggle"
+ parameter="sound_devices" />
+ </button>
+
+ </layout_panel>
+
+ <layout_panel
auto_resize="false"
follows="right"
height="28"
@@ -70,7 +143,7 @@
name="gesture_panel"
top_delta="0"
user_resize="false"
- width="85">
+ width="88">
<gesture_combo_list
follows="left|right"
height="23"
@@ -80,7 +153,7 @@
view_all="false"
left="0"
name="Gesture"
- tool_tip="Shows/hides gestures"
+ tool_tip="Make your avatar do things"
top="5"
width="82">
<combo_button
@@ -101,7 +174,7 @@
mouse_opaque="false"
name="cam_panel"
user_resize="false"
- width="83">
+ width="86">
<bottomtray_button
can_drag="false"
follows="left|right"
@@ -114,7 +187,7 @@
layout="topleft"
left="0"
name="camera_btn"
- tool_tip="Shows/hides camera controls"
+ tool_tip="Control your camera angle"
top="5"
use_ellipses="true"
width="80">
@@ -128,15 +201,15 @@
follows="left|right"
height="28"
layout="topleft"
- min_width="17"
- name="splitter_panel"
+ min_width="8"
+ name="splitter_panel_1"
user_resize="false"
- width="17">
+ width="8">
<icon
follows="left|bottom"
height="18"
width="2"
- left="6"
+ left="0"
image_name="Button_Separator"
name="separator"
top="7"/>
@@ -149,9 +222,9 @@
min_height="28"
min_width="83"
mouse_opaque="false"
- name="avatar_and_destinations_panel"
+ name="destinations_panel"
user_resize="false"
- width="103">
+ width="106">
<bottomtray_button
can_drag="false"
follows="left|right"
@@ -163,7 +236,7 @@
layout="topleft"
left="0"
name="destination_btn"
- tool_tip="Shows destinations"
+ tool_tip="Travel through Second Life"
top="5"
is_toggle="true"
use_ellipses="true"
@@ -180,9 +253,9 @@
min_height="28"
min_width="73"
mouse_opaque="false"
- name="avatar_and_destinations_panel"
+ name="avatar_panel"
user_resize="false"
- width="103">
+ width="106">
<bottomtray_button
can_drag="false"
follows="left|right"
@@ -196,6 +269,7 @@
name="avatar_btn"
top="5"
is_toggle="true"
+ tool_tip="Change your appearance"
use_ellipses="true"
width="100">
<bottomtray_button.commit_callback
@@ -207,15 +281,15 @@
follows="left|right"
height="28"
layout="topleft"
- min_width="17"
- name="splitter_panel"
+ min_width="8"
+ name="splitter_panel_2"
user_resize="false"
- width="17">
+ width="8">
<icon
follows="left|bottom"
height="18"
width="2"
- left="6"
+ left="0"
image_name="Button_Separator"
name="separator"
top="7"/>
@@ -231,7 +305,7 @@
name="people_panel"
top_delta="0"
user_resize="false"
- width="105">
+ width="106">
<bottomtray_button
can_drag="false"
follows="left|right"
@@ -243,7 +317,7 @@
layout="topleft"
left="0"
name="show_people_button"
- tool_tip="Shows people window"
+ tool_tip="Find people in Second Life"
top="5"
is_toggle="true"
use_ellipses="true"
@@ -264,7 +338,7 @@
name="profile_panel"
top_delta="0"
user_resize="false"
- width="105">
+ width="106">
<bottomtray_button
can_drag="false"
follows="left|right"
@@ -276,7 +350,7 @@
layout="topleft"
left="0"
name="show_profile_btn"
- tool_tip="Shows profile window"
+ tool_tip="View and edit your Profile"
is_toggle="true"
top="5"
use_ellipses="true"
@@ -297,7 +371,7 @@
name="howto_panel"
top_delta="0"
user_resize="false"
- width="105">
+ width="106">
<bottomtray_button
can_drag="false"
follows="left|right"
@@ -309,7 +383,7 @@
layout="topleft"
left="0"
name="show_help_btn"
- tool_tip="Open Second Life How To topics"
+ tool_tip="View Second Life help info"
is_toggle="true"
top="5"
use_ellipses="true"
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 53def54aca..be13bc1bb7 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,5 +23,102 @@
orientation="vertical"
top_pad="5"
width="145">
+ <layout_panel
+ auto_resize="false"
+ follows="top|left|right"
+ height="20"
+ layout="topleft"
+ left="2"
+ min_height="20"
+ width="140"
+ name="view_profile_btn_panel"
+ top="0"
+ user_resize="false">
+ <button
+ follows="left|top|right"
+ height="23"
+ label="Profile"
+ name="view_profile_btn"
+ top="0"
+ width="140" />
+ </layout_panel>
+ <layout_panel
+ auto_resize="false"
+ follows="top|left|right"
+ height="25"
+ layout="topleft"
+ min_height="25"
+ width="140"
+ name="add_friend_btn_panel"
+ user_resize="false">
+ <button
+ follows="left|top|right"
+ height="23"
+ label="Add Friend"
+ name="add_friend_btn"
+ top="5"
+ width="140" />
+ </layout_panel>
+ <layout_panel
+ auto_resize="false"
+ follows="top|left|right"
+ height="25"
+ layout="topleft"
+ min_height="25"
+ width="140"
+ name="teleport_btn_panel"
+ user_resize="false">
+ <button
+ auto_resize="false"
+ follows="left|top|right"
+ height="23"
+ label="Teleport"
+ name="teleport_btn"
+ tool_tip = "Offer to teleport this person"
+ width="140" />
+ </layout_panel>
+ <layout_panel
+ auto_resize="false"
+ follows="top|left|right"
+ height="25"
+ layout="topleft"
+ min_height="25"
+ width="140"
+ name="call_btn_panel"
+ user_resize="false">
+ <button
+ follows="left|top|right"
+ height="23"
+ label="Call"
+ name="call_btn"
+ width="140" />
+ </layout_panel>
+ <layout_panel
+ auto_resize="false"
+ follows="top|left|right"
+ height="25"
+ layout="topleft"
+ min_height="25"
+ width="140"
+ name="end_call_btn_panel"
+ user_resize="false"
+ visible="false">
+ <button
+ follows="left|top|right"
+ height="23"
+ label="End Call"
+ name="end_call_btn"
+ width="140" />
+ </layout_panel>
+ <layout_panel
+ mouse_opaque="false"
+ auto_resize="true"
+ follows="top|left"
+ height="0"
+ layout="topleft"
+ min_height="0"
+ width="140"
+ name="spacer"
+ user_resize="false" />
</layout_stack>
</panel>
diff --git a/indra/newview/skins/minimal/xui/en/panel_people.xml b/indra/newview/skins/minimal/xui/en/panel_people.xml
index 4a72653d76..76baacb091 100644
--- a/indra/newview/skins/minimal/xui/en/panel_people.xml
+++ b/indra/newview/skins/minimal/xui/en/panel_people.xml
@@ -452,6 +452,27 @@ Looking for people to hang out with? Try the Destinations button below.
name="chat_btn_lp"
user_resize="false"
auto_resize="true"
+ width="52">
+ <button
+ follows="bottom|left|right"
+ left="1"
+ height="23"
+ label="Call"
+ layout="topleft"
+ name="call_btn"
+ tool_tip="Call this Resident"
+ top="0"
+ width="51" />
+ </layout_panel>
+
+ <layout_panel
+ follows="bottom|left|right"
+ height="23"
+ layout="bottomleft"
+ left_pad="3"
+ name="chat_btn_lp"
+ user_resize="false"
+ auto_resize="true"
width="77">
<button
follows="bottom|left|right"
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_favorites.xml b/indra/newview/skins/minimal/xui/es/menu_favorites.xml
index c8a7858ddb..85210d5c49 100644
--- a/indra/newview/skins/minimal/xui/es/menu_favorites.xml
+++ b/indra/newview/skins/minimal/xui/es/menu_favorites.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="Popup">
- <menu_item_call label="Teleportarse" name="Teleport To Landmark"/>
+ <menu_item_call label="Teleportar" name="Teleport To Landmark"/>
<menu_item_call label="Ver/Editar el hito" name="Landmark Open"/>
<menu_item_call label="Copiar la SLurl" name="Copy slurl"/>
<menu_item_call label="Mostrar en el mapa" name="Show On Map"/>
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 ebe33cea11..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,7 +3,8 @@
<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="Teleportarse" name="teleport"/>
+ <menu_item_call label="Llamar" name="call"/>
+ <menu_item_call label="Teleportar" name="teleport"/>
<menu_item_call label="Ignorar" name="block"/>
<menu_item_call label="Designorar" name="unblock"/>
<menu_item_call label="Denunciar" name="report"/>
diff --git a/indra/newview/skins/minimal/xui/es/menu_teleport_history_item.xml b/indra/newview/skins/minimal/xui/es/menu_teleport_history_item.xml
index ed33c55aca..c482907812 100644
--- a/indra/newview/skins/minimal/xui/es/menu_teleport_history_item.xml
+++ b/indra/newview/skins/minimal/xui/es/menu_teleport_history_item.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<context_menu name="Teleport History Item Context Menu">
- <menu_item_call label="Teleportarse" name="Teleport"/>
+ <menu_item_call label="Teleportar" name="Teleport"/>
<menu_item_call label="Más información" name="More Information"/>
<menu_item_call label="Copiar al portapapeles" name="CopyToClipboard"/>
</context_menu>
diff --git a/indra/newview/skins/minimal/xui/es/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/pl/floater_camera.xml b/indra/newview/skins/minimal/xui/pl/floater_camera.xml
new file mode 100644
index 0000000000..5b9dd47616
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/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">
+ Obracaj kamerę wokół obiektu
+ </floater.string>
+ <floater.string name="zoom_tooltip">
+ Najedź kamerą w kierunku obiektu
+ </floater.string>
+ <floater.string name="move_tooltip">
+ Poruszaj kamerą w dół/górę oraz w prawo/lewo
+ </floater.string>
+ <floater.string name="camera_modes_title">
+ Ustawienia
+ </floater.string>
+ <floater.string name="pan_mode_title">
+ W prawo lub w lewo
+ </floater.string>
+ <floater.string name="presets_mode_title">
+ Ustaw widok
+ </floater.string>
+ <floater.string name="free_mode_title">
+ Zobacz obiekt
+ </floater.string>
+ <panel name="controls">
+ <panel name="preset_views_list">
+ <panel_camera_item name="front_view">
+ <panel_camera_item.text name="front_view_text">
+ Widok z przodu
+ </panel_camera_item.text>
+ </panel_camera_item>
+ <panel_camera_item name="group_view">
+ <panel_camera_item.text name="side_view_text">
+ Podgląd grupy
+ </panel_camera_item.text>
+ </panel_camera_item>
+ <panel_camera_item name="rear_view">
+ <panel_camera_item.text name="rear_view_text">
+ Widok z tyłu
+ </panel_camera_item.text>
+ </panel_camera_item>
+ </panel>
+ <panel name="camera_modes_list">
+ <panel_camera_item name="object_view">
+ <panel_camera_item.text name="object_view_text">
+ Widok obiektu
+ </panel_camera_item.text>
+ </panel_camera_item>
+ <panel_camera_item name="mouselook_view">
+ <panel_camera_item.text name="mouselook_view_text">
+ Widok panoramiczny
+ </panel_camera_item.text>
+ </panel_camera_item>
+ </panel>
+ <panel name="zoom" tool_tip="Najedź kamerą w kierunku obiektu">
+ <joystick_rotate name="cam_rotate_stick" tool_tip="Obracaj kamerę wokoł osi"/>
+ <slider_bar name="zoom_slider" tool_tip="Przybliż kamerę do ogniskowej"/>
+ <joystick_track name="cam_track_stick" tool_tip="Poruszaj kamerą w górę, w dół, w lewo i w prawo"/>
+ </panel>
+ </panel>
+ <panel name="buttons">
+ <button label="" name="presets_btn" tool_tip="Ustaw widok"/>
+ <button label="" name="pan_btn" tool_tip="Kamera horyzontalna"/>
+ <button label="" name="avatarview_btn" tool_tip="Ustawienia"/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/minimal/xui/pl/floater_help_browser.xml b/indra/newview/skins/minimal/xui/pl/floater_help_browser.xml
new file mode 100644
index 0000000000..66fde04f88
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/floater_help_browser.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_help_browser" title="POMOC">
+ <floater.string name="loading_text">
+ Ładowanie...
+ </floater.string>
+ <layout_stack name="stack1">
+ <layout_panel name="external_controls"/>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/minimal/xui/pl/floater_media_browser.xml b/indra/newview/skins/minimal/xui/pl/floater_media_browser.xml
new file mode 100644
index 0000000000..02b7c6bc2b
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/floater_media_browser.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_about" title="PRZEGLĄDARKA MEDIÓW">
+ <floater.string name="home_page_url">
+ http://www.secondlife.com
+ </floater.string>
+ <floater.string name="support_page_url">
+ http://support.secondlife.com
+ </floater.string>
+ <layout_stack name="stack1">
+ <layout_panel name="nav_controls">
+ <button label="Wstecz" name="back"/>
+ <button label="Dalej" name="forward"/>
+ <button label="Odśwież" name="reload"/>
+ <button label="Idź" name="go"/>
+ </layout_panel>
+ <layout_panel name="time_controls">
+ <button label="przewiń" name="rewind"/>
+ <button label="zatrzymaj" name="stop"/>
+ <button label="dalej" name="seek"/>
+ </layout_panel>
+ <layout_panel name="parcel_owner_controls">
+ <button label="Wyślij bieżącą stronę do parceli" name="assign"/>
+ </layout_panel>
+ <layout_panel name="external_controls">
+ <button label="Otwórz w przeglądarce zewnętrznej" name="open_browser"/>
+ <check_box label="Zawsze otwieraj w przeglądarce zewnętrznej" name="open_always"/>
+ <button label="Zamknij" name="close"/>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/minimal/xui/pl/floater_nearby_chat.xml b/indra/newview/skins/minimal/xui/pl/floater_nearby_chat.xml
new file mode 100644
index 0000000000..7dc3e1f22e
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/floater_nearby_chat.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="nearby_chat" title="CZAT LOKALNY">
+ <check_box label="Tłumaczenie czatu (wspierane przez Google)" name="translate_chat_checkbox"/>
+</floater>
diff --git a/indra/newview/skins/minimal/xui/pl/floater_web_content.xml b/indra/newview/skins/minimal/xui/pl/floater_web_content.xml
new file mode 100644
index 0000000000..e3096f1e54
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/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="Wstecz"/>
+ <button name="forward" tool_tip="Dalej"/>
+ <button name="stop" tool_tip="Zatrzymaj"/>
+ <button name="reload" tool_tip="Odśwież stronę"/>
+ <combo_box name="address" tool_tip="Wpisz URL tutaj"/>
+ <icon name="media_secure_lock_flag" tool_tip="Zabezpieczona przeglądarka"/>
+ <button name="popexternal" tool_tip="Otwórz bieżący URL w zewnętrznej przeglądarce"/>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/minimal/xui/pl/inspect_avatar.xml b/indra/newview/skins/minimal/xui/pl/inspect_avatar.xml
new file mode 100644
index 0000000000..5e982c0185
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/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">
+ To jest mój opis w Second Life.
+ </text>
+ <slider name="volume_slider" tool_tip="Poziom głośności" value="0.5"/>
+ <button label="Dodaj znajomość" name="add_friend_btn"/>
+ <button label="IM" name="im_btn"/>
+ <button label="Profil" name="view_profile_btn"/>
+ <panel name="moderator_panel">
+ <button label="Wyłącz komunikację głosową" name="disable_voice"/>
+ <button label="Włącz komunikację głosową" name="enable_voice"/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/minimal/xui/pl/inspect_object.xml b/indra/newview/skins/minimal/xui/pl/inspect_object.xml
new file mode 100644
index 0000000000..23d8ce7700
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/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">
+ Przez [CREATOR]
+ </string>
+ <string name="CreatorAndOwner">
+ Twórca [CREATOR]
+Właściciel [OWNER]
+ </string>
+ <string name="Price">
+ L$[AMOUNT]
+ </string>
+ <string name="PriceFree">
+ Darmowe!
+ </string>
+ <string name="Touch">
+ Dotknij
+ </string>
+ <string name="Sit">
+ Usiądź tutaj
+ </string>
+ <text name="object_name" value="Test Object Name That Is actually two lines and Really Long"/>
+ <text name="price_text">
+ L$30,000
+ </text>
+ <text name="object_description">
+ This is a really long description for an object being as how it is at least 80 characters in length and so but maybe more like 120 at this point. Who knows, really?
+ </text>
+ <button label="Kup" name="buy_btn"/>
+ <button label="Zapłać" name="pay_btn"/>
+ <button label="Weź kopię" name="take_free_copy_btn"/>
+ <button label="Dotknij" name="touch_btn"/>
+ <button label="Usiądź tutaj" name="sit_btn"/>
+ <button label="Otwórz" name="open_btn"/>
+ <icon name="secure_browsing" tool_tip="Zabezpiecz przeglądanie"/>
+ <button label="Więcej" name="more_info_btn"/>
+</floater>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_add_wearable_gear.xml b/indra/newview/skins/minimal/xui/pl/menu_add_wearable_gear.xml
new file mode 100644
index 0000000000..7c572b4fc9
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/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="Porządkuj według daty" name="sort_by_most_recent"/>
+ <menu_item_check label="Porządkuj według nazwy" name="sort_by_name"/>
+ <menu_item_check label="Porządkuj według typu" name="sort_by_type"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_attachment_other.xml b/indra/newview/skins/minimal/xui/pl/menu_attachment_other.xml
new file mode 100644
index 0000000000..aacdad97e3
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/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="Zobacz profil" name="Profile..."/>
+ <menu_item_call label="Dodaj znajomość" name="Add Friend"/>
+ <menu_item_call label="IM" name="Send IM..."/>
+ <menu_item_call label="Zadzwoń" name="Call"/>
+ <menu_item_call label="Zaproś do grupy" name="Invite..."/>
+ <menu_item_call label="Zablokuj" name="Avatar Mute"/>
+ <menu_item_call label="Raport" name="abuse"/>
+ <menu_item_call label="Unieruchom" name="Freeze..."/>
+ <menu_item_call label="Wyrzuć" name="Eject..."/>
+ <menu_item_call label="Debugowanie tekstur" name="Debug..."/>
+ <menu_item_call label="Przybliż" name="Zoom In"/>
+ <menu_item_call label="Zapłać" name="Pay..."/>
+ <menu_item_call label="Sprawdź" name="Object Inspect"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_attachment_self.xml b/indra/newview/skins/minimal/xui/pl/menu_attachment_self.xml
new file mode 100644
index 0000000000..163b3a231e
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/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="Dotknij" name="Attachment Object Touch"/>
+ <menu_item_call label="Edytuj" name="Edit..."/>
+ <menu_item_call label="Odłącz" name="Detach"/>
+ <menu_item_call label="Usiądź tutaj" name="Sit Down Here"/>
+ <menu_item_call label="Wstań" name="Stand Up"/>
+ <menu_item_call label="Mój wygląd" name="Change Outfit"/>
+ <menu_item_call label="Edytuj mój strój" name="Edit Outfit"/>
+ <menu_item_call label="Edytuj mój kształt" name="Edit My Shape"/>
+ <menu_item_call label="Moi znajomi" name="Friends..."/>
+ <menu_item_call label="Moje grupy" name="Groups..."/>
+ <menu_item_call label="Mój profil" name="Profile..."/>
+ <menu_item_call label="Debugowanie tekstur" name="Debug..."/>
+ <menu_item_call label="Opuść" name="Drop"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_avatar_icon.xml b/indra/newview/skins/minimal/xui/pl/menu_avatar_icon.xml
new file mode 100644
index 0000000000..e8d2b14231
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/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="Czat/IM..." name="Send IM"/>
+ <menu_item_call label="Dodaj znajomość..." name="Add Friend"/>
+ <menu_item_call label="Usuń..." name="Remove Friend"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_avatar_other.xml b/indra/newview/skins/minimal/xui/pl/menu_avatar_other.xml
new file mode 100644
index 0000000000..dcf7921bad
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/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="Zobacz profil" name="Profile..."/>
+ <menu_item_call label="Dodaj znajomość" name="Add Friend"/>
+ <menu_item_call label="IM" name="Send IM..."/>
+ <menu_item_call label="Zadzwoń" name="Call"/>
+ <menu_item_call label="Zaproś do grupy" name="Invite..."/>
+ <menu_item_call label="Zablokuj" name="Avatar Mute"/>
+ <menu_item_call label="Raport" name="abuse"/>
+ <menu_item_call label="Unieruchom" name="Freeze..."/>
+ <menu_item_call label="Wyrzuć" name="Eject..."/>
+ <menu_item_call label="Debugowanie tekstur" name="Debug..."/>
+ <menu_item_call label="Przybliż" name="Zoom In"/>
+ <menu_item_call label="Zapłać" name="Pay..."/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_avatar_self.xml b/indra/newview/skins/minimal/xui/pl/menu_avatar_self.xml
new file mode 100644
index 0000000000..d481475803
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/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="Usiądź tu" name="Sit Down Here"/>
+ <menu_item_call label="Wstań" name="Stand Up"/>
+ <context_menu label="Zdejmij" name="Take Off &gt;">
+ <context_menu label="Ubrania" name="Clothes &gt;">
+ <menu_item_call label="Koszulę" name="Shirt"/>
+ <menu_item_call label="Spodnie" name="Pants"/>
+ <menu_item_call label="Spódnicę" name="Skirt"/>
+ <menu_item_call label="Buty" name="Shoes"/>
+ <menu_item_call label="Skarpetki" name="Socks"/>
+ <menu_item_call label="Kurtkę" name="Jacket"/>
+ <menu_item_call label="Rękawiczki" name="Gloves"/>
+ <menu_item_call label="Podkoszulek" name="Self Undershirt"/>
+ <menu_item_call label="Bieliznę" name="Self Underpants"/>
+ <menu_item_call label="Tatuaż" name="Self Tattoo"/>
+ <menu_item_call label="Ubranie alpha" name="Self Alpha"/>
+ <menu_item_call label="Wszystko" name="All Clothes"/>
+ </context_menu>
+ <context_menu label="HUD" name="Object Detach HUD"/>
+ <context_menu label="Odłącz" name="Object Detach"/>
+ <menu_item_call label="Odłącz wszystko" name="Detach All"/>
+ </context_menu>
+ <menu_item_call label="Mój wygląd" name="Chenge Outfit"/>
+ <menu_item_call label="Edytuj mój strój" name="Edit Outfit"/>
+ <menu_item_call label="Edytuj mój kształt" name="Edit My Shape"/>
+ <menu_item_call label="Moi znajomi" name="Friends..."/>
+ <menu_item_call label="Moje grupy" name="Groups..."/>
+ <menu_item_call label="Mój profil" name="Profile..."/>
+ <menu_item_call label="Debugowanie tekstur" name="Debug..."/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_bottomtray.xml b/indra/newview/skins/minimal/xui/pl/menu_bottomtray.xml
new file mode 100644
index 0000000000..8da40dcedf
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/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="Rozmowy głosowe aktywne" name="EnableVoiceChat"/>
+ <menu_item_check label="Przycisk gesturki" name="ShowGestureButton"/>
+ <menu_item_check label="Przycisk ruchu" name="ShowMoveButton"/>
+ <menu_item_check label="Przycisk widoku" name="ShowCameraButton"/>
+ <menu_item_check label="Przycisk zdjęć" name="ShowSnapshotButton"/>
+ <menu_item_check label="Buduj" name="ShowBuildButton"/>
+ <menu_item_check label="Szukaj" name="ShowSearchButton"/>
+ <menu_item_check label="Mapa" name="ShowWorldMapButton"/>
+ <menu_item_check label="Mini-Mapa" name="ShowMiniMapButton"/>
+ <menu_item_call label="Wytnij" name="NearbyChatBar_Cut"/>
+ <menu_item_call label="Kopiuj" name="NearbyChatBar_Copy"/>
+ <menu_item_call label="Wklej" name="NearbyChatBar_Paste"/>
+ <menu_item_call label="Usuń" name="NearbyChatBar_Delete"/>
+ <menu_item_call label="Zaznacz wszystko" name="NearbyChatBar_Select_All"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_cof_attachment.xml b/indra/newview/skins/minimal/xui/pl/menu_cof_attachment.xml
new file mode 100644
index 0000000000..4e5407601b
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/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="Odłącz" name="detach"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_cof_body_part.xml b/indra/newview/skins/minimal/xui/pl/menu_cof_body_part.xml
new file mode 100644
index 0000000000..ee60d3feb6
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/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="Zastąp" name="replace"/>
+ <menu_item_call label="Edytuj" name="edit"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_cof_clothing.xml b/indra/newview/skins/minimal/xui/pl/menu_cof_clothing.xml
new file mode 100644
index 0000000000..ad43900137
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/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="Zdejmij" name="take_off"/>
+ <menu_item_call label="Edytuj" name="edit"/>
+ <menu_item_call label="Zastąp" name="replace"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_cof_gear.xml b/indra/newview/skins/minimal/xui/pl/menu_cof_gear.xml
new file mode 100644
index 0000000000..9fba39be1a
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/menu_cof_gear.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Gear COF">
+ <menu label="Nowe ubranie" name="COF.Gear.New_Clothes"/>
+ <menu label="Nowe części ciała" name="COF.Geear.New_Body_Parts"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_edit.xml b/indra/newview/skins/minimal/xui/pl/menu_edit.xml
new file mode 100644
index 0000000000..578e270fed
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/menu_edit.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu label="Edycja" name="Edit">
+ <menu_item_call label="Cofnij" name="Undo"/>
+ <menu_item_call label="Powtórz" name="Redo"/>
+ <menu_item_call label="Wytnij" name="Cut"/>
+ <menu_item_call label="Kopiuj" name="Copy"/>
+ <menu_item_call label="Wklej" name="Paste"/>
+ <menu_item_call label="Usuń" name="Delete"/>
+ <menu_item_call label="Powiel" name="Duplicate"/>
+ <menu_item_call label="Zaznacz wszystko" name="Select All"/>
+ <menu_item_call label="Odznacz" name="Deselect"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_favorites.xml b/indra/newview/skins/minimal/xui/pl/menu_favorites.xml
new file mode 100644
index 0000000000..7310ff5c27
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/menu_favorites.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Popup">
+ <menu_item_call label="Teleportuj" name="Teleport To Landmark"/>
+ <menu_item_call label="Zobacz/Edytuj Ulubione miejsce" name="Landmark Open"/>
+ <menu_item_call label="Kopiuj SLurl" name="Copy slurl"/>
+ <menu_item_call label="Pokaż na mapie" name="Show On Map"/>
+ <menu_item_call label="Kopiuj" name="Landmark Copy"/>
+ <menu_item_call label="Wklej" name="Landmark Paste"/>
+ <menu_item_call label="Usuń" name="Delete"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_gesture_gear.xml b/indra/newview/skins/minimal/xui/pl/menu_gesture_gear.xml
new file mode 100644
index 0000000000..a72dec22fc
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/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="Dodaj/Usuń z Ulubionych" name="activate"/>
+ <menu_item_call label="Kopiuj" name="copy_gesture"/>
+ <menu_item_call label="Wklej" name="paste"/>
+ <menu_item_call label="Kopiuj UUID" name="copy_uuid"/>
+ <menu_item_call label="Zapisz do obecnego zestawu ubrania" name="save_to_outfit"/>
+ <menu_item_call label="Edytuj" name="edit_gesture"/>
+ <menu_item_call label="Sprawdź" name="inspect"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_group_plus.xml b/indra/newview/skins/minimal/xui/pl/menu_group_plus.xml
new file mode 100644
index 0000000000..83be4d38c5
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/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="Dołącz do grupy..." name="item_join"/>
+ <menu_item_call label="Nowa grupa..." name="item_new"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_hide_navbar.xml b/indra/newview/skins/minimal/xui/pl/menu_hide_navbar.xml
new file mode 100644
index 0000000000..19d9510cd3
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/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="Pokaż pasek Nawigacji" name="ShowNavbarNavigationPanel"/>
+ <menu_item_check label="Pokaż pasek Ulubionych" name="ShowNavbarFavoritesPanel"/>
+ <menu_item_check label="Pokaż pasek mini-lokalizacji" name="ShowMiniLocationPanel"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_im_well_button.xml b/indra/newview/skins/minimal/xui/pl/menu_im_well_button.xml
new file mode 100644
index 0000000000..207bc2211b
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/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="Zamknij wszystkie" name="Close All"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_imchiclet_adhoc.xml b/indra/newview/skins/minimal/xui/pl/menu_imchiclet_adhoc.xml
new file mode 100644
index 0000000000..4ead44878a
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/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="Zakończ rozmowę" name="End Session"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_imchiclet_group.xml b/indra/newview/skins/minimal/xui/pl/menu_imchiclet_group.xml
new file mode 100644
index 0000000000..2b9a362123
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/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="O grupie" name="Show Profile"/>
+ <menu_item_call label="Pokaż sesję" name="Chat"/>
+ <menu_item_call label="Zakończ rozmowę" name="End Session"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_imchiclet_p2p.xml b/indra/newview/skins/minimal/xui/pl/menu_imchiclet_p2p.xml
new file mode 100644
index 0000000000..8924d6db3e
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/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="Zobacz profil" name="Show Profile"/>
+ <menu_item_call label="Dodaj znajomość" name="Add Friend"/>
+ <menu_item_call label="Pokaż sesję" name="Send IM"/>
+ <menu_item_call label="Zakończ rozmowę" name="End Session"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_inspect_avatar_gear.xml b/indra/newview/skins/minimal/xui/pl/menu_inspect_avatar_gear.xml
new file mode 100644
index 0000000000..59560f236c
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/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="Zobacz profil" name="view_profile"/>
+ <menu_item_call label="Dodaj znajomość" name="add_friend"/>
+ <menu_item_call label="IM" name="im"/>
+ <menu_item_call label="Zadzwoń" name="call"/>
+ <menu_item_call label="Teleportuj" name="teleport"/>
+ <menu_item_call label="Zaproś do grupy" name="invite_to_group"/>
+ <menu_item_call label="Zablokuj" name="block"/>
+ <menu_item_call label="Odblokuj" name="unblock"/>
+ <menu_item_call label="Raport" name="report"/>
+ <menu_item_call label="Unieruchom" name="freeze"/>
+ <menu_item_call label="Wyrzuć" name="eject"/>
+ <menu_item_call label="Kopnij" name="kick"/>
+ <menu_item_call label="CSR" name="csr"/>
+ <menu_item_call label="Debugowanie tekstur" name="debug"/>
+ <menu_item_call label="Znajdź na mapie" name="find_on_map"/>
+ <menu_item_call label="Przybliż" name="zoom_in"/>
+ <menu_item_call label="Zapłać" name="pay"/>
+ <menu_item_call label="Udostępnij" name="share"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_inspect_object_gear.xml b/indra/newview/skins/minimal/xui/pl/menu_inspect_object_gear.xml
new file mode 100644
index 0000000000..c12bd490ff
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/menu_inspect_object_gear.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu name="Gear Menu">
+ <menu_item_call label="Dotknij" name="touch"/>
+ <menu_item_call label="Usiądź" name="sit"/>
+ <menu_item_call label="Zapłać" name="pay"/>
+ <menu_item_call label="Kup" name="buy"/>
+ <menu_item_call label="Weź" name="take"/>
+ <menu_item_call label="Weź kopię" name="take_copy"/>
+ <menu_item_call label="Otwórz" name="open"/>
+ <menu_item_call label="Edytuj" name="edit"/>
+ <menu_item_call label="Ubierz" name="wear"/>
+ <menu_item_call label="Dodaj" name="add"/>
+ <menu_item_call label="Raport" name="report"/>
+ <menu_item_call label="Zablokuj" name="block"/>
+ <menu_item_call label="Przybliż" name="zoom_in"/>
+ <menu_item_call label="Usuń" name="remove"/>
+ <menu_item_call label="Więcej informacji" name="more_info"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_inspect_self_gear.xml b/indra/newview/skins/minimal/xui/pl/menu_inspect_self_gear.xml
new file mode 100644
index 0000000000..c4ef9761d9
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/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="Usiądź tutaj" name="Sit Down Here"/>
+ <menu_item_call label="Wstań" name="Stand Up"/>
+ <context_menu label="Zdejmij" name="Take Off &gt;">
+ <context_menu label="Ubranie" name="Clothes &gt;">
+ <menu_item_call label="Bluzka" name="Shirt"/>
+ <menu_item_call label="Spodnie" name="Pants"/>
+ <menu_item_call label="Spódnica" name="Skirt"/>
+ <menu_item_call label="Buty" name="Shoes"/>
+ <menu_item_call label="Skarpetki" name="Socks"/>
+ <menu_item_call label="Kurtka" name="Jacket"/>
+ <menu_item_call label="Rękawiczki" name="Gloves"/>
+ <menu_item_call label="Podkoszulek" name="Self Undershirt"/>
+ <menu_item_call label="Bielizna" name="Self Underpants"/>
+ <menu_item_call label="Tatuaż" name="Self Tattoo"/>
+ <menu_item_call label="Alpha" name="Self Alpha"/>
+ <menu_item_call label="Ubranie" name="All Clothes"/>
+ </context_menu>
+ <context_menu label="HUD" name="Object Detach HUD"/>
+ <context_menu label="Odłącz" name="Object Detach"/>
+ <menu_item_call label="Odłącz wszystko" name="Detach All"/>
+ </context_menu>
+ <menu_item_call label="Zmień strój" name="Chenge Outfit"/>
+ <menu_item_call label="Edytuj mój strój" name="Edit Outfit"/>
+ <menu_item_call label="Edytuj mój kształt" name="Edit My Shape"/>
+ <menu_item_call label="Znajomi" name="Friends..."/>
+ <menu_item_call label="Moje grupy" name="Groups..."/>
+ <menu_item_call label="Mój profil" name="Profile..."/>
+ <menu_item_call label="Debugowanie tekstur" name="Debug..."/>
+</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_inv_offer_chiclet.xml b/indra/newview/skins/minimal/xui/pl/menu_inv_offer_chiclet.xml
new file mode 100644
index 0000000000..5ef0f2f7a4
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/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="Zamknij" name="Close"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_inventory.xml b/indra/newview/skins/minimal/xui/pl/menu_inventory.xml
new file mode 100644
index 0000000000..e47ffa0e18
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/menu_inventory.xml
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Popup">
+ <menu_item_call label="Udostępnij" name="Share"/>
+ <menu_item_call label="Kupuj" name="Task Buy"/>
+ <menu_item_call label="Otwórz" name="Task Open"/>
+ <menu_item_call label="Odtwarzaj" name="Task Play"/>
+ <menu_item_call label="Właściwości" name="Task Properties"/>
+ <menu_item_call label="Zmień nazwę" name="Task Rename"/>
+ <menu_item_call label="Usuń" name="Task Remove"/>
+ <menu_item_call label="Opróżnij Kosz" name="Empty Trash"/>
+ <menu_item_call label="Opróżnij Folder Zgubione i odnalezione" name="Empty Lost And Found"/>
+ <menu_item_call label="Nowy folder" name="New Folder"/>
+ <menu_item_call label="Nowy skrypt" name="New Script"/>
+ <menu_item_call label="Nowa nota" name="New Note"/>
+ <menu_item_call label="Nowa gesturka" name="New Gesture"/>
+ <menu label="Nowe Ubranie" name="New Clothes">
+ <menu_item_call label="Nowa koszula" name="New Shirt"/>
+ <menu_item_call label="Nowe spodnie" name="New Pants"/>
+ <menu_item_call label="Nowe buty" name="New Shoes"/>
+ <menu_item_call label="Nowe skarpety" name="New Socks"/>
+ <menu_item_call label="Nowa kurtka" name="New Jacket"/>
+ <menu_item_call label="Nowa spódnica" name="New Skirt"/>
+ <menu_item_call label="Nowe rękawiczki" name="New Gloves"/>
+ <menu_item_call label="Nowy podkoszulek" name="New Undershirt"/>
+ <menu_item_call label="Nowa bielizna" name="New Underpants"/>
+ <menu_item_call label="Nowa maska alpha" name="New Alpha Mask"/>
+ <menu_item_call label="Nowy tatuaż" name="New Tattoo"/>
+ </menu>
+ <menu label="Nowa Część Ciała" name="New Body Parts">
+ <menu_item_call label="Nowy kształt" name="New Shape"/>
+ <menu_item_call label="Nowa skórka" name="New Skin"/>
+ <menu_item_call label="Nowe włosy" name="New Hair"/>
+ <menu_item_call label="Nowe oczy" name="New Eyes"/>
+ </menu>
+ <menu label="Zmień Czcionkę" name="Change Type">
+ <menu_item_call label="Domyślna" name="Default"/>
+ <menu_item_call label="Rękawiczki" name="Gloves"/>
+ <menu_item_call label="Kurtka" name="Jacket"/>
+ <menu_item_call label="Spodnie" name="Pants"/>
+ <menu_item_call label="Kształt" name="Shape"/>
+ <menu_item_call label="Buty" name="Shoes"/>
+ <menu_item_call label="Koszula" name="Shirt"/>
+ <menu_item_call label="Spódnica" name="Skirt"/>
+ <menu_item_call label="Bielizna" name="Underpants"/>
+ <menu_item_call label="Podkoszulek" name="Undershirt"/>
+ </menu>
+ <menu_item_call label="Teleportuj" name="Landmark Open"/>
+ <menu_item_call label="Otwórz" name="Animation Open"/>
+ <menu_item_call label="Otwórz" name="Sound Open"/>
+ <menu_item_call label="Zmień strój" name="Replace Outfit"/>
+ <menu_item_call label="Dodaj do stroju" name="Add To Outfit"/>
+ <menu_item_call label="Usuń obiekt" name="Purge Item"/>
+ <menu_item_call label="Przywróć obiekt" name="Restore Item"/>
+ <menu_item_call label="Otwórz" name="Open"/>
+ <menu_item_call label="Otwórz oryginalne" name="Open Original"/>
+ <menu_item_call label="Właściwości" name="Properties"/>
+ <menu_item_call label="Zmień nazwę" name="Rename"/>
+ <menu_item_call label="Kopiuj dane UUID" name="Copy Asset UUID"/>
+ <menu_item_call label="Kopiuj" name="Copy"/>
+ <menu_item_call label="Wklej" name="Paste"/>
+ <menu_item_call label="Wklej jako link" name="Paste As Link"/>
+ <menu_item_call label="Usuń" name="Remove Link"/>
+ <menu_item_call label="Usuń" name="Delete"/>
+ <menu_item_call label="Skasuj folder systemu" name="Delete System Folder"/>
+ <menu_item_call label="Rozpocznij konferencję czatową" name="Conference Chat Folder"/>
+ <menu_item_call label="Odtwarzaj" name="Sound Play"/>
+ <menu_item_call label="O Miejscu" name="About Landmark"/>
+ <menu_item_call label="Używaj in-world" name="Animation Play"/>
+ <menu_item_call label="Odtwarzaj lokalnie" name="Animation Audition"/>
+ <menu_item_call label="Wyślij IM" name="Send Instant Message"/>
+ <menu_item_call label="Teleportuj..." name="Offer Teleport..."/>
+ <menu_item_call label="Rozpocznij konferencję czatową" name="Conference Chat"/>
+ <menu_item_call label="Aktywuj" name="Activate"/>
+ <menu_item_call label="Deaktywuj" name="Deactivate"/>
+ <menu_item_call label="Zapisz jako" name="Save As"/>
+ <menu_item_call label="Odłącz od siebie" name="Detach From Yourself"/>
+ <menu_item_call label="Załóż" name="Wearable And Object Wear"/>
+ <menu label="Dołącz do" name="Attach To"/>
+ <menu label="Dołącz do załączników HUD" name="Attach To HUD"/>
+ <menu_item_call label="Edytuj" name="Wearable Edit"/>
+ <menu_item_call label="Dodaj" name="Wearable Add"/>
+ <menu_item_call label="Zdejmij" name="Take Off"/>
+ <menu_item_call label="--brak opcji--" name="--no options--"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_inventory_add.xml b/indra/newview/skins/minimal/xui/pl/menu_inventory_add.xml
new file mode 100644
index 0000000000..4a56586aaf
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/menu_inventory_add.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_inventory_add">
+ <menu label="Załaduj" name="upload">
+ <menu_item_call label="obraz (L$[COST])..." name="Upload Image"/>
+ <menu_item_call label="dźwięk (L$[COST])..." name="Upload Sound"/>
+ <menu_item_call label="animację (L$[COST])..." name="Upload Animation"/>
+ <menu_item_call label="zbiór plików (L$[COST] za jeden plik)..." name="Bulk Upload"/>
+ <menu_item_call label="Ustaw domyślne pozwolenia ładowania" name="perm prefs"/>
+ </menu>
+ <menu_item_call label="Nowy folder" name="New Folder"/>
+ <menu_item_call label="Nowy skrypt" name="New Script"/>
+ <menu_item_call label="Nowa nota" name="New Note"/>
+ <menu_item_call label="Nowa gesturka" name="New Gesture"/>
+ <menu label="Nowe Ubranie" name="New Clothes">
+ <menu_item_call label="Nowa koszula" name="New Shirt"/>
+ <menu_item_call label="Nowe spodnie" name="New Pants"/>
+ <menu_item_call label="Nowe buty" name="New Shoes"/>
+ <menu_item_call label="Nowe skarpetki" name="New Socks"/>
+ <menu_item_call label="Nowa kurtka" name="New Jacket"/>
+ <menu_item_call label="Nowa spódnica" name="New Skirt"/>
+ <menu_item_call label="Nowe rękawiczki" name="New Gloves"/>
+ <menu_item_call label="Nowy podkoszulek" name="New Undershirt"/>
+ <menu_item_call label="Nowa bielizna" name="New Underpants"/>
+ <menu_item_call label="Nowa maska alpha" name="New Alpha"/>
+ <menu_item_call label="Nowy tatuaż" name="New Tattoo"/>
+ </menu>
+ <menu label="Nowa Część Ciała" name="New Body Parts">
+ <menu_item_call label="Nowy kształt" name="New Shape"/>
+ <menu_item_call label="Nowa skórka" name="New Skin"/>
+ <menu_item_call label="Nowe włosy" name="New Hair"/>
+ <menu_item_call label="Nowe oczy" name="New Eyes"/>
+ </menu>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_inventory_gear_default.xml b/indra/newview/skins/minimal/xui/pl/menu_inventory_gear_default.xml
new file mode 100644
index 0000000000..591c3a81d5
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/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="Nowe okno Szafy" name="new_window"/>
+ <menu_item_check label="Porządkuj według nazwy" name="sort_by_name"/>
+ <menu_item_check label="Porządkuj według daty" name="sort_by_recent"/>
+ <menu_item_check label="Sortuj foldery zawsze według nazwy" name="sort_folders_by_name"/>
+ <menu_item_check label="Posortuj foldery systemowe od góry" name="sort_system_folders_to_top"/>
+ <menu_item_call label="Pokaż filtry" name="show_filters"/>
+ <menu_item_call label="Zresetuj filtry" name="reset_filters"/>
+ <menu_item_call label="Zamknij wszystkie foldery" name="close_folders"/>
+ <menu_item_call label="Opróżnij Zagubione i odnalezione" name="empty_lostnfound"/>
+ <menu_item_call label="Zapisz teksturę jako" name="Save Texture As"/>
+ <menu_item_call label="Udostępnij" name="Share"/>
+ <menu_item_call label="Znajdź oryginał" name="Find Original"/>
+ <menu_item_call label="Znajdź wszystkie linki" name="Find All Links"/>
+ <menu_item_call label="Opróżnij Kosz" name="empty_trash"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_land.xml b/indra/newview/skins/minimal/xui/pl/menu_land.xml
new file mode 100644
index 0000000000..cbfecaee56
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/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="O Posiadłości" name="Place Information..."/>
+ <menu_item_call label="Usiądź tutaj" name="Sit Here"/>
+ <menu_item_call label="Kup posiadłość" name="Land Buy"/>
+ <menu_item_call label="Kup przepustkę" name="Land Buy Pass"/>
+ <menu_item_call label="Buduj" name="Create"/>
+ <menu_item_call label="Edytuj teren" name="Edit Terrain"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_landmark.xml b/indra/newview/skins/minimal/xui/pl/menu_landmark.xml
new file mode 100644
index 0000000000..aa5808390c
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/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="Kopiuj SLurl" name="copy"/>
+ <menu_item_call label="Usuń" name="delete"/>
+ <menu_item_call label="Utwórz" name="pick"/>
+ <menu_item_call label="Dodaj do paska Ulubionych" name="add_to_favbar"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_login.xml b/indra/newview/skins/minimal/xui/pl/menu_login.xml
new file mode 100644
index 0000000000..e50b694641
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/menu_login.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu_bar name="Login Menu">
+ <menu label="Ja" name="File">
+ <menu_item_call label="Ustawienia" name="Preferences..."/>
+ <menu_item_call label="Wyłącz [APP_NAME]" name="Quit"/>
+ </menu>
+ <menu label="Pomoc" name="Help">
+ <menu_item_call label="[SECOND_LIFE]: Pomoc" name="Second Life Help"/>
+ <menu_item_call label="O [APP_NAME]" name="About Second Life"/>
+ </menu>
+ <menu_item_check label="Pokaż ustawienia debugowania" name="Show Debug Menu"/>
+ <menu label="Debug" name="Debug">
+ <menu_item_call label="Ustawienia debugowania" name="Debug Settings"/>
+ <menu_item_call label="Ustawienia UI/kolor" name="UI/Color Settings"/>
+ <menu label="UI Testy" name="UI Tests"/>
+ <menu_item_call label="Ustaw rozmiar interfejsu..." name="Set Window Size..."/>
+ <menu_item_call label="Wyświetl TOS" name="TOS"/>
+ <menu_item_call label="Wyświetl wiadomość krytyczną" name="Critical"/>
+ <menu_item_call label="Test przeglądarki mediów" name="Web Browser Test"/>
+ <menu_item_call label="Test zawartości strony" name="Web Content Floater Test"/>
+ <menu_item_check label="Pokaż siatkę" name="Show Grid Picker"/>
+ <menu_item_call label="Pokaż konsolę Zawiadomień" name="Show Notifications Console"/>
+ </menu>
+</menu_bar>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_mini_map.xml b/indra/newview/skins/minimal/xui/pl/menu_mini_map.xml
new file mode 100644
index 0000000000..8f86965416
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/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 blisko" name="Zoom Close"/>
+ <menu_item_call label="Zoom średnio" name="Zoom Medium"/>
+ <menu_item_call label="Zoom daleko" name="Zoom Far"/>
+ <menu_item_call label="Zoom domyślny" name="Zoom Default"/>
+ <menu_item_check label="Obróć mapę" name="Rotate Map"/>
+ <menu_item_check label="Autocentrowanie" name="Auto Center"/>
+ <menu_item_call label="Zatrzymaj" name="Stop Tracking"/>
+ <menu_item_call label="Mapa Świata" name="World Map"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_navbar.xml b/indra/newview/skins/minimal/xui/pl/menu_navbar.xml
new file mode 100644
index 0000000000..1d434670ee
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/menu_navbar.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Navbar Menu">
+ <menu_item_check label="Pokaż współrzędne" name="Show Coordinates"/>
+ <menu_item_check label="Pokaż właściwości posiadłości" name="Show Parcel Properties"/>
+ <menu_item_call label="Landmark" name="Landmark"/>
+ <menu_item_call label="Wytnij" name="Cut"/>
+ <menu_item_call label="Kopiuj" name="Copy"/>
+ <menu_item_call label="Wklej" name="Paste"/>
+ <menu_item_call label="Usuń" name="Delete"/>
+ <menu_item_call label="Zaznacz wszystko" name="Select All"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_nearby_chat.xml b/indra/newview/skins/minimal/xui/pl/menu_nearby_chat.xml
new file mode 100644
index 0000000000..fe5bc6ba6f
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/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="Pokaż osoby w pobliżu..." name="nearby_people"/>
+ <menu_item_check label="Pokaż zablokowany tekst" name="muted_text"/>
+ <menu_item_check label="Wyświetlaj ikonki znajomych" name="show_buddy_icons"/>
+ <menu_item_check label="Wyświetlaj imiona" name="show_names"/>
+ <menu_item_check label="Wyświetlaj ikonki i imiona" name="show_icons_and_names"/>
+ <menu_item_call label="Rozmiar czcionki" name="font_size"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_notification_well_button.xml b/indra/newview/skins/minimal/xui/pl/menu_notification_well_button.xml
new file mode 100644
index 0000000000..bd3d42f9b1
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/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="Zamknij" name="Close All"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_object.xml b/indra/newview/skins/minimal/xui/pl/menu_object.xml
new file mode 100644
index 0000000000..3da6c5c890
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/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="Dotknij" name="Object Touch">
+ <menu_item_call.on_enable name="EnableTouch" parameter="Dotknij"/>
+ </menu_item_call>
+ <menu_item_call label="Edytuj" name="Edit..."/>
+ <menu_item_call label="Buduj" name="Build"/>
+ <menu_item_call label="Otwórz" name="Open"/>
+ <menu_item_call label="Usiądź tutaj" name="Object Sit"/>
+ <menu_item_call label="Wstań" name="Object Stand Up"/>
+ <menu_item_call label="Sprawdź" name="Object Inspect"/>
+ <menu_item_call label="Przybliż" name="Zoom In"/>
+ <context_menu label="Załóż na" name="Put On">
+ <menu_item_call label="Załóż" name="Wear"/>
+ <menu_item_call label="Dodaj" name="Add"/>
+ <context_menu label="Dołącz" name="Object Attach"/>
+ <context_menu label="Dołącz HUD" name="Object Attach HUD"/>
+ </context_menu>
+ <context_menu label="Zarządzaj" name="Remove">
+ <menu_item_call label="Raport" name="Report Abuse..."/>
+ <menu_item_call label="Zablokuj" name="Object Mute"/>
+ <menu_item_call label="Zwróć" name="Return..."/>
+ </context_menu>
+ <menu_item_call label="Weź" name="Pie Object Take"/>
+ <menu_item_call label="Weź kopię" name="Take Copy"/>
+ <menu_item_call label="Zapłać" name="Pay..."/>
+ <menu_item_call label="Kup" name="Buy..."/>
+ <menu_item_call label="Skasuj" name="Delete"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_object_icon.xml b/indra/newview/skins/minimal/xui/pl/menu_object_icon.xml
new file mode 100644
index 0000000000..b499bca2db
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/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="Sprawdź..." name="Object Profile"/>
+ <menu_item_call label="Zablokuj..." name="Block"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_outfit_gear.xml b/indra/newview/skins/minimal/xui/pl/menu_outfit_gear.xml
new file mode 100644
index 0000000000..1a70e76ec7
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/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="Załóż - Zastąp obecny strój" name="wear"/>
+ <menu_item_call label="Załóż - Dodaj do bieżącego stroju" name="wear_add"/>
+ <menu_item_call label="Zdejmij - Usuń z obecnego stroju" name="take_off"/>
+ <menu label="Nowe ubranie" name="New Clothes">
+ <menu_item_call label="Nowa koszula" name="New Shirt"/>
+ <menu_item_call label="Nowe spodnie" name="New Pants"/>
+ <menu_item_call label="Nowe buty" name="New Shoes"/>
+ <menu_item_call label="Nowe skarpetki" name="New Socks"/>
+ <menu_item_call label="Nowa kurtka" name="New Jacket"/>
+ <menu_item_call label="Nowa spódnica" name="New Skirt"/>
+ <menu_item_call label="Nowe rękawiczki" name="New Gloves"/>
+ <menu_item_call label="Nowa podkoszulka" name="New Undershirt"/>
+ <menu_item_call label="Nowa bielizna" name="New Underpants"/>
+ <menu_item_call label="Nowa maska alpha" name="New Alpha"/>
+ <menu_item_call label="Nowy tatuaż" name="New Tattoo"/>
+ </menu>
+ <menu label="Nowe części ciała" name="New Body Parts">
+ <menu_item_call label="Nowy kształt" name="New Shape"/>
+ <menu_item_call label="Nowa skórka" name="New Skin"/>
+ <menu_item_call label="Nowe włosy" name="New Hair"/>
+ <menu_item_call label="Nowe oczy" name="New Eyes"/>
+ </menu>
+ <menu_item_call label="Zmień nazwę stroju" name="rename"/>
+ <menu_item_call label="Usuń strój" name="delete_outfit"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_outfit_tab.xml b/indra/newview/skins/minimal/xui/pl/menu_outfit_tab.xml
new file mode 100644
index 0000000000..998e25f38e
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/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="Załóż - Zastąp obecny strój" name="wear_replace"/>
+ <menu_item_call label="Załóż - Dodaj do obecnego stroju" name="wear_add"/>
+ <menu_item_call label="Zdejmij - Usuń z obecnego stroju" name="take_off"/>
+ <menu_item_call label="Edytuj strój" name="edit"/>
+ <menu_item_call label="Zmień nazwę stroju" name="rename"/>
+ <menu_item_call label="Usuń strój" name="delete"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_participant_list.xml b/indra/newview/skins/minimal/xui/pl/menu_participant_list.xml
new file mode 100644
index 0000000000..9e59102788
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/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="Sortuj według imienia" name="SortByName"/>
+ <menu_item_check label="Sortuj według ostatniego mówcy" name="SortByRecentSpeakers"/>
+ <menu_item_call label="Zobacz profil" name="View Profile"/>
+ <menu_item_call label="Dodaj znajomość" name="Add Friend"/>
+ <menu_item_call label="IM" name="IM"/>
+ <menu_item_call label="Zadzwoń" name="Call"/>
+ <menu_item_call label="Udostępnij" name="Share"/>
+ <menu_item_call label="Zapłać" name="Pay"/>
+ <menu_item_check label="Przeglądaj ikonki" name="View Icons"/>
+ <menu_item_check label="Zablokuj głos" name="Block/Unblock"/>
+ <menu_item_check label="Zablokuj tekst" name="MuteText"/>
+ <context_menu label="Opcje Moderatora" name="Moderator Options">
+ <menu_item_check label="Czat/IM dozwolony" name="AllowTextChat"/>
+ <menu_item_call label="Wycisz tego uczestnika" name="ModerateVoiceMuteSelected"/>
+ <menu_item_call label="Odblokuj wyciszenie tego uczestnika" name="ModerateVoiceUnMuteSelected"/>
+ <menu_item_call label="Wycisz wszystkich" name="ModerateVoiceMute"/>
+ <menu_item_call label="Cofnij wyciszenie wszystkim" name="ModerateVoiceUnmute"/>
+ </context_menu>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_people_friends_view_sort.xml b/indra/newview/skins/minimal/xui/pl/menu_people_friends_view_sort.xml
new file mode 100644
index 0000000000..b62b85d30a
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/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="Porządkuj według nazwy" name="sort_name"/>
+ <menu_item_check label="Porządkuj według statusu" name="sort_status"/>
+ <menu_item_check label="Wyświetlaj ikonki" name="view_icons"/>
+ <menu_item_check label="Zobacz udzielone prawa" name="view_permissions"/>
+ <menu_item_call label="Pokaż zablokowanych Rezydentów &amp; obiekty" name="show_blocked_list"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_people_groups.xml b/indra/newview/skins/minimal/xui/pl/menu_people_groups.xml
new file mode 100644
index 0000000000..ace5ebf888
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/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="Zobacz info" name="View Info"/>
+ <menu_item_call label="Czat" name="Chat"/>
+ <menu_item_call label="Rozmowa" name="Call"/>
+ <menu_item_call label="Aktywuj" name="Activate"/>
+ <menu_item_call label="Opuść" name="Leave"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_people_groups_view_sort.xml b/indra/newview/skins/minimal/xui/pl/menu_people_groups_view_sort.xml
new file mode 100644
index 0000000000..c70ea2315f
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/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="Wyświetlaj ikonki grupy" name="Display Group Icons"/>
+ <menu_item_call label="Opuść zaznaczone grupy" name="Leave Selected Group"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_people_nearby.xml b/indra/newview/skins/minimal/xui/pl/menu_people_nearby.xml
new file mode 100644
index 0000000000..0111e0fd51
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/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="Zobacz profil" name="View Profile"/>
+ <menu_item_call label="Dodaj do znajomych" name="Add Friend"/>
+ <menu_item_call label="Usuń z listy znajomych" name="Remove Friend"/>
+ <menu_item_call label="IM" name="IM"/>
+ <menu_item_call label="Zadzwoń" name="Call"/>
+ <menu_item_call label="Mapa" name="Map"/>
+ <menu_item_call label="Udostępnij" name="Share"/>
+ <menu_item_call label="Zapłać" name="Pay"/>
+ <menu_item_check label="Zablokuj/Odblokuj" name="Block/Unblock"/>
+ <menu_item_call label="Teleportuj" name="teleport"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_people_nearby_multiselect.xml b/indra/newview/skins/minimal/xui/pl/menu_people_nearby_multiselect.xml
new file mode 100644
index 0000000000..dcfc48fb60
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/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="Dodaj znajomych" name="Add Friends"/>
+ <menu_item_call label="Usuń znajomych" name="Remove Friend"/>
+ <menu_item_call label="IM" name="IM"/>
+ <menu_item_call label="Zadzwoń" name="Call"/>
+ <menu_item_call label="Udostępnij" name="Share"/>
+ <menu_item_call label="Zapłać" name="Pay"/>
+ <menu_item_call label="Teleportuj" name="teleport"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_people_nearby_view_sort.xml b/indra/newview/skins/minimal/xui/pl/menu_people_nearby_view_sort.xml
new file mode 100644
index 0000000000..8ec3820f84
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/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="Porządkuj według ostatnich rozmówców" name="sort_by_recent_speakers"/>
+ <menu_item_check label="Porządkuj według nazwy" name="sort_name"/>
+ <menu_item_check label="Porządkuj według odległości" name="sort_distance"/>
+ <menu_item_check label="Wyświetlaj ikonki" name="view_icons"/>
+ <menu_item_call label="Pokaż zablokowanych Rezydentów &amp; obiekty" name="show_blocked_list"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_people_recent_view_sort.xml b/indra/newview/skins/minimal/xui/pl/menu_people_recent_view_sort.xml
new file mode 100644
index 0000000000..b474a556bd
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/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="Porządkuj według daty" name="sort_most"/>
+ <menu_item_check label="Porządkuj według nazwy" name="sort_name"/>
+ <menu_item_check label="Wyświetlaj ikonki" name="view_icons"/>
+ <menu_item_call label="Pokaż zablokowanych Rezydentów &amp; obiekty" name="show_blocked_list"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_picks.xml b/indra/newview/skins/minimal/xui/pl/menu_picks.xml
new file mode 100644
index 0000000000..6f6e4b7fa8
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/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="Edytuj" name="pick_edit"/>
+ <menu_item_call label="Teleportuj" name="pick_teleport"/>
+ <menu_item_call label="Mapa" name="pick_map"/>
+ <menu_item_call label="Usuń" name="pick_delete"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_picks_plus.xml b/indra/newview/skins/minimal/xui/pl/menu_picks_plus.xml
new file mode 100644
index 0000000000..e9c00f51a9
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/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="Stwórz" name="create_pick"/>
+ <menu_item_call label="Nowa reklama" name="create_classified"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_place.xml b/indra/newview/skins/minimal/xui/pl/menu_place.xml
new file mode 100644
index 0000000000..c3b72d6abb
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/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="Zapisz landmark" name="landmark"/>
+ <menu_item_call label="Utwórz" name="pick"/>
+ <menu_item_call label="Kup przepustkę" name="pass"/>
+ <menu_item_call label="Edytuj" name="edit"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_place_add_button.xml b/indra/newview/skins/minimal/xui/pl/menu_place_add_button.xml
new file mode 100644
index 0000000000..3d0c1c87fb
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/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="Dodaj folder" name="add_folder"/>
+ <menu_item_call label="Dodaj do landmarków" name="add_landmark"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_places_gear_folder.xml b/indra/newview/skins/minimal/xui/pl/menu_places_gear_folder.xml
new file mode 100644
index 0000000000..d1f283b7aa
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/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="Dodaj do landmarków" name="add_landmark"/>
+ <menu_item_call label="Dodaj folder" name="add_folder"/>
+ <menu_item_call label="Przywróć obiekt" name="restore_item"/>
+ <menu_item_call label="Wytnij" name="cut"/>
+ <menu_item_call label="Kopiuj" name="copy_folder"/>
+ <menu_item_call label="Wklej" name="paste"/>
+ <menu_item_call label="Zmień nazwę" name="rename"/>
+ <menu_item_call label="Usuń" name="delete"/>
+ <menu_item_call label="Rozwiń" name="expand"/>
+ <menu_item_call label="Schowaj" name="collapse"/>
+ <menu_item_call label="Rozwiń wszystkie foldery" name="expand_all"/>
+ <menu_item_call label="Schowaj wszystkie foldery" name="collapse_all"/>
+ <menu_item_check label="Sortuj według daty" name="sort_by_date"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_places_gear_landmark.xml b/indra/newview/skins/minimal/xui/pl/menu_places_gear_landmark.xml
new file mode 100644
index 0000000000..0139d3a987
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/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="Teleportuj" name="teleport"/>
+ <menu_item_call label="Więcej informacji" name="more_info"/>
+ <menu_item_call label="Pokaż na mapie" name="show_on_map"/>
+ <menu_item_call label="Dodaj do landmarków" name="add_landmark"/>
+ <menu_item_call label="Dodaj folder" name="add_folder"/>
+ <menu_item_call label="Przywróć obiekt" name="restore_item"/>
+ <menu_item_call label="Wytnij" name="cut"/>
+ <menu_item_call label="Kopiuj landmark" name="copy_landmark"/>
+ <menu_item_call label="Kopiuj SLurl" name="copy_slurl"/>
+ <menu_item_call label="Wklej" name="paste"/>
+ <menu_item_call label="Zmień nazwę" name="rename"/>
+ <menu_item_call label="Usuń" name="delete"/>
+ <menu_item_call label="Rozwiń wszystkie foldery" name="expand_all"/>
+ <menu_item_call label="Schowaj wszystkie foldery" name="collapse_all"/>
+ <menu_item_check label="Sortuj według daty" name="sort_by_date"/>
+ <menu_item_call label="Stwórz Ulubione" name="create_pick"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_profile_overflow.xml b/indra/newview/skins/minimal/xui/pl/menu_profile_overflow.xml
new file mode 100644
index 0000000000..ef836c8ecf
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/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="Mapa" name="show_on_map"/>
+ <menu_item_call label="Zapłać" name="pay"/>
+ <menu_item_call label="Udostępnij" name="share"/>
+ <menu_item_call label="Zablokuj" name="block"/>
+ <menu_item_call label="Odblokuj" name="unblock"/>
+ <menu_item_call label="Wyrzuć" name="kick"/>
+ <menu_item_call label="Unieruchom" name="freeze"/>
+ <menu_item_call label="Uruchom" name="unfreeze"/>
+ <menu_item_call label="CSR" name="csr"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_save_outfit.xml b/indra/newview/skins/minimal/xui/pl/menu_save_outfit.xml
new file mode 100644
index 0000000000..4bc65eca38
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/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="Zapisz" name="save_outfit"/>
+ <menu_item_call label="Zapisz jako" name="save_as_new_outfit"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_script_chiclet.xml b/indra/newview/skins/minimal/xui/pl/menu_script_chiclet.xml
new file mode 100644
index 0000000000..256500a402
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/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="Zamknij" name="Close"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_slurl.xml b/indra/newview/skins/minimal/xui/pl/menu_slurl.xml
new file mode 100644
index 0000000000..862f538aa7
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/menu_slurl.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Popup">
+ <menu_item_call label="O miejscu" name="about_url"/>
+ <menu_item_call label="Teleportuj do miejsca" name="teleport_to_url"/>
+ <menu_item_call label="Mapa" name="show_on_map"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_teleport_history_gear.xml b/indra/newview/skins/minimal/xui/pl/menu_teleport_history_gear.xml
new file mode 100644
index 0000000000..0e58592d46
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/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="Rozwiń wszystkie foldery" name="Expand all folders"/>
+ <menu_item_call label="Schowaj wszystkie foldery" name="Collapse all folders"/>
+ <menu_item_call label="Wyczyść historię teleportacji" name="Clear Teleport History"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_teleport_history_item.xml b/indra/newview/skins/minimal/xui/pl/menu_teleport_history_item.xml
new file mode 100644
index 0000000000..cd36c116b0
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/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="Teleportuj" name="Teleport"/>
+ <menu_item_call label="Więcej szczegółów" name="More Information"/>
+ <menu_item_call label="Kopiuj do schowka" name="CopyToClipboard"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_teleport_history_tab.xml b/indra/newview/skins/minimal/xui/pl/menu_teleport_history_tab.xml
new file mode 100644
index 0000000000..b12df08d6a
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/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="Otwórz" name="TabOpen"/>
+ <menu_item_call label="Zamknij" name="TabClose"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_text_editor.xml b/indra/newview/skins/minimal/xui/pl/menu_text_editor.xml
new file mode 100644
index 0000000000..812f87bc1a
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/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="Wytnij" name="Cut"/>
+ <menu_item_call label="Kopiuj" name="Copy"/>
+ <menu_item_call label="Wklej" name="Paste"/>
+ <menu_item_call label="Usuń" name="Delete"/>
+ <menu_item_call label="Zaznacz wszystko" name="Select All"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_topinfobar.xml b/indra/newview/skins/minimal/xui/pl/menu_topinfobar.xml
new file mode 100644
index 0000000000..53536c8f1c
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/menu_topinfobar.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_topinfobar">
+ <menu_item_check label="Pokaż współprzędne" name="Show Coordinates"/>
+ <menu_item_check label="Pokaż O Posiadłości" name="Show Parcel Properties"/>
+ <menu_item_call label="Landmark" name="Landmark"/>
+ <menu_item_call label="Kopiuj" name="Copy"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_url_agent.xml b/indra/newview/skins/minimal/xui/pl/menu_url_agent.xml
new file mode 100644
index 0000000000..db729be725
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/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="Pokaż profil Rezydenta" name="show_agent"/>
+ <menu_item_call label="Kopiuj nazwę do schowka" name="url_copy_label"/>
+ <menu_item_call label="Kopiuj SLurl do schowka" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_url_group.xml b/indra/newview/skins/minimal/xui/pl/menu_url_group.xml
new file mode 100644
index 0000000000..f340b3296a
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/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="Pokaż szczegóły o grupie" name="show_group"/>
+ <menu_item_call label="Kopiuj grupę do schowka" name="url_copy_label"/>
+ <menu_item_call label="Kopiuj SLurl do schowka" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_url_http.xml b/indra/newview/skins/minimal/xui/pl/menu_url_http.xml
new file mode 100644
index 0000000000..e73f7b6745
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/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="Otwórz przeglądarkę internetową" name="url_open"/>
+ <menu_item_call label="Otwórz w wewnętrzenej przeglądarce" name="url_open_internal"/>
+ <menu_item_call label="Otwórz w zewnętrznej przeglądarce" name="url_open_external"/>
+ <menu_item_call label="Kopiuj URL do schowka" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_url_inventory.xml b/indra/newview/skins/minimal/xui/pl/menu_url_inventory.xml
new file mode 100644
index 0000000000..e36fa0dd2b
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/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="Pokaż obiekt w szafie" name="show_item"/>
+ <menu_item_call label="Kopiuj nazwę do schowka" name="url_copy_label"/>
+ <menu_item_call label="Kopiuj SLurl do schowka" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_url_map.xml b/indra/newview/skins/minimal/xui/pl/menu_url_map.xml
new file mode 100644
index 0000000000..179ab1f676
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/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="Pokaż na mapie" name="show_on_map"/>
+ <menu_item_call label="Teleportuj do miejsca" name="teleport_to_location"/>
+ <menu_item_call label="Kopiuj SLurl do schowka" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_url_objectim.xml b/indra/newview/skins/minimal/xui/pl/menu_url_objectim.xml
new file mode 100644
index 0000000000..7576208a9e
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/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="Pokaż szczegóły o obiekcie" name="show_object"/>
+ <menu_item_call label="Pokaż na mapie" name="show_on_map"/>
+ <menu_item_call label="Teleportuj to miejsca obiektu" name="teleport_to_object"/>
+ <menu_item_call label="Kopiuj nazwę obiektu do schowka" name="url_copy_label"/>
+ <menu_item_call label="Kopiuj SLurl do schowka" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_url_parcel.xml b/indra/newview/skins/minimal/xui/pl/menu_url_parcel.xml
new file mode 100644
index 0000000000..1b8dd62137
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/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="Pokaż szczegóły o miejscu" name="show_parcel"/>
+ <menu_item_call label="Pokaż na mapie" name="show_on_map"/>
+ <menu_item_call label="Kopiuj SLurl do schowka" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_url_slapp.xml b/indra/newview/skins/minimal/xui/pl/menu_url_slapp.xml
new file mode 100644
index 0000000000..eb83245c48
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/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="Uruchom tę komendę" name="run_slapp"/>
+ <menu_item_call label="Kopiuj SLurl do schowka" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_url_slurl.xml b/indra/newview/skins/minimal/xui/pl/menu_url_slurl.xml
new file mode 100644
index 0000000000..4d4a5b4c4d
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/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="Pokaż szczegóły o miejscu" name="show_place"/>
+ <menu_item_call label="Pokaż na mapie" name="show_on_map"/>
+ <menu_item_call label="Teleportuj do miejsca" name="teleport_to_location"/>
+ <menu_item_call label="Kopiuj SLurl do schowka" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_url_teleport.xml b/indra/newview/skins/minimal/xui/pl/menu_url_teleport.xml
new file mode 100644
index 0000000000..e225546930
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/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="Teleportuj do tego miejsca" name="teleport"/>
+ <menu_item_call label="Pokaż na mapie" name="show_on_map"/>
+ <menu_item_call label="Kopiuj SLurl do schowka" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_viewer.xml b/indra/newview/skins/minimal/xui/pl/menu_viewer.xml
new file mode 100644
index 0000000000..0196dc8613
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/menu_viewer.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu_bar name="Main Menu">
+ <menu label="Pomoc" name="Help">
+ <menu_item_call label="[SECOND_LIFE] Portal Pomocy" name="Second Life Help"/>
+ </menu>
+ <menu label="Zaawansowane" name="Advanced">
+ <menu label="Skróty" name="Shortcuts">
+ <menu_item_check label="Zacznij latać" name="Fly"/>
+ <menu_item_call label="Zamknij okno" name="Close Window"/>
+ <menu_item_call label="Zamknij wszystkie okna" name="Close All Windows"/>
+ <menu_item_call label="Reset widoku" name="Reset View"/>
+ </menu>
+ </menu>
+</menu_bar>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_wearable_list_item.xml b/indra/newview/skins/minimal/xui/pl/menu_wearable_list_item.xml
new file mode 100644
index 0000000000..bf85246be8
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/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="Zastąp" name="wear_replace"/>
+ <menu_item_call label="Załóż" name="wear_wear"/>
+ <menu_item_call label="Dodaj" name="wear_add"/>
+ <menu_item_call label="Zdejmij/Odłącz" name="take_off_or_detach"/>
+ <menu_item_call label="Odłącz" name="detach"/>
+ <context_menu label="Dołącz do" name="wearable_attach_to"/>
+ <context_menu label="Dołącz do załączników HUD" name="wearable_attach_to_hud"/>
+ <menu_item_call label="Zdejmij" name="take_off"/>
+ <menu_item_call label="Edytuj" name="edit"/>
+ <menu_item_call label="Profil obiektu" name="object_profile"/>
+ <menu_item_call label="Pokaż oryginalny" name="show_original"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_wearing_gear.xml b/indra/newview/skins/minimal/xui/pl/menu_wearing_gear.xml
new file mode 100644
index 0000000000..47cafdbd99
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/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="Edytuj strój" name="edit"/>
+ <menu_item_call label="Zdejmij" name="takeoff"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_wearing_tab.xml b/indra/newview/skins/minimal/xui/pl/menu_wearing_tab.xml
new file mode 100644
index 0000000000..7531437043
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/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="Zdejmij" name="take_off"/>
+ <menu_item_call label="Odłącz" name="detach"/>
+ <menu_item_call label="Edytuj strój" name="edit"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/notifications.xml b/indra/newview/skins/minimal/xui/pl/notifications.xml
new file mode 100644
index 0000000000..6e62478ed0
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/notifications.xml
@@ -0,0 +1,2907 @@
+<?xml version="1.0" encoding="utf-8"?>
+<notifications>
+ <global name="skipnexttime">
+ Nie pokazuj tej opcji następnym razem
+ </global>
+ <global name="alwayschoose">
+ Pozwalaj na wybór tej opcji
+ </global>
+ <global name="implicitclosebutton">
+ Zamknij
+ </global>
+ <template name="okbutton">
+ <form>
+ <button name="OK_okbutton" text="$yestext"/>
+ </form>
+ </template>
+ <template name="okignore">
+ <form>
+ <button name="OK_okignore" text="$yestext"/>
+ </form>
+ </template>
+ <template name="okcancelbuttons">
+ <form>
+ <button name="OK_okcancelbuttons" text="$yestext"/>
+ <button name="Cancel_okcancelbuttons" text="$notext"/>
+ </form>
+ </template>
+ <template name="okcancelignore">
+ <form>
+ <button name="OK_okcancelignore" text="$yestext"/>
+ <button name="Cancel_okcancelignore" text="$canceltext"/>
+ </form>
+ </template>
+ <template name="okhelpbuttons">
+ <form>
+ <button name="OK_okhelpbuttons" text="$yestext"/>
+ <button name="Help" text="$helptext"/>
+ </form>
+ </template>
+ <template name="yesnocancelbuttons">
+ <form>
+ <button name="Yes" text="$yestext"/>
+ <button name="No" text="$notext"/>
+ <button name="Cancel_yesnocancelbuttons" text="$canceltext"/>
+ </form>
+ </template>
+ <notification functor="GenericAcknowledge" label="Nieznany rodzaj komunikatu" name="MissingAlert">
+ Twoja wersja klienta [APP_NAME] nie może wyświetlić odebranej wiadomości. Upewnij się, że posiadasz najnowszą wersję klienta.
+
+Szczegóły błędu: Błąd o nazwie &apos;[_NAME]&apos; nie został odnaleziony w pliku notifications.xml.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="FloaterNotFound">
+ Błąd: nie można znaleźć następujących elementów:
+
+[CONTROLS]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="TutorialNotFound">
+ Brak samouczka na ten temat
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="GenericAlert">
+ [MESSAGE]
+ </notification>
+ <notification name="GenericAlertYesCancel">
+ [MESSAGE]
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="Tak"/>
+ </notification>
+ <notification name="BadInstallation">
+ Podczas aktualizacji [APP_NAME] wystąpił błąd. Proszę odwiedzić stronę [http://get.secondlife.com pobierz najnowsza wersję] aby ściągnąć ostatnią wersję klienta.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="LoginFailedNoNetwork">
+ Nie można połączyć z [SECOND_LIFE_GRID].
+ &apos;[DIAGNOSTIC]&apos;
+Upewnij się, że Twoje połączenie z internetem działa.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="MessageTemplateNotFound">
+ Wzór komunikatu dla [PATH] nie został odnaleziony.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="WearableSave">
+ Zapisać zmiany dotyczące ubrania/części ciała?
+ <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Nie Zapisuj" yestext="Zapisz"/>
+ </notification>
+ <notification name="CompileQueueSaveText">
+ W trakcie ładwania tekstu dla skryptu pojawił się problem z następującego powodu: [REASON]. Spróbuj ponownie za kilka minut.
+ </notification>
+ <notification name="CompileQueueSaveBytecode">
+ W trakcie ładowania skompilowanego skryptu pojawił się problem z następującego powodu: [REASON]. Spróbuj ponownie za kilka minut.
+ </notification>
+ <notification name="WriteAnimationFail">
+ Problem w zapisywaniu danych animacji. Spróbuj ponownie za kilka minut.
+ </notification>
+ <notification name="UploadAuctionSnapshotFail">
+ W trakcie ładwania obrazu aukcji pojawił się problem z następującego powodu: [REASON].
+ </notification>
+ <notification name="UnableToViewContentsMoreThanOne">
+ Nie można przeglądać zawartości więcej niż jednego obiektu naraz.
+Wybierz pojedynczy obiekt i spróbuj jeszcze raz.
+ </notification>
+ <notification name="SaveClothingBodyChanges">
+ Zapisać wszystkie zmiany dotyczące ubrania/cześci ciała?
+ <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Nie zapisuj" yestext="Zapisz"/>
+ </notification>
+ <notification name="FriendsAndGroupsOnly">
+ Osoby spoza listy znajomych, których rozmowy głosowe i IM są ignorowane, nie wiedzą o tym.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="FavoritesOnLogin">
+ Pamiętaj: kiedy wyłączysz tą opcję, każdy kto używa tego komputera, może zobaczyć Twoją listę ulubionych miejsc.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="GrantModifyRights">
+ Udzielenie praw modyfikacji innemu Rezydentowi umożliwia modyfikację, usuwanie lub wzięcie JAKIEGOKOLWIEK z Twoich obiektów. Używaj tej opcji z rozwagą!
+Czy chcesz udzielić prawa do modyfikacji [NAME]?
+ <usetemplate name="okcancelbuttons" notext="Nie" yestext="Tak"/>
+ </notification>
+ <notification name="GrantModifyRightsMultiple">
+ Udzielenie praw modyfikacji innym Rezydentom umożliwia im modyfikację, usuwanie lub wzięcie JAKIEGOKOLWIEK z Twoich obiektów. Używaj tej opcji z rozwagą!
+Czy chcesz dać prawa modyfikacji wybranym osobom?
+ <usetemplate name="okcancelbuttons" notext="Nie" yestext="Tak"/>
+ </notification>
+ <notification name="RevokeModifyRights">
+ Czy chcesz odebrać prawa do modyfikacji [NAME]?
+ <usetemplate name="okcancelbuttons" notext="Nie" yestext="Tak"/>
+ </notification>
+ <notification name="RevokeModifyRightsMultiple">
+ Czy chcesz odebrać prawa modyfikacji wybranym Rezydentom?
+ <usetemplate name="okcancelbuttons" notext="Nie" yestext="Tak"/>
+ </notification>
+ <notification name="UnableToCreateGroup">
+ Założenie grupy nie jest możliwe.
+[MESSAGE]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="PanelGroupApply">
+ [NEEDS_APPLY_MESSAGE]
+[WANT_APPLY_MESSAGE]
+ <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Ignoruj zmiany" yestext="Zastosuj zmiany"/>
+ </notification>
+ <notification name="MustSpecifyGroupNoticeSubject">
+ Aby wysłać ogłoszenie do grupy musisz nadać mu tytuł.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="AddGroupOwnerWarning">
+ Dodajesz członków do funkcji [ROLE_NAME].
+Ta funkcja nie może być odebrana.
+Członkowie muszą sami zrezygnować z pełnienia tej funkcji.
+Chcesz kontynuować?
+ <usetemplate ignoretext="Przed dodaniem nowego właściciela do grupy, proszę potwierdzić swoją decyzję." name="okcancelignore" notext="Nie" yestext="Tak"/>
+ </notification>
+ <notification name="AssignDangerousActionWarning">
+ Dodajesz przywilej [ACTION_NAME] do fukcji [ROLE_NAME].
+
+*UWAGA*
+Członek w funkcji z tym przywilejem może przypisać siebie i innych członków nie będących właścicielami do funkcji dających więcej przywilejów niż posiadane obecnie potencjalnie dające możliwości zbliżone do możliwości właściciela.
+Udzielaj tego przywileju z rozwagą.&quot;
+
+Dodać ten przywilej do funkcji [ROLE_NAME]?
+ <usetemplate name="okcancelbuttons" notext="Nie" yestext="Tak"/>
+ </notification>
+ <notification name="AssignDangerousAbilityWarning">
+ Dodajesz przywilej [ACTION_NAME] do fukcji [ROLE_NAME]
+
+*UWAGA*
+Członek w funkcji z tym przywilejem może przypisać sobie i innychm członkom nie będącym właścicielami wszystkie przywileje potencjalnie dające możliwości zbliżone do możliwości właściciela.
+Udzielaj tego przywileju z rozwagą.
+
+Dodać ten przywilej do funkcji [ROLE_NAME]?
+ <usetemplate name="okcancelbuttons" notext="Nie" yestext="Tak"/>
+ </notification>
+ <notification name="AttachmentDrop">
+ Wybrałeś opcję opuszczenia swojego załącznika.
+ Czy chcesz kontynuować?
+ <usetemplate ignoretext="Potwierdź przed zdjęciem załącznika." name="okcancelignore" notext="Nie" yestext="Tak"/>
+ </notification>
+ <notification name="JoinGroupCanAfford">
+ Dołączenie do tej grupy kosztuje [COST]L$.
+Chcesz kontynuować?
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="Dołącz"/>
+ </notification>
+ <notification name="JoinGroupNoCost">
+ Dołączasz do grupy [NAME].
+Czy chcesz kontynuować?
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="Akceptuj"/>
+ </notification>
+ <notification name="JoinGroupCannotAfford">
+ Członkostwo w tej grupie kosztuje [COST]L$
+Masz za mało L$ żeby zostać członkiem.
+ </notification>
+ <notification name="CreateGroupCost">
+ Stworzenie tej grupy kosztuje 100L$.
+W grupie powinien być więcej niż jeden członek, albo zostanie na zawsze skasowana.
+Zaproś proszę członków w ciągu 48 godzin.
+ <usetemplate canceltext="Anuluj" name="okcancelbuttons" notext="Anuluj" yestext="Stwórz grupę za 100L$"/>
+ </notification>
+ <notification name="LandBuyPass">
+ Za [COST]L$ możesz odwiedzić tą posiadłość (&apos;[PARCEL_NAME]&apos;) na [TIME] godzin. Chcesz kupić przepustkę?
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification name="SalePriceRestriction">
+ Cena sprzedaży musi być wyższa niż 0L$ jeżeli sprzedajesz komukolwiek.
+Musisz wybrać kupca jeżeli chcesz sprzedać za 0L$.
+ </notification>
+ <notification name="ConfirmLandSaleChange">
+ Posiadłość o powierzchni [LAND_SIZE] m zostaje wystawiona na sprzedaż.
+Cena wynosi [SALE_PRICE]L$ i sprzedaż będzie autoryzowana dla [NAME].
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmLandSaleToAnyoneChange">
+ UWAGA: Wybierając opcję &quot;Sprzedaj Każdemu&quot; udostępniasz swoją posiadłość do sprzedaży dla jakiegokolwiek Rezydenta [SECOND_LIFE] , nawet osób nieobecnych w tym regionie.
+
+Posiadłość o powierzchni [LAND_SIZE] m² zostaje wystawiona na sprzedaż.
+Cena wynosi [SALE_PRICE]L$ i sprzedaż będzie autoryzowana dla [NAME].
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification name="ReturnObjectsDeededToGroup">
+ Czy na pewno chcesz zwrócić wszystkie obiekty udostępnione grupie [NAME] na tej posiadłości do szafy ich poprzednich właścicieli?
+
+*UWAGA* Wybrana opcja spowoduje usunięcie wszystkich obiektów
+udostępnionych grupie, które nie mają praw transferu!
+
+Obiekty: [N]
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification name="ReturnObjectsOwnedByUser">
+ Czy na pewno chcesz zwrócić wszystkie obiekty należące do Rezydenta [NAME] znajdujące się na tej posiadłości do szafy właściciela?
+
+Obiekty: [N]
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification name="ReturnObjectsOwnedBySelf">
+ Czy na pewno chcesz zwrócić wszystkie Twoje obiekty znajdujące się na tej posiadłości do swojej szafy?
+
+Obiekty: [N]
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification name="ReturnObjectsNotOwnedBySelf">
+ Czy na pewno chcesz zwrócić wszystkie obiekty, których nie jesteś właścicielem znajdujące się na tej posiadłości do szaf właścicieli? Wszystkie obiekty udostępnione grupie z prawem transferu, zostaną zwrócone poprzednim właścicielom.
+
+*UWAGA* Wybrana opcja spowoduje usunięcie wszystkich obiektów udostępnionych grupie, które nie mają praw transferu!
+
+Obiekty: [N]
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification name="ReturnObjectsNotOwnedByUser">
+ Czy na pewno chcesz zwrócić wszystkie obiekty, które nie należą do [NAME] znajdujące się na tej posiadłości do szaf właścicieli? Wszystkie obiekty udostępnione grupie z prawem transferu, zostaną zwrócone poprzednim właścicielom.
+
+*UWAGA* Wybrana opcja spowoduje usunięcie wszystkich obiektów udostępnionych grupie, które nie mają praw transferu!
+
+Obiekty: [N]
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification name="ReturnAllTopObjects">
+ Czy na pewno chcesz zwrócić wszystkie wymienione obiekty znajdujące się na tej posiadłości do szaf ich właścicieli?
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification name="DisableAllTopObjects">
+ Czy na pewno chcesz deaktywować wszystkie obiekty w tym Regionie?
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification name="ReturnObjectsNotOwnedByGroup">
+ Zwrócić obiekty z tej posiadłości, które nie są udosępnione grupie [NAME] do ich właścicieli?
+
+Obiekty: [N]
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification name="UnableToDisableOutsideScripts">
+ Nie można deaktywować skryptów.
+Ten region pozwala na uszkodzenia.
+Skrypty muszą pozostać aktywne dla prawidłowego działania broni.
+ </notification>
+ <notification name="MultipleFacesSelected">
+ Obecnie zaznaczono wiele powierzchni.
+Jeśli działanie będzie kontynuowane, oddzielne media będą ustawione na wielu powierzchniach obiektu.
+W celu umieszczenia mediów tylko na jednej powierzchni skorzystaj z Wybierz powierzchnię i kliknij na wybranej powierzchni obiektu oraz kliknij Dodaj.
+ <usetemplate ignoretext="Media zostaną ustawione na wielu zaznaczonych powierzchniach" name="okcancelignore" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification name="MustBeInParcel">
+ Musisz znajdować się wewnątrz posiadłości żeby wybrać punkt lądowania.
+ </notification>
+ <notification name="PromptRecipientEmail">
+ Proszę wpisać adres emailowy odbiorcy.
+ </notification>
+ <notification name="PromptSelfEmail">
+ Proszę wpisać swój adres emailowy.
+ </notification>
+ <notification name="PromptMissingSubjMsg">
+ Wysłać widokówkę z domyślnym tematem i wiadomością?
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification name="ErrorProcessingSnapshot">
+ Błąd w trakcie przetwarzania danych zdjęcia.
+ </notification>
+ <notification name="ErrorEncodingSnapshot">
+ Błąd w kodowaniu zdjęcia.
+ </notification>
+ <notification name="ErrorUploadingPostcard">
+ W trakcie ładowania zdjęcia pojawił się problem z następującego powodu: [REASON]
+ </notification>
+ <notification name="ErrorUploadingReportScreenshot">
+ W trakcie ładowania zdjęcia ekranu do raportu pojawił się problem z następującego powodu: [REASON]
+ </notification>
+ <notification name="MustAgreeToLogIn">
+ Musisz zaakceptować Warunki Umowy (Terms of Service) by kontynuować logowanie się do [SECOND_LIFE].
+ </notification>
+ <notification name="CouldNotPutOnOutfit">
+ Założenie stroju nie powiodło się.
+Folder stroju nie zawiera żadnego ubrania, części ciała ani załączników.
+ </notification>
+ <notification name="CannotWearTrash">
+ Nie możesz założyć ubrania, które znajduje się w koszu.
+ </notification>
+ <notification name="MaxAttachmentsOnOutfit">
+ Nie można dołączyć obiektu.
+Limit [MAX_ATTACHMENTS] załączników został przekroczony. Proszę najpierw odłączyć inny obiekt.
+ </notification>
+ <notification name="CannotWearInfoNotComplete">
+ Nie możesz założyć tego artkułu ponieważ nie załadował się poprawnie. Spróbuj ponownie za kilka minut.
+ </notification>
+ <notification name="MustHaveAccountToLogIn">
+ Oops! Brakuje czegoś.
+Należy wprowadzić nazwę użytkownika.
+
+Potrzebujesz konta aby się zalogować do [SECOND_LIFE]. Czy chcesz utworzyć je teraz?
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification name="InvalidCredentialFormat">
+ Należy wprowadzić nazwę użytkownika lub imię oraz nazwisko Twojego awatara w pole nazwy użytkownika a następnie ponownie się zalogować.
+ </notification>
+ <notification name="DeleteClassified">
+ Usunąć reklamę &apos;[NAME]&apos;?
+Pamiętaj! Nie ma rekompensaty za poniesione koszta.
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification name="DeleteMedia">
+ Wybrano usunięcie mediów związanych z tą powierzchnią.
+Czy na pewno chcesz kontynuować?
+ <usetemplate ignoretext="Potwierdź przed usunięciem mediów z obiektu" name="okcancelignore" notext="Nie" yestext="Tak"/>
+ </notification>
+ <notification name="ClassifiedSave">
+ Zapisać zmiany w reklamie [NAME]?
+ <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Nie Zapisuj" yestext="Zapisz"/>
+ </notification>
+ <notification name="ClassifiedInsufficientFunds">
+ Nie posiadasz wystarczających środków aby dodać reklamę.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="DeleteAvatarPick">
+ Usuń zdjęcie &lt;nolink&gt;[PICK]&lt;/nolink&gt;?
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification name="DeleteOutfits">
+ Skasować wybrane stroje?
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification name="PromptGoToEventsPage">
+ Odwiedzić internetową stronę Imprez [SECOND_LIFE]?
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification name="SelectProposalToView">
+ Wybierz propozycję, którą chcesz zobaczyć.
+ </notification>
+ <notification name="SelectHistoryItemToView">
+ Wybierz obiekt z historii, który chcesz zobaczyć.
+ </notification>
+ <notification name="CacheWillClear">
+ Bufor danych zostanie wyczyszczony po restarcie aplikacji [APP_NAME].
+ </notification>
+ <notification name="CacheWillBeMoved">
+ Bufor danych zostanie przeniesiony po restarcie aplikacji [APP_NAME].
+Pamiętaj: Opcja ta wyczyszcza bufor danych.
+ </notification>
+ <notification name="ChangeConnectionPort">
+ Ustawienia portu zostają zaktualizowane po restarcie aplikacji [APP_NAME].
+ </notification>
+ <notification name="ChangeSkin">
+ Nowa skórka zostanie wczytana po restarcie aplikacji [APP_NAME].
+ </notification>
+ <notification name="ChangeLanguage">
+ Zmiana języka zadziała po restarcie [APP_NAME].
+ </notification>
+ <notification name="GoToAuctionPage">
+ Odwiedzić stronę internetową [SECOND_LIFE] żeby zobaczyć szczgóły aukcji lub zrobić ofertę?
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification name="SaveChanges">
+ Zapisać zmiany?
+ <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Nie zapisuj" yestext="Zapisz"/>
+ </notification>
+ <notification name="GestureSaveFailedTooManySteps">
+ Nie można zapisać gesturki.
+Ta gesturka ma zbyt wiele etapów.
+Usuń kilka etapów i zapisz jeszcze raz.
+ </notification>
+ <notification name="GestureSaveFailedTryAgain">
+ Zapis gesturki nie powiódł się. Spróbuj jeszcze raz za kilka minut.
+ </notification>
+ <notification name="GestureSaveFailedObjectNotFound">
+ Nie można zapisać gesturki ponieważ obiekt lub szafa powiązanego obiektu nie został znaleziony.
+Obiekt może znajdować się zbyt daleko albo został usunięty.
+ </notification>
+ <notification name="GestureSaveFailedReason">
+ Nie można zapisać gesturki z następującego powodu: [REASON]. Spróbuj zapisać jeszcze raz później.
+ </notification>
+ <notification name="SaveNotecardFailObjectNotFound">
+ Nie można zapisać notki ponieważ obiekt lub szafa powiązanego obiektu nie został znaleziony.
+Obiekt może znajdować się zbyt daleko albo został usunięty.
+ </notification>
+ <notification name="SaveNotecardFailReason">
+ Nie można zapisać notki z następującego powodu: [REASON]. Spróbuj zapisać jeszcze raz później.
+ </notification>
+ <notification name="ScriptCannotUndo">
+ Nie można cofnąć wszystkich zmian w Twojej wersji skryptu.
+Czy chcesz załadować ostatnią wersję zapisaną na serwerze?
+(*UWAGA* Ta operacja jest nieodwracalna.)
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification name="SaveScriptFailReason">
+ Nie można zapisać skryptu z następującego powodu: [REASON]. Spróbuj zapisać jeszcze raz później.
+ </notification>
+ <notification name="SaveScriptFailObjectNotFound">
+ Nie można zapisać skryptu ponieważ obiekt w którym się zawiera nie został znaleziony.
+Obiekt może znajdować się zbyt daleko albo został usunięty.
+ </notification>
+ <notification name="SaveBytecodeFailReason">
+ Nie można zapisać skompilowanego skryptu z następującego powodu: [REASON]. Spróbuj zapisać jeszcze raz póżniej.
+ </notification>
+ <notification name="StartRegionEmpty">
+ Oops, Twoje miejsce startu nie zostało określone.
+Wpisz proszę nazwę regionu w lokalizację startu w polu Lokalizacja Startu lub wybierz Moja ostatnia lokalizacja albo Miejsce Startu.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="CouldNotStartStopScript">
+ Nie można uruchomić lub zatrzymać skryptu ponieważ obiekt w którym się zawiera nie został znaleziony.
+Obiekt może znajdować się zbyt daleko albo został usunięty.
+ </notification>
+ <notification name="CannotDownloadFile">
+ Nie można załadować pliku
+ </notification>
+ <notification name="CannotWriteFile">
+ Nie można zapisać pliku [[FILE]]
+ </notification>
+ <notification name="UnsupportedHardware">
+ Niestety Twój komputer nie spełnia minimalnych wymogów sprzętowych dla poprawnego działania [APP_NAME]. Możesz odczuwać bardzo niską wydajność operacyjną. Niestety portal pomocy, [SUPPORT_SITE] nie posiada informacji na temat poprawnej konfiguracji technicznej Twojego systemu.
+
+Po więcej info, odwiedź stronę [_URL] .
+ <url name="url" option="0">
+ http://www.secondlife.com/corporate/sysreqs.php
+ </url>
+ <usetemplate ignoretext="Dysk twardy mojego komputera nie jest wspomagany" name="okcancelignore" notext="Nie" yestext="Tak"/>
+ </notification>
+ <notification name="UnknownGPU">
+ Twój system jest wyposażony w kartę graficzną, która nie jest rozpoznana przez [APP_NAME].
+Zdarza się to często w przypadku nowego sprzętu, który nie był testowany z [APP_NAME]. Prawdopodobnie wystarczy dostosowanie ustawień grafiki aby działanie było poprawne.
+(Ja &gt; Właściwości &gt; Grafika).
+ <form name="form">
+ <ignore name="ignore" text="Karta graficzna nie została zidentyfikowana."/>
+ </form>
+ </notification>
+ <notification name="DisplaySettingsNoShaders">
+ [APP_NAME] zawiesił się podczas inicjalizacji sterowników graficznych.
+Jakość grafiki została zmniejszona - może to pomóc.
+Pewne funkcje graficzne zostały wyłączone. Zalecamy aktualizcje sterowników graficznych.
+Możesz podnieść jakość grafiki pod Ustawienia &gt; Grafika.
+ </notification>
+ <notification name="RegionNoTerraforming">
+ Region [REGION] nie pozwala na formowanie powierzchni ziemi.
+ </notification>
+ <notification name="CannotCopyWarning">
+ Nie masz pozwolenia na kopiowanie następujących obiektów:
+[ITEMS]
+i stracisz je w momencie przekazania. Czy na pewno chcesz oddać te obiekty?
+ <usetemplate name="okcancelbuttons" notext="Nie" yestext="Tak"/>
+ </notification>
+ <notification name="CannotGiveItem">
+ Podarowanie obiektu nie powiodło się.
+ </notification>
+ <notification name="TransactionCancelled">
+ Transakcja anulowana
+ </notification>
+ <notification name="TooManyItems">
+ Jednorazowo możesz podarować maksymalnie 42 obiekty z szafy.
+ </notification>
+ <notification name="NoItems">
+ Nie masz praw do transferu wybranych obiektów.
+ </notification>
+ <notification name="CannotCopyCountItems">
+ Nie masz praw do skopiowania [COUNT] wybranych obiektów. Obiekty znikną z Twojej szafy.
+Na pewno chcesz oddać te obiekty?
+ <usetemplate name="okcancelbuttons" notext="Nie" yestext="Tak"/>
+ </notification>
+ <notification name="CannotGiveCategory">
+ Nie masz praw do transferu wybranego foldera.
+ </notification>
+ <notification name="FreezeAvatar">
+ Unieruchomić tego awatara?
+Awatar tymczasowo nie będzie mógł się poruszać, nie będzie mógł używać czatu (IM) i nie będzie w stanie odziaływać na świat.
+ <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Odblokuj" yestext="Unieruchom"/>
+ </notification>
+ <notification name="FreezeAvatarFullname">
+ Unieruchowmić [AVATAR_NAME]?
+Ta osoba tymczasowo nie będzie mógła się poruszać, nie będzie mógł używać czatu (IM) i nie będzie w stanie odziaływać na świat.
+ <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Odblokuj" yestext="Unieruchom"/>
+ </notification>
+ <notification name="EjectAvatarFullname">
+ Wyrzucić [AVATAR_NAME] z Twojej posiadłości?
+ <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Wyrzuć i zabroń wstępu (ban)" yestext="Wyrzuć"/>
+ </notification>
+ <notification name="EjectAvatarFromGroup">
+ Wyrzuć [AVATAR_NAME] z grupy [GROUP_NAME]
+ </notification>
+ <notification name="AcquireErrorTooManyObjects">
+ BŁĄD OTRZYMYWANIA: Zbyt wiele wybranych obiektów.
+ </notification>
+ <notification name="AcquireErrorObjectSpan">
+ BŁĄD OTRZYMYWANIA: Obiekty przekraczają granicę regionów. Przemieść wszystkie otrzymywane obiekty do jednego regionu.
+ </notification>
+ <notification name="PromptGoToCurrencyPage">
+ [EXTRA]
+
+Odwiedź stronę [_URL] po więcej informacji na temat zakupu L$?
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification name="UnableToLinkObjects">
+ Nie można połączyć [COUNT] obiektów.
+Maksymalnie można połączyć [MAX] obiektów.
+ </notification>
+ <notification name="CannotLinkIncompleteSet">
+ Możesz łączyć tylko kompletne zbiory obiektów i musisz wybrać więcej niż jeden obiekt.
+ </notification>
+ <notification name="CannotLinkModify">
+ Nie możesz połączyć obiektów ponieważ nie masz praw modyfikacji dla wszystkich obiektów.
+
+Upewnij się, że żaden z obiktów nie jest zablokowany i że wszystkie obiekty należą do Ciebie.
+ </notification>
+ <notification name="CannotLinkDifferentOwners">
+ Nie możesz połączyć obiektów ponieważ należą one do różnych osób.
+
+Upewnij sie, że wszystkie wybrane obiekty należą do Ciebie.
+ </notification>
+ <notification name="NoFileExtension">
+ Niepoprawna końcówka nazwy pliku: &apos;[FILE]&apos;
+
+Upewnij się, że nazwa pliku ma poprawaną końcówkę.
+ </notification>
+ <notification name="InvalidFileExtension">
+ Niepoprawna końcówka nazwy pliku - [EXTENSION]
+Oczekiwana - [VALIDS]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="CannotUploadSoundFile">
+ Nie można otworzyć załadowanego pliku dźwiękowego:
+[FILE]
+ </notification>
+ <notification name="SoundFileNotRIFF">
+ Plik nie jest w formacie RIFF WAVE:
+[FILE]
+ </notification>
+ <notification name="SoundFileNotPCM">
+ Plik nie jest w formacie PCM WAVE:
+[FILE]
+ </notification>
+ <notification name="SoundFileInvalidChannelCount">
+ Plik zawiera niewłaściwą liczbę kanałów (musi być mono albo stereo):
+[FILE]
+ </notification>
+ <notification name="SoundFileInvalidSampleRate">
+ Plik zawiera niewłaścią częstotliwość (musi być 44.1k):
+[FILE]
+ </notification>
+ <notification name="SoundFileInvalidWordSize">
+ Plik zawiera niewłaściwą szerokość danych (musi być 8 albo 16 bitów):
+[FILE]
+ </notification>
+ <notification name="SoundFileInvalidHeader">
+ Brak bloku &apos;data&apos; w nagłówku pliku WAV:
+[FILE]
+ </notification>
+ <notification name="SoundFileInvalidChunkSize">
+ Niewłaściwy rozmiar &quot;chunk&quot; w pliku WAV:
+[FILE]
+ </notification>
+ <notification name="SoundFileInvalidTooLong">
+ Plik audio jest zbyt długi (10 sekund maksimum):
+[FILE]
+ </notification>
+ <notification name="CannotOpenTemporarySoundFile">
+ Nie można otworzyć tymczasowego skompresowango pliku dźwiękowego w celu zapisu: [FILE]
+ </notification>
+ <notification name="UnknownVorbisEncodeFailure">
+ Nieznany błąd kodowania Vorbis w: [FILE]
+ </notification>
+ <notification name="CannotEncodeFile">
+ Kodowanie pliku: [FILE] nie powidło się.
+ </notification>
+ <notification name="CorruptedProtectedDataStore">
+ Nie można wpisać Twojego imienia użytkownika ani hasła. To może się zdarzyć kiedy zmieniasz ustawienia sieci.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="CorruptResourceFile">
+ Skorumpowany plik zasobów: [FILE]
+ </notification>
+ <notification name="UnknownResourceFileVersion">
+ Nieznana wersja pliku zasobów Linden w pliku: [FILE]
+ </notification>
+ <notification name="UnableToCreateOutputFile">
+ Nie można utworzyć pliku wyjściowego: [FILE]
+ </notification>
+ <notification name="DoNotSupportBulkAnimationUpload">
+ [APP_NAME] obecnie nie wspomaga ładowania grupowego plików animacji.
+ </notification>
+ <notification name="CannotUploadReason">
+ Ładowanie pliku [FILE] nie powiodło się z powodu: [REASON]
+Spróbuj jeszcze raz póżniej.
+ </notification>
+ <notification name="LandmarkCreated">
+ Dodano &quot;[LANDMARK_NAME]&quot; do folderu [FOLDER_NAME].
+ </notification>
+ <notification name="LandmarkAlreadyExists">
+ Posiadasz już landmark dla tej lokalizacji.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="CannotCreateLandmarkNotOwner">
+ Nie możesz zapamiętać tego miejsca (LM) ponieważ właściciel posiadłości nie pozwala na to.
+ </notification>
+ <notification name="CannotRecompileSelectObjectsNoScripts">
+ &apos;Rekompilacja&apos; nie powiodła się.
+
+Wybierz obiekty zawierające skrypty.
+ </notification>
+ <notification name="CannotRecompileSelectObjectsNoPermission">
+ &apos;Rekompilacja&apos; nie powiodła się.
+
+Wybierz skryptowane obiekty do których masz prawa modyfikacji.
+ </notification>
+ <notification name="CannotResetSelectObjectsNoScripts">
+ &apos;Resetowanie&apos; nie powiodło się.
+
+Wybierz obiekty zawierające skrypty.
+ </notification>
+ <notification name="CannotResetSelectObjectsNoPermission">
+ &apos;Resetowanie&apos; nie powiodło się.
+
+Wybierz skryptowane obiekty do których masz prawa modyfikacji.
+ </notification>
+ <notification name="CannotOpenScriptObjectNoMod">
+ Nie można otworzyć skryptu bez prawa do modyfikacji obiektu.
+ </notification>
+ <notification name="CannotSetRunningSelectObjectsNoScripts">
+ &apos;Uruchomienie&apos; skryptów nie powiodło się.
+
+Wybierz obiekty zawierające skrypty.
+ </notification>
+ <notification name="CannotSetRunningNotSelectObjectsNoScripts">
+ &apos;Zatrzymanie&apos; skryptów nie powiodło się.
+
+Wybierz obiekty zawierające skrypty.
+ </notification>
+ <notification name="NoFrontmostFloater">
+ Brak górnego okna do zapisu.
+ </notification>
+ <notification name="SeachFilteredOnShortWords">
+ Twoje zapytanie wyszukiwania zostło zmienione - zbyt krótkie słowa zostały usunięte.
+
+Nowe zapytanie: [FINALQUERY]
+ </notification>
+ <notification name="SeachFilteredOnShortWordsEmpty">
+ Użyte terminy wyszukiwania były zbyt krótkie - wyszukiwanie zostało anulowane.
+ </notification>
+ <notification name="CouldNotTeleportReason">
+ Teleportacja nie powiodła się.
+[REASON]
+ </notification>
+ <notification name="invalid_tport">
+ Niestety, pojawił się błąd podczas próby teleportacji. Proponujemy wylogowanie się i spróbowanie teleportacji ponownie.
+Jeżeli nadal otrzymujesz tę wiadomość proponujemy odwiedzić stronę [SUPPORT_SITE].
+ </notification>
+ <notification name="invalid_region_handoff">
+ Niestety, pojawił się błąd podczas próby przedostania się na drugi region. Proponujemy wylogowanie się i spróbowanie przedostania się na drugi region ponownie.
+Jeżeli nadal otrzymujesz tę wiadomość proponujemy odwiedzić stronę [SUPPORT_SITE].
+ </notification>
+ <notification name="blocked_tport">
+ Przepraszamy, teleportacja jest chwilowo niedostępna. Spróbuj jeszcze raz.
+Jeśli nadal nie możesz się teleportować wyloguj się i ponownie zaloguj.
+ </notification>
+ <notification name="nolandmark_tport">
+ Przepraszamy, ale nie możemy znaleźć miejsca docelowego.
+ </notification>
+ <notification name="timeout_tport">
+ Przepraszamy, ale nie udało się przeprowadzić teleportacji. Spróbuj jeszcze raz.
+ </notification>
+ <notification name="noaccess_tport">
+ Przepraszamy, ale nie masz dostępu do miejsca docelowego.
+ </notification>
+ <notification name="missing_attach_tport">
+ Czekamy na Twoje akcesoria. Możesz poczekać kilka minut lub zrobić relog przed następną próbą teleportacji.
+ </notification>
+ <notification name="too_many_uploads_tport">
+ Obecnie ten region ma problemy z ładowaniem obiektów w związku z czym teleportacja bardzo sie opóźnia.
+Spróbuj jeszcze raz za kilka minut albo teleportuj się do mniej zatłoczonego miejsca.
+ </notification>
+ <notification name="expired_tport">
+ Przepraszamy, ale nie udało się przeprowadzić teleportacji wystarczająco szybko. Spróbuj jeszcze raz za kilka minut.
+ </notification>
+ <notification name="expired_region_handoff">
+ Przepraszamy, ale nie udało się przeprowadzić zmiany regionu wystarczająco szybko. Spróbuj jeszcze raz za kilka minut.
+ </notification>
+ <notification name="no_host">
+ Nie możemy znaleść miejsca docelowego. To miejsce może być chwilowo nieosiągalne albo przestało istnieć.
+Spróbuj jeszcze raz za kilka minut.
+ </notification>
+ <notification name="no_inventory_host">
+ Szafa chwilowo nie działa.
+ </notification>
+ <notification name="CannotSetLandOwnerNothingSelected">
+ Nie można wybrać właściciela posiadłości.
+Posiadłość nie została wybrana.
+ </notification>
+ <notification name="CannotSetLandOwnerMultipleRegions">
+ Nie można wybrać właściciela posiadłości ponieważ wybrany obszar przekracza granicę regionów. Wybierz mniejszy obszar i spróbuj jeszcze raz.
+ </notification>
+ <notification name="ForceOwnerAuctionWarning">
+ Ta posiadłość jest wystawiona na aukcję. Wymuszenie własności anuluje aukcję i potencjalnie może zdenerwować zainteresowanych Rezydentów, jeżeli licytacja już się rozpoczęła.
+Wymusić własność?
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification name="CannotContentifyNothingSelected">
+ Nie można sfinalizować:
+Posiadłość nie została wybrana.
+ </notification>
+ <notification name="CannotContentifyNoRegion">
+ Nie można sfinalizować:
+Region nie znaleziony.
+ </notification>
+ <notification name="CannotReleaseLandNothingSelected">
+ Nie można porzucić posiadłości:
+Posiadłość nie została wybrana.
+ </notification>
+ <notification name="CannotReleaseLandNoRegion">
+ Nie można porzucić posiadłości:
+Region nie znaleziony.
+ </notification>
+ <notification name="CannotBuyLandNothingSelected">
+ Nie można kupić posiadłości:
+Posiadłość nie została wybrana.
+ </notification>
+ <notification name="CannotBuyLandNoRegion">
+ Nie można kupić posiadłości:
+Region nie znaleziony.
+ </notification>
+ <notification name="CannotCloseFloaterBuyLand">
+ Okno zakupu landu nie może zostać zamknięte dopóki aplikacja [APP_NAME] nie określi ceny dla tej transkacji.
+ </notification>
+ <notification name="CannotDeedLandNothingSelected">
+ Nie można przekazać posiadłości:
+Posiadłość nie została wybrana.
+ </notification>
+ <notification name="CannotDeedLandNoGroup">
+ Nie można przekazać posiadłości:
+Grupa nie została wybrana.
+ </notification>
+ <notification name="CannotDeedLandNoRegion">
+ Brak możliwości przepisania posiadłości grupie:
+Region, gdzie posiadłość się znajduje nie został odnaleziony.
+ </notification>
+ <notification name="CannotDeedLandMultipleSelected">
+ Nie można przekazać posiadłości:
+Wiele posiadłości jest wybranych.
+
+Spróbuj wybrać pojedynczą posiadłość.
+ </notification>
+ <notification name="CannotDeedLandWaitingForServer">
+ Nie można przekazać posiadłości:
+Serwer aktualizuje dane własności.
+
+Spróbuj jeszcze raz póżniej.
+ </notification>
+ <notification name="CannotDeedLandNoTransfer">
+ Nie możesz przekazać posiadłości:
+Region [REGION] nie pozwala na transfer posiadłości.
+ </notification>
+ <notification name="CannotReleaseLandWatingForServer">
+ Nie można porzucić posiadłości:
+Serwer aktualizuje dane posiadłości.
+
+Spróbuj jeszcze raz póżniej.
+ </notification>
+ <notification name="CannotReleaseLandSelected">
+ Nie możesz porzucić posiadłości:
+Nie jesteś właścicielem wszystkich wybranych posiadłości.
+
+Wybierz pojedynczą posiadłość.
+ </notification>
+ <notification name="CannotReleaseLandDontOwn">
+ Nie możesz porzucić posiadłości:
+Nie masz praw do porzucenia tej posiadłości.
+
+Twoje posiadłości są podkreślone na zielono.
+ </notification>
+ <notification name="CannotReleaseLandRegionNotFound">
+ Brak możliwości porzucenia posiadłości:
+Region, gdzie posiadłość się znajduje nie został odnaleziony.
+ </notification>
+ <notification name="CannotReleaseLandNoTransfer">
+ Nie możesz porzucić posiadłości:
+Region [REGION] nie pozwala na transfer posiadłości.
+ </notification>
+ <notification name="CannotReleaseLandPartialSelection">
+ Nie można porzucić posiadłości:
+Musisz wybrać całą posiadłość by ją porzucić.
+Wybierz całą posiadłość albo najpierw ją podziel.
+ </notification>
+ <notification name="ReleaseLandWarning">
+ Porzucasz posiadłość o powierzchni [AREA] m².
+Porzucenie tej posiadłości usunie ją z Twoich własności.
+Nie otrzymasz za to żadnej opłaty.
+
+Porzucić posiadłość?
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification name="CannotDivideLandNothingSelected">
+ Nie można podzielić posiadłości:
+
+Posiadłość nie została wybrana.
+ </notification>
+ <notification name="CannotDivideLandPartialSelection">
+ Nie można podzielić posiadłości:
+
+Posiadłość została wybrana w całości.
+Spróbuj wybrać część posiadłości.
+ </notification>
+ <notification name="LandDivideWarning">
+ Podział tej posiadłości stworzy dwie posiadłości z których każda będzie mogła mieć indywidualne ustawienia.
+Niektóre ustawienia zostaną zmienione na domyślne po tej operacji.
+
+Podzielić posiadłość?
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification name="CannotDivideLandNoRegion">
+ Brak możliwości podziału posiadłości:
+Region, gdzie posiadłość się znajduje nie został odnaleziony.
+ </notification>
+ <notification name="CannotJoinLandNoRegion">
+ Brak możliwości złączenia posiadłości:
+Region, gdzie posiadłość się znajduje nie został odnaleziony.
+ </notification>
+ <notification name="CannotJoinLandNothingSelected">
+ Nie można połączyć posiadłości:
+Posiadłości nie zostały wybrane.
+ </notification>
+ <notification name="CannotJoinLandEntireParcelSelected">
+ Nie można połączyć posiadłości:
+Tylko jedna posiadłość została wybrana.
+
+Wybierz obaszar usytuowany na obu posiadłościach.
+ </notification>
+ <notification name="CannotJoinLandSelection">
+ Nie można połączyć posiadłości:
+Musisz wybrać więcej niż jedną posiadłość.
+
+Wybierz obaszar usytuowany na obu posiadłościach.
+ </notification>
+ <notification name="JoinLandWarning">
+ Połączenie tego obszaru utworzy jedną większą posiadłość ze wszystkich posiadłości przecinających wybrany prostokąt. Nazwa i opcje posiadłości bedą musiały zostać skonfigurowane.
+
+Połączyć posiadłości?
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmNotecardSave">
+ Ta notka musi być zapisana żeby mogła być skopiowana lub zobaczona. Zapisać notkę?
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmItemCopy">
+ Skopiować ten obiekt do Twojej szafy?
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="Skopiuj"/>
+ </notification>
+ <notification name="ResolutionSwitchFail">
+ Zmiana rozdzielczości do [RESX] x [RESY] nie powidła się
+ </notification>
+ <notification name="ErrorUndefinedGrasses">
+ Błąd: niezdefiniowane trawy: [SPECIES]
+ </notification>
+ <notification name="ErrorUndefinedTrees">
+ Bład: niezdefiniowane drzewa: [SPECIES]
+ </notification>
+ <notification name="CannotSaveWearableOutOfSpace">
+ Nie można zapisać &apos;[NAME]&apos; do pliku stroju. Musisz zwolnić trochę miejsca na Twoim komputerze i zapisać strój jeszcze raz.
+ </notification>
+ <notification name="CannotSaveToAssetStore">
+ Nie można zapisać [NAME] w centralnym zbiorze danych.
+Zazwyczaj jest to tymczasowy problem. Możesz kontynuować modyfikacje i zapisać strój ponownie za kilka minut.
+ </notification>
+ <notification name="YouHaveBeenLoggedOut">
+ Nastąpiło wylogowanie z [SECOND_LIFE]
+ [MESSAGE]
+ <usetemplate name="okcancelbuttons" notext="Wyłącz" yestext="Kontynuuj"/>
+ </notification>
+ <notification name="OnlyOfficerCanBuyLand">
+ Nie możesz kupić posiadłości dla grupy.
+Nie masz praw kupowania posiadłości dla Twojej aktywnej grupy.
+ </notification>
+ <notification label="Add Friend" name="AddFriendWithMessage">
+ Znajomi mogą pozwalać na odnajdywanie się wzajemnie na mapie i na otrzymywanie notyfikacji o logowaniu do [SECOND_LIFE].
+
+Zaproponować znajomość [NAME]?
+ <form name="form">
+ <input name="message">
+ Chcesz zawrzeć znajomość?
+ </input>
+ <button name="Offer" text="OK"/>
+ <button name="Cancel" text="Anuluj"/>
+ </form>
+ </notification>
+ <notification label="Zapisz strój" name="SaveOutfitAs">
+ Zapisz to co noszę jako nowy strój:
+ <form name="form">
+ <input name="message">
+ [DESC] (nowe)
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="Anuluj"/>
+ </form>
+ </notification>
+ <notification label="Zapisz część stroju" name="SaveWearableAs">
+ Zapisz obiekt w mojej Szafie jako:
+ <form name="form">
+ <input name="message">
+ [DESC] (nowy)
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="Anuluj"/>
+ </form>
+ </notification>
+ <notification label="Zmień nazwę stroju" name="RenameOutfit">
+ Nowa nazwa stroju:
+ <form name="form">
+ <input name="new_name">
+ [NAME]
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="Anuluj"/>
+ </form>
+ </notification>
+ <notification name="RemoveFromFriends">
+ Czy chcesz usunąć [NAME] z listy znajomych?
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification name="RemoveMultipleFromFriends">
+ Chcesz usunąć grupę osób z listy Twoich znajomych?
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification name="GodDeleteAllScriptedPublicObjectsByUser">
+ Na pewno chcesz usunąć wszystkie skryptowane obiekty należące do
+** [AVATAR_NAME] **
+z posiadłości innych w tym symulatorze?
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification name="GodDeleteAllScriptedObjectsByUser">
+ Na pewno chcesz usunąć wszystkie skryptowane obiekty należące do
+** [AVATAR_NAME] **
+ze wszystkich posiadłości w tym symulatorze?
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification name="GodDeleteAllObjectsByUser">
+ Na pewno chcesz usunąć wszystkie obiekty (skryptowane i nie) należące do
+** [AVATAR_NAME] **
+ze wszystkich posiadłości w tym symulatorze?
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification name="BlankClassifiedName">
+ Musisz nadać tytuł Twojej reklamie.
+ </notification>
+ <notification name="MinClassifiedPrice">
+ Minimalna cena za publikację wynosi [MIN_PRICE]L$.
+
+Wybierz wyższą cenę.
+ </notification>
+ <notification name="ConfirmItemDeleteHasLinks">
+ Co najmiej jeden z elementów, które masz posiada połączone z nim obiekty. Jeśli go usuniesz połączenia zostaną usunięte na stałe. Zaleca się usunięcie połączeń w pierwszej kolejności.
+
+Jesteś pewnien/pewna, że chcesz usunąć te elementy?
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteLock">
+ Przynajmnie jeden z wybranych obiektów jest zablokowany.
+
+Na pewno chcesz usunąć te obiekty?
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteNoCopy">
+ Przynajmniej jeden z wybranych obiektów jest niekopiowalny.
+
+Na pewno chcesz usunąć te obiekty?
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteNoOwn">
+ Przynajmniej jeden z wybranych obiektów nie należy do Ciebie.
+
+Na pewno chcesz usunąć te obiekty?
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteLockNoCopy">
+ Przynajmnie jeden z wybranych obiektów jest zablokowany.
+Przynajmniej jeden z wybranych obiektów jest niekopiwalny.
+
+Na pewno chcesz usunąć te obiekty?
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteLockNoOwn">
+ Przynajmnie jeden z wybranych obiektów jest zablokowany.
+Przynajmniej jeden z wybranych obiektów nie należy do Ciebie.
+
+Na pewno chcesz usunąć te obiekty?
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteNoCopyNoOwn">
+ Przynajmniej jeden z wybranych obiektów jest niekopiowalny.
+Przynajmniej jeden z wybranych obiektów nie należy do Ciebie.
+
+Na pewno chcesz usunąć te obiekty?
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteLockNoCopyNoOwn">
+ Przynajmnie jeden z wybranych obiektów jest zablokowany.
+Przynajmniej jeden z wybranych obiektów jest niekopiwalny.
+Przynajmniej jeden z wybranych obiektów nie należy do Ciebie.
+
+Na pewno chcesz usunąć te obiekty?
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmObjectTakeLock">
+ Przynajmnie jeden obiekt jest zablokowany.
+
+Na pewno chcesz usunąć te obiekty?
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmObjectTakeNoOwn">
+ Przynajmniej jeden obiekt nie należy do Ciebie.
+Jeżeli będziesz kontynuować prawa następnego właściciela zostaną przypisane co, potencjalnie, może ograniczyć Twoje prawa do modyfikacji lub kopiowania obiektów.
+
+Na pewno chcesz wziąść te obiekty?
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmObjectTakeLockNoOwn">
+ Przynajmnie jeden obiekt jest zablokowany.
+Przynajmniej jeden obiekt nie należy do Ciebie.
+Jeżeli będziesz kontynuować prawa następnego właściciela zostaną przypisane co, potencjalnie, może ograniczyć Twoje prawa do modyfikacji lub kopiowania obiektów.
+
+Na pewno chcesz wziąść te obiekty?
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification name="CantBuyLandAcrossMultipleRegions">
+ Nie możesz kupić posiadłości ponieważ wybrany obszar przekracza granicę regionów.
+
+Wybierz mniejszy obszar i spróbuj jeszcze raz.
+ </notification>
+ <notification name="DeedLandToGroup">
+ Po przekazaniu tej posiadłości grupa będzia musiała mieć i utrzymywać wystarczający kredyt na używanie posiadłości. Cena zakupu posiadłości nie jest zwracana właścicielowi. Jeżeli przekazana posiadłość zostanie sprzedana, cana sprzedaży zostanie podzielona pomiędzy członków grupy.
+
+Przekazać tą posiadłość o powierzchni [AREA] m² grupie &apos;[GROUP_NAME]&apos;?
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification name="DeedLandToGroupWithContribution">
+ Po przekazaniu tej posiadłości grupa będzia musiała mieć i utrzymywać wystarczający kredyt na używanie posiadłości.
+Przekazanie będzie zawierać równoczesne przypisanie posiadłości do grupy od &apos;[NAME]&apos;.
+Cena zakupu posiadłości nie jest zwracana właścicielowi. Jeżeli przekazana posiadłość zostanie sprzedana, cana sprzedaży zostanie podzielona pomiędzy członków grupy.
+
+Przekazać tą posiadłość o powierzchni [AREA] m² grupie &apos;[GROUP_NAME]&apos;?
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification name="DisplaySetToSafe">
+ Ustawienia grafiki zostały zmienione do bezpiecznego poziomu ponieważ opcja -safe została wybrana.
+ </notification>
+ <notification name="DisplaySetToRecommended">
+ Ustawienia grafiki zostały zmienione do zalecanego poziomu na podstawie konfiguracji Twojego systemu.
+ </notification>
+ <notification name="ErrorMessage">
+ [ERROR_MESSAGE]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="AvatarMovedDesired">
+ Miejsce, do którego chcesz się teleportować jest chwilowo nieobecne.
+Zostałeś przeniesiony do regionu sąsiedniego.
+ </notification>
+ <notification name="AvatarMovedLast">
+ Twoje miejsce startu jest obecnie niedostępne.
+Zostałeś przeniesiony do sąsiedniego regionu.
+ </notification>
+ <notification name="AvatarMovedHome">
+ Twoje miejsce startu jest obecnie niedostępne.
+Zostałeś przeniesiony do pobliskiego regionu.
+Możesz ustawić nowe miejsce startu.
+ </notification>
+ <notification name="ClothingLoading">
+ Twoje ubranie wciąż się ładuje.
+Możesz normalnie używać [SECOND_LIFE], inni użytkownicy będą Cię widzieli poprawnie.
+ <form name="form">
+ <ignore name="ignore" text="Ładowanie ubrań nadal trwa"/>
+ </form>
+ </notification>
+ <notification name="FirstRun">
+ Instalacja [APP_NAME] zakończona.
+
+Jeżeli używasz [SECOND_LIFE] po raz pierwszy to musisz stworzyć konto żeby móc się zalogować.
+Czy chcesz przejść na stronę [http://join.secondlife.com secondlife.com] żeby stworzyć nowe konto?
+ <usetemplate name="okcancelbuttons" notext="Kontynuuj" yestext="Nowe konto..."/>
+ </notification>
+ <notification name="LoginPacketNeverReceived">
+ Problemy z połączeniem. Problem może być spowodowany Twoim połączeniem z Internetem albo może istnieć po stronie [SECOND_LIFE_GRID].
+
+Możesz sprawdzić swoje połączenie z Internetem i spróbować ponownie za kilka minut lub połączyć się ze stroną pomocy technicznej tutaj [SUPPORT_SITE] lub wybrać Teleportuj by teleportować się do swojego miejsca startu.
+ <form name="form">
+ <button name="OK" text="OK"/>
+ <button name="Help" text="Pomoc"/>
+ <button name="Teleport" text="Teleportuj"/>
+ </form>
+ </notification>
+ <notification name="WelcomeChooseSex">
+ Twoja postać pojawi się za moment.
+
+Używaj strzałek żeby sie poruszać.
+Naciśnij F1 w dowolnej chwili po pomoc albo żeby dowiedzieć się więcej o [SECOND_LIFE].
+Wybierz awatara właściwej płci.
+Ten wybór będzie można później zmienić.
+ <usetemplate name="okcancelbuttons" notext="Kobieta" yestext="Mężczyzna"/>
+ </notification>
+ <notification name="CantTeleportToGrid">
+ Nie można teleportować do [SLURL], ponieważ jest na innym gridzie ([GRID]) niż obecny grid ([CURRENT_GRID]). Proszę zamknąć przeglądarkę i spróbować ponownie.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="GeneralCertificateError">
+ Połączenie z serwerem nie mogło zostać nawiązane.
+[REASON]
+
+SubjectName: [SUBJECT_NAME_STRING]
+IssuerName: [ISSUER_NAME_STRING]
+Valid From: [VALID_FROM]
+Valid To: [VALID_TO]
+MD5 Fingerprint: [SHA1_DIGEST]
+SHA1 Fingerprint: [MD5_DIGEST]
+Key Usage: [KEYUSAGE]
+Extended Key Usage: [EXTENDEDKEYUSAGE]
+Subject Key Identifier: [SUBJECTKEYIDENTIFIER]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="TrustCertificateError">
+ Wydawca certyfikatu dla tego serwera nie jest znany.
+
+Informacje o certyfikacie:
+SubjectName: [SUBJECT_NAME_STRING]
+IssuerName: [ISSUER_NAME_STRING]
+Valid From: [VALID_FROM]
+Valid To: [VALID_TO]
+MD5 Fingerprint: [SHA1_DIGEST]
+SHA1 Fingerprint: [MD5_DIGEST]
+Key Usage: [KEYUSAGE]
+Extended Key Usage: [EXTENDEDKEYUSAGE]
+Subject Key Identifier: [SUBJECTKEYIDENTIFIER]
+
+Czy chcesz zaufać temu wydawcy?
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="Zaufaj"/>
+ </notification>
+ <notification name="NotEnoughCurrency">
+ [NAME] [PRICE]L$ Masz za mało L$.
+ </notification>
+ <notification name="GrantedModifyRights">
+ Masz teraz prawa modyfikacji obiektów należących do [NAME].
+ </notification>
+ <notification name="RevokedModifyRights">
+ Prawa modyfikacji obiektów należących do [NAME] zostały Ci odebrane.
+ </notification>
+ <notification name="FlushMapVisibilityCaches">
+ To spowoduje wyczyszczenie buforów map regionu.
+Jest to użyteczne wyłącznie podczas szukania błędów.
+(Podczas produkcji poczekaj 5 minut i mapy wszystkich zostaną uaktualnione po relogu.)
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification name="BuyOneObjectOnly">
+ Nie możesz zakupić więcej niż jednego obiektu w tym samym czasie. Proszę wybrać tylko jeden obiekt i spróbować ponowanie.
+ </notification>
+ <notification name="OnlyCopyContentsOfSingleItem">
+ Nie można kopiować zawartości więcej niż jednego obiektu naraz.
+Wybierz pojedynczy obiekt i spróbuj jeszcze raz.
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification name="KickUsersFromRegion">
+ Teleportować wszystkich Rezydentów z tego regionu to ich miejsca startu?
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification name="EstateObjectReturn">
+ Na pewno chcesz odesłać wszystkie obiekty należące do
+[USER_NAME] ?
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification name="InvalidTerrainBitDepth">
+ Nie można ustawić tekstur regionu:
+Tekstura terenu [TEXTURE_NUM] ma niewłaściwą głębię koloru - [TEXTURE_BIT_DEPTH].
+Zamień teksturę [TEXTURE_NUM] na 24-o bitową teksturę o wymiarze 512x512 lub mniejszą i ponownie kliknij Zastosuj.
+ </notification>
+ <notification name="InvalidTerrainSize">
+ Nie można ustawić tekstur regionu:
+Tekstura terenu [TEXTURE_NUM] jest za duża - [TEXTURE_SIZE_X]x[TEXTURE_SIZE_Y].
+Zamień teksturę [TEXTURE_NUM] na 24-o bitową teksturę o wymiarze 512x512 lub mniejszą i ponownie kliknij Zastosuj.
+ </notification>
+ <notification name="RawUploadStarted">
+ Ładowanie rozpoczęte. Może potrwać do dwóch minut zależnie od prędkości Twojego połączenia.
+ </notification>
+ <notification name="ConfirmBakeTerrain">
+ Na pewno chcesz zapisać obecne ukształtowanie terenu jako punkt odniesienia dla górnego i dolnego limitu terenu i jako domyślą wartość dla opcji Odtwórz?
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification name="MaxAllowedAgentOnRegion">
+ Maksymalna liczba gości wynosi [MAX_AGENTS].
+ </notification>
+ <notification name="MaxBannedAgentsOnRegion">
+ Maksymalna liczba niepożądanych Rezydentów (banów) wynosi [MAX_BANNED].
+ </notification>
+ <notification name="MaxAgentOnRegionBatch">
+ Próba dodania [NUM_ADDED] osób nie powiodła się:
+[MAX_AGENTS] [LIST_TYPE] limit przekroczony o [NUM_EXCESS].
+ </notification>
+ <notification name="MaxAllowedGroupsOnRegion">
+ Możesz mieć maksymalnie [MAX_GROUPS] dozwolonych grup.
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="Ustal"/>
+ </notification>
+ <notification name="MaxManagersOnRegion">
+ Możesz mieć maksymalnie [MAX_MANAGER] zarządców Majątku.
+ </notification>
+ <notification name="OwnerCanNotBeDenied">
+ Nie możesz dodać właściciela majątku do listy &apos;Niepożądanych Rezydentów (banów)&apos; majątku.
+ </notification>
+ <notification name="CanNotChangeAppearanceUntilLoaded">
+ Nie możesz zmienić wyglądu podczas ładowania ubrań i kształtów.
+ </notification>
+ <notification name="ClassifiedMustBeAlphanumeric">
+ Tytuł Twojej reklamy musi zaczynać się od litery (A-Z) albo cyfry. Znaki przestankowe są niedozwolone.
+ </notification>
+ <notification name="CantSetBuyObject">
+ Nie możesz wybrać Kup obiekt ponieważ obiekt nie jest na sprzedaż.
+Wybierz obiekt na sprzedaż i spróbuj jeszcze raz.
+ </notification>
+ <notification name="FinishedRawDownload">
+ Plik surowego terenu załadowany pod:
+[DOWNLOAD_PATH].
+ </notification>
+ <notification name="DownloadWindowsMandatory">
+ Nowa wersja [APP_NAME] została opublikowana.
+[MESSAGE]
+Musisz zainstalować nową wersję żeby używać [APP_NAME].
+ <usetemplate name="okcancelbuttons" notext="Wyłącz program" yestext="Załaduj"/>
+ </notification>
+ <notification name="DownloadWindows">
+ Uaktualniona wersja [APP_NAME] została opublikowana.
+[MESSAGE]
+Aktualizacja nie jest wymagana ale jest zalecana w celu poprawy prędkości i stabilności.
+ <usetemplate name="okcancelbuttons" notext="Kontynuuj" yestext="Załaduj"/>
+ </notification>
+ <notification name="DownloadWindowsReleaseForDownload">
+ Uaktualniona wersja [APP_NAME] została opublikowana.
+[MESSAGE]
+Aktualizacja nie jest wymagana ale jest zalecana w celu poprawy prędkości i stabilności.
+ <usetemplate name="okcancelbuttons" notext="Kontynuuj" yestext="Załaduj"/>
+ </notification>
+ <notification name="DownloadLinuxMandatory">
+ Nowa wersja [APP_NAME] jest dostępna.
+[MESSAGE]
+Musisz pobrać aktualizację aby korzystać z [APP_NAME].
+ <usetemplate name="okcancelbuttons" notext="Wyjdź" yestext="Pobieranie"/>
+ </notification>
+ <notification name="DownloadLinux">
+ Aktualizacja [APP_NAME] jest dostępna.
+[MESSAGE]
+Ta aktualizacja nie jest wymagana ale zaleca się jej instalację w celu poprawienia szybkości i stabilności.
+ <usetemplate name="okcancelbuttons" notext="Kontynuuj" yestext="Pobieranie"/>
+ </notification>
+ <notification name="DownloadLinuxReleaseForDownload">
+ Uaktualniona wersja [APP_NAME]została opublikowana.
+[MESSAGE]
+Aktualizacja nie jest wymagana ale jest zalecana w celu poprawy prędkości i stabilności.
+ <usetemplate name="okcancelbuttons" notext="Kontynuuj" yestext="Pobieranie"/>
+ </notification>
+ <notification name="DownloadMacMandatory">
+ Nowa wersja [APP_NAME] została opublikowana.
+[MESSAGE]
+Musisz zainstalować nową wersję żeby używać [APP_NAME].
+
+Pobrać i zapisać w folderze Aplikacji?
+ <usetemplate name="okcancelbuttons" notext="Wyłącz program" yestext="Załaduj"/>
+ </notification>
+ <notification name="DownloadMac">
+ Uaktualniona wersja [APP_NAME] została opublikowana.
+[MESSAGE]
+Aktualizacja nie jest wymagana ale jest zalecana w celu poprawy prędkości i stabilności.
+
+Pobrać i zapisać w folderze Aplikacji?
+ <usetemplate name="okcancelbuttons" notext="Kontynuuj" yestext="Załaduj"/>
+ </notification>
+ <notification name="DownloadMacReleaseForDownload">
+ Uaktualniona wersja [APP_NAME] została opublikowana.
+[MESSAGE]
+Aktualizacja nie jest wymagana ale jest zalecana w celu poprawy prędkości i stabilności.
+
+Pobrać i zapisać w folderze Aplikacji?
+ <usetemplate name="okcancelbuttons" notext="Kontynuuj" yestext="Załaduj"/>
+ </notification>
+ <notification name="FailedUpdateInstall">
+ Podczas aktualizacji pojawił się błąd. Proszę pobrać i zainstalować najnowszego klienta z http://secondlife.com/download.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="FailedRequiredUpdateInstall">
+ Nie można zainstalować wymaganej aktualizacji. Nie będzie można zalogować się dopóki [APP_NAME] nie zostanie zaktualizowana.
+ Proszę pobrać i zainstalować najnowszą wersję z http://secondlife.com/download.
+ <usetemplate name="okbutton" yestext="Rezygnuj"/>
+ </notification>
+ <notification name="UpdaterServiceNotRunning">
+ Istnieje obowiązkowa aktualizacja dla Second Life. Możesz ją pobrać z http://www.secondlife.com/downloads lub zainstalować teraz.
+ <usetemplate name="okcancelbuttons" notext="Opuść Second Life" yestext="Pobierz i zainstaluj teraz"/>
+ </notification>
+ <notification name="DownloadBackgroundTip">
+ Aktualizacja dla [APP_NAME] została pobrana.
+Wersja [VERSION] [[RELEASE_NOTES_FULL_URL] Informacja o tej aktualizacji]
+ <usetemplate name="okcancelbuttons" notext="Później..." yestext="Zainstaluj teraz i restartuj [APP_NAME]"/>
+ </notification>
+ <notification name="DownloadBackgroundDialog">
+ Aktualizacja [APP_NAME] została pobrana.
+Wersja [VERSION] [[RELEASE_NOTES_FULL_URL] Informacja o aktualizacji]
+ <usetemplate name="okcancelbuttons" notext="Później..." yestext="Zainstaluj teraz i restartuj [APP_NAME]"/>
+ </notification>
+ <notification name="RequiredUpdateDownloadedVerboseDialog">
+ Pobrano wymaganą aktualizację.
+Wersja [VERSION]
+
+W celu instalacji aktualizacji musi zostać wykonany restart [APP_NAME].
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="RequiredUpdateDownloadedDialog">
+ W celu instalacji aktualizacji musi zostać wykonany restart [APP_NAME].
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="DeedObjectToGroup">
+ Przekazanie tego obiektu spowoduje, że grupa:
+* Otrzyma L$ zapłacone temu obiektowi
+ <usetemplate ignoretext="Proszę potwierdzić decyzję przed przepisaniem obiektu do grupy" name="okcancelignore" notext="Anuluj" yestext="Przekaż"/>
+ </notification>
+ <notification name="WebLaunchExternalTarget">
+ Czy chcesz otworzyć swoją przeglądarkę internetową by zobaczyć zawartość?
+ <usetemplate ignoretext="Uruchom przeglądarkę internetową by zobaczyć stronę internetową" name="okcancelignore" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification name="WebLaunchJoinNow">
+ By dokonać zmian i aktualizacji swojego konta, odwiedź [http://secondlife.com/account/ Dashboard].
+ <usetemplate ignoretext="Uruchom przeglądarkę internetową by dokonać zmian w konfiguracji mojego konta" name="okcancelignore" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification name="WebLaunchSecurityIssues">
+ Odwiedź [SECOND_LIFE] Wiki i zobacz jak zgłaszać problemy z bezpieczeństwem danych.
+ <usetemplate ignoretext="Uruchom przeglądarkę internetową by dowiedzieć się więcej na temat zgłaszania problemów bezpieczeństwa" name="okcancelignore" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification name="WebLaunchQAWiki">
+ Odwiedź [SECOND_LIFE] Wiki pytań i odpowiedzi.
+ <usetemplate ignoretext="Uruchom przeglądarkę internetową by zobaczyć QA Wiki" name="okcancelignore" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification name="WebLaunchPublicIssue">
+ Odwiedź [SECOND_LIFE] katalog publicznych problemów, gdzie możesz zgłaszać błędy i inne problemy.
+ <usetemplate ignoretext="Uruchom przeglądarkę internetową by wysłać Błędy klienta" name="okcancelignore" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification name="WebLaunchSupportWiki">
+ Otwórz oficjalny blog Lindenów żeby zobaczyć nowe wiadomości i informacje.
+ <usetemplate ignoretext="Uruchom przeglądarkę internetową by zobaczyć blog" name="okcancelignore" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification name="WebLaunchLSLGuide">
+ Czy chcesz otworzyć samouczek Języka skryptowania?
+ <usetemplate ignoretext="Uruchom przeglądarkę internetową by samouczek Języka skryptowania" name="okcancelignore" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification name="WebLaunchLSLWiki">
+ Czy napewno chcesz odwiedzić portal LSL Portal?
+ <usetemplate ignoretext="Uruchom przeglądarkę internetową by LSL Portal" name="okcancelignore" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification name="ReturnToOwner">
+ Czy na pewno chcesz zwrócić wybrane obiekty do ich właścicieli? Wszystkie udostępnione obiekty z prawem transferu zostaną zwrócone poprzednim właścicielom.
+
+*UWAGA* Wszystkie udostępnione obiekty bez prawa transferu zostaną usunięte!
+ <usetemplate ignoretext="Potwierdź zanim zwrócisz obiekty do ich właścicieli" name="okcancelignore" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification name="GroupLeaveConfirmMember">
+ Jesteś członkiem grupy [GROUP].
+Chcesz opuścić grupę?
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmKick">
+ Napewno chcesz wyrzucić wszystkich Rezydentów z gridu?
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="Wyrzuć wszystkich Rezydentów"/>
+ </notification>
+ <notification name="MuteLinden">
+ Przepraszamy, ale nie możesz zablokować Lindena.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="CannotStartAuctionAlreadyForSale">
+ Aukcja nie może zostać rozpoczęta w posiadłości, która została już wcześniej wystawiona na aukcję. Deaktywuj opcję sprzedaży posiadłości jeżeli chcesz rozpocząć aukcję.
+ </notification>
+ <notification label="Zablokuj obiekty według wpisanej nazwy" name="MuteByNameFailed">
+ Rezydent/obiekt jest już zablokowany.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="RemoveItemWarn">
+ Pomimo, że jest to dozwolone, usunięcie zawartości może zniszczyć obiekt. Chcesz usunąć?
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification name="CantOfferCallingCard">
+ Nie możesz dać wizytówki w tym momencie. Spróbuj jeszcze raz za chwilę.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="CantOfferFriendship">
+ Nie możesz zaoferować znajomości w tym momencie. Spróbuj jeszcze raz za chwilę.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="BusyModeSet">
+ Tryb Pracy jest włączony.
+Czat i IM będą ukryte. Wysłane IM będą otrzymywały Twoją odpowiedź Trybu Pracy. Propozycje teleportacji będą odrzucone.
+Dodatkowo, wszystkie podarowane dla Ciebie obiekty będą automatycznie zapisywane w folderze &quot;Kosz&quot; w Twojej szafie.
+ <usetemplate ignoretext="Status zmieniony na Tryb pracy" name="okignore" yestext="OK"/>
+ </notification>
+ <notification name="JoinedTooManyGroupsMember">
+ Należysz już do maksymalnej ilości grup. Opuść proszę przynajmniej jedną grupę żeby przyjąć członkostwo w tej grupie, albo odmów.
+[NAME] oferuje Ci członkostwo w grupie.
+ <usetemplate name="okcancelbuttons" notext="Odmów" yestext="Przyjmij"/>
+ </notification>
+ <notification name="JoinedTooManyGroups">
+ Należysz już do maksymalnej ilości grup. Opuść proszę przynajmiej jedną grupę żeby przyjąć członkostwo w tej grupie, albo odmów.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="KickUser">
+ Wyrzuć tego Rezydenta, wysyłając następujący komunikat.
+ <form name="form">
+ <input name="message">
+ Administrator wylogował Cię.
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="Anuluj"/>
+ </form>
+ </notification>
+ <notification name="KickAllUsers">
+ Z jakim komunikatem wyrzucić wszystkich użytkowników z regionu?
+ <form name="form">
+ <input name="message">
+ Administrator wylogował Cię.
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="Anuluj"/>
+ </form>
+ </notification>
+ <notification name="FreezeUser">
+ Unieruchom tego Rezydenta, wysyłając następujący komunikat.
+ <form name="form">
+ <input name="message">
+ Unieruchomiono Cię. Nie możesz się ruszać ani rozmawiać. Administrator skontaktuje się z Tobą poprzez IM.
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="Anuluj"/>
+ </form>
+ </notification>
+ <notification name="UnFreezeUser">
+ Cofnij unieruchomienie tego Rezydenta, wysyłając następujący komunikat.
+ <form name="form">
+ <input name="message">
+ Odblokowano Cię.
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="Anuluj"/>
+ </form>
+ </notification>
+ <notification name="SetDisplayNameSuccess">
+ Witaj [DISPLAY_NAME]!
+
+Podobnie jak w realnym życiu potrzeba trochę czasu zanim wszyscy dowiedzą się o nowej nazwie. Kolejne kilka dni zajmie [http://wiki.secondlife.com/wiki/Setting_your_display_name aktualizacja nazwy] w obiektach, skryptach, wyszukiwarce, etc.
+ </notification>
+ <notification name="SetDisplayNameBlocked">
+ Przepraszamy, nie można zmienić Twojej wyświetlanej nazwy. Jeśli uważasz ze jest to spowodowane błędem skontaktuj się z obsługą klienta.
+ </notification>
+ <notification name="SetDisplayNameFailedLength">
+ Przepraszamy, ta nazwa jest zbyt długa. Wyświetlana nazwa może mieć maksymalnie [LENGTH] znaków.
+
+Proszę wprowadzić krótszą nazwę.
+ </notification>
+ <notification name="SetDisplayNameFailedGeneric">
+ Przepraszamy, nie można ustawić Twojej wyświetlanej nazwy. Spróbuj ponownie później.
+ </notification>
+ <notification name="SetDisplayNameMismatch">
+ Podana wyświetlana nazwa nie pasuje. Proszę wprowadzić ją ponownie.
+ </notification>
+ <notification name="AgentDisplayNameUpdateThresholdExceeded">
+ Przepraszamy, musisz jeszcze poczekać zanim będzie można zmienić Twoją wyświetlaną nazwę.
+
+Zobacz http://wiki.secondlife.com/wiki/Setting_your_display_name
+
+Proszę spróbować ponownie później.
+ </notification>
+ <notification name="AgentDisplayNameSetBlocked">
+ Przepraszamy, nie można ustawić wskazanej nazwy, ponieważ zawiera zabronione słowa.
+
+ Proszę spróbować wprowadzić inną nazwę.
+ </notification>
+ <notification name="AgentDisplayNameSetInvalidUnicode">
+ Wyświetlana nazwa, którą chcesz ustawić zawiera niepoprawne znaki.
+ </notification>
+ <notification name="AgentDisplayNameSetOnlyPunctuation">
+ Twoje wyświetlane imię musi zawierać litery inne niż znaki interpunkcyjne.
+ </notification>
+ <notification name="DisplayNameUpdate">
+ [OLD_NAME] ([SLID]) jest od tej pory znana/znany jako [NEW_NAME].
+ </notification>
+ <notification name="OfferTeleport">
+ Zaproponować teleportację do miejsca Twojego pobytu z tą wiadomością?
+ <form name="form">
+ <input name="message">
+ Zapraszam do siebie. Region: [REGION]
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="Anuluj"/>
+ </form>
+ </notification>
+ <notification name="OfferTeleportFromGod">
+ Wysłać propozycję teleportacji do Twojego miejsca?
+ <form name="form">
+ <input name="message">
+ Zapraszam do siebie. Region: [REGION]
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="Anuluj"/>
+ </form>
+ </notification>
+ <notification name="TeleportFromLandmark">
+ Na pewno chcesz się teleportować do &lt;nolink&gt;[LOCATION]&lt;/nolink&gt;?
+ <usetemplate ignoretext="Potwierdź próbę teleportacji do zapisanego miejsca" name="okcancelignore" notext="Anuluj" yestext="Teleportuj"/>
+ </notification>
+ <notification name="TeleportToPick">
+ Teleportuj do [PICK]?
+ <usetemplate ignoretext="Potwierdź, że chcesz teleportować się do miejsca w Ulubionych" name="okcancelignore" notext="Anuluj" yestext="Teleportuj"/>
+ </notification>
+ <notification name="TeleportToClassified">
+ Teleportuj do [CLASSIFIED]?
+ <usetemplate ignoretext="Potwierdź, że chcesz teleportować się do lokalizacji z reklamy" name="okcancelignore" notext="Anuluj" yestext="Teleportuj"/>
+ </notification>
+ <notification name="TeleportToHistoryEntry">
+ Teleportuj do [HISTORY_ENTRY]?
+ <usetemplate ignoretext="Potwierdź teleportację do lokalizacji z historii" name="okcancelignore" notext="Anuluj" yestext="Teleportuj"/>
+ </notification>
+ <notification label="Wiadomość do Wszystkich w Twoim Majątku" name="MessageEstate">
+ Wpisz krótką wiadomość która zostanie wysłana do wszystkich osób w Twoim majątku.
+ <form name="form">
+ <input name="message"/>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="Anuluj"/>
+ </form>
+ </notification>
+ <notification label="Zmiana Majątku Lindenów" name="ChangeLindenEstate">
+ Czy napewno chcesz zmienić ustawienia majątku Linden (mainland, teen grid, orientacja, itp).
+
+Jest to wyjątkowo niebezpieczna decyzja, odczuwalna przez wszystkich Rezydentów. Dla mainland, spowoduje to zmianę tysięcy regionów oraz ich przestrzeń serwerową.
+
+Kontynuować?
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification label="Zmiana Dostępu do Majątku Lindenów" name="ChangeLindenAccess">
+ Dokonujesz zmiany w liście dostępu Regionu głównego należącego do Lindenów (Regiony Główne, Teen Grid, Orientacja).
+
+Żądana operacja jest wyjątkowo niebezpieczna dla wszystkich Rezydentów przebywających w regionie i powinna być używana wyłącznie w celu zablokowania opcji pozwalającej na przeniesienie obiektów/L$ do/z sieci.
+Dodatkowo, zmiany dokonane w Regionie Głównym mogą spowodować problemy przestrzeni serwerowej innych regionów.
+
+Kontynuować?
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification label="Wybierz Majątek" name="EstateAllowedAgentAdd">
+ Dodać do listy dostępu do tego majątku czy do [ALL_ESTATES]?
+ <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Wszystkie majątki" yestext="Ten majątek"/>
+ </notification>
+ <notification label="Wybierz Majątek" name="EstateAllowedAgentRemove">
+ Usunąć z listy dostępu do tego majątku czy do [ALL_ESTATES]?
+ <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Wszystkie majątki" yestext="Ten majątek"/>
+ </notification>
+ <notification label="Wybierz Majątek" name="EstateAllowedGroupAdd">
+ Dodać do listy dostępu grup do tego majątku czy do [ALL_ESTATES]?
+ <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Wszystkie majątki" yestext="Ten majątek"/>
+ </notification>
+ <notification label="Wybierz Majątek" name="EstateAllowedGroupRemove">
+ Usunąć z listy dostępu grup do tego majątku czy do [ALL_ESTATES]?
+ <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Wszystkie majątki" yestext="Ten majątek"/>
+ </notification>
+ <notification label="Wybierz Majątek" name="EstateBannedAgentAdd">
+ Zablokować dostęp do tego majątku czy do [ALL_ESTATES]?
+ <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Wszystkie majątki" yestext="Ten majątek"/>
+ </notification>
+ <notification label="Wybierz Majątek" name="EstateBannedAgentRemove">
+ Zdjąć tego Rezydenta z listy niepożądanych (bany) dla tego majątku czy dla [ALL_ESTATES]?
+ <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Wszystkie majątki" yestext="Ten majątek"/>
+ </notification>
+ <notification label="Wybierz Majątek" name="EstateManagerAdd">
+ Dodać zarządce majątku do tego majątku czy do [ALL_ESTATES]?
+ <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Wszystkie majątki" yestext="Ten majątek"/>
+ </notification>
+ <notification label="Wybierz Majątek" name="EstateManagerRemove">
+ Usunąć zarządce majątku z tego majątku czy z [ALL_ESTATES]?
+ <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Wszystkie majątki" yestext="Ten majątek"/>
+ </notification>
+ <notification label="Potwierdź Wyrzucenie" name="EstateKickUser">
+ Wyrzucić [EVIL_USER] z tego majątku?
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification name="EstateChangeCovenant">
+ Na pewno chcesz zminić treść umowy dla tego majątku?
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification name="RegionEntryAccessBlocked">
+ Ze względu na Twój wiek, nie jesteś uprawniony do przebywania w tym regionie. Może być to wynikiem braku informacji na temat weryfikacji Twojego wieku.
+
+Upewnij się, że masz zainstalowaną najnowszą wersję klienta i skorzystaj z [SECOND_LIFE]:Pomoc by uzyskać więcej informacji na temat dostępu do regionów z podanym rodzajem treści jaką zawiera.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="RegionEntryAccessBlocked_KB">
+ Ze względu na Twój wiek, nie jesteś uprawniony do przebywania w tym regionie.
+
+Skorzystaj z [SECOND_LIFE]:Pomoc by uzyskać więcej informacji na temat dostępu do regionów z podanym rodzajem treści jaką zawiera.
+ <url name="url">
+ https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=6010
+ </url>
+ <usetemplate ignoretext="Ze względu na Twój wiek, nie jesteś uprawniony do przebywania w tym regionie. Może być to wynikiem braku informacji na temat weryfikacji Twojego wieku." name="okcancelignore" notext="Zamknij" yestext="[SECOND_LIFE]:Pomoc"/>
+ </notification>
+ <notification name="RegionEntryAccessBlocked_Notify">
+ Ze względu na Twój wiek, nie jesteś uprawniony do przebywania w tym regionie.
+ </notification>
+ <notification name="RegionEntryAccessBlocked_Change">
+ Nie masz zezwolenia na przebywanie w tym Regionie z powodu Twojego statusu ustawień wieku.
+
+W celu uzyskania dostępu do tego regiony zmień proszę swój status ustawień wieku. Będziesz mógł/mogła szukać i mieć dostęp do treści [REGIONMATURITY]. W celu cofnięcia zmian wybierz z menu Ja &gt; Ustawienia &gt; Ogólne.
+ <form name="form">
+ <button name="OK" text="Zmień ustawienia"/>
+ <button default="true" name="Cancel" text="Zamknij"/>
+ <ignore name="ignore" text="Moje ustawienia wieku nie dopuszczają do regionu"/>
+ </form>
+ </notification>
+ <notification name="PreferredMaturityChanged">
+ Twoja obecna klasyfikacja wieku to [RATING].
+ </notification>
+ <notification name="LandClaimAccessBlocked">
+ W związku ze statusem ustawień Twojego wieku, nie możesz odzyskać tej posiadłości. Możesz potrzebować weryfikacji wieku bądź instalacji najnowszej wersji klienta.
+
+Upewnij się, że masz zainstalowaną najnowszą wersję klienta i skorzystaj z [SECOND_LIFE]:Pomoc by uzyskać więcej informacji na temat dostępu do regionów z podanym rodzajem treści jaką zawiera.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="LandClaimAccessBlocked_KB">
+ Ze względu na Twój wiek, nie możesz odzyskać tej posiadłości.
+
+Skorzystaj z [SECOND_LIFE]:Pomoc by uzyskać więcej informacji na temat dostępu do regionów z podanym rodzajem treści jaką zawiera.
+ <url name="url">
+ https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=6010
+ </url>
+ <usetemplate ignoretext="W związku ze statusem ustawień Twojego wieku, nie możesz odzyskać tej posiadłości." name="okcancelignore" notext="Zamknij" yestext="[SECOND_LIFE]:Pomoc"/>
+ </notification>
+ <notification name="LandClaimAccessBlocked_Notify">
+ Ze względu na Twój wiek, nie możesz odzyskać tej posiadłości.
+ </notification>
+ <notification name="LandClaimAccessBlocked_Change">
+ W związku ze statusem ustawień Twojego wieku, nie możesz odzyskać tej posiadłości.
+
+Możesz wybrać &apos;Zmień Ustawienia&apos; by dokonać zmian w ustawieniach Twojego wieku by uzyskać dostęp do regionu. Wówczas będziesz w stanie znaleźć oraz mieć dostęp do [REGIONMATURITY] treści. Jeżeli zdecydujesz się na powrót do poprzednich ustawień, wybierz Ja &gt; Ustawienia &gt; Główne.
+ <usetemplate ignoretext="Ze względu na Twój wiek, nie możesz odzyskać tej posiadłości." name="okcancelignore" notext="Zamknij" yestext="Zmień Ustawienia"/>
+ </notification>
+ <notification name="LandBuyAccessBlocked">
+ Ze względu na Twój wiek, nie możesz kupić tej posiadłości. Może być to wynikiem braku informacji na temat weryfikacji Twojego wieku.
+
+Upewnij się, że masz zainstalowaną najnowszą wersję klienta i skorzystaj z [SECOND_LIFE]:Pomoc by uzyskać więcej informacji na temat dostępu do regionów z podanym rodzajem treści jaką zawiera.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="LandBuyAccessBlocked_KB">
+ Ze względu na Twój wiek, nie możesz kupić tej posiadłości.
+
+Skorzystaj z [SECOND_LIFE]:Pomoc by uzyskać więcej informacji na temat dostępu do regionów z podanym rodzajem treści jaką zawiera.
+ <url name="url">
+ https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=6010
+ </url>
+ <usetemplate ignoretext="Ze względu na Twój wiek, nie możesz kupić tej posiadłości." name="okcancelignore" notext="Zamknij" yestext="[SECOND_LIFE]:Pomoc"/>
+ </notification>
+ <notification name="LandBuyAccessBlocked_Notify">
+ Ze względu na Twój wiek, nie możesz kupić tej posiadłości.
+ </notification>
+ <notification name="LandBuyAccessBlocked_Change">
+ W związku ze statusem ustawień Twojego wieku, nie możesz kupić tej posiadłości.
+
+Możesz wybrać &apos;Zmień Ustawienia&apos; by dokonać zmian w ustawieniach Twojego wieku by uzyskać dostęp do regionu. Wówczas będziesz w stanie znaleźć oraz mieć dostęp do [REGIONMATURITY] treści. Jeżeli zdecydujesz się na powrót do poprzednich ustawień, wybierz Ja &gt; Ustawienia &gt; Główne.
+ <usetemplate ignoretext="W związku ze statusem ustawień Twojego wieku, nie możesz kupić tej posiadłości." name="okcancelignore" notext="Zamknij" yestext="Zmień Ustawienia"/>
+ </notification>
+ <notification name="TooManyPrimsSelected">
+ Zbyt wiele wybranych obiektów. Wybierz [MAX_PRIM_COUNT] lub mniej i spróbuj ponownie
+ </notification>
+ <notification name="ProblemImportingEstateCovenant">
+ Problem z importem umowy majątku.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="ProblemAddingEstateManager">
+ Problemy z dodawaniem nowego zarządcy majątku. Jeden lub więcaj majątk może mieć wypełnioną listę zarządców.
+ </notification>
+ <notification name="ProblemAddingEstateGeneric">
+ Problemy z dodawaniem do listy majątku. Jeden lub więcaj majątk może mieć wypełnioną listę.
+ </notification>
+ <notification name="UnableToLoadNotecardAsset">
+ Brak możliwości załadowania noty w tej chwili.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="NotAllowedToViewNotecard">
+ Niewystarczające prawa do zobaczenia notki przypisanej do wybranego ID.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="MissingNotecardAssetID">
+ ID notki nie znalezione w bazie danych.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="PublishClassified">
+ Pamiętaj: Opłaty za reklamę są bezzwrotne.
+
+Zamieścić tą reklamę za [AMOUNT]L$?
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification name="SetClassifiedMature">
+ Czy ta reklama zawiera treść &apos;Mature&apos;?
+ <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Nie" yestext="Tak"/>
+ </notification>
+ <notification name="SetGroupMature">
+ Czy ta grupa zawiera treść &apos;Mature&apos;?
+ <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Nie" yestext="Tak"/>
+ </notification>
+ <notification label="Potwierdź Restart" name="ConfirmRestart">
+ Na pewno chcesz zrobić restart tego regionu za 2 minuty?
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification label="Wiadomość do Wszystkich w tym Regionie" name="MessageRegion">
+ Wpisz krótką wiadomość która zostanie wysłana do wszystkich osób w tym regionie.
+ <form name="form">
+ <input name="message"/>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="Anuluj"/>
+ </form>
+ </notification>
+ <notification label="Zmienione Restrykcje Wieku dla Regionu" name="RegionMaturityChange">
+ Ustawienie restrykcji wieku dla regionu zostało zmienione.
+Zazwyczaj musi upłynąć nieco czasu zanim ta zmiana zostanie odzwierciedlona na mapie.
+
+Aby wejść do regionu Adult, Rezydenci muszą posiadać zweryfikowane konto, albo w wyniku weryfikacji wieku albo płatości.
+ </notification>
+ <notification label="Wersja Niezgodna z Systemem Rozmów" name="VoiceVersionMismatch">
+ Ta wersja [APP_NAME] nie jest kompatybilna z systemem rozmów w tym Regionie. Musisz zainstalować aktualną wersję [APP_NAME] aby komunikacja głosowa działała poprawnie.
+ </notification>
+ <notification label="Nie Można Kupić Obiektów" name="BuyObjectOneOwner">
+ Jednorazowo możesz kupować tylko od jednego właściciela.
+Wybierz pojedynczy obiekt i spróbuj jeszcze raz.
+ </notification>
+ <notification label="Nie Można Kupić Zawartości" name="BuyContentsOneOnly">
+ Jednorazowo możesz kupić zawartość tylko jednego obiektu.
+Wybierz pojedynczy obiekt i spróbuj jeszcze raz.
+ </notification>
+ <notification label="Nie Można Kupić Zawartości" name="BuyContentsOneOwner">
+ Jednorazowo możesz kupować tylko od jednego właściciela.
+Wybierz pojedynczy obiekt i spróbuj jeszcze raz.
+ </notification>
+ <notification name="BuyOriginal">
+ Kupić oryginalny obiekt od [OWNER] za [PRICE]L$?
+Zostaniesz właścicielem tego obiektu z następującymi prawami:
+ Modyfikacje: [MODIFYPERM]
+ Kopiowanie: [COPYPERM]
+ Odsprzedawanie i oddawanie: [RESELLPERM]
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification name="BuyOriginalNoOwner">
+ Kupić oryginalny obiekt za [PRICE]L$?
+Zostaniesz właścicielem tego obiektu z następującymi prawami:
+ Modyfikacje: [MODIFYPERM]
+ Kopiowanie: [COPYPERM]
+ Odsprzedawanie i oddawanie: [RESELLPERM]
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification name="BuyCopy">
+ Kupić kopię obiektu od [OWNER] za [PRICE]L$?
+Obiekt zostanie skopiowany do Twojej szafy z następującymi prawami:
+ Modyfikacje: [MODIFYPERM]
+ Kopiowanie: [COPYPERM]
+ Odsprzedawanie i oddawanie: [RESELLPERM]
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification name="BuyCopyNoOwner">
+ Kupić kopię obiektu za [PRICE]L$?
+Obiekt zostanie skopiowany do Twojej szafy z następującymi prawami:
+ Modyfikacje: [MODIFYPERM]
+ Kopiowanie: [COPYPERM]
+ Odsprzedawanie i oddawanie: [RESELLPERM]
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification name="BuyContents">
+ Kupić zawartość od [OWNER] za [PRICE]L$?
+Zawartość zostanie skopiowana do Twojej szafy.
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification name="BuyContentsNoOwner">
+ Kupić zawartość za [PRICE]L$?
+Zawartość zostanie skopiowana do Twojej szafy.
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmPurchase">
+ Ta transakcja spowoduje:
+[ACTION]
+
+Na pewno chcesz dokonać tego zakupu?
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmPurchasePassword">
+ Ta transakcja spowoduje:
+[ACTION]
+
+Na pewno chcesz dokonać tego zakupu?
+Wpisz hasło ponownie i kliknij OK.
+ <form name="form">
+ <input name="message"/>
+ <button name="ConfirmPurchase" text="OK"/>
+ <button name="Cancel" text="Anuluj"/>
+ </form>
+ </notification>
+ <notification name="SetPickLocation">
+ Uwaga:
+Lokalizacja tego wyboru została zaktualizowana ale pozostałe szczegóły zachowają oryginalne wartości.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="MoveInventoryFromObject">
+ Wybrane obiekty Szafy nie mają praw kopiowania.
+Obiekty zostaną przeniesione do Twojej Szafy, nie zostaną skopiowane.
+
+Przenieść obiekty Szafy?
+ <usetemplate ignoretext="Uprzedź przed przeniesieniem zawartości niekopiowalnej z obiektu" name="okcancelignore" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification name="MoveInventoryFromScriptedObject">
+ Wybrane obiekty Szafy nie mają praw kopiowania.
+Obiekty zostaną przeniesione do Twojej Szafy, nie zostaną skopiowane.
+Ponieważ obiekty zawierają skrypty, przeniesienie obiektów do Twojej Szafy może spowodować niepoprawne działanie skryptów.
+
+Przenieść obiekty szafy?
+ <usetemplate ignoretext="Uprzedź przed przeniesieniem zawartości niekopiowalnej z obiektu, która może uszkodzić skrypty obiektu" name="okcancelignore" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification name="ClickActionNotPayable">
+ Uwaga: Opcja Zapłać obiektowi została wybrana, ale żeby ta opcja działała musi być dodany skrypt z funkcją money().
+ <form name="form">
+ <ignore name="ignore" text="Opcja Zapłać Obiektowi została aktywowana podczas budowania obiektów bez skryptu z funkcją money()."/>
+ </form>
+ </notification>
+ <notification name="OpenObjectCannotCopy">
+ W tym obiekcie nie ma elementów które możesz skopiować.
+ </notification>
+ <notification name="WebLaunchAccountHistory">
+ Przejść na stronę [http://secondlife.com/account/ Dashboard] żeby zobaczyć historię konta?
+ <usetemplate ignoretext="Uruchom przeglądarkę internetową by zobaczyć historię konta" name="okcancelignore" notext="Anuluj" yestext="Idź na stronę"/>
+ </notification>
+ <notification name="ConfirmQuit">
+ Na pewno chcesz skończyć?
+ <usetemplate ignoretext="Na pewno chcesz skończyć?" name="okcancelignore" notext="Nie kończ" yestext="Wyłącz"/>
+ </notification>
+ <notification name="DeleteItems">
+ [QUESTION]
+ <usetemplate ignoretext="Potwierdź, że na pewno chcesz skasować obiekty" name="okcancelignore" notext="Cofnij" yestext="OK"/>
+ </notification>
+ <notification name="HelpReportAbuseEmailLL">
+ Używaj tej opcji do zgłaszania nadużyć [http://secondlife.com/corporate/tos.php Warunków Umowy (Terms of Service)] i [http://secondlife.com/corporate/cs.php Standardów Społeczeństwa (Community Standards)].
+
+Wszystkie zgłoszone nadużycia są badane i rozwiązywane.
+ </notification>
+ <notification name="HelpReportAbuseSelectCategory">
+ Wybierz kategorię dla tego raportu o nadużyciu.
+Określenie kategorii pomoże nam w klasyfikacji i prztwarzaniu raportu.
+ </notification>
+ <notification name="HelpReportAbuseAbuserNameEmpty">
+ Wprowadź imię i nazwisko osoby popełniającej nadużycie.
+Dokładne dane pomogą nam w klasyfikacji i prztwarzaniu raportu.
+ </notification>
+ <notification name="HelpReportAbuseAbuserLocationEmpty">
+ Wprowadź nazwę miejsca gdzie popełniono nadużycie.
+Dokładne dane pomogą nam w klasyfikacji i prztwarzaniu raportu.
+ </notification>
+ <notification name="HelpReportAbuseSummaryEmpty">
+ Wprowadź opis popełnionego nadużycia.
+Dokładne dane pomogą nam w klasyfikacji i prztwarzaniu raportu.
+ </notification>
+ <notification name="HelpReportAbuseDetailsEmpty">
+ Wprowadź szczgółowy opis popełnionego nadużycia.
+Podaj maksymalną ilość szczgółów oraz imiona i nazwiska osób związanych z nadużyciem które zgłaszasz.
+Dokładne dane pomogą nam w klasyfikacji i prztwarzaniu raportu.
+ </notification>
+ <notification name="HelpReportAbuseContainsCopyright">
+ Szanowny Rezydencie,
+
+Jeżeli składasz raport dotyczący naruszenia praw autorskich proszę się upewnić, że robisz to poprawnie:
+
+(1) Przypadek Nadużycia. Możesz złożyć raport jeżeli sądzisz, że Rezydent narusza system przywilejów [SECOND_LIFE], na przykład używając CopyBot lub podobnych narzędzi robiących kopie, naruszając prawa autorskie. Komisja Nadużyć bada wykroczenia i stosuje akcje dyscyplinarne za zachowania sprzeczne z zasadami Warunków Umowy [SECOND_LIFE] [http://secondlife.com/corporate/tos.php Terms of Service] i Standardów Społeczeństwa [http://secondlife.com/corporate/cs.php Community Standards]. Komisja Nadużyć nie zajmuje się i nie odpowiada na żądania usunięcia treści ze środowiska [SECOND_LIFE].
+
+(2) Przypadek DMCA lub Usuwanie Treści. Aby wystąpić z żądaniem o usunięcie treści ze środowiska [SECOND_LIFE] MUSISZ przedłożyć ważne zawiadomienie o nadużyciu zgodne z naszą polityką DMCA [http://secondlife.com/corporate/dmca.php DMCA Policy].
+
+Jeżeli chcesz kontynuować dalej zamknij to okno i dokończ wysyłanie raportu. Może być potrzebny wybór kategorii &apos;CopyBot albo Nadużycie Przywilejów&apos;.
+
+Dziękujemy,
+
+Linden Lab
+ </notification>
+ <notification name="FailedRequirementsCheck">
+ Brak następujących wymaganych komponentów w [FLOATER]:
+[COMPONENTS]
+ </notification>
+ <notification label="Zamień Istniejący Dodatek" name="ReplaceAttachment">
+ Obecnie masz już dołączony obiekt do tej części Twojego ciała.
+Chcesz go zamienić na wybrany obiekt?
+ <form name="form">
+ <ignore name="ignore" save_option="true" text="Obecnie masz już dołączony obiekt do tej części Twojego ciała.Chcesz go zamienić na wybrany obiekt?"/>
+ <button ignore="Zamień automatycznie" name="Yes" text="OK"/>
+ <button ignore="Nie zamieniaj" name="No" text="Anuluj"/>
+ </form>
+ </notification>
+ <notification label="Ostrzeżenie Trybu Pracy" name="BusyModePay">
+ Jesteś w Trybie pracy co oznacza, że nie dostaniesz żadnych obiektów w zamian za tą opłatę.
+
+Chcesz wyłączyć Tryb pracy przed zakończeniem tej tranzakcji?
+ <form name="form">
+ <ignore name="ignore" save_option="true" text="Jesteś w Trybie Pracy co oznacza, że nie dostaniesz żadnych obiektów w zamian za tą opłatę. Chcesz wyłączyć Tryb Pracy przed zakończeniem tej transakcji?"/>
+ <button ignore="Zawsz wyłączaj tryb pracy" name="Yes" text="OK"/>
+ <button ignore="Nie wyłączaj trybu pracy" name="No" text="Anuluj"/>
+ </form>
+ </notification>
+ <notification name="ConfirmDeleteProtectedCategory">
+ Ten folder &apos;[FOLDERNAME]&apos; to folder systemowy. Usunięcie foldera systemowego spowoduje niestabilność. Czy na pewno chcesz go skasować?
+ <usetemplate ignoretext="Potwierdź zanim folder systemu zostanie skasowany" name="okcancelignore" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmEmptyTrash">
+ Na pewno chcesz permanentnie usunąć zawartość Kosza?
+ <usetemplate ignoretext="Potwierdź przed usunięciem zawartości Kosza" name="okcancelignore" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmClearBrowserCache">
+ Na pewno chcesz wyczyścić bufor przeglądarki?
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmClearCookies">
+ Na pewno chcesz wyczyścić ciasteczka?
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="Tak"/>
+ </notification>
+ <notification name="ConfirmClearMediaUrlList">
+ Na pewno chcesz wyczyścić listę zapisanych linków?
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="Tak"/>
+ </notification>
+ <notification name="ConfirmEmptyLostAndFound">
+ Na pewno chcesz permanentnie usunąć zawartość Twojego foldera Zgubione i odnalezione?
+ <usetemplate ignoretext="Potwierdź przed usunięciem zawartości foldera Zagubione i odnalezione" name="okcancelignore" notext="Nie" yestext="Tak"/>
+ </notification>
+ <notification name="CopySLURL">
+ Następujący link SLURL został skopiowany do schowka:
+ [SLURL]
+
+Zamieść go na stronie internetowej żeby umożliwić innym łatwy dostęp do tego miejsca, albo wklej go do panela adresu Twojej przeglądarki żeby go otworzyć.
+ <form name="form">
+ <ignore name="ignore" text="SLurl skopiowany do schowka"/>
+ </form>
+ </notification>
+ <notification name="WLSavePresetAlert">
+ Chcesz zmienić zapisane ustawienia?
+ <usetemplate name="okcancelbuttons" notext="Nie" yestext="Tak"/>
+ </notification>
+ <notification name="WLDeletePresetAlert">
+ Chcesz usunąć [SKY]?
+ <usetemplate name="okcancelbuttons" notext="Nie" yestext="Tak"/>
+ </notification>
+ <notification name="WLNoEditDefault">
+ Nie możesz edytować lub usunąć domyślnych ustawień.
+ </notification>
+ <notification name="WLMissingSky">
+ Ten plik cyklu dziennego używa brakującego pliku nieba: [SKY].
+ </notification>
+ <notification name="PPSaveEffectAlert">
+ Efekt post-procesu już istnieje. Chcesz zapisać nowy na jego miejsce?
+ <usetemplate name="okcancelbuttons" notext="Nie" yestext="Tak"/>
+ </notification>
+ <notification name="NewSkyPreset">
+ Nazwij nowe niebo.
+ <form name="form">
+ <input name="message">
+ Nowe ustawienie
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="Anuluj"/>
+ </form>
+ </notification>
+ <notification name="ExistsSkyPresetAlert">
+ Ustawienie już istnieje!
+ </notification>
+ <notification name="NewWaterPreset">
+ Nazwij nowe ustawienie wody.
+ <form name="form">
+ <input name="message">
+ Nowe ustawienie
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="Anuluj"/>
+ </form>
+ </notification>
+ <notification name="ExistsWaterPresetAlert">
+ Ustawienie już istnieje!
+ </notification>
+ <notification name="WaterNoEditDefault">
+ Domyślne ustawienie nie może być zmienione ani usunięte.
+ </notification>
+ <notification name="ChatterBoxSessionStartError">
+ Błąd podczas rozpoczynania czatu/IM z [RECIPIENT].
+[REASON]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="ChatterBoxSessionEventError">
+ [EVENT]
+[REASON]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="ForceCloseChatterBoxSession">
+ Twój czat/IM z [NAME] zostanie zamknięty.
+[REASON]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="Cannot_Purchase_an_Attachment">
+ Rzeczy nie mogą być kupione jeżeli są częścią załącznika.
+ </notification>
+ <notification label="Prośba o Zgodę na Pobieranie L$" name="DebitPermissionDetails">
+ Akceptując tą prośbę wyrażasz zgodę na ciągłe pobieranie Lindenów (L$) z Twojego konta. Żeby cofnąć to pozwolenie właściciel obiektu będzie musiał usunąć ten obiekt albo zresetowć skrypty obieku.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="AutoWearNewClothing">
+ Czy chcesz automatycznie nosić ubranie które tworzysz?
+ <usetemplate ignoretext="Załóż ubranie automatycznie będąc w trybie Edycji Wyglądu" name="okcancelignore" notext="Nie" yestext="Tak"/>
+ </notification>
+ <notification name="NotAgeVerified">
+ Nie masz dostępu do tej posiadłości ze względu na brak weryfikacji Twojego wieku. Czy chcesz odwiedzić stronę [SECOND_LIFE] żeby to zmienić?
+
+[_URL]
+ <url name="url" option="0">
+ https://secondlife.com/account/verification.php
+ </url>
+ <usetemplate ignoretext="Brak weryfikacji wieku" name="okcancelignore" notext="Nie" yestext="Tak"/>
+ </notification>
+ <notification name="Cannot enter parcel: no payment info on file">
+ Nie masz dostępu do tej posiadłości ze względu na brak danych o Twoim koncie. Czy chcesz odwiedzić stronę [SECOND_LIFE] żeby to zmienić?
+
+[_URL]
+ <url name="url" option="0">
+ https://secondlife.com/account/
+ </url>
+ <usetemplate ignoretext="Brak danych o koncie" name="okcancelignore" notext="Nie" yestext="Tak"/>
+ </notification>
+ <notification name="MissingString">
+ Zdanie [STRING_NAME] nie znalezione w strings.xml
+ </notification>
+ <notification name="SystemMessageTip">
+ [MESSAGE]
+ </notification>
+ <notification name="IMSystemMessageTip">
+ [MESSAGE]
+ </notification>
+ <notification name="Cancelled">
+ Anulowane
+ </notification>
+ <notification name="CancelledSit">
+ Siadanie anulowane
+ </notification>
+ <notification name="CancelledAttach">
+ Dołączenie anulowane
+ </notification>
+ <notification name="ReplacedMissingWearable">
+ Barkujące ubranie/części ciała zastąpiono domyślnymi obiektami.
+ </notification>
+ <notification name="GroupNotice">
+ Temat: [SUBJECT], Treść: [MESSAGE]
+ </notification>
+ <notification name="FriendOnline">
+ [NAME] jest w Second Life
+ </notification>
+ <notification name="FriendOffline">
+ [NAME] opuszcza Second Life
+ </notification>
+ <notification name="AddSelfFriend">
+ Nie możesz dodać siebie do listy znajomych.
+ </notification>
+ <notification name="UploadingAuctionSnapshot">
+ Ładowanie obrazu z Internetu...
+(Zajmuje około 5 minut.)
+ </notification>
+ <notification name="UploadPayment">
+ Ładowanie kosztowało [AMOUNT]L$.
+ </notification>
+ <notification name="UploadWebSnapshotDone">
+ Ładowanie obrazu z Internetu zakończne pomyślnie.
+ </notification>
+ <notification name="UploadSnapshotDone">
+ Ładowanie zdjęcia zakończone pomyślnie.
+ </notification>
+ <notification name="TerrainDownloaded">
+ Plik terrain.raw ściągniety.
+ </notification>
+ <notification name="GestureMissing">
+ Gesturka [NAME] nie znaleziony w bazie danych.
+ </notification>
+ <notification name="UnableToLoadGesture">
+ Ładowanie gesturki [NAME] nie powiodło się.
+ </notification>
+ <notification name="LandmarkMissing">
+ Miejsce (LM) nie znalezione w bazie danych.
+ </notification>
+ <notification name="UnableToLoadLandmark">
+ Ładowanie miejsca (LM) nie powiodło się.
+Spróbuj jeszcze raz.
+ </notification>
+ <notification name="CapsKeyOn">
+ Twój Caps Lock jest włączony.
+Ponieważ to ma wpływ na wpisywane hasło, możesz chcieć go wyłączyć.
+ </notification>
+ <notification name="NotecardMissing">
+ Notka nie została znaleziona w bazie danych.
+ </notification>
+ <notification name="NotecardNoPermissions">
+ Nie masz pozwolenia na zobaczenie notki.
+ </notification>
+ <notification name="RezItemNoPermissions">
+ Nie masz pozwolenia na stworzenie obiektu.
+ </notification>
+ <notification name="UnableToLoadNotecard">
+ Nie można załadować danych notki w tym momencie.
+ </notification>
+ <notification name="ScriptMissing">
+ Skrypt nie znaleziony w bazie danych.
+ </notification>
+ <notification name="ScriptNoPermissions">
+ Nie masz pozwolenia na zobaczenie skryptu.
+ </notification>
+ <notification name="UnableToLoadScript">
+ Ładowanie skryptu nie powiodło się.
+Spróbuj jeszcze raz.
+ </notification>
+ <notification name="IncompleteInventory">
+ Zawartość obiektów którą chcesz podarować nie jest dostępna lokalnie. Spróbuj podarować te obiekty jeszcze raz za jakiś czas.
+ </notification>
+ <notification name="CannotModifyProtectedCategories">
+ Nie możesz zmienić chronionych kategorii.
+ </notification>
+ <notification name="CannotRemoveProtectedCategories">
+ Nie możesz usunąć chronionych kategorii.
+ </notification>
+ <notification name="UnableToBuyWhileDownloading">
+ Nie można kupować w trakcie ładowania danych obiektu.
+Spróbuj jeszcze raz.
+ </notification>
+ <notification name="UnableToLinkWhileDownloading">
+ Nie można łączyć w trakcie ładowania danych obiektu.
+Spróbuj jeszcze raz.
+ </notification>
+ <notification name="CannotBuyObjectsFromDifferentOwners">
+ Nie możesz jednocześnie kupować obiektów od różnych osób.
+Wybierz jeden obiekt.
+ </notification>
+ <notification name="ObjectNotForSale">
+ Obiekt nie jest na sprzedaż.
+ </notification>
+ <notification name="EnteringGodMode">
+ Włącznie trybu boskiego, poziom [LEVEL]
+ </notification>
+ <notification name="LeavingGodMode">
+ Wyłączanie trybu boskiego, poziom [LEVEL]
+ </notification>
+ <notification name="CopyFailed">
+ Nie masz praw do skopiowania wybranych obiektów.
+ </notification>
+ <notification name="InventoryAccepted">
+ Podarunek od Ciebie został przyjęty przez [NAME].
+ </notification>
+ <notification name="InventoryDeclined">
+ Podarunek od Ciebie został odrzucony przez [NAME].
+ </notification>
+ <notification name="ObjectMessage">
+ [NAME]: [MESSAGE]
+ </notification>
+ <notification name="CallingCardAccepted">
+ Twoja wizytówka została przyjęta.
+ </notification>
+ <notification name="CallingCardDeclined">
+ Twoja wizytówka została odrzucona.
+ </notification>
+ <notification name="TeleportToLandmark">
+ Jesteś w Głównym Regionie i możesz się stąd teleportować do innych miejsc jak &apos;[NAME]&apos; wybierając Moja Szafa w prawym dolnym rogu ekranu
+i wybierając folder Zapisane Miejsca (LM).
+(Kliknij dwa razy na miejsce (LM) i wybierz &apos;Teleport&apos; żeby tam się przenieść.)
+ </notification>
+ <notification name="TeleportToPerson">
+ Możesz skontaktować się z Rezydentem &apos;[NAME]&apos; poprzez otworzenie panelu Ludzie po prawej stronie ekranu.
+Wybierz Rezydenta z listy, następnie kliknij &apos;IM&apos; na dole panelu.
+(Możesz także kliknąć podwójnie na ich imię na liście, lub prawym przyciskiem i wybrać &apos;IM&apos;).
+ </notification>
+ <notification name="CantSelectLandFromMultipleRegions">
+ Nie możesz przekraczać granic serwera wybierając obszar.
+Spróbuj wybrać mniejszy obszar.
+ </notification>
+ <notification name="SearchWordBanned">
+ Pewne frazy podczas wyszukiwania zostały usunięte w związku z restrykcjami zawartymi w Standardach Społecznościowych (Community Standards).
+ </notification>
+ <notification name="NoContentToSearch">
+ Proszę wybrać przynajmiej jeden z podanych rodzajów treści jaką zawiera region podczas wyszukiwania (&apos;General&apos;, &apos;Moderate&apos;, lub &apos;Adult&apos;).
+ </notification>
+ <notification name="SystemMessage">
+ [MESSAGE]
+ </notification>
+ <notification name="PaymentReceived">
+ [MESSAGE]
+ </notification>
+ <notification name="PaymentSent">
+ [MESSAGE]
+ </notification>
+ <notification name="EventNotification">
+ Zawiadomienie o imprezie:
+
+[NAME]
+[DATE]
+ <form name="form">
+ <button name="Details" text="Szczegóły"/>
+ <button name="Cancel" text="Anuluj"/>
+ </form>
+ </notification>
+ <notification name="TransferObjectsHighlighted">
+ Obiekty na tej posiadłości które zostaną przekazane kupcowi tej posiadłości są teraz rozjaśnione.
+
+* Drzewa i trawy które zostaną przekazne nie są rozjaśnione.
+ <form name="form">
+ <button name="Done" text="Zastosuj"/>
+ </form>
+ </notification>
+ <notification name="DeactivatedGesturesTrigger">
+ Zablokowane gesturki z jednakowym aktywowaniem:
+[NAMES]
+ </notification>
+ <notification name="NoQuickTime">
+ Wygląda na to, że QuickTime z Apple nie jest zainstalowany na Twoim komputerze.
+Jeżeli chcesz odtwarzać media na tej posiadłości które używają QuickTime idź do [http://www.apple.com/quicktime strona QuickTime] i zainstaluj odtwarzacz.
+ </notification>
+ <notification name="NoPlugin">
+ Nie znaleziono wtyczki mediów dla &quot;[MIME_TYPE]&quot; typu mime. Media tego typu będą niedostępne.
+ </notification>
+ <notification name="MediaPluginFailed">
+ Następujące wtyczki mediów nie działają:
+ [PLUGIN]
+
+Zainstaluj proszę wtyczki ponownie lub skontaktuj się z dostawcą jeśli nadal problem będzie występował.
+ <form name="form">
+ <ignore name="ignore" text="Wtyczka mediów nie działa"/>
+ </form>
+ </notification>
+ <notification name="OwnedObjectsReturned">
+ Twoje obiekty z wybranej posiadłości zostały zwrócone do Twojej Szafy.
+ </notification>
+ <notification name="OtherObjectsReturned">
+ Obiekty należące do [NAME] na wybranej posiadłości zostały zwrócone do Szafy tej osoby.
+ </notification>
+ <notification name="OtherObjectsReturned2">
+ Obiekty z posiadłości należącej do Rezydenta&apos;[NAME]&apos; zostały zwrócone do właściciela.
+ </notification>
+ <notification name="GroupObjectsReturned">
+ Obiekty z wybranej posiadłości przypisane do grupy [GROUPNAME] zostały zwrócone do szafy ich właścicieli.
+Przekazywalne obiekty przekazne grupie zostały zwrócone do ich poprzednich właścicieli.
+Nieprzekazywalne obiekty przekazane grupie zostały usunięte.
+ </notification>
+ <notification name="UnOwnedObjectsReturned">
+ Obiekty z wybranej posiadłości które nie należą do Ciebie zostały zwrócone do ich właścicieli.
+ </notification>
+ <notification name="ServerObjectMessage">
+ Wiadomość od [NAME]:
+&lt;nolink&gt;[MSG]&lt;/nolink&gt;
+ </notification>
+ <notification name="NotSafe">
+ Ta posiadłość pozwala na uszkodzenia.
+Możesz doznać tutaj urazu. Jeżeli zginiesz nastąpi teleportacja do Twojego miejsca startu.
+ </notification>
+ <notification name="NoFly">
+ Ta posiadłość nie pozwala na latanie.
+Nie możesz tutaj latać.
+ </notification>
+ <notification name="PushRestricted">
+ Popychanie niedozwolone. Nie możesz tutaj popychać innych, chyba, że jesteś właścicielem tej posiadłości.
+ </notification>
+ <notification name="NoVoice">
+ Ta posiadłość nie pozwala na rozmowy.
+ </notification>
+ <notification name="NoBuild">
+ Ta posiadłość nie pozwala na budowanie. Nie możesz tworzyć tutaj obiektów.
+ </notification>
+ <notification name="ScriptsStopped">
+ Administrator czasowo zatrzymał skrypty w tym regionie.
+ </notification>
+ <notification name="ScriptsNotRunning">
+ Żadne skrypty nie działają w tym regionie.
+ </notification>
+ <notification name="NoOutsideScripts">
+ Ta posiadłość nie pozwala na zewnętrzne skrypty.
+
+Żadne skrypty nie będą tutaj działać za wyjątkiem skryptów należących do właściciela posiadłości.
+ </notification>
+ <notification name="ClaimPublicLand">
+ Tylko publiczne posiadłości w tym regionie mogą być przejęte.
+ </notification>
+ <notification name="RegionTPAccessBlocked">
+ Ze względu na Twój wiek, nie jesteś uprawniony do przebywania w tym regionie. Możesz potrzebować weryfikacji wieku bądź instalacji najnowszej wersji klienta.
+
+Skorzystaj z [SECOND_LIFE]:Pomoc by uzyskać więcej informacji na temat dostępu do regionów z podanym rodzajem treści jaką zawiera.
+ </notification>
+ <notification name="URBannedFromRegion">
+ Zostałeś zbanowany w regionie.
+ </notification>
+ <notification name="NoTeenGridAccess">
+ Twoje konto nie może zostać połączone z podanym regionem Teen Grid.
+ </notification>
+ <notification name="ImproperPaymentStatus">
+ Nie posiadasz odpowiedniego statusu płatniczego by uzyskać dostęp do regionu.
+ </notification>
+ <notification name="MustGetAgeParcel">
+ By móc przebywać na tej posiadłości wymagana jest weryfikacja Twojego wieku.
+ </notification>
+ <notification name="NoDestRegion">
+ Żądana lokalizacja regionu nie została odnaleziona.
+ </notification>
+ <notification name="NotAllowedInDest">
+ Brak dostępu do podanej lokalizacji.
+ </notification>
+ <notification name="RegionParcelBan">
+ Nie możesz przejść przez zamkniętą posiadłość. Spróbuj skorzystać z innej drogi.
+ </notification>
+ <notification name="TelehubRedirect">
+ Zostałeś przeniesiony do teleportera.
+ </notification>
+ <notification name="CouldntTPCloser">
+ Brak możliwości teleportacji do bliższej lokacji.
+ </notification>
+ <notification name="TPCancelled">
+ Teleportacja anulowana.
+ </notification>
+ <notification name="FullRegionTryAgain">
+ Region, który chcesz odwiedzić jest w tej chwili pełny.
+Spróbuj ponowanie za kilka minut.
+ </notification>
+ <notification name="GeneralFailure">
+ Nieudana próba.
+ </notification>
+ <notification name="RoutedWrongRegion">
+ Wysłano niewłaściwe połączenie do regionu. Proszę spróbować ponownie.
+ </notification>
+ <notification name="NoValidAgentID">
+ Nieważny identyfikator agenta.
+ </notification>
+ <notification name="NoValidSession">
+ Nieważny identyfikator sesji.
+ </notification>
+ <notification name="NoValidCircuit">
+ Nieważny obwód kodowania.
+ </notification>
+ <notification name="NoValidTimestamp">
+ Niewłaściwy czas zapisu.
+ </notification>
+ <notification name="NoPendingConnection">
+ Brak możliwości wykonania połączenia.
+ </notification>
+ <notification name="InternalUsherError">
+ Podczas teleportacji nastąpił błąd wewnętrzny, który może być wynikiem problemów serwera.
+ </notification>
+ <notification name="NoGoodTPDestination">
+ Brak lokalizacji punktu do teleportacji w podanym regionie.
+ </notification>
+ <notification name="InternalErrorRegionResolver">
+ Podczas próby odnalezienia globalnych współrzędych dla żądanej teleportacji pojawił się wewnętrzny błąd. Może być to wynikiem problemów serwera.
+ </notification>
+ <notification name="NoValidLanding">
+ Nieważny punkt lądowania.
+ </notification>
+ <notification name="NoValidParcel">
+ Nieważana posiadłość.
+ </notification>
+ <notification name="ObjectGiveItem">
+ Obiekt o nazwie &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt;, którego właścicielem jest [NAME_SLURL] oferuje Tobie [ITEM_SLURL]. Korzystanie z tego obieku wymaga przelączenia się na tryb zaawansowany, w którym będzie można odszukać obiekt w Twojej Szafie. W celu przełączenia trybu życia na zaawansowany, zamknij i uruchom ponownie aplikację. Przed ponownym zalogowaniem zmień tryb życia na ekranie logowania.
+ <form name="form">
+ <button name="Keep" text="Zaakceptuj obiekt"/>
+ <button name="Discard" text="Odrzuć obiekt"/>
+ <button name="Mute" text="Zablokuj obiekt"/>
+ </form>
+ </notification>
+ <notification name="UserGiveItem">
+ [NAME_SLURL] proponuje Tobie [ITEM_SLURL]. Korzystanie z tego obieku wymaga przelączenia się na tryb zaawansowany, w którym będzie można odszukać obiekt w Twojej Szafie. W celu przełączenia trybu życia na zaawansowany, zamknij i uruchom ponownie aplikację. Przed ponownym zalogowaniem zmień tryb życia na ekranie logowania.
+ <form name="form">
+ <button name="Show" text="Zaakceptuj obiekt"/>
+ <button name="Discard" text="Odrzuć obiekt"/>
+ <button name="Mute" text="Zablokuj użytkownika"/>
+ </form>
+ </notification>
+ <notification name="GodMessage">
+ [NAME]
+
+[MESSAGE]
+ </notification>
+ <notification name="JoinGroup">
+ [MESSAGE]
+ <form name="form">
+ <button name="Join" text="Zaakceptuj"/>
+ <button name="Decline" text="Odmów"/>
+ <button name="Info" text="Info"/>
+ </form>
+ </notification>
+ <notification name="TeleportOffered">
+ [NAME_SLURL] proponuje Ci teleportację do siebie:
+
+[MESSAGE] - [MATURITY_STR] &lt;icon&gt;[MATURITY_ICON]&lt;/icon&gt;
+ <form name="form">
+ <button name="Teleport" text="Teleportuj"/>
+ <button name="Cancel" text="Anuluj"/>
+ </form>
+ </notification>
+ <notification name="TeleportOfferSent">
+ Oferta teleportacji wysłana do [TO_NAME]
+ </notification>
+ <notification name="GotoURL">
+ [MESSAGE]
+[URL]
+ <form name="form">
+ <button name="Later" text="Póżniej"/>
+ <button name="GoNow..." text="Teraz..."/>
+ </form>
+ </notification>
+ <notification name="OfferFriendship">
+ [NAME_SLURL] proponuje znajomość.
+
+[MESSAGE]
+
+(Będziecie mogli widzieć swój status online)
+ <form name="form">
+ <button name="Accept" text="Zaakceptuj"/>
+ <button name="Decline" text="Odmów"/>
+ </form>
+ </notification>
+ <notification name="FriendshipOffered">
+ Oferta znajomości dla [TO_NAME]
+ </notification>
+ <notification name="OfferFriendshipNoMessage">
+ [NAME_SLURL] proponuje Ci znajomość.
+
+(Z zalożenia będzie widzić swój status online.)
+ <form name="form">
+ <button name="Accept" text="Zaakceptuj"/>
+ <button name="Decline" text="Odmów"/>
+ </form>
+ </notification>
+ <notification name="FriendshipAccepted">
+ Twoja propozycja znajomości została przyjęta przez [NAME].
+ </notification>
+ <notification name="FriendshipDeclined">
+ Twoja propozycja znajomości została odrzucona przez [NAME].
+ </notification>
+ <notification name="FriendshipAcceptedByMe">
+ Propozycja znajomości została zaakceptowana.
+ </notification>
+ <notification name="FriendshipDeclinedByMe">
+ Propozycja znajomości została odrzucona.
+ </notification>
+ <notification name="OfferCallingCard">
+ [NAME] oferuje swoją wizytówkę.
+Wizytówka w Twojej Szafie umożliwi szybki kontakt IM z tym Rezydentem.
+ <form name="form">
+ <button name="Accept" text="Zaakceptuj"/>
+ <button name="Decline" text="Odmów"/>
+ </form>
+ </notification>
+ <notification name="RegionRestartMinutes">
+ Restart regionu za [MINUTES] min.
+Nastąpi wylogowanie jeżeli zostaniesz w tym regionie.
+ </notification>
+ <notification name="RegionRestartSeconds">
+ Restart regionu za [SECONDS] sec.
+Nastąpi wylogowanie jeżeli zostaniesz w tym regionie.
+ </notification>
+ <notification name="LoadWebPage">
+ Załadować stronę [URL]?
+
+[MESSAGE]
+
+Od obiektu: &lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;, właściciel właściciel: [NAME]?
+ <form name="form">
+ <button name="Gotopage" text="Załaduj"/>
+ <button name="Cancel" text="Anuluj"/>
+ </form>
+ </notification>
+ <notification name="FailedToFindWearableUnnamed">
+ [TYPE] - nie znaleziono w bazie danych.
+ </notification>
+ <notification name="FailedToFindWearable">
+ [TYPE] [DESC] - nie znaleziono w bazie danych.
+ </notification>
+ <notification name="InvalidWearable">
+ Obiekt, który chcesz założyć używa narzędzia nieobecnego w wersji klienta, którą używasz. By go założyć ściągnij najnowszą wersję [APP_NAME].
+ </notification>
+ <notification name="ScriptQuestion">
+ Obiekt &apos;&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;&apos;, którego właścicielem jest &apos;[NAME]&apos;, chciałby:
+
+[QUESTIONS]
+Czy się zgadzasz?
+ <form name="form">
+ <button name="Yes" text="Tak"/>
+ <button name="No" text="Nie"/>
+ <button name="Mute" text="Zablokuj"/>
+ </form>
+ </notification>
+ <notification name="ScriptQuestionCaution">
+ Obiekt &apos;&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;&apos;, którego właścicielem jest &apos;[NAME]&apos; chciałby:
+
+[QUESTIONS]
+Jeśli nie ufasz temu obiektowi i jego kreatorowi, odmów.
+
+Czy się zgadzasz?
+ <form name="form">
+ <button name="Grant" text="Zaakceptuj"/>
+ <button name="Deny" text="Odmów"/>
+ <button name="Details" text="Szczegóły..."/>
+ </form>
+ </notification>
+ <notification name="ScriptDialog">
+ [NAME]&apos;s &apos;&lt;nolink&gt;[TITLE]&lt;/nolink&gt;&apos;
+[MESSAGE]
+ <form name="form">
+ <button name="Ignore" text="Zignoruj"/>
+ </form>
+ </notification>
+ <notification name="ScriptDialogGroup">
+ [GROUPNAME]&apos;s &apos;&lt;nolink&gt;[TITLE]&lt;/nolink&gt;&apos;
+[MESSAGE]
+ <form name="form">
+ <button name="Ignore" text="Zignoruj"/>
+ </form>
+ </notification>
+ <notification name="BuyLindenDollarSuccess">
+ Dziękujemy za wpłatę!
+
+Twój stan konta L$ zostanie zaktualizowany w momencie zakończenia transakcji. Jeżeli w ciągu 20 minut, Twój balans konta nie ulegnie zmianie, transakcja została anulowana. W tym przypadku, pobrana kwota zostanie zwrócona na stan konta w US$.
+
+Status transkacji możesz sprawdzić odwiedzając Historię Transakcji swojego konta na [http://secondlife.com/account/ Dashboard]
+ </notification>
+ <notification name="FirstOverrideKeys">
+ Twoje sterujące klawisze zostały przejęte przez obiekt.
+Użyj strzałek lub AWSD żeby sprawdzić ich działanie.
+Niektóre obiekty (np broń) wymagają trybu panoramicznego.
+Nacisnij &apos;M&apos; żeby go wybrać.
+ </notification>
+ <notification name="FirstSandbox">
+ Ten region to piaskownica.
+
+Obiekty które tu zbudujesz mogą zostać usunięte jak opuścisz ten obszar - piaskownice są regularnie czyszczone, sprawdź informacje na górze ekranu obok nazwy regionu.
+ </notification>
+ <notification name="MaxListSelectMessage">
+ Maksymalnie możesz wybrać [MAX_SELECT] rzeczy
+z tej listy.
+ </notification>
+ <notification name="VoiceInviteP2P">
+ [NAME] zaprasza Cię do rozmowy głosem.
+Wybierz Zaakceptuj żeby rozmawiać albo Odmów żeby nie przyjąć zaproszenia.
+Wybierz Zablokuj żeby wyciszyć dzwoniącą osób
+ <form name="form">
+ <button name="Accept" text="Zaakceptuj"/>
+ <button name="Decline" text="Odmów"/>
+ <button name="Mute" text="Zablokuj"/>
+ </form>
+ </notification>
+ <notification name="AutoUnmuteByIM">
+ Wysłano [NAME] prywatną wiadomość i ta osoba została automatycznie odblokowana.
+ </notification>
+ <notification name="AutoUnmuteByMoney">
+ Przekazano [NAME] pieniądze i ta osoba została automatycznie odblokowana.
+ </notification>
+ <notification name="AutoUnmuteByInventory">
+ Zaoferowno [NAME] obiekty i ta osoba została automatycznie odblokowana.
+ </notification>
+ <notification name="VoiceInviteGroup">
+ [NAME] zaczyna rozmowę z grupą [GROUP].
+Wybierz Zaakceptuj żeby rozmawiać albo Odmów żeby nie przyjąć zaproszenia. Wybierz Zablokuj żeby wyciszyć dzwoniącą osobę.
+ <form name="form">
+ <button name="Accept" text="Zaakceptuj"/>
+ <button name="Decline" text="Odmów"/>
+ <button name="Mute" text="Zablokuj"/>
+ </form>
+ </notification>
+ <notification name="VoiceInviteAdHoc">
+ [NAME] zaczyna konferencję głosem.
+Wybierz Zaakceptuj żeby rozmawiać albo Odmów żeby nie przyjąć zaproszenia. Wybierz Zablokuj żeby wyciszyć dzwoniącą osobę.
+ <form name="form">
+ <button name="Accept" text="Zaakceptuj"/>
+ <button name="Decline" text="Odmów"/>
+ <button name="Mute" text="Zablokuj"/>
+ </form>
+ </notification>
+ <notification name="InviteAdHoc">
+ [NAME] zaprasza Cię do konferencji poprzez Czat/IM.
+Wybierz Zaakceptuj żeby zacząć czat albo Odmów żeby nie przyjąć zaproszenia. Wybierz Zablokuj żeby wyciszyć tą osobę.
+ <form name="form">
+ <button name="Accept" text="Zaakceptuj"/>
+ <button name="Decline" text="Odmów"/>
+ <button name="Mute" text="Block"/>
+ </form>
+ </notification>
+ <notification name="VoiceChannelFull">
+ Rozmowa w której chcesz uczestniczyć, [VOICE_CHANNEL_NAME], nie akceptuje więcej rozmówców. Spróbuj póżniej.
+ </notification>
+ <notification name="ProximalVoiceChannelFull">
+ Przepraszamy. Limit rozmów został przekroczony w tym obszarze. Spróbuj w innym miejscu.
+ </notification>
+ <notification name="VoiceChannelDisconnected">
+ [VOICE_CHANNEL_NAME] odłączył się. Przełączanie do rozmowy przestrzennej.
+ </notification>
+ <notification name="VoiceChannelDisconnectedP2P">
+ [VOICE_CHANNEL_NAME] skończył rozmowę. Przełączanie do rozmowy przestrzennej.
+ </notification>
+ <notification name="P2PCallDeclined">
+ [VOICE_CHANNEL_NAME] odmówił połączenia. Przełączanie do rozmowy przestrzennej.
+ </notification>
+ <notification name="P2PCallNoAnswer">
+ [VOICE_CHANNEL_NAME] nie odpowiada. Przełączanie do rozmowy przestrzennej.
+ </notification>
+ <notification name="VoiceChannelJoinFailed">
+ Brak połączenia z [VOICE_CHANNEL_NAME], spróbuj póżniej. Przełączanie do rozmowy przestrzennej.
+ </notification>
+ <notification name="VoiceLoginRetry">
+ Tworzymy kanał głosu dla Ciebie. Moze potrwać minutę.
+ </notification>
+ <notification name="VoiceEffectsExpired">
+ Subskrypcja jednego lub więcej z Voice Morph wygasła.
+[[URL] Kliknij tutaj] oby odnowić subskrypcję.
+ </notification>
+ <notification name="VoiceEffectsExpiredInUse">
+ Czas aktywności Voice Morph wygasł, normalne ustawienia Twojego głosu zostały zastosowane.
+[[URL] Kliknij tutaj] aby odnowić subskrypcję.
+ </notification>
+ <notification name="VoiceEffectsWillExpire">
+ Jedno lub więcej z Twoich Voice Morph wygaśnie za mniej niż [INTERVAL] dni.
+[[URL] Klinij tutaj] aby odnowić subskrypcję.
+ </notification>
+ <notification name="VoiceEffectsNew">
+ Nowe Voice Morph są dostępne!
+ </notification>
+ <notification name="Cannot enter parcel: not a group member">
+ Nie masz dostępu do posiadłości, nie należysz do właściwej grupy.
+ </notification>
+ <notification name="Cannot enter parcel: banned">
+ Masz wzbroniony wstęp na tą posiadłości (ban).
+ </notification>
+ <notification name="Cannot enter parcel: not on access list">
+ Nie masz dostępu do posiadłości, nie jesteś na liście dostępu.
+ </notification>
+ <notification name="VoiceNotAllowed">
+ Nie masz pozwolenia na połączenie z rozmową [VOICE_CHANNEL_NAME].
+ </notification>
+ <notification name="VoiceCallGenericError">
+ Błąd podczas łączenia z rozmową [VOICE_CHANNEL_NAME]. Spróbuj póżniej.
+ </notification>
+ <notification name="UnsupportedCommandSLURL">
+ Nie można otworzyć wybranego SLurl.
+ </notification>
+ <notification name="BlockedSLURL">
+ SLurl został otrzymany z niesprawdzonej przeglądarki i został zablokowany dla bezpieczeństwa.
+ </notification>
+ <notification name="ThrottledSLURL">
+ Wiele SLurlów zostało otrzymanych w krótkim czasie od niesprawdzonej przeglądarki.
+Zostaną zablokowane na kilka sekund dla bezpieczeństwa.
+ </notification>
+ <notification name="IMToast">
+ [MESSAGE]
+ <form name="form">
+ <button name="respondbutton" text="Odpowiedź"/>
+ </form>
+ </notification>
+ <notification name="ConfirmCloseAll">
+ Czy chcesz zamknąć wszystkie wiadomości IM?
+ <usetemplate ignoretext="Potwierdź, przed zamknięciem wszystkich wiadomości prywatnych (IM)." name="okcancelignore" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification name="AttachmentSaved">
+ Załącznik został zapisany.
+ </notification>
+ <notification name="UnableToFindHelpTopic">
+ Nie można znależć tematu pomocy dla tego elementu.
+ </notification>
+ <notification name="ObjectMediaFailure">
+ Błąd serwera: aktualizacja mediów nie powiodła się.
+&apos;[ERROR]&apos;
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="TextChatIsMutedByModerator">
+ Twój czat został wyciszony przez moderatora.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="VoiceIsMutedByModerator">
+ Twoja rozmowa głosowa została wyciszona przez moderatora.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmClearTeleportHistory">
+ Czy na pewno chcesz usunąć historię teleportacji?
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification name="BottomTrayButtonCanNotBeShown">
+ Wybrany przycisk nie może zostać wyświetlony w tej chwili.
+Przycisk zostanie wyświetlony w przypadku dostatecznej ilości przestrzeni.
+ </notification>
+ <notification name="ShareNotification">
+ Zaznacz Rezydentów, z którymi chcesz się podzielić.
+ </notification>
+ <notification name="ShareItemsConfirmation">
+ Czy na pewno chcesz udostępnić następujące obiekty:
+
+&lt;nolink&gt;[ITEMS]&lt;/nolink&gt;
+
+następującym Rezydentom:
+
+[RESIDENTS]
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="Ok"/>
+ </notification>
+ <notification name="ItemsShared">
+ Obiekty zostały udostępnione.
+ </notification>
+ <notification name="DeedToGroupFail">
+ Przekazanie grupie nie powiodło się.
+ </notification>
+ <notification name="AvatarRezNotification">
+ ( [EXISTENCE] sekund w Second Life)
+Awatar &apos;[NAME]&apos; rozchmurzył się po [TIME] sekundach.
+ </notification>
+ <notification name="AvatarRezSelfBakedDoneNotification">
+ ( [EXISTENCE] sekund w Second Life)
+You finished baking your outfit after [TIME] seconds.
+ </notification>
+ <notification name="AvatarRezSelfBakedUpdateNotification">
+ ( [EXISTENCE] sekund w Second Life )
+Wysłano aktualizację wyglądu po [TIME] sekundach.
+[STATUS]
+ </notification>
+ <notification name="AvatarRezCloudNotification">
+ ( [EXISTENCE] sekund w Second Life )
+Awatar &apos;[NAME]&apos; stał się chmurą.
+ </notification>
+ <notification name="AvatarRezArrivedNotification">
+ ( [EXISTENCE] sekund w Second Life)
+Awatar &apos;[NAME]&apos; pojawił się.
+ </notification>
+ <notification name="AvatarRezLeftCloudNotification">
+ ( [EXISTENCE] sekund w Second Life )
+Awatar &apos;[NAME]&apos; pozostał [TIME] sekund chmurą.
+ </notification>
+ <notification name="AvatarRezEnteredAppearanceNotification">
+ ( [EXISTENCE] sekund w Second Life )
+Awatar &apos;[NAME]&apos; rozpoczął edycję wyglądu.
+ </notification>
+ <notification name="AvatarRezLeftAppearanceNotification">
+ ( [EXISTENCE] sekund w Second Life )
+Awatar &apos;[NAME]&apos; opuścił edycję wyglądu.
+ </notification>
+ <notification name="NoConnect">
+ Występuje problem z połączeniem [PROTOCOL] [HOSTID].
+Proszę sprawdź swoją sieć i ustawienia firewall.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="NoVoiceConnect">
+ Występuje problem z Twoim połączniem głosowym:
+
+[HOSTID]
+
+Komunikacja głosowa nie będzie dostępna.
+Proszę sprawdź swoją sieć i ustawienia firewall.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="AvatarRezLeftNotification">
+ ( [EXISTENCE] sekund w Second Life)
+Awatar &apos;[NAME]&apos; pozostał w pełni załadowany.
+ </notification>
+ <notification name="AvatarRezSelfBakedTextureUploadNotification">
+ ( [EXISTENCE] sekund w Second Life )
+Zbakowane tekstury [RESOLUTION] dla &apos;[BODYREGION]&apos; zostały załadowane po[TIME] sekundach.
+ </notification>
+ <notification name="AvatarRezSelfBakedTextureUpdateNotification">
+ ( [EXISTENCE] sekund w Second Life )
+Zbakowane tekstury zostały lokalnie zaktualizowane [RESOLUTION] dla &apos;[BODYREGION]&apos; po [TIME] sekundach.
+ </notification>
+ <notification name="ConfirmLeaveCall">
+ Czy jestes pewien/pewna, że chcesz zakończyć rozmowę?
+ <usetemplate ignoretext="Potwierdź zanim rozmowa głosowa zostanie zakończona" name="okcancelignore" notext="Nie" yestext="Tak"/>
+ </notification>
+ <notification name="ConfirmMuteAll">
+ Wybrano wyciszenie wszystkich uczestników rozmowy głosowej w grupie.
+To spowoduje również wyciszenie wszystkich Rezydentów, którzy dołączą póżniej do rozmowy, nawet jeśli zakończysz rozmowę.
+
+Wyciszyć wszystkich?
+ <usetemplate ignoretext="Potwierdź zanim zostaną wyciszeni wszyscy uczestnicy rozmowy głosowej w grupie" name="okcancelignore" notext="Anuluj" yestext="Ok"/>
+ </notification>
+ <notification label="Czat" name="HintChat">
+ W celu przylączenia się do rozmowy zacznij pisać w poniższym polu czatu.
+ </notification>
+ <notification label="Wstań" name="HintSit">
+ Aby wstać i opuścić pozycję siedzącą, kliknij przycisk Wstań.
+ </notification>
+ <notification label="Odkrywaj Świat" name="HintDestinationGuide">
+ Destination Guide zawiera tysiące nowych miejsc do odkrycia. Wybierz lokalizację i teleportuj się aby rozpocząć zwiedzanie.
+ </notification>
+ <notification label="Schowek" name="HintSidePanel">
+ Schowek umożliwia szybki dostęp do Twojej Szafy, ubrań, profili i innych w panelu bocznym.
+ </notification>
+ <notification label="Ruch" name="HintMove">
+ Aby chodzić lub biegać, otwórz panel ruchu i użyj strzałek do nawigacji. Możesz także używać strzałek z klawiatury.
+ </notification>
+ <notification label="Wyświetlana nazwa" name="HintDisplayName">
+ Ustaw wyświetlaną nazwę, którą możesz zmieniać tutaj. Jest ona dodatkiem do unikatowej nazwy użytkownika, która nie może być zmieniona. Możesz zmienić sposób w jaki widzisz nazwy innych osób w Twoich Ustawieniach.
+ </notification>
+ <notification label="Ruch" name="HintMoveArrows">
+ Użyj przycisków ze strzałkami z klawiatury aby chodzić. Jeśli wciśniesz strzałkę &apos;do góry&apos; podwójnie, zaczniesz biec.
+ </notification>
+ <notification label="Widok" name="HintView">
+ To change your camera view, use the Orbit and Pan controls. Zresetuj widok poprzez wciśnięcie klawisza Esc lub chodzenie.
+ </notification>
+ <notification label="Szafa" name="HintInventory">
+ Sprawdź swoją Szafę aby znaleźć obiekty. Najnowsze obiekty mogą być łatwo odnalezione w zakładce Nowe obiekty.
+ </notification>
+ <notification label="Otrzymano L$!" name="HintLindenDollar">
+ Tutaj znajduje się Twoj bieżący bilans L$. Kliknij Kup aby kupić więcej L$.
+ </notification>
+ <notification name="PopupAttempt">
+ Wyskakujące okienko zostało zablokowane.
+ <form name="form">
+ <ignore name="ignore" text="Zezwól na wyskakujące okienka"/>
+ <button name="open" text="Otwórz wyskakujące okno."/>
+ </form>
+ </notification>
+ <notification name="AuthRequest">
+ Strpna &apos;&lt;nolink&gt;[HOST_NAME]&lt;/nolink&gt;&apos; w domenie &apos;[REALM]&apos; wymaga nazwy użytkownika i hasła.
+ <form name="form">
+ <input name="username" text="Nazwa użytkownika"/>
+ <input name="password" text="Hasło"/>
+ <button name="ok" text="Wyślij"/>
+ <button name="cancel" text="Anuluj"/>
+ </form>
+ </notification>
+ <notification label="" name="ModeChange">
+ Zmiana trybu wymaga restartu.
+ <usetemplate name="okcancelbuttons" notext="Nie zamykaj" yestext="Zamknij"/>
+ </notification>
+ <notification label="" name="NoClassifieds">
+ Tworzenie i edycja reklam jest możliwa tylko w trybie zaawansowanym. Czy chcesz wylogować się i zmienić tryb? Opcja wyboru trybu życia jest widoczna na ekranie logowania.
+ <usetemplate name="okcancelbuttons" notext="Nie zamykaj" yestext="Zamknij"/>
+ </notification>
+ <notification label="" name="NoGroupInfo">
+ Tworzenie i edycja grup jest możliwa tylko w trybie zaawansowanym. Czy chcesz wylogować się i zmienić tryb? Opcja wyboru trybu życia jest widoczna na ekranie logowania.
+ <usetemplate name="okcancelbuttons" notext="Nie zamykaj" yestext="Zamknij"/>
+ </notification>
+ <notification label="" name="NoPicks">
+ Tworzenie i edycja Ulubionych jest możliwa jedynie w trybie zaawansowanym. Czy chcesz się wylogować i zmienić tryb? Opcja wyboru trybu życia jest widoczna na ekranie logowania.
+ <usetemplate name="okcancelbuttons" notext="Nie zamykaj" yestext="Zamknij"/>
+ </notification>
+ <notification label="" name="NoWorldMap">
+ Oglądanie mapy świata jest możliwe tylko w trybie zaawansowanym. Czy chcesz się wylogować i zmienić tryb? Opcja wyboru trybu życia jest widoczna na ekranie logowania.
+ <usetemplate name="okcancelbuttons" notext="Nie zamykaj" yestext="Zamknij"/>
+ </notification>
+ <notification label="" name="NoVoiceCall">
+ Rozmowy głosowe są możliwe tylko w trybie zaawansowanym. Czy chcesz wylogować się i zmienić tryb?
+ <usetemplate name="okcancelbuttons" notext="Nie zamykaj" yestext="Zamknij"/>
+ </notification>
+ <notification label="" name="NoAvatarShare">
+ Udostępnienie jest możliwe tylko w trybie zaawansowanym. Czy chcesz wylogować się i zmienić tryb? Opcja wyboru trybu życia jest widoczna na ekranie logowania.
+ <usetemplate name="okcancelbuttons" notext="Nie zamykaj" yestext="Zamknij"/>
+ </notification>
+ <notification label="" name="NoAvatarPay">
+ Płacenie innym Rezydentom jest możliwe tylko w trybie zaawansowanym. Czy chcesz się wylogować i zmienić tryb? Opcja wyboru trybu życia jest widoczna na ekranie logowania.
+ <usetemplate name="okcancelbuttons" notext="Nie zamykaj" yestext="Zamknij"/>
+ </notification>
+ <global name="UnsupportedCPU">
+ - Prędkość Twojego CPU nie spełnia minimalnych wymagań.
+ </global>
+ <global name="UnsupportedGLRequirements">
+ Wygląda na to, że Twój system nie spełnia wymagań sprzętowych [APP_NAME]. [APP_NAME] wymaga karty graficznej kompatybilnej z OpenGL z multiteksturami. Jeżeli masz taką kartę zainstaluj najnowsze sterowniki do niej i uaktualnienia systemu operacyjnego.
+
+Jeżeli wciąż masz problemy sprawdź: [SUPPORT_SITE].
+ </global>
+ <global name="UnsupportedCPUAmount">
+ 796
+ </global>
+ <global name="UnsupportedRAMAmount">
+ 510
+ </global>
+ <global name="UnsupportedGPU">
+ - Twoja karta graficzna nie spełnia minimalnych wymagań.
+ </global>
+ <global name="UnsupportedRAM">
+ - Pamięć Twojego systemu nie spełnia minimalnych wymagań.
+ </global>
+ <global name="You can only set your &apos;Home Location&apos; on your land or at a mainland Infohub.">
+ Jeśli jesteś właścicielem posiadłości, możesz ustawić na niej miejsce startu.
+W innym przypadku możesz poszukać na mapie miejsca oznaczone jako &quot;Infohub&quot;.
+ </global>
+ <global name="You died and have been teleported to your home location">
+ Nastąpiła śmierć i teleportacja do Miejsca Startu.
+ </global>
+</notifications>
diff --git a/indra/newview/skins/minimal/xui/pl/panel_adhoc_control_panel.xml b/indra/newview/skins/minimal/xui/pl/panel_adhoc_control_panel.xml
new file mode 100644
index 0000000000..ba0c85e4ef
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/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="Dzwoń" name="call_btn"/>
+ </layout_panel>
+ <layout_panel name="end_call_btn_panel">
+ <button label="Zakończ rozmowę" name="end_call_btn"/>
+ </layout_panel>
+ <layout_panel name="voice_ctrls_btn_panel">
+ <button label="Przełączniki głosu" name="voice_ctrls_btn"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/minimal/xui/pl/panel_bottomtray.xml b/indra/newview/skins/minimal/xui/pl/panel_bottomtray.xml
new file mode 100644
index 0000000000..f49d820938
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/panel_bottomtray.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="bottom_tray">
+ <string name="DragIndicationImageName" value="Accordion_ArrowOpened_Off"/>
+ <string name="SpeakBtnToolTip" value="Włącza/wyłącza mikrofon"/>
+ <string name="VoiceControlBtnToolTip" value="Pokazuje/Ukrywa panel kontroli głosu"/>
+ <layout_stack name="toolbar_stack">
+ <layout_panel name="gesture_panel">
+ <gesture_combo_list label="Gesturki" name="Gesture" tool_tip="Pokazuje/Ukrywa gesturki"/>
+ </layout_panel>
+ <layout_panel name="cam_panel">
+ <bottomtray_button label="Widok" name="camera_btn" tool_tip="Pokaż/Ukryj ustawienia kamery"/>
+ </layout_panel>
+ <layout_panel name="avatar_and_destinations_panel">
+ <bottomtray_button label="Atrakcje turystyczne" name="destination_btn" tool_tip="Pokaż okno dotyczące ludzi"/>
+ </layout_panel>
+ <layout_panel name="avatar_and_destinations_panel">
+ <bottomtray_button label="Mój awatar" name="avatar_btn"/>
+ </layout_panel>
+ <layout_panel name="people_panel">
+ <bottomtray_button label="Ludzie" name="show_people_button" tool_tip="Pokazuje okno dotyczące ludzi"/>
+ </layout_panel>
+ <layout_panel name="profile_panel">
+ <bottomtray_button label="Profil" name="show_profile_btn" tool_tip="Pokazuje okno profilu."/>
+ </layout_panel>
+ <layout_panel name="howto_panel">
+ <bottomtray_button label="POMOC" name="show_help_btn" tool_tip="Otwiera temat pomocy Second Life"/>
+ </layout_panel>
+ <layout_panel name="im_well_panel">
+ <chiclet_im_well name="im_well">
+ <button name="Unread IM messages" tool_tip="Rozmowy"/>
+ </chiclet_im_well>
+ </layout_panel>
+ <layout_panel name="notification_well_panel">
+ <chiclet_notification name="notification_well">
+ <button name="Unread" tool_tip="Ogłoszenia"/>
+ </chiclet_notification>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/minimal/xui/pl/panel_group_control_panel.xml b/indra/newview/skins/minimal/xui/pl/panel_group_control_panel.xml
new file mode 100644
index 0000000000..074f572a4c
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/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="Grupa" name="group_info_btn"/>
+ </layout_panel>
+ <layout_panel name="call_btn_panel">
+ <button label="Dzwoń" name="call_btn"/>
+ </layout_panel>
+ <layout_panel name="end_call_btn_panel">
+ <button label="Zakończ rozmowę" name="end_call_btn"/>
+ </layout_panel>
+ <layout_panel name="voice_ctrls_btn_panel">
+ <button label="Otwórz kontroler głosu" name="voice_ctrls_btn"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/minimal/xui/pl/panel_im_control_panel.xml b/indra/newview/skins/minimal/xui/pl/panel_im_control_panel.xml
new file mode 100644
index 0000000000..4aadd3b93b
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/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="Poznaj" name="add_friend_btn"/>
+ </layout_panel>
+ <layout_panel name="teleport_btn_panel">
+ <button label="Teleportuj" name="teleport_btn" tool_tip="Teleportuj"/>
+ </layout_panel>
+ <layout_panel name="share_btn_panel">
+ <button label="Udostępnij" name="share_btn"/>
+ </layout_panel>
+ <layout_panel name="pay_btn_panel">
+ <button label="Zapłać" name="pay_btn"/>
+ </layout_panel>
+ <layout_panel name="call_btn_panel">
+ <button label="Dzwoń" name="call_btn"/>
+ </layout_panel>
+ <layout_panel name="end_call_btn_panel">
+ <button label="Zakończ rozmowę" name="end_call_btn"/>
+ </layout_panel>
+ <layout_panel name="voice_ctrls_btn_panel">
+ <button label="Przełączniki głosu" name="voice_ctrls_btn"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/minimal/xui/pl/panel_login.xml b/indra/newview/skins/minimal/xui/pl/panel_login.xml
new file mode 100644
index 0000000000..dc8e7399af
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/panel_login.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_login">
+ <panel.string name="forgot_password_url">
+ http://secondlife.com/account/request.php
+ </panel.string>
+ <layout_stack name="login_widgets">
+ <layout_panel name="login">
+ <text name="username_text">
+ Użytkownik:
+ </text>
+ <combo_box name="username_combo" tool_tip="Nazwę użytkownika wybierasz przy rejestracji, np. bobsmith12 lub Steller Sunshine"/>
+ <text name="password_text">
+ Hasło:
+ </text>
+ <check_box label="Zapamiętaj hasło" name="remember_check"/>
+ <button label="Połącz" name="connect_btn"/>
+ <text name="mode_selection_text">
+ Tryb życia:
+ </text>
+ <combo_box name="mode_combo" tool_tip="Wybierz tryb życia. Wybierz tryb turystyczny dla łatwego zwiedzania i czatowania. Wybierz tryb zaawansowany aby mieć dostęp do większej ilości opcji.">
+ <combo_box.item label="Turystyczny" name="Basic"/>
+ <combo_box.item label="Zaawansowany" name="Advanced"/>
+ </combo_box>
+ <text name="start_location_text">
+ Rozpocznij w:
+ </text>
+ <combo_box name="start_location_combo">
+ <combo_box.item label="Ostatnie Miejsce" name="MyLastLocation"/>
+ <combo_box.item label="Moje Miejsce Startu" name="MyHome"/>
+ <combo_box.item label="&lt;Wpisz Region&gt;" name="Typeregionname"/>
+ </combo_box>
+ </layout_panel>
+ <layout_panel name="links">
+ <text name="create_new_account_text">
+ Utwórz nowe konto
+ </text>
+ <text name="forgot_password_text">
+ Zapomniałeś swojej nazwy użytkownika lub hasła?
+ </text>
+ <text name="login_help">
+ Potrzebujesz pomocy z logowaniem się?
+ </text>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/minimal/xui/pl/panel_navigation_bar.xml b/indra/newview/skins/minimal/xui/pl/panel_navigation_bar.xml
new file mode 100644
index 0000000000..b01e686c41
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/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="Wróć do poprzedniej lokalizacji"/>
+ <pull_button name="forward_btn" tool_tip="Idź do następnej lokalizacji"/>
+ <button name="home_btn" tool_tip="Teleportuj do miejsca startu"/>
+ <location_input label="Lokalizacja" name="location_combo"/>
+ <search_combo_box label="Szukaj" name="search_combo_box" tool_tip="Szukaj">
+ <combo_editor label="Szukaj [SECOND_LIFE]" name="search_combo_editor"/>
+ </search_combo_box>
+ </panel>
+ <favorites_bar name="favorite" tool_tip="Przeciągnij swoje landmarki tutaj by szybko dostać się do swoich ulubionych miejsc w Second Life!">
+ <label name="favorites_bar_label" tool_tip="Przeciągnij swoje landmarki tutaj by szybko dostać się do swoich ulubionych miejsc w Second Life!">
+ Pasek Ulubionych
+ </label>
+ <chevron_button name="&gt;&gt;" tool_tip="Pokaż więcej Moich Ulubionych"/>
+ </favorites_bar>
+</panel>
diff --git a/indra/newview/skins/minimal/xui/pl/panel_people.xml b/indra/newview/skins/minimal/xui/pl/panel_people.xml
new file mode 100644
index 0000000000..dbfee739f4
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/panel_people.xml
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Side tray panel -->
+<panel label="Ludzie" name="people_panel">
+ <string name="no_recent_people" value="Brak ostatnich rozmówców. Chcesz spotkać ludzi? Skorzystaj z przycisku &quot;Atrakcje turystyczne&quot; poniżej."/>
+ <string name="no_filtered_recent_people" value="Brak ostatnich rozmówców posiadających wskazane imię."/>
+ <string name="no_one_near" value="Nie ma nikogo w pobliżu. Chcesz spotkać ludzi? Skorzystaj z przycisku &quot;Atrakcje turystyczne&quot; poniżej."/>
+ <string name="no_one_filtered_near" value="Nie ma nikogo o wskazanym imieniu w pobliżu."/>
+ <string name="no_friends_online" value="Brak dostępnych znajomych"/>
+ <string name="no_friends" value="Brak znajomych"/>
+ <string name="no_friends_msg">
+ Kliknij prawym przyciskiem na Rezydenta aby dodać go do listy znajomych.
+Chcesz spotkać ludzi? Skorzystaj z przycisku &quot;Atrakcje turystyczne&quot; poniżej.
+ </string>
+ <string name="no_filtered_friends_msg">
+ Nie znaleziono tego czego szukasz? Skorzystaj z przycisku &quot;Atrakcje turystyczne&quot; poniżej.
+ </string>
+ <string name="people_filter_label" value="Filtruj ludzi"/>
+ <string name="groups_filter_label" value="Filtruj grupy"/>
+ <string name="no_filtered_groups_msg" value="Nie znaleziono tego czego szukasz? Spróbuj [secondlife:///app/search/groups/[SEARCH_TERM] Szukaj]."/>
+ <string name="no_groups_msg" value="Chcesz dołączyć do grup? Spróbuj [secondlife:///app/search/groups Szukaj]."/>
+ <string name="MiniMapToolTipMsg" value="[REGION](Podwójne kliknięcie otwiera mapę, wciśnij Shift i przeciągnij myszką aby przesunąć)"/>
+ <string name="AltMiniMapToolTipMsg" value="[REGION](Podwójne kliknięcie aktywuje teleportację, wciśnij Shift i przeciągnij myszką aby przesunąć)"/>
+ <filter_editor label="Filtr" name="filter_input"/>
+ <tab_container name="tabs">
+ <panel label="W POBLIŻU" name="nearby_panel">
+ <panel label="bottom_panel" name="bottom_panel">
+ <menu_button name="nearby_view_sort_btn" tool_tip="Opcje"/>
+ <button name="add_friend_btn" tool_tip="Dodaj wybranego Rezydenta do znajomych"/>
+ </panel>
+ </panel>
+ <panel label="ZNAJOMI" name="friends_panel">
+ <accordion name="friends_accordion">
+ <accordion_tab name="tab_online" title="Dostępni"/>
+ <accordion_tab name="tab_all" title="Wszyscy"/>
+ </accordion>
+ <panel label="bottom_panel" name="bottom_panel">
+ <layout_stack name="bottom_panel">
+ <layout_panel name="options_gear_btn_panel">
+ <menu_button name="friends_viewsort_btn" tool_tip="Pokaż opcje dodatkowe"/>
+ </layout_panel>
+ <layout_panel name="add_btn_panel">
+ <button name="add_btn" tool_tip="Dodaj wybranego Rezydenta do znajomych"/>
+ </layout_panel>
+ <layout_panel name="trash_btn_panel">
+ <dnd_button name="del_btn" tool_tip="Usuń zaznaczoną osobę ze swojej listy znajomych"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+ </panel>
+ <panel label="GRUPY" name="groups_panel">
+ <panel label="bottom_panel" name="bottom_panel">
+ <menu_button name="groups_viewsort_btn" tool_tip="Opcje"/>
+ <button name="plus_btn" tool_tip="Dołącz do grupy/Stwórz nową grupę"/>
+ <button name="activate_btn" tool_tip="Aktywuj wybraną grupę"/>
+ </panel>
+ </panel>
+ <panel label="OSTATNIE" name="recent_panel">
+ <panel label="bottom_panel" name="bottom_panel">
+ <menu_button name="recent_viewsort_btn" tool_tip="Opcje"/>
+ <button name="add_friend_btn" tool_tip="Dodaj wybranego Rezydenta do znajomych"/>
+ </panel>
+ </panel>
+ </tab_container>
+ <panel name="button_bar">
+ <layout_stack name="bottom_bar_ls">
+ <layout_panel name="view_profile_btn_lp">
+ <button label="Profil" name="view_profile_btn" tool_tip="Pokaż zdjęcie, grupy i inne informacje o Rezydencie"/>
+ </layout_panel>
+ <layout_panel name="chat_btn_lp">
+ <button label="IM" name="im_btn" tool_tip="Otwórz wiadomości IM"/>
+ </layout_panel>
+ <layout_panel name="chat_btn_lp">
+ <button label="Dzwoń" name="call_btn" tool_tip="Zadzwoń do tego Rezydenta"/>
+ </layout_panel>
+ <layout_panel name="chat_btn_lp">
+ <button label="Udostępnij" name="share_btn" tool_tip="Udostępnij obiekt z Szafy"/>
+ </layout_panel>
+ <layout_panel name="chat_btn_lp">
+ <button label="Teleportuj" name="teleport_btn" tool_tip="Zaproponuj teleport"/>
+ </layout_panel>
+ </layout_stack>
+ <layout_stack name="bottom_bar_ls1">
+ <layout_panel name="group_info_btn_lp">
+ <button label="Profil grupy" name="group_info_btn" tool_tip="Pokaż informacje o grupie"/>
+ </layout_panel>
+ <layout_panel name="chat_btn_lp">
+ <button label="Czat grupy" name="chat_btn" tool_tip="Otwórz sesję czatu"/>
+ </layout_panel>
+ <layout_panel name="group_call_btn_lp">
+ <button label="Rozmowa głosowa w grupie" name="group_call_btn" tool_tip="Rozmowa głosowa w tej grupie"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/minimal/xui/pl/panel_side_tray_tab_caption.xml b/indra/newview/skins/minimal/xui/pl/panel_side_tray_tab_caption.xml
new file mode 100644
index 0000000000..95cd7c53dc
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/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="Schowek"/>
+ <button name="undock" tool_tip="Odłącz"/>
+ <button name="dock" tool_tip="Przyłącz"/>
+ <button name="show_help" tool_tip="Pomoc"/>
+</panel>
diff --git a/indra/newview/skins/minimal/xui/pl/panel_status_bar.xml b/indra/newview/skins/minimal/xui/pl/panel_status_bar.xml
new file mode 100644
index 0000000000..6aa0d27bb8
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pl/panel_status_bar.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="status">
+ <panel.string name="StatBarDaysOfWeek">
+ Niedziela:Poniedziałek:Wtorek:Środa:Czwartek:Piątek:Sobota
+ </panel.string>
+ <panel.string name="StatBarMonthsOfYear">
+ Styczeń:Luty:Marzec:Kwiecień:Maj:Czerwiec:Lipiec:Styczeń:Wrzesień:Październik:Listopad:Grudzień
+ </panel.string>
+ <panel.string name="packet_loss_tooltip">
+ Utracone pakiety
+ </panel.string>
+ <panel.string name="bandwidth_tooltip">
+ Przepustowość
+ </panel.string>
+ <panel.string name="time">
+ [hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]
+ </panel.string>
+ <panel.string name="timeTooltip">
+ [weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt]
+ </panel.string>
+ <panel.string name="buycurrencylabel">
+ L$ [AMT]
+ </panel.string>
+ <panel name="balance_bg">
+ <text name="balance" tool_tip="Kliknij aby odświeżyć bilans L$" value="L$20"/>
+ <button label="Kup L$" name="buyL" tool_tip="Kliknij aby kupić więcej L$"/>
+ </panel>
+ <text name="TimeText" tool_tip="Obecny czas (Pacyficzny)">
+ 24:00 AM PST
+ </text>
+ <button name="media_toggle_btn" tool_tip="Start/Stop wszystkie media (Muzyka, Video, WWW)"/>
+ <button name="volume_btn" tool_tip="Regulacja głośności"/>
+</panel>
diff --git a/indra/newview/skins/minimal/xui/pt/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/llcapabilitylistener_test.cpp b/indra/newview/tests/llcapabilitylistener_test.cpp
index d691bb6c44..2ad08dc1f3 100644
--- a/indra/newview/tests/llcapabilitylistener_test.cpp
+++ b/indra/newview/tests/llcapabilitylistener_test.cpp
@@ -114,6 +114,7 @@ namespace tut
regionListener("testCapabilityListener", NULL, provider, LLUUID(), LLUUID()),
regionPump(regionListener.getCapAPI())
{
+ LLCurl::initClass();
provider.setCapability("good", server + "capability-test");
provider.setCapability("fail", server + "fail");
}
diff --git a/indra/newview/tests/llremoteparcelrequest_test.cpp b/indra/newview/tests/llremoteparcelrequest_test.cpp
index 9a6e08ee84..ed66066b0a 100644
--- a/indra/newview/tests/llremoteparcelrequest_test.cpp
+++ b/indra/newview/tests/llremoteparcelrequest_test.cpp
@@ -35,7 +35,6 @@
#include "llurlentry.h"
namespace {
- LLControlGroup s_saved_settings("dummy_settings");
const LLUUID TEST_PARCEL_ID("11111111-1111-1111-1111-111111111111");
}
@@ -64,13 +63,12 @@ LLMessageSystem * gMessageSystem;
char const* const _PREHASH_AgentID = 0; // never dereferenced during this test
char const* const _PREHASH_AgentData = 0; // never dereferenced during this test
LLAgent gAgent;
-LLAgent::LLAgent() : mAgentAccess(s_saved_settings) { }
+LLAgent::LLAgent() : mAgentAccess(NULL) { }
LLAgent::~LLAgent() { }
void LLAgent::sendReliableMessage(void) { }
LLUUID gAgentSessionID;
LLUUID gAgentID;
LLUIColor::LLUIColor(void) { }
-LLAgentAccess::LLAgentAccess(LLControlGroup & settings) : mSavedSettings(settings) { }
LLControlGroup::LLControlGroup(std::string const & name) : LLInstanceTracker<LLControlGroup, std::string>(name) { }
LLControlGroup::~LLControlGroup(void) { }
void LLUrlEntryParcel::processParcelInfo(const LLUrlEntryParcel::LLParcelData& parcel_data) { }
diff --git a/indra/newview/tests/llviewerhelputil_test.cpp b/indra/newview/tests/llviewerhelputil_test.cpp
index b425b50c8b..710881d811 100644
--- a/indra/newview/tests/llviewerhelputil_test.cpp
+++ b/indra/newview/tests/llviewerhelputil_test.cpp
@@ -73,11 +73,9 @@ static void substitute_string(std::string &input, const std::string &search, con
}
#include "../llagent.h"
-LLAgent::LLAgent() : mAgentAccess(gSavedSettings) { }
+LLAgent::LLAgent() : mAgentAccess(NULL) { }
LLAgent::~LLAgent() { }
bool LLAgent::isGodlike() const { return FALSE; }
-LLAgentAccess::LLAgentAccess(LLControlGroup& settings) : mSavedSettings(settings) { }
-LLUIColor::LLUIColor() {}
LLAgent gAgent;
diff --git a/indra/newview/tests/llxmlrpclistener_test.cpp b/indra/newview/tests/llxmlrpclistener_test.cpp
index 4d5df1043e..711c2a3d51 100644
--- a/indra/newview/tests/llxmlrpclistener_test.cpp
+++ b/indra/newview/tests/llxmlrpclistener_test.cpp
@@ -40,8 +40,10 @@
#include "llevents.h"
#include "lleventfilter.h"
#include "llsd.h"
+#include "llhost.h"
#include "llcontrol.h"
#include "tests/wrapllerrs.h"
+#include "tests/commtest.h"
LLControlGroup gSavedSettings("Global");
@@ -54,7 +56,8 @@ namespace tut
{
data():
pumps(LLEventPumps::instance()),
- uri("http://127.0.0.1:8000")
+ uri(std::string("http://") +
+ LLHost("127.0.0.1", commtest_data::getport("PORT")).getString())
{
// These variables are required by machinery used by
// LLXMLRPCTransaction. The values reflect reality for this test
@@ -145,7 +148,7 @@ namespace tut
pumps.obtain("LLXMLRPCTransaction").post(request);
// Set the timer
F32 timeout(10);
- watchdog.eventAfter(timeout, LLSD().insert("timeout", 0));
+ watchdog.eventAfter(timeout, LLSD().with("timeout", 0));
// and pump "mainloop" until we get something, whether from
// LLXMLRPCListener or from the watchdog filter.
LLTimer timer;
@@ -182,7 +185,7 @@ namespace tut
pumps.obtain("LLXMLRPCTransaction").post(request);
// Set the timer
F32 timeout(10);
- watchdog.eventAfter(timeout, LLSD().insert("timeout", 0));
+ watchdog.eventAfter(timeout, LLSD().with("timeout", 0));
// and pump "mainloop" until we get something, whether from
// LLXMLRPCListener or from the watchdog filter.
LLTimer timer;
@@ -218,7 +221,7 @@ namespace tut
pumps.obtain("LLXMLRPCTransaction").post(request);
// Set the timer
F32 timeout(10);
- watchdog.eventAfter(timeout, LLSD().insert("timeout", 0));
+ watchdog.eventAfter(timeout, LLSD().with("timeout", 0));
// and pump "mainloop" until we get something, whether from
// LLXMLRPCListener or from the watchdog filter.
LLTimer timer;
diff --git a/indra/newview/tests/test_llxmlrpc_peer.py b/indra/newview/tests/test_llxmlrpc_peer.py
index 1c7204a6b6..281b72a058 100644
--- a/indra/newview/tests/test_llxmlrpc_peer.py
+++ b/indra/newview/tests/test_llxmlrpc_peer.py
@@ -37,7 +37,7 @@ from SimpleXMLRPCServer import SimpleXMLRPCServer
mydir = os.path.dirname(__file__) # expected to be .../indra/newview/tests/
sys.path.insert(0, os.path.join(mydir, os.pardir, os.pardir, "lib", "python"))
sys.path.insert(1, os.path.join(mydir, os.pardir, os.pardir, "llmessage", "tests"))
-from testrunner import run, debug
+from testrunner import freeport, run, debug
class TestServer(SimpleXMLRPCServer):
def _dispatch(self, method, params):
@@ -66,11 +66,16 @@ class TestServer(SimpleXMLRPCServer):
# Suppress error output as well
pass
-class ServerRunner(Thread):
- def run(self):
- server = TestServer(('127.0.0.1', 8000))
- debug("Starting XMLRPC server...\n")
- server.serve_forever()
-
if __name__ == "__main__":
- sys.exit(run(server=ServerRunner(name="xmlrpc"), *sys.argv[1:]))
+ # Instantiate a TestServer 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.
+ xmlrpcd, port = freeport(xrange(8000, 8020),
+ lambda port: TestServer(('127.0.0.1', port)))
+ # 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)
+ sys.exit(run(server=Thread(name="xmlrpc", target=xmlrpcd.serve_forever), *sys.argv[1:]))
diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py
index f0b1973fdf..8aa94616d6 100644
--- a/indra/newview/viewer_manifest.py
+++ b/indra/newview/viewer_manifest.py
@@ -114,6 +114,16 @@ class ViewerManifest(LLManifest):
# Files in the newview/ directory
self.path("gpu_table.txt")
+ # The summary.json file gets left in the base checkout dir by
+ # build.sh. It's only created for a build.sh build, therefore we
+ # have to check whether it exists. :-P
+ summary_json = "summary.json"
+ summary_json_path = os.path.join(os.pardir, os.pardir, summary_json)
+ if os.path.exists(os.path.join(self.get_src_prefix(), summary_json_path)):
+ self.path(summary_json_path, summary_json)
+ else:
+ print "No %s" % os.path.join(self.get_src_prefix(), summary_json_path)
+
def login_channel(self):
"""Channel reported for login and upgrade purposes ONLY;
used for A/B testing"""
@@ -253,25 +263,38 @@ class WindowsManifest(ViewerManifest):
#self.disable_manifest_check()
self.path(src="../viewer_components/updater/scripts/windows/update_install.bat", dst="update_install.bat")
-
# Get shared libs from the shared libs staging directory
if self.prefix(src=os.path.join(os.pardir, 'sharedlibs', self.args['configuration']),
dst=""):
#self.enable_crt_manifest_check()
-
+
# Get llcommon and deps. If missing assume static linkage and continue.
try:
self.path('llcommon.dll')
self.path('libapr-1.dll')
self.path('libaprutil-1.dll')
self.path('libapriconv-1.dll')
+
except RuntimeError, err:
print err.message
print "Skipping llcommon.dll (assuming llcommon was linked statically)"
#self.disable_manifest_check()
+ # Mesh 3rd party libs needed for auto LOD and collada reading
+ try:
+ if self.args['configuration'].lower() == 'debug':
+ self.path("libcollada14dom22-d.dll")
+ else:
+ self.path("libcollada14dom22.dll")
+
+ self.path("glod.dll")
+ except RuntimeError, err:
+ print err.message
+ print "Skipping COLLADA and GLOD libraries (assumming linked statically)"
+
+
# Get fmod dll, continue if missing
try:
self.path("fmod.dll")
@@ -322,7 +345,7 @@ class WindowsManifest(ViewerManifest):
self.path("featuretable_xp.txt")
#self.enable_no_crt_manifest_check()
-
+
# Media plugins - QuickTime
if self.prefix(src='../media_plugins/quicktime/%s' % self.args['configuration'], dst="llplugin"):
self.path("media_plugin_quicktime.dll")
@@ -636,6 +659,8 @@ class DarwinManifest(ViewerManifest):
"libaprutil-1.0.dylib",
"libexpat.1.5.2.dylib",
"libexception_handler.dylib",
+ "libGLOD.dylib",
+ "libcollada14dom.dylib"
):
self.path(os.path.join(libdir, libfile), libfile)
@@ -667,6 +692,8 @@ class DarwinManifest(ViewerManifest):
"libaprutil-1.0.dylib",
"libexpat.1.5.2.dylib",
"libexception_handler.dylib",
+ "libGLOD.dylib",
+ "libcollada14dom.dylib"
):
target_lib = os.path.join('../../..', libfile)
self.run_command("ln -sf %(target)r %(link)r" %
@@ -706,6 +733,7 @@ class DarwinManifest(ViewerManifest):
self.run_command('strip -S %(viewer_binary)r' %
{ 'viewer_binary' : self.dst_path_of('Contents/MacOS/Second Life')})
+
def copy_finish(self):
# Force executable permissions to be set for scripts
# see CHOP-223 and http://mercurial.selenic.com/bts/issue1802
@@ -936,12 +964,15 @@ class Linux_i686Manifest(LinuxManifest):
self.path("libbreakpad_client.so.0.0.0")
self.path("libbreakpad_client.so.0")
self.path("libbreakpad_client.so")
+ self.path("libcollada14dom.so")
self.path("libdb-5.1.so")
self.path("libdb-5.so")
self.path("libdb.so")
- self.path("libcrypto.so.0.9.8")
+ self.path("libcrypto.so.1.0.0")
self.path("libexpat.so.1.5.2")
- self.path("libssl.so.0.9.8")
+ self.path("libssl.so.1.0.0")
+ self.path("libglod.so")
+ self.path("libminizip.so")
self.path("libuuid.so")
self.path("libuuid.so.16")
self.path("libuuid.so.16.0.22")
@@ -956,6 +987,9 @@ class Linux_i686Manifest(LinuxManifest):
self.path("libopenal.so", "libopenal.so.1")
self.path("libopenal.so", "libvivoxoal.so.1") # vivox's sdk expects this soname
self.path("libfontconfig.so.1.4.4")
+ self.path("libtcmalloc.so", "libtcmalloc.so") #formerly called google perf tools
+ self.path("libtcmalloc.so.0", "libtcmalloc.so.0") #formerly called google perf tools
+ self.path("libtcmalloc.so.0.1.0", "libtcmalloc.so.0.1.0") #formerly called google perf tools
try:
self.path("libfmod-3.75.so")
pass
@@ -976,6 +1010,11 @@ class Linux_i686Manifest(LinuxManifest):
self.path("libvivoxplatform.so")
self.end_prefix("lib")
+ if self.args['buildtype'].lower() == 'release' and self.is_packaging_viewer():
+ print "* Going strip-crazy on the packaged binaries, since this is a RELEASE build"
+ self.run_command("find %(d)r/bin %(d)r/lib -type f \\! -name update_install | xargs --no-run-if-empty strip -S" % {'d': self.get_dst_prefix()} ) # makes some small assumptions about our packaged dir structure
+
+
class Linux_x86_64Manifest(LinuxManifest):
def construct(self):
super(Linux_x86_64Manifest, self).construct()
diff --git a/indra/test_apps/llplugintest/llmediaplugintest.cpp b/indra/test_apps/llplugintest/llmediaplugintest.cpp
index e9d4d99753..884b00f0cc 100644
--- a/indra/test_apps/llplugintest/llmediaplugintest.cpp
+++ b/indra/test_apps/llplugintest/llmediaplugintest.cpp
@@ -4,7 +4,7 @@
*
* $LicenseInfo:firstyear=2008&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
@@ -2154,6 +2154,10 @@ void LLMediaPluginTest::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent e
}
break;
+ case MEDIA_EVENT_NAVIGATE_ERROR_PAGE:
+ std::cerr << "Media event: MEDIA_EVENT_NAVIGATE_ERROR_PAGE, uri is: " << self->getClickURL() << std::endl;
+ break;
+
case MEDIA_EVENT_CLICK_LINK_HREF:
{
std::cerr << "Media event: MEDIA_EVENT_CLICK_LINK_HREF, uri is " << self->getClickURL() << ", target is " << self->getClickTarget() << std::endl;
@@ -2233,7 +2237,13 @@ void LLMediaPluginTest::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent e
case MEDIA_EVENT_LINK_HOVERED:
{
std::cerr << "Media event: MEDIA_EVENT_LINK_HOVERED, hover text is: " << self->getHoverText() << std::endl;
- };
+ }
+ break;
+
+ default:
+ {
+ std::cerr << "Media event: <unknown>, code is: " << int(event) << std::endl;
+ }
break;
}
}
diff --git a/indra/viewer_components/login/CMakeLists.txt b/indra/viewer_components/login/CMakeLists.txt
index fe64926da6..7720619df3 100644
--- a/indra/viewer_components/login/CMakeLists.txt
+++ b/indra/viewer_components/login/CMakeLists.txt
@@ -9,13 +9,11 @@ endif(LL_TESTS)
include(LLCommon)
include(LLMath)
include(LLXML)
-include(Pth)
include_directories(
${LLCOMMON_INCLUDE_DIRS}
${LLMATH_INCLUDE_DIRS}
${LLXML_INCLUDE_DIRS}
- ${PTH_INCLUDE_DIRS}
)
set(login_SOURCE_FILES
@@ -42,7 +40,6 @@ target_link_libraries(lllogin
${LLCOMMON_LIBRARIES}
${LLMATH_LIBRARIES}
${LLXML_LIBRARIES}
- ${PTH_LIBRARIES}
)
if(LL_TESTS)
@@ -50,11 +47,5 @@ if(LL_TESTS)
lllogin.cpp
)
- set_source_files_properties(
- lllogin.cpp
- PROPERTIES
- LL_TEST_ADDITIONAL_LIBRARIES "${PTH_LIBRARIES}"
- )
-
LL_ADD_PROJECT_UNIT_TESTS(lllogin "${lllogin_TEST_SOURCE_FILES}")
endif(LL_TESTS)
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/viewer_components/updater/llupdateinstaller.cpp b/indra/viewer_components/updater/llupdateinstaller.cpp
index d450c068ad..c7b70c2de8 100644
--- a/indra/viewer_components/updater/llupdateinstaller.cpp
+++ b/indra/viewer_components/updater/llupdateinstaller.cpp
@@ -28,7 +28,7 @@
#include "llapr.h"
#include "llprocesslauncher.h"
#include "llupdateinstaller.h"
-#include "lldir.h"
+#include "lldir.h"
#if defined(LL_WINDOWS)
diff --git a/indra/viewer_components/updater/tests/llupdaterservice_test.cpp b/indra/viewer_components/updater/tests/llupdaterservice_test.cpp
index 88ab5a2284..e19d5724f1 100644
--- a/indra/viewer_components/updater/tests/llupdaterservice_test.cpp
+++ b/indra/viewer_components/updater/tests/llupdaterservice_test.cpp
@@ -59,12 +59,6 @@ class LLDir_Mock : public LLDir
return 0;
}
- BOOL getNextFileInDir(const std::string &dirname,
- const std::string &mask,
- std::string &fname)
- {
- return false;
- }
void getRandomFileInDir(const std::string &dirname,
const std::string &mask,
std::string &fname) {}
diff --git a/install.xml b/install.xml
deleted file mode 100644
index 9658a4195a..0000000000
--- a/install.xml
+++ /dev/null
@@ -1,1898 +0,0 @@
-<?xml version="1.0" ?>
-<llsd>
-<map>
- <key>installables</key>
- <map>
- <key>GL</key>
- <map>
- <key>copyright</key>
- <string>Copyright (c) 1991-2000 Silicon Graphics, Inc.</string>
- <key>description</key>
- <string>A standard for 3D Graphics rendering engine.</string>
- <key>license</key>
- <string>GL</string>
- <key>packages</key>
- <map>
- <key>darwin</key>
- <map>
- <key>md5sum</key>
- <string>0bd2795a2afe09f6c563f2f888f24cc9</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/GL-darwin-20080613.tar.bz2</uri>
- </map>
- <key>linux</key>
- <map>
- <key>md5sum</key>
- <string>2ab29212a7f3acdaebf10059af816be0</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/GL-linux-20080812.tar.bz2</uri>
- </map>
- <key>linux64</key>
- <map>
- <key>md5sum</key>
- <string>9c3dff3817f1105f9054401fdef1fe50</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/GL-linux64-20080909.tar.bz2</uri>
- </map>
- <key>windows</key>
- <map>
- <key>md5sum</key>
- <string>91155239b02f576384603795d41eb971</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/GL-windows-20090505.tar.bz2</uri>
- </map>
- </map>
- </map>
- <key>SDL</key>
- <map>
- <key>copyright</key>
- <string>Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga</string>
- <key>description</key>
- <string>The Simple DirectMedia Layer libraries are used for handling input and basic window/GL setup on the Linux client. Packages also include cursors.</string>
- <key>license</key>
- <string>lgpl</string>
- <key>packages</key>
- <map>
- <key>linux</key>
- <map>
- <key>md5sum</key>
- <string>fce0ff7d2cdf0f36c1647e6a3916e29e</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/SDL-1.2.12-linux-20090218.tar.bz2</uri>
- </map>
- </map>
- </map>
- <key>apr_suite</key>
- <map>
- <key>license</key>
- <string>apache 2.0</string>
- <key>packages</key>
- <map>
- <key>darwin</key>
- <map>
- <key>md5sum</key>
- <string>115d8ac44a91efdb173e9b3e478c46b6</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/apr_suite-1.3.7-darwin-20090805.tar.bz2</uri>
- </map>
- <key>linux</key>
- <map>
- <key>md5sum</key>
- <string>7b84cd6a3c601a104d9c09e58ef2f50c</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/apr_suite-1.2.8-linux-20080812.tar.bz2</uri>
- </map>
- <key>linux64</key>
- <map>
- <key>md5sum</key>
- <string>1a7e1186855d48d8316ce86803095f70</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/apr_suite-1.2.8-linux64-20080909a.tar.bz2</uri>
- </map>
- <key>windows</key>
- <map>
- <key>md5sum</key>
- <string>a02619c1e30a3db02d3883bf1ad7a1e6</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/apr_suite-1.3.8-windows-20090911.tar.bz2</uri>
- </map>
- </map>
- </map>
- <key>ares</key>
- <map>
- <key>copyright</key>
- <string>Copyright 1998 by the Massachusetts Institute of Technology.</string>
- <key>description</key>
- <string>Performs DNS requests and name resolves asynchronously. Used with libcurl to keep all HTTP operations async.</string>
- <key>license</key>
- <string>c-ares</string>
- <key>packages</key>
- <map>
- <key>darwin</key>
- <map>
- <key>md5sum</key>
- <string>cdb2f5c4a5a1f9ecd75bc1dbdd4db8e9</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ares-1.7.1-darwin-20100606.tar.bz2</uri>
- </map>
- <key>linux</key>
- <map>
- <key>md5sum</key>
- <string>91694429e391efeea1de974df26032a2</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ares-1.7.1-linux-20100527.tar.bz2</uri>
- </map>
- <key>linux64</key>
- <map>
- <key>md5sum</key>
- <string>c4242416e0b2e642c0bf062a19a250e4</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ares-1.3.0-linux64-20080909.tar.bz2</uri>
- </map>
- <key>windows</key>
- <map>
- <key>md5sum</key>
- <string>4b84738eec2e21b0c096d53b79ee2681</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ares-1.7.1-windows-20100611a.tar.bz2</uri>
- </map>
- </map>
- </map>
- <key>artwork-common</key>
- <map>
- <key>copyright</key>
- <string>(C) 2008 Linden Research, Inc.</string>
- <key>description</key>
- <string>Second Life(TM) Viewer Artwork</string>
- <key>license</key>
- <string>artwork</string>
- <key>packages</key>
- <map>
- <key>darwin</key>
- <map>
- <key>md5sum</key>
- <string>5e047437d73d1017bf270a6c6e936f23</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/artwork-common-20090415.tar.bz2</uri>
- </map>
- <key>linux</key>
- <map>
- <key>md5sum</key>
- <string>5e047437d73d1017bf270a6c6e936f23</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/artwork-common-20090415.tar.bz2</uri>
- </map>
- <key>windows</key>
- <map>
- <key>md5sum</key>
- <string>5e047437d73d1017bf270a6c6e936f23</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/artwork-common-20090415.tar.bz2</uri>
- </map>
- </map>
- </map>
- <key>berkeley</key>
- <map>
- <key>copyright</key>
- <string>Copyright (c) 1990-1999 Sleepycat Software. All rights reserved.</string>
- <key>description</key>
- <string>a high-performance, embedded database library</string>
- <key>license</key>
- <string>sleepycat</string>
- </map>
- <key>boost</key>
- <map>
- <key>copyright</key>
- <string>various</string>
- <key>description</key>
- <string>A set of portable C++ libraries which provide a wide set of functionality. </string>
- <key>license</key>
- <string>boost</string>
- <key>packages</key>
- <map>
- <key>darwin</key>
- <map>
- <key>md5sum</key>
- <string>71defd179827bf172b76d6020023e0e8</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/boost-1.39.0-darwin-20100222a.tar.bz2</uri>
- </map>
- <key>linux</key>
- <map>
- <key>md5sum</key>
- <string>4db3d74e40d149eeec06f4d97a609bb1</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/boost-1.39.0-linux-20100624.tar.bz2</uri>
- </map>
- <key>linux64</key>
- <map>
- <key>md5sum</key>
- <string>af4badd6b2c10bc4db82ff1256695892</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/boost-1.39.0-linux64-20100119.tar.bz2</uri>
- </map>
- <key>windows</key>
- <map>
- <key>md5sum</key>
- <string>72e6e2eff5d146a107f3059b6c31fb95</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/boost-1.39.0-windows-20100630.tar.bz2</uri>
- </map>
- </map>
- </map>
- <key>curl</key>
- <map>
- <key>copyright</key>
- <string>Copyright (c) 1996 - 2008, Daniel Stenberg, &lt;daniel@haxx.se&gt;.</string>
- <key>description</key>
- <string>Client-side URL transfer library. Handles moving data across the net in many different protocols. Used to GET/POST/PUT/DELETE web resources. </string>
- <key>license</key>
- <string>curl</string>
- <key>packages</key>
- <map>
- <key>darwin</key>
- <map>
- <key>md5sum</key>
- <string>ca8f0134fa5ab6f34a6eeb8d0896c9b0</string>
- <key>url</key>
- <uri>https://s3.amazonaws.com/automated-builds-secondlife-com/hg/repo/brad_curl-autobuild/rev/216961/arch/Darwin/installer/curl-7.21.1-darwin-20101214.tar.bz2</uri>
- </map>
- <key>linux</key>
- <map>
- <key>md5sum</key>
- <string>9c9b629b62bf874d550c430ad678dc04</string>
- <key>url</key>
- <uri>https://s3.amazonaws.com/automated-builds-secondlife-com/hg/repo/brad_curl-autobuild/rev/216961/arch/Linux/installer/curl-7.21.1-linux-20101215.tar.bz2</uri>
- </map>
- <key>linux64</key>
- <map>
- <key>md5sum</key>
- <string>6994192cea7ab2d885a158a3de474273</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/curl-7.16.4a-linux64-20090303.tar.bz2</uri>
- </map>
- <key>windows</key>
- <map>
- <key>md5sum</key>
- <string>48691883065a82d53691d73aae81d4c1</string>
- <key>url</key>
- <uri>https://s3.amazonaws.com/automated-builds-secondlife-com/hg/repo/brad_curl-autobuild/rev/216961/arch/CYGWIN/installer/curl-7.21.1-windows-20101214.tar.bz2</uri>
- </map>
- </map>
- </map>
- <key>dbghelp</key>
- <map>
- <key>copyright</key>
- <string>Copyright Microsoft Corporation</string>
- <key>description</key>
- <string>dbghelp: Debug helper from Microsoft Debugging Tools For Windows</string>
- <key>license</key>
- <string>MSDTW</string>
- <key>packages</key>
- <map>
- <key>windows</key>
- <map>
- <key>md5sum</key>
- <string>b7563064037e032143ca2d610aae5153</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/dbghelp-6.11.1.404-windows-20090520.tar.bz2</uri>
- </map>
- </map>
- </map>
- <key>dbusglib</key>
- <map>
- <key>copyright</key>
- <string>Copyright (C) 2002, 2003 CodeFactory AB / Copyright (C) 2003, 2004 Red Hat, Inc.</string>
- <key>description</key>
- <string>dbus/dbus-glib: headers only</string>
- <key>license</key>
- <string>AFL2.1</string>
- <key>packages</key>
- <map>
- <key>linux</key>
- <map>
- <key>md5sum</key>
- <string>eb25444142d4102b0ce1b7ffaadb071e</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/dbusglib-linux-20080707.tar.bz2</uri>
- </map>
- </map>
- </map>
- <key>elfio</key>
- <map>
- <key>license</key>
- <string>lgpl</string>
- <key>packages</key>
- <map>
- <key>linux</key>
- <map>
- <key>md5sum</key>
- <string>82ea408af2f968cfe5f013ab241323ef</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/elfio-1.0.3-linux-20080812.tar.bz2</uri>
- </map>
- </map>
- </map>
- <key>expat</key>
- <map>
- <key>copyright</key>
- <string>Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd</string>
- <key>description</key>
- <string>An XML parser library written in C. It is a stream-oriented parser in which an application registers handlers for things the parser might find in the XML document (like start tags).</string>
- <key>license</key>
- <string>mit</string>
- <key>packages</key>
- <map>
- <key>darwin</key>
- <map>
- <key>md5sum</key>
- <string>c457a0a041ac4946265889a503d26c3d</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/expat-1.95.8-darwin-20090805.tar.bz2</uri>
- </map>
- <key>linux</key>
- <map>
- <key>md5sum</key>
- <string>67b470fd446b08c9831d1039674eae4e</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/expat-1.95.8-linux-20080812.tar.bz2</uri>
- </map>
- <key>linux64</key>
- <map>
- <key>md5sum</key>
- <string>278c61871419b9a4d50a4f88b7922403</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/expat-1.95.8-linux64-20080909.tar.bz2</uri>
- </map>
- <key>windows</key>
- <map>
- <key>md5sum</key>
- <string>5dbbdb4a9b5bec86d180ef20a5f8ccfb</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/expat-1.95.8-windows-20090917.tar.bz2</uri>
- </map>
- </map>
- </map>
- <key>fmod</key>
- <map>
- <key>copyright</key>
- <string>FMOD Sound System, copyright (C) Firelight Technologies Pty, Ltd., 1994-2006.</string>
- <key>description</key>
- <string>Audio engine and mp3 stream decoder .</string>
- <key>license</key>
- <string>fmod</string>
- <key>packages</key>
- <map>
- <key>darwin</key>
- <map>
- <key>md5sum</key>
- <string>261bcd3387066cf0a1d46549400052b5</string>
- <key>url</key>
- <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/fmod-3.75-darwin-20101007.tar.bz2</uri>
- </map>
- <key>linux</key>
- <map>
- <key>md5sum</key>
- <string>8490d97430c12c2e1ac19ff80a8d4db4</string>
- <key>url</key>
- <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/fmod-3.75-linux-20101007.tar.bz2</uri>
- </map>
- <key>windows</key>
- <map>
- <key>md5sum</key>
- <string>bab1babcb01ff9849b7f072d352e1ecd</string>
- <key>url</key>
- <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/fmod-3.75-windows-20101007.tar.bz2</uri>
- </map>
- </map>
- </map>
- <key>fontconfig</key>
- <map>
- <key>license</key>
- <string>mit</string>
- <key>packages</key>
- <map>
- <key>linux</key>
- <map>
- <key>md5sum</key>
- <string>9af6a1ed39fa540bfcaa402b0ea22f78</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/fontconfig-2.2.3-linux-20080613.tar.bz2</uri>
- </map>
- </map>
- </map>
- <key>freeglut</key>
- <map>
- <key>license</key>
- <string>mit</string>
- <key>packages</key>
- <map>
- <key>windows</key>
- <map>
- <key>md5sum</key>
- <string>fcbb695ff203775fad96d184bf5f34fc</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/freeglut-2.4.0-windows-20090608.tar.bz2</uri>
- </map>
- </map>
- </map>
- <key>freetype</key>
- <map>
- <key>copyright</key>
- <string>Copyright</string>
- <key>description</key>
- <string>Font</string>
- <key>license</key>
- <string>freetype</string>
- <key>packages</key>
- <map>
- <key>darwin</key>
- <map>
- <key>md5sum</key>
- <string>f00144dfb597140f328774c3244f0c3e</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/freetype-2.3.9-darwin-20090922.tar.bz2</uri>
- </map>
- <key>linux</key>
- <map>
- <key>md5sum</key>
- <string>9de3f44be65645c7f6af236139596942</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/freetype-2.3.9-linux-2010-02-19a-nommap.tar.bz2</uri>
- </map>
- <key>linux64</key>
- <map>
- <key>md5sum</key>
- <string>35f6fa557ba90f9cda0a18d1af2055a4</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/freetype-2.1.5-linux64-20080909.tar.bz2</uri>
- </map>
- <key>windows</key>
- <map>
- <key>md5sum</key>
- <string>88980fd6d91ac541b62dea877ebe6ba6</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/freetype-2.3.9-windows-20090917.tar.bz2</uri>
- </map>
- </map>
- </map>
- <key>glh_linear</key>
- <map>
- <key>copyright</key>
- <string>Copyright (c) 2000 Cass Everitt; Copyright (c) 2000 NVIDIA Corporation; All rights reserved.</string>
- <key>description</key>
- <string>nVidia NVParse SDK: platform-indepenedent C++ Apple OpenGL helper library</string>
- <key>license</key>
- <string>glh_linear</string>
- <key>packages</key>
- <map>
- <key>darwin</key>
- <map>
- <key>md5sum</key>
- <string>23bd9a75e5a2365a827461e6c324f52b</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/glh_linear-darwin-20080613.tar.bz2</uri>
- </map>
- <key>linux</key>
- <map>
- <key>md5sum</key>
- <string>23bd9a75e5a2365a827461e6c324f52b</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/glh_linear-linux-20080812.tar.bz2</uri>
- </map>
- <key>linux64</key>
- <map>
- <key>md5sum</key>
- <string>2965646aea1d2a6aec1fbc431c02733f</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/glh_linear-linux-20080613.tar.bz2</uri>
- </map>
- <key>windows</key>
- <map>
- <key>md5sum</key>
- <string>38b9ddfe8dceff55ee4351016a937d1b</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/glh_linear-windows-20080613.tar.bz2</uri>
- </map>
- </map>
- </map>
- <key>glib</key>
- <map>
- <key>description</key>
- <string>GLib is a library containing many useful C routines for things such as trees, hashes, and lists.</string>
- <key>license</key>
- <string>gpl</string>
- <key>packages</key>
- <map>
- <key>darwin</key>
- <map>
- <key>md5sum</key>
- <string>6cc5ce1fafd10299fdb890b3d4c3cf53</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/glib-2.0-darwin-20080817.tar.bz2</uri>
- </map>
- <key>linux</key>
- <map>
- <key>md5sum</key>
- <string>2f1a9e14f9213c2c9564c1c1cfdd6d47</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/glib-2.0-linux-20080817.tar.bz2</uri>
- </map>
- <key>windows</key>
- <map>
- <key>md5sum</key>
- <string>3d5e29d444dde4815b36082eedfc775a</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/glib-2.0-windows-20080817.tar.bz2</uri>
- </map>
- </map>
- </map>
- <key>glui</key>
- <map>
- <key>license</key>
- <string>lgpl</string>
- <key>packages</key>
- <map>
- <key>darwin</key>
- <map>
- <key>md5sum</key>
- <string>84f792a860691d0fad6d1de6eeb31baa</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/glui-2.36-darwin-20090623a.tar.bz2</uri>
- </map>
- <key>windows</key>
- <map>
- <key>md5sum</key>
- <string>5b8631fe510d4ebaeb965c673937e1e7</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/glui-2.3.6-windows-freeglut-20090608.tar.bz2</uri>
- </map>
- </map>
- </map>
- <key>google</key>
- <map>
- <key>license</key>
- <string>mit</string>
- <key>packages</key>
- <map>
- <key>linux</key>
- <map>
- <key>md5sum</key>
- <string>40db900872612615e849f17cbdfd2c27</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/google-linux-20080812.tar.bz2</uri>
- </map>
- </map>
- </map>
- <key>google-perftools</key>
- <map>
- <key>copyright</key>
- <string>Copyright (c) 2005, Google Inc.</string>
- <key>description</key>
- <string>Heap performance and validity checking tools from google. Includes TCMalloc, heap-checker, heap-profiler and cpu-profiler.</string>
- <key>license</key>
- <string>bsd</string>
- <key>packages</key>
- <map>
- <key>windows</key>
- <map>
- <key>md5sum</key>
- <string>32dba32ddd460a08e082898ebba6315c</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/google-perftools-1.0-windows-20090406.tar.bz2</uri>
- </map>
- </map>
- </map>
- <key>google_breakpad</key>
- <map>
- <key>copyright</key>
- <string>Copyright (c) 2006, Google Inc.</string>
- <key>description</key>
- <string>An open-source multi-platform crash reporting system </string>
- <key>license</key>
- <string>bsd</string>
- <key>packages</key>
- <map>
- <key>darwin</key>
- <map>
- <key>md5sum</key>
- <string>ced4010b59f1a579caa7fe3c18512499</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/google_breakpad-0.0.0-rev599-darwin-20100528a.tar.bz2</uri>
- </map>
- <key>linux</key>
- <map>
- <key>md5sum</key>
- <string>29c3e7dad60bbf02c811786436d99523</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/google_breakpad-0.0.0-rev599-linux-20100521b.tar.bz2</uri>
- </map>
- <key>windows</key>
- <map>
- <key>md5sum</key>
- <string>0859d47242990125f17eaab30bece2ff</string>
- <key>url</key>
- <uri>http://viewer-source-downloads.s3.amazonaws.com/install_pkgs/google_breakpad-0.0.0-rev599-windows-20100524.tar.bz2</uri>
- </map>
- </map>
- </map>
- <key>googlemock</key>
- <map>
- <key>copyright</key>
- <string>Copyright 2008, Google Inc.</string>
- <key>description</key>
- <string>Google C++ Mocking Framework (or Google Mock for short) is a library for writing and using C++ mock classes.</string>
- <key>license</key>
- <string>bsd</string>
- <key>packages</key>
- <map>
- <key>darwin</key>
- <map>
- <key>md5sum</key>
- <string>4863e9fea433d0a4be761ea5d3e8346a</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/googlemock-1.1.0-darwin-20090626.tar.bz2</uri>
- </map>
- <key>linux</key>
- <map>
- <key>md5sum</key>
- <string>877dabecf84339690191c6115c76366e</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/googlemock-1.1.0-linux32-20090527.tar.bz2</uri>
- </map>
- <key>windows</key>
- <map>
- <key>md5sum</key>
- <string>f601a82ea91030974072da8924cae41e</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/googlemock-1.1.0-windows-20090921.tar.bz2</uri>
- </map>
- </map>
- </map>
- <key>gstreamer</key>
- <map>
- <key>license</key>
- <string>lgpl</string>
- <key>packages</key>
- <map>
- <key>linux</key>
- <map>
- <key>md5sum</key>
- <string>c829b638b6eef71ca63418cb9aea46a2</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/gstreamer-linux-20080613.tar.bz2</uri>
- </map>
- <key>linux64</key>
- <map>
- <key>md5sum</key>
- <string>befc7520fe01250f39458f65c29bc584</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/gstreamer-linux64-20080909.tar.bz2</uri>
- </map>
- </map>
- </map>
- <key>gtk-atk-pango-glib</key>
- <map>
- <key>copyright</key>
- <string>Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald</string>
- <key>description</key>
- <string>Libraries associated with GTK for gui features. atk: interfaces for accessibility; glib: low-level core functionality for using GTK+ and GNOME; pango: layout/rendering of text w/ emphasis on internationalization.</string>
- <key>license</key>
- <string>lgpl</string>
- <key>packages</key>
- <map>
- <key>linux</key>
- <map>
- <key>md5sum</key>
- <string>21c16a74f8fc9a62e3ab944a6eb7403d</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/gtk-atk-pango-glib-linux-20080616.tar.bz</uri>
- </map>
- <key>windows</key>
- <map>
- <key>md5sum</key>
- <string>d963750bcd333a108b3697d220c87d09</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/gtk-atk-pango-glib-windows-20080613.tar.bz2</uri>
- </map>
- </map>
- </map>
- <key>havok</key>
- <map>
- <key>copyright</key>
- <string>on file</string>
- <key>description</key>
- <string>Physics engine for the simulator</string>
- <key>license</key>
- <string>havok</string>
- <key>packages</key>
- <map>
- <key>darwin</key>
- <map>
- <key>md5sum</key>
- <string>f64c08771a4fc456db2a55b47302078b</string>
- <key>url</key>
- <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/havok-4.6-darwin-20080812.tar.bz2</uri>
- </map>
- <key>linux</key>
- <map>
- <key>md5sum</key>
- <string>af7b1fc9072443009f19e43fb3c8342f</string>
- <key>url</key>
- <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/havok-4.6.1-linux-20081029.tar.bz2</uri>
- </map>
- <key>linux64</key>
- <map>
- <key>md5sum</key>
- <string>cd4076d6caf5fabff36bf48bd01e4ba8</string>
- <key>url</key>
- <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/havok-4.6.1-linux64-20081030.tar.bz2</uri>
- </map>
- <key>windows</key>
- <map>
- <key>md5sum</key>
- <string>f25fbb29c2275267233c79f0c68ca37f</string>
- <key>url</key>
- <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/havok-4.6.1-windows-20081030.tar.bz2</uri>
- </map>
- </map>
- </map>
- <key>jpeglib</key>
- <map>
- <key>copyright</key>
- <string>Copyright (c) 2003, Yves Piguet.</string>
- <key>description</key>
- <string>An open-source JPEG (JFIF) library</string>
- <key>license</key>
- <string>jpeglib</string>
- <key>packages</key>
- <map>
- <key>darwin</key>
- <map>
- <key>md5sum</key>
- <string>8d38d74c481e9aab4518c8f2a7d52800</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/jpeglib-6b-darwin-20080812.tar.bz2</uri>
- </map>
- <key>linux</key>
- <map>
- <key>md5sum</key>
- <string>8aa8e01e0c21f60f0ede0ffb04e9214f</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/jpeglib-6b-linux-20081218.tar.bz2</uri>
- </map>
- <key>linux64</key>
- <map>
- <key>md5sum</key>
- <string>0e7facf7d48531d20c0cd6a3c3f04021</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/jpeglib-6b-linux64-20080909.tar.bz2</uri>
- </map>
- <key>windows</key>
- <map>
- <key>md5sum</key>
- <string>6a6bb0143a2561e3276dab4bcfa425ef</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/jpeglib-6b-windows-20090917a.tar.bz2</uri>
- </map>
- </map>
- </map>
- <key>jsoncpp</key>
- <map>
- <key>copyright</key>
- <string>json-cpp library released to Public Domain by Baptiste Lepilleur &lt;blep@users.sourceforge.net&gt;</string>
- <key>description</key>
- <string>jsoncpp is an implementation of a JSON (http://json.org) reader and writer in C++.</string>
- <key>license</key>
- <string>jsoncpp</string>
- <key>packages</key>
- <map>
- <key>darwin</key>
- <map>
- <key>md5sum</key>
- <string>4c6b949778099a63550898f00f3e6a5e</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/jsoncpp-svn-r69-darwin-20090923.tar.bz2</uri>
- </map>
- <key>linux</key>
- <map>
- <key>md5sum</key>
- <string>a2a94b8ca1d32f23e3e668d64023514e</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/jsoncpp-svn-r69-linux-20090922.tar.bz2</uri>
- </map>
- <key>linux64</key>
- <map>
- <key>md5sum</key>
- <string>a06ab38628ab7b53b8f3326cd942a6a8</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/jsoncpp-svn-r69-linux64-20090922.tar.bz2</uri>
- </map>
- <key>windows</key>
- <map>
- <key>md5sum</key>
- <string>caf152cfc730737c124f7612cf68fbd3</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/jsoncpp-svn-r69-windows-20090922.tar.bz2</uri>
- </map>
- </map>
- </map>
- <key>kdu</key>
- <map>
- <key>copyright</key>
- <string>on file</string>
- <key>description</key>
- <string>Kakadu (KDU) JPEG-2000 decoder library. </string>
- <key>license</key>
- <string>kdu</string>
- <key>packages</key>
- <map>
- <key>darwin</key>
- <map>
- <key>md5sum</key>
- <string>8261994de5af6581e08c26fefe1b2810</string>
- <key>url</key>
- <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/kdu-6.4.1-darwin-20101123.tar.bz2</uri>
- </map>
- <key>linux</key>
- <map>
- <key>md5sum</key>
- <string>ed3e58899a424684dad49c94ba3813e7</string>
- <key>url</key>
- <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/kdu-6.4.1-linux-20101124.tar.bz2</uri>
- </map>
- <key>windows</key>
- <map>
- <key>md5sum</key>
- <string>066e089a5d9faeaf131e1f4e4860a163</string>
- <key>url</key>
- <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/kdu-6.4.1-windows-20101123.tar.bz2</uri>
- </map>
- </map>
- </map>
- <key>libmono</key>
- <map>
- <key>copyright</key>
- <string>(C) 2005 Novell, Inc. http://www.novell.com</string>
- <key>description</key>
- <string>An open source implementation of the ECMA/ISO ECMA-334 Common L\
-anguage Infrstructure (CLI) international standard</string>
- <key>license</key>
- <string>lgpl</string>
- <key>packages</key>
- <map>
- <key>darwin</key>
- <map>
- <key>md5sum</key>
- <string>39a803fcbe6f11b72358fc78b7777b6c</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libmono-darwin-20080724.tar.bz2</uri>
- </map>
- <key>linux</key>
- <map>
- <key>md5sum</key>
- <string>9bc0f8b7d5e0ff194b6d5635daf9ae3a</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libmono-1.2.6-linux-20080816a.tar.bz2</uri>
- </map>
- <key>linux64</key>
- <map>
- <key>md5sum</key>
- <string>451521b4cb57c35caf3efb8dcf99b99e</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libmono-1.2.6-linux64-20080926.tar.bz2</uri>
- </map>
- <key>windows</key>
- <map>
- <key>md5sum</key>
- <string>6712a09311a914752f47d5d62562a239</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libmono-1.2.6-windows-20080903.tar.bz2</uri>
- </map>
- </map>
- </map>
- <key>libpng</key>
- <map>
- <key>copyright</key>
- <string>Copyright (c) 2004, 2006-2008 Glenn Randers-Pehrson</string>
- <key>description</key>
- <string>An open, extensible image format with lossless compression. PNG Reference Library </string>
- <key>license</key>
- <string>libpng</string>
- <key>packages</key>
- <map>
- <key>darwin</key>
- <map>
- <key>md5sum</key>
- <string>82659b48831cbf58bf04b86602939e0b</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libpng-1.2.35-darwin-20090304.tar.bz2</uri>
- </map>
- <key>linux</key>
- <map>
- <key>md5sum</key>
- <string>f5e84c991f6e3caacb26db259593cbea</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libpng-1.2.35-linux-20090304.tar.bz2</uri>
- </map>
- <key>linux64</key>
- <map>
- <key>md5sum</key>
- <string>5ee1e62bde38520c7f134c4afb9ac9b1</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libpng-1.2.35-linux64-20090304.tar.bz2</uri>
- </map>
- <key>windows</key>
- <map>
- <key>md5sum</key>
- <string>c781cd9846cf20afb90ac40ad1a0ce9d</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libpng-1.2.35-windows-20090917.tar.bz2</uri>
- </map>
- </map>
- </map>
- <key>libuuid</key>
- <map>
- <key>copyright</key>
- <string>Copyright (C) 2007 Free Software Foundation, Inc. &lt;http://fsf.org/&gt;</string>
- <key>description</key>
- <string>Generates UUIDs under Linux. Originally a part of the ext2fs filesystem. Also see lluuid.cpp for all platforms. Part of the e2fsprogs package.</string>
- <key>license</key>
- <string>lgpl</string>
- <key>packages</key>
- <map>
- <key>linux</key>
- <map>
- <key>md5sum</key>
- <string>91b194aed4b38bc23493b198009a8c6a</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libuuid-linux-20090417.tar.bz2</uri>
- </map>
- </map>
- </map>
- <key>libxml</key>
- <map>
- <key>license</key>
- <string>mit</string>
- <key>packages</key>
- <map>
- <key>linux</key>
- <map>
- <key>md5sum</key>
- <string>4b5d2dcfe8a49b73fb69f10aab441092</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libxml-2.6.24-linux-20080613.tar.bz2</uri>
- </map>
- <key>linux64</key>
- <map>
- <key>md5sum</key>
- <string>921d7f980519101afb74623e29e9d175</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libxml-2.6.24-linux64-20080909.tar.bz2</uri>
- </map>
- </map>
- </map>
- <key>llqtwebkit</key>
- <map>
- <key>license</key>
- <string>lgpl</string>
- <key>packages</key>
- <map>
- <key>darwin</key>
- <map>
- <key>md5sum</key>
- <string>f07b063cdc207479b111576dc74127f0</string>
- <key>url</key>
- <uri>http://viewer-source-downloads.s3.amazonaws.com/install_pkgs/llqtwebkit-darwin-qt4.7.1-20110322.tar.bz2</uri>
- </map>
- <key>linux</key>
- <map>
- <key>md5sum</key>
- <string>5d743c93b970abe685b185de83001a6e</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llqtwebkit-linux-qt4.6-20100923.tar.bz2</uri>
- </map>
- <key>windows</key>
- <map>
- <key>md5sum</key>
- <string>1e66b1ecab911a60ba50b59361ef62e1</string>
- <key>url</key>
- <uri>http://viewer-source-downloads.s3.amazonaws.com/install_pkgs/llqtwebkit-windows-qt4.7.1-20110317.tar.bz2</uri>
- </map>
- </map>
- </map>
- <key>mesa</key>
- <map>
- <key>copyright</key>
- <string>Copyright (C) 1999-2007 Brian Paul All Rights Reserved.</string>
- <key>description</key>
- <string>Mesa 3-D graphics library. Provides the required Apple OpenGL headers under Linux.</string>
- <key>license</key>
- <string>mesa</string>
- <key>packages</key>
- <map>
- <key>linux</key>
- <map>
- <key>md5sum</key>
- <string>70d0bbe1145fff29a0131349c898260e</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/mesa-7.0-linux-20080812.tar.bz2</uri>
- </map>
- <key>linux64</key>
- <map>
- <key>md5sum</key>
- <string>56630977f9261bd82039b0da08a0685c</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/mesa-6.2.1-linux64-20081016.tar.bz2</uri>
- </map>
- <key>windows</key>
- <map>
- <key>md5sum</key>
- <string>82cdcdcb2d0615389a7480485ea35f4c</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/mesa-7.0-windows-20080613.tar.bz2</uri>
- </map>
- </map>
- </map>
- <key>mysql</key>
- <map>
- <key>license</key>
- <string>gpl</string>
- <key>packages</key>
- <map>
- <key>darwin</key>
- <map>
- <key>md5sum</key>
- <string>df27f2db244ea2762759a06cd75ada4e</string>
- <key>url</key>
- <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/mysql-darwin-20080812.tar.bz2</uri>
- </map>
- <key>linux</key>
- <map>
- <key>md5sum</key>
- <string>cc86b4cc858655e23704d1168325d7b9</string>
- <key>url</key>
- <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/mysqlclient-linux-20090320.tar.bz2</uri>
- </map>
- <key>windows</key>
- <map>
- <key>md5sum</key>
- <string>98bac06680dca907e783d8dd4aa9edde</string>
- <key>url</key>
- <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/mysql-windows-20080804.tar.bz2</uri>
- </map>
- </map>
- </map>
- <key>ndofdev</key>
- <map>
- <key>copyright</key>
- <string>Copyright (c) 2007, 3Dconnexion, Inc. - All rights reserved.</string>
- <key>description</key>
- <string>in use on windows and darwin for joystick support.</string>
- <key>license</key>
- <string>linden</string>
- <key>packages</key>
- <map>
- <key>darwin</key>
- <map>
- <key>md5sum</key>
- <string>17999c47e17f2dd9e12a22372ce8ff14</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ndofdev-darwin-20080812.tar.bz2</uri>
- </map>
- <key>linux</key>
- <map>
- <key>md5sum</key>
- <string>9469c3732a33a154fa0a2807b9f36ccc</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ndofdev-linux-0.2-20080828.tar.bz2</uri>
- </map>
- <key>windows</key>
- <map>
- <key>md5sum</key>
- <string>f0df8a1e60991095e3adca1450b8c9c0</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ndofdev-windows-20090917.tar.bz2</uri>
- </map>
- </map>
- </map>
- <key>ogg-vorbis</key>
- <map>
- <key>copyright</key>
- <string>Copyright (C) 2008 Xiph.org Foundation</string>
- <key>description</key>
- <string>Ogg: container format Vorbis: audio compression scheme</string>
- <key>license</key>
- <string>ogg-vorbis</string>
- <key>packages</key>
- <map>
- <key>darwin</key>
- <map>
- <key>md5sum</key>
- <string>a6843398b780645c4897c9776c688926</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ogg-vorbis-1.03-1.1.2-darwin-20080812.tar.bz2</uri>
- </map>
- <key>linux</key>
- <map>
- <key>md5sum</key>
- <string>6dc0536329a0aadf76e3054ffd4da61c</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ogg-vorbis-1.2.0-linux-20081201.tar.bz2</uri>
- </map>
- <key>linux64</key>
- <map>
- <key>md5sum</key>
- <string>964c71e6ee22be1bcaf6d480e74cdd14</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ogg-vorbis-1.2.0-linux64-20080909.tar.bz2</uri>
- </map>
- <key>windows</key>
- <map>
- <key>md5sum</key>
- <string>9bf1fea65e66b2cd3075e6ffd7eb57ad</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ogg-vorbis-1.1.3-1.2.0-windows-20080723.tar.bz2</uri>
- </map>
- </map>
- </map>
- <key>openSSL</key>
- <map>
- <key>license</key>
- <string>openSSL</string>
- <key>packages</key>
- <map>
- <key>darwin</key>
- <map>
- <key>md5sum</key>
- <string>11d2be4f2b172430747b7d4a6739e3d8</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openSSL-0.9.8l-darwin-20100428.tar.bz2</uri>
- </map>
- <key>linux</key>
- <map>
- <key>md5sum</key>
- <string>f219ef07b02e2abb9282345c3a8f2b39</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openSSL-0.9.7c-linux-20080812.tar.bz2</uri>
- </map>
- <key>linux64</key>
- <map>
- <key>md5sum</key>
- <string>00b23f28a2457d9dabbaff0b29ee7323</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openSSL-0.9.8g-linux64-20080909.tar.bz2</uri>
- </map>
- <key>windows</key>
- <map>
- <key>md5sum</key>
- <string>dd85209081b832e836de6e1538541d89</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openSSL-0.9.8j-windows-20090129.tar.bz2</uri>
- </map>
- </map>
- </map>
- <key>openal-soft</key>
- <map>
- <key>copyright</key>
- <string>Copyright (C) 2008 by authors.</string>
- <key>description</key>
- <string>3D Audio library</string>
- <key>license</key>
- <string>lgpl</string>
- <key>packages</key>
- <map>
- <key>darwin</key>
- <map>
- <key>md5sum</key>
- <string>a0757244e3e6688fde2ffeea35cc1f96</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openal-darwin-20080924.tar.bz2</uri>
- </map>
- <key>linux</key>
- <map>
- <key>md5sum</key>
- <string>75a7004ab14bea46594b1c652f1a6040</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openal-linux-20100120-3ad86a1c.tar.bz2</uri>
- </map>
- <key>linux64</key>
- <map>
- <key>md5sum</key>
- <string>5ad0a3ab623356c1ad61394ba238f99f</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openal-soft-1.6.372-linux64-20081219.tar.bz2</uri>
- </map>
- <key>windows</key>
- <map>
- <key>md5sum</key>
- <string>a0757244e3e6688fde2ffeea35cc1f96</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openal-windows-20080924.tar.bz2</uri>
- </map>
- </map>
- </map>
- <key>openjpeg</key>
- <map>
- <key>copyright</key>
- <string>Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium</string>
- <key>description</key>
- <string>An open-source JPEG-2000 library; a slower alternative to Kadaku. Used in the open source release </string>
- <key>license</key>
- <string>openjpeg</string>
- <key>packages</key>
- <map>
- <key>darwin</key>
- <map>
- <key>md5sum</key>
- <string>23313fda213a2496945435db2a0ee78b</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openjpeg-1.3.0-darwin-20090501.tar.bz2</uri>
- </map>
- <key>linux</key>
- <map>
- <key>md5sum</key>
- <string>02af0dad64803e0d821bc09e6038682c</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openjpeg-1.3-linux-20081124b.tar.bz2</uri>
- </map>
- <key>linux64</key>
- <map>
- <key>md5sum</key>
- <string>44f1bc9d47e4a54fc274c213f2cb565f</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openjpeg-1.2.0-linux64-20080909.tar.bz2</uri>
- </map>
- <key>windows</key>
- <map>
- <key>md5sum</key>
- <string>41541a98106894e28a6bf585010fea65</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openjpeg-1.3-windows-20090407.tar.bz2</uri>
- </map>
- </map>
- </map>
- <key>pth</key>
- <map>
- <key>copyright</key>
- <string>Copyright (c) 1999-2006 Ralf S. Engelschall &lt;rse@gnu.org&gt;</string>
- <key>description</key>
- <string>Portable cooperative threads package, used to support Boost.Coroutine on Mac OS X 10.4</string>
- <key>license</key>
- <string>lgpl</string>
- <key>packages</key>
- <map>
- <key>darwin</key>
- <map>
- <key>md5sum</key>
- <string>216cb6217a06c64dfae30a55ab8b975c</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/pth-2.0.7-darwin-20090923.tar.bz2</uri>
- </map>
- <key>linux</key>
- <map>
- <key>md5sum</key>
- <string>c5c2f73847c126e679d925beab48c7d4</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/pth-2.0.7-linux-20090427.tar.bz2</uri>
- </map>
- <key>linux32</key>
- <map>
- <key>md5sum</key>
- <string>c5c2f73847c126e679d925beab48c7d4</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/pth-2.0.7-linux32-20090427.tar.bz2</uri>
- </map>
- <key>linux64</key>
- <map>
- <key>md5sum</key>
- <string>c5c2f73847c126e679d925beab48c7d4</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/pth-2.0.7-linux64-20090427.tar.bz2</uri>
- </map>
- <key>windows</key>
- <map>
- <key>md5sum</key>
- <string>c5c2f73847c126e679d925beab48c7d4</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/pth-2.0.7-windows-20090427.tar.bz2</uri>
- </map>
- </map>
- </map>
- <key>pulseaudio</key>
- <map>
- <key>copyright</key>
- <string>Copyright 2004-2006 Lennart Poettering, Copyright 2006 Pierre Ossman (ossman@cendio.se) for Cendio AB</string>
- <key>description</key>
- <string>pulseaudio: headers only</string>
- <key>license</key>
- <string>lgpl</string>
- <key>packages</key>
- <map>
- <key>linux</key>
- <map>
- <key>md5sum</key>
- <string>30cb00069fe2a545fbf7be1070386236</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/linux-pulse-headers-0.9.14.tar.bz2</uri>
- </map>
- </map>
- </map>
- <key>quicktime</key>
- <map>
- <key>copyright</key>
- <string>Copyright (C) 1990-2007 by Apple Computer, Inc., all rights reserved.</string>
- <key>description</key>
- <string>Separate download. Used to play in-world video clips on a prim. </string>
- <key>license</key>
- <string>quicktime</string>
- <key>packages</key>
- <map>
- <key>windows</key>
- <map>
- <key>md5sum</key>
- <string>be45825cc14ede53790ac93c58307dcb</string>
- <key>url</key>
- <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/quicktime-sdk-windows-7.3-20091110.tar.bz2</uri>
- </map>
- </map>
- </map>
- <key>smartheap</key>
- <map>
- <key>copyright</key>
- <string>Copyright (C) 1991-2000 Compuware Corporation. All Rights Reserved.</string>
- <key>description</key>
- <string>Memory Management Library</string>
- <key>license</key>
- <string>smartheap</string>
- <key>packages</key>
- <map>
- <key>darwin</key>
- <map>
- <key>md5sum</key>
- <string>f54131b5f228e805c64c2e4e6c96579a</string>
- <key>url</key>
- <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/smartheap-6.0.2-darwin-20080610.tar.bz2</uri>
- </map>
- <key>linux</key>
- <map>
- <key>md5sum</key>
- <string>499208522bf7d7843e1d014d64214e06</string>
- <key>url</key>
- <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/smartheap-6.0.2-linux-20080610.tar.bz2</uri>
- </map>
- <key>windows</key>
- <map>
- <key>md5sum</key>
- <string>78fd47017f21d11eae43bca3e38a3e1e</string>
- <key>url</key>
- <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/smartheap-6.0.2-windows-20080611.tar.bz2</uri>
- </map>
- </map>
- </map>
- <key>tut</key>
- <map>
- <key>copyright</key>
- <string>Copyright 2002-2006 Vladimir Dyuzhev, Copyright 2007 Denis Kononenko, Copyright 2008 Michal Rzechonek</string>
- <key>description</key>
- <string>C++ Template Unit Test</string>
- <key>license</key>
- <string>bsd</string>
- <key>packages</key>
- <map>
- <key>common</key>
- <map>
- <key>md5sum</key>
- <string>a1b8a118ba9df1f2a73f6aafa7980e83</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/tut-2008-11-30-common-20081208.tar.bz2</uri>
- </map>
- </map>
- </map>
- <key>unistd</key>
- <map>
- <key>copyright</key>
- <string>(c) 2008 Linden Lab.</string>
- <key>description</key>
- <string>Placeholder file to make flex happy on windows.</string>
- <key>license</key>
- <string>linden</string>
- <key>packages</key>
- <map>
- <key>windows</key>
- <map>
- <key>md5sum</key>
- <string>6353aff33d7d03b22055aec76f53a866</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/unistd-windows-20080611.tar.bz2</uri>
- </map>
- </map>
- </map>
- <key>slvoice</key>
- <map>
- <key>copyright</key>
- <string> </string>
- <key>license</key>
- <string>vivox</string>
- <key>packages</key>
- <map>
- <key>darwin</key>
- <map>
- <key>md5sum</key>
- <string>2f9b3528d4b5f858fb8dcee4b6dd5188</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/slvoice-3.2.0002.9361-darwin-20101117a.tar.bz2</uri>
- </map>
- <key>linux</key>
- <map>
- <key>md5sum</key>
- <string>cde4728b8a75a76c72a8785815cb769f</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/slvoice-3.2.0002.9361-linux-20101117a.tar.bz2</uri>
- </map>
- <key>windows</key>
- <map>
- <key>md5sum</key>
- <string>940ac55a6d0141c958bf2b14939d8474</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/slvoice-3.2.0002.9361-windows-20101117a.tar.bz2</uri>
- </map>
- </map>
- </map>
- <key>xmlrpc-epi</key>
- <map>
- <key>copyright</key>
- <string>Copyright 2000 Epinions, Inc.</string>
- <key>description</key>
- <string>Implementation of the xmlrpc protocol in C that provides an API for developers to serialize RPC requests to and from XML. </string>
- <key>license</key>
- <string>xmlrpc-epi</string>
- <key>packages</key>
- <map>
- <key>darwin</key>
- <map>
- <key>md5sum</key>
- <string>2d3a918c88d756422c1a8139ebe15f56</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/xmlrpc-epi-0.51-darwin-20080812.tar.bz2</uri>
- </map>
- <key>linux</key>
- <map>
- <key>md5sum</key>
- <string>84a219199240ea70f54439c02acef0cd</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/xmlrpc-epi-0.51-linux-20080812.tar.bz2</uri>
- </map>
- <key>linux64</key>
- <map>
- <key>md5sum</key>
- <string>dc67b896c56116df8e18f2d1bbd07031</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/xmlrpc-epi-0.51-linux64-20080909.tar.bz2</uri>
- </map>
- <key>windows</key>
- <map>
- <key>md5sum</key>
- <string>262629bcaa39dcf7266caa50da01a599</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/xmlrpc-epi-0.51-windows-20091016.tar.bz2</uri>
- </map>
- </map>
- </map>
- <key>zlib</key>
- <map>
- <key>copyright</key>
- <string>Copyright (C) 1995-2003 Jean-loup Gailly and Mark Adler</string>
- <key>description</key>
- <string>A Massively Spiffy Yet Delicately Unobtrusive Compression Library (Also Free, Not to Mention Unencumbered by Patents)</string>
- <key>license</key>
- <string>zlib</string>
- <key>packages</key>
- <map>
- <key>darwin</key>
- <map>
- <key>md5sum</key>
- <string>c844e1b05723ce078dbbd5aea9cdd3ad</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/zlib-1.1.4-darwin-20080818.tar.bz2</uri>
- </map>
- <key>linux</key>
- <map>
- <key>md5sum</key>
- <string>26fe88213c213dc6153690ab142c25ca</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/zlib-1.2.3dfsg-linux-20091208.tar.bz2</uri>
- </map>
- <key>linux64</key>
- <map>
- <key>md5sum</key>
- <string>4bddfb2c6dd7b1470a3ed675ac14bd9a</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/zlib-1.2.3-linux64-20080909.tar.bz2</uri>
- </map>
- <key>windows</key>
- <map>
- <key>md5sum</key>
- <string>73baf52a740d151fddbc2a008369c462</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/zlib-1.2.3-windows-20090921.tar.bz2</uri>
- </map>
- </map>
- </map>
- </map>
- <key>licenses</key>
- <map>
- <key>AFL2.1</key>
- <map>
- <key>url</key>
- <string>http://opensource-definition.org/licenses/afl-2.1.html</string>
- </map>
- <key>GL</key>
- <map>
- <key>url</key>
- <string>http://www.xfree86.org/4.4.0/LICENSE9.html#sgi</string>
- </map>
- <key>MSDTW</key>
- <map>
- <key>text</key>
- <string>MICROSOFT SOFTWARE LICENSE TERMS
-MICROSOFT DEBUGGING TOOLS FOR WINDOWS
-These license terms are an agreement between Microsoft Corporation (or based on where you live, one of
-its affiliates) and you. Please read them. They apply to the software named above, which includes the
-media on which you received it, if any. The terms also apply to any Microsoft
-* updates,
-* supplements,
-* Internet-based services
-* support services, and
-* Debugging symbol files that you may access over the internet
-for this software, unless other terms accompany those items. If so, those terms apply.
-By using the software, you accept these terms. If you do not accept them, do not use the
-software.
-If you comply with these license terms, you have the rights below.
-1. INSTALLATION AND USE RIGHTS. One user may install and use any number of copies of the
-software on your devices to design, develop, debug and test your programs.
-2. ADDITIONAL LICENSING REQUIREMENTS AND/OR USE RIGHTS.
-a. Distributable Code. The software contains code that you are permitted to distribute in programs
-you develop if you comply with the terms below.
-i. Right to Use and Distribute. The code and text files listed below are “Distributable Code.”
-* REDIST.TXT Files. You may copy and distribute the object code form of code listed in
-REDIST.TXT files.
-* Sample Code. You may modify, copy, and distribute the source and object code form of
-code marked as “sample.”
-* Third Party Distribution. You may permit distributors of your programs to copy and
-distribute the Distributable Code as part of those programs.
-ii. Distribution Requirements. For any Distributable Code you distribute, you must
-* add significant primary functionality to it in your programs;
-* require distributors and external end users to agree to terms that protect it at least as much
-as this agreement;
-* display your valid copyright notice on your programs; and
-* indemnify, defend, and hold harmless Microsoft from any claims, including attorneys’ fees,
-related to the distribution or use of your programs.
-iii. Distribution Restrictions. You may not
-* alter any copyright, trademark or patent notice in the Distributable Code;
-* distribute any symbol files which you may access or use under these license terms for the
-software;
-* use Microsoft’s trademarks in your programs’ names or in a way that suggests your
-programs come from or are endorsed by Microsoft;
-* distribute Distributable Code to run on a platform other than the Windows platform;
-* include Distributable Code in malicious, deceptive or unlawful programs; or
-* modify or distribute the source code of any Distributable Code so that any part of it
-becomes subject to an Excluded License. An Excluded License is one that requires, as a
-condition of use, modification or distribution, that
-* the code be disclosed or distributed in source code form; or
-* others have the right to modify it.
-3. SCOPE OF LICENSE. The software is licensed, not sold. This agreement only gives you some rights
-to use the software. Microsoft reserves all other rights. Unless applicable law gives you more rights
-despite this limitation, you may use the software only as expressly permitted in this agreement. In
-doing so, you must comply with any technical limitations in the software that only allow you to use it in
-certain ways. You may not
-* work around any technical limitations in the software;
-* reverse engineer, decompile or disassemble the software, except and only to the extent that
-applicable law expressly permits, despite this limitation;
-* make more copies of the software than specified in this agreement or allowed by applicable law,
-despite this limitation;
-* publish the software for others to copy;
-* rent, lease or lend the software;
-* transfer the software or this agreement to any third party; or
-* use the software for commercial software hosting services.
-4. INTERNET-BASED SERVICES. Microsoft provides Internet-based services with the software. It may
-change or cancel them at any time.
-a. Consent for Internet-Based Services. The software contains features which may connect to
-Microsoft or service provider computer systems over the Internet. In some cases, you will not
-receive a separate notice when they connect. You may switch these features on or you may
-choose not to use them. For more information about these features, see
-http://www.microsoft.com/info/privacy/default.mspx. By using these features, you consent to the transmission of
-this information. Microsoft does not use the information to identify or contact you.
-b. Misuse of Internet-based Services. You may not use these services in any way that could
-harm them or impair anyone else’s use of them. You may not use the services to try to gain
-unauthorized access to any service, data, account or network by any means.
-
-5. BACKUP COPY. You may make one backup copy of the software. You may use it only to reinstall the
-software.
-6. DOCUMENTATION. Any person that has valid access to your computer or internal network may copy
-and use the documentation for your internal, reference purposes.
-7. EXPORT RESTRICTIONS. The software is subject to United States export laws and regulations. You
-must comply with all domestic and international export laws and regulations that apply to the software.
-These laws include restrictions on destinations, end users and end use. For additional information, see
-www.microsoft.com/exporting.
-8. SUPPORT SERVICES. Because this software is “as is,” we may not provide support services for it.
-9. ENTIRE AGREEMENT. This agreement, and the terms for supplements, updates, Internet-based
-services and support services that you use, are the entire agreement for the software and support
-services.
-10. APPLICABLE LAW.
-a. United States. If you acquired the software in the United States, Washington state law governs
-the interpretation of this agreement and applies to claims for breach of it, regardless of conflict of
-laws principles. The laws of the state where you live govern all other claims, including claims under
-state consumer protection laws, unfair competition laws, and in tort.
-b. Outside the United States. If you acquired the software in any other country, the laws of that
-country apply.
-11. LEGAL EFFECT. This agreement describes certain legal rights. You may have other rights under the
-laws of your country. You may also have rights with respect to the party from whom you acquired the
-software. This agreement does not change your rights under the laws of your country if the laws of
-your country do not permit it to do so.
-12. DISCLAIMER OF WARRANTY. The software is licensed “as-is.” You bear the risk of using
-it. Microsoft gives no express warranties, guarantees or conditions. You may have
-additional consumer rights under your local laws which this agreement cannot change. To
-the extent permitted under your local laws, Microsoft excludes the implied warranties of
-merchantability, fitness for a particular purpose and non-infringement.
-13. LIMITATION ON AND EXCLUSION OF REMEDIES AND DAMAGES. You can recover from
-Microsoft and its suppliers only direct damages up to U.S. $5.00. You cannot recover any
-other damages, including consequential, lost profits, special, indirect or incidental
-damages.
-This limitation applies to
-* anything related to the software, services, content (including code) on third party Internet sites, or
-third party programs; and
-* claims for breach of contract, breach of warranty, guarantee or condition, strict liability, negligence,
-or other tort to the extent permitted by applicable law.
-It also applies even if Microsoft knew or should have known about the possibility of the damages. The
-above limitation or exclusion may not apply to you because your country may not allow the exclusion or
-limitation of incidental, consequential or other damages.
- </string>
- </map>
- <key>apache 2.0</key>
- <map>
- <key>url</key>
- <string>http://www.apache.org/licenses/LICENSE-2.0</string>
- </map>
- <key>artwork</key>
- <map>
- <key>text</key>
- <string>COPYRIGHT AND PERMISSION NOTICE
-
-Second Life(TM) Viewer Artwork. Copyright (C) 2008 Linden Research, Inc.
-
-Linden Research, Inc. ("Linden Lab") licenses the Second Life viewer
-artwork and other works in the files distributed with this Notice under
-the Creative Commons Attribution-Share Alike 3.0 License, available at
-http://creativecommons.org/licenses/by-sa/3.0/legalcode. For the license
-summary, see http://creativecommons.org/licenses/by-sa/3.0/.
-
-Notwithstanding the foregoing, all of Linden Lab's trademarks, including
-but not limited to the Second Life brand name and Second Life Eye-in-Hand
-logo, are subject to our trademark policy at
-http://secondlife.com/corporate/trademark/.
-
-If you distribute any copies or adaptations of the Second Life viewer
-artwork or any other works in these files, you must include this Notice
-and clearly identify any changes made to the original works. Include
-this Notice and information where copyright notices are usually included,
-for example, after your own copyright notice acknowledging your use of
-the Second Life viewer artwork, in a text file distributed with your
-program, in your application's About window, or on a credits page for
-your work.
-</string>
- <key>url</key>
- <string>http://svn.secondlife.com/svn/linden/trunk/doc/LICENSE-logos.txt</string>
- </map>
- <key>boost</key>
- <map>
- <key>url</key>
- <string>http://www.boost.org/LICENSE_1_0.txt</string>
- </map>
- <key>bsd</key>
- <map>
- <key>url</key>
- <string>http://www.opensource.org/licenses/bsd-license.php</string>
- </map>
- <key>c-ares</key>
- <map>
- <key>text</key>
- <string>http://daniel.haxx.se/projects/c-ares/license.html</string>
- </map>
- <key>curl</key>
- <map>
- <key>url</key>
- <string>http://curl.haxx.se/docs/copyright.html</string>
- </map>
- <key>fmod</key>
- <map>
- <key>url</key>
- <string>http://www.fmod.org/ifmodlicense.html</string>
- </map>
- <key>freetype</key>
- <map>
- <key>url</key>
- <string>http://freetype.sourceforge.net/FTL.TXT</string>
- </map>
- <key>glh_linear</key>
- <map>
- <key>text</key>
- <string>glh - is a platform-indepenedent C++ OpenGL helper library
-
-Copyright (c) 2000 Cass Everitt
-Copyright (c) 2000 NVIDIA Corporation
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or
-without modification, are permitted provided that the following
-conditions are met:
-
-Redistributions of source code must retain the above
-copyright notice, this list of conditions and the following
-disclaimer.
-Redistributions in binary form must reproduce the above
-copyright notice, this list of conditions and the following
-disclaimer in the documentation and/or other materials
-provided with the distribution.
-The names of contributors to this software may not be used
-to endorse or promote products derived from this software
-without specific prior written permission.
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
-FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
-BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
-ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGE.
-
-Cass Everitt - cass@r3.nu
-
-</string>
- </map>
- <key>glut</key>
- <map>
- <key>url</key>
- <string>http://www.xmission.com/~nate/glut/README-win32.txt</string>
- </map>
- <key>gpl</key>
- <map>
- <key>url</key>
- <string>http://www.gnu.org/licenses/gpl.html</string>
- </map>
- <key>havok</key>
- <map>
- <key>text</key>
- <string>on file</string>
- </map>
- <key>intel</key>
- <map>
- <key>text</key>
- <string>Haven't yet found.
-</string>
- </map>
- <key>jpeglib</key>
- <map>
- <key>text</key>
- <string>http://nyctergatis.com/jpeglib/</string>
- </map>
- <key>jsoncpp</key>
- <map>
- <key>text</key>
- <string>The json-cpp library and this documentation are in Public Domain. Retrieved from http://jsoncpp.sourceforge.net/ on 2009-09-04.</string>
- <key>url</key>
- <string>http://jsoncpp.sourceforge.net</string>
- </map>
- <key>kdu</key>
- <map>
- <key>text</key>
- <string>jpeg2000 license #00024 (on file)</string>
- </map>
- <key>lgpl</key>
- <map>
- <key>url</key>
- <string>http://www.gnu.org/copyleft/lgpl.html</string>
- </map>
- <key>libpng</key>
- <map>
- <key>text</key>
- <string>http://www.libpng.org/pub/png/src/libpng-LICENSE.txt</string>
- </map>
- <key>linden</key>
- <map>
- <key>text</key>
- <string>Using this license for Linden Lab owned library files</string>
- </map>
- <key>mesa</key>
- <map>
- <key>url</key>
- <string>http://www.mesa3d.org/license.html</string>
- </map>
- <key>mit</key>
- <map>
- <key>text</key>
- <string>http://www.jclark.com/xml/copying.txt</string>
- </map>
- <key>ogg-vorbis</key>
- <map>
- <key>url</key>
- <string>http://www.xiph.org/licenses/bsd/</string>
- </map>
- <key>openSSL</key>
- <map>
- <key>url</key>
- <string>http://www.openssl.org/source/license.html</string>
- </map>
- <key>openjpeg</key>
- <map>
- <key>url</key>
- <string>http://www.openjpeg.org/BSDlicense.txt</string>
- </map>
- <key>quicktime</key>
- <map>
- <key>text</key>
- <string>ENGLISH
-
-Apple Computer, Inc.
-QuickTime 7 Software Developer Kit (SDK)
-Software License Agreement
-
-PLEASE READ THIS SOFTWARE LICENSE AGREEMENT ("LICENSE") BEFORE USING THE SOFTWARE. BY USING THE SOFTWARE, YOU ARE AGREEING TO BE BOUND BY THE TERMS OF THIS LICENSE. IF YOU ARE ACCESSING THE SOFTWARE ELECTRONICALLY, SIGNIFY YOUR AGREEMENT TO BE BOUND BY THE TERMS OF THIS LICENSE BY CLICKING THE "AGREE/ACCEPT" BUTTON. IF YOU DO NOT AGREE TO THE TERMS OF THIS LICENSE, RETURN THE APPLE SOFTWARE TO THE PLACE WHERE YOU OBTAINED IT FOR A REFUND OR, IF THE SOFTWARE WAS ACCESSED ELECTRONICALLY, CLICK "DISAGREE/DECLINE".
-
-IMPORTANT NOTE: To the extent this software may be used to reproduce materials, it is licensed to you only for reproduction of materials you are authorized or legally permitted to reproduce.
-
-1. License. Any software, tools, utilities, sample code, documentation, fonts, API?s, header files and other materials accompanying this License, whether on disk, print or electronic documentation, in read only memory, or any other media, (collectively, the "Apple Software") are licensed, not sold, to you by Apple Computer, Inc. ("Apple") for use only under the terms of this License, and Apple reserves all rights not expressly granted to you. The rights granted herein are limited to Apple's and its licensors' intellectual property rights in the Apple Software and do not include any other patents or intellectual property rights. You own the media on which the Apple Software is recorded but Apple and/or Apple's licensor(s) retain ownership of the Apple Software itself. The Apple Software in this package and any copies, modifications and derivative works that this License authorizes you to make are subject to this License.
-
-2. Permitted Uses and Restrictions. You may use the Apple Software to develop application software that is compatible with, and runs only on Mac OS X and/or Windows platforms with QuickTime installed. Except for compiling header files and linking libraries as necessary to build your application software, you have no right to modify, incorporate into or include in combination with your own programs, license or otherwise redistribute any portion of the Apple Software. Your software application may not interfere with the functionality of QuickTime Player or the QuickTime Plug-in, including but not limited to file type or MIME type associations that are registered to QuickTime. You may make only as many internal use copies of the Apple Software as reasonably necessary to use the Apple Software as permitted in this paragraph and distribute such copies only to your employees whose job duties require them to so use the Apple Software. You must reproduce on each copy of the Apple Software or portion thereof, the Apple copyright notice and any other proprietary legends that were on the original copy of the Apple Software. Except as expressly permitted in this License, you may not decompile, reverse engineer, disassemble, modify, rent, lease, loan, sublicense, distribute or create derivative works based upon the Apple Software in whole or part. Your rights under this License will terminate automatically without notice from Apple if you fail to comply with any term(s) of this License. In addition, Apple reserves the right to terminate this License if a new version of Apple's operating system software or the Apple Software is released which is incompatible with the Apple Software.
-
-3. Disclaimer Of Warranty. The Apple Software may be "alpha", "beta", "development", pre-release, untested, and/or not fully tested and may contain errors that could cause failures or loss of data, be incomplete or contain inaccuracies. YOU EXPRESSLY ACKNOWLEDGE AND AGREE THAT USE OF THE APPLE SOFTWARE IS AT YOUR SOLE RISK AND THAT THE ENTIRE RISK AS TO SATISFACTORY QUALITY, PERFORMANCE, ACCURACY AND EFFORT IS WITH YOU. EXCEPT FOR THE LIMITED WARRANTY ON MEDIA SET FORTH ABOVE AND TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, THE APPLE SOFTWARE IS PROVIDED "AS IS", WITH ALL FAULTS AND WITHOUT WARRANTY OF ANY KIND, AND APPLE AND APPLE'S LICENSORS (COLLECTIVELY REFERRED TO AS "APPLE" FOR THE PURPOSES OF SECTIONS 4 AND 5) HEREBY DISCLAIM ALL WARRANTIES AND CONDITIONS WITH RESPECT TO THE APPLE SOFTWARE, EITHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES AND/OR CONDITIONS OF MERCHANTABILITY, OF SATISFACTORY QUALITY, OF FITNESS FOR A PARTICULAR PURPOSE, OF ACCURACY, OF QUIET ENJOYMENT, AND NON-INFRINGEMENT OF THIRD PARTY RIGHTS. APPLE DOES NOT WARRANT AGAINST INTERFERENCE WITH YOUR ENJOYMENT OF THE APPLE SOFTWARE, THAT THE FUNCTIONS CONTAINED IN THE APPLE SOFTWARE WILL MEET YOUR REQUIREMENTS, THAT THE OPERATION OF THE APPLE SOFTWARE WILL BE UNINTERRUPTED OR ERROR-FREE, OR THAT DEFECTS IN THE APPLE SOFTWARE WILL BE CORRECTED. NO ORAL OR WRITTEN INFORMATION OR ADVICE GIVEN BY APPLE OR AN APPLE AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY. SHOULD THE APPLE SOFTWARE PROVE DEFECTIVE, YOU ASSUME THE ENTIRE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES OR LIMITATIONS ON APPLICABLE STATUTORY RIGHTS OF A CONSUMER, SO THE ABOVE EXCLUSION AND LIMITATIONS MAY NOT APPLY TO YOU.
-
-4. Limitation Of Liability. TO THE EXTENT NOT PROHIBITED BY LAW, IN NO EVENT SHALL APPLE BE LIABLE FOR PERSONAL INJURY, OR ANY INCIDENTAL, SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES WHATSOEVER, INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF PROFITS, LOSS OF DATA, BUSINESS INTERRUPTION OR ANY OTHER COMMERCIAL DAMAGES OR LOSSES, ARISING OUT OF OR RELATED TO YOUR USE OR INABILITY TO USE THE APPLE SOFTWARE, HOWEVER CAUSED, REGARDLESS OF THE THEORY OF LIABILITY (CONTRACT, TORT OR OTHERWISE) AND EVEN IF APPLE HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME JURISDICTIONS DO NOT ALLOW THE LIMITATION OF LIABILITY FOR PERSONAL INJURY, OR OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS LIMITATION MAY NOT APPLY TO YOU. In no event shall Apple's total liability to you for all damages (other than as may be required by applicable law in cases involving personal injury) exceed the amount of fifty dollars ($50.00). The foregoing limitations will apply even if the above stated remedy fails of its essential purpose.
-
-5. Export Control. You may not use or otherwise export or reexport the Apple Product except as authorized by United States law and the laws of the jurisdiction in which the Apple Product was obtained. In particular, but without limitation, the Apple Product may not be exported or re-exported (a) into any U.S. embargoed countries or (b) to anyone on the U.S. Treasury Department's list of Specially Designated Nationals or the U.S. Department of Commerce Denied Person?s List or Entity List. By using the Apple Product, you represent and warrant that you are not located in any such country or on any such list.
-
-6. Government End Users. The Apple Software and related documentation are "Commercial Items", as that term is defined at 48 C.F.R. ?2.101, consisting of "Commercial Computer Software" and "Commercial Computer Software Documentation", as such terms are used in 48 C.F.R. ?12.212 or 48 C.F.R. ?227.7202, as applicable. Consistent with 48 C.F.R. ?12.212 or 48 C.F.R. ?227.7202-1through 227.7202-4, as applicable, the Commercial Computer Software and Commercial Computer Software Documentation are being licensed to U.S. Government end users (a) only as Commercial Items and (b) with only those rights as are granted to all other end users pursuant to the terms and conditions herein. Unpublished-rights reserved under the copyright laws of the United States.
-
-7. Controlling Law and Severability. This License will be governed by and construed in accordance with the laws of the State of California, as applied to agreements entered into and to be performed entirely within California between California residents. This License shall not be governed by the United Nations Convention on Contracts for the International Sale of Goods, the application of which is expressly excluded. If for any reason a court of competent jurisdiction finds any provision, or portion thereof, to be unenforceable, the remainder of this License shall continue in full force and effect.
-
-8. Complete Agreement. This License constitutes the entire agreement between the parties with respect to the use of the Apple Software licensed hereunder and supersedes all prior or contemporaneous understandings regarding such subject matter. No amendment to or modification of this License will be binding unless in writing and signed by Apple. Any translation of this License is done for local requirements and in the event of a dispute between the English and any non-English versions, the English version of this License shall govern.
-
-EA0300
-</string>
- </map>
- <key>sleepycat</key>
- <map>
- <key>url</key>
- <string>http://opensource.org/licenses/sleepycat.php</string>
- </map>
- <key>smartheap</key>
- <map>
- <key>text</key>
- <string>on file
-</string>
- </map>
- <key>things</key>
- <map>
- </map>
- <key>vivox</key>
- <map>
- <key>text</key>
- <string>on file</string>
- </map>
- <key>xmlrpc-epi</key>
- <map>
- <key>url</key>
- <string>http://xmlrpc-epi.sourceforge.net/main.php?t=license</string>
- </map>
- <key>zlib</key>
- <map>
- <key>url</key>
- <string>http://www.gzip.org/zlib/zlib_license.html</string>
- </map>
- </map>
- </map>
-</llsd>
diff --git a/scripts/gpu_table_tester b/scripts/gpu_table_tester
new file mode 100755
index 0000000000..52b1c8f31d
--- /dev/null
+++ b/scripts/gpu_table_tester
@@ -0,0 +1,178 @@
+#!/usr/bin/perl
+## Checks entries in the indra/newview/gpu_table.txt file against sample data
+##
+## Copyright (c) 2011, Linden Research, Inc.
+##
+## Permission is hereby granted, free of charge, to any person obtaining a copy
+## of this software and associated documentation files (the "Software"), to deal
+## in the Software without restriction, including without limitation the rights
+## to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+## copies of the Software, and to permit persons to whom the Software is
+## furnished to do so, subject to the following conditions:
+##
+## The above copyright notice and this permission notice shall be included in
+## all copies or substantial portions of the Software.
+##
+## THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+## IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+## FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+## AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+## LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+## OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+## THE SOFTWARE.
+
+use English;
+use Getopt::Long;
+
+( $MyName = $0 ) =~ s|.*/||;
+my $mini_HELP = "
+ $MyName --gpu-table <gpu_table.txt>
+ [ --unrecognized-only ]
+ [ --table-only ]
+ [ <gpu-strings-file> ...]
+
+ Checks for duplicates and invalid lines in the gpu_table.txt file.
+
+ Unless the '--table-only' option is specified, it also tests the recognition of
+ values in the gpu-strings-files (or standard input if no files are given).
+
+ If the --unrecognized-only option is specified, then no output is produced for
+ values that are matched, otherwise a line is output for each input line that
+ describes the results of attempting to match the value on that line.
+";
+
+&GetOptions("help" => \$Help,
+ "gpu-table=s" => \$GpuTable,
+ "unrecognized-only" => \$UnrecognizedOnly,
+ "table-only" => \$TableOnly
+ )
+ || die "$mini_HELP";
+
+if ($Help)
+{
+ print $mini_HELP;
+ exit 0;
+}
+
+$ErrorsSeen = 0;
+
+die "Must specify a --gpu-table <gpu_table.txt> value"
+ unless $GpuTable;
+
+open(GPUS, "<$GpuTable")
+ || die "Failed to open gpu table '$GpuTable':\n\t$!\n";
+
+# Parse the GPU table into these table, indexed by the name
+my %NameLine; # name -> line number on which a given name was found (catches duplicate names)
+my %RecognizerLine; # name -> line number on which a given name was found (catches duplicate names)
+my %Name; # recognizer -> name
+my %Recognizer; # name -> recognizer
+my %Class; # recognizer -> class
+my %Supported; # recognizer -> supported
+my @InOrder; # records the order of the recognizers
+
+$Name{'UNRECOGNIZED'} = 'UNRECOGNIZED';
+$NameLine{'UNRECOGNIZED'} = '(hard-coded)'; # use this for error messages in table parsing
+$Class{'UNRECOGNIZED'} = '';
+$Supported{'UNRECOGNIZED'} = '';
+
+while (<GPUS>)
+{
+ next if m|^//|; # skip comments
+ next if m|^\s*$|; # skip blank lines
+
+ chomp;
+ my ($name, $regex, $class, $supported, $extra) = split('\t+');
+ my $errsOnLine = $ErrorsSeen;
+ if (!$name)
+ {
+ print STDERR "No name found on $GpuTable line $INPUT_LINE_NUMBER\n";
+ $ErrorsSeen++;
+ }
+ elsif ( defined $NameLine{$name} )
+ {
+ print STDERR "Duplicate name '$name' on $GpuTable lines $NameLine{$name} and $INPUT_LINE_NUMBER:\n";
+ print STDERR " $NameLine{$name}: /$Recognizer{$name}/ $Supported{$Recognizer{$name}} class $Class{$Recognizer{$name}}\n";
+ print STDERR " $INPUT_LINE_NUMBER: /$regex/ " . ($supported ? "supported" : "unsupported") . " class $class - ignored\n";
+ $ErrorsSeen++;
+ }
+ if (!$regex)
+ {
+ print STDERR "No recognizer found on $GpuTable line $INPUT_LINE_NUMBER\n";
+ $ErrorsSeen++;
+ }
+ elsif ( defined $RecognizerLine{$regex} )
+ {
+ print STDERR "Duplicate recognizer /$regex/ found on $GpuTable lines $RecognizerLine{$regex} and $INPUT_LINE_NUMBER (ignored)\n";
+ print STDERR " $RecognizerLine{$regex}: name '$Name{$regex}' $Supported{$regex} class $Class{$regex}\n";
+ print STDERR " $INPUT_LINE_NUMBER: name '$name' " . ($supported ? "supported" : "unsupported") . " class $class - ignored\n";
+ $ErrorsSeen++;
+ }
+ if ($class !~ m/[0123]/)
+ {
+ print STDERR "Invalid class value '$class' on $GpuTable line $INPUT_LINE_NUMBER\n";
+ $ErrorsSeen++;
+ }
+ if ($supported !~ m/[0123]/)
+ {
+ print STDERR "Invalid supported value '$supported' on $GpuTable line $INPUT_LINE_NUMBER\n";
+ $ErrorsSeen++;
+ }
+ if ($extra)
+ {
+ print STDERR "Extra data '$extra' on $GpuTable line $INPUT_LINE_NUMBER\n";
+ $ErrorsSeen++;
+ }
+
+ if ($errsOnLine == $ErrorsSeen) # no errors found on this line
+ {
+ push @InOrder,$regex;
+ $NameLine{$name} = $INPUT_LINE_NUMBER;
+ $RecognizerLine{$regex} = $INPUT_LINE_NUMBER;
+ $Name{$regex} = $name;
+ $Recognizer{$name} = $regex;
+ $Class{$regex} = $class;
+ $Supported{$regex} = $supported ? "supported" : "unsupported";
+ }
+}
+
+close GPUS;
+
+print STDERR "\n" if $ErrorsSeen;
+
+exit $ErrorsSeen if $TableOnly;
+
+my %RecognizedBy;
+while (<>)
+{
+ chomp;
+ my $recognizer;
+ $RecognizedBy{$_} = 'UNRECOGNIZED';
+ foreach $recognizer ( @InOrder ) # note early exit if recognized
+ {
+ if ( m/$recognizer/ )
+ {
+ $RecognizedBy{$_} = $recognizer;
+ last; # exit recognizer loop
+ }
+ }
+}
+
+## Print results.
+## For each input, show supported or unsupported, the class, and the recognizer name
+format STDOUT_TOP =
+GPU String Supported? Class Recognizer
+------------------------------------------------------------------------------------------------------ ----------- ----- ------------------------------------
+.
+format STDOUT =
+@<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<... @<<<<<<<<<< @> @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<...
+$_, $Supported{$RecognizedBy{$_}},$Class{$RecognizedBy{$_}},$Name{$RecognizedBy{$_}}
+.
+
+foreach ( sort keys %RecognizedBy )
+{
+ write if ! $UnrecognizedOnly || $Name{$RecognizedBy{$_}} eq 'UNRECOGNIZED';
+ $-++; # suppresses pagination
+}
+
+exit $ErrorsSeen;
diff --git a/scripts/md5check.py b/scripts/md5check.py
index 1a54a2844c..1a54a2844c 100644..100755
--- a/scripts/md5check.py
+++ b/scripts/md5check.py
diff --git a/scripts/messages/message_template.msg b/scripts/messages/message_template.msg
index d292653d3f..2cb0a833d4 100644
--- a/scripts/messages/message_template.msg
+++ b/scripts/messages/message_template.msg
@@ -2061,6 +2061,15 @@ version 2.0
{ IsPhantom BOOL }
{ CastsShadows BOOL }
}
+ {
+ ExtraPhysics Variable
+ { PhysicsShapeType U8 }
+ { Density F32 }
+ { Friction F32 }
+ { Restitution F32 }
+ { GravityMultiplier F32 }
+
+ }
}
diff --git a/scripts/messages/message_template.msg.sha1 b/scripts/messages/message_template.msg.sha1
index 41e70011af..6486d92851 100644
--- a/scripts/messages/message_template.msg.sha1
+++ b/scripts/messages/message_template.msg.sha1
@@ -1 +1 @@
-ce3be58f4ea395c272fcfa3e6b6dad027c188e0d \ No newline at end of file
+465164e1a07f63d68c4ad1f00c19805dfb6ee2d7 \ No newline at end of file